Skip to content

Instantly share code, notes, and snippets.

@embray
Last active August 29, 2015 14:06
Show Gist options
  • Save embray/31d801afc195d70721ed to your computer and use it in GitHub Desktop.
Save embray/31d801afc195d70721ed to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": "",
"signature": "sha256:e6cf403bc1d2a05f56d951e1a6c69ee059bd994fd3e066840a3d22f3c7c9fbd0"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Compound model demo\n",
"\n",
"### Some background on the modeling package so far\n",
"\n",
"First off, if you've either never used the `astropy.modeling` package or need a refresher, please see the latest version of the docs:\n",
"\n",
"http://docs.astropy.org/en/latest/modeling/index.html\n",
"\n",
"This discussion of compound models won't cover fitting at all. Compound models don't yet support fitting, but they will soon once a bit more rearchitecting is done."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"One thing that it's important to be clear about when using the modeling framework, is that all models be it a Gaussian, a rotation, some power law model, polynomial, etc. is represented in the abstract by a *class*--specifically a subclass of [`Model`](http://docs.astropy.org/en/latest/api/astropy.modeling.Model.html#astropy.modeling.Model).\n",
"\n",
"A model *class*, by itself, cannot be used to perform any computation because most models, at least, have one or more parameters that must be specified before the model can be evaluated on some input data. However, we can still get some information about a model class from its representation. For example:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from astropy.modeling.models import *\n",
"\n",
"Gaussian1D"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 1,
"text": [
"<class 'astropy.modeling.functional_models.Gaussian1D'>\n",
"Name: Gaussian1D\n",
"Inputs: ('x',)\n",
"Outputs: ('y',)\n",
"Fittable parameters: ('amplitude', 'mean', 'stddev')"
]
}
],
"prompt_number": 1
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This text display is a new feature and open to suggestions, but it at least tells you something about what inputs and outputs the model has, and what its parameters are. Calling `help(Gaussian1D)` or, `Gaussian1D?` in IPython gives much more detail (it's been tricky to determine the right amount information to display immediately at the command prompt)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Even the [`custom_model`](http://docs.astropy.org/en/latest/api/astropy.modeling.custom_model.html#astropy.modeling.custom_model) function for creating a model from an existing function, is really just a factory function that returns a new class:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import numpy as np\n",
"from astropy.modeling import custom_model, Model\n",
"\n",
"def sine(x, amplitude=1., frequency=1., phase=0.0):\n",
" return amplitude * np.sin(2 * np.pi * frequency * x + phase)\n",
"\n",
"SineModel = custom_model(sine)\n",
"\n",
"SineModel"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 2,
"text": [
"<class '__main__.sine'>\n",
"Name: sine\n",
"Inputs: ('x',)\n",
"Outputs: ('x',)\n",
"Fittable parameters: ('amplitude', 'frequency', 'phase')"
]
}
],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"issubclass(SineModel, Model)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 3,
"text": [
"True"
]
}
],
"prompt_number": 3
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In this way an arbitrary function can be wrapped in the necessary robes to function within modeling framework. Point being, a model is *always* represented in the framework as a subclass of `Model`."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A model *instance* is created like an instance of any other class, by calling the class with some arguments. For most models the main required `__init__` arguments are the values for the parameters. In the case of `Gaussian1D` it takes three parameters, in the same order they were listed when we displayed the class: Amplitude, mean, and standard deviation."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"my_gaussian = Gaussian1D(1, 0, 0.2)\n",
"my_gaussian"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 4,
"text": [
"<Gaussian1D(amplitude=1.0, mean=0.0, stddev=0.2)>"
]
}
],
"prompt_number": 4
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now that we have an *instance* of a Gaussian with all its parameters filled in we can use it to do calculations:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%matplotlib inline\n",
"from matplotlib import pyplot as pl\n",
"\n",
"x = np.linspace(-1, 1, 100)\n",
"y = my_gaussian(x)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 5
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"pl.plot(x, y)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 6,
"text": [
"[<matplotlib.lines.Line2D at 0x7fa7f8afdac8>]"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0x7fa7fa406a90>"
]
}
],
"prompt_number": 6
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"There are some exceptions, currently. For example when defining a polynomial model it is necessary to provide first the degree of the polynomial, followed by the parameters (the coefficients):"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"my_poly = Polynomial1D(3, c0=1, c1=2, c2=3, c3=4)\n",
"\n",
"my_poly"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 7,
"text": [
"<Polynomial1D(3, c0=1.0, c1=2.0, c2=3.0, c3=4.0)>"
]
}
],
"prompt_number": 7
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"x = np.linspace(-1, 1, 100)\n",
"y = my_poly(x)\n",
"\n",
"pl.plot(x, y)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 8,
"text": [
"[<matplotlib.lines.Line2D at 0x7fa7f8a91898>]"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\nuPUAAAAASUVORK5CYII=\n",
"text": [
"<matplotlib.figure.Figure at 0x7fa7f8b4dd68>"
]
}
],
"prompt_number": 8
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"But otherwise the same concept applies.\n",
"\n",
"The reason for this review is that I want to be very clear on the difference between a model *class* and a model *instance* because it could be easy to get lost in the following discussion without being clear on that."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Introduction to compound models\n",
"\n",
"The idea here, as many are aware, is to have the ability to combine existing models either as arithmetic expressions, or by passing the output of one model to the input of another model. This would allow easy creation of entirely new, arbitrarily complex models without having to manually define new classes or use `custom_model` (and manually reimplement whatever functions are computed by the models being combined).\n",
"\n",
"To some extent this was already supported in the [`SummedCompositeModel`](http://docs.astropy.org/en/latest/api/astropy.modeling.SummedCompositeModel.html#astropy.modeling.SummedCompositeModel) and [`SerialCompositeModel`](http://docs.astropy.org/en/latest/api/astropy.modeling.SerialCompositeModel.html#astropy.modeling.SerialCompositeModel) classes. The former passes to the same input(s) to several models, evaluates them in parallel, and then returns the sum of their results. The latter creates a pipeline of two or models, where one model passes its output as the input to the next model, in the same sense as a composition of functions.\n",
"\n",
"Unfortunately these classes are difficult to generalize, and don't really fit in well with the design of other `Model` classes (which I'm trying to streamline). They also don't support efficient fitting (neither do the new compound models yet, but it will be easier to fix that without requiring them to be specially supporting by the fitter framework).\n",
"\n",
"What we really want is to be able to combine two or more models in semi-arbitrary ways and produce new models that work in the same way as the basic models.\n",
"\n",
"A quick note on terminology: I have termed the result of combining models a \"compound model\" as opposed to a \"composite model\" so as to not confuse it with the concept of a functional composite (which is just one type of compound model).\n",
"\n",
"In the new framework there are a few different ways to combine models to make compound models. But almost all of them involve using Python's built-in operators `+`, `-`, `*`, `/`, `**`, and `|`. The first five are used analogously to basic arithmetic operators. The `|` I'll get to later."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### New models from arithmetic operators\n",
"\n",
"To create a new model from an arithmetic expression, we use these operators on the model *classes* themselves. For example to create a model representing a sum of two Gaussians:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"SumOfGaussians = Gaussian1D + Gaussian1D\n",
"\n",
"SumOfGaussians"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 9,
"text": [
"<class '__main__.CompoundModel0'>\n",
"Name: CompoundModel0\n",
"Inputs: ('x',)\n",
"Outputs: ('y',)\n",
"Expression: [0] + [1]\n",
"Components: \n",
" [0]: <class 'astropy.modeling.functional_models.Gaussian1D'>\n",
" Name: Gaussian1D\n",
" Inputs: ('x',)\n",
" Outputs: ('y',)\n",
" Fittable parameters: ('amplitude', 'mean', 'stddev')\n",
"\n",
" [1]: <class 'astropy.modeling.functional_models.Gaussian1D'>\n",
" Name: Gaussian1D\n",
" Inputs: ('x',)\n",
" Outputs: ('y',)\n",
" Fittable parameters: ('amplitude', 'mean', 'stddev')"
]
}
],
"prompt_number": 9
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You can think of the `+` operator here as implementing a class factory. It returns a new class that combines the evaluation of two `Gaussian1D` classes and sums the results. The new class takes six parameters: three for each Gaussian.\n",
"\n",
"The new model has just a generated name `CompoundModel0`. I would be interested if anyone has ideas for better schemes for default names, but this is a tricky subject. It is, however, possible to give your own name to a compound model like so:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"SumOfGaussians = (Gaussian1D + Gaussian1D).rename('SumOfGaussians')\n",
"SumOfGaussians"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 10,
"text": [
"<class '__main__.SumOfGaussians'>\n",
"Name: SumOfGaussians (CompoundModel1)\n",
"Inputs: ('x',)\n",
"Outputs: ('y',)\n",
"Expression: [0] + [1]\n",
"Components: \n",
" [0]: <class 'astropy.modeling.functional_models.Gaussian1D'>\n",
" Name: Gaussian1D\n",
" Inputs: ('x',)\n",
" Outputs: ('y',)\n",
" Fittable parameters: ('amplitude', 'mean', 'stddev')\n",
"\n",
" [1]: <class 'astropy.modeling.functional_models.Gaussian1D'>\n",
" Name: Gaussian1D\n",
" Inputs: ('x',)\n",
" Outputs: ('y',)\n",
" Fittable parameters: ('amplitude', 'mean', 'stddev')"
]
}
],
"prompt_number": 10
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This can now be instantiated with some parameters, and the instance used to evaluate some input data, just like any other model:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"my_sum_of_gaussians = SumOfGaussians(1, 0, 0.2, 2.5, 0.5, 0.1)\n",
"\n",
"x = np.linspace(-1, 1, 100)\n",
"y = my_sum_of_gaussians(x)\n",
"\n",
"pl.plot(x, y)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 11,
"text": [
"[<matplotlib.lines.Line2D at 0x7fa7f8a0ae80>]"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\nIpIw/x/TPEE/FEQslAAAAABJRU5ErkJggg==\n",
"text": [
"<matplotlib.figure.Figure at 0x7fa7f8ae4390>"
]
}
],
"prompt_number": 11
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In principle, any arbitrarily complex model can be built up from the currently supported operators, so long as all the models in the expression are compatible in their numbers of inputs and outputs:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"ZanyModel = (LogParabola1D + MexicanHat1D - Gaussian1D * Box1D /\n",
" Redshift ** Linear1D).rename('ZanyModel')\n",
"\n",
"ZanyModel"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 12,
"text": [
"<class '__main__.ZanyModel'>\n",
"Name: ZanyModel (CompoundModel6)\n",
"Inputs: ('x',)\n",
"Outputs: ('y',)\n",
"Expression: [0] + [1] - [2] * [3] / [4] ** [5]\n",
"Components: \n",
" [0]: <class 'astropy.modeling.powerlaws.LogParabola1D'>\n",
" Name: LogParabola1D\n",
" Inputs: ('x',)\n",
" Outputs: ('y',)\n",
" Fittable parameters: ('amplitude', 'x_0', 'alpha', 'beta')\n",
"\n",
" [1]: <class 'astropy.modeling.functional_models.MexicanHat1D'>\n",
" Name: MexicanHat1D\n",
" Inputs: ('x',)\n",
" Outputs: ('y',)\n",
" Fittable parameters: ('amplitude', 'x_0', 'sigma')\n",
"\n",
" [2]: <class 'astropy.modeling.functional_models.Gaussian1D'>\n",
" Name: Gaussian1D\n",
" Inputs: ('x',)\n",
" Outputs: ('y',)\n",
" Fittable parameters: ('amplitude', 'mean', 'stddev')\n",
"\n",
" [3]: <class 'astropy.modeling.functional_models.Box1D'>\n",
" Name: Box1D\n",
" Inputs: ('x',)\n",
" Outputs: ('y',)\n",
" Fittable parameters: ('amplitude', 'x_0', 'width')\n",
"\n",
" [4]: <class 'astropy.modeling.functional_models.Redshift'>\n",
" Name: Redshift\n",
" Inputs: ('x',)\n",
" Outputs: ('y',)\n",
" Fittable parameters: ('z',)\n",
"\n",
" [5]: <class 'astropy.modeling.functional_models.Linear1D'>\n",
" Name: Linear1D\n",
" Inputs: ('x',)\n",
" Outputs: ('y',)\n",
" Fittable parameters: ('slope', 'intercept')"
]
}
],
"prompt_number": 12
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"my_zany_model = ZanyModel(1, 0.5, 1, 1, 2, 0.5, 0.2, 3, 0.2, 0.2, 0.1, 0.5, 0.9, 0.1, 1, 1)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 13
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"x = np.linspace(0.1, 1, 100)\n",
"y = my_zany_model(x)\n",
"\n",
"pl.plot(x, y)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 14,
"text": [
"[<matplotlib.lines.Line2D at 0x7fa7f8974518>]"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0x7fa7f8a609e8>"
]
}
],
"prompt_number": 14
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"(hey, it does *something*)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As you can see, defining all the parameters for such a complex model can get hairy--I'll have more to say on that later."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### New models from composition\n",
"\n",
"As mentioned earlier, it is also possible to create new models by composition--where the output from one model is used as the input to another model. The whole transformation is then represented by a single composite model. This is what the pipe operator `|` between models is used for:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"RedshiftedGaussian = (Redshift | Gaussian1D).rename('RedshiftedGaussian')\n",
"\n",
"RedshiftedGaussian"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 15,
"text": [
"<class '__main__.RedshiftedGaussian'>\n",
"Name: RedshiftedGaussian (CompoundModel7)\n",
"Inputs: ('x',)\n",
"Outputs: ('y',)\n",
"Expression: [0] | [1]\n",
"Components: \n",
" [0]: <class 'astropy.modeling.functional_models.Redshift'>\n",
" Name: Redshift\n",
" Inputs: ('x',)\n",
" Outputs: ('y',)\n",
" Fittable parameters: ('z',)\n",
"\n",
" [1]: <class 'astropy.modeling.functional_models.Gaussian1D'>\n",
" Name: Gaussian1D\n",
" Inputs: ('x',)\n",
" Outputs: ('y',)\n",
" Fittable parameters: ('amplitude', 'mean', 'stddev')"
]
}
],
"prompt_number": 15
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This has the all the same semantics as new model classes created with the arithmetic operators. In this case the syntax `F | G` is just stand-in for the mathematical notation $ f \\circ g = g(f(x)) $. It's also analogous with the pipe operator `|` in UNIX shells."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"my_gaussian = Gaussian1D(1, 0.75, 0.1)\n",
"my_redshifted_gaussian = RedshiftedGaussian(0.1, 1, 0.75, 0.1)\n",
" # ^-- redshift\n",
"x = np.linspace(0, 1.2, 100)\n",
"y1 = my_gaussian(x)\n",
"y2 = my_redshifted_gaussian(x)\n",
"\n",
"pl.plot(x, y1, 'g--')\n",
"pl.plot(x, y2, 'r-')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 16,
"text": [
"[<matplotlib.lines.Line2D at 0x7fa7f89c5828>]"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0x7fa7f89c5ac8>"
]
}
],
"prompt_number": 16
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Naturally the pipe operator can be combined with other arithmetic operators in an expression:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"G1 = Gaussian1D + Gaussian1D\n",
"G2 = Redshift | (Gaussian1D + Gaussian1D)\n",
"# ^-- We could also just write this G2 = Redshift | G1\n",
"\n",
"g1 = G1(1, 0, 0.2, 2.5, 0.5, 0.1)\n",
"g2 = G2(0.15, 1, 0, 0.2, 2.5, 0.5, 0.1)\n",
"\n",
"x = np.linspace(-1, 1, 100)\n",
"\n",
"pl.plot(x, g1(x), 'g--')\n",
"pl.plot(x, g2(x), 'r-')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 17,
"text": [
"[<matplotlib.lines.Line2D at 0x7fa7f88cbf60>]"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\ncpj/D55N/6uIU9DDAAAAAElFTkSuQmCC\n",
"text": [
"<matplotlib.figure.Figure at 0x7fa7f8938080>"
]
}
],
"prompt_number": 17
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Expressions using model *instances*\n",
"\n",
"We saw before that when creating a compound model of even just a couple different models the number of parameters can become somewhat unwieldy. We don't always need such a level of generalization. Perhaps, for example, we want to combine two models where the parameters are already known. This is also supported using the exact same syntax as when creating compound models from classes:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"g1 = Gaussian1D(1, 0, 0.2)\n",
"g2 = Gaussian1D(2.5, 0.5, 0.1)\n",
"\n",
"g1_plus_g2 = g1 + g2"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 18
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"One thing to be aware of, is that the returned object `g1_plus_g2` is an *instance* of a model, not a class like we got when we combined two classes. In the background a new class is still created representing a sum of Gaussians. But because the sum was created from two already instantiated Gaussians with all their parameters supplied, it makes sense to return a fully instantiated sum of those Gaussians:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"type(g1_plus_g2)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 19,
"text": [
"<class '__main__.CompoundModel11'>\n",
"Name: CompoundModel11\n",
"Inputs: ('x',)\n",
"Outputs: ('y',)\n",
"Expression: [0] + [1]\n",
"Components: \n",
" [0]: <Gaussian1D(amplitude=1.0, mean=0.0, stddev=0.2)>\n",
"\n",
" [1]: <Gaussian1D(amplitude=2.5, mean=0.5, stddev=0.1)>"
]
}
],
"prompt_number": 19
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now the resultant model can be evaluted on some input data as usual:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"y = g1_plus_g2(x)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 20
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This could even be combined into a single expression:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"y = (g1 + g2)(x)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 21
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"(Although it might be noted that in this trivial case there's no advantage over doing `y = g1(x) + g2(x)`, except that the compound model construction can also be used by a fitter.)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It is also possible to create expressions mixing classes and instances. In this case the most sensible behavior is to return a new *class* (just as when two classes are being combined):"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"g1 = Gaussian1D(1, 0, 0.2)\n",
"G2 = Gaussian1D + g1\n",
"\n",
"G2"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 22,
"text": [
"<class '__main__.CompoundModel13'>\n",
"Name: CompoundModel13\n",
"Inputs: ('x',)\n",
"Outputs: ('y',)\n",
"Expression: [0] + [1]\n",
"Components: \n",
" [0]: <class 'astropy.modeling.functional_models.Gaussian1D'>\n",
" Name: Gaussian1D\n",
" Inputs: ('x',)\n",
" Outputs: ('y',)\n",
" Fittable parameters: ('amplitude', 'mean', 'stddev')\n",
"\n",
" [1]: <Gaussian1D(amplitude=1.0, mean=0.0, stddev=0.2)>"
]
}
],
"prompt_number": 22
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The resulting model is still a sum of Gaussians, but the parameters for the second Gaussian are already fixed at (1.0, 0.0, 0.2). So the new model only takes three parameters for the unspecified Gaussian:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"g2_1 = G2(2.5, 0.5, 0.1)\n",
"g2_2 = G2(2.1, 0.7, 0.15)\n",
"\n",
"pl.plot(x, g2_1(x), 'g-')\n",
"pl.plot(x, g2_2(x), 'r-')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 23,
"text": [
"[<matplotlib.lines.Line2D at 0x7fa7f8920b00>]"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\nBxV0RUV5jkqKAAAAAElFTkSuQmCC\n",
"text": [
"<matplotlib.figure.Figure at 0x7fa7f8920da0>"
]
}
],
"prompt_number": 23
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This in a sense allows the creation of partially-evaluated compound models, reducing the overall parameter space. Unfortunately there is not yet any obvious way to make a \"partial evaluation\" of a single model--for example a model where one parameter's value has been fixed, but the others need to be specified. Nobody's specifically requested any such functionality though."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### The main open issue\n",
"\n",
"Now that I've given most of the basic details of how compound models work currently, I can get to the main issue that there's some question about, which is how to deal with mapping models' outputs and inputs to each other in a transformation graph. In particular when dealing with models with more than one input and/or output.\n",
"\n",
"For example a [`Rotation2D`](http://docs.astropy.org/en/latest/api/astropy.modeling.rotations.Rotation2D.html#astropy.modeling.rotations.Rotation2D) takes two inputs `(x, y)` and returns two outputs (also called `(x, y)`, though you could think of it as new coordinates $ (x', y') $ which are the input coordinates rotated into each other):"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"Rotation2D"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 24,
"text": [
"<class 'astropy.modeling.rotations.Rotation2D'>\n",
"Name: Rotation2D\n",
"Inputs: ('x', 'y')\n",
"Outputs: ('x', 'y')\n",
"Fittable parameters: ('angle',)"
]
}
],
"prompt_number": 24
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"But say you want to compose this with another model which takes 2 inputs, where the first input is expected to be the values of the y axis and the second input the values of the x axis (whatever those axes happen to represent physically):"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"Polynomial2D"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 25,
"text": [
"<class 'astropy.modeling.polynomial.Polynomial2D'>\n",
"Name: Polynomial2D\n",
"Inputs: ('x', 'y')\n",
"Outputs: ('z',)\n",
"Fittable parameters: <astropy.utils.decorators.lazyproperty object at 0x7fa7fa43ab00>"
]
}
],
"prompt_number": 25
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"p2 = Polynomial2D(3, c0_1=0.1, c1_1=0.45, c2_0=0.2, c2_1=0.1)\n",
"\n",
"x, y = np.mgrid[-1:2:0.01, -2:2:0.01]\n",
"\n",
"pl.imshow(p2(x, y))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 26,
"text": [
"<matplotlib.image.AxesImage at 0x7fa7f86363c8>"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0x7fa7f88ede10>"
]
}
],
"prompt_number": 26
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"If we perform the basic composition it will just pass the outputs `(x, y)` from the rotation to the polynomial:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"RotateP2 = Rotation2D | p2\n",
"\n",
"rp2 = RotateP2(45)\n",
"\n",
"pl.imshow(rp2(x, y))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 27,
"text": [
"<matplotlib.image.AxesImage at 0x7fa7f85b0390>"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0x7fa7f8883eb8>"
]
}
],
"prompt_number": 27
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In other words, the `x` output from the rotation goes to the `x` input of the polynomial--likewise for `y`. There's no obvious way in this syntax to specify that we want the mapping to go `(x, y) -> (y, x)`.\n",
"\n",
"There are several other similar requirements for things that it should be possible to do with inputs and outputs besides reordering them (for example dropping some outputs). For now I won't try to list all the requirements we've identified and focus primarily on reordering. Though the issue of duplicating an output is also interesting."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"There have been multiple long discussions about what to do about this, which I will try my best to summarize. There's one solution first proposed by Mike Droettboom that seems to have the broadest support so far (though we're talking amongst ~5 people), and that solution has some merits.\n",
"\n",
"I've been pushing for another solution, however, that I think also has merits (and demerits). I'm hoping to get some broader opinion about what approach is perferable, and if anybody has any other ideas, or some ideas for a middle ground I'd love to hear them.\n",
"\n",
"First I'll explain the approach Mike's first put out."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The advantage (as I see it) of Mike's approach is that for the most part it takes advantage of the machinery that's already in place for model composition, and doesn't require much in the way of additional new semantics built into models.\n",
"\n",
"The idea is that as composition is already supported using the `|`, in order to mix up/remap the outputs of some model simply compose it with a special model that doesn't modify the output numerically, but just reorders it.\n",
"\n",
"This is already easy to do. For example you could swap two outputs from a model with:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"class Swap(Model):\n",
" \"\"\"Model that swaps the order of its inputs.\"\"\"\n",
" \n",
" inputs = ('x', 'y')\n",
" outputs = ('y', 'x')\n",
" \n",
" @staticmethod\n",
" def evaluate(x, y):\n",
" return y, x"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 28
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now this `Swap` model can be inserted into the model composition to swap the outputs from the rotation before they are passed into the polynomial:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"RotateSwapP2 = Rotation2D | Swap | p2\n",
"\n",
"rp2_swapped = RotateSwapP2(45)\n",
"\n",
"pl.subplot(1, 2, 1)\n",
"pl.imshow(rp2(x, y))\n",
"\n",
"pl.subplot(1, 2, 2)\n",
"pl.imshow(rp2_swapped(x, y))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 29,
"text": [
"<matplotlib.image.AxesImage at 0x7fa7f84e2da0>"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0x7fa7f8604d30>"
]
}
],
"prompt_number": 29
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"If you were just handed this object `RotateSwapP2` could you piece out what's actually happening? I think so--it wouldn't be too hard. But I'd like to hear ideas for how to best present that information. Right now if you display the model it will show that it's a compound model, and that `Rotation2D` is piped to a `Swap`. But I still don't think it's that obvious what's really going on.\n",
"\n",
"It would be better if there were some kind of graph display showing which outputs from `Rotation2D` end up going to which inputs of the `Polynomial2D`.\n",
"\n",
"That's the thing I don't like about this--given a complicated compound model, I don't think it's necessarily easily to trace what happens to different inputs as they grind through the transformation graph. That said, I think that's more an issue of finding a good way to display this to users, than anything, and is not necessarily a fault of this approach.\n",
"\n",
"One thing that would help is to make a specialized subclass of `Model` that is specifically for models that only transform the outputs (or possibly inputs) of model. Then, any tool which draws the graph can represent those specially (for example, just drawing them as crossed edges)."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"RotateSwapP2"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 30,
"text": [
"<class '__main__.CompoundModel16'>\n",
"Name: CompoundModel16\n",
"Inputs: ('x', 'y')\n",
"Outputs: ('z',)\n",
"Expression: [0] | [1] | [2]\n",
"Components: \n",
" [0]: <class 'astropy.modeling.rotations.Rotation2D'>\n",
" Name: Rotation2D\n",
" Inputs: ('x', 'y')\n",
" Outputs: ('x', 'y')\n",
" Fittable parameters: ('angle',)\n",
"\n",
" [1]: <class '__main__.Swap'>\n",
" Name: Swap\n",
" Inputs: ('x', 'y')\n",
" Outputs: ('y', 'x')\n",
"\n",
" [2]: <Polynomial2D(3, c0_0=0.0, c1_0=0.0, c2_0=0.2, c3_0=0.0, c0_1=0.1, c0_2=0.0, c0_3=0.0, c1_1=0.45, c1_2=0.0, c2_1=0.1)>"
]
}
],
"prompt_number": 30
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The other issue with this of course is that you'd have to define a model for every possible transformation you'd want to do. If there are just two outputs you could swap the ouputs, drop the x output, drop the y output, duplicate one or the other, etc.\n",
"\n",
"This problem would be solved by creating a sort of factory function that returns the specific axis transformation that you want. We've been calling it something like `map_axes`, though other names are welcome.\n",
"\n",
"So instead of using something like `Swap` directly, you would do:\n",
"\n",
"```python\n",
">>> trans = Rotation2D | map_axes(['y', 'x']) | p2\n",
"```\n",
"\n",
"where `map_axes(['y', 'x'])` would create a mapping model that just swaps the `x` and `y` outputs from the `Rotation2D`. The exact form of the arguments is up for debate, but that's the basic idea. This could also be used without referring to the outputs by name:\n",
"\n",
"```python\n",
">>> trans = Rotation2D | map_axes([1, 0]) | p2\n",
"```\n",
"\n",
"meaning \"swap the 0th output with the 1th output\".\n",
"\n",
"This could also be used in a number of other ways like:\n",
"\n",
"```python\n",
">>> trans = Rotation2D | map_axes([1, 1]) | p2\n",
"```\n",
"\n",
"Meaning drop `x` and duplicate `y`, or `(x, y) -> (y, y)`. As I understand it there are use cases for all of these types of transformations."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Hopefully that does the idea justice--Mike should chime in with more details if they're needed."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<hr />"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"My idea is based on an evolution of the (already implemented) idea that the inputs and outputs of every models are given concrete names (or labels if you prefer). You've already seen examples of this earlier in notebook.\n",
"\n",
"Whereas previously all models just defined the number of inputs and ouputs:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"Polynomial2D.n_inputs, Polynomial2D.n_outputs"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 31,
"text": [
"(2, 1)"
]
}
],
"prompt_number": 31
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"now those inputs and outputs are given default labels as well:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"Polynomial2D.inputs, Polynomial2D.outputs"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 32,
"text": [
"(('x', 'y'), ('z',))"
]
}
],
"prompt_number": 32
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In most cases these names are pretty arbitrary, if not somewhat standard. In the case of `Polynomial2D` it can be seen as defining some $ z = f(x, y) $. This could be useful for model display purposes--see for example my prototype for model formula displays in [PR #2381](https://github.com/astropy/astropy/pull/2381).\n",
"\n",
"It's also useful in generating online help and function signatures. For example you can see that a [`Sky2Pix_TAN`](http://docs.astropy.org/en/latest/api/astropy.modeling.projections.Sky2Pix_TAN.html#astropy.modeling.projections.Sky2Pix_TAN) projection is evaluated on `phi` and `theta` inputs:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from astropy.modeling.models import Sky2Pix_TAN\n",
"\n",
"help(Sky2Pix_TAN.__call__)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Help on function __call__ in module astropy.modeling.core:\n",
"\n",
"__call__(self, phi, theta, model_set_axis=None)\n",
" Evaluate this model on the supplied inputs.\n",
"\n"
]
}
],
"prompt_number": 33
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This works [without any special boilerplate](https://github.com/embray/astropy/blob/modeling/model-refactor-2/astropy/modeling/projections.py#L212) since `Sky2Pix_TAN` is defined as a subclass of [`Sky2PixProjection`](https://github.com/embray/astropy/blob/modeling/model-refactor-2/astropy/modeling/projections.py#L64) which declares that the inputs should be labeled `(phi, theta)` and the outputs labeled `(x, y)`."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This even works with custom models:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"@custom_model\n",
"def myfunc(foo, bar):\n",
" return foo + 1, bar + 2"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 34
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"help(myfunc.__call__)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Help on function __call__ in module astropy.modeling.core:\n",
"\n",
"__call__(self, foo, bar, model_set_axis=None)\n",
" Evaluate this model on the supplied inputs.\n",
"\n"
]
}
],
"prompt_number": 35
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So based on all this, my preference for handling all this input/output (coordinate? axis?) mapping has been to make it based entirely on the labels on those axes.\n",
"\n",
"With Mike's approach (which already works, except implementation of the required factory functions) outputs are mapped up with inputs based entirely on their order.The first output goes to the first input, the second output to the second input, and so on. If you want to change that in any way you have to insert a shim. The inputs and outputs have no other semantic meaning.\n",
"\n",
"My idea would be to always match up outputs with inputs based solely on their *label*. So if I do `Model1 | Model2`, if `Model1` has outputs `(x, y)`, then `Model2` has to also have inputs named `x` and `y`. Then, regarldess of their relative order, `x -> x` and `y -> y`.\n",
"\n",
"To give a more concrete example, `Rotation2D` has two outputs `(x, y)`:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"Rotation2D"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 36,
"text": [
"<class 'astropy.modeling.rotations.Rotation2D'>\n",
"Name: Rotation2D\n",
"Inputs: ('x', 'y')\n",
"Outputs: ('x', 'y')\n",
"Fittable parameters: ('angle',)"
]
}
],
"prompt_number": 36
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"While `Pix2Sky_TAN` takes *inputs* `(x, y)`:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"Pix2Sky_TAN"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 37,
"text": [
"<class 'astropy.modeling.projections.Pix2Sky_TAN'>\n",
"Name: Pix2Sky_TAN\n",
"Inputs: ('x', 'y')\n",
"Outputs: ('phi', 'theta')"
]
}
],
"prompt_number": 37
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"But say I want to do something like before, where I first perform a rotation, but I want to *swap* the outputs before it goes into the projection. Under my proposal, that would look something like this:\n",
"\n",
"```python\n",
">>> trans = Rotation2D.remap_outputs(['y', 'x']) | Pix2Sky_TAN\n",
"```"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This would essentially take the first output of the rotation (`'x'`) and *relabel* it (`'y'`), and vice-versa for its second output. It doesn't in any way change the sense of the rotation. If you just did the rotation by itself without composing it with the projection, it would still produce outputs in the usual order (if it actually *swapped* its outputs it would no longer be just a rotation).\n",
"\n",
"But because the labels have been swapped, when it is passed to `Pix2Sky_TAN` it would match up the output labeled `'x'` with the input labeled `'x'` and so on. The end result is to still swap the axes.\n",
"\n",
"I like this because it very explicitly how data moves through the transformation. I view the whole thing as a directed graph where the vertices are models, and the edges represent an output going from one model to as an input to another model. In this scheme, because each output has the same label as its corresponding input the edges themselves can be given a simple lable like `'x'`, or `'y'`:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%install_ext https://raw.github.com/tkf/ipython-hierarchymagic/master/hierarchymagic.py\n",
"%load_ext hierarchymagic"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Installed hierarchymagic.py. To use it, type:\n",
" %load_ext hierarchymagic\n"
]
}
],
"prompt_number": 38
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%dot -f svg\n",
"digraph T {\n",
" rankdir=LR;\n",
" Rotation2D -> Pix2Sky_TAN [label=x];\n",
" Rotation2D -> Pix2Sky_TAN [label=y];\n",
"}"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"svg": [
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
"<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
"<!-- Generated by graphviz version 2.26.0 (20091210.2329)\n",
" -->\n",
"<!-- Title: T Pages: 1 -->\n",
"<svg width=\"304pt\" height=\"51pt\"\n",
" viewBox=\"0.00 0.00 304.00 51.18\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
"<g id=\"graph1\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 47.1762)\">\n",
"<title>T</title>\n",
"<polygon fill=\"white\" stroke=\"white\" points=\"-4,5 -4,-47.1762 301,-47.1762 301,5 -4,5\"/>\n",
"<!-- Rotation2D -->\n",
"<g id=\"node1\" class=\"node\"><title>Rotation2D</title>\n",
"<ellipse fill=\"none\" stroke=\"black\" cx=\"57\" cy=\"-24.1762\" rx=\"56.0679\" ry=\"19.0919\"/>\n",
"<text text-anchor=\"middle\" x=\"57\" y=\"-21.0762\" font-family=\"Times Roman,serif\" font-size=\"14.00\">Rotation2D</text>\n",
"</g>\n",
"<!-- Pix2Sky_TAN -->\n",
"<g id=\"node3\" class=\"node\"><title>Pix2Sky_TAN</title>\n",
"<ellipse fill=\"none\" stroke=\"black\" cx=\"227\" cy=\"-24.1762\" rx=\"68.0887\" ry=\"19.0919\"/>\n",
"<text text-anchor=\"middle\" x=\"227\" y=\"-21.0762\" font-family=\"Times Roman,serif\" font-size=\"14.00\">Pix2Sky_TAN</text>\n",
"</g>\n",
"<!-- Rotation2D&#45;&gt;Pix2Sky_TAN -->\n",
"<g id=\"edge2\" class=\"edge\"><title>Rotation2D&#45;&gt;Pix2Sky_TAN</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M113.608,-24.1762C124.664,-24.1762 136.444,-24.1762 148.072,-24.1762\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"148.23,-27.6763 158.23,-24.1762 148.23,-20.6763 148.23,-27.6763\"/>\n",
"<text text-anchor=\"middle\" x=\"136\" y=\"-30.5762\" font-family=\"Times Roman,serif\" font-size=\"14.00\">x</text>\n",
"</g>\n",
"<!-- Rotation2D&#45;&gt;Pix2Sky_TAN -->\n",
"<g id=\"edge4\" class=\"edge\"><title>Rotation2D&#45;&gt;Pix2Sky_TAN</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M95.0319,-10.1183C106.724,-6.45058 119.743,-3.0133 132,-1.17616 147.694,1.17616 164.599,-1.25923 179.736,-5.29839\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"178.815,-8.67594 189.397,-8.15007 180.797,-1.96228 178.815,-8.67594\"/>\n",
"<text text-anchor=\"middle\" x=\"136\" y=\"-7.57616\" font-family=\"Times Roman,serif\" font-size=\"14.00\">y</text>\n",
"</g>\n",
"</g>\n",
"</svg>\n"
]
}
],
"prompt_number": 39
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Whereas if you have to insert a shim the graph is harder to follow, IMO:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%dot -f svg\n",
"digraph T {\n",
" rankdir=LR;\n",
" Rotation2D -> Swap [label=x];\n",
" Rotation2D -> Swap [label=y];\n",
" Swap -> Pix2Sky_TAN [label=y];\n",
" Swap -> Pix2Sky_TAN [label=x];\n",
"}"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"svg": [
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
"<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
"<!-- Generated by graphviz version 2.26.0 (20091210.2329)\n",
" -->\n",
"<!-- Title: T Pages: 1 -->\n",
"<svg width=\"414pt\" height=\"52pt\"\n",
" viewBox=\"0.00 0.00 414.00 51.98\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
"<g id=\"graph1\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 47.9828)\">\n",
"<title>T</title>\n",
"<polygon fill=\"white\" stroke=\"white\" points=\"-4,5 -4,-47.9828 411,-47.9828 411,5 -4,5\"/>\n",
"<!-- Rotation2D -->\n",
"<g id=\"node1\" class=\"node\"><title>Rotation2D</title>\n",
"<ellipse fill=\"none\" stroke=\"black\" cx=\"57\" cy=\"-24.9828\" rx=\"56.0679\" ry=\"19.0919\"/>\n",
"<text text-anchor=\"middle\" x=\"57\" y=\"-21.8828\" font-family=\"Times Roman,serif\" font-size=\"14.00\">Rotation2D</text>\n",
"</g>\n",
"<!-- Swap -->\n",
"<g id=\"node3\" class=\"node\"><title>Swap</title>\n",
"<ellipse fill=\"none\" stroke=\"black\" cx=\"191\" cy=\"-24.9828\" rx=\"33.234\" ry=\"19.0919\"/>\n",
"<text text-anchor=\"middle\" x=\"191\" y=\"-21.8828\" font-family=\"Times Roman,serif\" font-size=\"14.00\">Swap</text>\n",
"</g>\n",
"<!-- Rotation2D&#45;&gt;Swap -->\n",
"<g id=\"edge2\" class=\"edge\"><title>Rotation2D&#45;&gt;Swap</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M113.828,-24.9828C125.18,-24.9828 136.93,-24.9828 147.735,-24.9828\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"147.761,-28.4829 157.761,-24.9828 147.761,-21.4829 147.761,-28.4829\"/>\n",
"<text text-anchor=\"middle\" x=\"136\" y=\"-31.3828\" font-family=\"Times Roman,serif\" font-size=\"14.00\">x</text>\n",
"</g>\n",
"<!-- Rotation2D&#45;&gt;Swap -->\n",
"<g id=\"edge4\" class=\"edge\"><title>Rotation2D&#45;&gt;Swap</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M87.9235,-9.05754C103.446,-2.94836 122.604,1.75842 140,-1.98278 145.901,-3.2518 151.942,-5.25994 157.707,-7.57359\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"156.513,-10.8714 167.077,-11.6792 159.322,-4.45994 156.513,-10.8714\"/>\n",
"<text text-anchor=\"middle\" x=\"136\" y=\"-8.38278\" font-family=\"Times Roman,serif\" font-size=\"14.00\">y</text>\n",
"</g>\n",
"<!-- Pix2Sky_TAN -->\n",
"<g id=\"node6\" class=\"node\"><title>Pix2Sky_TAN</title>\n",
"<ellipse fill=\"none\" stroke=\"black\" cx=\"337\" cy=\"-24.9828\" rx=\"68.0887\" ry=\"19.0919\"/>\n",
"<text text-anchor=\"middle\" x=\"337\" y=\"-21.8828\" font-family=\"Times Roman,serif\" font-size=\"14.00\">Pix2Sky_TAN</text>\n",
"</g>\n",
"<!-- Swap&#45;&gt;Pix2Sky_TAN -->\n",
"<g id=\"edge6\" class=\"edge\"><title>Swap&#45;&gt;Pix2Sky_TAN</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M224.13,-24.9828C234.383,-24.9828 246.151,-24.9828 258.131,-24.9828\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"258.215,-28.4829 268.215,-24.9828 258.215,-21.4829 258.215,-28.4829\"/>\n",
"<text text-anchor=\"middle\" x=\"246\" y=\"-31.3828\" font-family=\"Times Roman,serif\" font-size=\"14.00\">y</text>\n",
"</g>\n",
"<!-- Swap&#45;&gt;Pix2Sky_TAN -->\n",
"<g id=\"edge8\" class=\"edge\"><title>Swap&#45;&gt;Pix2Sky_TAN</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M214.923,-11.6792C223.236,-7.74556 232.789,-3.96369 242,-1.98278 258.195,1.50011 275.852,-1.01743 291.502,-5.4657\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"290.87,-8.93715 301.461,-8.62399 292.987,-2.26466 290.87,-8.93715\"/>\n",
"<text text-anchor=\"middle\" x=\"246\" y=\"-8.38278\" font-family=\"Times Roman,serif\" font-size=\"14.00\">x</text>\n",
"</g>\n",
"</g>\n",
"</svg>\n"
]
}
],
"prompt_number": 40
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In fairness this wouldn't be the best way to display the graph in this case. It would be better if each node had some kind of labeled anchor points for their inputs and outputs, and the edges would go between those anchor points. I'm not sure a which way to do that.\n",
"\n",
"Another possibility, which I already suggested, is that if `Swap` is some kind of special model subclass it could carry the required metadata to determine what it does and simply the picture thusly."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"One obvious problem with my approach is that for most models the default input/output labels are totally arbitrary. Composing models together might require *frequent* relabeling. For example `Sky2Pix_TAN` takes inputs labeled `(phi, theta)`, so to compose that with a rotation on the left would require something like:\n",
"\n",
"```python\n",
">>> trans = Rotation2D.remap_outputs(['phi', 'theta']) | Sky2Pix_TAN\n",
"```\n",
"\n",
"to make any sense.\n",
"\n",
"One possibility I thought of to relax that constraint would be that if *none* of the labels match up, as in `(x, y) -> (phi, theta)` then it falls back on matching them up simply by position. But if *any* of the labels match, then *all* of them must match. I think that's a fairly straightforward rule, but it could also be confusing.\n",
"\n",
"Although I've stated my preference, if people think it doesn't make any sense I'd happy to back away from it. I just wanted to hear more opinions first and maybe hear other peoples' suggestions if they have any."
]
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment