Draw arrows to build models
These new and improved features let you build and modify model expressions just by drawing arrows between variables -- without typing:
- Draw arrow from index into Table node
- Suppose variable A defined as a Table (or a ProbTable, DetermTable) and you draw an arrow from Index I to node A: If I is not an index of A, it asks if you want to add I as an extra dimension of A. If yes, it adds I as a dimension, and copies the existing array value of A into each new element over I. If I is already an index of A, it asks if you want to remove it, and warn that doing so will lose data. If yes, it the new definition of A is the first slice over I of the old array.
- Redraw or delete an arrow
- If you draw an arrow from variable A to B and A is already in the definition of B, it asks if you want to remove A from the Definition of B. If yes, it puts comment brackets around A, {A}, in the definition of B, so you can see what was removed. The resulting definition will often not parse, so the node for B becomes cross-hatched. It does the same if you delete an arrow -- select the arrow and press the "delete" key.
- Redraw a deleted arrow
- If you delete an input to B as above, and then redraw an arrow from A to B, it restores the original definition by removing the comment brackets {A} around the variable, A.
- Arrow into a list
- If you draw an arrow from A to B, and B contains a list, enclosed in square brackets, such as
B := Sum([X])
- It adds A into the list (if it wasn't already in it)"
B := Sum([X, A])
- Or if you draw an arrow from a variable X into B that is already in the list, it removes the origin variable from the list:
B := Sum([A])
- Repeated parameters
- If B uses a function whose first parameter is Repeated (ellipsis or "..."), it behaves much the same as an explicit list in square brackets. For example,
Function ObjList(vars: ... Variable) B := Objlist(X) draw an arrow from A to B B := Objlist(X, A)
Note: "Repeated" usually means one or more elements. If you remove the last input by redrawing an arrow from A to B, it replaces it by "expr", which will not parse. If you want zero or more elements, you should qualify the parameter with Optional along with "...", for example:
Function ObjList(vars: ... Optional Variable)
By using these methods, you can define functions that let you wire together complex models simply by drawing arrows between nodes -- without having to edit their definitions explicitly.
Comments
Enable comment auto-refresher