Analytica 4.0 beta Release Notes/

Changes in


Minor bugs are not listed here.

Graphical User Interface

  • Deleting arrows or input variables: If you delete an arrow from A to B (select and press "delete" key, or just redraw an arrow), Analytica changes the definition of B. It used to substitute "expr" in place of A and surround the entire definition with FunctionOf(...). That was inconvenient and lost information about the former input. Now, if the Mid value of A is a scalar (single number or text), it substitutes it into the definition of B. Otherwise, it replaces A by '{A}' (a comment). Or if you delete A, it doesn't change the definition of B, but B will no longer parse, and its node is cross-hatched.
  • Auto definitions: If you draw an arrow from A to B:
    • If B is a list of zero or more variables not including A, or if B is a function call whose first parameters is such a list, it adds A into the list. For example
  B := Sum([X])
   draw an arrow from A to B
  B := Sum([X, A])
    • If B is a list of variables including A, or is a function whose first parameter is such a list, it removes A from the list. For example,
  B := Sum([X, A])
   draw an arrow from A to B
  B := Sum([X])
    • If B uses a function whose first parameter is an ellipsis (repeating) variable, it similarly adds A (or removes A if it is already there). For example,
 Function ObjList(vars: ... Optional Variable)
 B := Objlist(X)
    draw an arrow from A to B
 B := Objlist(X, A)

Note: If you want Objlist to have no parameters, you must use the Optional qualifier along with "..." -- otherwise, the function needs at least one parameter.

    • If you draw an arrow from index I to and Edit table B, if B is not indexed by I, it askif you want to add I as an index. If so, it adds the index to the table, repeating the current value over each value of I. If B is already indexed by I, it will ask if you want to remove I as an index. If so, the new value of B will be the first slice of its old value over I. It will lose all other data.
  • When you drag a nodes into a module, or use the "Move to Parent" action, the location of the node in the module is not so crammed up so tightly in the top-left corner.
  • Undo also works for:
    • Move Into Parent
    • Move node(s) using the arrow keys
  • A couple UI glitches fixed: Stray compute button, result windows immediately recomputing after invalidation.


  • When the vertical axis displays the independent variable (i.e., when swapXY is on), and when this axis is categorical, the ordering of labels has been reversed. When "reverse order" has not been checked, the first label now appears at the top.
  • The Stacked Bars option is unavailable when the dependent axis (e.g., Y-axis) is categorical, where stacking doesn't make sense.
  • You can now set a slicer to "All" in a stacked bar graph.
  • In a graph window, the right-click menu includes Export... . It lets you export the graph as an image file.
  • On the Axis Ranges tab of the Graph Setup dialog, the label "# ticks" now reads "Approx. # ticks". Analytica uses this as a guideline: It selects the actual number so that the numeric values on the ticks are nice round values. The new label hopefully makes it clearer that this isn't the exact # of ticks.
  • Pre-defined graph templates are now read-only. The "Set Template" button is disabled when these are selected. We hope to include several additional pre-defined graph templates with Analytica before final release. There are current two (as placeholders). This should mean we're ready to add these. If you've created some nice graph templates for consideration, let us know.
  • Suppose you find a graph template that you like so well, you want to make that the default for your entire model. The following steps now work. With a graph displayed, bring up the "Graph Setup..." dialog. In the template box at the bottom, select the template (if not already selected), and optionally view the preview tab. Since this is what you like, change the template box to "Global Default". A question appears. You want the graph appearance to remain, so select "Yes". Now, since you want this appearance to apply to every object, exit the dialog by pressing "Set Default".


  • Formerly the expression X.I referred to the index I of Mid(X). This has been changed so that it now refers to the index I of X evaluated in context. So, for example, Sample(X.I) is now the same as Sample(X).I, while formerly it would have been Mid(X).I.
  • When an "Out of Memory" condition occurs, the error message indicates, when possible, which variable or user-defined function was being evaluated when the memory limit was hit. This can help pinpoint a variable that uses a large intermediate array during a computation.
  • There is now a new data type qualifier, Handle, which can be used when declaring parameters to user-defined functions. Handle is a data type qualifier similar to Number, Text or Reference; it is not an evaluation mode qualifier like the qualifiers Variable and Index. Thus, declaring (X:Handle) means that each atomic element of X is expected to be a Handle to an object. You could declare an array of handles, e.g., (X: Handle[I] ; I : Index ).
  • The function Handle can now be used to obtain a handle to a user-defined function. Formerly the expression Handle(F) would result in a syntax error, saying that a left-paren was expected after F.
  • The expression HandleFromIdentifier("_Caller") now returns the most recent variable or button on the call stack. This is a special form, where "_Caller" won't be confused with an existing identifier since identifiers can never begin with an underscore. This extension opens up some interesting possibilities for declarative meta-inference functions, whose functionality is based on the attributes of the object that calls them.



You are not allowed to post comments.