tutorial_subsystem

This shows you the differences between two versions of the page.

Both sides previous revision Previous revision Next revision | Previous revision | ||

tutorial_subsystem [2014/07/12 07:00] guillaume Part 1 posted |
tutorial_subsystem [2017/04/19 13:31] (current) |
||
---|---|---|---|

Line 7: | Line 7: | ||

Let us assume that we want to compute the mean of the values of a vector. It is feasible through the following Alpha system: | Let us assume that we want to compute the mean of the values of a vector. It is feasible through the following Alpha system: | ||

- | <sxh alphabets; gutter:false> | + | <sxh alphabets; gutter:true> |

affine mean {N | N>0} | affine mean {N | N>0} | ||

input | input | ||

Line 21: | Line 21: | ||

</sxh> | </sxh> | ||

- | However, let us assume that you already have another Alpha system which computes the sum of the elements of a vector. It is possible to use this affine system (instead of rewriting its equation in the main system), by calling it through a "use equation": | + | However, let us assume that you already have another Alpha system which computes the sum of the elements of a vector. It is possible to use this affine system (instead of rewriting its equation in the main system), by calling it through a **use equation**: |

- | <sxh alphabets; gutter:false> | + | <sxh alphabets; gutter:true> |

affine sum {P| P>0} // Computes the sum of the elements of a vector of size P | affine sum {P| P>0} // Computes the sum of the elements of a vector of size P | ||

input | input | ||

Line 49: | Line 49: | ||

In general, the syntax of a use equation is the following: | In general, the syntax of a use equation is the following: | ||

- | <sxh alphabets; gutter:false> | + | <sxh alphabets; gutter:true> |

use subsystem_name[list of parameters] (list of input expressions) returns (list of output variables); | use subsystem_name[list of parameters] (list of input expressions) returns (list of output variables); | ||

</sxh> | </sxh> | ||

- | If your subsystem have several parameters/inputs/outputs, you have to provide them in the order in which they are declared. | + | If your subsystem has several parameters/inputs/outputs, you have to provide them in the order in which they are declared. |

Line 59: | Line 59: | ||

====Extension domain==== | ====Extension domain==== | ||

- | (incoming) | + | |

+ | Let us assume that you have a system which computes a dot product of two vectors: | ||

+ | <sxh alphabets; gutter:true> | ||

+ | affine dotProduct {N | N>0} | ||

+ | input | ||

+ | float v1 {k | 0<=k<N}; | ||

+ | float v2 {k | 0<=k<N}; | ||

+ | output | ||

+ | float Res {|}; | ||

+ | let | ||

+ | Res = reduce(+, [k], v1[k]*v2[k]); | ||

+ | . | ||

+ | </sxh> | ||

+ | | ||

+ | If you want to compute a matrix vector multiplication using this affine system, you will need to instanciate it once per rows of the matrix. Thus, you will need a parametrised number of call to the "dotProduct" system. | ||

+ | | ||

+ | It is possible to do it by using an extension domain: | ||

+ | <sxh alphabets; gutter:true> | ||

+ | affine dotProduct {N | N>0} | ||

+ | input | ||

+ | float v1 {k | 0<=k<N}; | ||

+ | float v2 {k | 0<=k<N}; | ||

+ | output | ||

+ | float Res {|}; | ||

+ | let | ||

+ | Res = reduce(+, [k], v1[k]*v2[k]); | ||

+ | . | ||

+ | | ||

+ | affine matrixVectorProduct {R,S | (R,S)>0} | ||

+ | input | ||

+ | float mat {i,j | 0<=i<R && 0<=j<S }; | ||

+ | float vect {j | 0<=j<S}; | ||

+ | output | ||

+ | float vectRes {i | 0<=i<R}; | ||

+ | let | ||

+ | use {k | 0<=k<R} dotProduct[R] ( mat, (k,j->j)@vect) returns (vectRes); | ||

+ | . | ||

+ | </sxh> | ||

+ | | ||

+ | The set "{k | 0≤k<R}" before the subsystem name is called the **extension domain**. We are calling the system "dotProduct" once, for each instance of "k" in the extension domain. We can use the indexes of the extension domain to parametrize the parameters, inputs given to the subsystem and the outputs computed by the subsystem: | ||

+ | - the indexes can be used to specify the parameters (ex: "R+k") | ||

+ | - the first dimensions of the input expressions correspond to the dimensions of the extension domain. For example, each row of "mat" will be sent to a different instance of the subsystem (ex: in the previous example, the third instance of "dotProduct" will receive "(j->3,j)@mat" and "(j->j)@vect" as inputs). | ||

+ | - the first dimensions of the output variables correspond to the dimensions of the extension domain. All the results from every subsystem call are gathered inside common variables (ex: "vectRes[3]" is the output of the third instance of "dotProduct") | ||

+ | | ||

+ | | ||

+ | Apart from the compatibility of dimensions, the input expressions must be defined at least on the points asked by the subsystem, and the output variable must be defined on a subset of the domain of the subsystem output. | ||

====Transformations involving subsystems==== | ====Transformations involving subsystems==== | ||

- | (incoming, after the previous incoming) | + | **InlineSubSystem:** Inline the equations of a subsystem inside the affine system calling it. The use equation of the main system is replaced by the equations of the subsystem (which are adapted), and new local variables are added. |

+ | | ||

+ | The command is: ''void InlineSubSystem(Program program, String systemName, String label)'' where ''label'' is the label of the inlined use equation. | ||

+ | | ||

+ | | ||

+ | **OutlineSubSystem:** Given a list of equations of an affine systemm, outline them inside a new system and replace these equation by a use equation. The current version (July 2014) do not allow to specify an extension domain, however this is a work in progress. | ||

+ | | ||

+ | The command is ''void OutlineSubSystem(Program program, String system, String listEquations)'' where ''listEquations'' is the list of label of the equations to be outlined. |

tutorial_subsystem.1405170052.txt.gz · Last modified: 2014/07/12 07:00 by guillaume