 <?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://docs.analytica.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mhenrion</id>
	<title>Analytica Docs - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://docs.analytica.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mhenrion"/>
	<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php/Special:Contributions/Mhenrion"/>
	<updated>2026-05-20T08:35:15Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.35.9</generator>
	<entry>
		<id>https://docs.analytica.com/index.php?title=Attributes&amp;diff=63846</id>
		<title>Attributes</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=Attributes&amp;diff=63846"/>
		<updated>2026-04-14T18:23:22Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  [[Category:Attributes]]&lt;br /&gt;
(Up to [[Analytica Reference]])&lt;br /&gt;
&lt;br /&gt;
Each Analytica Object consists of a set of Attributes -- &amp;quot;properties&amp;quot; or &amp;quot;fields&amp;quot; in other computer languages.  Every Object has a [[Classes of variables and other objects|Class]], Identifier, and Title. Variables and Functions also have a Definition and Domain. &lt;br /&gt;
&lt;br /&gt;
You can easily view and edit some attributes in an [[Object window]]  or the [[Attribute panel]] below a Diagram. Other attributes you can see, but not edit directly -- such as, the Value, Inputs and Outputs of a Variable, which Analytica computes from the Definition.  &lt;br /&gt;
&lt;br /&gt;
Some attributes apply only to a particular object [[Class]] -- for example, Author and Creation date apply only to a Model or Module; Parameters and Recursive apply only to a Function. There are also many internal attributes that you don't usually see but may affect how the node looks -- such as, Nodeinfo, NodeSize, and Nodefont. &lt;br /&gt;
&lt;br /&gt;
In an Analytica expression you can access attributes using [[Attrib of Obj|«Attrib» OF «Obj»]] syntax. Inside [[OnClick]] and [[Onchange]] attributes, you can also modify some Attributes from Analytica code by assigning to them.&lt;br /&gt;
&lt;br /&gt;
This page first describes common editable Attributes, then common non-modifiable Attributes, and finally the many obscure internal Attributes that users rarely need to know about.&lt;br /&gt;
&lt;br /&gt;
== Common attributes ==&lt;br /&gt;
&lt;br /&gt;
These attributes apply to all classes of user-defined objects. You can edit them directly in [[Edit mode]] in the [[Object window]] and [[Attribute panel]]:&lt;br /&gt;
&lt;br /&gt;
===Editable Attributes of all Objects===&lt;br /&gt;
&lt;br /&gt;
====Class====&lt;br /&gt;
The [[Classes of variables and other objects|class]] of the object, such as Variable, Index, Function, or Module. You may change the Class of an object only to a compatible class: You can change the class of a Variable among these subclasses Chance, Constant, Determ, Decision, Index, Objective, Variable. You may change a [[Modules and Libraries|Module]] among these subclasses Library, FiledLibrary, Model, Module, FiledModule, or Form. You can change a [[Text nodes|Text]] node to a [[Frame node|Frame]] node or back. You can't change the class of a Function, Button, or system object.  In the [[Object window]] or [[Attribute panel]], in Edit mode, the Class appears as a pulldown menu that lets you change it to another compatible Class.&lt;br /&gt;
&lt;br /&gt;
====Identifier====&lt;br /&gt;
The unique name of the object. An identifier must start with a letter, and contain only letters, digits, or underscore, up to 40 characters. Identifiers are insensitive to case -- but Analytica retains and shows the case originally provided (or adapted from the Object's title). So you can use CamelCase to clarify words in the identifier.&lt;br /&gt;
&lt;br /&gt;
====Title==== &lt;br /&gt;
A word or brief phrase identifying the the object. It usually appears in the diagram node, and in many other places in the user interface. It's best to limit a Title to about 50 characters. By default, it creates an identifier from the first 20 characters of the title, substituting &amp;quot;_&amp;quot; for blank or any character that isn't a letter or digit.&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
Text that describes or documents the object. For a variable, it should describe what the quantity represents. For a function, it should describe what value it returns and what parameters it expects. If the definition is not obvious, it should also explain briefly what definition is doing. It should also mention any exceptions, such as what it does if an input or parameter is outside the expected domain.&lt;br /&gt;
&lt;br /&gt;
===Editable attributes of Variables and Functions===&lt;br /&gt;
&lt;br /&gt;
====Units====&lt;br /&gt;
The units of measurement of a variable, or value returned by a function -- such as &amp;quot;$/year&amp;quot; or &amp;quot;km/hr&amp;quot;. It's best to use abbreviations to keep units within about 10 characters.&lt;br /&gt;
&lt;br /&gt;
====Definition====&lt;br /&gt;
The expression used to compute the value of a variable or function.&lt;br /&gt;
&lt;br /&gt;
====[[Check Attribute|Check]]==== &lt;br /&gt;
An expression used to test that the computed result value is valid.  If it returns false, it gives a warning. This is helpful to detect errors in user input or complex calculations.  See [[Check Attribute]].&lt;br /&gt;
&lt;br /&gt;
===Non-editable attributes of variables and functions===&lt;br /&gt;
&lt;br /&gt;
These attributes are of variables and functions are visible, but not editable, in the Object window and Attribute panel:&lt;br /&gt;
&lt;br /&gt;
====Inputs====&lt;br /&gt;
A list of variables and functions used in the definition, after definition has been parsed. Before parsing, it may contain variables and functions from which arrows were drawn.&lt;br /&gt;
&lt;br /&gt;
====Outputs====&lt;br /&gt;
A list of variables and functions that use this object in their definitions.&lt;br /&gt;
&lt;br /&gt;
====Value====&lt;br /&gt;
The computed (mid-)value of the variable (not available for functions). You may displayed  the Value in an Object window, but it is not displayed by default. &lt;br /&gt;
&lt;br /&gt;
Accessing the attribute's value from an expression (using e.g., &amp;lt;code&amp;gt;Value of X&amp;lt;/code&amp;gt; doesn't trigger a calculation, and will return a special value of &amp;lt;code&amp;gt;Undefined&amp;lt;/code&amp;gt; if it isn't yet computed. However, we recommend using &amp;lt;code&amp;gt;[[Mid]]([[IsResultComputed]](X))&amp;lt;/code&amp;gt; to detect whether the mid-value is computed yet or not (or &amp;lt;code&amp;gt;[[Sample]]([[IsResultComputed]](X))&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
====EvaluationTime==== &lt;br /&gt;
The number of CPU seconds that have been spent evaluating or obtaining the value of the variable, or computing the result of the [[User Defined Functions|function]], since the object was created or loaded, or since the [[ResetEvalTimes]] command was last executed.  This timing does not include the time spent evaluating parent values.&lt;br /&gt;
&lt;br /&gt;
====EvaluationTimeAll====  &lt;br /&gt;
The number of CPU seconds spent in evaluation of the object, including time spent evaluating or obtaining the values of other variables that it depends on.  This is the cumulative time since the object was first created or loaded, or since the [[ResetEvalTimes]] command was last executed.&lt;br /&gt;
&lt;br /&gt;
===Editable attributes of Functions===&lt;br /&gt;
&lt;br /&gt;
====Parameters==== &lt;br /&gt;
A list of the function [[parameters]], enclosed in parentheses. It may include [[parameter qualifiers|qualifiers]] that specify what data type or dimension are expected for each parameter, or whether a parameter is optional or may be repeated. It is good practice to also list the main (non-optional) parameters (without qualifiers) in the title, so users can easily see what parameters it expects from seeing the function node in a diagram.&lt;br /&gt;
&lt;br /&gt;
====Recursive==== &lt;br /&gt;
A boolean, with value 0 (default) or 1, specifies whether the function is recursive -- i.e., it may call itself in its definition, or call another function that calls it (mutually recursive). By default, it is not displayed. You need to set it to be displayed in the [[Attributes dialog]].&lt;br /&gt;
&lt;br /&gt;
===Editable Attributes of Modules===&lt;br /&gt;
&lt;br /&gt;
====Author==== &lt;br /&gt;
The name(s) of the person or people who created this module. When you start a new model, it may automatically fill this in with the name of the owner of the computer, if registered with Windows.&lt;br /&gt;
&lt;br /&gt;
====[[TemplateInput]]==== &lt;br /&gt;
Identifies a single variable within the module that functions at the module's primary input. Drawing an arrow into this module node inserts the origin of the arrow as the definition of this variable. &lt;br /&gt;
&lt;br /&gt;
====[[TemplateOutput]]==== &lt;br /&gt;
Identifies a single variable within the module that serves as the module's primary output.  Drawing an arrow from this module node treats this variable as the origin of the arrow  -- for example, for use as an input to another object. &lt;br /&gt;
&lt;br /&gt;
===Non-editable attributes of modules===&lt;br /&gt;
&lt;br /&gt;
The Module [[class]] includes subclasses Model, Module, Filed Module, Library, Filed Library, and Form. These are attributes of modules that you can see but not edit in the [[Object window]] and [[Attribute panel]]:&lt;br /&gt;
&lt;br /&gt;
====Date (Created)==== &lt;br /&gt;
The time and date on which the module was first created.&lt;br /&gt;
&lt;br /&gt;
====Savedate (Last Saved)==== &lt;br /&gt;
The time and date on which this model or separately filed module or library was last saved. &lt;br /&gt;
&lt;br /&gt;
====FileInfo (File info)==== &lt;br /&gt;
The directory path and name of the file from which this model was read from or to which it was last saved.&lt;br /&gt;
&lt;br /&gt;
==Hidden attributes==&lt;br /&gt;
&lt;br /&gt;
There are quite a few hidden attributes that you can't usually see in the standard user interface, and almost never need to think about. If needed you can see them in the [[Typescript]] Window.  Type &amp;quot;Profile &amp;lt;identifier&amp;gt;&amp;quot; into the Typescript to see all the attributes of an object. &lt;br /&gt;
&lt;br /&gt;
=== Hidden attributes of Variables and Functions===&lt;br /&gt;
&lt;br /&gt;
====[[NumberFormat]]==== &lt;br /&gt;
The number format parameters specified in the [[Number Format Dialog]] for numbers generated in a variable or function. If absent, it uses the default Number Format.&lt;br /&gt;
:&amp;lt;code&amp;gt;v, format, proxy, zeroes, separators, currency, digits, trailingZeros, currencysymbol, currencyPlacement, datetemplate, fullPrecision, fullDateTemplate, relReqForFullDateTemplate, datesAsNumbers, numbersAsDates, digitsForGeneralFmt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[[ProbabilityNumberFmt]]==== &lt;br /&gt;
In a Probability Bands result view, a Cumulative Probability result view, or a Probability mass view for a discrete-valued quantity, probabilities display in addition to values for the underlying variable. For the columns or axes containing probabilities, this attribute holds the number format, which is often different from the underlying variable's number format.&lt;br /&gt;
:&amp;lt;code&amp;gt;v, format, proxy, zeroes, separators, currency, digits, trailingZeros, currencysymbol, currencyPlacement, datetemplate, fullPrecision, fullDateTemplate, relReqForFullDateTemplate, datesAsNumbers, numbersAsDates, digitsForGeneralFmt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[[DensityNumberFormat]]====&lt;br /&gt;
In a Probability Density Result view for a continuous variable, probability density values appear in addition to values for the underlying variable's quantity. This attribute stores the number format used for columns or axes that display probability densities.&lt;br /&gt;
:&amp;lt;code&amp;gt;v, format, proxy, zeroes, separators, currency, digits, trailingZeros, currencysymbol, currencyPlacement, datetemplate, fullPrecision, fullDateTemplate, relReqForFullDateTemplate, datesAsNumbers, numbersAsDates, digitsForGeneralFmt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====FixedDef====&lt;br /&gt;
The parse-tree (DCODE) from the Definition. It displays as the code, usually with extra parens. &lt;br /&gt;
&lt;br /&gt;
====DisplayInputs====&lt;br /&gt;
A list of objects among inputs from which arrows are to be displayed. It does not display arrows from Inputs that are not in Displayinputs.&lt;br /&gt;
&lt;br /&gt;
====IsIn====&lt;br /&gt;
A handle to the module that contains this object. (Null for the top model.)&lt;br /&gt;
&lt;br /&gt;
====[[Aliases]]====&lt;br /&gt;
A list of handles to any user inputs or user outputs ([FormNode]]) or [[Alias nodes]] for this object. Any object type can have aliases, including Variables, Functions, Modules, and Buttons.&lt;br /&gt;
&lt;br /&gt;
====[[Original]]====&lt;br /&gt;
The original node of a user input or user output ([[FormNode]]) or [[Alias nodes|Alias node]].  [[Aliases]] attribute contains all the nodes listing it as its Original.&lt;br /&gt;
&lt;br /&gt;
===Hidden attributes of Modules===&lt;br /&gt;
&lt;br /&gt;
====Contains====&lt;br /&gt;
The list of objects contained in this module.&lt;br /&gt;
&lt;br /&gt;
====DefaultSize====&lt;br /&gt;
The default node size for new nodes in this module.  It uses the same format as Nodesize. If empty, it inherits the default size from its  parent module. For a Model, it uses the default size from the Analytica initialization.&lt;br /&gt;
&lt;br /&gt;
==Node attributes==&lt;br /&gt;
&lt;br /&gt;
These attributes apply to the visual node that represents an object in its parent influence diagram.  They control the location, size, and appearance of each node.  You can modify some in the [[Diagram window|Diagram view]] (NodeLocation, NodeSize), some in the  [[Node Style dialog]] (NodeFont, NodeInfo), or using the [[Color palette|Color palette dialog]], (NodeColor and NodeFontColor). :&lt;br /&gt;
&lt;br /&gt;
====Nodelocation==== &lt;br /&gt;
The location of the node center in its parent diagram, as x,y,z, where x and y are number of pixels rightwards and downwards from the top-left corner of the diagram.  You can, of course, modify node location by dragging nodes in their diagram. Nodes are displayed in order of z value, which therefore controls which nodes are displayed in front of other nodes. You can send a node back or to the front  by selecting the node and using the [[Right mouse button menus|Right mouse button menus.]]&lt;br /&gt;
&lt;br /&gt;
====Nodesize==== &lt;br /&gt;
The size of the node, as x,y, where x and y are the half width and half height in pixels, i.e. the distance from the node center to each edge. You can change the size of each node in its Diagram dragging the corner boxes around a selected node. You can define the default node sizes in the [[Diagram Style dialog]].&lt;br /&gt;
&lt;br /&gt;
====Nodecolor==== &lt;br /&gt;
The color for this node, as r,g,b, where each color is in the range 0 to 65535. If empty, it uses the default color for this object class. You can modify colors by directly by selecting the node in the diagram, and using the [[Color palette]]. For arrow objects, the arrow color is determined by this attribute; if empty, it uses the Arrow class default. Dynamic dependency arrows use a separate color (the dynamic arrow color attribute) instead.&lt;br /&gt;
&lt;br /&gt;
====NodeFontColor==== &lt;br /&gt;
Controls the font color of a node in a diagram.  You can modify it from the  [[Color palette#Change the text color of nodes|Color palette]]. The attribute is in RGB format, r,g,b, where each color is in the range 0 to 65535. If empty, it inherits the font color from the diagram's default font color (DiagFontColor). If the diagram has no default, it uses the class default.&lt;br /&gt;
&lt;br /&gt;
====NodeBorderColor====&lt;br /&gt;
The border color of a node. The attribute is in RGB format, r,g,b, where each color is in the range 0 to 65535. If empty, it uses the default border color for this object class. For modules, the border color walks up the ancestor module hierarchy until an explicit border color is found.&lt;br /&gt;
&lt;br /&gt;
You can see the effects of Nodefont and Nodeinfo in the parent diagram. You can modify them for each node with the [[Node Style dialog]] or set defaults for a model or module with the [[Diagram Style dialog]].&lt;br /&gt;
&lt;br /&gt;
====NodeInfo ====&lt;br /&gt;
{{Assista||Subattributes of NodeInfo -- you can also read or set the subattributes such as &amp;lt;code&amp;gt;NodeInfo::fill of obj&amp;lt;/code&amp;gt;, etc.}}&lt;br /&gt;
&lt;br /&gt;
This affects how the node appears.  It has quite a number of fields, all Boolean -- 0 or 1 -- except ''widthOfCtrl''. [[NodeInfo|More on NodeInfo...]]&lt;br /&gt;
&lt;br /&gt;
Individual sub-fields of NodeInfo (such as show inputs, show outputs, show label, show border, fill node, show icon) inherit from the class default when not explicitly set on the node. Label justification (a sub-field not shown above) defaults to center for most classes, and left-aligned for [[Text]] nodes.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;1,inputArrows, outputArrows, label, border, fill, useCustomFont, widthOfCtrl,  bevel, showFormIcon, embedded, hidden&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: ''inputArrows'': set to 1 to show all input influence arrows or 0 to suppress them&lt;br /&gt;
:: ''outputArrows'': set to 1 to show all output influence arrows or 0 to suppress them&lt;br /&gt;
:: ''label'': set to 1 to show the title (or identifier) in the node, or 0 not to.&lt;br /&gt;
:: ''border'': set to 1 to show the thin border around the node, or 0 not to.&lt;br /&gt;
:: ''fill'': set to 1 to fill the node with selected color, or 0 not to.&lt;br /&gt;
:: ''label'': set to 1 to show the title (or identifier) in the node, or 0 not to.&lt;br /&gt;
:: ''useCustomFont'': set to 1 to use the custom font set in NodeFont, or 0 not to.&lt;br /&gt;
:: ''widthOfCtrl'': For a user input or output node, this specifies the width of the field (for a text or choice menu) or the button for other types.&lt;br /&gt;
:: ''bevel'': set to 1 to show a bevel to make the node appear outdented -- default for button nodes -- or 0 not to.&lt;br /&gt;
:: ''ShowFormIcon'': controls whether the little result mode icon (e.g., &amp;quot;Mid&amp;quot;) displays to the right of the result button or not.&lt;br /&gt;
:: ''Embedded'': is reserved for a future release, where it will specify that the edit table, result view, or module is shown directly on the diagram within the node's rectangular area.&lt;br /&gt;
::''visibility'': The visible / hidden / disabled state of the node, usually set using the [[ChangeNodeVisibility]] function. Possible values:&lt;br /&gt;
::: 0 = visible (default when unset)&lt;br /&gt;
::: 1 = hidden&lt;br /&gt;
::: 2 = very hidden&lt;br /&gt;
::: 3 = Extremely hidden&lt;br /&gt;
::: 4 = Hidden in browse mode&lt;br /&gt;
::: 5 = Disabled&lt;br /&gt;
::: 6 = Disabled in browse mode&lt;br /&gt;
&lt;br /&gt;
====Nodefont==== &lt;br /&gt;
The node font family and size in points, e.g. Bodoni, 16. If empty, it inherits the font from the parent diagram module, walking up the module hierarchy until a module with an explicit font is found. If no ancestor sets a font, it uses the default project font (typically Arial).&lt;br /&gt;
&lt;br /&gt;
====Att_hyperlinkPref==== &lt;br /&gt;
When an index or result table contains a [[handle]] to an object, it shows title of the object as a blue clickable link. When you click a handle link, it shows the object. The number assigned to this attribute controls how it shows the object when you click :&lt;br /&gt;
# Open its Object window&lt;br /&gt;
# Open its parent diagram with the node selected&lt;br /&gt;
# If it's a Module, open its Diagram with nothing selected. Otherwise, Open parent Diagram with the node selected.&lt;br /&gt;
The attribute is inherited: If you set this attribute for a Model, it sets the default for all results.  If you set it on a module, it sets the default for results inside that module.  If you set it for a particular variable, it applies only to that variable.&lt;br /&gt;
&lt;br /&gt;
====DiagramColor====&lt;br /&gt;
The background color of a diagram, as r,g,b, where each color is in the range 0 to 65535. This attribute is set on a Module. Unlike most node appearance attributes, the diagram background color does '''not''' inherit from parent modules; if not set, it defaults to white.&lt;br /&gt;
&lt;br /&gt;
====Pict==== &lt;br /&gt;
An image shown in the node. You can paste an image into a node, or assign an image in standard formats (.png, jpeg, tiff) to the Pict attribute of a node.&lt;br /&gt;
&lt;br /&gt;
==Window status attributes==&lt;br /&gt;
&lt;br /&gt;
These attributes store the location and size of windows, including the Diagram, Object, and Result window, as applicable to each class of object.&lt;br /&gt;
&lt;br /&gt;
====DiagState====&lt;br /&gt;
The location and size of the diagram window, where ''x'', ''y'' are location of top left corner, ''w'' and ''h'' are width and height in pixels.  ''b'' is a bit field that stores the diagram style options.  ''t'' is the style for tabs when a tabbed diagram style is selected.  &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;v, x, y, w, h, b, tabs, buttonStyle, customIcon, titleOnly, crumbs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:''v'' is a version number. Should be 2.&lt;br /&gt;
&lt;br /&gt;
:''x'', ''y'' in the coordinate of the top-left corner of the window frame when the window is not maximized, relative to the top-left corner of the ''desk area'' (the gray background area that starts under the toolbar). &lt;br /&gt;
&lt;br /&gt;
:''w, h'' are the width and height of the client area of the window when the window is not maximized. This client are is the area of the window not including the edges around the window, the window title bar, or the attribute panel, but it does include the diagram scroll bars (which have a width and height of 16). In [[Analytica 4.6]] and earlier, the height is from the bottom edge of the title bar to the bottom of the diagram's horizontal scroll bar, and hence, includes the height of the module hierarchy stripe within the total height. In [[Analytica 5.0]], the height starts at the lower edge of the hierarchy stripe -- so it does not include the hierarchy stripe.&lt;br /&gt;
&lt;br /&gt;
:''b'' is a bit field, which is the sum of the following values:&lt;br /&gt;
:* 1 = Show arrows to/from modules&lt;br /&gt;
:* 2 = Show arrows to/from indexes&lt;br /&gt;
:* 4 = Show arrows to/from functions&lt;br /&gt;
:* 8 = Turn off background (i.e., the diagram background will appear white)&lt;br /&gt;
:* 16 = Show dynamic dependency arrows &lt;br /&gt;
:* 32 = Show arrows for dependencies in the Check attribute&lt;br /&gt;
&lt;br /&gt;
:''tabs'' is reserved for a future enhancement (not currently exposed)  It encodes whether the diagram is a tabbed diagram, which side the tabs display on, and which style of tabs are used.  Possible values are:&lt;br /&gt;
:* 0 = (default) Not tabbed&lt;br /&gt;
:* 1 = Tabs on top&lt;br /&gt;
:* 2 = Tabs on bottom&lt;br /&gt;
:* 3 = Tabs on left (vertical text)&lt;br /&gt;
:* 4 = Tabs on right (vertical text)&lt;br /&gt;
:* 5 = Wide tabs on left (horizontal text)&lt;br /&gt;
:* 6 = Wide tabs on right (horizontal text)&lt;br /&gt;
:* 7 = Tabs hidden (e.g. overlays, controlled via button scripts)&lt;br /&gt;
&lt;br /&gt;
:''buttonStyle'' controls how the buttons in input and output nodes display (such as ''Calc'', ''Edit Table'', etc).&lt;br /&gt;
:* 0 = Normal text (default in [[Analytica 5.0]])&lt;br /&gt;
:* 1 = Bolded text (pre-5.0 standard)&lt;br /&gt;
:* 2 = Blank (no label or icon in button)&lt;br /&gt;
:* 3 = Icon&lt;br /&gt;
:* 4 = Bare Icon&lt;br /&gt;
::''buttonStyle'' was introduced in [[Analytica 5.0]]&lt;br /&gt;
::The ''buttonStyle'' inherits from the parent module's diagram. If no ancestor module sets it, it defaults to normal text style (0).&lt;br /&gt;
&lt;br /&gt;
:''customIcon'' If set to 1, uses the pict of the module or model as the icon for the titlebar.&lt;br /&gt;
&lt;br /&gt;
:''titleOnly'' If set to 1, uses the diagram object's title as the titlebar's title without the prefix &amp;quot;Diagram - &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:''crumbs'' If 0, hides the hierarchy bar from this diagram window only (child diagrams unaffected), &lt;br /&gt;
&lt;br /&gt;
::''customIcon'', ''titleOnly'', and ''crumbs'' were introduced in [[Analytica 6.4]].&lt;br /&gt;
&lt;br /&gt;
{{Assista||You can read or set the SubAttributes of DiagState using e.g., &amp;lt;code&amp;gt;DiagState::w of obj&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
====WindState==== &lt;br /&gt;
The location and size of the object window, where X, Y are location of top left corner, W and H are width and height in pixels. v is version number, usually 1. (Applies to all user-defined objects.)&lt;br /&gt;
:&amp;lt;code&amp;gt;v, X, Y, W, H&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Assista||In an expression, you can use a subattribute such as &amp;lt;code&amp;gt;WindState::W of obj&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====ValueState==== &lt;br /&gt;
{{Assista|key|SubAttributes of ValueState}}&lt;br /&gt;
&amp;lt;code&amp;gt;v, X, Y, W, H, Graph, U&amp;lt;/code&amp;gt;&lt;br /&gt;
The type, location and size of the result window for a variable, where  X, Y are location of top left corner of the window, W and H are width and height in pixels of the area exclusing the title bar and edges (the actual window size is X+15, Y+38), Graph is 1 if a graph view, 0 if a table view, and U is text defining the uncertainty view. v is version number, usually 1. (Applies only to variables.)&lt;br /&gt;
&lt;br /&gt;
====DefnState==== &lt;br /&gt;
The location and size of an edit table window.&lt;br /&gt;
{{Assista|key|SubAttributes of DefnState}}&lt;br /&gt;
:&amp;lt;code&amp;gt;v, x, y, w, h&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====OutlinerState==== &lt;br /&gt;
The location and size of the outliner window.  This is stored as an attribute of the keyword object named &amp;lt;code&amp;gt;All&amp;lt;/code&amp;gt; and is not saved with the model. &lt;br /&gt;
{{Assista|key|SubAttributes of OutlinerState}}&lt;br /&gt;
:&amp;lt;code&amp;gt;v, x, y, w, h&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Reformval==== &lt;br /&gt;
Lists the indexes for a multidimensional variable, in sequence defining which index is for rows (x axis), which for columns (key), and the remaining as slicers, from bottom to top. &lt;br /&gt;
&lt;br /&gt;
====Att_usebyprevindex==== &lt;br /&gt;
???&lt;br /&gt;
&lt;br /&gt;
== Internal Engine Attributes==&lt;br /&gt;
&lt;br /&gt;
=== Att_versionRange ===&lt;br /&gt;
=== Att_canBeIn ===&lt;br /&gt;
&lt;br /&gt;
=== Att_dirties ===&lt;br /&gt;
Used on a system variable to flag whether a change to the sys var causes the model to &amp;quot;dirty&amp;quot; (i.e., require a save).&lt;br /&gt;
&lt;br /&gt;
Starting with [[Analytica 6.6]], you can also set this to 0 on your own Variables to signal that a change to the Definition does not dirty the module or library containing the variable. This can be useful when your library (which might be linked) updates a user input or internal state, but that is specific to the model, not the library, so you don't want this to trigger a save of the library.&lt;br /&gt;
&lt;br /&gt;
=== Att_showable ===&lt;br /&gt;
=== Att_saveAlways ===&lt;br /&gt;
=== Att_recordSysFunDependencies ===&lt;br /&gt;
=== Att_Saveable ===&lt;br /&gt;
=== Att_attributeType ===&lt;br /&gt;
=== Att_readOnly ===&lt;br /&gt;
=== Att_domainKids, Att_domainParents ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== User Interface State Attributes ==&lt;br /&gt;
&lt;br /&gt;
'''Att_resultSliceState''': &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Att_editSliceState'''&lt;br /&gt;
&lt;br /&gt;
== Graphing Attributes ==&lt;br /&gt;
&lt;br /&gt;
=== xyExpr ===&lt;br /&gt;
&lt;br /&gt;
Contains one external/exogenous value expression.  Recognized by Analytica 3.1 and earlier, where the expression for the X value in an XY graph was stored.  &lt;br /&gt;
&lt;br /&gt;
=== Att_exogenousValue ===&lt;br /&gt;
&lt;br /&gt;
Holds a list of external values for a result window, which can then be used as graphing dimensions.  Analytica 4.0 allows more than one external value to be brought in for plotting against the primary result of a variable.  This attribute holds a list of expressions -- most commonly, each expression consists of a single variable identifier.&lt;br /&gt;
&lt;br /&gt;
The xyExpr may also contain one addition external expression.  (The reason it is split across two attributes is for greater 3.1 interoperability).&lt;br /&gt;
&lt;br /&gt;
=== Att_GraphIndexRange ===&lt;br /&gt;
Stores the axis settings for an index. When you have set it globally (via the '''Set Default''' button in the [[Graph setup dialog]]), the attribute setting is set on the index node itself. More commonly, it is set from within a [[GraphSetup]] attribute so that it applies to that index only in the context of the graph.&lt;br /&gt;
&lt;br /&gt;
{{Assista|key|SubAttributes of Att_GraphIndexRange}}&lt;br /&gt;
&lt;br /&gt;
:ver, cat,auto, includezero, log, reverse, incs, min, max, includeSubset, excludeSubset, hideLabels&lt;br /&gt;
where:&lt;br /&gt;
:version : Must be 1 (version)&lt;br /&gt;
:categorical : Categorical flag (1=force categorical interp), opt.&lt;br /&gt;
:auto : Full autoscale flag &lt;br /&gt;
:includezero : force 0 to be in range flag &lt;br /&gt;
:log : log scaling flag&lt;br /&gt;
:reverse : reverse order flag&lt;br /&gt;
:incs : Number of increments&lt;br /&gt;
:min : minimum value for manually scaled axis&lt;br /&gt;
:max : maximum value for manually scaled axis&lt;br /&gt;
:includeSubset : [2,7,8,12]  -- include these items (by position) when using manual scaling.  Brackets included&lt;br /&gt;
:excludeSubset : [3,6,13,17] -- exclude these items when using manual scaling.&lt;br /&gt;
:hideLabels: 1=hide labels for this axis&lt;br /&gt;
&lt;br /&gt;
=== Att_GraphValueRange ===&lt;br /&gt;
&lt;br /&gt;
This attribute is usually contained within the [[GraphSetup]] attribute (except when '''Set Default''' was pressed after configuring the range).&lt;br /&gt;
&lt;br /&gt;
The range for each value is encoded as&lt;br /&gt;
&lt;br /&gt;
{{Assista|key|SubAttributes of Att_GraphValueRange}}&lt;br /&gt;
:ver, cat,auto, includezero, log, reverse, incs, min, max, includeSubset, excludeSubset, hideLabels&lt;br /&gt;
where:&lt;br /&gt;
:version : Must be 1 (version)&lt;br /&gt;
:categorical : Categorical flag (1=force categorical interp), opt.&lt;br /&gt;
:auto : Full autoscale flag &lt;br /&gt;
:includezero : force 0 to be in range flag &lt;br /&gt;
:log : log scaling flag&lt;br /&gt;
:reverse : reverse order flag&lt;br /&gt;
:incs : Number of increments&lt;br /&gt;
:min : minimum value for manually scaled axis&lt;br /&gt;
:max : maximum value for manually scaled axis&lt;br /&gt;
:includeSubset : [2,7,8,12]  -- include these items (by position) when using manual scaling.  Brackets included&lt;br /&gt;
:excludeSubset : [3,6,13,17] -- exclude these items when using manual scaling.&lt;br /&gt;
:hideLabels: 1=hide labels for this axis&lt;br /&gt;
&lt;br /&gt;
For a given variable identifier, there can be a different range for each slice along a comparison index. These are encoded by joining the different range settings using a pipe separator (&amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;) and prefixing each slice range with the slice number and colon. For example:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;1,,1,,0,,20|1:1,,0,,1,,,0.01,0.56,0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first range (&amp;lt;code&amp;gt;1,,1,,0,,20&amp;lt;/code&amp;gt; is for the variable's main value, the second one is prefixed by &amp;quot;1:&amp;quot; and applies to the first comparison slice. In a continuous CDF, PDF or Exceedance plot, this would be the 'X' value (e.g., the probability or density axis), but the 'Y' value is encoded instead on the &amp;lt;code&amp;gt;Graph_*_Valdim&amp;lt;/code&amp;gt; system variable.&lt;br /&gt;
&lt;br /&gt;
For common statistical axis, the attribute is set on special system variables with names having the form &amp;lt;code&amp;gt;Graph_*_Valdim&amp;lt;/code&amp;gt;, such as &amp;lt;code&amp;gt;Graph_Pdf_Valdim&amp;lt;/code&amp;gt;. This encodes the range setting for the PDF's density axis.&lt;br /&gt;
&lt;br /&gt;
=== Att_continuousLineStyle ===&lt;br /&gt;
=== Att_categoricaLineStyle ===&lt;br /&gt;
=== Att_stackedBar ===&lt;br /&gt;
=== Att_stackedLine ===&lt;br /&gt;
=== Att_barOverlap ===&lt;br /&gt;
&lt;br /&gt;
=== Graphing Role Attributes ===&lt;br /&gt;
&lt;br /&gt;
These attributes are: '''Att_xRole''', '''Att_yRole''', '''Att_colorRole''', '''Att_symbolRole''', '''Att_symbolSizeRole''', '''Att_originRole'''.&lt;br /&gt;
&lt;br /&gt;
They define the graphing pivot in coordination with the '''reformVal''' attribute.  The settings in these attributes are combined with the current chart type, dimensions present in the current value (or values), etc., and Analytica may adjust the pivot actually shown to create a consistent set of roles.  Since the dimensionality of results can change in Analytica (as upstream dimensions or added or removed, the view type can be changed, or the number of elements in a dimension may change), the exact pivot used the previous time the graph was displayed may no longer be sensible.  However, when possible, the roles defined in these attributes do become the roles used in the graph.&lt;br /&gt;
&lt;br /&gt;
Each of these role attributes can hold values in several possible forms:&lt;br /&gt;
* '''Self''': The keyword Self indicates that the main result fills the role.&lt;br /&gt;
* '''barOrigin''': The attribute name barOrigin indicates that the expression found in the legacy barOrigin attribute fills the role.&lt;br /&gt;
* '''xyExpr''': The attribute name indicates that the expression found in the xyExpr attribute fills the role.&lt;br /&gt;
* ''identifier'' : The identifier indicates that the index having this identifier fills the role.&lt;br /&gt;
* '''Sys_LocalIndex(&amp;quot;''name''&amp;quot;)''': Syntax indicating that the local index having the indicated name is used.&lt;br /&gt;
* '''Sys_CoordIndex(''value'')''' : The slice of the main result corresponding to ''[CoordIndex=value]'' is used, where ''value'' is an element of the coordinate index.&lt;br /&gt;
* 0 : The numeric value zero indicates that the main result is used (same as Self).&lt;br /&gt;
* n &amp;gt; 0:  A positive integer value indicates that an external value is used.  Several exogenous values may be attached to the result view (see '''Att_exogenousValues''' and '''xyExpr''' attributes).  These are numbered, with the xyExpr always being n=1 if present, and then the remaining continuing in order through those listed in Att_exogenousValues, and finally the legacy barOrigin attribute expression coming last.&lt;br /&gt;
* n &amp;lt; 0: A negative integer value identifies a coordinate index slice by position.  The role uses the slice of the main result corresponding to ''[@CoordIndex=abs(n)]''.&lt;br /&gt;
&lt;br /&gt;
Also '''barOrigin'''.&lt;br /&gt;
&lt;br /&gt;
== Table attributes ==&lt;br /&gt;
&lt;br /&gt;
* [[TableCellDefault]]: The default value (or Checkbox or Choice expression) used in a new cell of an Edit table when you add or extend an index of that table.&lt;br /&gt;
&lt;br /&gt;
* [[CorrespondenceMethod]]&lt;br /&gt;
&lt;br /&gt;
==Other attributes==&lt;br /&gt;
; Att_BrowseOnly&lt;br /&gt;
; Att__cloakDefn&lt;br /&gt;
; Att_Dirty&lt;br /&gt;
; Att_Obfuscated&lt;br /&gt;
; Att_recordSet : See [[DbQuery]] for examples of use&lt;br /&gt;
; Att_ResultSliceState&lt;br /&gt;
; Att_rlm_license&lt;br /&gt;
; Att_rlm_licenseobj&lt;br /&gt;
; Att_Showable&lt;br /&gt;
; Att_whenDisallowed&lt;br /&gt;
; [[Att_PreLoadScript]]&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
&amp;lt;div style=&amp;quot;column-count:2;-moz-column-count:2;-webkit-column-count:2&amp;quot;&amp;gt;&lt;br /&gt;
* [[Manage attributes]]&lt;br /&gt;
* [[Attrib of Obj]]&lt;br /&gt;
* [[Objects and Values]]&lt;br /&gt;
* [[Objects_and_Their_Attributes_-_Part_1_of_3|Objects and Their Attributes]]&lt;br /&gt;
* [[Objects_and_Their_Attributes_-_Part_2_of_3#User-Specified_Attributes|User-Defined Attributes]]&lt;br /&gt;
* [[To edit an attribute]]&lt;br /&gt;
* [[Attribute panel]]&lt;br /&gt;
* [[:Category: Attributes]]&lt;br /&gt;
* [[Domain attribute]]&lt;br /&gt;
* [[Class]]&lt;br /&gt;
* [[Identifier]]&lt;br /&gt;
* [[Optimizer Attributes]]&lt;br /&gt;
* [[Attributes of a function]]&lt;br /&gt;
* [[Check attribute]]&lt;br /&gt;
* [[Classes of variables and other objects]]&lt;br /&gt;
* [[Definitions]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=Attributes&amp;diff=63845</id>
		<title>Attributes</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=Attributes&amp;diff=63845"/>
		<updated>2026-04-14T18:22:27Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  [[Category:Attributes]]&lt;br /&gt;
(Up to [[Analytica Reference]])&lt;br /&gt;
&lt;br /&gt;
Each Analytica Object consists of a set of Attributes -- &amp;quot;properties&amp;quot; or &amp;quot;fields&amp;quot; in other computer languages.  Every Object has a [[Classes of variables and other objects|Class]], Identifier, and Title. Variables and Functions also have a Definition and Domain. &lt;br /&gt;
&lt;br /&gt;
You can easily view and edit some attributes in an [[Object window]]  or the [[Attribute panel]] below a Diagram. Other attributes you can see, but not edit directly -- such as, the Value, Inputs and Outputs of a Variable, which Analytica computes from the Definition.  &lt;br /&gt;
&lt;br /&gt;
Some attributes apply only to a particular object [[Class]] -- for example, Author and Creation date apply only to a Model or Module; Parameters and Recursive apply only to a Function. There are also many internal attributes that you don't usually see but may affect how the node looks -- such as, Nodeinfo, NodeSize, and Nodefont. &lt;br /&gt;
&lt;br /&gt;
In an Analytica expression you can access attributes using [[Attrib of Obj|«Attrib» OF «Obj»]] syntax. Inside [[OnClick]] and [[Onchange]] attributes, you can also modify Attributes from Analytica code.&lt;br /&gt;
&lt;br /&gt;
This page first describes common editable Attributes, then common non-modifiable Attributes, and finally the many obscure internal Attributes that users rarely need to know about.&lt;br /&gt;
&lt;br /&gt;
== Common attributes ==&lt;br /&gt;
&lt;br /&gt;
These attributes apply to all classes of user-defined objects. You can edit them directly in [[Edit mode]] in the [[Object window]] and [[Attribute panel]]:&lt;br /&gt;
&lt;br /&gt;
===Editable Attributes of all Objects===&lt;br /&gt;
&lt;br /&gt;
====Class====&lt;br /&gt;
The [[Classes of variables and other objects|class]] of the object, such as Variable, Index, Function, or Module. You may change the Class of an object only to a compatible class: You can change the class of a Variable among these subclasses Chance, Constant, Determ, Decision, Index, Objective, Variable. You may change a [[Modules and Libraries|Module]] among these subclasses Library, FiledLibrary, Model, Module, FiledModule, or Form. You can change a [[Text nodes|Text]] node to a [[Frame node|Frame]] node or back. You can't change the class of a Function, Button, or system object.  In the [[Object window]] or [[Attribute panel]], in Edit mode, the Class appears as a pulldown menu that lets you change it to another compatible Class.&lt;br /&gt;
&lt;br /&gt;
====Identifier====&lt;br /&gt;
The unique name of the object. An identifier must start with a letter, and contain only letters, digits, or underscore, up to 40 characters. Identifiers are insensitive to case -- but Analytica retains and shows the case originally provided (or adapted from the Object's title). So you can use CamelCase to clarify words in the identifier.&lt;br /&gt;
&lt;br /&gt;
====Title==== &lt;br /&gt;
A word or brief phrase identifying the the object. It usually appears in the diagram node, and in many other places in the user interface. It's best to limit a Title to about 50 characters. By default, it creates an identifier from the first 20 characters of the title, substituting &amp;quot;_&amp;quot; for blank or any character that isn't a letter or digit.&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
Text that describes or documents the object. For a variable, it should describe what the quantity represents. For a function, it should describe what value it returns and what parameters it expects. If the definition is not obvious, it should also explain briefly what definition is doing. It should also mention any exceptions, such as what it does if an input or parameter is outside the expected domain.&lt;br /&gt;
&lt;br /&gt;
===Editable attributes of Variables and Functions===&lt;br /&gt;
&lt;br /&gt;
====Units====&lt;br /&gt;
The units of measurement of a variable, or value returned by a function -- such as &amp;quot;$/year&amp;quot; or &amp;quot;km/hr&amp;quot;. It's best to use abbreviations to keep units within about 10 characters.&lt;br /&gt;
&lt;br /&gt;
====Definition====&lt;br /&gt;
The expression used to compute the value of a variable or function.&lt;br /&gt;
&lt;br /&gt;
====[[Check Attribute|Check]]==== &lt;br /&gt;
An expression used to test that the computed result value is valid.  If it returns false, it gives a warning. This is helpful to detect errors in user input or complex calculations.  See [[Check Attribute]].&lt;br /&gt;
&lt;br /&gt;
===Non-editable attributes of variables and functions===&lt;br /&gt;
&lt;br /&gt;
These attributes are of variables and functions are visible, but not editable, in the Object window and Attribute panel:&lt;br /&gt;
&lt;br /&gt;
====Inputs====&lt;br /&gt;
A list of variables and functions used in the definition, after definition has been parsed. Before parsing, it may contain variables and functions from which arrows were drawn.&lt;br /&gt;
&lt;br /&gt;
====Outputs====&lt;br /&gt;
A list of variables and functions that use this object in their definitions.&lt;br /&gt;
&lt;br /&gt;
====Value====&lt;br /&gt;
The computed (mid-)value of the variable (not available for functions). You may displayed  the Value in an Object window, but it is not displayed by default. &lt;br /&gt;
&lt;br /&gt;
Accessing the attribute's value from an expression (using e.g., &amp;lt;code&amp;gt;Value of X&amp;lt;/code&amp;gt; doesn't trigger a calculation, and will return a special value of &amp;lt;code&amp;gt;Undefined&amp;lt;/code&amp;gt; if it isn't yet computed. However, we recommend using &amp;lt;code&amp;gt;[[Mid]]([[IsResultComputed]](X))&amp;lt;/code&amp;gt; to detect whether the mid-value is computed yet or not (or &amp;lt;code&amp;gt;[[Sample]]([[IsResultComputed]](X))&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
====EvaluationTime==== &lt;br /&gt;
The number of CPU seconds that have been spent evaluating or obtaining the value of the variable, or computing the result of the [[User Defined Functions|function]], since the object was created or loaded, or since the [[ResetEvalTimes]] command was last executed.  This timing does not include the time spent evaluating parent values.&lt;br /&gt;
&lt;br /&gt;
====EvaluationTimeAll====  &lt;br /&gt;
The number of CPU seconds spent in evaluation of the object, including time spent evaluating or obtaining the values of other variables that it depends on.  This is the cumulative time since the object was first created or loaded, or since the [[ResetEvalTimes]] command was last executed.&lt;br /&gt;
&lt;br /&gt;
===Editable attributes of Functions===&lt;br /&gt;
&lt;br /&gt;
====Parameters==== &lt;br /&gt;
A list of the function [[parameters]], enclosed in parentheses. It may include [[parameter qualifiers|qualifiers]] that specify what data type or dimension are expected for each parameter, or whether a parameter is optional or may be repeated. It is good practice to also list the main (non-optional) parameters (without qualifiers) in the title, so users can easily see what parameters it expects from seeing the function node in a diagram.&lt;br /&gt;
&lt;br /&gt;
====Recursive==== &lt;br /&gt;
A boolean, with value 0 (default) or 1, specifies whether the function is recursive -- i.e., it may call itself in its definition, or call another function that calls it (mutually recursive). By default, it is not displayed. You need to set it to be displayed in the [[Attributes dialog]].&lt;br /&gt;
&lt;br /&gt;
===Editable Attributes of Modules===&lt;br /&gt;
&lt;br /&gt;
====Author==== &lt;br /&gt;
The name(s) of the person or people who created this module. When you start a new model, it may automatically fill this in with the name of the owner of the computer, if registered with Windows.&lt;br /&gt;
&lt;br /&gt;
====[[TemplateInput]]==== &lt;br /&gt;
Identifies a single variable within the module that functions at the module's primary input. Drawing an arrow into this module node inserts the origin of the arrow as the definition of this variable. &lt;br /&gt;
&lt;br /&gt;
====[[TemplateOutput]]==== &lt;br /&gt;
Identifies a single variable within the module that serves as the module's primary output.  Drawing an arrow from this module node treats this variable as the origin of the arrow  -- for example, for use as an input to another object. &lt;br /&gt;
&lt;br /&gt;
===Non-editable attributes of modules===&lt;br /&gt;
&lt;br /&gt;
The Module [[class]] includes subclasses Model, Module, Filed Module, Library, Filed Library, and Form. These are attributes of modules that you can see but not edit in the [[Object window]] and [[Attribute panel]]:&lt;br /&gt;
&lt;br /&gt;
====Date (Created)==== &lt;br /&gt;
The time and date on which the module was first created.&lt;br /&gt;
&lt;br /&gt;
====Savedate (Last Saved)==== &lt;br /&gt;
The time and date on which this model or separately filed module or library was last saved. &lt;br /&gt;
&lt;br /&gt;
====FileInfo (File info)==== &lt;br /&gt;
The directory path and name of the file from which this model was read from or to which it was last saved.&lt;br /&gt;
&lt;br /&gt;
==Hidden attributes==&lt;br /&gt;
&lt;br /&gt;
There are quite a few hidden attributes that you can't usually see in the standard user interface, and almost never need to think about. If needed you can see them in the [[Typescript]] Window.  Type &amp;quot;Profile &amp;lt;identifier&amp;gt;&amp;quot; into the Typescript to see all the attributes of an object. &lt;br /&gt;
&lt;br /&gt;
=== Hidden attributes of Variables and Functions===&lt;br /&gt;
&lt;br /&gt;
====[[NumberFormat]]==== &lt;br /&gt;
The number format parameters specified in the [[Number Format Dialog]] for numbers generated in a variable or function. If absent, it uses the default Number Format.&lt;br /&gt;
:&amp;lt;code&amp;gt;v, format, proxy, zeroes, separators, currency, digits, trailingZeros, currencysymbol, currencyPlacement, datetemplate, fullPrecision, fullDateTemplate, relReqForFullDateTemplate, datesAsNumbers, numbersAsDates, digitsForGeneralFmt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[[ProbabilityNumberFmt]]==== &lt;br /&gt;
In a Probability Bands result view, a Cumulative Probability result view, or a Probability mass view for a discrete-valued quantity, probabilities display in addition to values for the underlying variable. For the columns or axes containing probabilities, this attribute holds the number format, which is often different from the underlying variable's number format.&lt;br /&gt;
:&amp;lt;code&amp;gt;v, format, proxy, zeroes, separators, currency, digits, trailingZeros, currencysymbol, currencyPlacement, datetemplate, fullPrecision, fullDateTemplate, relReqForFullDateTemplate, datesAsNumbers, numbersAsDates, digitsForGeneralFmt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[[DensityNumberFormat]]====&lt;br /&gt;
In a Probability Density Result view for a continuous variable, probability density values appear in addition to values for the underlying variable's quantity. This attribute stores the number format used for columns or axes that display probability densities.&lt;br /&gt;
:&amp;lt;code&amp;gt;v, format, proxy, zeroes, separators, currency, digits, trailingZeros, currencysymbol, currencyPlacement, datetemplate, fullPrecision, fullDateTemplate, relReqForFullDateTemplate, datesAsNumbers, numbersAsDates, digitsForGeneralFmt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====FixedDef====&lt;br /&gt;
The parse-tree (DCODE) from the Definition. It displays as the code, usually with extra parens. &lt;br /&gt;
&lt;br /&gt;
====DisplayInputs====&lt;br /&gt;
A list of objects among inputs from which arrows are to be displayed. It does not display arrows from Inputs that are not in Displayinputs.&lt;br /&gt;
&lt;br /&gt;
====IsIn====&lt;br /&gt;
A handle to the module that contains this object. (Null for the top model.)&lt;br /&gt;
&lt;br /&gt;
====[[Aliases]]====&lt;br /&gt;
A list of handles to any user inputs or user outputs ([FormNode]]) or [[Alias nodes]] for this object. Any object type can have aliases, including Variables, Functions, Modules, and Buttons.&lt;br /&gt;
&lt;br /&gt;
====[[Original]]====&lt;br /&gt;
The original node of a user input or user output ([[FormNode]]) or [[Alias nodes|Alias node]].  [[Aliases]] attribute contains all the nodes listing it as its Original.&lt;br /&gt;
&lt;br /&gt;
===Hidden attributes of Modules===&lt;br /&gt;
&lt;br /&gt;
====Contains====&lt;br /&gt;
The list of objects contained in this module.&lt;br /&gt;
&lt;br /&gt;
====DefaultSize====&lt;br /&gt;
The default node size for new nodes in this module.  It uses the same format as Nodesize. If empty, it inherits the default size from its  parent module. For a Model, it uses the default size from the Analytica initialization.&lt;br /&gt;
&lt;br /&gt;
==Node attributes==&lt;br /&gt;
&lt;br /&gt;
These attributes apply to the visual node that represents an object in its parent influence diagram.  They control the location, size, and appearance of each node.  You can modify some in the [[Diagram window|Diagram view]] (NodeLocation, NodeSize), some in the  [[Node Style dialog]] (NodeFont, NodeInfo), or using the [[Color palette|Color palette dialog]], (NodeColor and NodeFontColor). :&lt;br /&gt;
&lt;br /&gt;
====Nodelocation==== &lt;br /&gt;
The location of the node center in its parent diagram, as x,y,z, where x and y are number of pixels rightwards and downwards from the top-left corner of the diagram.  You can, of course, modify node location by dragging nodes in their diagram. Nodes are displayed in order of z value, which therefore controls which nodes are displayed in front of other nodes. You can send a node back or to the front  by selecting the node and using the [[Right mouse button menus|Right mouse button menus.]]&lt;br /&gt;
&lt;br /&gt;
====Nodesize==== &lt;br /&gt;
The size of the node, as x,y, where x and y are the half width and half height in pixels, i.e. the distance from the node center to each edge. You can change the size of each node in its Diagram dragging the corner boxes around a selected node. You can define the default node sizes in the [[Diagram Style dialog]].&lt;br /&gt;
&lt;br /&gt;
====Nodecolor==== &lt;br /&gt;
The color for this node, as r,g,b, where each color is in the range 0 to 65535. If empty, it uses the default color for this object class. You can modify colors by directly by selecting the node in the diagram, and using the [[Color palette]]. For arrow objects, the arrow color is determined by this attribute; if empty, it uses the Arrow class default. Dynamic dependency arrows use a separate color (the dynamic arrow color attribute) instead.&lt;br /&gt;
&lt;br /&gt;
====NodeFontColor==== &lt;br /&gt;
Controls the font color of a node in a diagram.  You can modify it from the  [[Color palette#Change the text color of nodes|Color palette]]. The attribute is in RGB format, r,g,b, where each color is in the range 0 to 65535. If empty, it inherits the font color from the diagram's default font color (DiagFontColor). If the diagram has no default, it uses the class default.&lt;br /&gt;
&lt;br /&gt;
====NodeBorderColor====&lt;br /&gt;
The border color of a node. The attribute is in RGB format, r,g,b, where each color is in the range 0 to 65535. If empty, it uses the default border color for this object class. For modules, the border color walks up the ancestor module hierarchy until an explicit border color is found.&lt;br /&gt;
&lt;br /&gt;
You can see the effects of Nodefont and Nodeinfo in the parent diagram. You can modify them for each node with the [[Node Style dialog]] or set defaults for a model or module with the [[Diagram Style dialog]].&lt;br /&gt;
&lt;br /&gt;
====NodeInfo ====&lt;br /&gt;
{{Assista||Subattributes of NodeInfo -- you can also read or set the subattributes such as &amp;lt;code&amp;gt;NodeInfo::fill of obj&amp;lt;/code&amp;gt;, etc.}}&lt;br /&gt;
&lt;br /&gt;
This affects how the node appears.  It has quite a number of fields, all Boolean -- 0 or 1 -- except ''widthOfCtrl''. [[NodeInfo|More on NodeInfo...]]&lt;br /&gt;
&lt;br /&gt;
Individual sub-fields of NodeInfo (such as show inputs, show outputs, show label, show border, fill node, show icon) inherit from the class default when not explicitly set on the node. Label justification (a sub-field not shown above) defaults to center for most classes, and left-aligned for [[Text]] nodes.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;1,inputArrows, outputArrows, label, border, fill, useCustomFont, widthOfCtrl,  bevel, showFormIcon, embedded, hidden&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: ''inputArrows'': set to 1 to show all input influence arrows or 0 to suppress them&lt;br /&gt;
:: ''outputArrows'': set to 1 to show all output influence arrows or 0 to suppress them&lt;br /&gt;
:: ''label'': set to 1 to show the title (or identifier) in the node, or 0 not to.&lt;br /&gt;
:: ''border'': set to 1 to show the thin border around the node, or 0 not to.&lt;br /&gt;
:: ''fill'': set to 1 to fill the node with selected color, or 0 not to.&lt;br /&gt;
:: ''label'': set to 1 to show the title (or identifier) in the node, or 0 not to.&lt;br /&gt;
:: ''useCustomFont'': set to 1 to use the custom font set in NodeFont, or 0 not to.&lt;br /&gt;
:: ''widthOfCtrl'': For a user input or output node, this specifies the width of the field (for a text or choice menu) or the button for other types.&lt;br /&gt;
:: ''bevel'': set to 1 to show a bevel to make the node appear outdented -- default for button nodes -- or 0 not to.&lt;br /&gt;
:: ''ShowFormIcon'': controls whether the little result mode icon (e.g., &amp;quot;Mid&amp;quot;) displays to the right of the result button or not.&lt;br /&gt;
:: ''Embedded'': is reserved for a future release, where it will specify that the edit table, result view, or module is shown directly on the diagram within the node's rectangular area.&lt;br /&gt;
::''visibility'': The visible / hidden / disabled state of the node, usually set using the [[ChangeNodeVisibility]] function. Possible values:&lt;br /&gt;
::: 0 = visible (default when unset)&lt;br /&gt;
::: 1 = hidden&lt;br /&gt;
::: 2 = very hidden&lt;br /&gt;
::: 3 = Extremely hidden&lt;br /&gt;
::: 4 = Hidden in browse mode&lt;br /&gt;
::: 5 = Disabled&lt;br /&gt;
::: 6 = Disabled in browse mode&lt;br /&gt;
&lt;br /&gt;
====Nodefont==== &lt;br /&gt;
The node font family and size in points, e.g. Bodoni, 16. If empty, it inherits the font from the parent diagram module, walking up the module hierarchy until a module with an explicit font is found. If no ancestor sets a font, it uses the default project font (typically Arial).&lt;br /&gt;
&lt;br /&gt;
====Att_hyperlinkPref==== &lt;br /&gt;
When an index or result table contains a [[handle]] to an object, it shows title of the object as a blue clickable link. When you click a handle link, it shows the object. The number assigned to this attribute controls how it shows the object when you click :&lt;br /&gt;
# Open its Object window&lt;br /&gt;
# Open its parent diagram with the node selected&lt;br /&gt;
# If it's a Module, open its Diagram with nothing selected. Otherwise, Open parent Diagram with the node selected.&lt;br /&gt;
The attribute is inherited: If you set this attribute for a Model, it sets the default for all results.  If you set it on a module, it sets the default for results inside that module.  If you set it for a particular variable, it applies only to that variable.&lt;br /&gt;
&lt;br /&gt;
====DiagramColor====&lt;br /&gt;
The background color of a diagram, as r,g,b, where each color is in the range 0 to 65535. This attribute is set on a Module. Unlike most node appearance attributes, the diagram background color does '''not''' inherit from parent modules; if not set, it defaults to white.&lt;br /&gt;
&lt;br /&gt;
====Pict==== &lt;br /&gt;
An image shown in the node. You can paste an image into a node, or assign an image in standard formats (.png, jpeg, tiff) to the Pict attribute of a node.&lt;br /&gt;
&lt;br /&gt;
==Window status attributes==&lt;br /&gt;
&lt;br /&gt;
These attributes store the location and size of windows, including the Diagram, Object, and Result window, as applicable to each class of object.&lt;br /&gt;
&lt;br /&gt;
====DiagState====&lt;br /&gt;
The location and size of the diagram window, where ''x'', ''y'' are location of top left corner, ''w'' and ''h'' are width and height in pixels.  ''b'' is a bit field that stores the diagram style options.  ''t'' is the style for tabs when a tabbed diagram style is selected.  &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;v, x, y, w, h, b, tabs, buttonStyle, customIcon, titleOnly, crumbs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:''v'' is a version number. Should be 2.&lt;br /&gt;
&lt;br /&gt;
:''x'', ''y'' in the coordinate of the top-left corner of the window frame when the window is not maximized, relative to the top-left corner of the ''desk area'' (the gray background area that starts under the toolbar). &lt;br /&gt;
&lt;br /&gt;
:''w, h'' are the width and height of the client area of the window when the window is not maximized. This client are is the area of the window not including the edges around the window, the window title bar, or the attribute panel, but it does include the diagram scroll bars (which have a width and height of 16). In [[Analytica 4.6]] and earlier, the height is from the bottom edge of the title bar to the bottom of the diagram's horizontal scroll bar, and hence, includes the height of the module hierarchy stripe within the total height. In [[Analytica 5.0]], the height starts at the lower edge of the hierarchy stripe -- so it does not include the hierarchy stripe.&lt;br /&gt;
&lt;br /&gt;
:''b'' is a bit field, which is the sum of the following values:&lt;br /&gt;
:* 1 = Show arrows to/from modules&lt;br /&gt;
:* 2 = Show arrows to/from indexes&lt;br /&gt;
:* 4 = Show arrows to/from functions&lt;br /&gt;
:* 8 = Turn off background (i.e., the diagram background will appear white)&lt;br /&gt;
:* 16 = Show dynamic dependency arrows &lt;br /&gt;
:* 32 = Show arrows for dependencies in the Check attribute&lt;br /&gt;
&lt;br /&gt;
:''tabs'' is reserved for a future enhancement (not currently exposed)  It encodes whether the diagram is a tabbed diagram, which side the tabs display on, and which style of tabs are used.  Possible values are:&lt;br /&gt;
:* 0 = (default) Not tabbed&lt;br /&gt;
:* 1 = Tabs on top&lt;br /&gt;
:* 2 = Tabs on bottom&lt;br /&gt;
:* 3 = Tabs on left (vertical text)&lt;br /&gt;
:* 4 = Tabs on right (vertical text)&lt;br /&gt;
:* 5 = Wide tabs on left (horizontal text)&lt;br /&gt;
:* 6 = Wide tabs on right (horizontal text)&lt;br /&gt;
:* 7 = Tabs hidden (e.g. overlays, controlled via button scripts)&lt;br /&gt;
&lt;br /&gt;
:''buttonStyle'' controls how the buttons in input and output nodes display (such as ''Calc'', ''Edit Table'', etc).&lt;br /&gt;
:* 0 = Normal text (default in [[Analytica 5.0]])&lt;br /&gt;
:* 1 = Bolded text (pre-5.0 standard)&lt;br /&gt;
:* 2 = Blank (no label or icon in button)&lt;br /&gt;
:* 3 = Icon&lt;br /&gt;
:* 4 = Bare Icon&lt;br /&gt;
::''buttonStyle'' was introduced in [[Analytica 5.0]]&lt;br /&gt;
::The ''buttonStyle'' inherits from the parent module's diagram. If no ancestor module sets it, it defaults to normal text style (0).&lt;br /&gt;
&lt;br /&gt;
:''customIcon'' If set to 1, uses the pict of the module or model as the icon for the titlebar.&lt;br /&gt;
&lt;br /&gt;
:''titleOnly'' If set to 1, uses the diagram object's title as the titlebar's title without the prefix &amp;quot;Diagram - &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:''crumbs'' If 0, hides the hierarchy bar from this diagram window only (child diagrams unaffected), &lt;br /&gt;
&lt;br /&gt;
::''customIcon'', ''titleOnly'', and ''crumbs'' were introduced in [[Analytica 6.4]].&lt;br /&gt;
&lt;br /&gt;
{{Assista||You can read or set the SubAttributes of DiagState using e.g., &amp;lt;code&amp;gt;DiagState::w of obj&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
====WindState==== &lt;br /&gt;
The location and size of the object window, where X, Y are location of top left corner, W and H are width and height in pixels. v is version number, usually 1. (Applies to all user-defined objects.)&lt;br /&gt;
:&amp;lt;code&amp;gt;v, X, Y, W, H&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Assista||In an expression, you can use a subattribute such as &amp;lt;code&amp;gt;WindState::W of obj&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====ValueState==== &lt;br /&gt;
{{Assista|key|SubAttributes of ValueState}}&lt;br /&gt;
&amp;lt;code&amp;gt;v, X, Y, W, H, Graph, U&amp;lt;/code&amp;gt;&lt;br /&gt;
The type, location and size of the result window for a variable, where  X, Y are location of top left corner of the window, W and H are width and height in pixels of the area exclusing the title bar and edges (the actual window size is X+15, Y+38), Graph is 1 if a graph view, 0 if a table view, and U is text defining the uncertainty view. v is version number, usually 1. (Applies only to variables.)&lt;br /&gt;
&lt;br /&gt;
====DefnState==== &lt;br /&gt;
The location and size of an edit table window.&lt;br /&gt;
{{Assista|key|SubAttributes of DefnState}}&lt;br /&gt;
:&amp;lt;code&amp;gt;v, x, y, w, h&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====OutlinerState==== &lt;br /&gt;
The location and size of the outliner window.  This is stored as an attribute of the keyword object named &amp;lt;code&amp;gt;All&amp;lt;/code&amp;gt; and is not saved with the model. &lt;br /&gt;
{{Assista|key|SubAttributes of OutlinerState}}&lt;br /&gt;
:&amp;lt;code&amp;gt;v, x, y, w, h&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Reformval==== &lt;br /&gt;
Lists the indexes for a multidimensional variable, in sequence defining which index is for rows (x axis), which for columns (key), and the remaining as slicers, from bottom to top. &lt;br /&gt;
&lt;br /&gt;
====Att_usebyprevindex==== &lt;br /&gt;
???&lt;br /&gt;
&lt;br /&gt;
== Internal Engine Attributes==&lt;br /&gt;
&lt;br /&gt;
=== Att_versionRange ===&lt;br /&gt;
=== Att_canBeIn ===&lt;br /&gt;
&lt;br /&gt;
=== Att_dirties ===&lt;br /&gt;
Used on a system variable to flag whether a change to the sys var causes the model to &amp;quot;dirty&amp;quot; (i.e., require a save).&lt;br /&gt;
&lt;br /&gt;
Starting with [[Analytica 6.6]], you can also set this to 0 on your own Variables to signal that a change to the Definition does not dirty the module or library containing the variable. This can be useful when your library (which might be linked) updates a user input or internal state, but that is specific to the model, not the library, so you don't want this to trigger a save of the library.&lt;br /&gt;
&lt;br /&gt;
=== Att_showable ===&lt;br /&gt;
=== Att_saveAlways ===&lt;br /&gt;
=== Att_recordSysFunDependencies ===&lt;br /&gt;
=== Att_Saveable ===&lt;br /&gt;
=== Att_attributeType ===&lt;br /&gt;
=== Att_readOnly ===&lt;br /&gt;
=== Att_domainKids, Att_domainParents ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== User Interface State Attributes ==&lt;br /&gt;
&lt;br /&gt;
'''Att_resultSliceState''': &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Att_editSliceState'''&lt;br /&gt;
&lt;br /&gt;
== Graphing Attributes ==&lt;br /&gt;
&lt;br /&gt;
=== xyExpr ===&lt;br /&gt;
&lt;br /&gt;
Contains one external/exogenous value expression.  Recognized by Analytica 3.1 and earlier, where the expression for the X value in an XY graph was stored.  &lt;br /&gt;
&lt;br /&gt;
=== Att_exogenousValue ===&lt;br /&gt;
&lt;br /&gt;
Holds a list of external values for a result window, which can then be used as graphing dimensions.  Analytica 4.0 allows more than one external value to be brought in for plotting against the primary result of a variable.  This attribute holds a list of expressions -- most commonly, each expression consists of a single variable identifier.&lt;br /&gt;
&lt;br /&gt;
The xyExpr may also contain one addition external expression.  (The reason it is split across two attributes is for greater 3.1 interoperability).&lt;br /&gt;
&lt;br /&gt;
=== Att_GraphIndexRange ===&lt;br /&gt;
Stores the axis settings for an index. When you have set it globally (via the '''Set Default''' button in the [[Graph setup dialog]]), the attribute setting is set on the index node itself. More commonly, it is set from within a [[GraphSetup]] attribute so that it applies to that index only in the context of the graph.&lt;br /&gt;
&lt;br /&gt;
{{Assista|key|SubAttributes of Att_GraphIndexRange}}&lt;br /&gt;
&lt;br /&gt;
:ver, cat,auto, includezero, log, reverse, incs, min, max, includeSubset, excludeSubset, hideLabels&lt;br /&gt;
where:&lt;br /&gt;
:version : Must be 1 (version)&lt;br /&gt;
:categorical : Categorical flag (1=force categorical interp), opt.&lt;br /&gt;
:auto : Full autoscale flag &lt;br /&gt;
:includezero : force 0 to be in range flag &lt;br /&gt;
:log : log scaling flag&lt;br /&gt;
:reverse : reverse order flag&lt;br /&gt;
:incs : Number of increments&lt;br /&gt;
:min : minimum value for manually scaled axis&lt;br /&gt;
:max : maximum value for manually scaled axis&lt;br /&gt;
:includeSubset : [2,7,8,12]  -- include these items (by position) when using manual scaling.  Brackets included&lt;br /&gt;
:excludeSubset : [3,6,13,17] -- exclude these items when using manual scaling.&lt;br /&gt;
:hideLabels: 1=hide labels for this axis&lt;br /&gt;
&lt;br /&gt;
=== Att_GraphValueRange ===&lt;br /&gt;
&lt;br /&gt;
This attribute is usually contained within the [[GraphSetup]] attribute (except when '''Set Default''' was pressed after configuring the range).&lt;br /&gt;
&lt;br /&gt;
The range for each value is encoded as&lt;br /&gt;
&lt;br /&gt;
{{Assista|key|SubAttributes of Att_GraphValueRange}}&lt;br /&gt;
:ver, cat,auto, includezero, log, reverse, incs, min, max, includeSubset, excludeSubset, hideLabels&lt;br /&gt;
where:&lt;br /&gt;
:version : Must be 1 (version)&lt;br /&gt;
:categorical : Categorical flag (1=force categorical interp), opt.&lt;br /&gt;
:auto : Full autoscale flag &lt;br /&gt;
:includezero : force 0 to be in range flag &lt;br /&gt;
:log : log scaling flag&lt;br /&gt;
:reverse : reverse order flag&lt;br /&gt;
:incs : Number of increments&lt;br /&gt;
:min : minimum value for manually scaled axis&lt;br /&gt;
:max : maximum value for manually scaled axis&lt;br /&gt;
:includeSubset : [2,7,8,12]  -- include these items (by position) when using manual scaling.  Brackets included&lt;br /&gt;
:excludeSubset : [3,6,13,17] -- exclude these items when using manual scaling.&lt;br /&gt;
:hideLabels: 1=hide labels for this axis&lt;br /&gt;
&lt;br /&gt;
For a given variable identifier, there can be a different range for each slice along a comparison index. These are encoded by joining the different range settings using a pipe separator (&amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;) and prefixing each slice range with the slice number and colon. For example:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;1,,1,,0,,20|1:1,,0,,1,,,0.01,0.56,0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first range (&amp;lt;code&amp;gt;1,,1,,0,,20&amp;lt;/code&amp;gt; is for the variable's main value, the second one is prefixed by &amp;quot;1:&amp;quot; and applies to the first comparison slice. In a continuous CDF, PDF or Exceedance plot, this would be the 'X' value (e.g., the probability or density axis), but the 'Y' value is encoded instead on the &amp;lt;code&amp;gt;Graph_*_Valdim&amp;lt;/code&amp;gt; system variable.&lt;br /&gt;
&lt;br /&gt;
For common statistical axis, the attribute is set on special system variables with names having the form &amp;lt;code&amp;gt;Graph_*_Valdim&amp;lt;/code&amp;gt;, such as &amp;lt;code&amp;gt;Graph_Pdf_Valdim&amp;lt;/code&amp;gt;. This encodes the range setting for the PDF's density axis.&lt;br /&gt;
&lt;br /&gt;
=== Att_continuousLineStyle ===&lt;br /&gt;
=== Att_categoricaLineStyle ===&lt;br /&gt;
=== Att_stackedBar ===&lt;br /&gt;
=== Att_stackedLine ===&lt;br /&gt;
=== Att_barOverlap ===&lt;br /&gt;
&lt;br /&gt;
=== Graphing Role Attributes ===&lt;br /&gt;
&lt;br /&gt;
These attributes are: '''Att_xRole''', '''Att_yRole''', '''Att_colorRole''', '''Att_symbolRole''', '''Att_symbolSizeRole''', '''Att_originRole'''.&lt;br /&gt;
&lt;br /&gt;
They define the graphing pivot in coordination with the '''reformVal''' attribute.  The settings in these attributes are combined with the current chart type, dimensions present in the current value (or values), etc., and Analytica may adjust the pivot actually shown to create a consistent set of roles.  Since the dimensionality of results can change in Analytica (as upstream dimensions or added or removed, the view type can be changed, or the number of elements in a dimension may change), the exact pivot used the previous time the graph was displayed may no longer be sensible.  However, when possible, the roles defined in these attributes do become the roles used in the graph.&lt;br /&gt;
&lt;br /&gt;
Each of these role attributes can hold values in several possible forms:&lt;br /&gt;
* '''Self''': The keyword Self indicates that the main result fills the role.&lt;br /&gt;
* '''barOrigin''': The attribute name barOrigin indicates that the expression found in the legacy barOrigin attribute fills the role.&lt;br /&gt;
* '''xyExpr''': The attribute name indicates that the expression found in the xyExpr attribute fills the role.&lt;br /&gt;
* ''identifier'' : The identifier indicates that the index having this identifier fills the role.&lt;br /&gt;
* '''Sys_LocalIndex(&amp;quot;''name''&amp;quot;)''': Syntax indicating that the local index having the indicated name is used.&lt;br /&gt;
* '''Sys_CoordIndex(''value'')''' : The slice of the main result corresponding to ''[CoordIndex=value]'' is used, where ''value'' is an element of the coordinate index.&lt;br /&gt;
* 0 : The numeric value zero indicates that the main result is used (same as Self).&lt;br /&gt;
* n &amp;gt; 0:  A positive integer value indicates that an external value is used.  Several exogenous values may be attached to the result view (see '''Att_exogenousValues''' and '''xyExpr''' attributes).  These are numbered, with the xyExpr always being n=1 if present, and then the remaining continuing in order through those listed in Att_exogenousValues, and finally the legacy barOrigin attribute expression coming last.&lt;br /&gt;
* n &amp;lt; 0: A negative integer value identifies a coordinate index slice by position.  The role uses the slice of the main result corresponding to ''[@CoordIndex=abs(n)]''.&lt;br /&gt;
&lt;br /&gt;
Also '''barOrigin'''.&lt;br /&gt;
&lt;br /&gt;
== Table attributes ==&lt;br /&gt;
&lt;br /&gt;
* [[TableCellDefault]]: The default value (or Checkbox or Choice expression) used in a new cell of an Edit table when you add or extend an index of that table.&lt;br /&gt;
&lt;br /&gt;
* [[CorrespondenceMethod]]&lt;br /&gt;
&lt;br /&gt;
==Other attributes==&lt;br /&gt;
; Att_BrowseOnly&lt;br /&gt;
; Att__cloakDefn&lt;br /&gt;
; Att_Dirty&lt;br /&gt;
; Att_Obfuscated&lt;br /&gt;
; Att_recordSet : See [[DbQuery]] for examples of use&lt;br /&gt;
; Att_ResultSliceState&lt;br /&gt;
; Att_rlm_license&lt;br /&gt;
; Att_rlm_licenseobj&lt;br /&gt;
; Att_Showable&lt;br /&gt;
; Att_whenDisallowed&lt;br /&gt;
; [[Att_PreLoadScript]]&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
&amp;lt;div style=&amp;quot;column-count:2;-moz-column-count:2;-webkit-column-count:2&amp;quot;&amp;gt;&lt;br /&gt;
* [[Manage attributes]]&lt;br /&gt;
* [[Attrib of Obj]]&lt;br /&gt;
* [[Objects and Values]]&lt;br /&gt;
* [[Objects_and_Their_Attributes_-_Part_1_of_3|Objects and Their Attributes]]&lt;br /&gt;
* [[Objects_and_Their_Attributes_-_Part_2_of_3#User-Specified_Attributes|User-Defined Attributes]]&lt;br /&gt;
* [[To edit an attribute]]&lt;br /&gt;
* [[Attribute panel]]&lt;br /&gt;
* [[:Category: Attributes]]&lt;br /&gt;
* [[Domain attribute]]&lt;br /&gt;
* [[Class]]&lt;br /&gt;
* [[Identifier]]&lt;br /&gt;
* [[Optimizer Attributes]]&lt;br /&gt;
* [[Attributes of a function]]&lt;br /&gt;
* [[Check attribute]]&lt;br /&gt;
* [[Classes of variables and other objects]]&lt;br /&gt;
* [[Definitions]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=ArrowClass&amp;diff=63835</id>
		<title>ArrowClass</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=ArrowClass&amp;diff=63835"/>
		<updated>2026-04-14T00:58:51Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ArrowClass is the [[Classes of variables and other objects|Class]] of Objects that represent influence arrows.  Only arrows that have nondefault properties such as [[Arrow bends, curves, and styles]] have explit Objects, needed to contain those properties as Attributes.  Users don't normally need to know about Arrow objects unless you want to write special functions to use or change Arrow properties. &lt;br /&gt;
&lt;br /&gt;
See also&lt;br /&gt;
* [[Objects]]&lt;br /&gt;
* [[Classes of variables and other objects]]&lt;br /&gt;
* [[Arrow bends, curves, and styles]]&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=ArrowClass&amp;diff=63834</id>
		<title>ArrowClass</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=ArrowClass&amp;diff=63834"/>
		<updated>2026-04-14T00:58:37Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ArrowClass is the [[Classes of variables and other objects|Class]] of Objects that represent influence arrows.  Only arrows that have nondefault properties such as [[Arrow bends, curves, and styles]] have explit Objects, needed to contain those properties as Attributes.  Users don't normally need to know about Arrow objects unless you want to write special functions to use or change Arrow properties. &lt;br /&gt;
&lt;br /&gt;
See also&lt;br /&gt;
* [[Objects]]&lt;br /&gt;
* [[Classes of variables and other objects]&lt;br /&gt;
* [[Arrow bends, curves, and styles]]&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=ArrowClass&amp;diff=63833</id>
		<title>ArrowClass</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=ArrowClass&amp;diff=63833"/>
		<updated>2026-04-14T00:55:47Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: Created page with &amp;quot;ArrowClass is the Class of Objects that represent influence arrows.  Only arrows that have nondefault properties like Thickness or Waypoints have Objects.  Users never nee...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ArrowClass is the [[Class]] of Objects that represent influence arrows.  Only arrows that have nondefault properties like Thickness or Waypoints have Objects.  Users never need to bother about Arrow objects except if they want to write special functions that use or change Arrow properties. &lt;br /&gt;
&lt;br /&gt;
See also&lt;br /&gt;
* [[Objects]]&lt;br /&gt;
* [[Classes]&lt;br /&gt;
*&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=Mutables_library&amp;diff=63829</id>
		<title>Mutables library</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=Mutables_library&amp;diff=63829"/>
		<updated>2026-04-07T17:03:02Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: /* Using mutables for debugging */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:Function libraries]]&lt;br /&gt;
&lt;br /&gt;
A ''mutable'' is a memory location that you can write to as a side-effect of a calculation and can later read from. It can hold any Analytica data structure. There is no dependency maintenance, unlike normal Analytica flow architecture, so values you read from it don't invalidate if the mutable later changes. Mutables can be especially useful for debugging, especially with complex data structures.&lt;br /&gt;
&lt;br /&gt;
'''Download:''' [[media:Mutables library.ana|Mutables library.ana]].&lt;br /&gt;
&lt;br /&gt;
==Using mutables for debugging==&lt;br /&gt;
&lt;br /&gt;
Mutables can be especially useful for debugging when the data structures are too complex to use [[ConsolePrint]] effectively, or contain [[In-memory binary data terms|binary data]], etc.. The code you are debugging can save intermediate values in mutables, and then you can examine these later after the entire calc finishes to figure out what was going on. &lt;br /&gt;
&lt;br /&gt;
Use in this way, you will usually create a Variable node to hold the mutable:&lt;br /&gt;
::&amp;lt;code&amp;gt;Variable debug_val ::= [[MutableNew]]( )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The code you are debugging calls&lt;br /&gt;
::&amp;lt;code&amp;gt;[[MutableSet]]( debug_val, some_intermediate_val );&amp;lt;/code&amp;gt;&lt;br /&gt;
to save the value for examination later.  Then later you view it using, say&lt;br /&gt;
::&amp;lt;code&amp;gt;Variable ViewDebugVal ::= [[MutableGet]](debug_val)&amp;lt;/code&amp;gt;&lt;br /&gt;
It is best to set the [[CachingMethod]] of &amp;lt;code&amp;gt;ViewDebugVal&amp;lt;/code&amp;gt; to '''Never Cache''', since there is no dependency maintenance. I.e., if you rerun your algorithm and then view this result, you'll see the first value if &amp;lt;code&amp;gt;ViewDebugVal&amp;lt;/code&amp;gt; caches. &lt;br /&gt;
You can also use &amp;lt;code&amp;gt;[[InvalidateResult]](ViewDebugVal)&amp;lt;/code&amp;gt; from a button OnClick.&lt;br /&gt;
&lt;br /&gt;
You can pass mutables to a function parameter, which is sometimes useful when you have subroutines that modify a data structure. &lt;br /&gt;
&lt;br /&gt;
Mutables can also be used from imperative code, but this use is strongly discouraged. There is seldom a good reason for using them in this way -- you just inherit all the disadvantages of imperative code. Analytica explicitly prohibits side-effects of expression evaluation, which promotes referential transparency. This library provides a mechanism to get around this, but its more legitimate uses are for debugging or in-memory logging use cases.&lt;br /&gt;
&lt;br /&gt;
If you have a calculation that has multiple results, instead of placing the secondary results in variables that have mutables, it's better to get the secondary result variables with the [[ComputedBy]] function or with [[MultiResult]].&lt;br /&gt;
&lt;br /&gt;
== Function Reference ==&lt;br /&gt;
=== &amp;lt;span id=&amp;quot;MutableNew&amp;quot;&amp;gt;MutableNew( )&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Creates a new mutable -- a storage location that can be set using &lt;br /&gt;
:&amp;lt;code&amp;gt;[[MutableSet]]( mutable, x )&amp;lt;/code&amp;gt;&lt;br /&gt;
and read using&lt;br /&gt;
:&amp;lt;code&amp;gt;[[MutableGet]]( mutable )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Use case 1 (common for debugging)&lt;br /&gt;
:Create a new global variable to be your mutable. The name of the variable is the name of your mutable. Its definition is:&lt;br /&gt;
::&amp;lt;code&amp;gt;MutableNew()&amp;lt;/code&amp;gt;&lt;br /&gt;
;Use case 2 (Common when passing a mutable parameter to a UDF):&lt;br /&gt;
::&amp;lt;code&amp;gt;Local myMutableName := [[MutableNew]]();&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;F( myMutableName )&amp;lt;/code&amp;gt;&lt;br /&gt;
:where &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; is the called UDF. Inside F it uses [[MutableGet]] and [[MutableSet]].&lt;br /&gt;
&lt;br /&gt;
You can also have mutables within a data structure, and data structures with multiple separate mutables. The data structure itself doesn't change, just the values inside the mutable elements.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span id=&amp;quot;MutableSet&amp;quot;&amp;gt;MutableSet( mutable, x )&amp;lt;/span&amp;gt; ===&lt;br /&gt;
Stores the value «x» in the «mutable».&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span id=&amp;quot;MutableGet&amp;quot;&amp;gt;MutableGet( mutable )&amp;lt;/span&amp;gt; ===&lt;br /&gt;
Returns the current value stored in «mutable».&lt;br /&gt;
&lt;br /&gt;
==History==&lt;br /&gt;
The mutables library is included with [[Analytica 6.4]] and later. It requires [[Analytica 6.0]] or later.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
* [[ComputedBy]]&lt;br /&gt;
* [[Local Values]]&lt;br /&gt;
* [[Side effects]]&lt;br /&gt;
* [[Debugging Hints]]&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=IndexesOf&amp;diff=63828</id>
		<title>IndexesOf</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=IndexesOf&amp;diff=63828"/>
		<updated>2026-04-07T16:18:37Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: /* See Also */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Functions that create lists]]&lt;br /&gt;
[[Category:Functions returning information about arrays]]&lt;br /&gt;
[[Category:Meta-Inference Functions]]&lt;br /&gt;
&lt;br /&gt;
== IndexesOf(a'', except...'') ==&lt;br /&gt;
Returns a list of [[handle]]s to the indexes of array «a». It is different from [[IndexNames]](a), which returns the identifiers of the indexes as text values instead of handles.  &lt;br /&gt;
&lt;br /&gt;
If «X» has an [[implicit index]] (an index without a name), the first element of the output list is [[null]], rather than a handle.&lt;br /&gt;
&lt;br /&gt;
If the array has more than one [[Local Indexes|local index]] with the same identifier, you can use [[IndexesOf]](a) to identify each index safely because each handle unambiguously refers to the corresponding index, where [[IndexNames]](a) would return the identifiers as identical and therefore ambiguous text values.&lt;br /&gt;
&lt;br /&gt;
The optional «except» parameter excludes any of the indexes that are listed.&lt;br /&gt;
&lt;br /&gt;
[[Syntax]]: &lt;br /&gt;
:[[IndexesOf]](a: Array)&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
:&amp;lt;code&amp;gt;IndexesOf(Car_prices) &amp;amp;rarr; [Car_types, Year]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;IndexesOf(Car_prices, except: Car_types) &amp;amp;rarr; [Year]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Find the maximum in &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; over all indexes:&lt;br /&gt;
:&amp;lt;code&amp;gt;[[Max]]( A, ...[[IndexesOf]](A) )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sum over all indexes of &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; except &amp;lt;code&amp;gt;J&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt;:&lt;br /&gt;
:&amp;lt;code&amp;gt;[[Sum]]( x, ...[[IndexesOf]](x, except: J,K) )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
* The «except» parameter was introduced in [[Analytica 5.2]].&lt;br /&gt;
&lt;br /&gt;
== See Also == &lt;br /&gt;
* [[Handle]]&lt;br /&gt;
* [[Handle Functions]]&lt;br /&gt;
* [[IndexNames]]: The names of the indexes of a variable&lt;br /&gt;
* [[HasIndex]] Tests if a variable has a specified Index.&lt;br /&gt;
* [[Repeated parameter forwarding]]&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=IndexesOf&amp;diff=63827</id>
		<title>IndexesOf</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=IndexesOf&amp;diff=63827"/>
		<updated>2026-04-07T16:18:00Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: /* See Also */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Functions that create lists]]&lt;br /&gt;
[[Category:Functions returning information about arrays]]&lt;br /&gt;
[[Category:Meta-Inference Functions]]&lt;br /&gt;
&lt;br /&gt;
== IndexesOf(a'', except...'') ==&lt;br /&gt;
Returns a list of [[handle]]s to the indexes of array «a». It is different from [[IndexNames]](a), which returns the identifiers of the indexes as text values instead of handles.  &lt;br /&gt;
&lt;br /&gt;
If «X» has an [[implicit index]] (an index without a name), the first element of the output list is [[null]], rather than a handle.&lt;br /&gt;
&lt;br /&gt;
If the array has more than one [[Local Indexes|local index]] with the same identifier, you can use [[IndexesOf]](a) to identify each index safely because each handle unambiguously refers to the corresponding index, where [[IndexNames]](a) would return the identifiers as identical and therefore ambiguous text values.&lt;br /&gt;
&lt;br /&gt;
The optional «except» parameter excludes any of the indexes that are listed.&lt;br /&gt;
&lt;br /&gt;
[[Syntax]]: &lt;br /&gt;
:[[IndexesOf]](a: Array)&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
:&amp;lt;code&amp;gt;IndexesOf(Car_prices) &amp;amp;rarr; [Car_types, Year]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;IndexesOf(Car_prices, except: Car_types) &amp;amp;rarr; [Year]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Find the maximum in &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; over all indexes:&lt;br /&gt;
:&amp;lt;code&amp;gt;[[Max]]( A, ...[[IndexesOf]](A) )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sum over all indexes of &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; except &amp;lt;code&amp;gt;J&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt;:&lt;br /&gt;
:&amp;lt;code&amp;gt;[[Sum]]( x, ...[[IndexesOf]](x, except: J,K) )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
* The «except» parameter was introduced in [[Analytica 5.2]].&lt;br /&gt;
&lt;br /&gt;
== See Also == &lt;br /&gt;
* [[Handle]]&lt;br /&gt;
* [[Handle Functions]]&lt;br /&gt;
* [[IndexNames]]: The names of the indexes of a variable&lt;br /&gt;
* [[Hasindex]] Tests if a variable has a specified Index.&lt;br /&gt;
* [[Repeated parameter forwarding]]&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=If_you_don%E2%80%99t_read_manuals&amp;diff=63786</id>
		<title>If you don’t read manuals</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=If_you_don%E2%80%99t_read_manuals&amp;diff=63786"/>
		<updated>2026-03-18T00:36:36Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Analytica User Guide]]&lt;br /&gt;
&amp;lt;breadcrumbs&amp;gt;Analytica User Guide &amp;gt; Introduction: About Analytica &amp;gt; {{PAGENAME}}&amp;lt;/breadcrumbs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Experienced modelers find most Analytica features intuitive. But, it’s helpful to get a good grasp of&lt;br /&gt;
some key concepts so you can get up to speed rapidly. Here are a few chapters that you might&lt;br /&gt;
find especially helpful to review.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Chapter&lt;br /&gt;
!Contents&lt;br /&gt;
|-&lt;br /&gt;
| [[Building Effective Models]]&lt;br /&gt;
|Guidelines distilled from the experience of master modelers. It offers practical suggestions for building models that are clear, reliable, and focus on what really matters — the decisions, objectives, and key uncertainties. These tips are not specific to Analytica, but we designed Analytica to make them especially easy to follow.&lt;br /&gt;
|-&lt;br /&gt;
| [[Creating Lucid Influence Diagrams|Creating Lucid Diagrams]]&lt;br /&gt;
|Tips on how to avoid producing incomprehensible spaghetti -- and create influence diagrams that are truly lucid and even elegant.&lt;br /&gt;
|-&lt;br /&gt;
|[[Arrays and Indexes]]&lt;br /&gt;
|We especially recommend this section for people who don't read manuals, including -- perhaps especially -- experienced modelers!  Once you grasp the essentials of Analytica’s Intelligent Arrays™, you'll find that you can build complex multidimensional models with surprising ease. But you might find they take a little getting used to, particularly if you have spent a lot of time with spreadsheets or programming with arrays.&lt;br /&gt;
|-&lt;br /&gt;
|[[Expressing Uncertainty]]&lt;br /&gt;
|How to select appropriate probability distributions to express uncertainties. It also provides an overview of how Analytica computes probability distributions using Monte Carlo and other random sampling methods, and your options for displaying probabilistic values.&lt;br /&gt;
|-&lt;br /&gt;
|[[Procedural Programming]]&lt;br /&gt;
|Analytica is a &amp;quot;declarative&amp;quot; language, enabling you to create large and sophisticated models without conventional procedural programming. But, sometimes you really want to write complex procedural functions. If so, read this chapter to understand Analytica as a programming language.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
* [[Analytica Tutorial]]&lt;br /&gt;
* [[Creating Lucid Influence Diagrams]]&lt;br /&gt;
* [[Building Effective Models]]&lt;br /&gt;
* [[Arrays and Indexes]]&lt;br /&gt;
* [[Expressing Uncertainty]]&lt;br /&gt;
* [[Procedural Programming]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;footer&amp;gt;Welcome! / {{PAGENAME}} /Hardware and software requirements&amp;lt;/footer&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=MediaWiki:Hierarchy&amp;diff=63785</id>
		<title>MediaWiki:Hierarchy</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=MediaWiki:Hierarchy&amp;diff=63785"/>
		<updated>2026-03-18T00:34:31Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Getting started&lt;br /&gt;
** [[Analytica_Tutorial|Tutorial]]&lt;br /&gt;
*** [[About Analytica]]&lt;br /&gt;
*** [[Tutorial: Open a model to browse|Opening A Model]]&lt;br /&gt;
*** [[Tutorial: Reviewing a model|Reviewing a model]]&lt;br /&gt;
*** [[Tutorial: Create a model|Create a Model]]&lt;br /&gt;
*** [[Tutorial: Arrays|Arrays]]&lt;br /&gt;
***[[Tutorial: Analyzing a model|Uncertainty]]&lt;br /&gt;
***[[Tutorial: Sharing a model with ACP| Sharing a model with ACP]]&lt;br /&gt;
***[[Tutorial: Decision trees|Decision tree]]&lt;br /&gt;
***[[Tutorial: Dynamic system model| Dynamic system model]]&lt;br /&gt;
***[[Example Models and Libraries]]&lt;br /&gt;
***[[Tutorial videos]]&lt;br /&gt;
**[[If you don’t read manuals]]&lt;br /&gt;
** [[Excel and Analytica]]&lt;br /&gt;
** [[Edit and improve these docs]]&lt;br /&gt;
** [[Open these docs from Analytica]]&lt;br /&gt;
* Quick links&lt;br /&gt;
** [[Example Models]]&lt;br /&gt;
** [[Tutorial videos|Videos]]&lt;br /&gt;
** [[Keyboard Shortcuts]]&lt;br /&gt;
** [[Functions by category]]&lt;br /&gt;
** [[Alphabetical Function List]]&lt;br /&gt;
** [[Modelling Guide]]&lt;br /&gt;
** [[Standard libraries]]&lt;br /&gt;
** [[Additional libraries]]&lt;br /&gt;
** [[:Category:Concepts|Key concepts]]&lt;br /&gt;
** [[Techniques and technologies]]&lt;br /&gt;
&lt;br /&gt;
* [[Analytica_User_Guide|User Guide]]&lt;br /&gt;
** [[Contents of User Guide|Contents in detail]]&lt;br /&gt;
** Basics&lt;br /&gt;
*** [[Introduction: About Analytica|Introduction]]&lt;br /&gt;
****  [[If you don’t read manuals]]&lt;br /&gt;
****  [[Hardware and software requirements]]&lt;br /&gt;
****  [[Installation and licenses]]&lt;br /&gt;
****  [[Editions of Analytica]]&lt;br /&gt;
***  [[Help menu and  documentation]]&lt;br /&gt;
****  [[Normally, usually, and defaults]]&lt;br /&gt;
****  [[Typographic conventions in this guide]]&lt;br /&gt;
**** [[User guide Examples folder]]&lt;br /&gt;
**** [[New Releases|What’s new?]]&lt;br /&gt;
*** [[Menus]]&lt;br /&gt;
**** [[File menu]]&lt;br /&gt;
****  [[Edit menu]]&lt;br /&gt;
****  [[Object menu]]&lt;br /&gt;
****  [[Definition menu (more)|Definition menu]]&lt;br /&gt;
****  [[Result menu]]&lt;br /&gt;
****  [[Diagram menu]]&lt;br /&gt;
****  [[Window menu]]&lt;br /&gt;
****  [[Help menu]]&lt;br /&gt;
****  [[Right mouse button menus]]&lt;br /&gt;
*** [[Windows and dialogs]]&lt;br /&gt;
****  [[Object window]]&lt;br /&gt;
****  [[Result window]]&lt;br /&gt;
****  [[Diagram window]]&lt;br /&gt;
****  [[Outline window]]&lt;br /&gt;
****  [[Object Finder dialog]]&lt;br /&gt;
****  [[Diagram Style dialog]]&lt;br /&gt;
****  [[Node Style dialog]]&lt;br /&gt;
****  [[Number Format Dialog]]&lt;br /&gt;
****  [[Graph setup dialog]]&lt;br /&gt;
****  [[Uncertainty Setup dialog]]&lt;br /&gt;
****  [[Preferences dialog]]&lt;br /&gt;
**** [[Attributes dialog]]&lt;br /&gt;
*** [[Examining a Model]]&lt;br /&gt;
****  [[To open or exit a model]]&lt;br /&gt;
****  [[Diagram window]]&lt;br /&gt;
****  [[Classes of variables and other objects]]&lt;br /&gt;
****  [[Selecting nodes]]&lt;br /&gt;
****  [[Toolbar]]&lt;br /&gt;
****  [[User input nodes and user output nodes]]&lt;br /&gt;
****  [[Object window]] &lt;br /&gt;
****  [[Attribute panel]]&lt;br /&gt;
****  [[Values in Object Window]]&lt;br /&gt;
****  [[Printing]]&lt;br /&gt;
***  [[Result Tables and Graphs]]&lt;br /&gt;
****  [[Result window]]&lt;br /&gt;
****  [[Table view of a result]]&lt;br /&gt;
****  [[Graph view of a result]]&lt;br /&gt;
****  [[Uncertainty view of a result]]&lt;br /&gt;
****  [[Comparing results]]&lt;br /&gt;
***  [[Parametric analysis]]&lt;br /&gt;
*** [[Create and edit a model]]&lt;br /&gt;
****  [[Create and save a model]]&lt;br /&gt;
****  [[Create and edit nodes]]&lt;br /&gt;
****  [[Draw arrows]]&lt;br /&gt;
****  [[Draw arrows between modules]]&lt;br /&gt;
****  [[Alias nodes]]&lt;br /&gt;
****  [[To edit an attribute]]&lt;br /&gt;
****  [[Change class of an object]]&lt;br /&gt;
****  [[Preferences dialog]]&lt;br /&gt;
*** [[Building Effective Models]]&lt;br /&gt;
**** [[Create a model]]&lt;br /&gt;
**** [[Test and debug your model]]&lt;br /&gt;
**** [[Expand your model]]&lt;br /&gt;
*** [[Creating Lucid Influence Diagrams|Lucid influence diagrams]]&lt;br /&gt;
**** [[About influence diagrams]]&lt;br /&gt;
**** [[Guidelines for creating lucid models]]&lt;br /&gt;
**** [[Arranging nodes to make clear diagrams]]&lt;br /&gt;
**** [[Organizing a module hierarchy]]&lt;br /&gt;
**** [[Color in influence diagrams]]&lt;br /&gt;
**** [[Diagram Style dialog]]&lt;br /&gt;
**** [[Node Style dialog]]&lt;br /&gt;
**** [[Taking screenshots of diagrams|Screenshots of a diagram]]&lt;br /&gt;
*** [[Number and table formats]]&lt;br /&gt;
**** [[Number formats]]&lt;br /&gt;
**** [[Date formats]]&lt;br /&gt;
**** [[Display of constraint results|Display constraint results]]&lt;br /&gt;
**** [[Multiple formats in one table]]&lt;br /&gt;
***[[Graphs]]&lt;br /&gt;
**** [[Graphing roles]]&lt;br /&gt;
**** [[Graph setup dialog]]&lt;br /&gt;
**** [[Changing Series Colors]]&lt;br /&gt;
**** [[Graph templates]]&lt;br /&gt;
**** [[XY Comparison]]&lt;br /&gt;
** Definitions and expressions&lt;br /&gt;
*** [[Definitions]]&lt;br /&gt;
****  [[Creating or editing a definition]]&lt;br /&gt;
****  [[The Expression popup menu]]&lt;br /&gt;
**** [[Expression Assist]]&lt;br /&gt;
****  [[Object Finder dialog]]&lt;br /&gt;
****  [[Definition menu]]&lt;br /&gt;
****  [[The domain of possible values]]&lt;br /&gt;
****  [[Check attribute]]&lt;br /&gt;
***  [[Expressions]]&lt;br /&gt;
****  [[Numbers]]&lt;br /&gt;
**** [[Date and Time Values]]&lt;br /&gt;
**** [[Boolean or truth values]]&lt;br /&gt;
****  [[Text values]]&lt;br /&gt;
**** [[Operators]]&lt;br /&gt;
****  [[IF a THEN b ELSE c]]&lt;br /&gt;
****  [[Function calls and parameters]]&lt;br /&gt;
****  [[Math functions]]&lt;br /&gt;
****  [[Numbers and text]]&lt;br /&gt;
****  [[INF, NAN, and NULL - Exception values]]&lt;br /&gt;
****  [[Warnings]]&lt;br /&gt;
****  [[Datatype functions]]&lt;br /&gt;
*** [[Text, Date, Math, and Financial Functions]]&lt;br /&gt;
**** [[Text functions]]&lt;br /&gt;
**** [[Date functions]]&lt;br /&gt;
**** [[Advanced math functions]]&lt;br /&gt;
**** [[Complex number functions]]&lt;br /&gt;
**** [[Financial functions]]&lt;br /&gt;
**** [[Financial library functions]]&lt;br /&gt;
*** [[Dynamic Simulation]]&lt;br /&gt;
**** [[Time index]]&lt;br /&gt;
**** [[Dynamic function]]&lt;br /&gt;
**** [[Time index details]]&lt;br /&gt;
**** [[Dynamic initial values]]&lt;br /&gt;
**** [[Dynamic using arrays]]&lt;br /&gt;
**** [[Dynamic dependencies]]&lt;br /&gt;
**** [[Dynamic and uncertainty]]&lt;br /&gt;
**** [[Dynamic on non-Time Indexes]]&lt;br /&gt;
**** [[Reverse Dynamic]]&lt;br /&gt;
** Arrays and Indexes&lt;br /&gt;
*** [[Intelligent Arrays]]&lt;br /&gt;
*** [[Indexes and arrays: An introduction]]&lt;br /&gt;
*** [[Arrays and Indexes]]&lt;br /&gt;
**** [[IF a THEN b ELSE c with arrays]]&lt;br /&gt;
**** [[Creating an index]]&lt;br /&gt;
**** [[Functions that create indexes]]&lt;br /&gt;
**** [[To make an edit table]]&lt;br /&gt;
**** [[To edit a table]]&lt;br /&gt;
**** [[Splice a table when computed indexes change]]&lt;br /&gt;
**** [[Subscript and slice of a subarray]]&lt;br /&gt;
**** [[Choice menus and Checkboxes in an edit table]]&lt;br /&gt;
**** [[Shortcuts to navigate and edit a table]]&lt;br /&gt;
*** [[Array functions]] &lt;br /&gt;
**** [[Array Function Example Variables]]&lt;br /&gt;
**** [[Functions that create arrays]]&lt;br /&gt;
**** [[Array-reducing functions]]&lt;br /&gt;
**** [[Transforming functions]]&lt;br /&gt;
**** [[Relational tables and multiD arrays]]&lt;br /&gt;
**** [[Interpolation functions]]&lt;br /&gt;
**** [[Fourier Transform]]&lt;br /&gt;
**** [[Sets - collections of unique elements]]&lt;br /&gt;
**** [[Other array functions]]&lt;br /&gt;
**** [[DetermTable: Deterministic tables]]&lt;br /&gt;
**** [[Subtable: Editable part of an array]]&lt;br /&gt;
**** [[MultiTable: Combining editable and computed arrays]]&lt;br /&gt;
**** [[Matrix functions]]&lt;br /&gt;
** Uncertainty and statistics&lt;br /&gt;
*** [[Expressing Uncertainty]]&lt;br /&gt;
**** [[Uncertainty Setup dialog]]&lt;br /&gt;
**** [[Uncertainty views]]&lt;br /&gt;
**** [[Selecting the Sample Size]]&lt;br /&gt;
**** [[Choosing an appropriate distribution ]]&lt;br /&gt;
**** [[Defining a variable as a distribution]] &lt;br /&gt;
**** [[Including a distribution in a definition]] &lt;br /&gt;
**** [[Probabilistic calculation]]&lt;br /&gt;
**** [[Monte Carlo and probabilistic simulation]]&lt;br /&gt;
*** [[Probability distributions]]&lt;br /&gt;
**** [[Parametric discrete distributions]]&lt;br /&gt;
**** [[Probability density and mass graphs]]&lt;br /&gt;
**** [[The domain attribute and discrete variables]]&lt;br /&gt;
**** [[Custom discrete probabilities]]&lt;br /&gt;
**** [[Parametric continuous distributions]]&lt;br /&gt;
**** [[Custom continuous distributions]]&lt;br /&gt;
**** [[Special probabilistic functions]]&lt;br /&gt;
**** [[Advanced probability functions]]&lt;br /&gt;
**** [[Multivariate distributions]]&lt;br /&gt;
**** [[Importance weights]]&lt;br /&gt;
*** [[Statistics, Sensitivity, and Uncertainty Analysis]]&lt;br /&gt;
**** [[Statistical functions]]&lt;br /&gt;
**** [[Weighted statistics and w parameter]]&lt;br /&gt;
**** [[Importance analysis]]&lt;br /&gt;
**** [[Sensitivity analysis functions]]&lt;br /&gt;
**** [[Tornado charts]]&lt;br /&gt;
**** [[X-Y plots]]&lt;br /&gt;
**** [[Scatter plots]]&lt;br /&gt;
**** [[Regression analysis]]&lt;br /&gt;
**** [[Uncertainty in regression results]]&lt;br /&gt;
**** [[Logistic regression functions]]&lt;br /&gt;
**** [[Stochastic Information Packets (SIPs)]]&lt;br /&gt;
** [[User interfaces]]&lt;br /&gt;
*** [[Creating Interfaces for End Users|User interfaces]]&lt;br /&gt;
**** [[User Input nodes]]&lt;br /&gt;
**** [[Choice menu user input]]&lt;br /&gt;
**** [[Checkbox user input]]&lt;br /&gt;
**** [[User output nodes]]&lt;br /&gt;
**** [[User inputs and outputs as aliases]]&lt;br /&gt;
**** [[Onchange attribute]]&lt;br /&gt;
**** [[Button creation]]&lt;br /&gt;
**** [[Form modules]]&lt;br /&gt;
**** [[Icon images in a node]]&lt;br /&gt;
**** [[Graphics, frames, and text in a diagram]]&lt;br /&gt;
**** [[Links or URL in model attributes]]&lt;br /&gt;
**** [[Analytica Free Edition]]&lt;br /&gt;
*** [[Analytica Cloud Player (ACP)]]&lt;br /&gt;
** Advanced features&lt;br /&gt;
*** [[Integration with data and applications]]&lt;br /&gt;
**** [[Read and write text files]]&lt;br /&gt;
**** [[Read data from URL on internet]]&lt;br /&gt;
**** [[Copy and Paste between applications]]&lt;br /&gt;
**** [[Import and Export data]]&lt;br /&gt;
**** [[Model file formats]]&lt;br /&gt;
**** [[OLE linking]]&lt;br /&gt;
**** [[Database access]]&lt;br /&gt;
**** [[Database functions]]&lt;br /&gt;
**** [[Excel spreadsheets read and write]]&lt;br /&gt;
**** [[RunConsoleProcess - call other applications]]&lt;br /&gt;
**** [[COM Automation Objects]]&lt;br /&gt;
*** [[Working with Large Models]]&lt;br /&gt;
**** [[Module hierarchy]]&lt;br /&gt;
**** [[Outline window]]&lt;br /&gt;
**** [[Find variables and other objects]]&lt;br /&gt;
**** [[Manage attributes]]&lt;br /&gt;
**** [[Invalid variables]]&lt;br /&gt;
**** [[Filed modules and libraries]]&lt;br /&gt;
**** [[Import a module or library]]&lt;br /&gt;
**** [[Combining models into an integrated model]]&lt;br /&gt;
**** [[Making a browse-only model and hiding definitions]]&lt;br /&gt;
**** [[Managing windows]]&lt;br /&gt;
**** [[Memory usage and management]]&lt;br /&gt;
**** [[Performance Profiler library]]&lt;br /&gt;
**** [[Analytica Enterprise]]&lt;br /&gt;
*** [[User-defined Functions and Libraries]]&lt;br /&gt;
**** [[Example function]]&lt;br /&gt;
**** [[Call a function]]&lt;br /&gt;
**** [[Define a function]]&lt;br /&gt;
**** [[Attributes of a function]]&lt;br /&gt;
**** [[Parameter qualifiers]]&lt;br /&gt;
**** [[User Libraries]]&lt;br /&gt;
*** [[Procedural Programming]]&lt;br /&gt;
**** [[Procedural Programming Example]]&lt;br /&gt;
**** [[Summary of Programming Constructs]]&lt;br /&gt;
**** [[Begin-End for Grouping Expressions]]&lt;br /&gt;
**** [[Local Values]]&lt;br /&gt;
**** [[For and While Loops]]&lt;br /&gt;
**** [[Recursion]]&lt;br /&gt;
**** [[Local Indexes]]&lt;br /&gt;
**** [[Ensuring Array Abstraction]]&lt;br /&gt;
**** [[References and Data Structures]]&lt;br /&gt;
**** [[Handles to Objects]]&lt;br /&gt;
**** [[Dialog Functions]]&lt;br /&gt;
**** [[Other Procedural Functions]]&lt;br /&gt;
** [[Reference sections]]&lt;br /&gt;
*** [[Analytica Specifications]]&lt;br /&gt;
*** [[Identifiers Already Used]]&lt;br /&gt;
*** [[Error Message Types]]&lt;br /&gt;
*** [[Forward and Backward Compatibility]]&lt;br /&gt;
*** [[Bibliography]]&lt;br /&gt;
* [[Analytica Optimizer Guide|Analytica Optimizer]]&lt;br /&gt;
** [[Introduction to Optimizer]]&lt;br /&gt;
** [[Optimizer Quick Start]]&lt;br /&gt;
** [[Optimization Characteristics]]&lt;br /&gt;
** [[Optimizing with Arrays]]&lt;br /&gt;
** [[Optimizer key concepts: Airline Example]]&lt;br /&gt;
** [[Optimizer Attributes]]&lt;br /&gt;
** [[Primary Optimization Functions]]&lt;br /&gt;
** [[Optimization Status Functions]]&lt;br /&gt;
** [[Optimizer control settings]]&lt;br /&gt;
* [[ADE User Guide|Analytica Decision Engine]]&lt;br /&gt;
** [[Introduction to ADE]]&lt;br /&gt;
** [[Installation of ADE]]&lt;br /&gt;
** [[The ADE Tutorial]]&lt;br /&gt;
** [[Using the ADE Server]]&lt;br /&gt;
** [[Working with Models, Modules, and Files in ADE]]&lt;br /&gt;
** [[ADE Server Class Reference]]&lt;br /&gt;
* [[Analytica Cloud Platform|ACP]]&lt;br /&gt;
** [[What's new in ACP?]]&lt;br /&gt;
* User Community&lt;br /&gt;
** [https://lumina.com/community/ Analytica User Forum]&lt;br /&gt;
** [http://blog.lumina.com/blog Lumina Blog]&lt;br /&gt;
** [https://analytica.com/publications-using-analytica/ Publications using Analytica]&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=MediaWiki:Hierarchy&amp;diff=63784</id>
		<title>MediaWiki:Hierarchy</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=MediaWiki:Hierarchy&amp;diff=63784"/>
		<updated>2026-03-18T00:32:19Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: Moved the Tutorial (and its chapters) into the first thing under Getting started.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Getting started&lt;br /&gt;
** [[Analytica_Tutorial|Tutorial]]&lt;br /&gt;
*** [[About Analytica]]&lt;br /&gt;
*** [[Tutorial: Open a model to browse|Opening A Model]]&lt;br /&gt;
*** [[Tutorial: Reviewing a model|Reviewing a model]]&lt;br /&gt;
*** [[Tutorial: Create a model|Create a Model]]&lt;br /&gt;
*** [[Tutorial: Arrays|Arrays]]&lt;br /&gt;
***[[Tutorial: Analyzing a model|Uncertainty]]&lt;br /&gt;
***[[Tutorial: Sharing a model with ACP| Sharing a model with ACP]]&lt;br /&gt;
***[[Tutorial: Decision trees|Decision tree]]&lt;br /&gt;
***[[Tutorial: Dynamic system model| Dynamic system model]]&lt;br /&gt;
***[[Example Models and Libraries]]&lt;br /&gt;
***[[Tutorial videos]]&lt;br /&gt;
** [[Excel and Analytica]]&lt;br /&gt;
** [[Edit and improve these docs]]&lt;br /&gt;
** [[Open these docs from Analytica]]&lt;br /&gt;
* Quick links&lt;br /&gt;
** [[Example Models]]&lt;br /&gt;
** [[Tutorial videos|Videos]]&lt;br /&gt;
** [[Keyboard Shortcuts]]&lt;br /&gt;
** [[Functions by category]]&lt;br /&gt;
** [[Alphabetical Function List]]&lt;br /&gt;
** [[Modelling Guide]]&lt;br /&gt;
** [[Standard libraries]]&lt;br /&gt;
** [[Additional libraries]]&lt;br /&gt;
** [[:Category:Concepts|Key concepts]]&lt;br /&gt;
** [[Techniques and technologies]]&lt;br /&gt;
&lt;br /&gt;
* [[Analytica_User_Guide|User Guide]]&lt;br /&gt;
** [[Contents of User Guide|Contents in detail]]&lt;br /&gt;
** Basics&lt;br /&gt;
*** [[Introduction: About Analytica|Introduction]]&lt;br /&gt;
****  [[If you don’t read manuals]]&lt;br /&gt;
****  [[Hardware and software requirements]]&lt;br /&gt;
****  [[Installation and licenses]]&lt;br /&gt;
****  [[Editions of Analytica]]&lt;br /&gt;
***  [[Help menu and  documentation]]&lt;br /&gt;
****  [[Normally, usually, and defaults]]&lt;br /&gt;
****  [[Typographic conventions in this guide]]&lt;br /&gt;
**** [[User guide Examples folder]]&lt;br /&gt;
**** [[New Releases|What’s new?]]&lt;br /&gt;
*** [[Menus]]&lt;br /&gt;
**** [[File menu]]&lt;br /&gt;
****  [[Edit menu]]&lt;br /&gt;
****  [[Object menu]]&lt;br /&gt;
****  [[Definition menu (more)|Definition menu]]&lt;br /&gt;
****  [[Result menu]]&lt;br /&gt;
****  [[Diagram menu]]&lt;br /&gt;
****  [[Window menu]]&lt;br /&gt;
****  [[Help menu]]&lt;br /&gt;
****  [[Right mouse button menus]]&lt;br /&gt;
*** [[Windows and dialogs]]&lt;br /&gt;
****  [[Object window]]&lt;br /&gt;
****  [[Result window]]&lt;br /&gt;
****  [[Diagram window]]&lt;br /&gt;
****  [[Outline window]]&lt;br /&gt;
****  [[Object Finder dialog]]&lt;br /&gt;
****  [[Diagram Style dialog]]&lt;br /&gt;
****  [[Node Style dialog]]&lt;br /&gt;
****  [[Number Format Dialog]]&lt;br /&gt;
****  [[Graph setup dialog]]&lt;br /&gt;
****  [[Uncertainty Setup dialog]]&lt;br /&gt;
****  [[Preferences dialog]]&lt;br /&gt;
**** [[Attributes dialog]]&lt;br /&gt;
*** [[Examining a Model]]&lt;br /&gt;
****  [[To open or exit a model]]&lt;br /&gt;
****  [[Diagram window]]&lt;br /&gt;
****  [[Classes of variables and other objects]]&lt;br /&gt;
****  [[Selecting nodes]]&lt;br /&gt;
****  [[Toolbar]]&lt;br /&gt;
****  [[User input nodes and user output nodes]]&lt;br /&gt;
****  [[Object window]] &lt;br /&gt;
****  [[Attribute panel]]&lt;br /&gt;
****  [[Values in Object Window]]&lt;br /&gt;
****  [[Printing]]&lt;br /&gt;
***  [[Result Tables and Graphs]]&lt;br /&gt;
****  [[Result window]]&lt;br /&gt;
****  [[Table view of a result]]&lt;br /&gt;
****  [[Graph view of a result]]&lt;br /&gt;
****  [[Uncertainty view of a result]]&lt;br /&gt;
****  [[Comparing results]]&lt;br /&gt;
***  [[Parametric analysis]]&lt;br /&gt;
*** [[Create and edit a model]]&lt;br /&gt;
****  [[Create and save a model]]&lt;br /&gt;
****  [[Create and edit nodes]]&lt;br /&gt;
****  [[Draw arrows]]&lt;br /&gt;
****  [[Draw arrows between modules]]&lt;br /&gt;
****  [[Alias nodes]]&lt;br /&gt;
****  [[To edit an attribute]]&lt;br /&gt;
****  [[Change class of an object]]&lt;br /&gt;
****  [[Preferences dialog]]&lt;br /&gt;
*** [[Building Effective Models]]&lt;br /&gt;
**** [[Create a model]]&lt;br /&gt;
**** [[Test and debug your model]]&lt;br /&gt;
**** [[Expand your model]]&lt;br /&gt;
*** [[Creating Lucid Influence Diagrams|Lucid influence diagrams]]&lt;br /&gt;
**** [[About influence diagrams]]&lt;br /&gt;
**** [[Guidelines for creating lucid models]]&lt;br /&gt;
**** [[Arranging nodes to make clear diagrams]]&lt;br /&gt;
**** [[Organizing a module hierarchy]]&lt;br /&gt;
**** [[Color in influence diagrams]]&lt;br /&gt;
**** [[Diagram Style dialog]]&lt;br /&gt;
**** [[Node Style dialog]]&lt;br /&gt;
**** [[Taking screenshots of diagrams|Screenshots of a diagram]]&lt;br /&gt;
*** [[Number and table formats]]&lt;br /&gt;
**** [[Number formats]]&lt;br /&gt;
**** [[Date formats]]&lt;br /&gt;
**** [[Display of constraint results|Display constraint results]]&lt;br /&gt;
**** [[Multiple formats in one table]]&lt;br /&gt;
***[[Graphs]]&lt;br /&gt;
**** [[Graphing roles]]&lt;br /&gt;
**** [[Graph setup dialog]]&lt;br /&gt;
**** [[Changing Series Colors]]&lt;br /&gt;
**** [[Graph templates]]&lt;br /&gt;
**** [[XY Comparison]]&lt;br /&gt;
** Definitions and expressions&lt;br /&gt;
*** [[Definitions]]&lt;br /&gt;
****  [[Creating or editing a definition]]&lt;br /&gt;
****  [[The Expression popup menu]]&lt;br /&gt;
**** [[Expression Assist]]&lt;br /&gt;
****  [[Object Finder dialog]]&lt;br /&gt;
****  [[Definition menu]]&lt;br /&gt;
****  [[The domain of possible values]]&lt;br /&gt;
****  [[Check attribute]]&lt;br /&gt;
***  [[Expressions]]&lt;br /&gt;
****  [[Numbers]]&lt;br /&gt;
**** [[Date and Time Values]]&lt;br /&gt;
**** [[Boolean or truth values]]&lt;br /&gt;
****  [[Text values]]&lt;br /&gt;
**** [[Operators]]&lt;br /&gt;
****  [[IF a THEN b ELSE c]]&lt;br /&gt;
****  [[Function calls and parameters]]&lt;br /&gt;
****  [[Math functions]]&lt;br /&gt;
****  [[Numbers and text]]&lt;br /&gt;
****  [[INF, NAN, and NULL - Exception values]]&lt;br /&gt;
****  [[Warnings]]&lt;br /&gt;
****  [[Datatype functions]]&lt;br /&gt;
*** [[Text, Date, Math, and Financial Functions]]&lt;br /&gt;
**** [[Text functions]]&lt;br /&gt;
**** [[Date functions]]&lt;br /&gt;
**** [[Advanced math functions]]&lt;br /&gt;
**** [[Complex number functions]]&lt;br /&gt;
**** [[Financial functions]]&lt;br /&gt;
**** [[Financial library functions]]&lt;br /&gt;
*** [[Dynamic Simulation]]&lt;br /&gt;
**** [[Time index]]&lt;br /&gt;
**** [[Dynamic function]]&lt;br /&gt;
**** [[Time index details]]&lt;br /&gt;
**** [[Dynamic initial values]]&lt;br /&gt;
**** [[Dynamic using arrays]]&lt;br /&gt;
**** [[Dynamic dependencies]]&lt;br /&gt;
**** [[Dynamic and uncertainty]]&lt;br /&gt;
**** [[Dynamic on non-Time Indexes]]&lt;br /&gt;
**** [[Reverse Dynamic]]&lt;br /&gt;
** Arrays and Indexes&lt;br /&gt;
*** [[Intelligent Arrays]]&lt;br /&gt;
*** [[Indexes and arrays: An introduction]]&lt;br /&gt;
*** [[Arrays and Indexes]]&lt;br /&gt;
**** [[IF a THEN b ELSE c with arrays]]&lt;br /&gt;
**** [[Creating an index]]&lt;br /&gt;
**** [[Functions that create indexes]]&lt;br /&gt;
**** [[To make an edit table]]&lt;br /&gt;
**** [[To edit a table]]&lt;br /&gt;
**** [[Splice a table when computed indexes change]]&lt;br /&gt;
**** [[Subscript and slice of a subarray]]&lt;br /&gt;
**** [[Choice menus and Checkboxes in an edit table]]&lt;br /&gt;
**** [[Shortcuts to navigate and edit a table]]&lt;br /&gt;
*** [[Array functions]] &lt;br /&gt;
**** [[Array Function Example Variables]]&lt;br /&gt;
**** [[Functions that create arrays]]&lt;br /&gt;
**** [[Array-reducing functions]]&lt;br /&gt;
**** [[Transforming functions]]&lt;br /&gt;
**** [[Relational tables and multiD arrays]]&lt;br /&gt;
**** [[Interpolation functions]]&lt;br /&gt;
**** [[Fourier Transform]]&lt;br /&gt;
**** [[Sets - collections of unique elements]]&lt;br /&gt;
**** [[Other array functions]]&lt;br /&gt;
**** [[DetermTable: Deterministic tables]]&lt;br /&gt;
**** [[Subtable: Editable part of an array]]&lt;br /&gt;
**** [[MultiTable: Combining editable and computed arrays]]&lt;br /&gt;
**** [[Matrix functions]]&lt;br /&gt;
** Uncertainty and statistics&lt;br /&gt;
*** [[Expressing Uncertainty]]&lt;br /&gt;
**** [[Uncertainty Setup dialog]]&lt;br /&gt;
**** [[Uncertainty views]]&lt;br /&gt;
**** [[Selecting the Sample Size]]&lt;br /&gt;
**** [[Choosing an appropriate distribution ]]&lt;br /&gt;
**** [[Defining a variable as a distribution]] &lt;br /&gt;
**** [[Including a distribution in a definition]] &lt;br /&gt;
**** [[Probabilistic calculation]]&lt;br /&gt;
**** [[Monte Carlo and probabilistic simulation]]&lt;br /&gt;
*** [[Probability distributions]]&lt;br /&gt;
**** [[Parametric discrete distributions]]&lt;br /&gt;
**** [[Probability density and mass graphs]]&lt;br /&gt;
**** [[The domain attribute and discrete variables]]&lt;br /&gt;
**** [[Custom discrete probabilities]]&lt;br /&gt;
**** [[Parametric continuous distributions]]&lt;br /&gt;
**** [[Custom continuous distributions]]&lt;br /&gt;
**** [[Special probabilistic functions]]&lt;br /&gt;
**** [[Advanced probability functions]]&lt;br /&gt;
**** [[Multivariate distributions]]&lt;br /&gt;
**** [[Importance weights]]&lt;br /&gt;
*** [[Statistics, Sensitivity, and Uncertainty Analysis]]&lt;br /&gt;
**** [[Statistical functions]]&lt;br /&gt;
**** [[Weighted statistics and w parameter]]&lt;br /&gt;
**** [[Importance analysis]]&lt;br /&gt;
**** [[Sensitivity analysis functions]]&lt;br /&gt;
**** [[Tornado charts]]&lt;br /&gt;
**** [[X-Y plots]]&lt;br /&gt;
**** [[Scatter plots]]&lt;br /&gt;
**** [[Regression analysis]]&lt;br /&gt;
**** [[Uncertainty in regression results]]&lt;br /&gt;
**** [[Logistic regression functions]]&lt;br /&gt;
**** [[Stochastic Information Packets (SIPs)]]&lt;br /&gt;
** [[User interfaces]]&lt;br /&gt;
*** [[Creating Interfaces for End Users|User interfaces]]&lt;br /&gt;
**** [[User Input nodes]]&lt;br /&gt;
**** [[Choice menu user input]]&lt;br /&gt;
**** [[Checkbox user input]]&lt;br /&gt;
**** [[User output nodes]]&lt;br /&gt;
**** [[User inputs and outputs as aliases]]&lt;br /&gt;
**** [[Onchange attribute]]&lt;br /&gt;
**** [[Button creation]]&lt;br /&gt;
**** [[Form modules]]&lt;br /&gt;
**** [[Icon images in a node]]&lt;br /&gt;
**** [[Graphics, frames, and text in a diagram]]&lt;br /&gt;
**** [[Links or URL in model attributes]]&lt;br /&gt;
**** [[Analytica Free Edition]]&lt;br /&gt;
*** [[Analytica Cloud Player (ACP)]]&lt;br /&gt;
** Advanced features&lt;br /&gt;
*** [[Integration with data and applications]]&lt;br /&gt;
**** [[Read and write text files]]&lt;br /&gt;
**** [[Read data from URL on internet]]&lt;br /&gt;
**** [[Copy and Paste between applications]]&lt;br /&gt;
**** [[Import and Export data]]&lt;br /&gt;
**** [[Model file formats]]&lt;br /&gt;
**** [[OLE linking]]&lt;br /&gt;
**** [[Database access]]&lt;br /&gt;
**** [[Database functions]]&lt;br /&gt;
**** [[Excel spreadsheets read and write]]&lt;br /&gt;
**** [[RunConsoleProcess - call other applications]]&lt;br /&gt;
**** [[COM Automation Objects]]&lt;br /&gt;
*** [[Working with Large Models]]&lt;br /&gt;
**** [[Module hierarchy]]&lt;br /&gt;
**** [[Outline window]]&lt;br /&gt;
**** [[Find variables and other objects]]&lt;br /&gt;
**** [[Manage attributes]]&lt;br /&gt;
**** [[Invalid variables]]&lt;br /&gt;
**** [[Filed modules and libraries]]&lt;br /&gt;
**** [[Import a module or library]]&lt;br /&gt;
**** [[Combining models into an integrated model]]&lt;br /&gt;
**** [[Making a browse-only model and hiding definitions]]&lt;br /&gt;
**** [[Managing windows]]&lt;br /&gt;
**** [[Memory usage and management]]&lt;br /&gt;
**** [[Performance Profiler library]]&lt;br /&gt;
**** [[Analytica Enterprise]]&lt;br /&gt;
*** [[User-defined Functions and Libraries]]&lt;br /&gt;
**** [[Example function]]&lt;br /&gt;
**** [[Call a function]]&lt;br /&gt;
**** [[Define a function]]&lt;br /&gt;
**** [[Attributes of a function]]&lt;br /&gt;
**** [[Parameter qualifiers]]&lt;br /&gt;
**** [[User Libraries]]&lt;br /&gt;
*** [[Procedural Programming]]&lt;br /&gt;
**** [[Procedural Programming Example]]&lt;br /&gt;
**** [[Summary of Programming Constructs]]&lt;br /&gt;
**** [[Begin-End for Grouping Expressions]]&lt;br /&gt;
**** [[Local Values]]&lt;br /&gt;
**** [[For and While Loops]]&lt;br /&gt;
**** [[Recursion]]&lt;br /&gt;
**** [[Local Indexes]]&lt;br /&gt;
**** [[Ensuring Array Abstraction]]&lt;br /&gt;
**** [[References and Data Structures]]&lt;br /&gt;
**** [[Handles to Objects]]&lt;br /&gt;
**** [[Dialog Functions]]&lt;br /&gt;
**** [[Other Procedural Functions]]&lt;br /&gt;
** [[Reference sections]]&lt;br /&gt;
*** [[Analytica Specifications]]&lt;br /&gt;
*** [[Identifiers Already Used]]&lt;br /&gt;
*** [[Error Message Types]]&lt;br /&gt;
*** [[Forward and Backward Compatibility]]&lt;br /&gt;
*** [[Bibliography]]&lt;br /&gt;
* [[Analytica Optimizer Guide|Analytica Optimizer]]&lt;br /&gt;
** [[Introduction to Optimizer]]&lt;br /&gt;
** [[Optimizer Quick Start]]&lt;br /&gt;
** [[Optimization Characteristics]]&lt;br /&gt;
** [[Optimizing with Arrays]]&lt;br /&gt;
** [[Optimizer key concepts: Airline Example]]&lt;br /&gt;
** [[Optimizer Attributes]]&lt;br /&gt;
** [[Primary Optimization Functions]]&lt;br /&gt;
** [[Optimization Status Functions]]&lt;br /&gt;
** [[Optimizer control settings]]&lt;br /&gt;
* [[ADE User Guide|Analytica Decision Engine]]&lt;br /&gt;
** [[Introduction to ADE]]&lt;br /&gt;
** [[Installation of ADE]]&lt;br /&gt;
** [[The ADE Tutorial]]&lt;br /&gt;
** [[Using the ADE Server]]&lt;br /&gt;
** [[Working with Models, Modules, and Files in ADE]]&lt;br /&gt;
** [[ADE Server Class Reference]]&lt;br /&gt;
* [[Analytica Cloud Platform|ACP]]&lt;br /&gt;
** [[What's new in ACP?]]&lt;br /&gt;
* User Community&lt;br /&gt;
** [https://lumina.com/community/ Analytica User Forum]&lt;br /&gt;
** [http://blog.lumina.com/blog Lumina Blog]&lt;br /&gt;
** [https://analytica.com/publications-using-analytica/ Publications using Analytica]&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=Document_style_guide&amp;diff=63783</id>
		<title>Document style guide</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=Document_style_guide&amp;diff=63783"/>
		<updated>2026-03-17T17:21:29Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: /* Table of Contents */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Documentation guidelines]]&lt;br /&gt;
&lt;br /&gt;
This style guide is designed to help us write language that is clear and easy to read. It applies to all Analytica and Lumina written material, including Analytica docs, including [[Analytica Tutorial]], [[User Guide]]s, emails, proposals, reports, and even error messages. &lt;br /&gt;
&lt;br /&gt;
Many of these guidelines are fairly standard for technical writers and editors. We've borrowed and adapted liberally from standard style manuals. The main goal is to make the language easy to read by avoiding unecessary words and convoluted grammar. Some guidelines, especially for terminology, is specific to Analytica docs.  &lt;br /&gt;
&lt;br /&gt;
Feel free to edit any wiki pages to make them follow this guide more closely.&lt;br /&gt;
&lt;br /&gt;
For style guidelines for Analytica models see [[Analytica model style guide]].&lt;br /&gt;
&lt;br /&gt;
== Language  ==&lt;br /&gt;
&lt;br /&gt;
=== Use imperative, active voice, and present tense ===&lt;br /&gt;
&lt;br /&gt;
Use the '''imperative''' -- directly telling the reader what to do -- when suggesting or explaining what to do (as we do here), because it concise and direct -- for example:&lt;br /&gt;
* Select '''Graph setup''' from the '''Result''' menu&lt;br /&gt;
* '''''Not:''''' The user should select select '''Graph setup''' from the '''Result''' menu. &lt;br /&gt;
* '''''And Definitely not:''''' The '''Graph setup''' should be selected from the '''Result''' menu.&lt;br /&gt;
&lt;br /&gt;
Imperative is especially useful for a series of steps for you (the &amp;quot;user&amp;quot;) to perform. Number the steps only when you must perform them in that sequence:&lt;br /&gt;
#Select '''Graph setup...''' from the '''Result''' menu&lt;br /&gt;
#Check '''Stacked''' option&lt;br /&gt;
#Click '''OK'''&lt;br /&gt;
&lt;br /&gt;
The imperative is technically a form of &amp;quot;active voice&amp;quot;, where &amp;quot;you&amp;quot; (the reader or software user) is the implied subject. Sometimes it is helpful to make the subject -- i.e.&amp;quot;you&amp;quot; explicit -- for example:&lt;br /&gt;
* You should avoid the passive voice.  &lt;br /&gt;
* '''Not:''' The passive voice should always be avoided &lt;br /&gt;
* When you press ''ctrl+F'', it opens the '''Find''' dialog.  &lt;br /&gt;
* '''Not:''' When the user presses ''ctrl+F'', the '''Find''' dialog is displayed.&lt;br /&gt;
&lt;br /&gt;
Use '''present not future''' tense for what Analytica does: &lt;br /&gt;
* Press ''ctrl+F'' and it opens the '''Find''' dialog.&lt;br /&gt;
* '''Not''': When you press ''ctrl+F'', it ''will'' display the '''Find''' dialog.&lt;br /&gt;
* '''Better''': Press ''ctrl+F'' to open the '''Find''' dialog.&lt;br /&gt;
&lt;br /&gt;
=== You, we, it, and Analytica ===&lt;br /&gt;
&lt;br /&gt;
As you saw above, we use &amp;quot;you&amp;quot; to refer to the reader or software user, and &amp;quot;we&amp;quot; or &amp;quot;us&amp;quot; to refer to the writer or Lumina:&lt;br /&gt;
* You can use Function F to ..., &lt;br /&gt;
* '''''Not:''''' Function F can be utilized to ...&lt;br /&gt;
* We invite you to email us your comments&lt;br /&gt;
* '''''Not:''''' The reader is invited to email Lumina their comments.&lt;br /&gt;
&lt;br /&gt;
If the recipient would otherwise be ambiguous, write for example: &lt;br /&gt;
* Email Lumina your comments. &lt;br /&gt;
&lt;br /&gt;
When the subject isn't &amp;quot;you&amp;quot;, it's often &amp;quot;Analytica&amp;quot;. Since this documentation is about Analytica, it's fine to refer to Analytica as &amp;quot;it&amp;quot; (she doesn't mind):&lt;br /&gt;
* When you click the button, it shows the dialog box.&lt;br /&gt;
* '''''Not:''''' When the user clicks the button, Analytica will display the dialog box.&lt;br /&gt;
* '''''Definitely not:''''' When the button is clicked, the dialog box is displayed.&lt;br /&gt;
&lt;br /&gt;
It's occasionally useful to mention &amp;quot;Analytica&amp;quot; explicitly to emphasize a special Analytica way of doing things to contrast it to other languages and software:&lt;br /&gt;
* Analytica uses name-based subscripting, instead of position-based subscripting, which is standard in most computer languages.&lt;br /&gt;
&lt;br /&gt;
=== It's, don't and common contractions ===&lt;br /&gt;
&lt;br /&gt;
It's fine to use common contractions like &amp;quot;it's&amp;quot;, &amp;quot;don't&amp;quot;, &amp;quot;isn't&amp;quot; and so on.  They're a bit faster to read, and convey informality, which is good. We want to avoid academic, government, or corporate-speak.&lt;br /&gt;
&lt;br /&gt;
=== Click, Press, Select ===&lt;br /&gt;
&lt;br /&gt;
* You '''''click''''' a button or link (not ''click on''). &lt;br /&gt;
*You '''''press''''' a menu to see the menu options (the action is to click and hold) &lt;br /&gt;
*You '''''select''''' a menu option. &lt;br /&gt;
*You also '''''select''''' a node or text from a text field. &lt;br /&gt;
*You '''''press''''' (not ''hit ''or ''depress'') a key or key combination on the keyboard.&lt;br /&gt;
&lt;br /&gt;
* Label web links so that users get a reasonable idea of what they will find on the linked page. &lt;br /&gt;
&lt;br /&gt;
* You never need to write &amp;quot;click this link&amp;quot; or &amp;quot;click here&amp;quot;. People know about clicking links! The browser normally shows hyperlinked text in blue and/or underlined to show that it's clickable.&lt;br /&gt;
&lt;br /&gt;
===Common words and concepts===&lt;br /&gt;
&lt;br /&gt;
Use short words instead of longer synonyms: &lt;br /&gt;
* &amp;quot;use&amp;quot; is better than &amp;quot;utilize&amp;quot;&lt;br /&gt;
* &amp;quot;let&amp;quot; is better than &amp;quot;allow ... to&amp;quot;.&lt;br /&gt;
* Use long dash (m-dash) or double-dash around examples or interjections (rather than parentheses) -- for example &amp;quot;Use a reducing function -- e.g. Sum or Min -- rather than a transforming function.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Also additionally, moreover,and more===&lt;br /&gt;
&lt;br /&gt;
Inexperienced writers often use words like &amp;quot;Also&amp;quot;, &amp;quot;Additionally&amp;quot;, or &amp;quot;Moreover&amp;quot; to start sentences to indicate some link to the preceding sentences. These words are almost always unnecessary and should be deleted. The fact that two sentences come one after the another already implies &amp;quot;Additionally&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Analytica terminology  ==&lt;br /&gt;
&lt;br /&gt;
* Capitalize terms used with a special meaning in Analytica -- such as, Variable, Object, Attribute, or Diagram -- to distinguish them from their common meaning, which is often subtly different. &lt;br /&gt;
* There's no need to capitalize standard computer terms -- like, window, menu, button, mouse, keyboard -- or standard mathematical terms -- like, variable, function, parameter, array -- except when they're being used with a special Analytica take on the meaning, as for example, ''Variable''.&lt;br /&gt;
&lt;br /&gt;
*  Don't use '''''node''''' to mean a ''Variable'' or ''Object''. A '''''node''''' is the visual representation in a Diagram of a ''Variable ''or other Class of  ''Object''. An ''Object&amp;quot; can have multiple nodes -- e.g., the original node and aliases, including input and output nodes. A Variable is just one Class of Object. For views or operations that apply to all classes of Object, use ''Object'' rather than ''Variable''.  But, do use '''''node''''' when you are actually referring to a node in a Diagram that you select, create, find, drag, or deletee (including a input or output node).&lt;br /&gt;
&lt;br /&gt;
* Use '''''Edition''''' of Analytica to mean Player, Professional, {{Developer}}, ADE, ACP, and so on. &lt;br /&gt;
* Use '''''Release''''' as in Release 5.3. &lt;br /&gt;
* Avoid '''''version''''' because it can mean either ''Edition'' or ''Release''.&lt;br /&gt;
&lt;br /&gt;
*'''ADE''' and '''ACP''' are '''''Editions''''' of Analytica, just like Professional and {{Developer}}. So we don't need to say &amp;quot;Analytica and ADE&amp;quot; or &amp;quot;Analytica and ACP&amp;quot; as we have done often in the past. '''''Optimizer''''' is also an Edition, not an extension or option.&lt;br /&gt;
&lt;br /&gt;
* Use &amp;quot;parameter&amp;quot; ''not '' &amp;quot;argument&amp;quot; for the things listed in parentheses in a call to a function (the ''actual'' parameters), or in the  '''Parameters''' attribute of a function (the ''formal'' parameters).&lt;br /&gt;
&lt;br /&gt;
== Lists  ==&lt;br /&gt;
&lt;br /&gt;
*Use a '''''bulleted list''''', like this, wherever appropriate.&lt;br /&gt;
&lt;br /&gt;
*Use a '''''numbered or lettered list''''' only where the items are intrinsically ordered -- e.g. a series of steps that won't work in a different order:&lt;br /&gt;
&lt;br /&gt;
#Do this&lt;br /&gt;
#Next, do this&lt;br /&gt;
#Finish up by doing this&lt;br /&gt;
&lt;br /&gt;
There's no need to introduce a list by saying &amp;quot;the following&amp;quot;. A simple colon followed by a list makes it clear without the extra words:&lt;br /&gt;
* These are options for parameter X: (note the colon) &lt;br /&gt;
* '''''Not:''''' The following are options for parameter X.&lt;br /&gt;
&lt;br /&gt;
* If each item is a single phrase, there's no need for a period or comma at the end.  But, do use a period if there are multiple sentences, as in this list.&lt;br /&gt;
&lt;br /&gt;
* Order items in a list (or sections in a chapter, or parameters of a function when designing a function) from the easiest or most commonly used to the more complicated and esoteric.  That way, readers scanning down the list will:&lt;br /&gt;
** find what they want sooner on average,&lt;br /&gt;
** read the easy stuff first, preparing them to understand the harder stuff that comes later, only if they need to.&lt;br /&gt;
* Alphabetic ordering is usually pointless online:  If you already know the name of the function (or whatever), which you would need for alphabetic search, you can use '''Find''' ctrl+F.&lt;br /&gt;
&lt;br /&gt;
* Avoid making lists with more than about 5 items at the same level. If you have a lot more items, group related items into sublists as a hierarchy. That makes it easier to scan down a list to find what you want.&lt;br /&gt;
&lt;br /&gt;
==Media wiki conventions==&lt;br /&gt;
===Page titles and wiki links===&lt;br /&gt;
&lt;br /&gt;
In Analytica Docs), use Sentence case for page titles. The first word starts with a capital letter. Don't capitalize the other words unless they are proper nouns (such as Analytica):&lt;br /&gt;
* '''Document style guide'''&lt;br /&gt;
* Not:''' Document Style Guide'''&lt;br /&gt;
This is important because Mediawiki (the platform for these Analytica docs) is case-sensitive for internal links.&lt;br /&gt;
&lt;br /&gt;
Use singular nouns, not plural:&lt;br /&gt;
* User-defined attribute&lt;br /&gt;
* '''Not:''' User-defined Attributes&lt;br /&gt;
&lt;br /&gt;
You can add plurals for internal links by added &amp;quot;s&amp;quot; or other letters after an internal link:&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;[[User-defined attribute]]s&amp;lt;/nowiki&amp;gt; are suitable for creating attributes that do not exist. To create a new [[user-defined attribute]], proceed as follows.&amp;lt;/code&amp;gt; &lt;br /&gt;
There's no need to rename all existing pages, but please use the suggested style for new pages or when merging multiple pages of similar content.  &lt;br /&gt;
&lt;br /&gt;
To make wiki markup easier to read and edit, use the standard wiki links to other wiki pages, like:&lt;br /&gt;
 &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;[[User-defined attribute]]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
'''Never use''' full urls in internal links, like: &lt;br /&gt;
 &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;[http://docs.analytica.com/index.php?title=User-defined attribute|User-defined attribute]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Titles of Analytica components, such as names of windows, functions etc ===&lt;br /&gt;
&lt;br /&gt;
Use the same name and capitalization used in the software so that the users will not be confused by different terms.&lt;br /&gt;
&lt;br /&gt;
=== Table of Contents ===&lt;br /&gt;
&lt;br /&gt;
Analytica docs automatically generates a Table of Contents for each page in a panel on the right. &lt;br /&gt;
You can ignore the standard Mediawiki Table of contents code &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;__TOC__&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
===Tables===&lt;br /&gt;
Use wikitable format to create a table:&lt;br /&gt;
Precede it by a colon (&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;)) to indent the table:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background:white; border:white&amp;quot;&amp;gt;&lt;br /&gt;
:{| class=wikitable&lt;br /&gt;
! &lt;br /&gt;
! Column 1&lt;br /&gt;
! Column 2&lt;br /&gt;
|-&lt;br /&gt;
! Row 1&lt;br /&gt;
| Cell 11&lt;br /&gt;
| Cell 12&lt;br /&gt;
|- &lt;br /&gt;
! Row 2&lt;br /&gt;
| Cell 21&lt;br /&gt;
| Cell 22&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The code above yields this table:&lt;br /&gt;
&lt;br /&gt;
:{| class=wikitable&lt;br /&gt;
! &lt;br /&gt;
! Column 1&lt;br /&gt;
! Column 2&lt;br /&gt;
|-&lt;br /&gt;
! Row 1&lt;br /&gt;
| Cell 11&lt;br /&gt;
| Cell 12&lt;br /&gt;
|- &lt;br /&gt;
! Row 2&lt;br /&gt;
| Cell 21&lt;br /&gt;
| Cell 22&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
See [[Guide to Converting Documents to MediaWiki]] for more.&lt;br /&gt;
&lt;br /&gt;
==Images==&lt;br /&gt;
Use the wiki Upload file functionality to upload image files.&lt;br /&gt;
&lt;br /&gt;
Indent images by one tab (precede by one colon (&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;)), as in:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre style=&amp;quot;background:white; border:white&amp;quot;&amp;gt;&lt;br /&gt;
:[[image:ImageFile.png]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The wiki syntax for images with centered captions on white background is as follows.&lt;br /&gt;
&lt;br /&gt;
One image:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background:white; border:white&amp;quot;&amp;gt;&lt;br /&gt;
:{|border=0&lt;br /&gt;
|bgcolor=white|[[image:ImageFile.png|frame|&amp;lt;center&amp;gt;Image caption.&amp;lt;/center&amp;gt;]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Two images side-by-side:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background:white; border:white&amp;quot;&amp;gt;&lt;br /&gt;
:{| border=&amp;quot;0&amp;quot;&lt;br /&gt;
|bgcolor=white|[[image:ImageFileOne.png|frame|&amp;lt;center&amp;gt;Image caption one&amp;lt;/center&amp;gt;]]&lt;br /&gt;
|bgcolor=white|[[image:ImageFileTwo.png|frame|&amp;lt;center&amp;gt;Image caption two&amp;lt;/center&amp;gt;]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or &lt;br /&gt;
&amp;lt;pre style=&amp;quot;background:white; border:white&amp;quot;&amp;gt;&lt;br /&gt;
:{|&lt;br /&gt;
|bgcolor=white|[[File:ImageFileOne.png|thumb|500px|&amp;lt;center&amp;gt;Image caption one&amp;lt;/center&amp;gt;]]&lt;br /&gt;
|bgcolor=white|[[File:ImageFileTwo.png|thumb|500px|&amp;lt;center&amp;gt;Image caption two&amp;lt;/center&amp;gt;]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For sample images created this way,  see [[Kernel Density Smoothing]] and [[Node Alignment, Sizing, and Spacing]].&lt;br /&gt;
&lt;br /&gt;
==Formulas==&lt;br /&gt;
Indent mathematical formulas by one tab (precede by one colon (&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;)) and surround by &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;math&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; tags, e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background:white; border:white;&amp;quot;&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
E=mc^2&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
which results in&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
E=mc^2&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For help with mathematical formulas, see the [http://en.wikipedia.org/wiki/Help:Displaying_a_formula Wikipedia help page].&lt;br /&gt;
&lt;br /&gt;
== Other typographic conventions  ==&lt;br /&gt;
&lt;br /&gt;
:{| cellpadding=&amp;quot;2&amp;quot; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! width=&amp;quot;200pt&amp;quot; | Type of Text &lt;br /&gt;
! width=&amp;quot;300pt&amp;quot; | Typography&lt;br /&gt;
! width=&amp;quot;100pt&amp;quot; | Example&lt;br /&gt;
! width=&amp;quot;300pt&amp;quot; | Wiki Code&lt;br /&gt;
|-&lt;br /&gt;
| Special Analytica term &lt;br /&gt;
| Capitalize and link when used with special Analytica meaning, but not when used in its normal sense.&lt;br /&gt;
| [[Intelligent Arrays]], [[Attributes]]&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;[[Intelligent Arrays]]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Window title, menus, menu item, dialog box title, panel title, and button label &lt;br /&gt;
| '''Bold''' &lt;br /&gt;
| '''File''', '''Attribute Panel'''&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;'''File'''&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Analytica global object identifier or title, including variable or module&lt;br /&gt;
| '''Bold'''&lt;br /&gt;
| for example variable '''X''', '''X'''&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;'''X'''&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Label of a user input such as a checkbox&lt;br /&gt;
| ''Italics'' &lt;br /&gt;
| ''Edit Attributes'' setting for the '''Preferences''' dialog&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;''Edit Attributes''&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Key on a keyboard &lt;br /&gt;
| ''Italics''&lt;br /&gt;
| &amp;quot;Press ''Enter''&amp;quot;; ''control+e'' &lt;br /&gt;
| &amp;lt;nowiki&amp;gt;Press ''Enter''&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Function name &lt;br /&gt;
| Linked (which bolds functions when on their own page) with trailing parens, &amp;quot;()&amp;quot;. No links needed when embedded in code.&lt;br /&gt;
| [[Sequence]]()&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;[[Sequence]]()&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Formal parameter name -- i.e. the declared name of a function parameter distinct from the actual parameter, which is the value or expression passed in a call to a function &lt;br /&gt;
| Use lowercase or &amp;quot;camelCase&amp;quot;; surround by by double angled brackets «a», except when inside formal parameter declaration (within parens after function name). Italicize optional parameters when inside parentheses. Code (courier) font so &amp;lt;code&amp;gt;I&amp;lt;/code&amp;gt; appears distinct from the number 1.&lt;br /&gt;
| &amp;lt;code&amp;gt;[[Sort]](a, I, ''keyIndex'' ); «a», «I», «keyIndex»&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;«a»&amp;lt;/nowiki&amp;gt;''How does one find these characters?''&lt;br /&gt;
&lt;br /&gt;
- Install English (United States) International keyboard&lt;br /&gt;
&lt;br /&gt;
- for « use AltGr (Right-Alt) + [&lt;br /&gt;
&lt;br /&gt;
- for » use AltGr (Right-Alt) + ] &lt;br /&gt;
|-&lt;br /&gt;
| parameter qualifier&lt;br /&gt;
| Capitalize to distinguish from formal parameter names &lt;br /&gt;
| Bool, Text, Number&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;Bool&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Code and script examples, expressions and variable definitions &lt;br /&gt;
| &amp;lt;code&amp;gt;Fixed width font, indented rows&amp;lt;/code&amp;gt; &lt;br /&gt;
| &amp;lt;tt&amp;gt;MDTable(T,Rows,Cols,[Car_type,Mpg],'average','n/a')&amp;lt;/tt&amp;gt;&lt;br /&gt;
| This can be done by&lt;br /&gt;
&lt;br /&gt;
1) using colons (for indentation) and code tags:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;:&amp;lt;code&amp;gt;MDTable(T, Rows, Cols, [Car_type, Mpg], 'average', 'n/a')&amp;lt;/code&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) using colons and &amp;lt;nowiki&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;/nowiki&amp;gt; tags: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;tt&amp;gt;MDTable(T, Rows, Cols, [Car_type, Mpg], 'average', 'n/a')&amp;lt;/tt&amp;gt;&amp;lt;/nowiki&amp;gt; &lt;br /&gt;
&lt;br /&gt;
3) putting a space at the beginning of the line (the code will be displayed in a gray box): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;amp;nbsp;&amp;lt;/nowiki&amp;gt;MDTable(T, Rows, Cols, [Car_type, Mpg], 'average', 'n/a')&lt;br /&gt;
&lt;br /&gt;
4) surrounding the code by &amp;lt;nowiki&amp;gt;&amp;lt;pre&amp;gt; tags (preferred method with multi-line code):&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;lt;pre style=&amp;quot;background:white; border:white; margin-left: 1em;&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MDTable(T, Rows, Cols, [Car_type, Mpg], 'average', 'n/a')&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Error message examples&lt;br /&gt;
|''&amp;lt;code&amp;gt;Fixed width font in italics, indented rows &amp;lt;/code&amp;gt;''&lt;br /&gt;
|''&amp;lt;code&amp;gt;You cannot evaluate a call to RunConsoleProcess directly from an input variable.&amp;lt;/code&amp;gt;''&lt;br /&gt;
|This can be done by&lt;br /&gt;
&lt;br /&gt;
1) using colons (:) in front of every row for indentation and &amp;lt;nowiki&amp;gt;&amp;lt;code&amp;gt; tags around every row:&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;:&amp;lt;code&amp;gt;''&amp;lt;/nowiki&amp;gt;You cannot evaluate a call to RunConsoleProcess directly from an input variable.&amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) using &amp;lt;nowiki&amp;gt;&amp;lt;pre&amp;gt;tags around text (preferred method with multi-line error messages):&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;lt;pre style=&amp;quot;background:white; border:white; margin-left: 1em; font-style:italic&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You cannot evaluate a call to RunConsoleProcess directly from an input variable.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Document name &lt;br /&gt;
| ''Italics and Capitalized''&lt;br /&gt;
| ''User Guide'' &lt;br /&gt;
| &amp;lt;nowiki&amp;gt;''User Guide''&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Conventions for explaining functions and their parameters ==&lt;br /&gt;
&lt;br /&gt;
The heading for the section of documentation on a function should contain the name of function and the most common parameters, without qualifiers. Don't include optional parameters unless they are usually used. &lt;br /&gt;
&lt;br /&gt;
* Function definition sections should use a Heading2 paragraph tag for the function title for the section.&lt;br /&gt;
&lt;br /&gt;
In some cases, we include several related functions in one section. We should then include them all in the same heading, e.g. &lt;br /&gt;
&lt;br /&gt;
===   PDF(x) and CDF(x) ===&lt;br /&gt;
&lt;br /&gt;
Conventions: Use the recommended name for each qualifier rather than its deprecated synonyms. Omit &amp;quot;Atom&amp;quot; which is of more interest to the implementer than the user of a function. &lt;br /&gt;
&lt;br /&gt;
Use these conventions for naming parameters that don't have otherwise meaningful names, to indicate what type is expected: &lt;br /&gt;
&lt;br /&gt;
*x, y, z: Numbers that may be scalar or array-valued. &lt;br /&gt;
*I, J, K: Identifiers of Index variables &lt;br /&gt;
*t, t1, t2: Text values (numbers will be coerced to text) &lt;br /&gt;
*a, b, c: An expression that may evaluate to anything: Scalar or array, number or text, NAN, or reference. &lt;br /&gt;
*p, q: A probability, a number between 0 and 1. &lt;br /&gt;
*r: A reference &lt;br /&gt;
*v: Identifier of variable. &lt;br /&gt;
*expr: An expression, which is not evaluated before calling function&lt;br /&gt;
*obj or o: A handle to an an Object (of any Class) &lt;br /&gt;
*attrib: The identifier of an Attribute&lt;br /&gt;
&lt;br /&gt;
Most named parameters in the User Guide that are not meaningful (unlike mean, min, mode) already follow these conventions. If any do not, we should consider changing them so they do. &lt;br /&gt;
&lt;br /&gt;
*Provide a page explaining these conventions, linked to from every function description.&lt;br /&gt;
&lt;br /&gt;
Each function description should have these sections (where appropriate): &lt;br /&gt;
&lt;br /&gt;
*Title of section (usually 3= level) includes name of function and most common parameters. &lt;br /&gt;
*Brief description of at least one simple case use. &lt;br /&gt;
*Example(s) &lt;br /&gt;
*Requirements: Expectations or constraints on parameters. &lt;br /&gt;
*If there are many parameters, list them as a bulleted list, explaining each one&lt;br /&gt;
*More complex examples&lt;br /&gt;
*Syntax: Near bottom using (slightly cleaned) declaration syntax.&lt;br /&gt;
&lt;br /&gt;
In this wiki, each section describing a function should contain a complete spec of its parameters, usually near the end of the section, with a format like this:&amp;lt;br&amp;gt;&amp;amp;nbsp;[[Parameter types]]: MakeDate(year: Coerce Atomic Positive; month, day: Optional Coerce Atomic Positive)&amp;lt;br&amp;gt;Note that the subhead [[Parameter types]] is a link to a page that explains the meaning of the parameter types and qualifiers.&lt;br /&gt;
&lt;br /&gt;
=== Guidelines for Analytica Docs ===&lt;br /&gt;
==== Organizing documents with multiple pages ====&lt;br /&gt;
&lt;br /&gt;
* Organize the pages into a set of &amp;quot;documents&amp;quot;, such as [[Analytica Tutorial|Tutorial]], [[Analytica User Guide|User Guide]], [[Analytica Optimizer Guide|Optimizer Guide]], [[ADE User Guide]], Analytica Reference Guide, Analytica FAQs, Analytica libraries.&lt;br /&gt;
&lt;br /&gt;
* Organize each document or section as a tree hierarchy -- i.e., where each page has a single parent -- although there may, of course, be many cross-references. A tree makes it easier for you to understand the organization, and go through all pages at a given level. It also makes it easier to generate a sequential PDF or printed document if we need to.&lt;br /&gt;
&lt;br /&gt;
* Show ancestor list (a.k.a. &amp;quot;bread crumbs&amp;quot;) at the top of each page -- i.e. a list of links to parent, grandparent etc. For example, page [[SolverInfo]] should show&lt;br /&gt;
[[Analytica Reference Guide]] &amp;gt; [[Enhancements to Optimizer in Analytica 4.0]]&lt;br /&gt;
This helps you see where you are and lets you quickly move up one or more levels.&lt;br /&gt;
&lt;br /&gt;
==== Organizing a page ====&lt;br /&gt;
&lt;br /&gt;
* Keep page names as short as reasonable.&lt;br /&gt;
&lt;br /&gt;
* Show ancestor list (see above)&lt;br /&gt;
&lt;br /&gt;
* Common subheads:&lt;br /&gt;
** Examples&lt;br /&gt;
** Syntax&lt;br /&gt;
** Tips&lt;br /&gt;
** See also&lt;br /&gt;
** History: Summarizes when a new feature was introduced or modified. Move all old links like &amp;quot;New in Release 5.1&amp;quot; when we're up to Release 5.3 to the History section (or just delete them).&lt;br /&gt;
&lt;br /&gt;
** Enhancement requests&lt;br /&gt;
** Documentation requests&lt;br /&gt;
&lt;br /&gt;
====Categories====&lt;br /&gt;
&lt;br /&gt;
The category indexes are a big benefit of MediaWiki. You can specify one or more Categories for each page. The page then automatically appears in the corresponding Category page. For example, for a page on [[MdArrayToTable]] contains the code&lt;br /&gt;
 [[:Category:Array Flattening Functions]]&lt;br /&gt;
No matter where you locate this code, it shows this at the bottom of the page:&lt;br /&gt;
 [[:Category: Array Flattening Functions]]&lt;br /&gt;
And it inserts  [[MdArrayToTable]] in the page [[:Category:Array Flattening Functions]]&lt;br /&gt;
This makes it easy for readers to find all the array-flattening functions.&lt;br /&gt;
&lt;br /&gt;
You can list multiple categories:&lt;br /&gt;
  [[:Category: Array Flattening Functions]], [[:Category: Array Functions]], [[:Category: Table functions]]&lt;br /&gt;
&lt;br /&gt;
If you want to categorize two or more items with different categories, on the same page, create a redirect page for each item with the item's name. Include a category markup in the redirect page. This might look like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[[Category:Database Functions]]&lt;br /&gt;
#REDIRECT [[Functions To Read Excel Worksheets#SpreadsheetCell]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Put the category tag(s) before the redirect or it won't work right. When linking to an item that lives on a page with other items, link to the redirect page, i.e., use &amp;lt;pre&amp;gt;[[SpreadsheetCell]]&amp;lt;/pre&amp;gt;, not &amp;lt;pre&amp;gt;[[Functions To Read Excel Worksheets#SpreadsheetCell]]&amp;lt;/pre&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If the heading within the page you redirect to has extra stuff in the heading, for example:&lt;br /&gt;
&amp;lt;pre&amp;gt;===SpreadsheetCell(wb, sheet, col, row)===&amp;lt;/pre&amp;gt;&lt;br /&gt;
Make a simple anchor tag using a div tag such as&lt;br /&gt;
&amp;lt;pre&amp;gt;===&amp;lt;div id=&amp;quot;SpreadsheetCell&amp;quot;&amp;gt;SpreadsheetCell(wb, sheet, col, row)&amp;lt;/div&amp;gt;===&amp;lt;/pre&amp;gt;&lt;br /&gt;
This way you can use just &amp;quot;#SpreadsheetCell&amp;quot; in the redirect URL.&lt;br /&gt;
&lt;br /&gt;
==History==&lt;br /&gt;
&lt;br /&gt;
* Many features have links from and to a &amp;quot;What's new&amp;quot; page for the release in which they were first introduced or modified, e.g. [[What's new in Analytica 5.0?]].&lt;br /&gt;
* Ideally, links to a &amp;quot;What's new&amp;quot; page should only exist for the most recent release -- e.g. [[What's new in Analytica 5.4?]]. Ancient history is of little interest to 99% of readers.&lt;br /&gt;
* So, when working on a page, please move information about when a feature was introduced or modified for older releases to the '''History''' section at the end of each page.&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
Every page should have a '''See Also''' section, with links to pages on related topics that someone reading this page may find useful. In this case:&lt;br /&gt;
&lt;br /&gt;
* [[Analytica model style guide]] for Analytica code and model documentation&lt;br /&gt;
* [[Guide to Converting Documents to MediaWiki]]&lt;br /&gt;
* [[Ana:Pages needing work]]&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=AcpStyles&amp;diff=63762</id>
		<title>AcpStyles</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=AcpStyles&amp;diff=63762"/>
		<updated>2026-02-24T20:59:18Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: /* ACP styles inheritance */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Analytica Cloud Platform]]&lt;br /&gt;
[[Category: Attributes]]&lt;br /&gt;
[[Analytica_Cloud_Player|&amp;lt;&amp;lt;Analytica Cloud Platform ]]&lt;br /&gt;
&lt;br /&gt;
::{{ReleaseBar}}&lt;br /&gt;
&lt;br /&gt;
ACP offers a wide variety of styles and options to control the look and functioning of the user interface. Many of these go beyond what is (currently) available in Desktop Analytica (DTA). &lt;br /&gt;
&lt;br /&gt;
The easiest way to set these styles and options is to use the [[ACP Style Library]], which you can load into your model within ACP from the hamburger menu.  As you change styles in ACP, you can see their effects immediately.  &lt;br /&gt;
&lt;br /&gt;
If you use [[ACP Style Library]] you don't need to learn about the ACP Styles described below. The only reason to read the rest of this page is if you want to do something esoteric with AcpStyles, or use one of the few AcpStyles not accessible in the [[ACP_Style_Library]]. &lt;br /&gt;
&lt;br /&gt;
You can also load the  [[ACP Style Library]] in Analytica on the desktop from the '''Add Library...' option from the '''File''' menu. But, you won't be able to see the effects until you upload the model into ACP.&lt;br /&gt;
&lt;br /&gt;
The styles and options are specified as keywords and tags in the AcpStyles  attribute. Most styles and options apply to the whole Model and are specified in the AcpStyles attribute of the Model.  When you want to specify special styles for individual modules or variables, you apply them to the ACPStyles attribute of the relevant object.&lt;br /&gt;
 &lt;br /&gt;
The easiest way to view and edit the AcpStyles  attribute in Desktop Analytica is to use the [[Attribute panel]].  Select AcpStyles  from the list of Attributes at the top of that panel. By default, AcpStyles is not shown in the [[Object window]], so you first need to set it to be shown either with the [[Object_Window|right click menu]] in the Object window, or in the [[Manage attributes|Attributes dialog]].  &lt;br /&gt;
&lt;br /&gt;
The AcpStyles  and their flags are not case sensitive.  &lt;br /&gt;
&lt;br /&gt;
When you put multiple flags in a AcpStyles attribute, put each flag on a separate line. &lt;br /&gt;
&lt;br /&gt;
== Model level styles  ==&lt;br /&gt;
&lt;br /&gt;
These styles apply to the entire model. You set them in the AcpStyles attribute for the Main Model. (They have no effect when set for a submodule.)&lt;br /&gt;
&lt;br /&gt;
=== Navigation style  ===&lt;br /&gt;
&lt;br /&gt;
These Navigation_style options control how a user can view and access the module hierarchy:&lt;br /&gt;
* '''&amp;lt;code&amp;gt;Navigation_style: Outline&amp;lt;/code&amp;gt;''' -- Show an expandable tree of modules on the left of the ACP window, similar to the outline view in desktop Analytica (showing only modules not other objects). This is the default style when you upload a model with no ACP styles set or no Acp styles library embedded, or if you have not yet set the Navigation style in the Acp styles library. A navigation flag is not needed for this style, but if you want to explicitly set this style you can add '''&amp;lt;code&amp;gt;Navigation_style: Outline&amp;lt;/code&amp;gt;''' to the top diagram's AcpStyles attribute.&lt;br /&gt;
&lt;br /&gt;
*'''&amp;lt;code&amp;gt;Navigation_style: Top diagram only&amp;lt;/code&amp;gt;''' -- Show only the top diagram, with no Outline and no tabs. This lets you make a simple web application with a single UI page.  &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For the next two  'Tabbed application' styles, each module in the main model becomes a tab. The order of the tabs follows the sequence of the module nodes in the main diagram, from  left to right then top to bottom. &lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;code&amp;gt;Navigation_style: Top_tabs&amp;lt;/code&amp;gt;''' -- The main modules in the top model appear as a row of tabs across the top of the window. Click a tab to show the diagram for that module. &lt;br /&gt;
&amp;lt;!--Remove for now* '''&amp;lt;code&amp;gt;Navigation_style: Two_top_tabs&amp;lt;/code'''&amp;gt; --  The main modules in the top model appear as a row of tabs. The submodules of the module whose tab is selected appear as a second row of tabs. Needs to be used with the style'''&amp;lt;code&amp;gt;show_as_tab: no&amp;lt;/code&amp;gt;'''. --&amp;gt;&lt;br /&gt;
*'''&amp;lt;code&amp;gt;Navigation_style: Side_tabs&amp;lt;/code&amp;gt;''' -- The main modules in the top model appear as a column of tabs on the left of the window. Click a tab to show the diagram for that module.&lt;br /&gt;
&amp;lt;!--Remove for now * '''&amp;lt;code&amp;gt;Navigation_style: Two_side_tabs&amp;lt;/code&amp;gt;'''  -- The top tabs reflect the main modules in the top model. Clicking a top tab shows a a set of subtabs, reflecting the submodules of main module (tab) selected. Needs to be used with the style '''&amp;lt;code&amp;gt;show_as_tab: no&amp;lt;/code&amp;gt;'''.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We describe each in more detail below.&lt;br /&gt;
&lt;br /&gt;
===Outline Tree===&lt;br /&gt;
&lt;br /&gt;
By default, when using the Outline Navigation style, ACP shows an expandable outline tree of modules on the left hand side of the window, similar to the Outline view in Analytica on the desktop. This makes it easy to navigate a model with an extensive hierarchy of modules. &lt;br /&gt;
&lt;br /&gt;
*'''&amp;lt;code&amp;gt;Show_outline: yes&amp;lt;/code&amp;gt;''' -- The default, and unecessary for Outline Navigation style. It is generally redundant with other Navigation styles since the tabs or hierarchy show the same information, and the Outline takes up screen space. But you can add  it to the top diagram's AcpStyles attribute if you want to show the Outline tree with other Navigation styles.&lt;br /&gt;
&lt;br /&gt;
{{CalloutAnnotationBlock|[[File:Outline tree 6.0 01.png]]|{{CalloutAnnotation|Market model with&amp;lt;br&amp;gt;Outline Tree|v=80|pt=10,106}}}}&lt;br /&gt;
*'''&amp;lt;code&amp;gt;show_outline: no&amp;lt;/code&amp;gt;''' --  When using the Acp Style library this is set by default for Navigation styles other than Outline. For small models, and most web apps, you may want to suppress the Outline view even when using the Outline Navigation style. Do this by inserting this text into the top diagram's AcpStyles attribute (See image below). (If a model has only one diagram,  i.e. with no modules, it never shows the outline tree.)&amp;lt;br/&amp;gt;&lt;br /&gt;
{{CalloutAnnotationBlock|[[File:Outline tree 6.0 02.png]]|{{CalloutAnnotation|Market model with &amp;lt;br/&amp;gt;'''&amp;lt;code&amp;gt;show_outline: no&amp;lt;/code&amp;gt;'''|v=80}}}}&lt;br /&gt;
&lt;br /&gt;
===Top Diagram Only===&lt;br /&gt;
&lt;br /&gt;
Set by adding '''&amp;lt;code&amp;gt;navigation_style: top_diagram_only&amp;lt;/code&amp;gt;''' to the AcpStyles attribute of the top diagram. &amp;lt;!--Not to be confused with the AcpStyles flag of similar name: '''&amp;lt;code&amp;gt;top_diagram_only: yes&amp;lt;/code&amp;gt;'''. -This is a navigation style most easily set with the ACP styles library. --&amp;gt; The Styles library will set the flag &amp;lt;!--'''&amp;lt;code&amp;gt;top_diagram_only:yes&amp;lt;/code&amp;gt;''',--&amp;gt; '''&amp;lt;code&amp;gt;show_outline:no&amp;lt;/code&amp;gt;''' .&lt;br /&gt;
&lt;br /&gt;
===Tabbed Module Navigation===&lt;br /&gt;
&lt;br /&gt;
As an alternative to the Outline view, you can set the '''&amp;lt;code&amp;gt;Navigation_style&amp;lt;/code&amp;gt;''' to use use a tabbed interface which is often more convenient and familiar for web applications. By default, the main model appears as the first tab. You can change this with the style [[AcpStyles_Attribute_Values#Exclude_the_top_level_diagram_from_tabs|show_as_tab:no]] described below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Replace this section with one that does not talk about two tabs for now - until they are implemented in ACP3 - There are four tabbed styles, Top_tabs and Two_top_tabs, with one or two rows of tabs across the top, respectively; and Side_tabs and Two_side_tabs with one or two columns of tabs down the side. Top_tabs works well if you have up to 5 to 8 modules in the main diagram (tabs), depending on the length of their titles and the width of the ACP window.  If you have a lot of modules, or they have long titles, it may be better to use Side_tabs.  If you have too many modules to fit at the top or side, you can use Two_top_tabs or Two_side_tabs. In those cases, you must organize the modules into a two-level hierarchy with logical groupings. &lt;br /&gt;
&lt;br /&gt;
'Top tabs or side tabs.' The first tab displays the top level diagram, and the remaining tabs display the modules present on the top level diagram of the model.  (The modules will not display on the diagram, so you need to tweak your diagram for playing in ACP so that it looks right without these present). The size of the diagram is determined by the size of the top level diagram window when the model was last saved in Analytica.&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;code&amp;gt;navigation_style: top_tabs&amp;lt;/code&amp;gt;''' This setting instructs ACP to use the 'Tabs across top' navigation style.&lt;br /&gt;
&lt;br /&gt;
:[[File:Top tabs 6.0 01.png]]&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;code&amp;gt;navigation_style: side_tabs&amp;lt;/code&amp;gt;''' This setting instructs ACP to use the 'Side tabs' navigation style.  Side tabs work better than top tabs when there are more module nodes present.&lt;br /&gt;
&lt;br /&gt;
:[[File:Side tabs 6.0 01.png]]&lt;br /&gt;
* &amp;lt;code&amp;gt;Navigation_style: Two_top_tabs&amp;lt;/code&amp;gt; &lt;br /&gt;
* &amp;lt;code&amp;gt;Navigation_style: Two_side_tabs&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''These 2 Navigation styles replace the style  &amp;lt;code&amp;gt;two_tiers_tabs:yes&amp;lt;/code&amp;gt; which has been deprecated.'''&lt;br /&gt;
&lt;br /&gt;
These styles are useful for modules with several layers of modules and submodules - to reduce the clutter of the top layer of tabs. Modules in the model's top diagram appear as top tabs (left tabs).  Modules within those top level modules appear as subtabs,  the 'second tier'. When you select a top-level tab, it shows its submodules as subtabs. This means that the top level of modules will not show any contents other than their submodules, so the model needs to be designed with this in mind.&lt;br /&gt;
*Currently these 2 styles must be used with the '''&amp;lt;code&amp;gt;show_as_tab: no&amp;lt;/code&amp;gt;''' style set. &amp;lt;!--Coming soon: Compatibility with '''&amp;lt;code&amp;gt;show_as_tab: yes&amp;lt;/code&amp;gt;'''&lt;br /&gt;
*The selected tab appears with the color of the diagram background of it's module&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
There are two tabbed styles, Top_tabs, with a row of tabs across the top; and Side_tabs with a column of tabs down the side. Top_tabs works well if you have up to 5 to 8 modules in the main diagram (tabs), depending on the length of their titles and the width of the ACP window.  If you have a lot of modules, or they have long titles, it may be better to use Side_tabs.  &lt;br /&gt;
&lt;br /&gt;
'Top tabs or side tabs.' The first tab displays the top level diagram, and the remaining tabs display the modules present on the top level diagram of the model.  (The modules will not display on the diagram, so you need to tweak your diagram for playing in ACP so that it looks right without these present). &lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;code&amp;gt;navigation_style: top_tabs&amp;lt;/code&amp;gt;''' -- This setting instructs ACP to use the 'Tabs across top' navigation style.&lt;br /&gt;
&lt;br /&gt;
[[File:Top tabs 6.0 01.png]]&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;code&amp;gt;navigation_style: side_tabs&amp;lt;/code&amp;gt;''' -- This setting instructs ACP to use the 'Side tabs' navigation style.  Side tabs work better than top tabs when there are more module nodes present.&lt;br /&gt;
&lt;br /&gt;
[[File:Side tabs 6.0 01.png]]&lt;br /&gt;
&lt;br /&gt;
=== Toolbar Tabs ===&lt;br /&gt;
*'''&amp;lt;code&amp;gt;show_tabs: no&amp;lt;/code&amp;gt;''' -- By default, with the Outline Navigation style. ACP shows navigation tabs for &amp;quot;Diagram&amp;quot;, &amp;quot;Object&amp;quot;, &amp;quot;Table&amp;quot;, &amp;quot;Graph&amp;quot; along the top. Use this flag to hide those tabs. If you display the model inputs and outputs on the diagram -- using embedded tables and graphs on the diagram -- your users may not need those tabs.  (You can also use '''&amp;lt;code&amp;gt;show_tabs: yes&amp;lt;/code&amp;gt;''' to explicitly show the tabs in Outline and Top diagram only Navigation styles.) &lt;br /&gt;
{{CalloutAnnotationBlock|[[File:Show tabs no 6.0 0.1.png]]|{{CalloutAnnotation|Market model with &amp;lt;br/&amp;gt;'''&amp;lt;code&amp;gt;show_tabs: no&amp;lt;/code&amp;gt;'''|v=80|pt=232,37|path=t!-}}}}&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Module hierarchy bar ===&lt;br /&gt;
Using tabbed navigation, ACP shows the model hierarchy in a bar at the top of the diagram by default. The model hierarchy header shows you where you are in a large model by listing the titles of the ancestor modules in which the current diagram is nested.  You can click any ancestor to click up levels in the hierarchy. The Hierarchy Bar takes up much less screen real estate than the Outline Tree. ACP doesn't show the hierarchy bar when you are viewing a top level module, or if the module title is already in the selected tab. &amp;lt;!--With a two-level tab navigation, it shows the hierarchy bar only when viewing a module nested 3 or more levels down. Basically, the hierarchy header does not duplicate what you can see in the tabs.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that this setting is not based on a AcpStyles attribute, but rather on the ''Show module hierarchy'' check box in the model [[Preferences]] in Analytica.  If you want to set this preference manually, with the model opened in Analytica, on the [[Edit menu]], select '''Preference...''', and check (or uncheck) the ''Show module hierarchy'' checkbox. &lt;br /&gt;
&lt;br /&gt;
If you are using the ACP styles library, the Styles library will set this to the default setting automatically once you select a Navigation style. But you have the option of changing it if, for instance you want to show the Outline and the Hierarchy bar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--:[[Image:Acp hh.png]]--&amp;gt;&lt;br /&gt;
===Auto zoom ===&lt;br /&gt;
*'''&amp;lt;code&amp;gt;auto_zoom_diagrams: yes&amp;lt;/code&amp;gt;''' -- ACP automatically zooms the UI to fit the browser window -- the most constraining of width or height so it retains the aspect ratio of the diagram. Works with zoom in and zoom out. Auto Zoom will allow a model to go down to 50% of its size or up to 200% of its size. If the model does not fit at 50% size, the window will show scroll bars. This Acp style has no effect if '''&amp;lt;code&amp;gt;Use_top_diagram_size:Yes &amp;lt;/code&amp;gt;''' is present, you can use only one or the other. You can also set '''&amp;lt;code&amp;gt;auto_zoom_diagrams: no&amp;lt;/code&amp;gt;''' which is the default. (This is a model level setting and is added to the top diagram of a model).&lt;br /&gt;
&lt;br /&gt;
===Customize zoom levels===&lt;br /&gt;
AcpStyles for controlling the max/min zoom when '''&amp;lt;code&amp;gt;auto_zoom_diagram: yes&amp;lt;/code&amp;gt;''' is set. The default if these styles are not set is as above - 50% and 200%. The easiest way to set these is with the [[ACP_Style_Library]] - where the controls are in the Esoteric ACP styles module. This is available from the Hamburger menu in ACP. Note that in order to see this effect, the '''&amp;lt;code&amp;gt;Browser window size&amp;lt;/code&amp;gt;''' needs to have the screen size pulldown menu set to '''&amp;lt;code&amp;gt;Auto zoom&amp;lt;/code&amp;gt;''' as well. &lt;br /&gt;
*'''&amp;lt;code&amp;gt;zoom_min_percent: 75&amp;lt;/code&amp;gt;''' (means that the minimum zoom level will be 75% or .75)&lt;br /&gt;
*'''&amp;lt;code&amp;gt;zoom_max_percent: 125&amp;lt;/code&amp;gt;''' (means the that max zoom level will be 125% or 1.25)&lt;br /&gt;
&lt;br /&gt;
===Use top diagram size for all ACP windows===&lt;br /&gt;
*'''&amp;lt;code&amp;gt;Use_top_diagram_size:Yes &amp;lt;/code&amp;gt;''' --  Sets the size of all diagrams based on the size of the diagram window of the top level when the model was last viewed in Desktop Analytica (in non-maximized mode).  '''&amp;lt;code&amp;gt;Use_top_diagram_size:No &amp;lt;/code&amp;gt;''' is the same as if the flag is not set, and is the default  - the ACP diagram will use the entire browser window.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Not in ACP3 yet - ER519&lt;br /&gt;
===Display Only a Single Diagram===&lt;br /&gt;
*'''&amp;lt;code&amp;gt;top_diagram_only: yes&amp;lt;/code&amp;gt;''' -- Use this flag if you want to restrict users access to only the top diagram. With this flag, any action that would normally bring up a different diagram will just reload the top diagram.  (If you are using this setting, you will also want to also not display the Outline Tree as explained above, since clicking on the modules in the Outline will have no effect.)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
===Show or hide the Dashboard Title and Model title===&lt;br /&gt;
*'''&amp;lt;code&amp;gt;show_model_title: no&amp;lt;/code&amp;gt;''' -- Hide the title of the model, which appears by default in the top Teal bar.&lt;br /&gt;
&lt;br /&gt;
*'''&amp;lt;code&amp;gt;show_diagram_title: yes&amp;lt;/code&amp;gt;''' --  Use  to show the dashboard title at the top of the diagram. Or &amp;lt;code&amp;gt;show_diagram_title: no&amp;lt;/code&amp;gt; to suppress the diagram title, but not really necessary because ACP does not show the diagram title by default.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Hide the Banner and Logo===&lt;br /&gt;
Another flag it's easier to use the [[ACP Style Library]] to set, since it is only compatible with the toolbar tabs hidden. The Styles library changes all the flags at once, and prevents you from entering incompatible combinations.&lt;br /&gt;
&lt;br /&gt;
*'''&amp;lt;code&amp;gt;show_banner: no&amp;lt;/code&amp;gt;''' &lt;br /&gt;
::Hides the banner space usually present at the top of ACP. The banner typically contains the Lumina Logo, the '''Parent Diagram''' button, tabs, '''Close Model''' button, and '''Save''' button.&lt;br /&gt;
&lt;br /&gt;
:*This could be useful for customizing the appearance of a model [[Putting_ACP_in_a_Web_Page|embedded in a web page]], for instance.&lt;br /&gt;
:[[File:Banner area 01.PNG]]&lt;br /&gt;
:*If you play a model without the banner area in ACP, there isn't a convenient way to close the model without closing the browser.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Exclude diagram(s) from tabs===&lt;br /&gt;
&lt;br /&gt;
When using tabbed navigation, you can select those modules (from the top model diagram) that you want to appear as a tab in ACP. The default is for all to appear as tabs. You should use the ''Show modules as tabs'' choice menu in the '''&amp;lt;code&amp;gt;ACP Navigation styles&amp;lt;/code&amp;gt;''' section of the [[ACP Style Library]] if you want to set this flag,, and if you also want to hide the modules corresponding to these tabs [[ChangeNodeVisibility|hidden]], so that the model viewer cannot see them.&lt;br /&gt;
&lt;br /&gt;
*Optionally, Enter the text '''&amp;lt;code&amp;gt;Show_as_tab: no&amp;lt;/code&amp;gt;''' in the AcpStyles attribute of the modules you don't wish to show as a tab. The modules themselves will not be hidden with this setting, only the tabs.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
*'''&amp;lt;code&amp;gt;show_as_tab: no&amp;lt;/code&amp;gt;''' &lt;br /&gt;
::Excludes the top level diagram and just shows the submodules of the top level diagram as tabs. Since the top diagram will not display in ACP, you include the key user interface pages as modules in the main model. Can be used only with 'Top tabs' or 'Side tabs' styles. &lt;br /&gt;
*When setting tabbed Navigation styles using the ACP Styles Library, the default is for the Top level diagram to be included, except with two tiers of tabs, for which it is (Currently) required to exclude the top diagram from the tabs.&lt;br /&gt;
&lt;br /&gt;
If you want to see what it looks like, play this model [[Media:Show as tab no.ana|Array examples]] in ACP, with the '''&amp;lt;code&amp;gt;show_as_tab: no&amp;lt;/code&amp;gt;''' style in the AcpStyles  attribute, and set to tabs along top.&lt;br /&gt;
&lt;br /&gt;
:[[File:Show as tab no02.png]]&lt;br /&gt;
&lt;br /&gt;
*Play this model in ACP and the top level diagram does not show. Rather the diagram for 'Intro to Arrays' shows as the first tab and then the other tabs.'''&lt;br /&gt;
&lt;br /&gt;
:[[File:Show as tab no01.png]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
===Tab color===&lt;br /&gt;
&lt;br /&gt;
When using Tabbed Navigation, you can use these flags to control how the color of the tabs display on your model in ACP. To use, add one of them to the AcpStyles attribute of the top level diagram of your model. They have no effect if added to a module other than the top diagram.&lt;br /&gt;
&lt;br /&gt;
*'''&amp;lt;code&amp;gt;Tab_color: Default &amp;lt;/code&amp;gt;''' The default. Non-selected tabs are bluish white. The selected tab uses the background color for that diagram.&lt;br /&gt;
*'''&amp;lt;code&amp;gt;Tab_color: Background &amp;lt;/code&amp;gt;''' All tabs use their diagram background color, whether selected or not&lt;br /&gt;
*'''&amp;lt;code&amp;gt;Tab_color: Node &amp;lt;/code&amp;gt;'''  The selected Tab uses its diagram background color; The other tabs use the color of their Module node (not their diagram background color).  You can use this to change the color of the tabs by modifying their node color in an Analytica functions.&lt;br /&gt;
&lt;br /&gt;
== Model level styles for diagram nodes. ==&lt;br /&gt;
&lt;br /&gt;
These model-level styles affect how all nodes are displayed in diagrams.  &lt;br /&gt;
&lt;br /&gt;
=== Node shadows and bevels  ===&lt;br /&gt;
&lt;br /&gt;
By default ACP displays nodes without shadows or bevels (for now) , so they look like this:&lt;br /&gt;
:[[Image:Nodes no shadow or bevel.png]] &lt;br /&gt;
&lt;br /&gt;
Set this flag to show a drop shadow behind each node, giving a kind of 3D effect:&lt;br /&gt;
&lt;br /&gt;
*'''&amp;lt;code&amp;gt;node_drop_shadow: yes&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
:[[Image:Nodes drop shadow.png]] &lt;br /&gt;
&lt;br /&gt;
Set this flag to display a bevel border for each node, giving another kind of 3-D effect: &lt;br /&gt;
*'''&amp;lt;code&amp;gt;bevel_node_border: yes&amp;lt;/code&amp;gt;''' &lt;br /&gt;
&lt;br /&gt;
:[[Image:Nodes beveled border.png]] &lt;br /&gt;
&lt;br /&gt;
===Node hover highlighting===&lt;br /&gt;
&lt;br /&gt;
By default, ACP displays a highlight -- a contrasting light rectangle behind a node -- when you move the cursor over the node:&lt;br /&gt;
&lt;br /&gt;
[[File:acp hover hl.png]]&lt;br /&gt;
&lt;br /&gt;
You can switch it off by setting:&lt;br /&gt;
*'''&amp;lt;code&amp;gt;show_hover_highlight: No&amp;lt;/code&amp;gt;''' &lt;br /&gt;
&lt;br /&gt;
=== Balloon Help  ===&lt;br /&gt;
&lt;br /&gt;
When you move the cursor over a node, ACP usually shows a &amp;quot;balloon&amp;quot; popup next to the node with the description of the node (if it has one) to help end users understand what its for, or what to enter for a user input. If the node has no description, the [[help balloons|balloon help]] will not appear.&lt;br /&gt;
&lt;br /&gt;
*'''&amp;lt;code&amp;gt;show_id_in_balloon: yes&amp;lt;/code&amp;gt;''' Use this flag to show each node's identifier below its title in the balloon -- unless the identifier and title are identical (except for spaces which are replaced by underscores). This flag goes in the AcpStyles of the model and apply to all nodes in the model.&lt;br /&gt;
&amp;lt;!-- not implemented in ACP3 &lt;br /&gt;
*'''&amp;lt;code&amp;gt;show_definition_in_balloon: yes&amp;lt;/code&amp;gt;''' &lt;br /&gt;
::Use this flag to show the node's definition in the balloon below the description.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!-- not implemented in ACP3 &lt;br /&gt;
*'''&amp;lt;code&amp;gt;hover_balloon_delay&amp;lt;/code&amp;gt;''' &lt;br /&gt;
::When you mouse over a node, there's a short delay of about half a second before it displays the balloon (to prevent wild balloon appearance when you move the cursor rapidly over a diagram.) You can tweak this delay time measured in milliseconds by inserting this flag. E.g. '''&amp;lt;code&amp;gt;hover_balloon_delay: 200&amp;lt;/code&amp;gt;''' to reduce the delay to .2 seconds.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The flags above go in the AcpStyles of the model and apply to all nodes in the model. You can also modify some aspects of the balloon separately for each node by inserting these flags in AcpStyles for each node: --&amp;gt;&lt;br /&gt;
*'''&amp;lt;code&amp;gt;show_hover_balloon: no&amp;lt;/code&amp;gt;'''&lt;br /&gt;
::Insert this flag in the AcpStyles for a node, to suppress display of its balloon.&lt;br /&gt;
&amp;lt;!--title no longer shows in the balloon&lt;br /&gt;
*'''&amp;lt;code&amp;gt;show_hover_balloon_title: no&amp;lt;/code&amp;gt;'''&lt;br /&gt;
::Insert this flag in the AcpStyles for a node, to suppress its title in the balloon.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ACP styles inheritance==&lt;br /&gt;
This is the order of inheritance for Acpstyles below that apply to tables and graphs. Styles at a higher level take precedence over the lower precedence styles. (Inheritance doesn't apply to the ACPstyles described above tbecause they work only at the Model level.)&lt;br /&gt;
# '''Variable''' (includes Tall nodes): Acpstyles applied to an individual variable will take precedence over all other styles. A variable with a style of &amp;lt;code&amp;gt;show_title:no&amp;lt;/code&amp;gt; will not show the title, even if the model level style is &amp;lt;code&amp;gt;show_title:yes&amp;lt;/code&amp;gt;, and if that node shows it's result in a frame node the variable style will override the frame node style.&lt;br /&gt;
# '''Frame''' : An Acpstyle set for a frame node will affect any variable shown in that frame that doesn't have its own settings. These will also override any styles at the model level.&lt;br /&gt;
# '''Model ACP style defaults''': Acpstyles that you can enter into the Acptyles attribute of the top diagram of your model. These will override the ACP defaults, and will be inherited by frame nodes and variables in the model that don't have their own Acpstyle.&lt;br /&gt;
# '''ACP style defaults for ACP''': The default style ACP uses if you have no specific setting for that style. Eg for show_index_menus the default is fly-in and that is what will show if you don't enter a different show_index_menus: Acpstyle flag in the Acpstyle for the top diagram (model level) or for frame nodes or variables.&lt;br /&gt;
&lt;br /&gt;
==ACP Styles for tables and graphs==&lt;br /&gt;
&lt;br /&gt;
These styles affect how result graphs and tables are displayed in ACP, including in [[Embed_table_or_graph_with_ACP#Frame_nodes|Tall nodes]] and [[Embed_table_or_graph_with_ACP#Tall_nodes|˞Frame nodes]]. They provide options not (yet) available in Desktop Analytica. ACP has default settings for these. You can override these settings for the entire model. You can also set them for [[Embed_table_or_graph_with_ACP#Frame_nodes|˞Frame nodes]], which will apply to all results shown in the Frame and override the ACP and model level settings. And you can set these styles for individual variables, which will override any settings in the Model or Frame. As always, it's easiest to set the using the [[ACP_Style_library]]. &lt;br /&gt;
&lt;br /&gt;
None of these styles apply to tab result views using the default Navigation_style: Outline.&lt;br /&gt;
&lt;br /&gt;
===Show or hide the Description===&lt;br /&gt;
&lt;br /&gt;
*'''&amp;lt;code&amp;gt;Show_description: n&amp;lt;/code&amp;gt;''' If &amp;lt;code&amp;gt;n &amp;gt; 0 &amp;lt;/code&amp;gt; it shows the Description of the variable above the table or graph using up to n% of the vertical space available. If that's not big enough to show the entire description, it shows a vertical scroll bar. Iif you don't want to show the description at all, set &amp;lt;code&amp;gt;n = 0&amp;lt;/code&amp;gt;. Default if not mentioned, is one third, i.e. &amp;lt;code&amp;gt;Show_description: 33&amp;lt;/code&amp;gt;.  You can set this style at the model level for all Frame or Tall nodes, and you can override this default for any individual node.&lt;br /&gt;
&lt;br /&gt;
===Show or hide the Object view icon===&lt;br /&gt;
*'''&amp;lt;code&amp;gt;Object_in_Frame:yes/no&amp;lt;/code&amp;gt;''': With this style set, it shows an object view hover icon at the top right of a frame node or tall node when showing a graph or table view. Click this icon to show the object window view. The object view shows the Table and Graph hover icon to go back to the table or graph view.  You can set '''&amp;lt;code&amp;gt;Object_in_frame&amp;lt;/code&amp;gt;''' style at either the top level of the model or in an individual frame node, which overrides the top level setting. When working with tall nodes, you can set '''&amp;lt;code&amp;gt;Object_in_frame&amp;lt;/code&amp;gt;''' style at the top level or in the original variable's ACP style setting, which overrides the top level setting.&lt;br /&gt;
&lt;br /&gt;
===Show or hide the title===&lt;br /&gt;
&lt;br /&gt;
*'''&amp;lt;code&amp;gt;Show_title&amp;lt;/code&amp;gt;''': Set &amp;lt;code&amp;gt;Show_title: yes&amp;lt;/code&amp;gt; to show or &amp;lt;code&amp;gt;Show_title: no&amp;lt;/code&amp;gt; to stop showing the Title and units of a selected variable. This style can be used at the model level, for frame nodes or for individual nodes, but controls  whether or not the Title and units show in Frame nodes or tall nodes. &lt;br /&gt;
&lt;br /&gt;
===Show or hide the Graph-Table icon===&lt;br /&gt;
&lt;br /&gt;
*'''&amp;lt;code&amp;gt;Show_graph_table_icon:no&amp;lt;/code&amp;gt;''' Hides the icon in the top right of a Result that lets you toggle between Graph and Table view. This applies to [[Embed_table_or_graph_with_ACP|Frame nodes and tall nodes]]. This style can be used for  the entire model, for frame nodes or for individual nodes . You set them in the AcpStyles attribute.  Conversely, you can set  '''&amp;lt;code&amp;gt;Show_graph_table_icon:yes&amp;lt;/code&amp;gt;'''. This is the default so not usually necessary at the model level, but can be used in a frame node or variable to override the model default or override a frame node setting.&lt;br /&gt;
&lt;br /&gt;
===Show or hide the Uncertainty view menu===&lt;br /&gt;
By default, in ACP, as in desktop Analytica, the [[Uncertainty views]] menu appears above each result graph or table to let you select [[Mid]] to display its deterministic value, or Mean, Probability distribution, and other ways to display a probabilistic value.  &lt;br /&gt;
&lt;br /&gt;
You can override this default behavior with this ACP style for the entire model, [[Embed_table_or_graph_with_ACP#Frame_nodes|Frame nodes]], or for individual variables. The Uncertainty view menu is always present in tab result views.&lt;br /&gt;
*'''&amp;lt;code&amp;gt;Show_uncertainty_view: No&amp;lt;/code&amp;gt;''' Never show the uncertainty menu in frame nodes or tall result nodes. Suitable for models with no probabilistic values, or if you want to fix a particular probabilistic view for each frame node or variable so that ACP users can't change it.&lt;br /&gt;
*'''&amp;lt;code&amp;gt;Show_uncertainty_view: Yes&amp;lt;/code&amp;gt;''' Always show the uncertainty menu even for variables that are not probabilistic, as in Desktop Analytica. This is the default and not normally necessary at the model level, but can be used to customize which frame nodes or variables to show the uncertainty view menu when the model level style is set to '''&amp;lt;code&amp;gt;Show_uncertainty_view: No&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
===Show or hide the Index menus and Pivoters/slicers===&lt;br /&gt;
*'''&amp;lt;code&amp;gt;Show_index_menus: Fly-in&amp;lt;/code&amp;gt;''' By default (the same as if there is no show_index_menu: setting) the index menus are not shown in [[https://wiki.analytica.com/index.php?title=Embed_table_or_graph_with_ACP|frame nodes or tall nodes]] (but slicers are), since often the modeler has already chosen the pivot they want to use. And because these menus take up valuable screen space. But if you hover over the frame node (or tall node) there is a fly-in pivoter control. If you click this it toggles - on or off - the visibility of the pivoters; allowing you to pivot the result table or graph and then close the pivoters to give you more space.&lt;br /&gt;
*'''&amp;lt;code&amp;gt;Show_index_menus: Yes&amp;lt;/code&amp;gt;''' If you do want to allow users to be able to pivot or change the slice of the table or graph, without using the fly-in, then use use show_index_menus:yes. Always present in tab result views.&lt;br /&gt;
*'''&amp;lt;code&amp;gt;Show_index_menus: No&amp;lt;/code&amp;gt;''' If show_index_menus:no is set then the indexes and pivoters will not show and there is no fly-in, but the slicers will still be present.&lt;br /&gt;
*'''&amp;lt;code&amp;gt;Show_index_menus: Not_even_slicers&amp;lt;/code&amp;gt;''' If you don't want to show any pivoters or slicers, you can set show_index_menus:Not_even_slicers.&lt;br /&gt;
&lt;br /&gt;
===Table filtering===&lt;br /&gt;
'''&amp;lt;code&amp;gt;Show_Table_Filtering: no&amp;lt;/code&amp;gt;''' Turns off the ability to filter tables by column, and reverts to the previous sort functionality. [[Tables_in_ACP#Sort_columns]]&amp;lt;br /&amp;gt;&lt;br /&gt;
'''&amp;lt;code&amp;gt;Show_Table_Filtering: yes&amp;lt;/code&amp;gt;''' The default - shows the table filtering icons&lt;br /&gt;
&lt;br /&gt;
===Autocalc===&lt;br /&gt;
&lt;br /&gt;
In the  [[ACP Style Library]], Autocalc looks like a style you can set for a model, module or variable. It controls whether ACP evaluates each variable and shows its results automatically when you view a Diagram or tab showing the -- instead of the default Analytica behavior where the end user has to click on a Calc button to compute a result.  With Autocalc on, a result in view also recomputes automatically when you change an input that influences it.&lt;br /&gt;
&lt;br /&gt;
Autocalc is not actually an ACPStyle in ACP3. (It was in ACP1.)  Autocalc is implemented using the Desktop Analytica functionality  for [[Proactive_Evaluation]].&lt;br /&gt;
&lt;br /&gt;
== Node Level Settings  ==&lt;br /&gt;
&lt;br /&gt;
These style flags and options apply to individual nodes (variables), rather than the model as a whole. So, you set these flags on the AcpStyles for selected objects (nodes).&lt;br /&gt;
&lt;br /&gt;
=== Other node level flags ===&lt;br /&gt;
=== Prevent nodes from showing on the diagram ===&lt;br /&gt;
&lt;br /&gt;
*'''&amp;lt;code&amp;gt;Show_Object: no&amp;lt;/code&amp;gt;''' &lt;br /&gt;
You can prevent nodes or modules from showing on the diagram of your model, by adding this flag to the AcpStyles attribute of the object you wish to hide. Once the model is shown in ACP the objects aren't visible.&lt;br /&gt;
&lt;br /&gt;
== Modifying ACP menus==&lt;br /&gt;
&lt;br /&gt;
Normally, ACP offers menus that appear when you press one of the three icons on the right of the top teal bar. These ACP styles let you modify these menus.&lt;br /&gt;
&lt;br /&gt;
===Hide the Save options===&lt;br /&gt;
&lt;br /&gt;
*'''&amp;lt;code&amp;gt;Hide_save_button: yes &amp;lt;/code&amp;gt;''' Set this model ACP style option to exclude the  'Save this model' and 'Save model as...' from the ACP Close menu. It prevents  users from saving over your models or saving other versions. &lt;br /&gt;
*''This style cannot currently be set from the ACP style library, since it would allow users to show the save and save as menu options and then save changes even if the modeler does not want to allow it.''&lt;br /&gt;
&lt;br /&gt;
===Remove Help menu items===&lt;br /&gt;
&lt;br /&gt;
These styles add menu items to or remove items from the help (?) menu if added to the AcpStyles of the top diagram of your model. For [[ACP_Server_License|ACP installations]]  on an intranet, these standard links may not be accessible. On the other hand you may want to offer a special help page for a particular model.&lt;br /&gt;
&lt;br /&gt;
*'''&amp;lt;code&amp;gt;Remove_help_menu_options: Text&amp;lt;/code&amp;gt;&lt;br /&gt;
This style allows you to list one or more of the standard options to remove from the help (?) menu. Replace &amp;lt;code&amp;gt;Text&amp;lt;/code&amp;gt; with one or more of the following: &amp;lt;code&amp;gt;ACP_Online_docs, Analytica_Q_A_forum, Tech_support&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
(Note: The help menu item &amp;lt;code&amp;gt;Connection status&amp;lt;/code&amp;gt; cannot currently be removed).&lt;br /&gt;
&lt;br /&gt;
===Add Help menu item===&lt;br /&gt;
*'''&amp;lt;code&amp;gt;Add_help_menu_option: Text|URL&amp;lt;/code&amp;gt;''' &lt;br /&gt;
Adds another menu item, for example: &amp;lt;code&amp;gt;Add_help_menu_option: How to use this model...|https://www.lumina.com&amp;lt;/code&amp;gt; adds a menu item to the help (?) menu with the text &amp;quot;How to use this model...&amp;quot; and opens the link when clicked.&lt;br /&gt;
&lt;br /&gt;
===Add download this model to the Close menu===&lt;br /&gt;
*'''&amp;lt;code&amp;gt;save_menu_download: yes&amp;lt;/code&amp;gt;'''&lt;br /&gt;
This AcpStyle is controlled by a setting in the [[Customizing_an_ACP_server#The_acpConfig.json_file|AcpConfig.json]] file. On Lumina's acp.analytica.com server it is turned on.&lt;br /&gt;
With this AcpStyle in the model, ''&amp;lt;code&amp;gt;&amp;quot;download this model&amp;quot;&amp;lt;/code&amp;gt;'' is added to the close menu at the top right of the ACP GUI.&lt;br /&gt;
When set, this will allow anyone to download the model - even a reviewer, and even from an email invite.&lt;br /&gt;
*'''&amp;lt;code&amp;gt;save_menu_download: no&amp;lt;/code&amp;gt;''' (default if not set)&lt;br /&gt;
*'''&amp;lt;code&amp;gt;save_menu_download:Prompt_to_download_free&amp;lt;/code&amp;gt;'''.  This adds a popup dialog with a download link and prompt to download the Analytica free installer.&lt;br /&gt;
''This style cannot be set from the ACP Style library, since it would allow reviewers to change the style and download the model, even if the modeler does not  want to allow that.''&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
* [[ACP Style Library]] &lt;br /&gt;
* [[media:ACP style library.ana]]&lt;br /&gt;
* [[Analytica Cloud Platform]]&lt;br /&gt;
* [[ACP Rendering tables and graphs on the diagram]]&lt;br /&gt;
* [[Putting ACP in a Web Page]]&lt;br /&gt;
* [[Help balloons]]&lt;br /&gt;
* [[Attributes]]&lt;br /&gt;
* [[Manage attributes]]&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=AcpStyles&amp;diff=63761</id>
		<title>AcpStyles</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=AcpStyles&amp;diff=63761"/>
		<updated>2026-02-24T20:58:01Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: /* Show or hide the Description */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Analytica Cloud Platform]]&lt;br /&gt;
[[Category: Attributes]]&lt;br /&gt;
[[Analytica_Cloud_Player|&amp;lt;&amp;lt;Analytica Cloud Platform ]]&lt;br /&gt;
&lt;br /&gt;
::{{ReleaseBar}}&lt;br /&gt;
&lt;br /&gt;
ACP offers a wide variety of styles and options to control the look and functioning of the user interface. Many of these go beyond what is (currently) available in Desktop Analytica (DTA). &lt;br /&gt;
&lt;br /&gt;
The easiest way to set these styles and options is to use the [[ACP Style Library]], which you can load into your model within ACP from the hamburger menu.  As you change styles in ACP, you can see their effects immediately.  &lt;br /&gt;
&lt;br /&gt;
If you use [[ACP Style Library]] you don't need to learn about the ACP Styles described below. The only reason to read the rest of this page is if you want to do something esoteric with AcpStyles, or use one of the few AcpStyles not accessible in the [[ACP_Style_Library]]. &lt;br /&gt;
&lt;br /&gt;
You can also load the  [[ACP Style Library]] in Analytica on the desktop from the '''Add Library...' option from the '''File''' menu. But, you won't be able to see the effects until you upload the model into ACP.&lt;br /&gt;
&lt;br /&gt;
The styles and options are specified as keywords and tags in the AcpStyles  attribute. Most styles and options apply to the whole Model and are specified in the AcpStyles attribute of the Model.  When you want to specify special styles for individual modules or variables, you apply them to the ACPStyles attribute of the relevant object.&lt;br /&gt;
 &lt;br /&gt;
The easiest way to view and edit the AcpStyles  attribute in Desktop Analytica is to use the [[Attribute panel]].  Select AcpStyles  from the list of Attributes at the top of that panel. By default, AcpStyles is not shown in the [[Object window]], so you first need to set it to be shown either with the [[Object_Window|right click menu]] in the Object window, or in the [[Manage attributes|Attributes dialog]].  &lt;br /&gt;
&lt;br /&gt;
The AcpStyles  and their flags are not case sensitive.  &lt;br /&gt;
&lt;br /&gt;
When you put multiple flags in a AcpStyles attribute, put each flag on a separate line. &lt;br /&gt;
&lt;br /&gt;
== Model level styles  ==&lt;br /&gt;
&lt;br /&gt;
These styles apply to the entire model. You set them in the AcpStyles attribute for the Main Model. (They have no effect when set for a submodule.)&lt;br /&gt;
&lt;br /&gt;
=== Navigation style  ===&lt;br /&gt;
&lt;br /&gt;
These Navigation_style options control how a user can view and access the module hierarchy:&lt;br /&gt;
* '''&amp;lt;code&amp;gt;Navigation_style: Outline&amp;lt;/code&amp;gt;''' -- Show an expandable tree of modules on the left of the ACP window, similar to the outline view in desktop Analytica (showing only modules not other objects). This is the default style when you upload a model with no ACP styles set or no Acp styles library embedded, or if you have not yet set the Navigation style in the Acp styles library. A navigation flag is not needed for this style, but if you want to explicitly set this style you can add '''&amp;lt;code&amp;gt;Navigation_style: Outline&amp;lt;/code&amp;gt;''' to the top diagram's AcpStyles attribute.&lt;br /&gt;
&lt;br /&gt;
*'''&amp;lt;code&amp;gt;Navigation_style: Top diagram only&amp;lt;/code&amp;gt;''' -- Show only the top diagram, with no Outline and no tabs. This lets you make a simple web application with a single UI page.  &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For the next two  'Tabbed application' styles, each module in the main model becomes a tab. The order of the tabs follows the sequence of the module nodes in the main diagram, from  left to right then top to bottom. &lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;code&amp;gt;Navigation_style: Top_tabs&amp;lt;/code&amp;gt;''' -- The main modules in the top model appear as a row of tabs across the top of the window. Click a tab to show the diagram for that module. &lt;br /&gt;
&amp;lt;!--Remove for now* '''&amp;lt;code&amp;gt;Navigation_style: Two_top_tabs&amp;lt;/code'''&amp;gt; --  The main modules in the top model appear as a row of tabs. The submodules of the module whose tab is selected appear as a second row of tabs. Needs to be used with the style'''&amp;lt;code&amp;gt;show_as_tab: no&amp;lt;/code&amp;gt;'''. --&amp;gt;&lt;br /&gt;
*'''&amp;lt;code&amp;gt;Navigation_style: Side_tabs&amp;lt;/code&amp;gt;''' -- The main modules in the top model appear as a column of tabs on the left of the window. Click a tab to show the diagram for that module.&lt;br /&gt;
&amp;lt;!--Remove for now * '''&amp;lt;code&amp;gt;Navigation_style: Two_side_tabs&amp;lt;/code&amp;gt;'''  -- The top tabs reflect the main modules in the top model. Clicking a top tab shows a a set of subtabs, reflecting the submodules of main module (tab) selected. Needs to be used with the style '''&amp;lt;code&amp;gt;show_as_tab: no&amp;lt;/code&amp;gt;'''.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We describe each in more detail below.&lt;br /&gt;
&lt;br /&gt;
===Outline Tree===&lt;br /&gt;
&lt;br /&gt;
By default, when using the Outline Navigation style, ACP shows an expandable outline tree of modules on the left hand side of the window, similar to the Outline view in Analytica on the desktop. This makes it easy to navigate a model with an extensive hierarchy of modules. &lt;br /&gt;
&lt;br /&gt;
*'''&amp;lt;code&amp;gt;Show_outline: yes&amp;lt;/code&amp;gt;''' -- The default, and unecessary for Outline Navigation style. It is generally redundant with other Navigation styles since the tabs or hierarchy show the same information, and the Outline takes up screen space. But you can add  it to the top diagram's AcpStyles attribute if you want to show the Outline tree with other Navigation styles.&lt;br /&gt;
&lt;br /&gt;
{{CalloutAnnotationBlock|[[File:Outline tree 6.0 01.png]]|{{CalloutAnnotation|Market model with&amp;lt;br&amp;gt;Outline Tree|v=80|pt=10,106}}}}&lt;br /&gt;
*'''&amp;lt;code&amp;gt;show_outline: no&amp;lt;/code&amp;gt;''' --  When using the Acp Style library this is set by default for Navigation styles other than Outline. For small models, and most web apps, you may want to suppress the Outline view even when using the Outline Navigation style. Do this by inserting this text into the top diagram's AcpStyles attribute (See image below). (If a model has only one diagram,  i.e. with no modules, it never shows the outline tree.)&amp;lt;br/&amp;gt;&lt;br /&gt;
{{CalloutAnnotationBlock|[[File:Outline tree 6.0 02.png]]|{{CalloutAnnotation|Market model with &amp;lt;br/&amp;gt;'''&amp;lt;code&amp;gt;show_outline: no&amp;lt;/code&amp;gt;'''|v=80}}}}&lt;br /&gt;
&lt;br /&gt;
===Top Diagram Only===&lt;br /&gt;
&lt;br /&gt;
Set by adding '''&amp;lt;code&amp;gt;navigation_style: top_diagram_only&amp;lt;/code&amp;gt;''' to the AcpStyles attribute of the top diagram. &amp;lt;!--Not to be confused with the AcpStyles flag of similar name: '''&amp;lt;code&amp;gt;top_diagram_only: yes&amp;lt;/code&amp;gt;'''. -This is a navigation style most easily set with the ACP styles library. --&amp;gt; The Styles library will set the flag &amp;lt;!--'''&amp;lt;code&amp;gt;top_diagram_only:yes&amp;lt;/code&amp;gt;''',--&amp;gt; '''&amp;lt;code&amp;gt;show_outline:no&amp;lt;/code&amp;gt;''' .&lt;br /&gt;
&lt;br /&gt;
===Tabbed Module Navigation===&lt;br /&gt;
&lt;br /&gt;
As an alternative to the Outline view, you can set the '''&amp;lt;code&amp;gt;Navigation_style&amp;lt;/code&amp;gt;''' to use use a tabbed interface which is often more convenient and familiar for web applications. By default, the main model appears as the first tab. You can change this with the style [[AcpStyles_Attribute_Values#Exclude_the_top_level_diagram_from_tabs|show_as_tab:no]] described below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Replace this section with one that does not talk about two tabs for now - until they are implemented in ACP3 - There are four tabbed styles, Top_tabs and Two_top_tabs, with one or two rows of tabs across the top, respectively; and Side_tabs and Two_side_tabs with one or two columns of tabs down the side. Top_tabs works well if you have up to 5 to 8 modules in the main diagram (tabs), depending on the length of their titles and the width of the ACP window.  If you have a lot of modules, or they have long titles, it may be better to use Side_tabs.  If you have too many modules to fit at the top or side, you can use Two_top_tabs or Two_side_tabs. In those cases, you must organize the modules into a two-level hierarchy with logical groupings. &lt;br /&gt;
&lt;br /&gt;
'Top tabs or side tabs.' The first tab displays the top level diagram, and the remaining tabs display the modules present on the top level diagram of the model.  (The modules will not display on the diagram, so you need to tweak your diagram for playing in ACP so that it looks right without these present). The size of the diagram is determined by the size of the top level diagram window when the model was last saved in Analytica.&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;code&amp;gt;navigation_style: top_tabs&amp;lt;/code&amp;gt;''' This setting instructs ACP to use the 'Tabs across top' navigation style.&lt;br /&gt;
&lt;br /&gt;
:[[File:Top tabs 6.0 01.png]]&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;code&amp;gt;navigation_style: side_tabs&amp;lt;/code&amp;gt;''' This setting instructs ACP to use the 'Side tabs' navigation style.  Side tabs work better than top tabs when there are more module nodes present.&lt;br /&gt;
&lt;br /&gt;
:[[File:Side tabs 6.0 01.png]]&lt;br /&gt;
* &amp;lt;code&amp;gt;Navigation_style: Two_top_tabs&amp;lt;/code&amp;gt; &lt;br /&gt;
* &amp;lt;code&amp;gt;Navigation_style: Two_side_tabs&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''These 2 Navigation styles replace the style  &amp;lt;code&amp;gt;two_tiers_tabs:yes&amp;lt;/code&amp;gt; which has been deprecated.'''&lt;br /&gt;
&lt;br /&gt;
These styles are useful for modules with several layers of modules and submodules - to reduce the clutter of the top layer of tabs. Modules in the model's top diagram appear as top tabs (left tabs).  Modules within those top level modules appear as subtabs,  the 'second tier'. When you select a top-level tab, it shows its submodules as subtabs. This means that the top level of modules will not show any contents other than their submodules, so the model needs to be designed with this in mind.&lt;br /&gt;
*Currently these 2 styles must be used with the '''&amp;lt;code&amp;gt;show_as_tab: no&amp;lt;/code&amp;gt;''' style set. &amp;lt;!--Coming soon: Compatibility with '''&amp;lt;code&amp;gt;show_as_tab: yes&amp;lt;/code&amp;gt;'''&lt;br /&gt;
*The selected tab appears with the color of the diagram background of it's module&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
There are two tabbed styles, Top_tabs, with a row of tabs across the top; and Side_tabs with a column of tabs down the side. Top_tabs works well if you have up to 5 to 8 modules in the main diagram (tabs), depending on the length of their titles and the width of the ACP window.  If you have a lot of modules, or they have long titles, it may be better to use Side_tabs.  &lt;br /&gt;
&lt;br /&gt;
'Top tabs or side tabs.' The first tab displays the top level diagram, and the remaining tabs display the modules present on the top level diagram of the model.  (The modules will not display on the diagram, so you need to tweak your diagram for playing in ACP so that it looks right without these present). &lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;code&amp;gt;navigation_style: top_tabs&amp;lt;/code&amp;gt;''' -- This setting instructs ACP to use the 'Tabs across top' navigation style.&lt;br /&gt;
&lt;br /&gt;
[[File:Top tabs 6.0 01.png]]&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;code&amp;gt;navigation_style: side_tabs&amp;lt;/code&amp;gt;''' -- This setting instructs ACP to use the 'Side tabs' navigation style.  Side tabs work better than top tabs when there are more module nodes present.&lt;br /&gt;
&lt;br /&gt;
[[File:Side tabs 6.0 01.png]]&lt;br /&gt;
&lt;br /&gt;
=== Toolbar Tabs ===&lt;br /&gt;
*'''&amp;lt;code&amp;gt;show_tabs: no&amp;lt;/code&amp;gt;''' -- By default, with the Outline Navigation style. ACP shows navigation tabs for &amp;quot;Diagram&amp;quot;, &amp;quot;Object&amp;quot;, &amp;quot;Table&amp;quot;, &amp;quot;Graph&amp;quot; along the top. Use this flag to hide those tabs. If you display the model inputs and outputs on the diagram -- using embedded tables and graphs on the diagram -- your users may not need those tabs.  (You can also use '''&amp;lt;code&amp;gt;show_tabs: yes&amp;lt;/code&amp;gt;''' to explicitly show the tabs in Outline and Top diagram only Navigation styles.) &lt;br /&gt;
{{CalloutAnnotationBlock|[[File:Show tabs no 6.0 0.1.png]]|{{CalloutAnnotation|Market model with &amp;lt;br/&amp;gt;'''&amp;lt;code&amp;gt;show_tabs: no&amp;lt;/code&amp;gt;'''|v=80|pt=232,37|path=t!-}}}}&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Module hierarchy bar ===&lt;br /&gt;
Using tabbed navigation, ACP shows the model hierarchy in a bar at the top of the diagram by default. The model hierarchy header shows you where you are in a large model by listing the titles of the ancestor modules in which the current diagram is nested.  You can click any ancestor to click up levels in the hierarchy. The Hierarchy Bar takes up much less screen real estate than the Outline Tree. ACP doesn't show the hierarchy bar when you are viewing a top level module, or if the module title is already in the selected tab. &amp;lt;!--With a two-level tab navigation, it shows the hierarchy bar only when viewing a module nested 3 or more levels down. Basically, the hierarchy header does not duplicate what you can see in the tabs.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that this setting is not based on a AcpStyles attribute, but rather on the ''Show module hierarchy'' check box in the model [[Preferences]] in Analytica.  If you want to set this preference manually, with the model opened in Analytica, on the [[Edit menu]], select '''Preference...''', and check (or uncheck) the ''Show module hierarchy'' checkbox. &lt;br /&gt;
&lt;br /&gt;
If you are using the ACP styles library, the Styles library will set this to the default setting automatically once you select a Navigation style. But you have the option of changing it if, for instance you want to show the Outline and the Hierarchy bar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--:[[Image:Acp hh.png]]--&amp;gt;&lt;br /&gt;
===Auto zoom ===&lt;br /&gt;
*'''&amp;lt;code&amp;gt;auto_zoom_diagrams: yes&amp;lt;/code&amp;gt;''' -- ACP automatically zooms the UI to fit the browser window -- the most constraining of width or height so it retains the aspect ratio of the diagram. Works with zoom in and zoom out. Auto Zoom will allow a model to go down to 50% of its size or up to 200% of its size. If the model does not fit at 50% size, the window will show scroll bars. This Acp style has no effect if '''&amp;lt;code&amp;gt;Use_top_diagram_size:Yes &amp;lt;/code&amp;gt;''' is present, you can use only one or the other. You can also set '''&amp;lt;code&amp;gt;auto_zoom_diagrams: no&amp;lt;/code&amp;gt;''' which is the default. (This is a model level setting and is added to the top diagram of a model).&lt;br /&gt;
&lt;br /&gt;
===Customize zoom levels===&lt;br /&gt;
AcpStyles for controlling the max/min zoom when '''&amp;lt;code&amp;gt;auto_zoom_diagram: yes&amp;lt;/code&amp;gt;''' is set. The default if these styles are not set is as above - 50% and 200%. The easiest way to set these is with the [[ACP_Style_Library]] - where the controls are in the Esoteric ACP styles module. This is available from the Hamburger menu in ACP. Note that in order to see this effect, the '''&amp;lt;code&amp;gt;Browser window size&amp;lt;/code&amp;gt;''' needs to have the screen size pulldown menu set to '''&amp;lt;code&amp;gt;Auto zoom&amp;lt;/code&amp;gt;''' as well. &lt;br /&gt;
*'''&amp;lt;code&amp;gt;zoom_min_percent: 75&amp;lt;/code&amp;gt;''' (means that the minimum zoom level will be 75% or .75)&lt;br /&gt;
*'''&amp;lt;code&amp;gt;zoom_max_percent: 125&amp;lt;/code&amp;gt;''' (means the that max zoom level will be 125% or 1.25)&lt;br /&gt;
&lt;br /&gt;
===Use top diagram size for all ACP windows===&lt;br /&gt;
*'''&amp;lt;code&amp;gt;Use_top_diagram_size:Yes &amp;lt;/code&amp;gt;''' --  Sets the size of all diagrams based on the size of the diagram window of the top level when the model was last viewed in Desktop Analytica (in non-maximized mode).  '''&amp;lt;code&amp;gt;Use_top_diagram_size:No &amp;lt;/code&amp;gt;''' is the same as if the flag is not set, and is the default  - the ACP diagram will use the entire browser window.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Not in ACP3 yet - ER519&lt;br /&gt;
===Display Only a Single Diagram===&lt;br /&gt;
*'''&amp;lt;code&amp;gt;top_diagram_only: yes&amp;lt;/code&amp;gt;''' -- Use this flag if you want to restrict users access to only the top diagram. With this flag, any action that would normally bring up a different diagram will just reload the top diagram.  (If you are using this setting, you will also want to also not display the Outline Tree as explained above, since clicking on the modules in the Outline will have no effect.)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
===Show or hide the Dashboard Title and Model title===&lt;br /&gt;
*'''&amp;lt;code&amp;gt;show_model_title: no&amp;lt;/code&amp;gt;''' -- Hide the title of the model, which appears by default in the top Teal bar.&lt;br /&gt;
&lt;br /&gt;
*'''&amp;lt;code&amp;gt;show_diagram_title: yes&amp;lt;/code&amp;gt;''' --  Use  to show the dashboard title at the top of the diagram. Or &amp;lt;code&amp;gt;show_diagram_title: no&amp;lt;/code&amp;gt; to suppress the diagram title, but not really necessary because ACP does not show the diagram title by default.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Hide the Banner and Logo===&lt;br /&gt;
Another flag it's easier to use the [[ACP Style Library]] to set, since it is only compatible with the toolbar tabs hidden. The Styles library changes all the flags at once, and prevents you from entering incompatible combinations.&lt;br /&gt;
&lt;br /&gt;
*'''&amp;lt;code&amp;gt;show_banner: no&amp;lt;/code&amp;gt;''' &lt;br /&gt;
::Hides the banner space usually present at the top of ACP. The banner typically contains the Lumina Logo, the '''Parent Diagram''' button, tabs, '''Close Model''' button, and '''Save''' button.&lt;br /&gt;
&lt;br /&gt;
:*This could be useful for customizing the appearance of a model [[Putting_ACP_in_a_Web_Page|embedded in a web page]], for instance.&lt;br /&gt;
:[[File:Banner area 01.PNG]]&lt;br /&gt;
:*If you play a model without the banner area in ACP, there isn't a convenient way to close the model without closing the browser.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Exclude diagram(s) from tabs===&lt;br /&gt;
&lt;br /&gt;
When using tabbed navigation, you can select those modules (from the top model diagram) that you want to appear as a tab in ACP. The default is for all to appear as tabs. You should use the ''Show modules as tabs'' choice menu in the '''&amp;lt;code&amp;gt;ACP Navigation styles&amp;lt;/code&amp;gt;''' section of the [[ACP Style Library]] if you want to set this flag,, and if you also want to hide the modules corresponding to these tabs [[ChangeNodeVisibility|hidden]], so that the model viewer cannot see them.&lt;br /&gt;
&lt;br /&gt;
*Optionally, Enter the text '''&amp;lt;code&amp;gt;Show_as_tab: no&amp;lt;/code&amp;gt;''' in the AcpStyles attribute of the modules you don't wish to show as a tab. The modules themselves will not be hidden with this setting, only the tabs.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
*'''&amp;lt;code&amp;gt;show_as_tab: no&amp;lt;/code&amp;gt;''' &lt;br /&gt;
::Excludes the top level diagram and just shows the submodules of the top level diagram as tabs. Since the top diagram will not display in ACP, you include the key user interface pages as modules in the main model. Can be used only with 'Top tabs' or 'Side tabs' styles. &lt;br /&gt;
*When setting tabbed Navigation styles using the ACP Styles Library, the default is for the Top level diagram to be included, except with two tiers of tabs, for which it is (Currently) required to exclude the top diagram from the tabs.&lt;br /&gt;
&lt;br /&gt;
If you want to see what it looks like, play this model [[Media:Show as tab no.ana|Array examples]] in ACP, with the '''&amp;lt;code&amp;gt;show_as_tab: no&amp;lt;/code&amp;gt;''' style in the AcpStyles  attribute, and set to tabs along top.&lt;br /&gt;
&lt;br /&gt;
:[[File:Show as tab no02.png]]&lt;br /&gt;
&lt;br /&gt;
*Play this model in ACP and the top level diagram does not show. Rather the diagram for 'Intro to Arrays' shows as the first tab and then the other tabs.'''&lt;br /&gt;
&lt;br /&gt;
:[[File:Show as tab no01.png]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
===Tab color===&lt;br /&gt;
&lt;br /&gt;
When using Tabbed Navigation, you can use these flags to control how the color of the tabs display on your model in ACP. To use, add one of them to the AcpStyles attribute of the top level diagram of your model. They have no effect if added to a module other than the top diagram.&lt;br /&gt;
&lt;br /&gt;
*'''&amp;lt;code&amp;gt;Tab_color: Default &amp;lt;/code&amp;gt;''' The default. Non-selected tabs are bluish white. The selected tab uses the background color for that diagram.&lt;br /&gt;
*'''&amp;lt;code&amp;gt;Tab_color: Background &amp;lt;/code&amp;gt;''' All tabs use their diagram background color, whether selected or not&lt;br /&gt;
*'''&amp;lt;code&amp;gt;Tab_color: Node &amp;lt;/code&amp;gt;'''  The selected Tab uses its diagram background color; The other tabs use the color of their Module node (not their diagram background color).  You can use this to change the color of the tabs by modifying their node color in an Analytica functions.&lt;br /&gt;
&lt;br /&gt;
== Model level styles for diagram nodes. ==&lt;br /&gt;
&lt;br /&gt;
These model-level styles affect how all nodes are displayed in diagrams.  &lt;br /&gt;
&lt;br /&gt;
=== Node shadows and bevels  ===&lt;br /&gt;
&lt;br /&gt;
By default ACP displays nodes without shadows or bevels (for now) , so they look like this:&lt;br /&gt;
:[[Image:Nodes no shadow or bevel.png]] &lt;br /&gt;
&lt;br /&gt;
Set this flag to show a drop shadow behind each node, giving a kind of 3D effect:&lt;br /&gt;
&lt;br /&gt;
*'''&amp;lt;code&amp;gt;node_drop_shadow: yes&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
:[[Image:Nodes drop shadow.png]] &lt;br /&gt;
&lt;br /&gt;
Set this flag to display a bevel border for each node, giving another kind of 3-D effect: &lt;br /&gt;
*'''&amp;lt;code&amp;gt;bevel_node_border: yes&amp;lt;/code&amp;gt;''' &lt;br /&gt;
&lt;br /&gt;
:[[Image:Nodes beveled border.png]] &lt;br /&gt;
&lt;br /&gt;
===Node hover highlighting===&lt;br /&gt;
&lt;br /&gt;
By default, ACP displays a highlight -- a contrasting light rectangle behind a node -- when you move the cursor over the node:&lt;br /&gt;
&lt;br /&gt;
[[File:acp hover hl.png]]&lt;br /&gt;
&lt;br /&gt;
You can switch it off by setting:&lt;br /&gt;
*'''&amp;lt;code&amp;gt;show_hover_highlight: No&amp;lt;/code&amp;gt;''' &lt;br /&gt;
&lt;br /&gt;
=== Balloon Help  ===&lt;br /&gt;
&lt;br /&gt;
When you move the cursor over a node, ACP usually shows a &amp;quot;balloon&amp;quot; popup next to the node with the description of the node (if it has one) to help end users understand what its for, or what to enter for a user input. If the node has no description, the [[help balloons|balloon help]] will not appear.&lt;br /&gt;
&lt;br /&gt;
*'''&amp;lt;code&amp;gt;show_id_in_balloon: yes&amp;lt;/code&amp;gt;''' Use this flag to show each node's identifier below its title in the balloon -- unless the identifier and title are identical (except for spaces which are replaced by underscores). This flag goes in the AcpStyles of the model and apply to all nodes in the model.&lt;br /&gt;
&amp;lt;!-- not implemented in ACP3 &lt;br /&gt;
*'''&amp;lt;code&amp;gt;show_definition_in_balloon: yes&amp;lt;/code&amp;gt;''' &lt;br /&gt;
::Use this flag to show the node's definition in the balloon below the description.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!-- not implemented in ACP3 &lt;br /&gt;
*'''&amp;lt;code&amp;gt;hover_balloon_delay&amp;lt;/code&amp;gt;''' &lt;br /&gt;
::When you mouse over a node, there's a short delay of about half a second before it displays the balloon (to prevent wild balloon appearance when you move the cursor rapidly over a diagram.) You can tweak this delay time measured in milliseconds by inserting this flag. E.g. '''&amp;lt;code&amp;gt;hover_balloon_delay: 200&amp;lt;/code&amp;gt;''' to reduce the delay to .2 seconds.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
The flags above go in the AcpStyles of the model and apply to all nodes in the model. You can also modify some aspects of the balloon separately for each node by inserting these flags in AcpStyles for each node: --&amp;gt;&lt;br /&gt;
*'''&amp;lt;code&amp;gt;show_hover_balloon: no&amp;lt;/code&amp;gt;'''&lt;br /&gt;
::Insert this flag in the AcpStyles for a node, to suppress display of its balloon.&lt;br /&gt;
&amp;lt;!--title no longer shows in the balloon&lt;br /&gt;
*'''&amp;lt;code&amp;gt;show_hover_balloon_title: no&amp;lt;/code&amp;gt;'''&lt;br /&gt;
::Insert this flag in the AcpStyles for a node, to suppress its title in the balloon.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ACP styles inheritance==&lt;br /&gt;
This is the order of inheritance for Acpstyles below that apply to tables and graphs. Styles at a higher level take precedence over the lower precedence styles. (Inheritance doesn't apply to the ACPstyles described above that apply only at the Model level.)&lt;br /&gt;
# '''Variable''' (includes Tall nodes): Acpstyles applied to an individual variable will take precedence over all other styles. A variable with a style of &amp;lt;code&amp;gt;show_title:no&amp;lt;/code&amp;gt; will not show the title, even if the model level style is &amp;lt;code&amp;gt;show_title:yes&amp;lt;/code&amp;gt;, and if that node shows it's result in a frame node the variable style will override the frame node style.&lt;br /&gt;
# '''Frame''' : An Acpstyle set for a frame node will affect any variable shown in that frame that doesn't have its own settings. These will also override any styles at the model level.&lt;br /&gt;
# '''Model ACP style defaults''': Acpstyles that you can enter into the Acptyles attribute of the top diagram of your model. These will override the ACP defaults, and will be inherited by frame nodes and variables in the model that don't have their own Acpstyle.&lt;br /&gt;
# '''ACP style defaults for ACP''': The default style ACP uses if you have no specific setting for that style. Eg for show_index_menus the default is fly-in and that is what will show if you don't enter a different show_index_menus: Acpstyle flag in the Acpstyle for the top diagram (model level) or for frame nodes or variables.&lt;br /&gt;
&lt;br /&gt;
==ACP Styles for tables and graphs==&lt;br /&gt;
&lt;br /&gt;
These styles affect how result graphs and tables are displayed in ACP, including in [[Embed_table_or_graph_with_ACP#Frame_nodes|Tall nodes]] and [[Embed_table_or_graph_with_ACP#Tall_nodes|˞Frame nodes]]. They provide options not (yet) available in Desktop Analytica. ACP has default settings for these. You can override these settings for the entire model. You can also set them for [[Embed_table_or_graph_with_ACP#Frame_nodes|˞Frame nodes]], which will apply to all results shown in the Frame and override the ACP and model level settings. And you can set these styles for individual variables, which will override any settings in the Model or Frame. As always, it's easiest to set the using the [[ACP_Style_library]]. &lt;br /&gt;
&lt;br /&gt;
None of these styles apply to tab result views using the default Navigation_style: Outline.&lt;br /&gt;
&lt;br /&gt;
===Show or hide the Description===&lt;br /&gt;
&lt;br /&gt;
*'''&amp;lt;code&amp;gt;Show_description: n&amp;lt;/code&amp;gt;''' If &amp;lt;code&amp;gt;n &amp;gt; 0 &amp;lt;/code&amp;gt; it shows the Description of the variable above the table or graph using up to n% of the vertical space available. If that's not big enough to show the entire description, it shows a vertical scroll bar. Iif you don't want to show the description at all, set &amp;lt;code&amp;gt;n = 0&amp;lt;/code&amp;gt;. Default if not mentioned, is one third, i.e. &amp;lt;code&amp;gt;Show_description: 33&amp;lt;/code&amp;gt;.  You can set this style at the model level for all Frame or Tall nodes, and you can override this default for any individual node.&lt;br /&gt;
&lt;br /&gt;
===Show or hide the Object view icon===&lt;br /&gt;
*'''&amp;lt;code&amp;gt;Object_in_Frame:yes/no&amp;lt;/code&amp;gt;''': With this style set, it shows an object view hover icon at the top right of a frame node or tall node when showing a graph or table view. Click this icon to show the object window view. The object view shows the Table and Graph hover icon to go back to the table or graph view.  You can set '''&amp;lt;code&amp;gt;Object_in_frame&amp;lt;/code&amp;gt;''' style at either the top level of the model or in an individual frame node, which overrides the top level setting. When working with tall nodes, you can set '''&amp;lt;code&amp;gt;Object_in_frame&amp;lt;/code&amp;gt;''' style at the top level or in the original variable's ACP style setting, which overrides the top level setting.&lt;br /&gt;
&lt;br /&gt;
===Show or hide the title===&lt;br /&gt;
&lt;br /&gt;
*'''&amp;lt;code&amp;gt;Show_title&amp;lt;/code&amp;gt;''': Set &amp;lt;code&amp;gt;Show_title: yes&amp;lt;/code&amp;gt; to show or &amp;lt;code&amp;gt;Show_title: no&amp;lt;/code&amp;gt; to stop showing the Title and units of a selected variable. This style can be used at the model level, for frame nodes or for individual nodes, but controls  whether or not the Title and units show in Frame nodes or tall nodes. &lt;br /&gt;
&lt;br /&gt;
===Show or hide the Graph-Table icon===&lt;br /&gt;
&lt;br /&gt;
*'''&amp;lt;code&amp;gt;Show_graph_table_icon:no&amp;lt;/code&amp;gt;''' Hides the icon in the top right of a Result that lets you toggle between Graph and Table view. This applies to [[Embed_table_or_graph_with_ACP|Frame nodes and tall nodes]]. This style can be used for  the entire model, for frame nodes or for individual nodes . You set them in the AcpStyles attribute.  Conversely, you can set  '''&amp;lt;code&amp;gt;Show_graph_table_icon:yes&amp;lt;/code&amp;gt;'''. This is the default so not usually necessary at the model level, but can be used in a frame node or variable to override the model default or override a frame node setting.&lt;br /&gt;
&lt;br /&gt;
===Show or hide the Uncertainty view menu===&lt;br /&gt;
By default, in ACP, as in desktop Analytica, the [[Uncertainty views]] menu appears above each result graph or table to let you select [[Mid]] to display its deterministic value, or Mean, Probability distribution, and other ways to display a probabilistic value.  &lt;br /&gt;
&lt;br /&gt;
You can override this default behavior with this ACP style for the entire model, [[Embed_table_or_graph_with_ACP#Frame_nodes|Frame nodes]], or for individual variables. The Uncertainty view menu is always present in tab result views.&lt;br /&gt;
*'''&amp;lt;code&amp;gt;Show_uncertainty_view: No&amp;lt;/code&amp;gt;''' Never show the uncertainty menu in frame nodes or tall result nodes. Suitable for models with no probabilistic values, or if you want to fix a particular probabilistic view for each frame node or variable so that ACP users can't change it.&lt;br /&gt;
*'''&amp;lt;code&amp;gt;Show_uncertainty_view: Yes&amp;lt;/code&amp;gt;''' Always show the uncertainty menu even for variables that are not probabilistic, as in Desktop Analytica. This is the default and not normally necessary at the model level, but can be used to customize which frame nodes or variables to show the uncertainty view menu when the model level style is set to '''&amp;lt;code&amp;gt;Show_uncertainty_view: No&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
===Show or hide the Index menus and Pivoters/slicers===&lt;br /&gt;
*'''&amp;lt;code&amp;gt;Show_index_menus: Fly-in&amp;lt;/code&amp;gt;''' By default (the same as if there is no show_index_menu: setting) the index menus are not shown in [[https://wiki.analytica.com/index.php?title=Embed_table_or_graph_with_ACP|frame nodes or tall nodes]] (but slicers are), since often the modeler has already chosen the pivot they want to use. And because these menus take up valuable screen space. But if you hover over the frame node (or tall node) there is a fly-in pivoter control. If you click this it toggles - on or off - the visibility of the pivoters; allowing you to pivot the result table or graph and then close the pivoters to give you more space.&lt;br /&gt;
*'''&amp;lt;code&amp;gt;Show_index_menus: Yes&amp;lt;/code&amp;gt;''' If you do want to allow users to be able to pivot or change the slice of the table or graph, without using the fly-in, then use use show_index_menus:yes. Always present in tab result views.&lt;br /&gt;
*'''&amp;lt;code&amp;gt;Show_index_menus: No&amp;lt;/code&amp;gt;''' If show_index_menus:no is set then the indexes and pivoters will not show and there is no fly-in, but the slicers will still be present.&lt;br /&gt;
*'''&amp;lt;code&amp;gt;Show_index_menus: Not_even_slicers&amp;lt;/code&amp;gt;''' If you don't want to show any pivoters or slicers, you can set show_index_menus:Not_even_slicers.&lt;br /&gt;
&lt;br /&gt;
===Table filtering===&lt;br /&gt;
'''&amp;lt;code&amp;gt;Show_Table_Filtering: no&amp;lt;/code&amp;gt;''' Turns off the ability to filter tables by column, and reverts to the previous sort functionality. [[Tables_in_ACP#Sort_columns]]&amp;lt;br /&amp;gt;&lt;br /&gt;
'''&amp;lt;code&amp;gt;Show_Table_Filtering: yes&amp;lt;/code&amp;gt;''' The default - shows the table filtering icons&lt;br /&gt;
&lt;br /&gt;
===Autocalc===&lt;br /&gt;
&lt;br /&gt;
In the  [[ACP Style Library]], Autocalc looks like a style you can set for a model, module or variable. It controls whether ACP evaluates each variable and shows its results automatically when you view a Diagram or tab showing the -- instead of the default Analytica behavior where the end user has to click on a Calc button to compute a result.  With Autocalc on, a result in view also recomputes automatically when you change an input that influences it.&lt;br /&gt;
&lt;br /&gt;
Autocalc is not actually an ACPStyle in ACP3. (It was in ACP1.)  Autocalc is implemented using the Desktop Analytica functionality  for [[Proactive_Evaluation]].&lt;br /&gt;
&lt;br /&gt;
== Node Level Settings  ==&lt;br /&gt;
&lt;br /&gt;
These style flags and options apply to individual nodes (variables), rather than the model as a whole. So, you set these flags on the AcpStyles for selected objects (nodes).&lt;br /&gt;
&lt;br /&gt;
=== Other node level flags ===&lt;br /&gt;
=== Prevent nodes from showing on the diagram ===&lt;br /&gt;
&lt;br /&gt;
*'''&amp;lt;code&amp;gt;Show_Object: no&amp;lt;/code&amp;gt;''' &lt;br /&gt;
You can prevent nodes or modules from showing on the diagram of your model, by adding this flag to the AcpStyles attribute of the object you wish to hide. Once the model is shown in ACP the objects aren't visible.&lt;br /&gt;
&lt;br /&gt;
== Modifying ACP menus==&lt;br /&gt;
&lt;br /&gt;
Normally, ACP offers menus that appear when you press one of the three icons on the right of the top teal bar. These ACP styles let you modify these menus.&lt;br /&gt;
&lt;br /&gt;
===Hide the Save options===&lt;br /&gt;
&lt;br /&gt;
*'''&amp;lt;code&amp;gt;Hide_save_button: yes &amp;lt;/code&amp;gt;''' Set this model ACP style option to exclude the  'Save this model' and 'Save model as...' from the ACP Close menu. It prevents  users from saving over your models or saving other versions. &lt;br /&gt;
*''This style cannot currently be set from the ACP style library, since it would allow users to show the save and save as menu options and then save changes even if the modeler does not want to allow it.''&lt;br /&gt;
&lt;br /&gt;
===Remove Help menu items===&lt;br /&gt;
&lt;br /&gt;
These styles add menu items to or remove items from the help (?) menu if added to the AcpStyles of the top diagram of your model. For [[ACP_Server_License|ACP installations]]  on an intranet, these standard links may not be accessible. On the other hand you may want to offer a special help page for a particular model.&lt;br /&gt;
&lt;br /&gt;
*'''&amp;lt;code&amp;gt;Remove_help_menu_options: Text&amp;lt;/code&amp;gt;&lt;br /&gt;
This style allows you to list one or more of the standard options to remove from the help (?) menu. Replace &amp;lt;code&amp;gt;Text&amp;lt;/code&amp;gt; with one or more of the following: &amp;lt;code&amp;gt;ACP_Online_docs, Analytica_Q_A_forum, Tech_support&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
(Note: The help menu item &amp;lt;code&amp;gt;Connection status&amp;lt;/code&amp;gt; cannot currently be removed).&lt;br /&gt;
&lt;br /&gt;
===Add Help menu item===&lt;br /&gt;
*'''&amp;lt;code&amp;gt;Add_help_menu_option: Text|URL&amp;lt;/code&amp;gt;''' &lt;br /&gt;
Adds another menu item, for example: &amp;lt;code&amp;gt;Add_help_menu_option: How to use this model...|https://www.lumina.com&amp;lt;/code&amp;gt; adds a menu item to the help (?) menu with the text &amp;quot;How to use this model...&amp;quot; and opens the link when clicked.&lt;br /&gt;
&lt;br /&gt;
===Add download this model to the Close menu===&lt;br /&gt;
*'''&amp;lt;code&amp;gt;save_menu_download: yes&amp;lt;/code&amp;gt;'''&lt;br /&gt;
This AcpStyle is controlled by a setting in the [[Customizing_an_ACP_server#The_acpConfig.json_file|AcpConfig.json]] file. On Lumina's acp.analytica.com server it is turned on.&lt;br /&gt;
With this AcpStyle in the model, ''&amp;lt;code&amp;gt;&amp;quot;download this model&amp;quot;&amp;lt;/code&amp;gt;'' is added to the close menu at the top right of the ACP GUI.&lt;br /&gt;
When set, this will allow anyone to download the model - even a reviewer, and even from an email invite.&lt;br /&gt;
*'''&amp;lt;code&amp;gt;save_menu_download: no&amp;lt;/code&amp;gt;''' (default if not set)&lt;br /&gt;
*'''&amp;lt;code&amp;gt;save_menu_download:Prompt_to_download_free&amp;lt;/code&amp;gt;'''.  This adds a popup dialog with a download link and prompt to download the Analytica free installer.&lt;br /&gt;
''This style cannot be set from the ACP Style library, since it would allow reviewers to change the style and download the model, even if the modeler does not  want to allow that.''&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
* [[ACP Style Library]] &lt;br /&gt;
* [[media:ACP style library.ana]]&lt;br /&gt;
* [[Analytica Cloud Platform]]&lt;br /&gt;
* [[ACP Rendering tables and graphs on the diagram]]&lt;br /&gt;
* [[Putting ACP in a Web Page]]&lt;br /&gt;
* [[Help balloons]]&lt;br /&gt;
* [[Attributes]]&lt;br /&gt;
* [[Manage attributes]]&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.0%3F&amp;diff=63751</id>
		<title>What's new in Analytica 7.0?</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.0%3F&amp;diff=63751"/>
		<updated>2026-02-18T17:01:04Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: /* Index label auto updates */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:What's new pages]]&lt;br /&gt;
[[category:Analytica releases]]&lt;br /&gt;
&lt;br /&gt;
[[Analytica 7.0]] will be the next major Analytica release and is currently in [[Beta Tester Page|beta testing]]. Go to [[Beta Tester Page]] to try it. The current official release is [[Analytica 6.6]]. &lt;br /&gt;
&lt;br /&gt;
==Highlights of Analytica 7.0==&lt;br /&gt;
&lt;br /&gt;
* '''[[#Python integration|Python integration]]:''' The major enhancement is integration with Python and hence the entire Python ecosystem of libraries. You can easily call functions from Python libraries, access Python variables, and even write Python code right inside Analytica variables and functions. So now you can mix and match Analytica and Python according to which language you think best for your modeling or coding needs.&lt;br /&gt;
*  '''[[#Index label auto updates|Index label auto updates]]:''' A common source of errors has been when you change a text label in an Index without remembering to change expressions that refer to that same text label. Changes to labels now update automatically in expressions in most cases.&lt;br /&gt;
*  The '''Analytica Enterprise'''' edition has been renamed the [[#Developer Edition (formerly known as Enterprise) |Developer edition]], which better reflects what it is.&lt;br /&gt;
* It introduces two new object Classes:  &lt;br /&gt;
** [[Struct]] lets you bundle disparate values, like text, numbeers, atoms and arrays, together in one object that does not array abstract -- similar to Records and Classes in other languages).  &lt;br /&gt;
** [[Callable]] is like a user-defined Function but it's Definition can be a [[handle]] to a Python class or a Python function. &lt;br /&gt;
* [[ParseJSON]] and [[MakeJSON]] now use Structs, which are much more convenient for representing the hierarchical structure of JSON.&lt;br /&gt;
* [[#SpreadsheetOpen|Read and write spreadsheets without Excel]]:  This is faster and more robust, and you don't need Excel installed.&lt;br /&gt;
&lt;br /&gt;
== [[Using Python from Analytica|Python integration]] ==&lt;br /&gt;
&lt;br /&gt;
You can now write Python code inside Analytica definitions! It's easy to call Python functions, with Analytica-style Intelligent Arrays!. So you can access the vast ecosystem of Python libraries (''modules'' in Python lingo). Among the gazillion possibilities are specialized libraries for data visualization, statistics, machine learning, and much more.&lt;br /&gt;
It means that you can mix and match Analytica and Python -- write Analytica code for what's easiest in Analytica and Python code for what's easiest in Python.  &lt;br /&gt;
&lt;br /&gt;
See: [[Using Python from Analytica]]&lt;br /&gt;
(In [[Analytica Developer]] edition or better). &lt;br /&gt;
&lt;br /&gt;
For the Analytica modeler, this puts a ton of resources at your fingertips. &lt;br /&gt;
&lt;br /&gt;
It's also pretty cool for the Python developer. Analytica is like a new interactive development environment with a lot of unique advantages, especially during interactive code development:&lt;br /&gt;
* Analytica's dependency maintenance can be really convenient during interactive development, creating automatic dependency maintenance between your Python functions, classes and variables that don't exist in Python.&lt;br /&gt;
* The visual influence diagram layout can be a super useful to way organize and visualize your code.&lt;br /&gt;
* It naturally encourages declarative code practices, which leads to better and more maintainable coding style.&lt;br /&gt;
* You get the benefits of Analytica's edit tables, plus for results, Analytica's multi-D result tables and one-click, no-code, graphing.&lt;br /&gt;
* It is easy to wrap existing Python models to get Monte Carlo, parametric analysis and sensitivity analysis with Analytica ease.&lt;br /&gt;
* Sometimes one or the other language is more convenient for a particular task. You can freely switch between whichever language feels better suited to the immediate task, and intermix languages easily.&lt;br /&gt;
&lt;br /&gt;
== Developer Edition (formerly known as Enterprise) ==&lt;br /&gt;
&lt;br /&gt;
Analytica's middle-tier edition formerly known as the ''Enterprise Edition'', it is now called the [[Analytica Developer|Analytica Developer edition]]. That name better reflects what it is--software for developers of decision applications.  If you're now a user of Analytica Enterprise you don't have to update your license or do anything special. The name will just change when you install Analytica 7.0.  In Analytica docs, when you select &amp;quot;7.0&amp;quot; on the release bar (at the top of pages that have release-contingent content), all the docs automatically use the new Analytica Developer edition name. &lt;br /&gt;
&lt;br /&gt;
== Analytica language extensions ==&lt;br /&gt;
&lt;br /&gt;
=== Index label auto updates ===&lt;br /&gt;
&lt;br /&gt;
When you change the identifier of a variable, Analytica automatically updates all Definitions to use the new name. But, when you change a text label in an Index, it previously caused an error in any Definition using that label. For example, if you have&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Index Animal := ['Cat', 'Dog']&lt;br /&gt;
 Variable Sound := IF Animal = 'Cat' THEN 'Miaow' ELSE 'Woof'&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
If you change &amp;lt;code&amp;gt; 'Cat'&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;'Feline' &amp;lt;/code&amp;gt; in Index &amp;lt;code&amp;gt;Animal&amp;lt;/code&amp;gt;, the Definition of &amp;lt;code&amp;gt;Sound&amp;lt;/code&amp;gt; will now automatically update to&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 IF Animal = 'Feline' THEN 'Miaow' ELSE 'Woof'&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
It does this wherever it sees &amp;lt;code&amp;gt;Animal= 'Cat'&amp;lt;label&amp;gt;&amp;lt;/code&amp;gt;. If you use an index label in a context where the index doesn't normally appear, you should the new [[Index-label dot syntax]] (&amp;lt;code&amp;gt;Animal . 'Cat'&amp;lt;/code&amp;gt;). By associating the label with its index it will automatically update when needed. These [[Keeping text literals consistent with index labels| features]] help you avoiding a common error when updating text labels in Indexes.&lt;br /&gt;
&lt;br /&gt;
=== Callable ===&lt;br /&gt;
&lt;br /&gt;
The new object [[Class]] [[Callable]] is a variable-like object, meaning it has a [[Definition]] and a computed value, but can be used for convenience and documentation when the computed value itself is something that can be called, such as a [[Local function]] (aka ''lambda function''), a [[handle]] to an global function, a Python class or a Python function.&lt;br /&gt;
&lt;br /&gt;
If you &amp;quot;compute&amp;quot; the identity of a callable data item inside a normal [[Variable]] instance, &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;, you could call it using the syntax &amp;lt;code&amp;gt;X-&amp;gt;(a,b,c)&amp;lt;/code&amp;gt;. On your influence diagram the object would have a rounded rectangle and thus would not communicate that the result is something that can be called. When you change its class to be a [[Callable]], you can then invoke the call using the syntax &amp;lt;code&amp;gt;X(a,b,c)&amp;lt;/code&amp;gt; and the shape of the node changes to something that resembles a function shape, thus communicating that this holds something that is callable.&lt;br /&gt;
&lt;br /&gt;
To create a callable, first create a [[Variable]] node, then use the [[Class]] dropdown from the [[Object window]] or [[Attribute pane]] to change the class to ''Callable''.&lt;br /&gt;
&lt;br /&gt;
=== Struct ===&lt;br /&gt;
A [[Struct]] defines a new atomic, immutable data type. For use when you need to bundle multiple heterogeneous items and don't want their dimensionalities to interact. Array abstract treats an instance of a Struct as a single cell (an atom).&lt;br /&gt;
&lt;br /&gt;
=== Expression and Lazy qualifiers ===&lt;br /&gt;
An expression passed to a function parameter declared with the qualifier as &amp;lt;code&amp;gt;[[Function_parameter_qualifiers#Expression|Expression]]&amp;lt;/code&amp;gt; can now include local variable identifiers. The local variables are captured (similar to how they would be captured by a [[Local function]]).&lt;br /&gt;
&lt;br /&gt;
A new function parameter qualifier, [[Function_parameter_qualifiers#Lazy]], has been added, which does lazy evaluation of the expression passed to it. In the function Definition, you can use it as if it were a normal value parameter, but evaluation occurs when the value is used rather than when the function is called, and in the evaluation context (which includes the [[Evaluation modes|evaluation mode]]) where the value is used instead as in the context of the call.&lt;br /&gt;
&lt;br /&gt;
=== Excess parameter qualifier ===&lt;br /&gt;
A new function declaration allows a function to tolerate or capture excess named parameters in the call that are not declared as parameter names in the function's Parameters declaration. It can also be used in a [[Struct]] declaration.&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
=== ParseJSON ===&lt;br /&gt;
Changed to parse to [[Struct]]s, thus greatly simplifying and improving the convenience of using JSON in Analytica expressions. &lt;br /&gt;
&lt;br /&gt;
For parsing with a schema, a Struct's declaration serves as the schema, which is far easier and more familiar for an Analytica user than the former scheme for specifying a schema.&lt;br /&gt;
&lt;br /&gt;
[[MakeJSON]] is able to generate JSON from a Struct (or nested structs) as well, which is the most convenient representation for JSON representations.&lt;br /&gt;
&lt;br /&gt;
=== SpreadsheetOpen ===&lt;br /&gt;
Added a new «backend» parameter to [[SpreadsheetOpen]] with a new option of &amp;lt;code&amp;gt;'LibXl'&amp;lt;/code&amp;gt;, allowing you to read and manipulate a spreadsheet without having Excel installed. But unlike the Excel backend, the &amp;lt;b&amp;gt;LibXl&amp;lt;/b&amp;gt; option does not have a calculation engine (so can't recompute cell formulas after you change cells). This option is be better when you simply want to read (or write) data in a *.xlsx file format.&lt;br /&gt;
&lt;br /&gt;
== Example models and libraries ==&lt;br /&gt;
&lt;br /&gt;
* There is a new &amp;quot;Auto insurance claim risk analysis.ana&amp;quot; in the Example Models / Risk Analysis folder.&lt;br /&gt;
* The [[Mutables library]] has been updated. It provides a new [[Mutable]] [[Struct]] which is superior to the older representation, which displays the actual value in result table cells and is atomic. The legacy functions ([[MutableNew]], [[MutableSet]] and [[MutableGet]]) are still there for backward compatibility, but have been changed to just wrap the new Mutable.&lt;br /&gt;
&lt;br /&gt;
== Result tables and graphs ==&lt;br /&gt;
* A blank (none) entry was added to the [[XY_comparison#Use_comparison_index|comparison index pulldown]]. Use this to quickly unset the comparison index without having to re-enter the [[XY_comparison]] dialog. Also, the pulldown is now visible and enabled in browse mode.&lt;br /&gt;
* Comparison variables are no longer summed over slicer indexes that are set to '''Totals''' when the value for that variable does not include the slicer index. Note that this results in some changes to what is displayed in table body cells and in axis scaling on graphs.&lt;br /&gt;
&lt;br /&gt;
== Assista ==&lt;br /&gt;
&lt;br /&gt;
You can now copy-paste from Expression blocks in Assista's response using the little copy icon in the top-right corner of the expression block.&lt;br /&gt;
&lt;br /&gt;
== Experimental ==&lt;br /&gt;
* A way for an Analytica model running in desktop Analytica to [[MCP server in Analytica|act as a Model Context Protocol (MCP) server]] for use by Large Language Models (LLMs).&lt;br /&gt;
&lt;br /&gt;
== ADE ==&lt;br /&gt;
* Added a new example: &amp;lt;code&amp;gt;Mcp_server&amp;lt;/code&amp;gt;.  This is an MCP server that wraps ADE. Among other things, it can give AI agents like Claude Code the ability to build, explore and use Analytica models.&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.0%3F&amp;diff=63747</id>
		<title>What's new in Analytica 7.0?</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.0%3F&amp;diff=63747"/>
		<updated>2026-02-18T01:36:14Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: /* Index label auto updates */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:What's new pages]]&lt;br /&gt;
[[category:Analytica releases]]&lt;br /&gt;
&lt;br /&gt;
[[Analytica 7.0]] will be the next major Analytica release and is currently in [[Beta Tester Page|beta testing]]. Go to [[Beta Tester Page]] to try it. The current official release is [[Analytica 6.6]]. &lt;br /&gt;
&lt;br /&gt;
==Highlights of Analytica 7.0==&lt;br /&gt;
&lt;br /&gt;
* '''[[#Python integration|Python integration]]:''' The major enhancement is integration with Python and hence the entire Python ecosystem of libraries. You can easily call functions from Python libraries, access Python variables, and even write Python code right inside Analytica variables and functions. So now you can mix and match Analytica and Python according to which language you think best for your modeling or coding needs.&lt;br /&gt;
*  '''[[#Index label auto updates|Index label auto updates]]:''' A common source of errors has been when you change a text label in an Index without remembering to change expressions that refer to that same text label. Changes to labels now update automatically in expressions in most cases.&lt;br /&gt;
*  The '''Analytica Enterprise'''' edition has been renamed the [[#Developer Edition (formerly known as Enterprise) |Developer edition]], which better reflects what it is.&lt;br /&gt;
* It introduces two new object Classes:  &lt;br /&gt;
** [[Struct]] lets you bundle disparate values, like text, numbeers, atoms and arrays, together in one object that does not array abstract -- similar to Records and Classes in other languages).  &lt;br /&gt;
** [[Callable]] is like a user-defined Function but it's Definition can be a [[handle]] to a Python class or a Python function. &lt;br /&gt;
* [[ParseJSON]] and [[MakeJSON]] now use Structs, which are much more convenient for representing the hierarchical structure of JSON.&lt;br /&gt;
* [[#SpreadsheetOpen|Read and write spreadsheets without Excel]]:  This is faster and more robust, and you don't need Excel installed.&lt;br /&gt;
&lt;br /&gt;
== [[Using Python from Analytica|Python integration]] ==&lt;br /&gt;
&lt;br /&gt;
You can now write Python code inside Analytica definitions! It's easy to call Python functions, with Analytica-style Intelligent Arrays!. So you can access the vast ecosystem of Python libraries (''modules'' in Python lingo). Among the gazillion possibilities are specialized libraries for data visualization, statistics, machine learning, and much more.&lt;br /&gt;
It means that you can mix and match Analytica and Python -- write Analytica code for what's easiest in Analytica and Python code for what's easiest in Python.  &lt;br /&gt;
&lt;br /&gt;
See: [[Using Python from Analytica]]&lt;br /&gt;
(In [[Analytica Developer]] edition or better). &lt;br /&gt;
&lt;br /&gt;
For the Analytica modeler, this puts a ton of resources at your fingertips. &lt;br /&gt;
&lt;br /&gt;
It's also pretty cool for the Python developer. Analytica is like a new interactive development environment with a lot of unique advantages, especially during interactive code development:&lt;br /&gt;
* Analytica's dependency maintenance can be really convenient during interactive development, creating automatic dependency maintenance between your Python functions, classes and variables that don't exist in Python.&lt;br /&gt;
* The visual influence diagram layout can be a super useful to way organize and visualize your code.&lt;br /&gt;
* It naturally encourages declarative code practices, which leads to better and more maintainable coding style.&lt;br /&gt;
* You get the benefits of Analytica's edit tables, plus for results, Analytica's multi-D result tables and one-click, no-code, graphing.&lt;br /&gt;
* It is easy to wrap existing Python models to get Monte Carlo, parametric analysis and sensitivity analysis with Analytica ease.&lt;br /&gt;
* Sometimes one or the other language is more convenient for a particular task. You can freely switch between whichever language feels better suited to the immediate task, and intermix languages easily.&lt;br /&gt;
&lt;br /&gt;
== Developer Edition (formerly known as Enterprise) ==&lt;br /&gt;
&lt;br /&gt;
Analytica's middle-tier edition formerly known as the ''Enterprise Edition'', it is now called the [[Analytica Developer|Analytica Developer edition]]. That name better reflects what it is--software for developers of decision applications.  If you're now a user of Analytica Enterprise you don't have to update your license or do anything special. The name will just change when you install Analytica 7.0.  In Analytica docs, when you select &amp;quot;7.0&amp;quot; on the release bar (at the top of pages that have release-contingent content), all the docs automatically use the new Analytica Developer edition name. &lt;br /&gt;
&lt;br /&gt;
== Analytica language extensions ==&lt;br /&gt;
&lt;br /&gt;
=== Index label auto updates ===&lt;br /&gt;
&lt;br /&gt;
When you change the identifier of a variable, Analytica automatically updates all Definitions to use the new name. But, when you change a text label in an Index, it previously cause cause errors in Definitions using that label. For example, if you have&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  Index Animal := ['Cat', 'Dog']&lt;br /&gt;
  Variable Sound := IF Animal = 'Cat' THEN 'Miaow' ELSE 'Woof'&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
If you change &amp;lt;code&amp;gt; 'Cat'&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;'Feline' &amp;lt;/code&amp;gt; in Index &amp;lt;code&amp;gt;Animal&amp;lt;/code&amp;gt;, the Definition of &amp;lt;code&amp;gt;Sound&amp;lt;/code&amp;gt; will now automatically update to&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     IF Animal = 'Feline' THEN 'Miaow' ELSE 'Woof'&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
It does this wherever it sees &amp;lt;code&amp;gt;Animal=&amp;lt;label&amp;gt;&amp;lt;/code&amp;gt;. If you use an index label in a context where the index doesn't normally appear, you should the new [[Index-label dot syntax]] (&amp;lt;code&amp;gt;Animal . 'Cat'&amp;lt;/code&amp;gt;). By associating the label with its index it will automatically update when needed. These [[Keeping text literals consistent with index labels| features]] help avoid common errors when updating text labels in Indexes.&lt;br /&gt;
&lt;br /&gt;
=== Callable ===&lt;br /&gt;
&lt;br /&gt;
The new object [[Class]] [[Callable]] is a variable-like object, meaning it has a [[Definition]] and a computed value, but can be used for convenience and documentation when the computed value itself is something that can be called, such as a [[Local function]] (aka ''lambda function''), a [[handle]] to an global function, a Python class or a Python function.&lt;br /&gt;
&lt;br /&gt;
If you &amp;quot;compute&amp;quot; the identity of a callable data item inside a normal [[Variable]] instance, &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;, you could call it using the syntax &amp;lt;code&amp;gt;X-&amp;gt;(a,b,c)&amp;lt;/code&amp;gt;. On your influence diagram the object would have a rounded rectangle and thus would not communicate that the result is something that can be called. When you change its class to be a [[Callable]], you can then invoke the call using the syntax &amp;lt;code&amp;gt;X(a,b,c)&amp;lt;/code&amp;gt; and the shape of the node changes to something that resembles a function shape, thus communicating that this holds something that is callable.&lt;br /&gt;
&lt;br /&gt;
To create a callable, first create a [[Variable]] node, then use the [[Class]] dropdown from the [[Object window]] or [[Attribute pane]] to change the class to ''Callable''.&lt;br /&gt;
&lt;br /&gt;
=== Struct ===&lt;br /&gt;
A [[Struct]] defines a new atomic, immutable data type. For use when you need to bundle multiple heterogeneous items and don't want their dimensionalities to interact. Array abstract treats an instance of a Struct as a single cell (an atom).&lt;br /&gt;
&lt;br /&gt;
=== Expression and Lazy qualifiers ===&lt;br /&gt;
An expression passed to a function parameter declared with the qualifier as &amp;lt;code&amp;gt;[[Function_parameter_qualifiers#Expression|Expression]]&amp;lt;/code&amp;gt; can now include local variable identifiers. The local variables are captured (similar to how they would be captured by a [[Local function]]).&lt;br /&gt;
&lt;br /&gt;
A new function parameter qualifier, [[Function_parameter_qualifiers#Lazy]], has been added, which does lazy evaluation of the expression passed to it. In the function Definition, you can use it as if it were a normal value parameter, but evaluation occurs when the value is used rather than when the function is called, and in the evaluation context (which includes the [[Evaluation modes|evaluation mode]]) where the value is used instead as in the context of the call.&lt;br /&gt;
&lt;br /&gt;
=== Excess parameter qualifier ===&lt;br /&gt;
A new function declaration allows a function to tolerate or capture excess named parameters in the call that are not declared as parameter names in the function's Parameters declaration. It can also be used in a [[Struct]] declaration.&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
=== ParseJSON ===&lt;br /&gt;
Changed to parse to [[Struct]]s, thus greatly simplifying and improving the convenience of using JSON in Analytica expressions. &lt;br /&gt;
&lt;br /&gt;
For parsing with a schema, a Struct's declaration serves as the schema, which is far easier and more familiar for an Analytica user than the former scheme for specifying a schema.&lt;br /&gt;
&lt;br /&gt;
[[MakeJSON]] is able to generate JSON from a Struct (or nested structs) as well, which is the most convenient representation for JSON representations.&lt;br /&gt;
&lt;br /&gt;
=== SpreadsheetOpen ===&lt;br /&gt;
Added a new «backend» parameter to [[SpreadsheetOpen]] with a new option of &amp;lt;code&amp;gt;'LibXl'&amp;lt;/code&amp;gt;, allowing you to read and manipulate a spreadsheet without having Excel installed. But unlike the Excel backend, the &amp;lt;b&amp;gt;LibXl&amp;lt;/b&amp;gt; option does not have a calculation engine (so can't recompute cell formulas after you change cells). This option is be better when you simply want to read (or write) data in a *.xlsx file format.&lt;br /&gt;
&lt;br /&gt;
== Example models and libraries ==&lt;br /&gt;
&lt;br /&gt;
* There is a new &amp;quot;Auto insurance claim risk analysis.ana&amp;quot; in the Example Models / Risk Analysis folder.&lt;br /&gt;
* The [[Mutables library]] has been updated. It provides a new [[Mutable]] [[Struct]] which is superior to the older representation, which displays the actual value in result table cells and is atomic. The legacy functions ([[MutableNew]], [[MutableSet]] and [[MutableGet]]) are still there for backward compatibility, but have been changed to just wrap the new Mutable.&lt;br /&gt;
&lt;br /&gt;
== Result tables and graphs ==&lt;br /&gt;
* A blank (none) entry was added to the [[XY_comparison#Use_comparison_index|comparison index pulldown]]. Use this to quickly unset the comparison index without having to re-enter the [[XY_comparison]] dialog. Also, the pulldown is now visible and enabled in browse mode.&lt;br /&gt;
* Comparison variables are no longer summed over slicer indexes that are set to '''Totals''' when the value for that variable does not include the slicer index. Note that this results in some changes to what is displayed in table body cells and in axis scaling on graphs.&lt;br /&gt;
&lt;br /&gt;
== Assista ==&lt;br /&gt;
&lt;br /&gt;
You can now copy-paste from Expression blocks in Assista's response using the little copy icon in the top-right corner of the expression block.&lt;br /&gt;
&lt;br /&gt;
== Experimental ==&lt;br /&gt;
* A way for an Analytica model running in desktop Analytica to [[MCP server in Analytica|act as a Model Context Protocol (MCP) server]] for use by Large Language Models (LLMs).&lt;br /&gt;
&lt;br /&gt;
== ADE ==&lt;br /&gt;
* Added a new example: &amp;lt;code&amp;gt;Mcp_server&amp;lt;/code&amp;gt;.  This is an MCP server that wraps ADE. Among other things, it can give AI agents like Claude Code the ability to build, explore and use Analytica models.&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=User:ACP3_Enhancements_and_fixes&amp;diff=63746</id>
		<title>User:ACP3 Enhancements and fixes</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=User:ACP3_Enhancements_and_fixes&amp;diff=63746"/>
		<updated>2026-02-18T01:28:21Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: /* Pre release */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;          [[Category: Analytica_Cloud_Platform]]&lt;br /&gt;
[[Analytica_Cloud_Platform#See_also|&amp;lt;&amp;lt;Back to Analytica Cloud Platform]]&lt;br /&gt;
&lt;br /&gt;
The most &lt;br /&gt;
These are changes by build for releases on the staging server, which may not yet be released on the release server. When they are, the issues likely to be of interest to most users are copied over to [[What's new in ACP?]].&lt;br /&gt;
&lt;br /&gt;
The next planned release is build 180. It should be released in mid February 2026.&lt;br /&gt;
&lt;br /&gt;
'''ER''' - Enhancement request number&lt;br /&gt;
'''EW''' - Bug number &lt;br /&gt;
'''W''' - Monday item number&lt;br /&gt;
&lt;br /&gt;
=='''Pre release'''==&lt;br /&gt;
&lt;br /&gt;
Issues that have been implemented or fixed since the Current release (build 174) .&lt;br /&gt;
&lt;br /&gt;
===Fixed or implemented in ACP build 181===&lt;br /&gt;
*M-06433       Error message box sometimes shows errors from a previous model when opening a new model.&lt;br /&gt;
*M-06430       UseEval warnings and evalOnCells warnings are showing on the diagram instead of only in the console.&lt;br /&gt;
*M-06392      Icons on the BCH server sometimes appear broken&lt;br /&gt;
&lt;br /&gt;
===ACP build 180===&lt;br /&gt;
====Bug fixes and minor enhancements====&lt;br /&gt;
*M-01229      Make ACP resize images in tables as in DTA&lt;br /&gt;
*M-06421	Com error in send email/send email invites in suan account model&lt;br /&gt;
*M-06417	Compute button not appearing in frame node&lt;br /&gt;
*M-06416	For [[ACP_Server_License|AcpServer]] Added a Watchdog (aka zombie killer) script for the suan server processes - restarts them if the websocket becomes unresponsive. (In addition to the built in redundancy). &lt;br /&gt;
*M-06415	CSV Download format for Long and Wide tables are not correct while downloading for the first time after page refresh&lt;br /&gt;
*M-06402	UI fails to update after calculations complete.&lt;br /&gt;
*M-06400	Can't scroll all the way to the right in a table&lt;br /&gt;
*M-06383	Show all icons in maximized frame node view&lt;br /&gt;
*M-06382	change to the expand view tooltip&lt;br /&gt;
*M-06381	position tooltips below the icon in frame nodes, and add tail&lt;br /&gt;
*M-06353	Vertical scroll bar should not cover column headers&lt;br /&gt;
*M-00006	Diagram and module hierarchy don't update when new object is clicked on&lt;br /&gt;
*M-00049	Click on inputs in tall node goes to result not object window&lt;br /&gt;
*M-06369	Table filtering: menu gets cut off if window is too small&lt;br /&gt;
*M-00174	Can't resize a table column with a slider in the cell&lt;br /&gt;
*M-00652	Slider shows as an empty cell when copying or downloading csv from an edit table.&lt;br /&gt;
*M-01254	Tall atomic subtable input not showing label in middle&lt;br /&gt;
*M-06380	Remove the green outline around check boxes&lt;br /&gt;
&lt;br /&gt;
===Fixed or implemented in ACP build 179===&lt;br /&gt;
*M-06389	Remove teal box around checkbox inputs on click&lt;br /&gt;
*M-06391	Cancel button in a progress bar doesn't work if a calculation is not ongoing&lt;br /&gt;
*M-06397	new AcpStyle Frame_default_view:&lt;br /&gt;
*M-06395	No download and Diagram hang after pressing download csv icon in frame node. For large files - it was timing out. Added a download size estimate and animation to show that the file is being downloaded.&lt;br /&gt;
*M-06390	Suan process crashes when launched with /config:server or singleinstance&lt;br /&gt;
*M-06387	Reduce the size of a progress bar without any textual parameters - to the same size as progress bars with textual parameters.&lt;br /&gt;
*M-06386	ACP did not reliably show progress bars and message boxes that showed in DTA during a computation. &lt;br /&gt;
*M-06359	ACP1 invite link does not open model&lt;br /&gt;
*M-06346	Lines don't align in Table UI&lt;br /&gt;
&lt;br /&gt;
===Fixed or implemented in ACP build 178===&lt;br /&gt;
*M-06372	Object view does not switch nodes&lt;br /&gt;
*M-06339	Frame node does not show object view  initially&lt;br /&gt;
*M-00002	A way to make the Object view the first default view (instead of result) in a Frame node&lt;br /&gt;
*M-00516	A way to keep cells selected while scrolling in a table.&lt;br /&gt;
*M-00004	Max: Text in lists should be similar to the diagram font size&lt;br /&gt;
&lt;br /&gt;
===Fixed or implemented in ACP build 177===&lt;br /&gt;
*M-06368	with object view set as default in frame nodes, clicking on result does not show result&lt;br /&gt;
*M-06385	ACP hangs on BCH model when switching between tabs&lt;br /&gt;
*M-06363	Edit table too many messages with wrong cell format entry&lt;br /&gt;
*M-06361	show_table_filtering does not effect tables in the ACP1 tab&lt;br /&gt;
*M-06357	For column and row pivoters, need a blank cell for no index view&lt;br /&gt;
*M-06355	Cell format 'text and number' accepts only number&lt;br /&gt;
*M-06354	No scroll bar for long list indexes&lt;br /&gt;
*M-06350	Close popup after reordering items in a list&lt;br /&gt;
*M-06349	In Framenodes remember object view for edit tables and input nodes c.f. m-00011&lt;br /&gt;
*M-06344	Edit table extends past white background after pivoting&lt;br /&gt;
*M-00003	Max: When adding to a list using the list UI, the new entry should be highlighted cf 2314&lt;br /&gt;
*M-00005	Add scrollbar to Text node&lt;br /&gt;
*M-01864	When selecting Time from inputs popup, show object window for time.&lt;br /&gt;
*M-01997	Stop showing hand pointer for diagram background.&lt;br /&gt;
*M-00009	Max: Improvements to the List input UI&lt;br /&gt;
*M-00079	Max: Improve the graphic design for Object view.&lt;br /&gt;
*M-00186	Text in tall node object view does not wrap correctly.&lt;br /&gt;
*M-00393	Cell selection rect doesn't expand as cell contents make the cell larger&lt;br /&gt;
&lt;br /&gt;
===Fixed or implemented in ACP build 176===&lt;br /&gt;
*M-06356	Crash after entering wrong cell format value into multitable&lt;br /&gt;
*M-06338	stray 0 inside of a framenode and text node&lt;br /&gt;
*M-00012	In Bare icon style, make the buttons in user input and output nodes  just show the icon.&lt;br /&gt;
*M-00013	Missing probabilistic result icons&lt;br /&gt;
*M-02001	User outputs with long textual results not truncating correctly.&lt;br /&gt;
&lt;br /&gt;
===Fixed or implemented in ACP build 175===&lt;br /&gt;
* ER 2303 MultiChoice input node UI improvements.&lt;br /&gt;
* EW 2306 ACP crashes after download button click -  downloading a particular blank template types from a database instance.&lt;br /&gt;
* M-00018 Multiple errors followed by unusable model  after entering invalid cell value into edit table&lt;br /&gt;
* M-00021 - Text in form nodes is slightly below center&lt;br /&gt;
* M-00031 In outline view, the style library asks which modules to show as tabs. (Desktop Analytica bug 21800)&lt;br /&gt;
* M-00033 Update ACP's UI Icons&lt;br /&gt;
* M-00058 Add date picker functionality to date inputs&lt;br /&gt;
&lt;br /&gt;
=='''Current release'''==&lt;br /&gt;
=== Fixed or implemented in ACP build 174  11- Nov 2025===&lt;br /&gt;
* EW 2301 Deleted text value in a table cell becomes '0' instead of ''&lt;br /&gt;
* EW 2300 Table filtering acp style precedence is wrong for frame nodes and variables&lt;br /&gt;
&lt;br /&gt;
=== Fixed or implemented in ACP build 173  9 - Nov 2025===&lt;br /&gt;
* ER 2243 AcpStyle to turn on / turn off table filtering&lt;br /&gt;
&lt;br /&gt;
=== Fixed or implemented in ACP build 172  3 - Nov 2025 ===&lt;br /&gt;
* EW 2295 Sql error thrown in model_run_counting due to date format.&lt;br /&gt;
* EW 2293 MsgBox window is cut off when messages are long.&lt;br /&gt;
* EW 2292 Sum - totals icon is tricky to use. Needs to have the clickable area enlarged.&lt;br /&gt;
* EW 2291 No option to download csv in an edit table (framenode).&lt;br /&gt;
&lt;br /&gt;
=== Fixed or implemented in ACP build 171  29 Oct 2025 ===&lt;br /&gt;
* EW 2283 Numbers do not fit User inputs&lt;br /&gt;
* ER 2281 Expand/reduce icon should be the right most icon&lt;br /&gt;
* ER 2274 Update the List and Sequence modals&lt;br /&gt;
* EW 2273 Artifact in the list and sequence modals&lt;br /&gt;
* EW 2271 Graph does not display after reducing while graph is zoomed&lt;br /&gt;
* EW 2269 Loading bar has extra symbol&lt;br /&gt;
* EW 2266 Tooltip text for the maximize icon is wrong&lt;br /&gt;
&lt;br /&gt;
=== Fixed or implemented in ACP build 170  22 Oct 2025 ===&lt;br /&gt;
* EW 2288 Error when changing from mid to probabilistic in a frame node&lt;br /&gt;
* EW 2285 Diagram crash when selecting uncertainty result in atomic result node.&lt;br /&gt;
&lt;br /&gt;
=== Fixed or implemented in ACP build 169  15 - Oct 2025===&lt;br /&gt;
* EW 2270 Pressing the Reduce button in tall nodes returns to an acp tab instead of the embedded graph.&lt;br /&gt;
* EW 2232 Wrong number format in slider labels&lt;br /&gt;
* EW 2231 Scaling of slider labels looks bad&lt;br /&gt;
* EW 2228 Adding style library gives an unnecessary message &amp;quot;OK will set the styles library...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Fixed or implemented in ACP build 168 ===&lt;br /&gt;
* EW 2268 Crash when clicking filtering icon in column with dates&lt;br /&gt;
* EW 2263 Can't switch to table view - Suan server half&lt;br /&gt;
* EW 2261 With flex on, problem changing to table view in some models.&lt;br /&gt;
* ER 2260 Warning when pivoting a table with filters applied needs the positioning adjusted.&lt;br /&gt;
* ER 2256 Distribution input window should match updated ACP UI styling&lt;br /&gt;
* EW 2257 Input nodes UI inconsistent across input types&lt;br /&gt;
* ER 2196 Add an expand button (and reduce ) to graphs&lt;br /&gt;
* ER 1812 Implement clickable inputs/outputs in the object window in frame nodes/ tall nodes&lt;br /&gt;
&lt;br /&gt;
=== Fixed or implemented in ACP build 167  26 - Sept 2025 ===&lt;br /&gt;
* ER 2259 When a table has filter applied, If the pivot is changed, (e.g., columns are now rows) any previously selected filters should be cleared.&lt;br /&gt;
* ER 2252 - improve the Table filtering UI&lt;br /&gt;
* ER 2181 Add invite sent popup notification after sharing a model.&lt;br /&gt;
* EW 2167 Could not scroll the model description when it is present after mouseover of the title. The description closes when the mouse was moved.&lt;br /&gt;
&lt;br /&gt;
=== Fixed or implemented in ACP build 166  23 - Sep 2025 ===&lt;br /&gt;
* EW 2238 Crash when attempting to filter a table column that contains a handle.&lt;br /&gt;
* ER 2229 Enable the table filter menu on the row index column&lt;br /&gt;
&lt;br /&gt;
=== Fixed or implemented in ACP build 165  12 - Sep 2025 ===&lt;br /&gt;
* ER 2245 Update the icons for filtering tables&lt;br /&gt;
* EW 2242 In the user management the checkmark sticks on the wrong item after assigning a role.&lt;br /&gt;
* ER 2241 For Table filtering &amp;quot;Contains&amp;quot; Matches Handling on the javascript side&lt;br /&gt;
* EW 2225 Input node has scrollbars when it shouldn't with auto zoom set&lt;br /&gt;
&lt;br /&gt;
=== Fixed or implemented in ACP build 164  3 - Sep-2025 ===&lt;br /&gt;
(Test build only)&lt;br /&gt;
=== Fixed or implemented in ACP build 163  1 -  Sep-2025 ===&lt;br /&gt;
* ER 2222 Update choice menu UI dropdown&lt;br /&gt;
* EW 2100 Text nodes default to flex_box_item: yes&lt;br /&gt;
* ER 2076 Redesign hierarchical choice menu popup when at the right edge of the diagram.&lt;br /&gt;
&lt;br /&gt;
=== Fixed or implemented in ACP build 162  27 - Aug-2025 ===&lt;br /&gt;
* ER 2224 Update UI for input nodes with input field&lt;br /&gt;
* ER 2223 Add checkmark to Choice/Multichoice menus&lt;br /&gt;
* EW 2216 Fixed a crashing bug  when pressing download wide csv&lt;br /&gt;
* EW 2212 For ACP server configuration - fixed a bug where All users are effected by the configuration flag &amp;quot;reviewersCanUploadDataFiles&amp;quot; &lt;br /&gt;
* EW 2199 Fixed a bug, when mousing over the copy button the hover balloon shows description instead.&lt;br /&gt;
* EW 2090 No tool tips for hover icons that appear when the object view is displayed in a tall/frame node&lt;br /&gt;
&lt;br /&gt;
=== Fixed or implemented in ACP build 161  31 - July-2025 ===&lt;br /&gt;
* EW 2218 Rendering Issue in Some Models&lt;br /&gt;
* EW 2213 Cannot change from table to graph in framenode&lt;br /&gt;
* ER 2198 Add tooltip for the copy graph button&lt;br /&gt;
* ER 2183 Change hamburger menu to gear icon&lt;br /&gt;
* ER 2182 Updated connection status window style&lt;br /&gt;
* ER 2177 Make the actual menu show on mouseover instead of a tooltip (on the top bar)&lt;br /&gt;
* EW 2172 Upload button is enabled when reviewers cannot upload&lt;br /&gt;
* ER 2027 Implement label parameter for choice and multichoice&lt;br /&gt;
* EW 2218 Rendering Issue in Some Models&lt;br /&gt;
* EW 2213 Cannot change from table to graph in framenode&lt;br /&gt;
* 2198 Add tooltip for the copy graph button&lt;br /&gt;
* ER 2183 Change hamburger menu to gear icon&lt;br /&gt;
* ER 2182 Updated connection status window style to new tooltip styling&lt;br /&gt;
* ER 2177 Make the actual menu show on mouseover instead of the tooltip. (For the top bar)&lt;br /&gt;
* EW 2172 Upload button is enabled when reviewers cannot upload files.&lt;br /&gt;
* ER 2027 Implement label parameter for choice and multichoice&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fixed or implemented in ACP build 160  31 - July-2025 ===&lt;br /&gt;
Build 160 was not implemented- test build only&lt;br /&gt;
&lt;br /&gt;
=== Fixed or implemented in ACP build 159  27 - June-2025 ===&lt;br /&gt;
* EW 2175 No filtering for input nodes&lt;br /&gt;
* EW 2174 No text filtering in choice modes in edit tables&lt;br /&gt;
* ER 2162 Change title of the message sent to new users.&lt;br /&gt;
* ER 2093 Allowing HTML in text nodes in ACP (partial implementation)&lt;br /&gt;
* EW 1938 ACP style library is not setting auto zoom correctly when added to a model with option to retain the styles&lt;br /&gt;
* ER 1180 Get Download CSV working better with tables with 3 or more dimension&lt;br /&gt;
&lt;br /&gt;
=== Fixed or implemented in ACP build 158  22 - June-2025 ===&lt;br /&gt;
(A test build without any full implementation)&lt;br /&gt;
&lt;br /&gt;
=== Fixed or implemented in ACP build 157  18 - June-2025 ===&lt;br /&gt;
* ER 2137 Ability to select MariaDB in the assets\DB driver info.ana library (For ACP server).&lt;br /&gt;
* ER 2108 UI changes - UI redesign part 1.&lt;br /&gt;
* ER 2108 UI changes - UI redesign part 2.&lt;br /&gt;
* ER 2108 UI changes - UI redesign - icon updates.&lt;br /&gt;
* ER 2108 UI changes - UI redesign - usertable updates.&lt;br /&gt;
* ER 2093 Allowing HTML in text nodes in ACP. (Continued)&lt;br /&gt;
&lt;br /&gt;
=== Fixed or implemented in ACP build 156  3 - June-2025 ===&lt;br /&gt;
&lt;br /&gt;
=== Fixed or implemented in ACP build 155  20 - May-2025 ===&lt;br /&gt;
&lt;br /&gt;
=== Fixed or implemented in ACP build 154  9 - May-2025 ===&lt;br /&gt;
* ER 2093 Allowing HTML in text nodes in ACP. (Partial implementation for titles in text nodes)&lt;br /&gt;
&lt;br /&gt;
=== Fixed or implemented in ACP build 153  17 - January-2025 ===&lt;br /&gt;
* EW 2135 Error when closing object window in a frame node to go back to the table view&lt;br /&gt;
&lt;br /&gt;
=== Fixed or implemented in ACP build 152  30 - January-2025 ===&lt;br /&gt;
* 2133 Can not hide the Microsoft button for sign in&lt;br /&gt;
* EW 2129 Download indicator animation doesn't go away after download.&lt;br /&gt;
&lt;br /&gt;
=== Fixed or implemented in ACP build 151:  16 - December-2024 ===&lt;br /&gt;
* ER 2127 Convert the Sql to mariadb compatible in the publish to cloud service model.&lt;br /&gt;
* EW 2126 Can't generate a valid email invite code with mariadb&lt;br /&gt;
* ER 2120 Update fonts in Change password form.&lt;br /&gt;
* ER 2119 Update fonts in Add Project page.&lt;br /&gt;
* EW 2115 ACP will not open model listing with Suan 6.5 in Apache.&lt;br /&gt;
* ER 2113 Change tooltips shown for the help and close toolbar buttons when viewed in the ACP portal.&lt;br /&gt;
* ER 2112 Add AcpStyles for controlling the max/min zoom for auto_zoom_diagram: yes.&lt;br /&gt;
* ER 2111 Update toolbar buttons for question mark, hamburger, and power button icons.&lt;br /&gt;
* 2109 In Portal's model listing, move Upload, download, delete, share buttons at the top rather than bottom.&lt;br /&gt;
* EW 2107 Variable, object, chance node titles are not vertically centered when they reside in a text node that is a Flex box.&lt;br /&gt;
* ER 2099 Add Min % and Max % for auto zoom in the Acp style library.&lt;br /&gt;
* ER 2096 Get arrows between nodes to show when using FlexBox display.&lt;br /&gt;
* ER 2065 Remove the Analytica logo in the add project dialog.&lt;br /&gt;
* ER 1852 Add Object_in_frame to the style library.&lt;br /&gt;
&lt;br /&gt;
=== Fixed or implemented in ACP build 150:  5 - November-2024 ===&lt;br /&gt;
* ER 2095 Allow Microsoft login (when enabled) when no Google login is set.&lt;br /&gt;
* EW 2091 Hover icons in frame nodes can overlap the vertical scrollbar when viewing Object view.&lt;br /&gt;
* EW 2089 Hover icons in tall nodes can overlap the vertical scrollbar when viewing Object view.&lt;br /&gt;
* EW 2085 In object view, Table graph and other icons are too far to the right.&lt;br /&gt;
* EW 553 Col width not draggable and forgotten.&lt;br /&gt;
&lt;br /&gt;
=== Fixed or implemented in ACP build 149:  15 - October-2024 ===&lt;br /&gt;
* EW 2083 Stop bounce back when resizing the height of a row header in an edit or result table.&lt;br /&gt;
* EW 2080 Problem with discrete slider in table when zoomed in a lot.&lt;br /&gt;
* ER 2078 Internal code change: clean up code in slider.js and remove the newZoom variable.&lt;br /&gt;
* ER 2067 Add a way to display messages to users based on what Chrome version they are using.&lt;br /&gt;
* EW 2061 Graph zoom in feature is too sensitive, graphs zoom when I just want to click a data point.&lt;br /&gt;
* EW 2060 Hover balloons in zoomed frame/tall nodes not appearing in right location, or appearing off screen.&lt;br /&gt;
* EW 2047 Stop bounce back when resizing a column in an edit or result table.&lt;br /&gt;
&lt;br /&gt;
=== Fixed or implemented in ACP build 148:  8 - October-2024 ===&lt;br /&gt;
* EW 2081 The table of models in the portal is too narrow, it should have same margin on left and right hand sides&lt;br /&gt;
* EW 2064 ACP online docs in Help menu points to 'wiki...'&lt;br /&gt;
&lt;br /&gt;
=== Fixed or implemented in ACP build 147:  30 - September-2024 ===&lt;br /&gt;
* ER 2077 Get input node that is a discrete slider working when auto zoom diagrams is on.&lt;br /&gt;
* ER 2075 Get input node with continuous slider control working with auto zoom.&lt;br /&gt;
* ER 2074 Choice input pulldown menu is in wrong location when diagram is zoomed.&lt;br /&gt;
* ER 2073 White screen crash when opening tab in heat pump model with auto zoom set.&lt;br /&gt;
* EW 2072 Some of the user interface panes don't fit the diagram.&lt;br /&gt;
* EW 2071 Items in askmsgchoice pulldown menu not selectable.&lt;br /&gt;
* EW 2069 Sliders are hard to adjust with Auto zoom&lt;br /&gt;
* EW 2068 Help balloons position is off when hovering over nodes when auto zoom diagrams is yes&lt;br /&gt;
&lt;br /&gt;
=== Fixed or implemented in ACP build 146:  20 - September-2024 ===&lt;br /&gt;
* EW 2070 Add acpConfig flag to turning off &amp;quot;auto zoom diagrams&amp;quot; feature on a particular server.&lt;br /&gt;
* EW 2062 Wrong selection when you drag to select a portion of the graph for zooming.&lt;br /&gt;
* EW 2058 Data Balloon displayed when clicking on a graph that is zoomed is not working anymore&lt;br /&gt;
* ER 2043 Add a sign in with Microsoft option&lt;br /&gt;
&lt;br /&gt;
=== Fixed or implemented in ACP build 145:  10 - September-2024 ===&lt;br /&gt;
* ER 2055 Edit the login screen so it looks better with Microsoft. And add a flag to turn this feature off.&lt;br /&gt;
* ER 2054 Add a tool tip for the 'Show Object' button that appears in frame and tall nodes&lt;br /&gt;
* EW 2053 When viewing object view in an embedded node, sometimes the outputs shows object_view_btn_acp.&lt;br /&gt;
* EW 2052 Button icon missing in object view for button inputs / outputs.&lt;br /&gt;
* ER 2051 Add support for pasting into body cells of selected row or column of table&lt;br /&gt;
* EW 2050 Error occurs when typing when a row or column is selected in a table&lt;br /&gt;
* ER 2049 Support copying selected row or column so it can be pasted e.g. into Excel&lt;br /&gt;
* EW 2048 Selected column showing dashed lines when selection line should be solid&lt;br /&gt;
* EW 2046 Resizing a row or column header should not result in the row or column becoming selected&lt;br /&gt;
* ER 2043 Add a sign in with Microsoft option&lt;br /&gt;
* ER 2042 Add a flag for turning off EW 2041, selecting rows and columns by clicking on header cells&lt;br /&gt;
* ER 2041 Clicking on a table row header or column header should select that row or column&lt;br /&gt;
* ER 2040 Show hand cursor when hovering mouse of analytica cube&lt;br /&gt;
* EW 2038 Tooltip from top toolbar remains after opening model&lt;br /&gt;
* EW 1816 In Object in frame/tall nodes, the inputs and outputs text is clipped at the bottom.&lt;br /&gt;
* ER 1761 Press and drag to select a cell range in an edit table&lt;br /&gt;
&lt;br /&gt;
=== Fixed or implemented in ACP build 144:  10 - August-2024 ===&lt;br /&gt;
* EW 2057 Graph doesn't fit Frame node with auto zoom set.&lt;br /&gt;
* EW 2037 Node being highlighted when it should not be.  Problem relates to nodes results being showing in a frame node on another diagram&lt;br /&gt;
* EW 2036 Flickering and sometime disappearing icons on right hand side of top toolbar - caused by turning off the caching of images.&lt;br /&gt;
* EW 2035 &amp;lt;code&amp;gt;'Press to add a new project'&amp;lt;/code&amp;gt; tooltip remains after entering a module.&lt;br /&gt;
* EW 2034 Input node is highlighted when its original is being displayed in another module.&lt;br /&gt;
* ER 2033 Highlight nodes (that are not input/outputs) displayed in frame nodes, part 2, e.g. variable, decision etc. &lt;br /&gt;
* EW 2032 Edit table that is also a SubTable does not show in frame node when the form node is clicked (but does if the button is clicked).&lt;br /&gt;
* ER 2030 Add html meta tags to disable caching of index.html&lt;br /&gt;
* ER 2029 Turn off server side caching in Apache&lt;br /&gt;
* EW 2028 Crash on model open - ACP sessions log model&lt;br /&gt;
* EW 2014 Multiline table headers are displaying as a single line in edit and result tables&lt;br /&gt;
&lt;br /&gt;
=== Fixed or implemented in ACP build 143:  1 - August-2024 ===&lt;br /&gt;
* The [[Choice#nestUnder_for_hierarchical_menus|nestunder for Hierarchical choice menus]] are enabled in this build. &lt;br /&gt;
* ER 2026 Added a tooltip for the [+] Add project button in the top toolbar (ACP Group accounts) [[ACP_Group_plans_for_Managers_and_Admins#The_Models_tab|more information...]]&lt;br /&gt;
* EW 2025 Not all items are listed in a multichoice menu after having filtering items previously.&lt;br /&gt;
* EW 2024 Add Project button in toolbar is not aligned with the Account and Project choice inputs&lt;br /&gt;
* EW 2023 In Hierarchical multichoice, ACP allows no items selected in submenu when allownone is not set.&lt;br /&gt;
* EW 2021 Choice menu selection doesn't stick. (this was a side effect of the nestunder implementation).&lt;br /&gt;
* EW 2018 Hierarchical choice menu does not display all items after making a choice with the textual filter. (This was a side effect of the nestunder implementation).&lt;br /&gt;
&lt;br /&gt;
=== Fixed or implemented in ACP build 142:  19 - July-2024 ===&lt;br /&gt;
* EW 2019 Swap XY axis icon in frame node has no effect.&lt;br /&gt;
* EW 2018 Hierarchical choice menu does not display all items after making a choice. Also choice is not sticking.&lt;br /&gt;
* EW 2016 In Hierarchical multichoice, ACP allows no items selected when [[Multichoice#Parameters|allownone:]] is not set, shows 'All'.&lt;br /&gt;
* ER 2015 Highlight each node shown in Frame node(s) - input / output nodes.&lt;br /&gt;
* ER 2013 Enhancements and additions to the Close menu download option. Add popup with download link and change the text.&lt;br /&gt;
&lt;br /&gt;
=== Fixed or implemented in ACP build 141:  12 - July-2024 ===&lt;br /&gt;
* ER 2012 Add 8 pixel left margin between table shown in ACP tabs and left edge of browser.&lt;br /&gt;
* EW 2011 Crash when hovering on choice input popup menu with hierarchical menus (Related to the new Hierarchical inputs implementation).&lt;br /&gt;
* EW 2009 Menu item in First level of Hierarchical choice menu not showing check mark when clicked.&lt;br /&gt;
* ER 2005 Hierarchical choice menu filtering, show items that match first level menu name or if sub menu item matches.&lt;br /&gt;
* ER 1997 Align description with title in frame/tall nodes.&lt;br /&gt;
* ER 1988 Auto zoom not correct in some models due to hidden ACP Styles library node.&lt;br /&gt;
&lt;br /&gt;
=== Fixed or implemented in ACP build 140:  26 - June-2024 ===&lt;br /&gt;
* EW 2008 Choice Input nodes don't show the pulldown menu when clicked. (Related to the new Hierarchical inputs implementation). &lt;br /&gt;
* EW 2007 Diagram crash when clicking on multichoice input. (Related to the new Hierarchical inputs implementation).&lt;br /&gt;
* ER 2006 Get hierarchical choice inputs working for MultiChoice input nodes&lt;br /&gt;
* ER 2004 Hierarchical choice menus with multiple sub menus&lt;br /&gt;
* ER 2003 When filtering long menus, matches should include any substring present.&lt;br /&gt;
* EW 2002 Diagram crash using choice with sub-list.&lt;br /&gt;
* EW 1993 Swap x-y hover icon does not show for graphs displayed in Frame nodes.&lt;br /&gt;
&lt;br /&gt;
=== Fixed or implemented in ACP build 139:  21 - June-2024 ===&lt;br /&gt;
* EW 1998 Some arrows are black when they should be white (certain arrows with no associated error class.)&lt;br /&gt;
* ER 1995 Hierarchical choice input menus - step 1 (The simplest case &lt;br /&gt;
* ER 1994 acpConfig.json flag for enabling or disabling choice drop down sub menus.&lt;br /&gt;
&lt;br /&gt;
=== Fixed or implemented in ACP build 138:  1 - June-2024 ===&lt;br /&gt;
&lt;br /&gt;
* ER 1990 Need a scroll bar for Object view in tall nodes when the attributes don't fit the available space.&lt;br /&gt;
* EW 1989 Clicking the object icon in a tall node table has no effect. (MultiChoice inputs in the table cells) .&lt;br /&gt;
* EW 1981 Choice menus in table cells don't show with the correct font size.&lt;br /&gt;
* EW 1978 flex items don't wrap for flex_direction: column.&lt;br /&gt;
* ER 1964 Implement vertical and horizontal alignment CPS for Flex Boxes&lt;br /&gt;
* ER 1965 Implement Flex_gap cps style for controlling number of pixels between FlexBox Items&lt;br /&gt;
* ER 1961 flex_wrap: wrap style with flex_direction: column&lt;br /&gt;
&lt;br /&gt;
=== Fixed or implemented in ACP build 137:  22 -May-2024 ===&lt;br /&gt;
* ER 1986 Change the &amp;quot;display:flex&amp;quot; cps to be diagram/module level setting rather than a top level model setting&lt;br /&gt;
* ER 1982 Add 'Arial Narrow' to list of Sans Serif fonts in acpConfig.json because Karen/James are using it in the ACES model.&lt;br /&gt;
* EW 1977 Text Node within a Flex Box Item displays at bottom of flex box, but should not.&lt;br /&gt;
&lt;br /&gt;
=== Fixed or implemented in ACP build 136:  14 -May-2024 ===&lt;br /&gt;
* EW 1980 Project pulldown menu doesn't show&lt;br /&gt;
* EW 1970 Auto zoom not working for a model.&lt;br /&gt;
* ER 1969 Embed List of Google Fonts provided by Karen.&lt;br /&gt;
* ER 1967 Add other usable browsers to the Sign in page.	&lt;br /&gt;
* ER 1966 Turn off auto_zoom_diagrams when using FlexBox display.&lt;br /&gt;
* EW 1963 The order of the FloxBox items is different in ACP than in DTA, make it so it's the same.&lt;br /&gt;
* ER 1960 Give selected cells same background coloring as in Excel. Selected cells will have a gray background and the anchor cell will have a white background.&lt;br /&gt;
* EW 1939 Project pulldown menu shows in top bar when this model is running&lt;br /&gt;
* ER 1876 Select multiple cells by clicking on cell and dragging cursor to end cell,&lt;br /&gt;
* ER 1850 Stop showing red squiggle when entering a value into a cell.  The red squiggle is spell checker indicating a bad spelling.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fixed or implemented in ACP build 135:  27-Apr-2024 ===&lt;br /&gt;
* EW 1971 Lingering help balloons need to be closed with X button to clear them&lt;br /&gt;
* ER 1957 Add &amp;quot;Flex Wrap&amp;quot; cps style for diagrams with Flex Box display&lt;br /&gt;
* ER 1956 Add &amp;quot;Flex Direction&amp;quot; which can be used to change layout from row to column&lt;br /&gt;
* ER 1955 Flex Box layout. Clean up demo code and check in.&lt;br /&gt;
* EW 1953 Reduce cube appearances and cube flickering&lt;br /&gt;
* EW 1951 Can't cancel changes made to edit table in frame node&lt;br /&gt;
* EW 1950 Blinking caret remains in edit table cell after pressing Enter key&lt;br /&gt;
* ER 1946 Add filtering by date, sessions, unique users to the sessions log model.&lt;br /&gt;
* EW 1297 When pasting more than a few cells into ACP the spinning cube flickers on and off for a while&lt;br /&gt;
&lt;br /&gt;
=== Fixed or implemented in ACP build 134:  17-Apr-2024 ===&lt;br /&gt;
* EW 1949 Table cell becomes deselected when clicked..&lt;br /&gt;
* ER 1948 For Tables, keyboard combo shift+ctrl+arrow key should select the entire row or column.&lt;br /&gt;
* ER 1947 For tables, keyboard combo ctrl+arrow should move the selected cell to the beginning or end of a row or column.&lt;br /&gt;
* ER 1944 Add Try / Catch block to AcpConfig.json to show an error popup if there's mis-spelled flags.&lt;br /&gt;
* ER 1911 With multiple cells selected, arrow keys reselects to a single cell in the direction of the arrow key as in Excel.&lt;br /&gt;
* ER 1910 Allow editing in the anchor cell with multiple cells selected.&lt;br /&gt;
* EW 1902 Extra items on the privilege list for the Subscription Administration project.&lt;br /&gt;
* ER 1823 Add periodic heartbeat message on websocket.&lt;br /&gt;
&lt;br /&gt;
=== Fixed or implemented in ACP build 133:  9-Apr-2024 ===&lt;br /&gt;
* EW 1943 Node flickering while rendering the diagram, hidden nodes appear briefly then disappear.&lt;br /&gt;
* EW 1942 Slider control automatically changes value when it should not (after change from another slider).&lt;br /&gt;
* EW 1936 Can't enter &amp;quot; double quote into a cell after it is selected with a single click.&lt;br /&gt;
* EW 1934 An extra 'email' in the cue text for the email invite email address.&lt;br /&gt;
* EW 1933 Balloon help for the copy download button doesn't word wrap properly.&lt;br /&gt;
* EW 1931 Tall nodes don't work after font change.&lt;br /&gt;
&lt;br /&gt;
=== Fixed or implemented in ACP build 132:  13-Mar-2024 ===&lt;br /&gt;
&lt;br /&gt;
* EW 1929 Publish fails at sign in&lt;br /&gt;
* ER 1928 Detect whether someone is using a mobile device and add pop-up message.&lt;br /&gt;
* ER 1926 When you update a cell in ACP and hit enter, go to the next cell down, as in Excel and sheets.&lt;br /&gt;
* EW 1924 Table widths not the same in ACP as in DTA.&lt;br /&gt;
* EW 1920 Diagram hang - can't exit because of spinning cube.&lt;br /&gt;
* ER 1918 When editing a table cell, pressing tab should move cell selection to the next cell to the right.&lt;br /&gt;
* ER 1917 Configure ACP for connecting to a Domain controller over ldaps&lt;br /&gt;
* EW 1916 Default columns widths do not match DTA, they're a bit larger in ACP&lt;br /&gt;
* ER 1909 In top toolbar, change model title font from Arial to Century Gothic (w/ fallbacks)&lt;br /&gt;
* EW 1906 Crash after pressing sort icon in multitable&lt;br /&gt;
* ER 1905 Turn off sorting icon on edit multitables where it doesn't work.&lt;br /&gt;
* EW 1904 Text nodes with large title font are overlapped.&lt;br /&gt;
* EW 1815 Problem pasting cells from DTA tables into ACP tables&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 131:  5-Feb-2024==&lt;br /&gt;
	&lt;br /&gt;
* ER 1914 Add not_even_slicers to the options for setting show index menus in the ACP Style library.&lt;br /&gt;
* EW 1899 Project showing for Individual account in ACP Toolbar in the Portal.&lt;br /&gt;
* ER 1895 Need a  new message for firebase with email enumeration protection for new users or wrong password.&lt;br /&gt;
* ER 1890 Change Lumina.com links to analytica.com.&lt;br /&gt;
* EW 1843 Wrong word wrapping in a text node title. Not the same as 1837 which was implemented in build 127.&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 130:  30-Jan-2024==&lt;br /&gt;
	&lt;br /&gt;
* ER 1892 Change Tech Support... to Report a bug or get tech support...&lt;br /&gt;
* ER 1890 Max: Change Lumina.com links to analytica.com&lt;br /&gt;
* ER 1889 Change position of the order icon so that it doesn't move the search bar on mouseover.&lt;br /&gt;
* ER 1888 Minor tweaks to the UI 25 Jan 24&lt;br /&gt;
** The triangle indicating pulldown menus looks a bit fuzzy - make it clearer.&lt;br /&gt;
** The icon that appears when you mouseover a column header should be neither forward nor backward sort, but unspecified (until you click it). Change to an icon with wider middle bar and narrower top and bottom.&lt;br /&gt;
*** Move that icon a tad further right from the header text &amp;quot;Model&amp;quot; etc.&lt;br /&gt;
** Remove the faint square around The '?' icon. (help ? menu icon)&lt;br /&gt;
* ER 1886 Add more space between the Analytica cube on the top bar and left of the first menu, similar spacing when running a model.&lt;br /&gt;
* ER 1885 Removed the  downward triangle if the project or account pulldown menu has only 1 item, and removed the popup menu.&lt;br /&gt;
* ER 1883 Add tooltips for account name and project name pulldown menus on the new top bar.&lt;br /&gt;
* EW 1882 User name on the top bar with membership in only 1 project is inconsistent before and after opening a model.&lt;br /&gt;
* EW 1881 Long Project (or account) name overlaps the down arrow&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 129:  22-Jan-2024==&lt;br /&gt;
* EW 1877 Missing choice pulldown menu on top left account name pulldown menu&lt;br /&gt;
* ER 1875 Make Arrow keys work in tables similarly to the way they work in Excel/Sheets&lt;br /&gt;
** Click on a cell (this is the &amp;quot;anchor&amp;quot; cell), then using arrow keys moves the selected cell e.g. a right arrow key moves the selected cell to the right.&lt;br /&gt;
** Hold down the shift key and press an arrow keys. This should expand (or contract) the selected cell region.&lt;br /&gt;
** Hold down the ctrl key and press arrow keys. E.g. Press right arrow key w/ ctrl key down. This should move the selected cell to the the row&lt;br /&gt;
* ER 1873 Single-click to edit cell: When you click on a cell in sheets/excel you can just type to edit. In ACP you have you double click on it to edit. c.f. 1845.&lt;br /&gt;
* ER 1871 ACP Portal change 6: Change ascending and descending triangles with three bars in Models listing table header&lt;br /&gt;
* ER 1870 ACP Portal change 5: Make model's listing (and User listing) table header vertically narrower&lt;br /&gt;
* ER 1869 ACP Portal change 4: Move 'Add Project' button closer to Project pulldown menu&lt;br /&gt;
* ER 1868 ACP Portal change 3: Make Home and Project pulldown menu triangles white open triangles&lt;br /&gt;
* ER 1867 ACP Portal change 2: Change color of border on Account and Project pulldown menus to light teal&lt;br /&gt;
* ER 1866 Portal changes 1: Move up text in Account and Project pulldown menus&lt;br /&gt;
* ER 1860 Portal Users tab:&lt;br /&gt;
** Title of button &amp;quot;Email invite&amp;quot; -&amp;gt; &amp;quot;Email invitation&amp;quot;.&lt;br /&gt;
** Put a &amp;quot;+&amp;quot; in button &amp;quot;+ add users&amp;quot;&lt;br /&gt;
* ER 1859 The models table should stretch down to the top of the footer bar (with logos).&lt;br /&gt;
* ER 1858 The rest of the background of Users tab should be consistent mid gray, including behind section titles and buttons on the right side.&lt;br /&gt;
* ER 1857 Background of users table should be the same color as background of the models table.&lt;br /&gt;
* ER 1856 The heading bar for the Users table should be the same style (size, background color, font etc) as for the Models table.&lt;br /&gt;
* ER 1855 Tweaks to heading of Models Listing in portal.&lt;br /&gt;
** Move heading higher.&lt;br /&gt;
** Change background color, a slightly lighter gray background.&lt;br /&gt;
** Magnifying glass same size as search box.&lt;br /&gt;
* ER 1845 Make Edit table cells update when they are selected and someone starts typing. c.f. 1873&lt;br /&gt;
* ER 1783 Make UI simpler and more consistent with ACP model view. &lt;br /&gt;
** Move the account menu, and project menu (when relevant) to the teal bar in white Century Gothic 16pt, to replace the account name and project name that already appear there. Puts the account and project above the Models/account tabs, which is more logical.&lt;br /&gt;
** Reduce the vertical white space between teal bar and top of tabs (similar to model UI).&lt;br /&gt;
** Put a rounded rectangle thin gray line around sides and bottom of Models, Account, and Users views (similar to model UI).&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 128:  8-Jan-2024  ==&lt;br /&gt;
* ER 1853 Make ACP3 Enhancements and fixes public, and link to the from the what's new page.&lt;br /&gt;
* EW 1849 Downloaded csv table was populating table with all ones for tall output node - only for certain tables.&lt;br /&gt;
* ER 1844 Update build number. Dropped 3.1 and added the build number to the sign-in page. Also moved the build number to acpConfig.json&lt;br /&gt;
* ER 1835 prevent user from clicking on anything other than ‘Cancel’ when cube is spinning&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 127:  23-Dec-2023  ==&lt;br /&gt;
* EW 1838 Swap Axes icon didn't work in Safari desktop, shows a blue box with white question mark&lt;br /&gt;
* EW 1837 Wrong word wrapping in a Text node title.&lt;br /&gt;
* EW 1836 Pasting of cells does not work in edit table when data is larger than the available cells.&lt;br /&gt;
* EW 1833 After change password - no tabs visible&lt;br /&gt;
* EW 1832 Selection box is way off when clicking on a choice input cell in an edit table&lt;br /&gt;
* EW 1830 Blank warning message appears after entering blank value into edit table cell&lt;br /&gt;
* EW 1809 Crash when adding acp style library from hamburger menu - Web socket closes&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 126:  18-Dec-2023  ==&lt;br /&gt;
* EW 1829 Error after deleting a value in a table cell.&lt;br /&gt;
* EW 1828 Heat Pump model is displaying some nodes with a serif font on Safari browser.&lt;br /&gt;
* ER 1825 Setup CSS font fallbacks for common Serif, Sans-Serif and Monospace fonts&lt;br /&gt;
* ER 1824 Setup CSS font fallback for Century Gothic to be Century Gothic, Avant Garde, Arial, San-serif&lt;br /&gt;
* EW 1819 Privileges table appears below Role menu in Users tab of Portal&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 125:  5-Dec-2023  ==&lt;br /&gt;
* EW 1821 Horizontal scrollbar appears on Users tab of User Portal when it should not&lt;br /&gt;
* EW 1819 Privileges table appears below Role menu in Users tab of Portal&lt;br /&gt;
* ER 1818 When you copy it should give a little visual feedback. &lt;br /&gt;
* ER 1808 Align the top of the Alert text with the top of the tabs.&lt;br /&gt;
* ER 1767 Add UI response to hovering and clicking Inputs and Outputs in Object view&lt;br /&gt;
* ER 1763 A way to keep cells selected while scrolling in a table.&lt;br /&gt;
* ER 1762 When you paste a range into an edit table, it takes a while. It should show some feedback — e.g. dashed lines around the range — to show it is working.&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 124:  25-Nov-2023  ==&lt;br /&gt;
* EW 1800 Slider labels overlap - auto scaling needs to be improved&lt;br /&gt;
* EW 1764 Pasting numbers with a &amp;quot;%&amp;quot; or &amp;quot;,&amp;quot; pastes as text. &lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 123:  12-Nov-2023  ==&lt;br /&gt;
&lt;br /&gt;
* EW 1807 Fix sliders so there's no &amp;quot;bounce back&amp;quot; in James' Single Family Load Predictions&lt;br /&gt;
* ER 1806 Add an alert asking people to schedule a meeting using Calendery&lt;br /&gt;
* EW 1805 Discreet slider doesn't work properly when diagram zooming is present&lt;br /&gt;
* EW 1804 Discrete slider in edit table doesn't update correctly when the track is clicked&lt;br /&gt;
* EW 1801 Crash after selecting checkbox to add a slider in a table.&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 122:  8-Nov-2023  ==&lt;br /&gt;
* ER 1797 Get Object view working for frame nodes and tall nodes that contain edit tables&lt;br /&gt;
* ER 1796 Get Object View working in tall output nodes&lt;br /&gt;
* EW 1792 Pasting into an edit table causes slow down of ACP&lt;br /&gt;
* ER 1790 Add hover icons to Object view when displayed in a frame/tall node&lt;br /&gt;
* ER 1788 Get Object_in_frame style working correctly at model level and node level&lt;br /&gt;
* ER 1787 Put thin line at top in Top_diagram_only style (and no hierarchy bar)&lt;br /&gt;
* ER 1782 Add a way to alert ACP users to new releases and other ACP-relevant information&lt;br /&gt;
* ER 1771 Show Underline of clickable variable names when the cursor is anywhere over the variable name.&lt;br /&gt;
* ER 1757 Move “Remove” to last item in the Role menu and reorder them in decreasing power.&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 121:  18-Oct-2023  ==&lt;br /&gt;
* ER 1786 Show Object icon button in frame/tall nodes, part 1 if ACP Style Object_in_frame is present&lt;br /&gt;
* ER 1770 Strange message while drawing graph&lt;br /&gt;
* ER 1759 Distribution popup.  Remove close button.  Add padding to rhs of description text area  between wrapping text and scroll bar.  Align left edge of Distribution pulldown with description.  Make parameters input wider.&lt;br /&gt;
* ER 1755 Add click feedback to graph hover icons, make them smaller when clicked&lt;br /&gt;
* ER 1753 Improve appearance and positioning of Close (x) button use in ACP popup dialogs&lt;br /&gt;
* EW 1752 Top of pulldown menu and text box in Distribution Popup are cut off sometimes.&lt;br /&gt;
* EW 1751 Fix word wrapping problems in Description box of Distribution popup&lt;br /&gt;
* EW 1750 Crash when clicking Sequence input node button&lt;br /&gt;
* EW 1748 UI seems to crash after clicking on node&lt;br /&gt;
* ER 1697 Implement copy / paste from edit table to edit table&lt;br /&gt;
* ER 1696 Pasting of cells does not work in edit table when data is larger than the available cells.&lt;br /&gt;
* ER 1632 Add graph hover icon for swapping horizontal and vertical axes.&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 120:  4-Oct-2023  ==&lt;br /&gt;
* EW 1773 ACP Sessions log model shows repeats the first model of a session for every model run of the session.&lt;br /&gt;
* EW 1749 Self-Choice is MultiTable not using array-valued domain in ACP&lt;br /&gt;
# ER Address vulnerabilities reported by Guidehouse from their scanning tool.&lt;br /&gt;
* EW 1746 Some input node formnode buttons still showing border when they should not&lt;br /&gt;
* EW  1745 Input node defined as sequence with Icon style not showing icon&lt;br /&gt;
* EW 1741 Update fav icon (icon that shows in chrome tab) to match that used in analytica.com&lt;br /&gt;
* EW 1737 Don't show full path to users' files in file system error messages.&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 119: 23- Sep-2023  ==&lt;br /&gt;
* ER 1739 Add a confirmation message box when uploading a file that has the same name as a file present in the folder.&lt;br /&gt;
* ER 1735 Formnode border color should match original node when using 'flat' button style&lt;br /&gt;
* ER 1734 Don't show border of formnode buttons when using Flat button style and original node has no border.&lt;br /&gt;
* EW 1732 Can't upload an update to existing file using Publish to Cloud or User Portal&lt;br /&gt;
* ER 1731 Table cells should be vertically aligned to &amp;quot;top&amp;quot; and not &amp;quot;center&amp;quot; by default, same as DTA&lt;br /&gt;
* ER 1730 Make mutliline text cells have text left aligned, same as DTA&lt;br /&gt;
* EW 1729 unexpectedly small limit on # of simultaneous heat pump calc instances&lt;br /&gt;
* EW 1727 Table width doesn't fill out frame node.&lt;br /&gt;
* EW 1726 Pressing the Autoscale icon changes from Log to Linear scale, and is irreversible - you can't get back to where you started.&lt;br /&gt;
* EW 1712 Error when opening Suan Account admin in ACP&lt;br /&gt;
* EW 1709 Numbers with dollar sign number format paste as text into edit table&lt;br /&gt;
* EW 1682 Choice controls using an array-valued computed domain don't update when computed domain changes.&lt;br /&gt;
* ER 1652 Flat button style&lt;br /&gt;
* EW 1636 Output node uncertainty menu appears a long way from the node when clicked&lt;br /&gt;
* ER 1296 Numbers with dollar signs should paste as numbers (not text)&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 118: 22- August-2023  ==&lt;br /&gt;
* EW 1722 Error messages appearing, User Portal file list not showing.&lt;br /&gt;
* EW 1729 Cursor remains a hand when not hovering over a link in the email invite status message.&lt;br /&gt;
* Ew 1719 Add space before and after the number model runs remaining in the status message in Premium group account.&lt;br /&gt;
* EW 1718 stray numbers in the account tab when count model runs is turned off.&lt;br /&gt;
* EW 1716 Graph zoom shows blank graph&lt;br /&gt;
* EW 1715 In Portal Models listing, if you click on an xlsx or xlms file, ACP tries to open it and hangs&lt;br /&gt;
* EW 1714 Upload dialog is only showing .ana files initially, but it should include xlsx, txt and csv&lt;br /&gt;
* EW 1710 Mis-aligned text in the Account tab for purchased credits (depends on user name)&lt;br /&gt;
* EW 1671 The Calc button on formnodes not working (at least in this model).&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 117: 2- August-2023  ==&lt;br /&gt;
* ER 1708 ACP Model Runs.ana top diagram not showing in ACP due to frame node issue&lt;br /&gt;
* ER 1707 Allow Gravelroad to have 10 users even after changing the limit to 4 users for Group accounts.&lt;br /&gt;
* ER 1706 Use purchased credits when launching a model evite.&lt;br /&gt;
* ER 1705 Count purchased credits when launching a model in ACP Portal.&lt;br /&gt;
* ER 1704 Count purchased credits when launching a model in ACP Portal.&lt;br /&gt;
* EW 1702 ACP hangs on MTAIR model. &lt;br /&gt;
* EW 1699 A certain [calc] button doesn't calc when clicked.&lt;br /&gt;
* ER 1691 When creating a project, the cursor should be automatically placed in the project name input field&lt;br /&gt;
* EW 1690 Cells in a table with Cell fills don't paste values into an edit table.&lt;br /&gt;
* ER 1689 Add the [Credit Sales] table creation to the Create Suan DB.ana model file.&lt;br /&gt;
* ER 1687 Add Table [Credit Sales] to Suan Subscriptions database on Suan-stage and acp.lumina.com.&lt;br /&gt;
* EW 1686 When a user has just one subscription, there should be a space between the colon and the subscription name.&lt;br /&gt;
* ER 1684 Provide feedback when 'Sign up' button is pressed on log in page.&lt;br /&gt;
* EW 1683 In Account tab of User Portal, Account choice pulldown menu is not aligned properly.&lt;br /&gt;
* ER 1681 Remove [Number of credits used] column the Credit Sales table in the Suan database.&lt;br /&gt;
* ER 1680 Change &amp;quot;session credits&amp;quot; to &amp;quot;model run credits&amp;quot; in in status messages in 'Launch eVite.ana'.&lt;br /&gt;
* EW 1678 Out of session credits Message contains a link which is formatted as text and non clickable.&lt;br /&gt;
* ER 1677 Move model run limits from Session Limits to Model Run Credits.ana.&lt;br /&gt;
* EW 1675 With 0 sessions remaining, the account tab show a blank area next tothe number os sessions remaining.&lt;br /&gt;
* ER 1663 Change &amp;quot;Session credits&amp;quot; to &amp;quot;model runs&amp;quot; in ACP UI and message boxes.&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 116: 6- july-2023  ==&lt;br /&gt;
* EW 1693 Style library sets top tabs when added as default instead of outline 	&lt;br /&gt;
* EW 1676 Some url encoded keys are not supposed to be passed into ACP for security reasons.&lt;br /&gt;
* EW 1673 Sometimes model doesn't launch when file name is clicked in model listing.&lt;br /&gt;
* ER 1597 Pass data on URL query string to model.&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 115: 29- jun-2023  == &lt;br /&gt;
* EW 1670 Hide Definitions still doesn't hide them when set at the module level.&lt;br /&gt;
* ER 1669 Don't enforce model run limits when opening an invite for Lumina accounts and lumina.com accounts&lt;br /&gt;
* EW 1668 A hidden definition can be viewed (e.g., in the Object tab) in ACP.&lt;br /&gt;
* EW 1667 Graph shown ACP1 Graph tab is a little too short initially.&lt;br /&gt;
* ER 1664 Move model runs limits (session credits) from acpConfig.js&lt;br /&gt;
* ER 1661 Change ACP &amp;quot;Sessions&amp;quot; to be same as &amp;quot;Model runs&amp;quot;&lt;br /&gt;
* EW 1658 Images in nodes in Txc example model exceed the nodes' borders&lt;br /&gt;
* ER 1657 Create new flag for turning off counting of session credits&lt;br /&gt;
* EW 1656 Number appears below Models Listing after pressing Email Invite button&lt;br /&gt;
* ER 1654 Don't show hidden modules as Top/Side navigation tab&lt;br /&gt;
* ER 1653 Show Session Info for Individual accounts in the User Portal's Account tab&lt;br /&gt;
* ER 1651 Add exclusion to the Lumina group account and lumina.com individual accounts to enforcing session limits&lt;br /&gt;
* ER 1649 Add warning messages when number of sessions is getting low&lt;br /&gt;
* ER 1648 Limit file upload sizes for Individual, Group and Group Premium plans in User Portal&lt;br /&gt;
* ER 1642 Limit session credit usage for Individual accounts, same as is already done for group accounts&lt;br /&gt;
* ER 1641 Update message shown to users when they have exhausted the accounts session credits.&lt;br /&gt;
* ER 1639 Enforce session credit limits when opening an invite in account that has reached its limit&lt;br /&gt;
* EW 1637 Sessions are not decremented when this model is launched.&lt;br /&gt;
* EW 1630 With top tabs, outliner, and no frame/tall node, graph is too tall&lt;br /&gt;
* EW 1574 After Publish to Cloud from DTA, model should open in ACP (but does not)&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 114: 17-May-2023  == &lt;br /&gt;
* EW 1668 Hidden Definitions aren't hidden&lt;br /&gt;
* EW 1666 In the ACP sessions model, when you set subscr to ‘All’ it gives this error message.&lt;br /&gt;
* ER 1631 Add a warning message for people using ACP in FireFox, advising them to use Chrome.&lt;br /&gt;
* ER 1628 Show the number of sessions remaining for a group account in the User Portal.&lt;br /&gt;
* EW 1627 Text alignment wrong for some rows in result table in Max's Enterprise model.&lt;br /&gt;
* EW 1626 Max: Get delete projects working or remove button.&lt;br /&gt;
* ER 1625 Many table cell formats styles are not yet in ACP.&lt;br /&gt;
* ER 1623 Remove the link to the ACP and Lumina terms of use agreement&lt;br /&gt;
* ER 1618 When opening a model (evite), make it just one progress bar for the Reading Model File and Checking Definitions.&lt;br /&gt;
* ER 1617 Make progress bar wider.&lt;br /&gt;
* ER 1616 Input and outnode node buttons appear briefly and are then replaced by icons.&lt;br /&gt;
* ER 1615 Update the lumina logo on the model listing's footer to the new style&lt;br /&gt;
* EW 1614 A model with a quote in the file name throws an error when pressing email invite.&lt;br /&gt;
* ER 1612 Update logo colors in loading screen.&lt;br /&gt;
* EW 1589 Can't add email invite addresses with a + sign in the address.&lt;br /&gt;
* ER 1514 Ability to select across multiple rows from result tables.&lt;br /&gt;
* EW 1453 Scalar user output nodes with dates won't show result.&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 113: 28-Apr-2023  == &lt;br /&gt;
* ER 1611 Old Analytica logo on sign-in page&lt;br /&gt;
* ER 1610 Give ACP Portal tabs the same hover and click feedback that tabs &amp;quot;Tabs across the top&amp;quot; has.&lt;br /&gt;
* ER 1609 Update Icon in Title Toolbar&lt;br /&gt;
* ER 1608 Enforce session credit limits when opening a model the user portal&lt;br /&gt;
* EW 1606 Using slider in edit table crashes ACP&lt;br /&gt;
* ER 1605 Add configuration settings to AcpConfig for max number of users allowed in Basic and Premium plans&lt;br /&gt;
* ER 1603 Exempt 'Lumina' premium group plan from the new limits on number of users&lt;br /&gt;
* ER 1601 Round bottom corners of diagram when outline is showing&lt;br /&gt;
* EW 1600 slider control non responsive in frame node edit table cell&lt;br /&gt;
* ER 1598 When clicking on input node with numeric % format, select only the digits as DTA does.&lt;br /&gt;
* ER 1596 When a group account has reached its limit of users, show informative message when the 'Add users' button&lt;br /&gt;
* ER 1594 When double- clicking on a table cell to edit a number, select the digits, same as DTA in browse mode&lt;br /&gt;
* ER 1591 Limit number of users for Basic Group Accounts and Premium Group Accounts&lt;br /&gt;
* ER 1310 When entering edit mode for an edit table cell, have the current contents become selected.&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 112: 13-Apr-2023  == &lt;br /&gt;
* EW 1595 When logged in with auth string. new invitees get the authstring in their invite email&lt;br /&gt;
* ER 1587 Give hover feedback when mousing over buttons in Users tab or ACP portal&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 111: 1-Apr-2023  == &lt;br /&gt;
* EW 1586 Multichoice Filter Crash&lt;br /&gt;
* EW 1584 Continuous slider not working well when using auto_zoom_diagrams: yes&lt;br /&gt;
* EW 1581 Bottom rhs Lumina logo partially off screen when viewing table/graph w/ top tabs&lt;br /&gt;
* EW 1580 There should be a white margin to right of the diagram/tabs area to match the white margin to left of the Outline area.&lt;br /&gt;
* ER 1579 Bottom corners of diagram area should be rounded to match bottom corners of Outline area&lt;br /&gt;
* ER 1578 Change background color for selected item in the outliner&lt;br /&gt;
* ER 1577 Bottom of diagram area should align with bottom of Outline area&lt;br /&gt;
* ER 1576 Make top/side module tab title font white when tab has a dark background color.&lt;br /&gt;
* EW 1575 Cells with percent format don't enter the way Hadi wants it for heat pump model (back to ie 20= 2000%)&lt;br /&gt;
* EW 1572 Wrong parent tab is shown when changing to another diagram by clicking on output variable.&lt;br /&gt;
* EW 1571 Table does not pivot correctly when index menu pivoter is changed.&lt;br /&gt;
* EW 1569 Slider labels do not show with style lablesbelow&lt;br /&gt;
* ER 1567 Add the model file name to the help balloon that appears when you hover over the title in the toolbar&lt;br /&gt;
* ER 1565 Remove internal borders from cell selection in edit tables.&lt;br /&gt;
* EW 1357 Cell border remains highlighted after clicking outside the edit table&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 110: 1-Mar-2023  == &lt;br /&gt;
* EW 1560 Error selecting a file in the model listing.&lt;br /&gt;
* EW 1558 Error message with new ACP account.&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 109: 18-Febuary-2023  == &lt;br /&gt;
* EW 1546 Enhance json returned by useObjAtt(oid, &amp;quot;_sliderState&amp;quot;) to include number formatting and tick marks&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 108: 16-Febuary-2023  == &lt;br /&gt;
* EW 1555 No messages when clicking the sign up button. &lt;br /&gt;
* EW 1553 No feedback when clicking the Get a new password button. (And other buttons on the sign in page.)c.f. 1555&lt;br /&gt;
* ER 1549 Change setVal for _sliderState to accept an array of vals/pos(s) for sliders in edit tables.&lt;br /&gt;
* EW 794 Arrows show between modules when top tabs nav style is used&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 107: 13-Febuary-2023  == &lt;br /&gt;
* EW 1552 Warning about password field exposes user's password.&lt;br /&gt;
* ER 1551 Node titles not wrapping when they should, in this case no spaces in the title&lt;br /&gt;
* ER 1548 Get setVal working for discrete slider input nodes.&lt;br /&gt;
* EW 1544 Showwindow() not working for definition window&lt;br /&gt;
* EW 794 Arrows show between modules when top tabs nav style is used&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 106: 7-Febuary-2023  == &lt;br /&gt;
* EW 1550 There should be a message box w/ caption &amp;quot;Standard ACP Settings?&amp;quot; after adding style lib&lt;br /&gt;
* ER 1543 Make Download this model option off by default&lt;br /&gt;
* ER 1542 Implement the &amp;quot;Labels Below&amp;quot; style for discrete slider input nodes&lt;br /&gt;
* ER 1539 Implement input node control that is a slider with two thumbs (discrete)&lt;br /&gt;
* ER 1537 Implement input node control that is a slider with two thumbs (continuous)&lt;br /&gt;
* ER 1535 Sliders with first and last options labels at ends for discrete sliders&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 105: 21-January-2023  == &lt;br /&gt;
* ER 1534 Implement 'Discrete single thumb' slider for slider input nodes&lt;br /&gt;
* ER 1533 Sliders w/ lower bound and upper bound labels &amp;quot;At Ends&amp;quot;&lt;br /&gt;
* EW 1529 Slider state update does not appear to be working when using useObjAtt(oid, &amp;quot;_sliderState&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 104: 19-January-2023  == &lt;br /&gt;
* EW 1532 Arrows below initial scroll view don't display.&lt;br /&gt;
* ER 1531 Complete thumb shapes for sliders i.e. Block, Line, Diamond shapes&lt;br /&gt;
* EW 1529 Slider state update does not appear to be working when using useObjAtt(oid, &amp;quot;_sliderState&amp;quot;);&lt;br /&gt;
* EW 1528 useObjAtt(oid, &amp;quot;_sliderState&amp;quot;) returns malformed JSON when slider has two thumbs&lt;br /&gt;
* ER 1527 Implement &amp;quot;Needle&amp;quot; and &amp;quot;Rectangle&amp;quot; thumb shapes for sliders&lt;br /&gt;
* ER 1526 Slider w/ no thumb&lt;br /&gt;
* EW 1524 allow_model_download:false / show_menu_download:no causes extra line '0' in close menu.&lt;br /&gt;
* ER 1523 Continuous single thumb slider w/ circular thumb&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 103: 15-January-2023  == &lt;br /&gt;
* ER 1522 For large tables, implement a way to get a totals cell using useQuery({req: &amp;quot;cell&amp;quot; ...})&lt;br /&gt;
* ER 1520 Rename ACP Style controlling the appearance of the &amp;quot;Download Mode&amp;quot; menu option in the toolbar&lt;br /&gt;
* ER 1519 Move &amp;quot;Download model&amp;quot; menu options from Hamburger menu to the Save/Close menu&lt;br /&gt;
* ER 1518  Add &amp;quot;Download model&amp;quot; menu item to the hamburger menu&lt;br /&gt;
* ER 1517 Add click feedback for Hamburger and Close menu items&lt;br /&gt;
* ER 1516 Have diagram tabs zoom out to match auto zoom of diagrams&lt;br /&gt;
* EW 1513 List output node not showing &amp;quot;List&amp;quot; on its button when set to text&lt;br /&gt;
* EW 1510 useQuery(req: &amp;quot;cell&amp;quot;...) no longer working, always returns undefined&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 102: 13-December-2022  == &lt;br /&gt;
* EW 1508 ACP white screen crash when double clicking on date in edit table&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 101: 7-December-2022  == &lt;br /&gt;
* EW 1504 Can't upload and overwrite a model&lt;br /&gt;
* EW 1502 Description Balloon not showing for graph in tall node&lt;br /&gt;
* EW 1501 Lingering description balloon&lt;br /&gt;
* EW 1497 List input node not showing icon when it should be&lt;br /&gt;
* EW 1494 Show help balloon for frame node table/graphs when show_description: 0 is present&lt;br /&gt;
* EW 1477 Come up with a way to change uncertainty view for atomic output nodes&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 100: 23-November-2022  == &lt;br /&gt;
* ER 1496 If model using Century Gothic diagram font, and that font is not present, then use 'sans-serif'&lt;br /&gt;
* EW 1495 Get help balloon close button working to handle lingering balloons&lt;br /&gt;
* EW 1489 Model crashes after editing a table cell&lt;br /&gt;
* EW 1488 Help balloon not showing in tall nodes when show_description: 0/no is set at the model level&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 99: 17-November-2022  == &lt;br /&gt;
* EW 1487 Add close button to help balloon just in case it lingers.&lt;br /&gt;
* EW 1486 White screen crash when viewing large table from Bayer model.&lt;br /&gt;
* EW 1485 Large table crashes with Table truncation.&lt;br /&gt;
* ER 1484 Merge Lonnie's and Fred's large table truncation ERs.&lt;br /&gt;
* ER 1482 Add choice list filtering for long multichoice inputs.&lt;br /&gt;
* ER 1481 Change how percent cells are updated in edit tables (e.g. 20 = 20% not 2000%).&lt;br /&gt;
* EW 1475 Self-Choice in table doesn't work with array-valued domain.&lt;br /&gt;
* EW 1470 No indication that the model is still loading loading (while csv i is being read).&lt;br /&gt;
* ER 1468 ACP API enhancements for Slider controls.&lt;br /&gt;
* EW 183 Cell formatting doesn't work in header cells.&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 98: 31-October-2022  == &lt;br /&gt;
* ER 1474 Move white list of allowable upload types to acpConfig.json&lt;br /&gt;
* ER 1472 Give click feedback to button nodes&lt;br /&gt;
* ER 1471 Give click feedback when clicking form node buttons e.g. make text white&lt;br /&gt;
&lt;br /&gt;
==Build 97 - skipped - same as build 96==&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 96: 21-October-2022  == &lt;br /&gt;
* EW 1465 Don't show message box twice about updating to latest version of style library&lt;br /&gt;
* ER 1464 Only show choice menu filter when the menu has more 10 items.&lt;br /&gt;
* ER 1463 Add choice input filter feature for choice input nodes&lt;br /&gt;
* ER 1462 Don't show message about replacing ACP Style Lib twice&lt;br /&gt;
* ER 1461 Truncate large tables - interim solution - This is what we did in ACP1 and no complaints.&lt;br /&gt;
* EW 1460 rhs border of hierarchy stripe and diagram don't match&lt;br /&gt;
* EW 1457 Help Balloon lingers when using choice input&lt;br /&gt;
* EW 1455 Result table column is too narrow&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 95: 8-October-2022  == &lt;br /&gt;
* EW 1450 Pressing Email Invite button causes white screen in models listing&lt;br /&gt;
* EW 1448 Can't upload .xlsx file&lt;br /&gt;
* ER 1447 Add mouse feedback for msgbox() dialog buttons&lt;br /&gt;
* ER Add mouse feedback to close button on Connection Status dialog&lt;br /&gt;
* ER 1445 Only allow certain files types to be uploaded in the user portal&lt;br /&gt;
* ER 1444 When ACP web socket connection is closed, provide feedback and reconnect&lt;br /&gt;
* EW 1443 Remove new line characters in title for formnodes&lt;br /&gt;
* ER 1440 No response when you click Download button in portal models listing&lt;br /&gt;
* EW Cannot show probabilistic result for distribution - model specific.&lt;br /&gt;
* EW 1275 Users can upload other types of files&lt;br /&gt;
* EW 1263 Title wraps too soon in form node labels sometimes.&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 94: 26-September-2022  == &lt;br /&gt;
	&lt;br /&gt;
* ER 1436 Add click feedback and close popup menu when 'download csv' is clicked&lt;br /&gt;
* ER 1435 Download CSV should show wait icon&lt;br /&gt;
* EW 1434 Tooltips not working for top toolbar or icons in embedded notes&lt;br /&gt;
* EW 1335 Header is squashed in edit table without title showing&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 93: 23-September-2022  == &lt;br /&gt;
* &lt;br /&gt;
* EW 1422 Units of Embeddded edit table in wrong location&lt;br /&gt;
* EW 1428 Add vertical scroll bar to help balloon when text doesn't fit&lt;br /&gt;
* EW 1430 Can't switch to pdf table from graph in frame node.&lt;br /&gt;
* EW 1431 Top of Help Balloon is too high, off top of screen&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 92: 18-September-2022  == &lt;br /&gt;
* EW 1423 Error when opening Cory's model&lt;br /&gt;
* ER 1425 Add feedback when clicking on model name in portal's model listing&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 91: 15-September-2022  == &lt;br /&gt;
* EW 1407 W/tall output node X + Frame node, X should not appear in Frame node.&lt;br /&gt;
* EW 1421 Error when trying to download csv of Cory's edit table&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 90: 14-September-2022  == &lt;br /&gt;
* EW 1417 &amp;quot;Error occurred while processing query&amp;quot; message appears when viewing tables&lt;br /&gt;
* ER 1416 Have a double click open a choice input inside an edit table&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 89: 14-September-2022  == &lt;br /&gt;
* EW 1415 Bayer model: Suan crashes when changing project status to deleted.&lt;br /&gt;
* EW 1414 Suan crashes when deleting a case in the Bayer model&lt;br /&gt;
* EW 1413 Long Index values extend outside the slicer text Fields.&lt;br /&gt;
* EW 1411 No spinning cube indication of ongoing calculation for framenode.&lt;br /&gt;
* ER 1405 Add Filtering capability for choice inputs (initially in edit tables)&lt;br /&gt;
* EW 1393 Probabilistic results not showing up in Car Cost model. (For non-prob variable)&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 88: 31-August-2022  == &lt;br /&gt;
* ER 1404  Choice input in edit table cell, make clickable region highlight on mouse hover.&lt;br /&gt;
* ER  1403 Choice input in edit table, expansion of the sensitive area around the menu triangle.&lt;br /&gt;
* ER 1401 Show a message when selecting a probabilistic result for a non-prob node. &lt;br /&gt;
* EW 1400 Can't change projects/accounts.&lt;br /&gt;
* ER 1392 	Lists should show as a single list not repeated in a table&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 87: 26-August-2022  == &lt;br /&gt;
* EW 1399 In ACP1 tabs, click on graphs doesn't show graph data point balloon.&lt;br /&gt;
* ER 1398 Don't show non prob views for non prob variables&lt;br /&gt;
* EW 1397 Prob view selector pulldown doesn't work in tall nodes for graphs.&lt;br /&gt;
* ER 1395 Message boxes should be centered on the browser screen&lt;br /&gt;
* ER 1387 Reload ACP style lib option in hamburger menu&lt;br /&gt;
* ER 1354 Prompt user to save model when closing model&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 86: 15-August-2022  == &lt;br /&gt;
* EW 1386 After adding style library from hamburger menu, model listing does not show when closing model.&lt;br /&gt;
* EW 1381 Unresponsive Spinning cube after closing a model (caused by fix for EW 1367).&lt;br /&gt;
* ER 1367 Add feedback when closing model because sometimes takes a long time.&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 85: 28-July-2022  == &lt;br /&gt;
&lt;br /&gt;
* EW 1382 Show effects of multichoice selections as they are clicked . (Or choice input popup displaying wrong menu items when clicked after updating another dependent choice/multichoice input.)&lt;br /&gt;
* EW 1380 Don't show message &amp;quot;This cell can't be edited&amp;quot; for cells in a result table.&lt;br /&gt;
* ER 1379 When you copy a selected cell with a choice menu, it should copy the value selected in the menu (text or number).&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 84: 22-July-2022  == &lt;br /&gt;
&lt;br /&gt;
* ER 1377 Give choice input cells a green selection border when clicked&lt;br /&gt;
* ER 1376 Pasting copied cell into selected cells in an edit table&lt;br /&gt;
* ER 1375 Help menu should display options when reportissue.vbs is not present. All but Tech support.&lt;br /&gt;
* ER 1374 Style library - move save frame views to the esoteric styles module.&lt;br /&gt;
* ER 1373 Change UX for 'Save as' dialog when overwriting existing files&lt;br /&gt;
* ER 1372 Users portal, change 'Not member' menu option to 'Remove'&lt;br /&gt;
* ER 1371 Display &amp;quot;This field can't be edited.&amp;quot; when someone double clicks on a read only edit table cell&lt;br /&gt;
* ER 1370 Give read only cells in edit tables a gray background&lt;br /&gt;
* ER 1367 Add feedback when closing model because sometimes takes a long time&lt;br /&gt;
* ER 1366 Add time to &amp;quot;Save date&amp;quot; column in Models listing in Portal&lt;br /&gt;
* EW 1365 Remove excess corners from gray highlight on mouseover of Frame&lt;br /&gt;
* ER 1364 Too much information when loading and checking a large model&lt;br /&gt;
* ER 1323 change choice menu opening for edit tables so it only opens on arrow click&lt;br /&gt;
* EW 1287 Images should not be paste-able in edit tables.&lt;br /&gt;
* EW 1286 JavaScript crash when result in output node is an image&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 83: 5-July-2022  == &lt;br /&gt;
* ER 1363 Change behavior for ctrl+a when deselecting items in multichoice input. When all elements are selected, make Ctrl+A,  unselect all, and select the item the cursor is hovering on at the same time.&lt;br /&gt;
* ER 1361 For multichoice input nodes, move &amp;quot;First only&amp;quot;, &amp;quot;All&amp;quot; and &amp;quot;None&amp;quot; to top of listing.&lt;br /&gt;
* ER 1360 Column is too wide in a result table (FWB: But the column header needs space for the index name, totals icon and sort icon).&lt;br /&gt;
* EW 1359 Text does not fit in text node.&lt;br /&gt;
* ER 1358 Syntax errors etc should not ask if you want to edit the Definition.&lt;br /&gt;
* ER 1356 Add tool tips for logos in the footer&lt;br /&gt;
* ER 1374 Max' Style library update - move save frame views to the esoteric styles module&lt;br /&gt;
* DTA ER 20520 - Max' Style library update - Add the remove save menu options to the Style library&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 82: 27-June-2022  == &lt;br /&gt;
* EW 1355 Cannot make a user 'not a member' of a project&lt;br /&gt;
* ER 1353 Prompt user with message box when attempting to save a model with the same name as an existing model&lt;br /&gt;
* EW 1350 Strange and inappropriate error message when saving file.&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP 3.1 build 81: 25-June-2022  == &lt;br /&gt;
* EW 1352 Asking to save changes before opening a model&lt;br /&gt;
* ER 1349 Make footer larger and increase size of Lumina logo in footer&lt;br /&gt;
* ER 1347 For tall text input with control on left, align title with text area&lt;br /&gt;
* ER 1346 Remove &amp;quot;List&amp;quot; from ACP permissions table&lt;br /&gt;
* ER 1345 Make text input background white (not color of original node)&lt;br /&gt;
* ER 1344 Redo 1332 When using ShowWindow() to switch diagrams, update selected top/side tab&lt;br /&gt;
* ER 1343 Increase the wait time to show a balloon from ~0.5 seconds to 1 second&lt;br /&gt;
* ER 1340 Add drop shadow to help balloon&lt;br /&gt;
* ER 1339 Remove 'Disconnect' and 'Sign out' buttons from Connection Status dialog&lt;br /&gt;
* ER 1338 New 'All', 'None' and 'First only' options for multichoice inputs&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 80: 9-June-2022  == &lt;br /&gt;
* EW 1337 CellFont(underline:true) doesn't work, bad JSON&lt;br /&gt;
* EW 1334 Green check and red X button show in result graph&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 79: 8-June-2022  == &lt;br /&gt;
* ER 170 Implement the cell-level formatting feature, CellOnClick.&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 78: 7-June-2022  == &lt;br /&gt;
* ER 1332 When using ShowWindow() to switch diagrams, update selected top/side tab&lt;br /&gt;
* ER 1330 Add '+ Add' button to list editing dialog&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 77: 4-June-2022  == &lt;br /&gt;
* ER 1329 Get 'Download CSV' working for Edit Tables&lt;br /&gt;
* ER 1328 Show the Download/Copy icon for edit tables&lt;br /&gt;
* ER 1327 Show Index Menus icon for edit tables&lt;br /&gt;
* ER 1325 Get copy from edit table working&lt;br /&gt;
* ER 1324 Change border for selected cell in tables&lt;br /&gt;
* ER 1322 Show help balloon for Tall Nodes&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 76: 26-May-2022  == &lt;br /&gt;
* ER 1321 When displaying the result table for an Index, make row headers blank&lt;br /&gt;
* ER 1320 New ACP Styles setting &amp;quot;Add_help_menu_option&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 75: 22-May-2022  == &lt;br /&gt;
* ER 1319 New ACP Styles Remove_help_menu_options&lt;br /&gt;
* ER 1318 Add [X] button to Connection Status popup&lt;br /&gt;
* ER 1317 Add tooltip for A cube, and show web page when clicked&lt;br /&gt;
* ER 1316 Add “Status” window as option in ? instead of an icon that shows up when you click the “a” cube&lt;br /&gt;
* EW 1315 Cannot see port number completely in Server Connection popup&lt;br /&gt;
* ER 1313 Tool tips for top toolbar elements&lt;br /&gt;
* EW 1312 Tall inputs should not use bold font for title&lt;br /&gt;
* EW 1311 Error message when trying to download Last 1000 Sessions table as csv&lt;br /&gt;
* ER 1309 Change edit table UX for editing cells to double click&lt;br /&gt;
* ER 1308 Update users permissions table&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 74: 11-May-2022  == 	&lt;br /&gt;
* EW 1307 Make pasting cells into an edit table work using ctrl+v after a single click on a cell&lt;br /&gt;
* EW 1305 Add a black border or outline to edit table cell when clicked (single click)&lt;br /&gt;
* EW 1304 Get ride of clipboard icon in edit table cells&lt;br /&gt;
* EW 1279 Diagram crash when hierarchy is turned off while using Style library in orphans&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 73: 3-May-2022  == 	&lt;br /&gt;
* EW 1303 Error when adding users&lt;br /&gt;
* EW 1299 Can't send email invite&lt;br /&gt;
* EW 1265 ReadBinaryFile doesn't prompt user to upload a file&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 72: 31-Apr-2022  == 	&lt;br /&gt;
(This build mostly is js code added to implementatons still in progress so we can check it)&lt;br /&gt;
Add a flag to acpConfig.json for turning off clipboard icon in edit tables&lt;br /&gt;
* EW 1298 PG&amp;amp;E server: Cannot create FileSystemObject error when deleting file.&lt;br /&gt;
* ER 1292 Add a flag to acpConfig.json for turning off clipboard icon in edit tables&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 71: 29-Apr-2022  == &lt;br /&gt;
* EW 1293 Chrome times out after 60 seconds&lt;br /&gt;
* EW 1288 Suan.exe displays &amp;quot;Accept licensing terms&amp;quot; dialog even though server.config has DesktopUI=0&lt;br /&gt;
* EW 1285 Binary Data terms display incorrectly&lt;br /&gt;
* ER 1283 ER: Limit zooming of diagram to a factor of 2 -- i.e. down to 50% or up to 200%. If it doesn't fit at 50% it should show scroll bars.&lt;br /&gt;
* ER 1273 Cory: Don't show model model internals when someone clicks Cancel&lt;br /&gt;
* ER 380 ReadBinaryFile() and ReadImageFile() upload capability.&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 70: 19-Apr-2022  == &lt;br /&gt;
* EW 1284 Error in the Chrome developer tools console when using apache auth.&lt;br /&gt;
* EW 1278 Change &amp;quot;auto zoom&amp;quot; ACP Styles setting again  &amp;quot;auto_zoom_diagrams: yes&amp;quot; or &amp;quot;auto_zoom_diagrams: no&amp;quot;&lt;br /&gt;
* EW 1264 Edit table's accept and cancel buttons in wrong location&lt;br /&gt;
* EW 1165 Tabs should respond to mouse-over and click&lt;br /&gt;
* EW 1160 Auto Zoom diagram&lt;br /&gt;
* EW 783 Mis-spelled Acpstyle causes diagram not to load&lt;br /&gt;
* Analytica EW 20510 Add Acp styles auto_zoom_diagrams and hide_save_button to the Acp styles library&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 69: 18-Apr-2022  == &lt;br /&gt;
* EW 1277 Implement hide_save_button ACP Style for Cory&lt;br /&gt;
* EW 1276 Can't go back to the main model from styles library in orphans if top tabs selected.&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 68: 17-Apr-2022  == &lt;br /&gt;
* EW 1272 Change CPS Style for auto zoom and remove acpConfig.json setting for auto zoom.&lt;br /&gt;
* EW 1267 Get OnClick working for top/side tabs&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 67: 15-Apr-2022  == &lt;br /&gt;
* EW 1271 Add CPS Flag to turn on/off auto zoom feature&lt;br /&gt;
* EW 1270 Add flag to acpConfig.json for turn on/off the ability of reviewers to upload data files&lt;br /&gt;
* EW 1269 Allow reviewers to upload spreadsheets and text files&lt;br /&gt;
* EW 1262 Help balloons inconsistent for icons in Frame nodes&lt;br /&gt;
* EW 1255 Graph/Table icon tooltips position bad part 2&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 66: 12-Apr-2022  == &lt;br /&gt;
* EW1260 ACP hangs when pressing buttons in Heat Pump model&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 65: 8-Apr-2022  == &lt;br /&gt;
* EW 1259 Suan.exe won't launch on Server 2012. SetThreadDescription error. &lt;br /&gt;
* EW1258 Inputs/Outputs popup location is off with zooming&lt;br /&gt;
* EW1256 Slicer popup menu location off when zooming&lt;br /&gt;
* EW1255 Graph/Table icon tooltips position bad part 2 &lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 64: 6-Apr-2022  == &lt;br /&gt;
* EW 1249 Multiple Suan Server processes for robustness.&lt;br /&gt;
* EW1256 Restart crashed or hung suan processes and do ping check programatically.&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 63: 31-Mar-2022  == &lt;br /&gt;
* EW 1248 Mouse over table/graph highlights title region of frame/tall node&lt;br /&gt;
* EW 1245 Help Balloon tail not correct for Top Tabs&lt;br /&gt;
* EW 1243 Choice popup location bad when control is on right hand side of the diagram&lt;br /&gt;
* EW 1242 Choice popup menu location still bad for choice inputs in embedded edit tables&lt;br /&gt;
* EW 1240 Choice popup in wrong location when located in the bottom of the screen.&lt;br /&gt;
* EW 1236 With nodes located at bottom of diagram, help balloon tail needs to be adjusted&lt;br /&gt;
* EW 1235 Help balloon location is bad with nodes on right or bottom of diagram&lt;br /&gt;
* EW 1233 Auto zoom leaves a wider space than necessary when a non visible module node is present.&lt;br /&gt;
* EW 1218 Graph clicks not working correctly when zoom effect is present&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 62 : 21-Mar-2022== &lt;br /&gt;
* 1244 Tab for top diagram doesn't show initially when opening style library from hamburger menu (in this model)&lt;br /&gt;
* EW 1237 Minor typo in tooltips for copy table icon.&lt;br /&gt;
* EW 1235 Help balloon location is bad with nodes on right or bottom of diagram&lt;br /&gt;
* EW 1230 Put a tail on help balloons.&lt;br /&gt;
* ER 1226 Refinement to tooltip for copy/download icon.&lt;br /&gt;
* EW 1223 Choice input popup menu location is incorrect with auto zooming feature&lt;br /&gt;
* EW 1222 Graph zooming not working as desired when autozoom is on&lt;br /&gt;
* EW 1220 Help Balloon location off when diagram is zoomed.&lt;br /&gt;
* ER 1216 Have &amp;quot;auto zoom&amp;quot; feature zoom in and out.&lt;br /&gt;
* ER 1215 Increase right and bottom margins when using autozoom.&lt;br /&gt;
* ER 1213 Have top/side and toolbar tabs show a white background when clicked.&lt;br /&gt;
* EW 1212 side tabs looks bad&lt;br /&gt;
* ER 1207 Implement tab color change on mouse over for side tabs&lt;br /&gt;
* ER 1041 Get blue links to variables working (Fixed as a side effect before build 62).&lt;br /&gt;
* W 911 Blue links to nodes should work or not be blue. (Fixed as a side effect before build 62).&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 61 : 10-Mar-2022== &lt;br /&gt;
* EW 1229 Styles library sets show_description: No instead of show_Description: 0&lt;br /&gt;
* EW 1225 ACP styles library has mix-matched settings for defaults, Also residual bad settings for some nodes.&lt;br /&gt;
* EW 1221 Style library from hamburger menu is not presetting styles correctly&lt;br /&gt;
* ER 1209 Change copy/download icon again&lt;br /&gt;
* EW 1208 Tooltip for uncertainty view pulldown menu is not showing useful text&lt;br /&gt;
* ER 1207 Implement tab color change on mouse over for side tabs&lt;br /&gt;
* ER 1204 Have Top/Side tabs change color on mouse hover (top tabs for now)&lt;br /&gt;
* ER 1203 Have toolbar tabs change color when mouse is hovering over them&lt;br /&gt;
* ER 1202 Add tooltip for Uncertainty View selector&lt;br /&gt;
* EW 1201 Copy download graph/table font is too big. And partly covered up&lt;br /&gt;
* ER1200 Add tooltips for table/graph icons&lt;br /&gt;
* ER 1199 Click response for icon buttons&lt;br /&gt;
* EW 1198 Tall Graphs don't show sometimes. Calculations showing continuously in dual interface&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 60 : 8-Mar-2022== &lt;br /&gt;
* ER 1199 Click response for icon buttons&lt;br /&gt;
* ER 1197 Add flag to acpConfig.json for turning on or off the new Auto Zoom feature&lt;br /&gt;
* ER 1196 &amp;quot;auto zoom&amp;quot; for diagrams&lt;br /&gt;
* ER 1194 Model's saved should include '.ana' extension&lt;br /&gt;
* EW 1193 Minor layout problem with Model Listing view&lt;br /&gt;
* EW 1192 Borders on Hierarchy Strip are too wide&lt;br /&gt;
* EW 1191 Two_top_tabs or Two_side_tabs cause warning when loading style library&lt;br /&gt;
* EW 1183 Error with 'Download CSV' when there's no row index.&lt;br /&gt;
* EW 1179 Get Download CSV to include row and column headers&lt;br /&gt;
* EW 1177 Don't show 'Download CSV' menu item for atomic result&lt;br /&gt;
* EW 1175 Download csv throws error without column index&lt;br /&gt;
* ER 1161 Change copy icon to a downward pointing arrow&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 59 : 21-Feb-2022== &lt;br /&gt;
* EW 1188 Problems with Style Library - Not ready for import, and wrong tabs in top tabs.&lt;br /&gt;
* EW 1173 Copy table buggy behavior with totals and cell fills&lt;br /&gt;
* EW 1171 Incomplete Acpstyle causes blank screen when model is opened&lt;br /&gt;
* EW 1170 Don't show 'ACP Styles Library' menu item when playing an invite.&lt;br /&gt;
* EW 1169 Conflict with identifiers after using ACP styles library from the hamburger menu.&lt;br /&gt;
* EW 1168 Deleting in a list deletes the wrong item&lt;br /&gt;
* ER 1167 Add download CSV capability for tables&lt;br /&gt;
* EW 1163 Row headers missing from copied table&lt;br /&gt;
* EW 1157 User portal still says Release 3.0&lt;br /&gt;
* EW 1128 Bizarre display of numerous nodes on diagram when reloading the style library.&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 58==&lt;br /&gt;
* ER 1155 Get SkipLogin working when using firebase&lt;br /&gt;
* EW 1154 Can't hover over description bubble to use hyperlinks&lt;br /&gt;
* EW 1153 Hyperlink not displaying correctly in ACP Help Balloon (Markup)&lt;br /&gt;
* EW 1150 Turn off spell check red underline in Save as box&lt;br /&gt;
* EW 1004 Change password accepts password after new password does not match.&lt;br /&gt;
* EW 434 ACP Top Tabs Style Prevents swapping between graph &amp;amp; table views&lt;br /&gt;
* EW 433 Stuck in Object window when using Top Tabs ACP&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 57==&lt;br /&gt;
* EW 1147Error when adding styles library from hamburger menu&lt;br /&gt;
* EW 1137 LaunchEvite.ana has an error at load time.&lt;br /&gt;
* EW 1111 Index menus icon overlaps the accept/cancel icons&lt;br /&gt;
* ER1107 Move acpConfig.js settings to a text file&lt;br /&gt;
* EW 1064 Model with proactive eval run at load time and AskMsgChoice()  doesn't open with evite&lt;br /&gt;
* EW 911 Blue links to nodes should work or not be blue&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 56==&lt;br /&gt;
* ER 1136 Add Copy Graph for embedded graphs&lt;br /&gt;
* ER 1135 Add new flag to acpConfig.json for showing copy table button&lt;br /&gt;
* EW 1133 Suan process crashes with Anagram&lt;br /&gt;
* EW 1132 Problem with special characters in Publish to cloud&lt;br /&gt;
* EW 866 Don’t show [Calc] button while computing tall node&lt;br /&gt;
* EW 196 Edit tables and result tables should show a &amp;quot;Copy table&amp;quot; button, same as ACP1.&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 55==&lt;br /&gt;
* EW 1129 Don't show 'Orphans' in Hierarchy Stripe when displaying Styles diagram&lt;br /&gt;
* EW 1126 Some problems with displaying and saving special characters&lt;br /&gt;
* ER 1123 With users set to not email addresses, Change cue text to say add users, not email addresses&lt;br /&gt;
* ER 1118 Don't show green check or red x buttons when edit table has proactivelyevaluate set to 16&lt;br /&gt;
* ER 1114 Move add ACP Styles menu items from help menu to hamburger menu&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 54==&lt;br /&gt;
* EW 1124 Change js code to use full path when calling AddModuleOrLibrary&lt;br /&gt;
* EW 1122 Fly-in and toggle table/graph icons should only appear on mouse over&lt;br /&gt;
* EW 1119 Toggle to graph icon present in edit table frame node&lt;br /&gt;
* EW 1113 Add flag for showing the add ACP Styles menu item(s)&lt;br /&gt;
&lt;br /&gt;
Builds 52-53 are for using Apache authentication with windows passwords. No Firebase option&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 53==&lt;br /&gt;
* EW 1102 When I sign in Suan account model throws uninformative errors.&lt;br /&gt;
* EW 1100 Turn off email validation when using apache auth&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 52==&lt;br /&gt;
* ER 1103 Remove the change password link from the Account tab&lt;br /&gt;
* ER 1099 Remove 'Sign out' menus from ACP when using apache auth.&lt;br /&gt;
* ER 1096 Add a way for turning off the Email Invites in the ACP Portal.&lt;br /&gt;
* ER 1095 With apache/windows auth, get users name to show up in toolbar.&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 51==&lt;br /&gt;
* EW 1089 You can't change the value of a slicer in some edit and result tables on ACP. &lt;br /&gt;
* EW 1085 Diagram crashes on opening&lt;br /&gt;
* EW 1083 Diagram crashes when changing navigation style&lt;br /&gt;
* ER 1081 Add toggle table/graph button for tables and graphs in top/side tabs&lt;br /&gt;
* EW 1079 Table in side tabs should have 8px margin on right, left and bottom sides&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in ACP build 50==&lt;br /&gt;
* EW 1077 Top and side borders wrong in object, table, graph views for side tabs&lt;br /&gt;
* EW 1074 Table doesn't look good in side tabs&lt;br /&gt;
* EW 1073 Result table too big when using Top tabs&lt;br /&gt;
* EW 1072 Role in Project pulldown in the Subscription Administration project is disabled&lt;br /&gt;
* EW 1071 Come up with a way to turn off &amp;quot;self sign up&amp;quot; on a dedicated customer server.&lt;br /&gt;
* EW 1068 Footer on sign in page should appear below the sign in form&lt;br /&gt;
* ER 1065 Add Organization/Group name next to Project name in top teal toolbar&lt;br /&gt;
* EW 1063 Add 8px white margin on rhs of diagram when using Outline (default) navigation style&lt;br /&gt;
* ER 1062 Reduce white gap above outline and acp1 tabs to 8px&lt;br /&gt;
* ER 1058 Adjust the margin at the top of the ACP diagram.&lt;br /&gt;
* ER 1055 Change ACPStyle show_tabs to show_toolbar.&lt;br /&gt;
* EW 1053 Multichoice menu doesn’t close if you click on another variable&lt;br /&gt;
* EW 1051 Balloon goes off the edge of the diagram&lt;br /&gt;
* EW 1050 Cannot proactively evaluate choice selections inside a table in ACP&lt;br /&gt;
* EW 1048 Characters with accents and chinese characters not displaying correctly when model is uploaded via DTA Publish to Cloud&lt;br /&gt;
* EW 1046 Bulleted lists look bad in ACP after publishing to cloud&lt;br /&gt;
* EW 1038 balloonText not acknowledged in ACP3&lt;br /&gt;
* Ew 1032 MultiChoice should display «None» when there's nothing selected&lt;br /&gt;
* EW 995 Graph too wide when using side tabs&lt;br /&gt;
* ER 908 Hierarchy bar should include top level module name in non-tab views.&lt;br /&gt;
* EW 781 Balloon contents overlap the edge of the diagram&lt;br /&gt;
* EW 509 Help balloon goes off the bottom of the diagram&lt;br /&gt;
&lt;br /&gt;
A list of EW issues - Bugs or Enhancements  - that were fixed or implemented in the most recent ACP build&lt;br /&gt;
== Fixed or implemented in Build 0.45 (same as release 3.0)==&lt;br /&gt;
* EW 1067 Remove beta from login page.&lt;br /&gt;
* EW 1066 Unminimized javascript visible in Chrome Developers tools&lt;br /&gt;
* ER 1044 Remove add_scroll_bars from library and wiki&lt;br /&gt;
* ER 1043 Stop showing message box when someone clicks on blue link text in a table&lt;br /&gt;
* EW 1040 Hierarchy strip is a pixel or two too wide&lt;br /&gt;
* ER 1039 Make help menu forms (a) all dialogs have the same width, and (b) have a consistent top location, so that changes would affect only the length/height.&lt;br /&gt;
* ER 1034 Add new Help menu icon to the left of the Close menu icon in top toolbar&lt;br /&gt;
* ER 1033 Change wording on tech support form&lt;br /&gt;
* EW 1029 Tweak uneven margins for graphs in top tabs&lt;br /&gt;
* EW 1028 Add margin to tables shown in top tabs w/o frame/tall node&lt;br /&gt;
* EW 1027 Footer with logos not visible viewing result in top tabs&lt;br /&gt;
* EW 1024 Graph autoscale (zoom out) hover icon not working for comparison variables.&lt;br /&gt;
* EW 1023 Wrong index menus view. Similar to 1006.&lt;br /&gt;
* EW 1020 Graph goes blank after an OnClick event&lt;br /&gt;
* EW 1015 Units not showing in Tall Nodes&lt;br /&gt;
* EW 1003 Delete Project button in wrong location.&lt;br /&gt;
* EW 966 Result table takes a long time to display result.&lt;br /&gt;
* ER 920 Report issue dialog and result&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in Build 0.44==&lt;br /&gt;
* EW 1017 Styles Lib preview, show title not working in preview.&lt;br /&gt;
* EW 1016 'Show_title: no' does not work with tall result tables.&lt;br /&gt;
* EW 1007 Crash when evaluating empty string for text only input node.&lt;br /&gt;
* EW 1006 Odd presentation of index menus - mix matched. &lt;br /&gt;
* ER 1000 Make last item in Hierarchy Stripe bold.&lt;br /&gt;
* EW Diagram crashes when changing Nav styles.&lt;br /&gt;
* ER 913 Make Diagram tooltab go to parent diagram and eliminate parent button.&lt;br /&gt;
* ER 816 Implement framenode ACP styles for variables.&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in Build 0.43==&lt;br /&gt;
* ER 998 Put Outline in rounded rectangle&lt;br /&gt;
* EW 997 In Airplane NLP model, the outliner indentation is missing for items with long title &lt;br /&gt;
* EW 990 Form for adding users has significant layout problems&lt;br /&gt;
* EW 989 Outliner Scroll bar overlaps the Analytica logo&lt;br /&gt;
* EW 987 Can't see the entire email invite ui&lt;br /&gt;
* EW 986  ACP1 tabs should not wrap when window is narrow&lt;br /&gt;
* EW 984 ACP Change password ui is unresponsive&lt;br /&gt;
* EW 978 Show title:no also hides uncertainty view menu and table_graph/index_menus icons&lt;br /&gt;
* ER 696 Some outline view issues. A couple bugs and some ER's&lt;br /&gt;
* ER 594 Put Outline in rounded rectangle and many more&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in Build 0.42==&lt;br /&gt;
* EW994 Graph size off when using Side Tabs with Use Top Diagiam Size&lt;br /&gt;
* EW 983 Style library does not show when I think it should&lt;br /&gt;
* EW 974 Parenthesis showing on models' diagram&lt;br /&gt;
* EW 973 Don’t show scrollbars when not needed&lt;br /&gt;
* ER 972 Show description of Module in balloon on mouseover of tab.&lt;br /&gt;
* ER 968 Tabs across the top should be fitted across the diagram, not the browser window width&lt;br /&gt;
* ER 967 When using show_title:no and no other graph header ui, graph fills entire frame/tall node&lt;br /&gt;
* ER 965 Some issues I had with the acp admin folder and suan account admin model.&lt;br /&gt;
* EW 961 Small gap at between graph and bottom of tall node. There should be no gap.&lt;br /&gt;
* EW 960 Excessive gap between graph and title in Tall Node&lt;br /&gt;
* EW 955 White area below Graph tab present, but should be gray.&lt;br /&gt;
* EW 953 Can't see the bottom of a graph in ACP1 Graph tab.&lt;br /&gt;
* ER 828 Analytica branding in ACP&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in Build 0.41==&lt;br /&gt;
* EW 964 Email address reported as not valid&lt;br /&gt;
* EW 963 Delete User is poorly conceived. Problematic&lt;br /&gt;
* EW 962 The Privileges table clips&lt;br /&gt;
* EW 956 ACP tabs not visible in Navigation style side tabs - when the style is show_tabs:yes.&lt;br /&gt;
* EW 811 Show_title should work for Tall node as well as Frame&lt;br /&gt;
* EW 780 Table in Tall node doesn't use entire width&lt;br /&gt;
* ER 530 DB change for Add/Remove project permissions&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in Build 0.40==&lt;br /&gt;
* EW 952 Can't change file name in Save As... dialog&lt;br /&gt;
* EW 951 Gray outline showing through the glow hover highlight on mouseover.&lt;br /&gt;
* EW 949 Text input for some inputs have a thick 2 pixel border, but should be only 1 px&lt;br /&gt;
* ER 946 Minor enhancement to text input boxes when they have focus.&lt;br /&gt;
* EW 945 Scroll bars not visible or only partially visible&lt;br /&gt;
* ER 942 Change appearance of &amp;quot;You are about to timeout&amp;quot; message box.&lt;br /&gt;
* EW 940 Model tab should read &amp;quot;Main&amp;quot;&lt;br /&gt;
* EW 939 Issues with navigation_style:two_top_tabs&lt;br /&gt;
* EW 938 Module node doesn't show on top diagram when module tabs are on.&lt;br /&gt;
* EW 937 Units showing above tall tables/graphs&lt;br /&gt;
* EW 874 Subtable with single text cell should not show as table in tall node&lt;br /&gt;
* EW 678 Getting stuck in a tab/diagram&lt;br /&gt;
* EW 472 Result does not show in top tabs style without frame node/tall node&lt;br /&gt;
&lt;br /&gt;
(build 35-39 failed the acceptance test - including the fixes in these builds here)&lt;br /&gt;
== Fixed or implemented in Build 0.39==&lt;br /&gt;
''(Note: this build failed the acceptance test)''&lt;br /&gt;
* ER 936 Don't show text selection mouse pointer when using Close Menu&lt;br /&gt;
* ER 935 Give visual feedback when a formnode button is clicked.&lt;br /&gt;
* EW 932 Zoom selects wrong axis range&lt;br /&gt;
* EW 931 Crash when changing tabs&lt;br /&gt;
* EW 930 ACP diagram layout not quite the same as DTA&lt;br /&gt;
* EW 929 Screen shows scroll bars when not needed&lt;br /&gt;
* EW 928 ACP Crashes - goes to blank screen&lt;br /&gt;
* EW 927 Unnecessary scroll bar in single cell input&lt;br /&gt;
* EW 925 Result in frame node Very slow to show results, and then redisplays the results multiple times &lt;br /&gt;
* ER 922 Sort projects pulldown menu alphabetically&lt;br /&gt;
* ER 918 Make border thinner for Module nodes&lt;br /&gt;
* ER 914 Save model as dialog should be same style as Message box dialog.&lt;br /&gt;
* ER 909 Change defaults for show_uncertainty_view&lt;br /&gt;
* ER 906 Implement cloudplayerstyle show_index_menus:fly-in for framenodes and tall nodes.&lt;br /&gt;
* EW 905 Wrong pivot in the Horizontal axis menu&lt;br /&gt;
* EW 901 Choice input menu with blank option selected is too short, ARC&lt;br /&gt;
* EW 899 Text inputs in ARC model have tiny scrollbars&lt;br /&gt;
* EW 898 Tall edit tables that are subtables do not display as automatically, and they are not embedded.&lt;br /&gt;
* EW 890 White screen after closing optimizer model after OptStatusText evaluation&lt;br /&gt;
* EW 856 Z-level of nodes wrong&lt;br /&gt;
* ER 823 Change to show_index_menus:no ACP style setting  &amp;quot;Show slicer indexes by default even when Show_index: No. &lt;br /&gt;
* ER 822 Add ACP style Show_index_menus: Not_even_slicers.&lt;br /&gt;
* EW 760 Can't view result graph for scalar chance variable.&lt;br /&gt;
* EW 747 Add support for Show_uncertainty_view: no/yes for individual nodes&lt;br /&gt;
* ER 309 Hide index menus above tables/graphs in Tall nodes&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in Build 0.38==&lt;br /&gt;
''(Note: this build failed the acceptance test)''&lt;br /&gt;
* EW 895 Pivot table doesn't work, body cells not updating.&lt;br /&gt;
* EW 887 Tech support (or report issue) from Email invite gives white screen&lt;br /&gt;
* EW 886 Restart ACP from Email invite gives web socket error&lt;br /&gt;
* ER 870 When you enter text into a field and press enter, you need to use the mouse to enter replacement info.&lt;br /&gt;
* EW 861 Respect Z-order for Frame and other nodes&lt;br /&gt;
* EW 853 ARC -Choice menu control is too narrow - Unusable&lt;br /&gt;
* EW 850 Problem with inputs/inputs in ARC model&lt;br /&gt;
* EW 466 Suan.exe crashes (vanishes) at model load with a model from guidehouse&lt;br /&gt;
* EW 353 Weird view while starting a model&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in Build 0.37==&lt;br /&gt;
''(Note: this build failed the acceptance test)''&lt;br /&gt;
* EW 891 Tall result tables exceed bottom border.&lt;br /&gt;
* EW 852 Embedded tall subtable has too many titles&lt;br /&gt;
* ER 821 New ACP style option: Show_graph_table_icon: No.&lt;br /&gt;
* ER 812 Put empty Index for pivoter menus as last not first&lt;br /&gt;
* ER 808 Don't show balloon description for Frame or tall node when it is already showing its description.&lt;br /&gt;
* EW 807 Show description doesn’t work for Tall nodes&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in Build 0.36==&lt;br /&gt;
''(Note: this build failed the acceptance test)''&lt;br /&gt;
* EW 883 Save as dialog has transparent background, but should not.&lt;br /&gt;
* EW 882 Significant problem with tall nodes in build 35.&lt;br /&gt;
* EW 876 show_as_tab: No doesn’t work (for non - top diagram modules)&lt;br /&gt;
* EW 865 Close model after Save model gives blank screen&lt;br /&gt;
* EW 720 Very slow or crash when displaying a large table&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in Build 0.35==&lt;br /&gt;
''(Note: this build failed the acceptance test)''&lt;br /&gt;
* ER 879 Don't show quotes for cells that are specified as text only format.&lt;br /&gt;
* EW 878 Server crash when you select an item in a tall node choice list.&lt;br /&gt;
* EW 877 Message box appears on DTA desktop when it shouldn't in dual-interface mode.&lt;br /&gt;
* EW 875 Table shows diagonal lines across cells&lt;br /&gt;
* ER 874 Subtable with single text cell should not show as table in tall node&lt;br /&gt;
* EW 873 Multichoice button is not the same width as in DTA&lt;br /&gt;
* EW 869 Multichoice won’t accept selections if you click below, above, or to the left of the menu&lt;br /&gt;
* EW 848 Bottom of graph cut off in ACP1 tabs&lt;br /&gt;
* EW 846 pivoters start to show at the top of a frame node when they should not&lt;br /&gt;
* EW 845 Background color for pivoters / slicers is gray when should be transparent in tall edit table&lt;br /&gt;
* ER 844 Implement show_index_menus: yes/no for the model's top level CPS&lt;br /&gt;
* EW 793 Changes to ShowHier not showing in ACP3&lt;br /&gt;
* EW 680 Can't pivot a result table.&lt;br /&gt;
* EW Table header slides up to the top of the diagram.&lt;br /&gt;
* ER 642 Add help / support info e.g. acp@lumina.com&lt;br /&gt;
* ER 294 A tall multichoice user input node should display as a list selection.&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in Build 0.34==&lt;br /&gt;
* EW 881 Uncertainly selector vanishes . (when changed to mid view - a previously implemented ER)&lt;br /&gt;
* ER 872 Implement Save as&lt;br /&gt;
* EW 849 Pivoters and slicers missing above table when viewed in ACP1 tabs&lt;br /&gt;
* ER 841 Adjust margins for tall and frame node tables based on corner radius.&lt;br /&gt;
* EW 840 For tall nodes and frame node, give graphs rounded bottom corners that match the tall/frame nodes&lt;br /&gt;
* EW 839 Debug MsgBox appears in List edit, says key=4, and changed doesn't take.&lt;br /&gt;
* EW 827 Non-parsing JSON during Graph in TXC&lt;br /&gt;
* ER 819 Icon buttons in Tall and Frame nodes appear on mouse-over&lt;br /&gt;
* EW 814 Bottom border of tall node is a bit thin when showing graph&lt;br /&gt;
* EW 809 Expand consistent margins around Graph, Table, and Object views in Frame&lt;br /&gt;
* ER 806 Replace Fly-in indexes pivoter with simply showing/hiding indexes&lt;br /&gt;
* ER 804 Make node shadows smaller&lt;br /&gt;
* EW 803 Description shows ‘0’ when ‘No’ in Frame node with Graph&lt;br /&gt;
* EW 802 Model title not showing in teal top banner&lt;br /&gt;
* EW 798 Graph is greyed out after mouse-over.&lt;br /&gt;
* EW 786 Model name is truncated when it doesn't need to be&lt;br /&gt;
* EW 498 JSON did not parse error during edit table&lt;br /&gt;
* EW 194 Result tables don't yet have Slicer totals.&lt;br /&gt;
* ER 153 Session timeout&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in Build 0.33==&lt;br /&gt;
* EW 792 Add toggle table/graph icon Tall output nodes&lt;br /&gt;
* ER 791 Change icon in ACP1 tabs for result table.&lt;br /&gt;
* EW 777 Tall table not showing slicer&lt;br /&gt;
* EW 776 Pivoter background color for tall graphs should not be gray&lt;br /&gt;
* ER 775 ER for showing pivoters for Tall result graphs&lt;br /&gt;
* ER 773 Spec for showing pivoters/slicers in frame and tall nodes. And ACP1 tabs.&lt;br /&gt;
* EW 766 Inconsistent display of description in frame nodes.&lt;br /&gt;
* EW 738 Graphs re-render many times, slow&lt;br /&gt;
* EW 669 Frame node not showing description for edit table&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in Build 0.32==&lt;br /&gt;
*ER 772 Don't show row pivoter in frame nodes or tall nodes (unless &amp;quot;show_index_menus: yes&amp;quot; is set). &lt;br /&gt;
* ER 770 Add 8 pixel margin around table in ACP1 tabs&lt;br /&gt;
* EW 768 Column pivoter not aligned with left edge of first column&lt;br /&gt;
* EW 767 Fly in pivoters visible above tall result graph. It should not be.&lt;br /&gt;
* EW 764 Empty help balloon appearing on tall node&lt;br /&gt;
* ER 759 Make tall node titles bold&lt;br /&gt;
* EW 758 &amp;quot;fly in&amp;quot; pivoters box not aligned correctly&lt;br /&gt;
* ER 757 No hover highlight for Tall Nodes&lt;br /&gt;
* EW 756 Scroll bar appears when hovering over last column header in table&lt;br /&gt;
* ER 755 Tall node titles should be left aligned with table's left edge and bold&lt;br /&gt;
* EW 754 Can't close MultiChoice popup in table cell.&lt;br /&gt;
* ER 742 Don’t show Origin index or make it work&lt;br /&gt;
* EW 741 Clicking on this list button goes to a white screen. Can't get back into the model&lt;br /&gt;
* EW 735 Can't publish model to cloud which contains Style library&lt;br /&gt;
* EW 721 Sorting doesn’t work for Checkboxes and Choice menus.&lt;br /&gt;
* EW 683 show_index_menus is not working (w/spec)&lt;br /&gt;
* EW 665 Graph hover icons appear in the wrong place.&lt;br /&gt;
* EW 557 Publish to cloud will not upload large models&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in Build 0.31==&lt;br /&gt;
* ER 745 Change Close menu for clarity.&lt;br /&gt;
* ER 744 Complete cleanup of Table outer border&lt;br /&gt;
* EW 743 Button shows content beneath it on hover.&lt;br /&gt;
* EW 740 'All' in choice list does not stick when selected.&lt;br /&gt;
* ER 730 Support «All» option for Slicers&lt;br /&gt;
* EW 708 Embedded object view exceeds frame node boundaries&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in Build 0.30==&lt;br /&gt;
* ER 739 Selection and hoverhighlight colors.&lt;br /&gt;
* ER 737 Formnodes with fill should show hover highlight outside of nodes' border.&lt;br /&gt;
* ER 734 Change hover highlight for input/output nodes.&lt;br /&gt;
* ER 733 Make table margins for frame/tall nodes equal to the corner radius of the frame/tall node.&lt;br /&gt;
* ER 731 Slicer pulldowns column-wrap when they should not.&lt;br /&gt;
* ER 729 Fill and borders for row index cell (and column index cell) (part 2)&lt;br /&gt;
* EW 725 Wrong cursor icon&lt;br /&gt;
* EW 723 User inputs that are atomic elements of a subtable show expression “Subtable(.” rather than the number or text value expected.&lt;br /&gt;
* ER 717 Put units to left of the the Uncertainty view menu&lt;br /&gt;
* ER 716 White margin between the table border and the Frame border&lt;br /&gt;
* EW 715 Bottom corners of table overlap rounded frame corners&lt;br /&gt;
* EW 713 Icons in input/output nodes not centered vertically, but should be&lt;br /&gt;
* EW 712 Bottom corner of frame node borders missing in Portfolio Planner when graph is showing in frame node&lt;br /&gt;
* EW 710 Graph in Frame Node too tall initially&lt;br /&gt;
* EW 708 Embedded object view exceeds frame node boundaries&lt;br /&gt;
* EW 707 Labels for formnodes are not showing up.&lt;br /&gt;
* EW 695 Frame border gets thinner where the graph is.&lt;br /&gt;
* EW 655 Square graph corners extend outside of rounded framenode corners.&lt;br /&gt;
* ER 609 Don't use reverse video for selected nodes, use gray&lt;br /&gt;
&lt;br /&gt;
== Fixed or implemented in Build 0.29==&lt;br /&gt;
&lt;br /&gt;
* EW 704 UI Crashes when clicking on input in the object window&lt;br /&gt;
* EW 703 Stray curly bracket on the change password page&lt;br /&gt;
* EW 702 Need to log playing of eVites&lt;br /&gt;
* EW 699 Insufficient read access to folder&lt;br /&gt;
* ER 673 Change required by May 2021. (NPM - javascript update)&lt;br /&gt;
* ER 528 Open model in ACP after publishing&lt;br /&gt;
* EW 514 Changes in edit table don't stick when you go to other tab.&lt;br /&gt;
&lt;br /&gt;
==Fixed or implemented in Build 0.28==&lt;br /&gt;
&lt;br /&gt;
* EW 698 On large table, part of scroll bar is being clipped i.e. not visible.&lt;br /&gt;
* EW 697 White gap at bottom of object window.&lt;br /&gt;
* EW 693 More Table Layout Style changes&lt;br /&gt;
* EW 692 WebSocket connection drops&lt;br /&gt;
* EW 691 Click on UDF should go to Object window&lt;br /&gt;
* ER 690 Change toggle to graph icon&lt;br /&gt;
* EW 689 No vertical scrollbar in object window&lt;br /&gt;
* EW 688 Tall output nodes should have margin on top and rhs of title&lt;br /&gt;
* ER 687 Object window option in Att_FrameNodeShowing&lt;br /&gt;
* EW 684 When adding new users, email subject is 'Invitation to Suan'.&lt;br /&gt;
* ER 681 Sortable table columns&lt;br /&gt;
* ER 666 Change attribute identifier to AcpStyles&lt;br /&gt;
* ER 654 Move Row pivot control to table corner cell.&lt;br /&gt;
* EW 647 Spreadsheetopen() with undefined showdialog attribute is acting as if the attribute was 'false'&lt;br /&gt;
* EW 627 Graph in tall nodes is not centered horizontally&lt;br /&gt;
* EW 604 SysVar AnalyticaEdition needs a tweak.&lt;br /&gt;
* EW 585 Suan shows graph when it should show table&lt;br /&gt;
* EW 576 ACP3 version shows doesn't show correct cell number formats (%, $ sign)&lt;br /&gt;
* EW 556 Cell-level number format not reflected in table.&lt;br /&gt;
* EW 531 Remove &amp;quot;Group name&amp;quot; from email sent when adding user to project&lt;br /&gt;
* ER 517 Syntax coloring for definitions&lt;br /&gt;
* EW 398 Input nodes show wrong number format&lt;br /&gt;
* EW 387 Problem pivoting prob bands table&lt;br /&gt;
* EW 141 Some input titles are missing in Daylight Analyzer example model	&lt;br /&gt;
* EW 68 The number format for a table index doesn't match DTA&lt;br /&gt;
* EW 44 Click on node opens graph, should be result table.&lt;br /&gt;
* EW 15 	User text box input has wrong number format - .06 instead of 6.00%&lt;br /&gt;
&lt;br /&gt;
==Fixed or implemented n Build 0.27==&lt;br /&gt;
&lt;br /&gt;
* EW 672 JavaScript crash on fontSize&lt;br /&gt;
* EW 671 ACAP model not using correct font&lt;br /&gt;
* EW 670 Graph/Table hover icon needs higher Z-order.&lt;br /&gt;
* EW 668 Scrollbar in tall edit table should be adjacent to the table&lt;br /&gt;
* EW 664 Crash after viewing frame node graph and re-opening model.&lt;br /&gt;
* EW 663 Frame node not defined yet, and FrameNode not working&lt;br /&gt;
* ER 662 Graphing roles could be arranged into multiple columns when the view is wide enough.&lt;br /&gt;
* ER 660 Change module icon in Outline view&lt;br /&gt;
* ER 659 Clean up of Table design&lt;br /&gt;
* EW 658 Selection bubble for Output &amp;amp; Input nodes are different size&lt;br /&gt;
* ER 657 No node hover for Frame Node objects&lt;br /&gt;
* ER 656 No need for &amp;quot;Edit Table of&amp;quot; in the title of edit tables&lt;br /&gt;
* EW 648 Framenode is not showing results dup 663&lt;br /&gt;
* EW 646 Make text node and frame node borders look the same.&lt;br /&gt;
* EW 641 Glitchy table header artifact appears on embedded table.&lt;br /&gt;
* EW 635 ACP not consuming available browser space.&lt;br /&gt;
* EW 617 Nodes' font is lost when going to Object window and then back to diagram.&lt;br /&gt;
* EW 592 The rightmost tab “Model details” goes off the right side.&lt;br /&gt;
* EW 559 Forgot password not working in publish to cloud&lt;br /&gt;
* ER 535 Reduce the number of registry keys needed to publish to a non 'acp.analytica.com' server.&lt;br /&gt;
&lt;br /&gt;
==Fixed or implemented in Build 0.26==&lt;br /&gt;
&lt;br /&gt;
* ER 640: Add SuanAssets reg key&lt;br /&gt;
* EW 639: There should be a gap between top tabs and teal banner, but there is not sometimes&lt;br /&gt;
* ER 638: Change default for &amp;quot;show_model_title&amp;quot;&lt;br /&gt;
* ER 634: libXl error: Marshalled for a different thread&lt;br /&gt;
* ER 633: Implement &amp;quot;Show_uncertainty_view: no&amp;quot; CPS flag&lt;br /&gt;
* ER 632: Change name of CPS flag &amp;quot;Hide_uncertainty_view: no&amp;quot; to &amp;quot;Show_uncertainty_view: yes&amp;quot;&lt;br /&gt;
* ER 631: Make Text and FrameNode borders the same&lt;br /&gt;
* EW 630: Spreadsheetopen(filename) with the filename being an existing file does not appear to be working to spec.&lt;br /&gt;
* ER 628: Implement consistent margins in graphs&lt;br /&gt;
* ER 637: Graph in tall nodes is not centered horizontally&lt;br /&gt;
* ER 623: Model doesn't open to diagram. Suan.exe session crash.&lt;br /&gt;
* EW 603: Allow addition of 'Not a member' users to other projects.&lt;br /&gt;
* EW 599: DTA not recognizing ACP licenses&lt;br /&gt;
* ER 575: Configure Proactive User Outputs breaks with upstream change&lt;br /&gt;
* ER 535: Reduce the number of registry keys needed to publish to a non 'acp.analytica.com' server&lt;br /&gt;
* EW 516: Problem switch from edit table to result or graph tab&lt;br /&gt;
* EW 366: Edit tables and results don't display automatically&lt;br /&gt;
 &lt;br /&gt;
==Fixed or implemented n Build 0.25==&lt;br /&gt;
&lt;br /&gt;
* ER 623: Make text nodes and frame nodes have rounded corners&lt;br /&gt;
* EW 622: Output node &amp;quot;Calc/Result&amp;quot; buttons using the wrong font&lt;br /&gt;
* EW 621: Tall text input nodes not showing Title when they should be&lt;br /&gt;
* EW 620: Text inputs not using node font style when they should&lt;br /&gt;
* EW 619: Input node button labels not using diagram/node font styles&lt;br /&gt;
* EW 618: Choice input pulldown not using correct font.&lt;br /&gt;
* EW 616: Unable to upload models&lt;br /&gt;
* EW 611: User output value is not in the custom font&lt;br /&gt;
* EW 604: SysVar AnalyticaEdition needs a tweak&lt;br /&gt;
* ER 595: Reduce white space between tabs and top teal band&lt;br /&gt;
* ER 591: When loading model, show a progress bar&lt;br /&gt;
* EW 582: Choice inputs should use the diagram or node font settings.&lt;br /&gt;
* EW 542: Don’t show model internals while loading&lt;br /&gt;
* ER 437: Remove RT and UI from top stripe in release&lt;br /&gt;
* EW 420: Weird diagram appears while starting up a model&lt;br /&gt;
* ER 413: ShowProgressBar not implemented yet&lt;br /&gt;
&lt;br /&gt;
==Fixed or implemented n Build 0.24==&lt;br /&gt;
&lt;br /&gt;
* ER 615: Cloud Platform Styles flag &amp;quot;Hide_uncertainty_view: no&amp;quot; &lt;br /&gt;
* ER 614: If a variable is showing Mid view, then the uncertainty selector does not show - same as in Acp1.&lt;br /&gt;
* EW 613: Clicking on FrameNode should not show object window or error message.&lt;br /&gt;
* ER 612: Can't add/append/insert/delete/reorder elements in a list&lt;br /&gt;
* EW 610: Server process crash, in graphing code (Ecoplexus).&lt;br /&gt;
* EW 606: Some problems with Tall edit tables, affects transdev. Pivoters / slicers showing when they should not. Gray background in header area. Table exceeds node borders at the bottom.&lt;br /&gt;
* EW 605: Server-side memory leak with tables.&lt;br /&gt;
* EW 602: SpreadsheetOpen/Close (Transdev)&lt;br /&gt;
* ER 598: Tweaks to input/outputs popup that appears when clicking on left/right side of nodes.&lt;br /&gt;
* ER 593: Don’t show units for user input/output arrays.&lt;br /&gt;
* ER 590: Highlight node on mouse-over enhancements.&lt;br /&gt;
* ER 587: Make rotating cube wait view smaller.&lt;br /&gt;
* EW 581: Undefined nodes should not show object window and should show an error when clicked&lt;br /&gt;
* ER 579: Change ACP page title from &amp;quot;Analytica Cloud Platform&amp;quot; to simply &amp;quot;Analytica&amp;quot;.&lt;br /&gt;
* EW 547: Diagram with two Frame nodes doesn’t always work&lt;br /&gt;
* EW 545: Uncertainty view should be to the right of Title for Graphs (as for Tables).&lt;br /&gt;
* EW 543: Error message on model load&lt;br /&gt;
&lt;br /&gt;
==Fixed or implemented n Build 0.23==&lt;br /&gt;
&lt;br /&gt;
* EW 566 Transdev: Warning message goes off the bottom of the canvas - can't read it all and can't close it&lt;br /&gt;
* EW 558 Text node title a little too large&lt;br /&gt;
* EW 551 Glitch on right end of Show hierarchy bar&lt;br /&gt;
* EW 550 Default font size and align Title of Text node same as Title in Graph or Table in Frame&lt;br /&gt;
* EW 548 Make description text in graph/table left aligned with Title above it.&lt;br /&gt;
* EW 546 Text node border too thick&lt;br /&gt;
* EW 544 Table view overlaps top of Frame node&lt;br /&gt;
* EW 537 Signin: Bad message shown to user when email address without password is used with 'Get a new password'&lt;br /&gt;
* EW 536 Odd message presented to user when closing google sign in popup&lt;br /&gt;
* EW 533 After setting up group account, user doesn't exist.&lt;br /&gt;
* EW 512 Multichoice popup does not disappear when clicking on the diagram background&lt;br /&gt;
&lt;br /&gt;
''Fixed or implemented n Build 0.22'&lt;br /&gt;
&lt;br /&gt;
* EW 529 After creating a new group account, user could not add projects.&lt;br /&gt;
* EW 527 Some eVites don't play.&lt;br /&gt;
* EW 526 Enforce file permissions when launching an eVite.&lt;br /&gt;
* EW 525 Update message shown to user when user is unable to establish a connection.&lt;br /&gt;
* EW 506 Text with extended characters entered into text box control corrupt.&lt;br /&gt;
* ER 505 An EMF image (in a picture node) does not display.&lt;br /&gt;
* ER 504 Error during query **TO DO** displays.&lt;br /&gt;
* ER 239 REST method handlers.&lt;br /&gt;
* ER 149 Support &amp;quot;Publish to cloud...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Fixed or implemented n Build 0.21==&lt;br /&gt;
&lt;br /&gt;
* EW 503 Output node result text not aligned correctly&lt;br /&gt;
* EW 502 Invite email says &amp;quot;Analytica Cloud Player&amp;quot; in body&lt;br /&gt;
* EW 501 When playing invite, &amp;quot;Signin skipped&amp;quot; appears in toolbar, but should not.&lt;br /&gt;
* EW 500 Show less options on &amp;quot;Close Menu&amp;quot; when viewing invite.&lt;br /&gt;
* EW 497 Text node titles not using correct font in some cases.&lt;br /&gt;
* EW 496 Problem viewing Exceedance Probably results.&lt;br /&gt;
* ER 495 Re-enable file functions. [Read|Write][Text|Binary|Export|Image]File() functions&lt;br /&gt;
* EW 494 Control near top is clipped.&lt;br /&gt;
* ER 492 Built-in file functions should only allow access to your own project folder.&lt;br /&gt;
* EW 491 Graph slicer not working initially in Cory's So Cal Gas model.&lt;br /&gt;
* EW 490 Big problem with indexes that are dates.&lt;br /&gt;
* EW 489 Cory: Te1299802109 does not center on the ACP diagram though it does on the desktop.&lt;br /&gt;
* EW 488 Cory: Therm_Savings_by_Wav shows up as a table rather than a graph, and shows statistics rather than the desktop selection of probability density.&lt;br /&gt;
* EW 487 Cory: Input/Output Node colors are different than in the desktop model,&lt;br /&gt;
* EW 486 Cory: Historical_Savings1, HDD_Data, HDD_Data, HDD_Coeff_Data_to_In input does not show the inputs at all when evaluated.&lt;br /&gt;
* EW 485 Cory: Svgs_Delta_Dist_due_ , Second_Year_Program_ , Second_Year_Program_, Therm_cust_savings_a (and probably some others in the diagrams I haven’t checked) show up as a table even though graph was selected in desktop model.&lt;br /&gt;
* EW 484 Cory: HDD_Lognormal shows up as a probability distribution (in a table) even though Mid (and a graph)&lt;br /&gt;
* EW 482 Cory: Statistics don’t change on graph for Therm_Savings_by_Wav.&lt;br /&gt;
* EW 480 Cory:  Result for Total_Forecast_Savin  does not display when output node is clicked.&lt;br /&gt;
* EW 479 Max: For bare icon (and icon) input/output button style, icon is not vertically centered.&lt;br /&gt;
* ER 476 Make background above table gray when using ACP1 tabs.&lt;br /&gt;
* EW 471 Max: Table rows with no data are too short&lt;br /&gt;
* ER 382 The WriteTextFile( ) function displays a file selector dialog on the server, causing the application to apparently lock up.&lt;br /&gt;
&lt;br /&gt;
==Fixed or implemented n Build 0.20==&lt;br /&gt;
&lt;br /&gt;
* EW 478 - The black border around a selected button of an output node was mis-aligned and showed as 2 odd looking lines.&lt;br /&gt;
* ER 475 - Some style changes to Graph Tooltip.&lt;br /&gt;
* ER 474 - Some style changes to Message boxes.&lt;br /&gt;
* ER 473 - Added support for Distribution input nodes showing icons button style.&lt;br /&gt;
* ER 470 - A couple changes to table style. White background header and moved the View Selector pulldown to the  right side.&lt;br /&gt;
* EW 469 -Text input fields, change to Use default model font, not fixed width.&lt;br /&gt;
* EW 468 - Diagram showing wrong font for nodes.&lt;br /&gt;
* ER 465 - Include the Rent vs Buy example model when an Individual account is first created.&lt;br /&gt;
* ER 464 - The shading around each button is too contrasty.&lt;br /&gt;
* EW 415 - Choice nodes are too tall.&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=Using_Python_from_Analytica&amp;diff=63735</id>
		<title>Using Python from Analytica</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=Using_Python_from_Analytica&amp;diff=63735"/>
		<updated>2026-02-12T00:03:50Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;                                               [[category:Python integration]]&lt;br /&gt;
''New in [[Analytica 7.0]]''&lt;br /&gt;
&lt;br /&gt;
Requires the [[Analytica Developer]] (formerly [[Analytica Enterprise]] edition.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Analytica provides a two-way bridge between Analytica and Python.  You can write Python code in the definitions of Analytica Variables and Functions.  Analytica can access Python variables and call Python functions, pass data—including multi-dimensional arrays—to it, and retrieve the results. Conversely, Python code can call back into Analytica to evaluate variables or expressions. Together the two environments combine Analytica’s intuitive influence-diagram interface, intelligent arrays, and built-in uncertainty analysis with Python’s vast open-source ecosystem.&lt;br /&gt;
&lt;br /&gt;
We recommend using Python versions '''3.8+''', although the integration also supports versions '''3.3+''',&lt;br /&gt;
&lt;br /&gt;
[https://videos.analytica.com/Analytica-Python/AnaPythonBasics.mp4 Watch video on Analytica-Python integration basics]&lt;br /&gt;
&lt;br /&gt;
=== Motivation: Why use Python? ===&lt;br /&gt;
Python offers thousands of purpose-built libraries that extend what you can do in a model. Here are just a few:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Python library !! What it adds to Analytica&lt;br /&gt;
|-&lt;br /&gt;
|[https://numpy.org/ NumPy], [https://pandas.pydata.org/ Pandas]|| Efficient numerical arrays and data-frame operations that underlie many other Python analytics libraries&lt;br /&gt;
|-&lt;br /&gt;
|[https://pillow.readthedocs.io/en/stable/ Pillow]|| Programmatic image manipulation for tasks such as satellite-image preprocessing before feeding data back into Analytica.&lt;br /&gt;
|-&lt;br /&gt;
|[https://matplotlib.org/ Matplotlib],  [https://seaborn.pydata.org/ Seaborn]|| Visualizations not native to Analytica, including violin plots, heatmaps, network graphs, and 3-D surface plots.&lt;br /&gt;
|-&lt;br /&gt;
|[https://pytorch.org/ PyTorch],  [https://www.tensorflow.org/ Tensorflow]|| Training or running machine-learning models, then passing predictions into Analytica for further probabilistic analysis.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Advantages: When to use Python in Analytica ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Situation in Analytica !! Why using Python helps&lt;br /&gt;
|-&lt;br /&gt;
| Want custom visualizations beyond Analytica graphs || Generate plots with [https://matplotlib.org/ Matplotlib] or [https://seaborn.pydata.org/ Seaborn], save images, and display them in a Result window&lt;br /&gt;
|-&lt;br /&gt;
| Require advanced text or Natural-Language Processing || Apply Python packages like [https://spacy.io/ spaCy], [https://www.nltk.org/ NLTK], or built-in &amp;lt;code&amp;gt;re&amp;lt;/code&amp;gt; for parsing, classification, and transformation&lt;br /&gt;
|-&lt;br /&gt;
| Need a specialized statistical, ML, or optimization algorithm not built into Analytica || Leverage PyPI libraries such as [https://scikit-learn.org/ scikit-learn], [https://pandas.pydata.org/ pandas], or [https://coin-or.github.io/pulp/ pulp] without re-implementing the math&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Python downsides: When native Analytica is often better ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Concern !! Why pure Analytica can be preferable&lt;br /&gt;
|-&lt;br /&gt;
|[[Array Abstraction|Array abstraction]]|| Operating on arrays with different dimensions is often a one-liner in Analytica but requires verbose reshape/broadcast code in NumPy or Pandas.&lt;br /&gt;
|-&lt;br /&gt;
| Performance overhead || Transferring data and compiling Python incurs latency. Tight loops or lightweight formulas run much faster as native Analytica expressions. For repeated Python calls, define a [[Callable]] to compile once and reuse.&lt;br /&gt;
|-&lt;br /&gt;
|[[Monte Carlo and probabilistic simulation|Monte Carlo]]|| Analytica’s built-in stochastic simulation is deeply integrated. Recreating them in Python is rarely worth the effort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Setting up a Python environment ==&lt;br /&gt;
&lt;br /&gt;
=== Installing Conda ===&lt;br /&gt;
Download and run the Anaconda or Miniconda [https://www.anaconda.com/download/success installer] for Windows.&lt;br /&gt;
&lt;br /&gt;
=== Creating and activating a Python environment ===&lt;br /&gt;
Open the newly installed '''Anaconda Prompt''' app and run this command, which will create a new Python 3.11 environment named &amp;lt;code&amp;gt;MyEnv&amp;lt;/code&amp;gt; and install the Python libraries [https://pandas.pydata.org/ Pandas] and [https://numpy.org/ NumPy]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;conda create -n MyEnv python=3.11 pandas numpy&amp;lt;/code&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
=== Telling Analytica which Python environment to use ===&lt;br /&gt;
Open the '''Definition / Application integration / Python''' submenu.&lt;br /&gt;
&lt;br /&gt;
Set either '''Python Environment''' or '''Python Model Environment''' to the environment’s name (e.g. &amp;lt;code&amp;gt;MyEnv&amp;lt;/code&amp;gt;) or to the full folder path of the Python installation home directory, for example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;C:\Users\username\anaconda3\envs\MyEnv&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Python Environment''' is stored with the Analytica installation and becomes the default for any model that does not set '''Python Model Environment'''.&lt;br /&gt;
&lt;br /&gt;
'''Python Model Environment''' is saved inside the current model and overrides the installation-wide setting.&lt;br /&gt;
&lt;br /&gt;
''See [[Using Python from Analytica/Setting up a Python environment|Setting up a Python environment]] for a detailed walkthrough.''&lt;br /&gt;
&lt;br /&gt;
=== Loading and Unloading of Python ===&lt;br /&gt;
&lt;br /&gt;
Python (core, environment, and libraries) loads only when your model first executes or evaluates Python code, and unloads when you close the model. Reopening the same model, or opening another that uses Python, starts a fresh Python session; any prior Python state (variables, imports) is lost. If the new model uses a different environment, it may run a different Python release.&lt;br /&gt;
&lt;br /&gt;
If Python is already loaded and you change the '''Python Environment''' or '''Python Model Environment''', Python unloads immediately. The selected environment’s Python loads the next time your model runs Python code. Unloading discards all Python state (variables, imports).&lt;br /&gt;
&lt;br /&gt;
Python runs in the same process as Analytica.&lt;br /&gt;
&lt;br /&gt;
== The Python menu ==&lt;br /&gt;
&lt;br /&gt;
The core Analytica functions and system variables for configuring and interacting with Python are found on the '''Definition / Application integration / Python''' submenu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[image:Python menu.png]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Importing Python libraries ==&lt;br /&gt;
&lt;br /&gt;
The ''preferred'' way to make Python libraries available in Analytica models is to place their import statements in the system variable '''PythonStartupCode'''. These lines execute when Python gets loaded, so the libraries are ready for use in later Python code.&lt;br /&gt;
&lt;br /&gt;
''If you edit '''PythonStartupCode''' after Python has already been loaded in the current Analytica model, you must reload the model (or close and reopen Analytica) for the modified startup code to take effect.''&lt;br /&gt;
&lt;br /&gt;
=== Importing from nodes ===&lt;br /&gt;
When creating a filed Analytica library or module, it is ''highly recommended'' to perform imports within a [[Variable]] or [[Callable]] node inside the library/module itself. This practice ensures that the library/module remains self-contained, as '''PythonStartupCode''' is not saved as part of a filed module or library. You should then create dependencies from nodes that use the Python libraries to the import node(s) to ensure the Python libraries are loaded before use.&lt;br /&gt;
&lt;br /&gt;
Python supports two main import styles:&lt;br /&gt;
&lt;br /&gt;
* Module import – e.g., &amp;lt;code&amp;gt;import numpy&amp;lt;/code&amp;gt;  &lt;br /&gt;
* Selective / wildcard import – e.g., &amp;lt;code&amp;gt;from numpy import array, zeros&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;from numpy import *&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When an import statement is the final expression, Analytica returns its value:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Import statement&lt;br /&gt;
! Return value when it is the last statement&lt;br /&gt;
! Output image&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;import numpy as np, os&amp;lt;/code&amp;gt;&lt;br /&gt;
| The module’s string representation e.g.,&amp;lt;br/&amp;gt;&amp;lt;code&amp;gt;«Python &amp;lt;module 'numpy' from …&amp;gt;»&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;code&amp;gt;«Python &amp;lt;module 'os' from …&amp;gt;»&amp;lt;/code&amp;gt;)&lt;br /&gt;
| [[Image:PythonMultipleModuleImports.png|thumb|250px]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;from numpy import array, zeros&amp;lt;/code&amp;gt;&lt;br /&gt;
| A list of the imported names (alias names if provided, otherwise the original names)&lt;br /&gt;
| [[Image:PythonMultipleSelectiveImports.png|thumb|250px]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Python &amp;lt;code&amp;gt;py::&amp;lt;/code&amp;gt; namespace   ==&lt;br /&gt;
Analytica exposes the embedded Python interpreter through the &amp;lt;code&amp;gt;py::&amp;lt;/code&amp;gt; namespace prefix.  Any name visible at the top level of the interpreter—global variables, functions, classes, or imported modules—can be accessed through Analytica with the same spelling and case, preceded by &amp;lt;code&amp;gt;py::&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example: Incrementing a Python global variable '''counter''' by 2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;py::counter := py::counter + 2;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Calling a Python function ==&lt;br /&gt;
Invoking a Python function from Analytica is as simple as writing it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;py::len(MyArray)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Arguments may be:&lt;br /&gt;
* Analytica scalars&lt;br /&gt;
* Analytica arrays (which get [[Array Abstraction|array abstracted]])&lt;br /&gt;
* Python objects&lt;br /&gt;
&lt;br /&gt;
=== Keyword arguments (kwargs) ===&lt;br /&gt;
When a Python function accepts keyword arguments (&amp;lt;code&amp;gt;**kwargs&amp;lt;/code&amp;gt;), use a syntax ''similar'' to Analytica’s [[Function calls and parameters#Name-based function calls|name-based function calls]], a colon after the parameter name, followed by the parameter value, instead of the equal sign used in Python.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;py::my_func(&amp;quot;arg1&amp;quot;, kwarg1:1, kwarg2:&amp;quot;abc&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The equivalent call in native Python is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;my_func(&amp;quot;arg1&amp;quot;, kwarg1=1, kwarg2=&amp;quot;abc&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Python &amp;lt;code&amp;gt;print()&amp;lt;/code&amp;gt; function  ===&lt;br /&gt;
The standard Python &amp;lt;code&amp;gt;print()&amp;lt;/code&amp;gt; function sends its text output to Analytica's [[Typescript|Typescript console]] window, just as it appears in a native Python console.  &lt;br /&gt;
* When called from Analytica with &amp;lt;code&amp;gt;py::print()&amp;lt;/code&amp;gt;, the printed text will appear in the window.  &lt;br /&gt;
* When called inside a Python script executed by Analytica, any &amp;lt;code&amp;gt;print()&amp;lt;/code&amp;gt; statements also stream to the window.&lt;br /&gt;
&lt;br /&gt;
== Using Python classes ==&lt;br /&gt;
=== Using an existing Python class ===&lt;br /&gt;
To instantiate a Python class, call its constructor with the &amp;lt;code&amp;gt;py::&amp;lt;/code&amp;gt; prefix and pass any arguments exactly as you would in native Python.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;py::MyClass(42, 'widgets')&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Arrow operator (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;)  ===&lt;br /&gt;
The arrow operator (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) lets you access the attributes and methods of a Python object, analogous to the dot operator (&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;) in Python:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;ColNames := MyDf-&amp;gt;columns      { attribute }&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;Head5    := MyDf-&amp;gt;head(5)      { method }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can chain these accesses and calls:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;FirstName := MyDf-&amp;gt;columns-&amp;gt;tolist()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also assign through the arrow operator; the assignment will update the underlying Python object:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MyObj-&amp;gt;value := 42&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Using Python code in a definition ==&lt;br /&gt;
When you choose '''Python expr''' from the [[Definition]] drop-down, the entire definition is passed verbatim to the embedded Python interpreter.&lt;br /&gt;
&lt;br /&gt;
=== Defining a UDF with a Python expr definition ===&lt;br /&gt;
When you set a Function node’s [[Definition]] to '''Python expr''', you can write the entire body in Python. Analytica recompiles that code every time the function is evaluated, which can noticeably slow large array computations. To eliminate this overhead, place the code in a reusable Python [[Callable]] so the compiled version remains cached between calls.&lt;br /&gt;
&lt;br /&gt;
''Inside '''Python expr''', Analytica function parameters behave like local Python variables.''&lt;br /&gt;
&lt;br /&gt;
== Callables ==&lt;br /&gt;
&lt;br /&gt;
[[Callable|Callables]] let you embed full Python functions or classes directly inside Analytica, then invoke them like any other [[User-Defined Functions|UDF]].&lt;br /&gt;
&lt;br /&gt;
=== Creating a Python Callable node ===&lt;br /&gt;
* Create a new [[Variable]] node.&lt;br /&gt;
* In the node’s [[Object Window|Object window]], change the [[Class details|Class]] dropdown from '''Variable''' to '''Callable'''.&lt;br /&gt;
* Enter your Python code in the Definition pane.&lt;br /&gt;
&lt;br /&gt;
=== Writing Python Callable code ===&lt;br /&gt;
Use standard Python syntax to define a &amp;lt;code&amp;gt;def&amp;lt;/code&amp;gt; function or a &amp;lt;code&amp;gt;class&amp;lt;/code&amp;gt; inside the [[Definition]] pane of your '''Callable'''. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def compound_interest(p, r, n):&lt;br /&gt;
    return p * (1 + r) ** n&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Caching compiled functions in Callables ===&lt;br /&gt;
When you evaluate a node, Analytica compiles your function and caches the resulting callable object as the node’s value. This differs from [[UDF|UDFs]] which cannot store a value, so they compile every time they run.&lt;br /&gt;
&lt;br /&gt;
=== Parameters attribute ===&lt;br /&gt;
'''Callables''' do '''not''' have a Parameters attribute; all arguments are declared in your &amp;lt;code&amp;gt;def&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;class&amp;lt;/code&amp;gt; signature.&lt;br /&gt;
&lt;br /&gt;
=== Importing custom Python modules ===&lt;br /&gt;
Import modules exactly as you would in native Python. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import myutils&lt;br /&gt;
from mylib.finance import NPV&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensure the module is on Python’s &amp;lt;code&amp;gt;sys.path&amp;lt;/code&amp;gt; by appending the module's directory to the path. For additional guidance, see the official [https://docs.python.org/3/tutorial/modules.html Python documentation on modules].&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
Analytica's automatic dependency graph is a key advantage over working in environments like Jupyter notebooks or regular Python scripts, where you are responsible for manually re-running cells or scripts to reflect changes.&lt;br /&gt;
&lt;br /&gt;
When integrating Python code, however, Analytica's dependency system cannot parse the Python script to automatically detect when an Analytica node is being used. You must explicitly declare these dependencies by drawing influence arrows. Drawing an influence arrow from any node to a node that uses '''Python Expr''' creates a true dependency, adding it to Analytica's dependency graph.&lt;br /&gt;
&lt;br /&gt;
''As an alternative for nodes that access Python global variables without using '''Python Expr''', you can establish a dependency by including the Identifier of the influencing node directly within the Definition of the dependent node.''&lt;br /&gt;
&lt;br /&gt;
If dependencies for Python nodes are not manually defined with arrows, your model will not invalidate results correctly. Updates to an input variable will not trigger re-computation in the Python node that depends on it, leaving it with a stale, incorrect value.&lt;br /&gt;
&lt;br /&gt;
== Functions for evaluating Python code ==&lt;br /&gt;
&lt;br /&gt;
=== PyEval ===&lt;br /&gt;
[[PyEval]] is used to evaluate a single Python expression and return its value to Analytica. It is designed to be side-effect-free, meaning it won't change the state of variables or objects in Python. This makes it ideal for safe, simple calculations.&lt;br /&gt;
&lt;br /&gt;
''Since &amp;lt;code&amp;gt;PyEval&amp;lt;/code&amp;gt; only evaluates a single expression, it cannot execute multi-line code or statements like variable assignments or imports.''&lt;br /&gt;
&lt;br /&gt;
It also includes an optional &amp;lt;code&amp;gt;excludeTypes&amp;lt;/code&amp;gt; parameter, which allows you to specify Python types that should not be converted to Analytica Values.&lt;br /&gt;
&lt;br /&gt;
=== PyExec ===&lt;br /&gt;
[[PyExec]] is used to execute a block of Python code, which can contain multiple lines or statements. Unlike &amp;lt;code&amp;gt;PyEval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PyExec&amp;lt;/code&amp;gt; is intended to have side effects. You can use it to import libraries, define functions, or set the values of variables in the Python environment.&lt;br /&gt;
&lt;br /&gt;
Use &amp;lt;code&amp;gt;PyExec&amp;lt;/code&amp;gt; when you need to run a script to set up an environment or perform operations that modify the Python state for use in later evaluations.&lt;br /&gt;
&lt;br /&gt;
=== PyCall ===&lt;br /&gt;
[[PyCall]] offers a direct and efficient way to call a specific Python function. You provide the callable Python function object followed by its positional and keyword arguments.&lt;br /&gt;
&lt;br /&gt;
This is the preferred function when your primary goal is to execute an existing Python function and retrieve its result.&lt;br /&gt;
&lt;br /&gt;
== Non-scalar data structures ==&lt;br /&gt;
Any Python object that is not converted automatically to an Analytica type comes back as an ''opaque wrapper'' displayed as &amp;lt;code&amp;gt;«Python …»&amp;lt;/code&amp;gt;, where the ellipsis is the object’s [https://docs.python.org/3/library/functions.html#repr repr]. Keep this wrapper when the object merely passes between Python calls, and invoke [[PyExplode]] when the data must be examined or manipulated within Analytica.&lt;br /&gt;
&lt;br /&gt;
=== Converting from Python data to Analytica ===&lt;br /&gt;
When a Python function invoked from Analytica returns a result, Analytica automatically attempts to convert the Python data into the most appropriate Analytica value. For complex data structures, the dedicated [[PyExplode]] function is available to perform more specific conversions.&lt;br /&gt;
&lt;br /&gt;
==== Automatic conversions ====&lt;br /&gt;
The following Python types are automatically converted to their corresponding Analytica equivalents without any extra steps:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Python type !! Analytica type !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Integer&amp;lt;/code&amp;gt; ||''If the &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; exceeds the 64-bit signed-integer range, Analytica converts it to a double floating-point '''Number''' instead of an '''Integer'''.''&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;float&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Number&amp;lt;/code&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;bool&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Boolean&amp;lt;/code&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;complex&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;ComplexNumber&amp;lt;/code&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;str&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Text&amp;lt;/code&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;None&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Null&amp;lt;/code&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;date&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;DateTime&amp;lt;/code&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;time&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;DateTime&amp;lt;/code&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;datetime&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;DateTime&amp;lt;/code&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;analytica.Value&amp;lt;/code&amp;gt; || Unwrapped Analytica value || &lt;br /&gt;
|-&lt;br /&gt;
| Any other Python object || ''Python opaque wrapper'' ||''Can be passed to other Python function calls or converted with &amp;lt;code&amp;gt;PyExplode&amp;lt;/code&amp;gt;.''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PyExplode ====&lt;br /&gt;
The [[PyExplode]] function provides explicit control for converting complex Python objects that are not converted automatically.&lt;br /&gt;
&lt;br /&gt;
Key capabilities include:&lt;br /&gt;
* Unpacking Python built-in collections, like &amp;lt;code&amp;gt;list&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tuple&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt;, into a 1D Analytica array.&lt;br /&gt;
* Converting a Python &amp;lt;code&amp;gt;dict&amp;lt;/code&amp;gt; into a 1D Analytica array, using the dictionary keys to create a new local index.&lt;br /&gt;
* Using nested calls to convert multi-dimensional data into multi-dimensional Analytica arrays.&lt;br /&gt;
* Fully converting a [https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html NumPy Array] into an n-dimensional Analytica array.&lt;br /&gt;
* Converting image objects from [https://pillow.readthedocs.io/en/stable/reference/Image.html#PIL.Image.Image PIL.Image] or [https://matplotlib.org/stable/api/_as_gen/matplotlib.figure.Figure.html matplotlib.figure.Figure] directly into Analytica images.&lt;br /&gt;
* Optionally excluding specific Python types from conversion with &amp;lt;code&amp;gt;excludeTypes&amp;lt;/code&amp;gt;, which keeps them as opaque Python object handles.&lt;br /&gt;
&lt;br /&gt;
''To convert a [https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html Pandas DataFrame], you must use the &amp;lt;code&amp;gt;PyExplodeDataFrame&amp;lt;/code&amp;gt; function. This function is not built-in and requires you to include the [[Python Pandas library]] in your model.''&lt;br /&gt;
&lt;br /&gt;
=== Converting from Analytica to Python data structures ===&lt;br /&gt;
The bridge between Analytica and Python performs two kinds of mappings: ''automatic scalar conversions'' and ''explicit conversion functions'' for arrays.&lt;br /&gt;
&lt;br /&gt;
==== Automatic scalar conversions ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Analytica type !! Python type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Text&amp;lt;/code&amp;gt; ||&amp;lt;code&amp;gt;str&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Integer&amp;lt;/code&amp;gt; ||&amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Number&amp;lt;/code&amp;gt; ||&amp;lt;code&amp;gt;float&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Boolean&amp;lt;/code&amp;gt; ||&amp;lt;code&amp;gt;bool&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ComplexNumber&amp;lt;/code&amp;gt; ||&amp;lt;code&amp;gt;complex&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DateTime&amp;lt;/code&amp;gt; ||&amp;lt;code&amp;gt;datetime.datetime&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;datetime.time&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;datetime.date&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Handle&amp;lt;/code&amp;gt; ||&amp;lt;code&amp;gt;analytica.Object&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Null / Undefined&amp;lt;/code&amp;gt; ||&amp;lt;code&amp;gt;None&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ''Python opaque wrapper'' || unwrapped Python object&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Reference&amp;lt;/code&amp;gt; ||&amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt;of the dereferenced contents&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Image&amp;lt;/code&amp;gt; ||&amp;lt;code&amp;gt;PIL.Image.Image&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Everything else ||&amp;lt;code&amp;gt;analytica.Value&amp;lt;/code&amp;gt; (wrapper for Analytica Values)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Explicit conversion functions for arrays ====&lt;br /&gt;
Analytica has a single collection type—the array—whereas Python offers several (&amp;lt;code&amp;gt;list&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tuple&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;dict&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;numpy.ndarray&amp;lt;/code&amp;gt;, …). Because there is no one-to-one mapping, arrays are ''not'' converted implicitly; instead call one of the system functions below.&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;code&amp;gt;PyList&amp;lt;/code&amp;gt;'', ''&amp;lt;code&amp;gt;PyTuple&amp;lt;/code&amp;gt;'', ''&amp;lt;code&amp;gt;PySet&amp;lt;/code&amp;gt;'', ''&amp;lt;code&amp;gt;PyDict&amp;lt;/code&amp;gt; create a Python collection over the single dimension that you specify. In contrast, &amp;lt;code&amp;gt;PyArray&amp;lt;/code&amp;gt; converts an entire Analytica array into a single &amp;lt;code&amp;gt;numpy.ndarray&amp;lt;/code&amp;gt;.''&lt;br /&gt;
&lt;br /&gt;
*[[PyList]] – Creates a Python &amp;lt;code&amp;gt;list&amp;lt;/code&amp;gt; from the specified index, retaining other dimensions in Analytica.&lt;br /&gt;
* [[PyTuple]] – Creates a Python &amp;lt;code&amp;gt;tuple&amp;lt;/code&amp;gt; from the chosen index of the array, retaining other dimensions in Analytica.&lt;br /&gt;
* [[PySet]] – Creates a Python &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt; from the specified index, duplicate entries will be removed.&lt;br /&gt;
* [[PyDict]] – Creates a Python &amp;lt;code&amp;gt;dict&amp;lt;/code&amp;gt; from an Analytica vector. The elements of a specified index are used as keys and the corresponding vector values become the dictionary values. The input vector must be indexed by the key index.&lt;br /&gt;
* [[PyArray]] – Converts an entire Analytica array into a single multi-dimensional &amp;lt;code&amp;gt;numpy.ndarray&amp;lt;/code&amp;gt;. This function always converts all dimensions. The optional index parameters are used to specify the order of the axes in the resulting NumPy array. For any Analytica dimension not explicitly passed as a parameter, a local, positional index is created for that axis in the NumPy array. An optional &amp;lt;code&amp;gt;dtype&amp;lt;/code&amp;gt; string passes directly to NumPy.&lt;br /&gt;
&lt;br /&gt;
== Using Analytica locals from Python code ==&lt;br /&gt;
&lt;br /&gt;
Analytica locals are visible by default to [[PyEval]] and [[PyExec]] when called within the same definition that introduces them (e.g., a definition using [[Local_Values|Local]] or a [[User-Defined_Functions|Function]] with parameters). To change visibility, pass explicit Python &amp;lt;code&amp;gt;globals&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;locals&amp;lt;/code&amp;gt; mappings; providing an empty &amp;lt;code&amp;gt;locals&amp;lt;/code&amp;gt; isolates the Python code from Analytica locals.&lt;br /&gt;
&lt;br /&gt;
'''Example:''' &amp;lt;code&amp;gt;Local a := 5; PyEval(&amp;quot;a + 1&amp;quot;)&amp;lt;/code&amp;gt; returns 6 because &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is visible to the Python expression in that evaluation.&lt;br /&gt;
&lt;br /&gt;
== Accessing Analytica objects from Python code ==&lt;br /&gt;
To interact with your Analytica model from Python, use the &amp;lt;code&amp;gt;analytica&amp;lt;/code&amp;gt; module. This module is bundled with your Analytica installation and provides the necessary functions to access, evaluate, and manipulate objects within your model directly from Python.&lt;br /&gt;
&lt;br /&gt;
To begin, you must [[#Importing Python libraries|import the module]] in your Python code:&lt;br /&gt;
&amp;lt;code&amp;gt;import analytica&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Getting a handle to an Analytica object ===&lt;br /&gt;
You can obtain a handle to any object in your model using&amp;lt;code&amp;gt;analytica.get('object_identifier')&amp;lt;/code&amp;gt; in Python. This is useful when you want to refer to an object itself rather than its computed value. The function takes the identifier of the Analytica object as its argument and returns an &amp;lt;code&amp;gt;analytica.Object&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
''Example:''&lt;br /&gt;
To get a handle to a variable named &amp;lt;code&amp;gt;Revenue&amp;lt;/code&amp;gt;, you would use:&lt;br /&gt;
&amp;lt;code&amp;gt;revenue_handle = analytica.get('Revenue')&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This assigns an &amp;lt;code&amp;gt;analytica.Object&amp;lt;/code&amp;gt; representing the &amp;lt;code&amp;gt;Revenue&amp;lt;/code&amp;gt; Analytica variable to the &amp;lt;code&amp;gt;revenue_handle&amp;lt;/code&amp;gt; Python variable.&lt;br /&gt;
&lt;br /&gt;
=== Evaluating an Analytica expression ===&lt;br /&gt;
To evaluate an Analytica expression, use &amp;lt;code&amp;gt;analytica.eval('Analytica_expression')&amp;lt;/code&amp;gt;. This function evaluates the [[Evaluation Modes|mid-value]] of its string argument as an Analytica expression within the context of your model. To evaluate the [[Evaluation Modes|sample value]], use: &amp;lt;code&amp;gt;analytica.eval('Analytica expression', True)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;analytica.eval()&amp;lt;/code&amp;gt; is the primary method for retrieving the calculated value of a variable. When it returns a value, it will [[#Converting from Analytica to Python data structures|implicitly convert]] many Analytica data types into their Python equivalents.&lt;br /&gt;
&lt;br /&gt;
''Example:''&lt;br /&gt;
To get the computed value of the &amp;lt;code&amp;gt;Revenue&amp;lt;/code&amp;gt; variable, you would evaluate its identifier:&lt;br /&gt;
&amp;lt;code&amp;gt;revenue_result = analytica.eval('Revenue')&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This executes the expression for &amp;lt;code&amp;gt;Revenue&amp;lt;/code&amp;gt; and stores its final value in the &amp;lt;code&amp;gt;revenue_result&amp;lt;/code&amp;gt; Python variable.&lt;br /&gt;
&lt;br /&gt;
== No Python code in an input ==&lt;br /&gt;
Python code will not evaluate in a variable that has a [[User input node]]. This is to avoid a code injection attack in which a user of your model tries to run arbitrary code.&lt;br /&gt;
&lt;br /&gt;
== Using Python in ACP or ADE ==&lt;br /&gt;
For security reasons, Python is not enabled on our public [https://acp.analytica.com ACP server]].&lt;br /&gt;
&lt;br /&gt;
On a dedicated ACP server, python can be installed as used the same is with desktop Analytica.&lt;br /&gt;
&lt;br /&gt;
Python integration can be used from an ADE deployment as well. You may want to set the default &amp;lt;code&amp;gt;Python Environment&amp;lt;/code&amp;gt; by using regedit to add the string value &amp;lt;code&amp;gt;PythonEnvironment&amp;lt;/code&amp;gt; to the hive&lt;br /&gt;
:&amp;lt;code&amp;gt;HKEY_LOCAL_MACHINE\SOFTWARE\Lumina Decision Systems\ADEW\{{#ifexpr: {{#svarget:anarelease|7.0}} &amp;gt; 7.0&lt;br /&gt;
 | {{#svarget:anarelease|7.0}}&lt;br /&gt;
 | 7.0&lt;br /&gt;
}}&amp;lt;/code&amp;gt;&lt;br /&gt;
Alternatively, your model can specify the &amp;lt;code&amp;gt;Python model environment&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In some ADE installations, you may want to disable Python integration for security reasons (i.e., if you don't have full control of the Analytica models that are run). To do so, add these lines to ADE's &amp;lt;code&amp;gt;Analytica.ini&amp;lt;/code&amp;gt; file.&lt;br /&gt;
 Att_whenDisallowed PyArray : 4&lt;br /&gt;
 Att_whenDisallowed PyCall : 4&lt;br /&gt;
 Att_whenDisallowed PyDict : 4&lt;br /&gt;
 Att_whenDisallowed PyEval : 4&lt;br /&gt;
 Att_whenDisallowed PyExec : 4&lt;br /&gt;
 Att_whenDisallowed PyExplode : 4&lt;br /&gt;
 Att_whenDisallowed _PyGet : 4&lt;br /&gt;
 Att_whenDisallowed PyList : 4&lt;br /&gt;
 Att_whenDisallowed PySet : 4&lt;br /&gt;
 Att_whenDisallowed PyTuple : 4&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Using Python from Analytica/Setting up a Python environment|Setting up a Python environment]]&lt;br /&gt;
* [[Using Python from Analytica/Examples using Python|Examples using Python]]&lt;br /&gt;
* [https://videos.analytica.com/Analytica-Python/AnaPythonBasics.mp4 Video on Analytica-Python integration basics]&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=Using_Python_from_Analytica&amp;diff=63734</id>
		<title>Using Python from Analytica</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=Using_Python_from_Analytica&amp;diff=63734"/>
		<updated>2026-02-11T23:58:09Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;                                               [[category:Python integration]]&lt;br /&gt;
''New in [[Analytica 7.0]]''&lt;br /&gt;
&lt;br /&gt;
Requires the [[Analytica Developer]] (formerly [[Analytica Enterprise]] edition.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Analytica provides a two-way bridge between Analytica and Python.  You can write Python code in the definitions of Analytica Variables and Functions.  Analytica can access Python variables and call Python functions, pass data—including multi-dimensional arrays—to it, and retrieve the results. Conversely, Python code can call back into Analytica to evaluate variables or expressions. Together the two environments combine Analytica’s intuitive influence-diagram interface, intelligent arrays, and built-in uncertainty analysis with Python’s vast open-source ecosystem.&lt;br /&gt;
&lt;br /&gt;
We recommend using Python versions '''3.8+''', although ''Theoretically'' the integration supports versions '''3.3+'',&lt;br /&gt;
&lt;br /&gt;
[https://videos.analytica.com/Analytica-Python/AnaPythonBasics.mp4 Watch video on Analytica-Python integration basics]&lt;br /&gt;
&lt;br /&gt;
=== Motivation: Why use Python? ===&lt;br /&gt;
Python offers thousands of purpose-built libraries that extend what you can do in a model. Here are just a few:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Library !! What it adds when used from Analytica&lt;br /&gt;
|-&lt;br /&gt;
|[https://numpy.org/ NumPy], [https://pandas.pydata.org/ Pandas]|| Efficient numerical arrays and data-frame operations that underlie many other Python analytics libraries&lt;br /&gt;
|-&lt;br /&gt;
|[https://pillow.readthedocs.io/en/stable/ Pillow]|| Programmatic image manipulation for tasks such as satellite-image preprocessing before feeding data back into Analytica.&lt;br /&gt;
|-&lt;br /&gt;
|[https://matplotlib.org/ Matplotlib],  [https://seaborn.pydata.org/ Seaborn]|| Visualizations not native to Analytica, including violin plots, heatmaps, network graphs, and 3-D surface plots.&lt;br /&gt;
|-&lt;br /&gt;
|[https://pytorch.org/ PyTorch],  [https://www.tensorflow.org/ Tensorflow]|| Training or running machine-learning models, then passing predictions into Analytica for further probabilistic analysis.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Advantages: When to use Python in Analytica ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Situation in Analytica !! Why using Python helps&lt;br /&gt;
|-&lt;br /&gt;
| Want custom visualizations beyond Analytica graphs || Generate plots with [https://matplotlib.org/ Matplotlib] or [https://seaborn.pydata.org/ Seaborn], save images, and display them in a Result window&lt;br /&gt;
|-&lt;br /&gt;
| Require advanced text or Natural-Language Processing || Apply Python packages like [https://spacy.io/ spaCy], [https://www.nltk.org/ NLTK], or built-in &amp;lt;code&amp;gt;re&amp;lt;/code&amp;gt; for parsing, classification, and transformation&lt;br /&gt;
|-&lt;br /&gt;
| Need a specialized statistical, ML, or optimization algorithm not built into Analytica || Leverage PyPI libraries such as [https://scikit-learn.org/ scikit-learn], [https://pandas.pydata.org/ pandas], or [https://coin-or.github.io/pulp/ pulp] without re-implementing the math&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Downsides: When native Analytica is sometimes the better choice ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Concern !! Why pure Analytica can be preferable&lt;br /&gt;
|-&lt;br /&gt;
|[[Array Abstraction|Array abstraction]]|| Operating on arrays with different dimensions is a one-liner in Analytica but often requires verbose reshape/broadcast code in NumPy or Pandas.&lt;br /&gt;
|-&lt;br /&gt;
| Performance overhead || Transferring data and compiling Python incurs latency; tight loops or lightweight formulas run much faster as native Analytica expressions. For repeated Python calls, define a [[Callable]] to compile once and reuse.&lt;br /&gt;
|-&lt;br /&gt;
|[[Monte Carlo and probabilistic simulation|Monte Carlo]]|| Analytica’s built-in stochastic simulation is deeply integrated; recreating these in Python is rarely worth the effort.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Setting up a Python environment ==&lt;br /&gt;
&lt;br /&gt;
=== Installing Conda ===&lt;br /&gt;
Download and run the Anaconda or Miniconda [https://www.anaconda.com/download/success installer] for Windows.&lt;br /&gt;
&lt;br /&gt;
=== Creating and activating a Python environment ===&lt;br /&gt;
Open the newly installed '''Anaconda Prompt''' app and run this command, which will create a new Python 3.11 environment named &amp;lt;code&amp;gt;MyEnv&amp;lt;/code&amp;gt; and install the Python libraries [https://pandas.pydata.org/ Pandas] and [https://numpy.org/ NumPy]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;conda create -n MyEnv python=3.11 pandas numpy&amp;lt;/code&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
=== Telling Analytica which Python environment to use ===&lt;br /&gt;
Open the '''Definition / Application integration / Python''' submenu.&lt;br /&gt;
&lt;br /&gt;
Set either '''Python Environment''' or '''Python Model Environment''' to the environment’s name (e.g. &amp;lt;code&amp;gt;MyEnv&amp;lt;/code&amp;gt;) or to the full folder path of the Python installation home directory, for example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;C:\Users\username\anaconda3\envs\MyEnv&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Python Environment''' is stored with the Analytica installation and becomes the default for any model that does not set '''Python Model Environment'''.&lt;br /&gt;
&lt;br /&gt;
'''Python Model Environment''' is saved inside the current model and overrides the installation-wide setting.&lt;br /&gt;
&lt;br /&gt;
''See [[Using Python from Analytica/Setting up a Python environment|Setting up a Python environment]] for a detailed walkthrough.''&lt;br /&gt;
&lt;br /&gt;
=== Loading and Unloading of Python ===&lt;br /&gt;
&lt;br /&gt;
Python (core, environment, and libraries) loads only when your model first executes or evaluates Python code, and unloads when you close the model. Reopening the same model, or opening another that uses Python, starts a fresh Python session; any prior Python state (variables, imports) is lost. If the new model uses a different environment, it may run a different Python release.&lt;br /&gt;
&lt;br /&gt;
If Python is already loaded and you change the '''Python Environment''' or '''Python Model Environment''', Python unloads immediately. The selected environment’s Python loads the next time your model runs Python code. Unloading discards all Python state (variables, imports).&lt;br /&gt;
&lt;br /&gt;
Python runs in the same process as Analytica.&lt;br /&gt;
&lt;br /&gt;
== The Python menu ==&lt;br /&gt;
&lt;br /&gt;
The core Analytica functions and system variables for configuring and interacting with Python are found on the '''Definition / Application integration / Python''' submenu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[image:Python menu.png]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Importing Python libraries ==&lt;br /&gt;
&lt;br /&gt;
The ''preferred'' way to make Python libraries available in Analytica models is to place their import statements in the system variable '''PythonStartupCode'''. These lines execute when Python gets loaded, so the libraries are ready for use in later Python code.&lt;br /&gt;
&lt;br /&gt;
''If you edit '''PythonStartupCode''' after Python has already been loaded in the current Analytica model, you must reload the model (or close and reopen Analytica) for the modified startup code to take effect.''&lt;br /&gt;
&lt;br /&gt;
=== Importing from nodes ===&lt;br /&gt;
When creating a filed Analytica library or module, it is ''highly recommended'' to perform imports within a [[Variable]] or [[Callable]] node inside the library/module itself. This practice ensures that the library/module remains self-contained, as '''PythonStartupCode''' is not saved as part of a filed module or library. You should then create dependencies from nodes that use the Python libraries to the import node(s) to ensure the Python libraries are loaded before use.&lt;br /&gt;
&lt;br /&gt;
Python supports two main import styles:&lt;br /&gt;
&lt;br /&gt;
* Module import – e.g., &amp;lt;code&amp;gt;import numpy&amp;lt;/code&amp;gt;  &lt;br /&gt;
* Selective / wildcard import – e.g., &amp;lt;code&amp;gt;from numpy import array, zeros&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;from numpy import *&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When an import statement is the final expression, Analytica returns its value:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Import statement&lt;br /&gt;
! Return value when it is the last statement&lt;br /&gt;
! Output image&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;import numpy as np, os&amp;lt;/code&amp;gt;&lt;br /&gt;
| The module’s string representation e.g.,&amp;lt;br/&amp;gt;&amp;lt;code&amp;gt;«Python &amp;lt;module 'numpy' from …&amp;gt;»&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;code&amp;gt;«Python &amp;lt;module 'os' from …&amp;gt;»&amp;lt;/code&amp;gt;)&lt;br /&gt;
| [[Image:PythonMultipleModuleImports.png|thumb|250px]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;from numpy import array, zeros&amp;lt;/code&amp;gt;&lt;br /&gt;
| A list of the imported names (alias names if provided, otherwise the original names)&lt;br /&gt;
| [[Image:PythonMultipleSelectiveImports.png|thumb|250px]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Python &amp;lt;code&amp;gt;py::&amp;lt;/code&amp;gt; namespace   ==&lt;br /&gt;
Analytica exposes the embedded Python interpreter through the &amp;lt;code&amp;gt;py::&amp;lt;/code&amp;gt; namespace prefix.  Any name visible at the top level of the interpreter—global variables, functions, classes, or imported modules—can be accessed through Analytica with the same spelling and case, preceded by &amp;lt;code&amp;gt;py::&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example: Incrementing a Python global variable '''counter''' by 2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;py::counter := py::counter + 2;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Calling a Python function ==&lt;br /&gt;
Invoking a Python function from Analytica is as simple as writing it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;py::len(MyArray)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Arguments may be:&lt;br /&gt;
* Analytica scalars&lt;br /&gt;
* Analytica arrays (which get [[Array Abstraction|array abstracted]])&lt;br /&gt;
* Python objects&lt;br /&gt;
&lt;br /&gt;
=== Keyword arguments (kwargs) ===&lt;br /&gt;
When a Python function accepts keyword arguments (&amp;lt;code&amp;gt;**kwargs&amp;lt;/code&amp;gt;), use a syntax ''similar'' to Analytica’s [[Function calls and parameters#Name-based function calls|name-based function calls]], a colon after the parameter name, followed by the parameter value, instead of the equal sign used in Python.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;py::my_func(&amp;quot;arg1&amp;quot;, kwarg1:1, kwarg2:&amp;quot;abc&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The equivalent call in native Python is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;my_func(&amp;quot;arg1&amp;quot;, kwarg1=1, kwarg2=&amp;quot;abc&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Python &amp;lt;code&amp;gt;print()&amp;lt;/code&amp;gt; function  ===&lt;br /&gt;
The standard Python &amp;lt;code&amp;gt;print()&amp;lt;/code&amp;gt; function sends its text output to Analytica's [[Typescript|Typescript console]] window, just as it appears in a native Python console.  &lt;br /&gt;
* When called from Analytica with &amp;lt;code&amp;gt;py::print()&amp;lt;/code&amp;gt;, the printed text will appear in the window.  &lt;br /&gt;
* When called inside a Python script executed by Analytica, any &amp;lt;code&amp;gt;print()&amp;lt;/code&amp;gt; statements also stream to the window.&lt;br /&gt;
&lt;br /&gt;
== Using Python classes ==&lt;br /&gt;
=== Using an existing Python class ===&lt;br /&gt;
To instantiate a Python class, call its constructor with the &amp;lt;code&amp;gt;py::&amp;lt;/code&amp;gt; prefix and pass any arguments exactly as you would in native Python.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;py::MyClass(42, 'widgets')&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Arrow operator (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;)  ===&lt;br /&gt;
The arrow operator (&amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt;) lets you access the attributes and methods of a Python object, analogous to the dot operator (&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;) in Python:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;ColNames := MyDf-&amp;gt;columns      { attribute }&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;Head5    := MyDf-&amp;gt;head(5)      { method }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can chain these accesses and calls:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;FirstName := MyDf-&amp;gt;columns-&amp;gt;tolist()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also assign through the arrow operator; the assignment will update the underlying Python object:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MyObj-&amp;gt;value := 42&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Using Python code in a definition ==&lt;br /&gt;
When you choose '''Python expr''' from the [[Definition]] drop-down, the entire definition is passed verbatim to the embedded Python interpreter.&lt;br /&gt;
&lt;br /&gt;
=== Defining a UDF with a Python expr definition ===&lt;br /&gt;
When you set a Function node’s [[Definition]] to '''Python expr''', you can write the entire body in Python. Analytica recompiles that code every time the function is evaluated, which can noticeably slow large array computations. To eliminate this overhead, place the code in a reusable Python [[Callable]] so the compiled version remains cached between calls.&lt;br /&gt;
&lt;br /&gt;
''Inside '''Python expr''', Analytica function parameters behave like local Python variables.''&lt;br /&gt;
&lt;br /&gt;
== Callables ==&lt;br /&gt;
&lt;br /&gt;
[[Callable|Callables]] let you embed full Python functions or classes directly inside Analytica, then invoke them like any other [[User-Defined Functions|UDF]].&lt;br /&gt;
&lt;br /&gt;
=== Creating a Python Callable node ===&lt;br /&gt;
* Create a new [[Variable]] node.&lt;br /&gt;
* In the node’s [[Object Window|Object window]], change the [[Class details|Class]] dropdown from '''Variable''' to '''Callable'''.&lt;br /&gt;
* Enter your Python code in the Definition pane.&lt;br /&gt;
&lt;br /&gt;
=== Writing Python Callable code ===&lt;br /&gt;
Use standard Python syntax to define a &amp;lt;code&amp;gt;def&amp;lt;/code&amp;gt; function or a &amp;lt;code&amp;gt;class&amp;lt;/code&amp;gt; inside the [[Definition]] pane of your '''Callable'''. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def compound_interest(p, r, n):&lt;br /&gt;
    return p * (1 + r) ** n&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Caching compiled functions in Callables ===&lt;br /&gt;
When you evaluate a node, Analytica compiles your function and caches the resulting callable object as the node’s value. This differs from [[UDF|UDFs]] which cannot store a value, so they compile every time they run.&lt;br /&gt;
&lt;br /&gt;
=== Parameters attribute ===&lt;br /&gt;
'''Callables''' do '''not''' have a Parameters attribute; all arguments are declared in your &amp;lt;code&amp;gt;def&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;class&amp;lt;/code&amp;gt; signature.&lt;br /&gt;
&lt;br /&gt;
=== Importing custom Python modules ===&lt;br /&gt;
Import modules exactly as you would in native Python. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import myutils&lt;br /&gt;
from mylib.finance import NPV&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensure the module is on Python’s &amp;lt;code&amp;gt;sys.path&amp;lt;/code&amp;gt; by appending the module's directory to the path. For additional guidance, see the official [https://docs.python.org/3/tutorial/modules.html Python documentation on modules].&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
Analytica's automatic dependency graph is a key advantage over working in environments like Jupyter notebooks or regular Python scripts, where you are responsible for manually re-running cells or scripts to reflect changes.&lt;br /&gt;
&lt;br /&gt;
When integrating Python code, however, Analytica's dependency system cannot parse the Python script to automatically detect when an Analytica node is being used. You must explicitly declare these dependencies by drawing influence arrows. Drawing an influence arrow from any node to a node that uses '''Python Expr''' creates a true dependency, adding it to Analytica's dependency graph.&lt;br /&gt;
&lt;br /&gt;
''As an alternative for nodes that access Python global variables without using '''Python Expr''', you can establish a dependency by including the Identifier of the influencing node directly within the Definition of the dependent node.''&lt;br /&gt;
&lt;br /&gt;
If dependencies for Python nodes are not manually defined with arrows, your model will not invalidate results correctly. Updates to an input variable will not trigger re-computation in the Python node that depends on it, leaving it with a stale, incorrect value.&lt;br /&gt;
&lt;br /&gt;
== Functions for evaluating Python code ==&lt;br /&gt;
&lt;br /&gt;
=== PyEval ===&lt;br /&gt;
[[PyEval]] is used to evaluate a single Python expression and return its value to Analytica. It is designed to be side-effect-free, meaning it won't change the state of variables or objects in Python. This makes it ideal for safe, simple calculations.&lt;br /&gt;
&lt;br /&gt;
''Since &amp;lt;code&amp;gt;PyEval&amp;lt;/code&amp;gt; only evaluates a single expression, it cannot execute multi-line code or statements like variable assignments or imports.''&lt;br /&gt;
&lt;br /&gt;
It also includes an optional &amp;lt;code&amp;gt;excludeTypes&amp;lt;/code&amp;gt; parameter, which allows you to specify Python types that should not be converted to Analytica Values.&lt;br /&gt;
&lt;br /&gt;
=== PyExec ===&lt;br /&gt;
[[PyExec]] is used to execute a block of Python code, which can contain multiple lines or statements. Unlike &amp;lt;code&amp;gt;PyEval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PyExec&amp;lt;/code&amp;gt; is intended to have side effects. You can use it to import libraries, define functions, or set the values of variables in the Python environment.&lt;br /&gt;
&lt;br /&gt;
Use &amp;lt;code&amp;gt;PyExec&amp;lt;/code&amp;gt; when you need to run a script to set up an environment or perform operations that modify the Python state for use in later evaluations.&lt;br /&gt;
&lt;br /&gt;
=== PyCall ===&lt;br /&gt;
[[PyCall]] offers a direct and efficient way to call a specific Python function. You provide the callable Python function object followed by its positional and keyword arguments.&lt;br /&gt;
&lt;br /&gt;
This is the preferred function when your primary goal is to execute an existing Python function and retrieve its result.&lt;br /&gt;
&lt;br /&gt;
== Non-scalar data structures ==&lt;br /&gt;
Any Python object that is not converted automatically to an Analytica type comes back as an ''opaque wrapper'' displayed as &amp;lt;code&amp;gt;«Python …»&amp;lt;/code&amp;gt;, where the ellipsis is the object’s [https://docs.python.org/3/library/functions.html#repr repr]. Keep this wrapper when the object merely passes between Python calls, and invoke [[PyExplode]] when the data must be examined or manipulated within Analytica.&lt;br /&gt;
&lt;br /&gt;
=== Converting from Python data to Analytica ===&lt;br /&gt;
When a Python function invoked from Analytica returns a result, Analytica automatically attempts to convert the Python data into the most appropriate Analytica value. For complex data structures, the dedicated [[PyExplode]] function is available to perform more specific conversions.&lt;br /&gt;
&lt;br /&gt;
==== Automatic conversions ====&lt;br /&gt;
The following Python types are automatically converted to their corresponding Analytica equivalents without any extra steps:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Python type !! Analytica type !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Integer&amp;lt;/code&amp;gt; ||''If the &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; exceeds the 64-bit signed-integer range, Analytica converts it to a double floating-point '''Number''' instead of an '''Integer'''.''&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;float&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Number&amp;lt;/code&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;bool&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Boolean&amp;lt;/code&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;complex&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;ComplexNumber&amp;lt;/code&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;str&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Text&amp;lt;/code&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;None&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Null&amp;lt;/code&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;date&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;DateTime&amp;lt;/code&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;time&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;DateTime&amp;lt;/code&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;datetime&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;DateTime&amp;lt;/code&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;analytica.Value&amp;lt;/code&amp;gt; || Unwrapped Analytica value || &lt;br /&gt;
|-&lt;br /&gt;
| Any other Python object || ''Python opaque wrapper'' ||''Can be passed to other Python function calls or converted with &amp;lt;code&amp;gt;PyExplode&amp;lt;/code&amp;gt;.''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PyExplode ====&lt;br /&gt;
The [[PyExplode]] function provides explicit control for converting complex Python objects that are not converted automatically.&lt;br /&gt;
&lt;br /&gt;
Key capabilities include:&lt;br /&gt;
* Unpacking Python built-in collections, like &amp;lt;code&amp;gt;list&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tuple&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt;, into a 1D Analytica array.&lt;br /&gt;
* Converting a Python &amp;lt;code&amp;gt;dict&amp;lt;/code&amp;gt; into a 1D Analytica array, using the dictionary keys to create a new local index.&lt;br /&gt;
* Using nested calls to convert multi-dimensional data into multi-dimensional Analytica arrays.&lt;br /&gt;
* Fully converting a [https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html NumPy Array] into an n-dimensional Analytica array.&lt;br /&gt;
* Converting image objects from [https://pillow.readthedocs.io/en/stable/reference/Image.html#PIL.Image.Image PIL.Image] or [https://matplotlib.org/stable/api/_as_gen/matplotlib.figure.Figure.html matplotlib.figure.Figure] directly into Analytica images.&lt;br /&gt;
* Optionally excluding specific Python types from conversion with &amp;lt;code&amp;gt;excludeTypes&amp;lt;/code&amp;gt;, which keeps them as opaque Python object handles.&lt;br /&gt;
&lt;br /&gt;
''To convert a [https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html Pandas DataFrame], you must use the &amp;lt;code&amp;gt;PyExplodeDataFrame&amp;lt;/code&amp;gt; function. This function is not built-in and requires you to include the [[Python Pandas library]] in your model.''&lt;br /&gt;
&lt;br /&gt;
=== Converting from Analytica to Python data structures ===&lt;br /&gt;
The bridge between Analytica and Python performs two kinds of mappings: ''automatic scalar conversions'' and ''explicit conversion functions'' for arrays.&lt;br /&gt;
&lt;br /&gt;
==== Automatic scalar conversions ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Analytica type !! Python type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Text&amp;lt;/code&amp;gt; ||&amp;lt;code&amp;gt;str&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Integer&amp;lt;/code&amp;gt; ||&amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Number&amp;lt;/code&amp;gt; ||&amp;lt;code&amp;gt;float&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Boolean&amp;lt;/code&amp;gt; ||&amp;lt;code&amp;gt;bool&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ComplexNumber&amp;lt;/code&amp;gt; ||&amp;lt;code&amp;gt;complex&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DateTime&amp;lt;/code&amp;gt; ||&amp;lt;code&amp;gt;datetime.datetime&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;datetime.time&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;datetime.date&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Handle&amp;lt;/code&amp;gt; ||&amp;lt;code&amp;gt;analytica.Object&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Null / Undefined&amp;lt;/code&amp;gt; ||&amp;lt;code&amp;gt;None&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ''Python opaque wrapper'' || unwrapped Python object&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Reference&amp;lt;/code&amp;gt; ||&amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt;of the dereferenced contents&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Image&amp;lt;/code&amp;gt; ||&amp;lt;code&amp;gt;PIL.Image.Image&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Everything else ||&amp;lt;code&amp;gt;analytica.Value&amp;lt;/code&amp;gt; (wrapper for Analytica Values)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Explicit conversion functions for arrays ====&lt;br /&gt;
Analytica has a single collection type—the array—whereas Python offers several (&amp;lt;code&amp;gt;list&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tuple&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;dict&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;numpy.ndarray&amp;lt;/code&amp;gt;, …). Because there is no one-to-one mapping, arrays are ''not'' converted implicitly; instead call one of the system functions below.&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;code&amp;gt;PyList&amp;lt;/code&amp;gt;'', ''&amp;lt;code&amp;gt;PyTuple&amp;lt;/code&amp;gt;'', ''&amp;lt;code&amp;gt;PySet&amp;lt;/code&amp;gt;'', ''&amp;lt;code&amp;gt;PyDict&amp;lt;/code&amp;gt; create a Python collection over the single dimension that you specify. In contrast, &amp;lt;code&amp;gt;PyArray&amp;lt;/code&amp;gt; converts an entire Analytica array into a single &amp;lt;code&amp;gt;numpy.ndarray&amp;lt;/code&amp;gt;.''&lt;br /&gt;
&lt;br /&gt;
*[[PyList]] – Creates a Python &amp;lt;code&amp;gt;list&amp;lt;/code&amp;gt; from the specified index, retaining other dimensions in Analytica.&lt;br /&gt;
* [[PyTuple]] – Creates a Python &amp;lt;code&amp;gt;tuple&amp;lt;/code&amp;gt; from the chosen index of the array, retaining other dimensions in Analytica.&lt;br /&gt;
* [[PySet]] – Creates a Python &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt; from the specified index, duplicate entries will be removed.&lt;br /&gt;
* [[PyDict]] – Creates a Python &amp;lt;code&amp;gt;dict&amp;lt;/code&amp;gt; from an Analytica vector. The elements of a specified index are used as keys and the corresponding vector values become the dictionary values. The input vector must be indexed by the key index.&lt;br /&gt;
* [[PyArray]] – Converts an entire Analytica array into a single multi-dimensional &amp;lt;code&amp;gt;numpy.ndarray&amp;lt;/code&amp;gt;. This function always converts all dimensions. The optional index parameters are used to specify the order of the axes in the resulting NumPy array. For any Analytica dimension not explicitly passed as a parameter, a local, positional index is created for that axis in the NumPy array. An optional &amp;lt;code&amp;gt;dtype&amp;lt;/code&amp;gt; string passes directly to NumPy.&lt;br /&gt;
&lt;br /&gt;
== Using Analytica locals from Python code ==&lt;br /&gt;
&lt;br /&gt;
Analytica locals are visible by default to [[PyEval]] and [[PyExec]] when called within the same definition that introduces them (e.g., a definition using [[Local_Values|Local]] or a [[User-Defined_Functions|Function]] with parameters). To change visibility, pass explicit Python &amp;lt;code&amp;gt;globals&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;locals&amp;lt;/code&amp;gt; mappings; providing an empty &amp;lt;code&amp;gt;locals&amp;lt;/code&amp;gt; isolates the Python code from Analytica locals.&lt;br /&gt;
&lt;br /&gt;
'''Example:''' &amp;lt;code&amp;gt;Local a := 5; PyEval(&amp;quot;a + 1&amp;quot;)&amp;lt;/code&amp;gt; returns 6 because &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; is visible to the Python expression in that evaluation.&lt;br /&gt;
&lt;br /&gt;
== Accessing Analytica objects from Python code ==&lt;br /&gt;
To interact with your Analytica model from Python, use the &amp;lt;code&amp;gt;analytica&amp;lt;/code&amp;gt; module. This module is bundled with your Analytica installation and provides the necessary functions to access, evaluate, and manipulate objects within your model directly from Python.&lt;br /&gt;
&lt;br /&gt;
To begin, you must [[#Importing Python libraries|import the module]] in your Python code:&lt;br /&gt;
&amp;lt;code&amp;gt;import analytica&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Getting a handle to an Analytica object ===&lt;br /&gt;
You can obtain a handle to any object in your model using&amp;lt;code&amp;gt;analytica.get('object_identifier')&amp;lt;/code&amp;gt; in Python. This is useful when you want to refer to an object itself rather than its computed value. The function takes the identifier of the Analytica object as its argument and returns an &amp;lt;code&amp;gt;analytica.Object&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
''Example:''&lt;br /&gt;
To get a handle to a variable named &amp;lt;code&amp;gt;Revenue&amp;lt;/code&amp;gt;, you would use:&lt;br /&gt;
&amp;lt;code&amp;gt;revenue_handle = analytica.get('Revenue')&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This assigns an &amp;lt;code&amp;gt;analytica.Object&amp;lt;/code&amp;gt; representing the &amp;lt;code&amp;gt;Revenue&amp;lt;/code&amp;gt; Analytica variable to the &amp;lt;code&amp;gt;revenue_handle&amp;lt;/code&amp;gt; Python variable.&lt;br /&gt;
&lt;br /&gt;
=== Evaluating an Analytica expression ===&lt;br /&gt;
To evaluate an Analytica expression, use &amp;lt;code&amp;gt;analytica.eval('Analytica_expression')&amp;lt;/code&amp;gt;. This function evaluates the [[Evaluation Modes|mid-value]] of its string argument as an Analytica expression within the context of your model. To evaluate the [[Evaluation Modes|sample value]], use: &amp;lt;code&amp;gt;analytica.eval('Analytica expression', True)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;analytica.eval()&amp;lt;/code&amp;gt; is the primary method for retrieving the calculated value of a variable. When it returns a value, it will [[#Converting from Analytica to Python data structures|implicitly convert]] many Analytica data types into their Python equivalents.&lt;br /&gt;
&lt;br /&gt;
''Example:''&lt;br /&gt;
To get the computed value of the &amp;lt;code&amp;gt;Revenue&amp;lt;/code&amp;gt; variable, you would evaluate its identifier:&lt;br /&gt;
&amp;lt;code&amp;gt;revenue_result = analytica.eval('Revenue')&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This executes the expression for &amp;lt;code&amp;gt;Revenue&amp;lt;/code&amp;gt; and stores its final value in the &amp;lt;code&amp;gt;revenue_result&amp;lt;/code&amp;gt; Python variable.&lt;br /&gt;
&lt;br /&gt;
== No Python code in an input ==&lt;br /&gt;
Python code will not evaluate in a variable that has a [[User input node]]. This is to avoid a code injection attack in which a user of your model tries to run arbitrary code.&lt;br /&gt;
&lt;br /&gt;
== Using Python in ACP or ADE ==&lt;br /&gt;
For security reasons, Python is not enabled on our public [https://acp.analytica.com ACP server]].&lt;br /&gt;
&lt;br /&gt;
On a dedicated ACP server, python can be installed as used the same is with desktop Analytica.&lt;br /&gt;
&lt;br /&gt;
Python integration can be used from an ADE deployment as well. You may want to set the default &amp;lt;code&amp;gt;Python Environment&amp;lt;/code&amp;gt; by using regedit to add the string value &amp;lt;code&amp;gt;PythonEnvironment&amp;lt;/code&amp;gt; to the hive&lt;br /&gt;
:&amp;lt;code&amp;gt;HKEY_LOCAL_MACHINE\SOFTWARE\Lumina Decision Systems\ADEW\{{#ifexpr: {{#svarget:anarelease|7.0}} &amp;gt; 7.0&lt;br /&gt;
 | {{#svarget:anarelease|7.0}}&lt;br /&gt;
 | 7.0&lt;br /&gt;
}}&amp;lt;/code&amp;gt;&lt;br /&gt;
Alternatively, your model can specify the &amp;lt;code&amp;gt;Python model environment&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In some ADE installations, you may want to disable Python integration for security reasons (i.e., if you don't have full control of the Analytica models that are run). To do so, add these lines to ADE's &amp;lt;code&amp;gt;Analytica.ini&amp;lt;/code&amp;gt; file.&lt;br /&gt;
 Att_whenDisallowed PyArray : 4&lt;br /&gt;
 Att_whenDisallowed PyCall : 4&lt;br /&gt;
 Att_whenDisallowed PyDict : 4&lt;br /&gt;
 Att_whenDisallowed PyEval : 4&lt;br /&gt;
 Att_whenDisallowed PyExec : 4&lt;br /&gt;
 Att_whenDisallowed PyExplode : 4&lt;br /&gt;
 Att_whenDisallowed _PyGet : 4&lt;br /&gt;
 Att_whenDisallowed PyList : 4&lt;br /&gt;
 Att_whenDisallowed PySet : 4&lt;br /&gt;
 Att_whenDisallowed PyTuple : 4&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Using Python from Analytica/Setting up a Python environment|Setting up a Python environment]]&lt;br /&gt;
* [[Using Python from Analytica/Examples using Python|Examples using Python]]&lt;br /&gt;
* [https://videos.analytica.com/Analytica-Python/AnaPythonBasics.mp4 Video on Analytica-Python integration basics]&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.0%3F&amp;diff=63733</id>
		<title>What's new in Analytica 7.0?</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.0%3F&amp;diff=63733"/>
		<updated>2026-02-11T22:28:18Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: /* Index label auto updates */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:What's new pages]]&lt;br /&gt;
[[category:Analytica releases]]&lt;br /&gt;
&lt;br /&gt;
[[Analytica 7.0]] will be the next major Analytica release and is currently in [[Beta Tester Page|beta testing]]. Go to [[Beta Tester Page]] to try it. The current official release is [[Analytica 6.6]]. &lt;br /&gt;
&lt;br /&gt;
==Highlights of Analytica 7.0==&lt;br /&gt;
&lt;br /&gt;
* '''[[#Python integration|Python integration]]:''' The major enhancement is integration with Python and hence the entire Python ecosystem of libraries. You can easily call functions from Python libraries, access Python variables, and even write Python code right inside Analytica variables and functions. So now you can mix and match Analytica and Python according to which language you think best for your modeling or coding needs.&lt;br /&gt;
*  '''[[#Index label auto updates|Index label auto updates]]:''' A common source of errors has been when you change a text label in an Index without remembering to change expressions that refer to that same text label. Changes to labels now update automatically in expressions in most cases.&lt;br /&gt;
*  The '''Analytica Enterprise'''' edition has been renamed the [[#Developer Edition (formerly known as Enterprise) |Developer edition]], which better reflects what it is.&lt;br /&gt;
* It introduces two new object Classes:  &lt;br /&gt;
** [[Struct]] lets you bundle disparate values, like text, numbeers, atoms and arrays, together in one object that does not array abstract -- similar to Records and Classes in other languages).  &lt;br /&gt;
** [[Callable]] is like a user-defined Function but it's Definition can be a [[handle]] to a Python class or a Python function. &lt;br /&gt;
* [[ParseJSON]] and [[MakeJSON]] now use Structs, which are much more convenient for representing the hierarchical structure of JSON.&lt;br /&gt;
* [[#SpreadsheetOpen|Read and write spreadsheets without Excel]]:  This is faster and more robust, and you don't need Excel installed.&lt;br /&gt;
&lt;br /&gt;
== [[Using Python from Analytica|Python integration]] ==&lt;br /&gt;
&lt;br /&gt;
You can now write Python code inside Analytica definitions! It's easy to call Python functions, with Analytica-style Intelligent Arrays!. So you can access the vast ecosystem of Python libraries (''modules'' in Python lingo). Among the gazillion possibilities are specialized libraries for data visualization, statistics, machine learning, and much more.&lt;br /&gt;
It means that you can mix and match Analytica and Python -- write Analytica code for what's easiest in Analytica and Python code for what's easiest in Python.  &lt;br /&gt;
&lt;br /&gt;
See: [[Using Python from Analytica]]&lt;br /&gt;
(In [[Analytica Developer]] edition or better). &lt;br /&gt;
&lt;br /&gt;
For the Analytica modeler, this puts a ton of resources at your fingertips. &lt;br /&gt;
&lt;br /&gt;
It's also pretty cool for the Python developer. Analytica is like a new interactive development environment with a lot of unique advantages, especially during interactive code development:&lt;br /&gt;
* Analytica's dependency maintenance can be really convenient during interactive development, creating automatic dependency maintenance between your Python functions, classes and variables that don't exist in Python.&lt;br /&gt;
* The visual influence diagram layout can be a super useful to way organize and visualize your code.&lt;br /&gt;
* It naturally encourages declarative code practices, which leads to better and more maintainable coding style.&lt;br /&gt;
* You get the benefits of Analytica's edit tables, plus for results, Analytica's multi-D result tables and one-click, no-code, graphing.&lt;br /&gt;
* It is easy to wrap existing Python models to get Monte Carlo, parametric analysis and sensitivity analysis with Analytica ease.&lt;br /&gt;
* Sometimes one or the other language is more convenient for a particular task. You can freely switch between whichever language feels better suited to the immediate task, and intermix languages easily.&lt;br /&gt;
&lt;br /&gt;
== Developer Edition (formerly known as Enterprise) ==&lt;br /&gt;
&lt;br /&gt;
Analytica's middle-tier edition formerly known as the ''Enterprise Edition'', it is now called the [[Analytica Developer|Analytica Developer edition]]. That name better reflects what it is--software for developers of decision applications.  If you're now a user of Analytica Enterprise you don't have to update your license or do anything special. The name will just change when you install Analytica 7.0.  In Analytica docs, when you select &amp;quot;7.0&amp;quot; on the release bar (at the top of pages that have release-contingent content), all the docs automatically use the new Analytica Developer edition name. &lt;br /&gt;
&lt;br /&gt;
== Analytica language extensions ==&lt;br /&gt;
&lt;br /&gt;
=== Index label auto updates ===&lt;br /&gt;
&lt;br /&gt;
When you change the identifier of a variable, Analytica automatically updates all Definitions to use the new name. But, when you change a text label in an Index, it previously cause cause errors in Definitions using that label. For example, if you have&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  Index Animal := ['Cat', 'Dog']&lt;br /&gt;
  Variable Sound := IF Animal = 'Cat' THEN 'Miaow' ELSE 'Woof'&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
If you change &amp;lt;code&amp;gt; 'Cat'&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;'Feline' &amp;lt;/code&amp;gt; in Index &amp;lt;code&amp;gt;Animal&amp;lt;/code&amp;gt;, the Definition of &amp;lt;code&amp;gt;Sound&amp;lt;/code&amp;gt; will now automatically update to&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     IF Animal = 'Feline' THEN 'Miaow' ELSE 'Woof'&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
It does this wherever it sees &amp;lt;code&amp;gt;Animal=&amp;lt;label&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
If you use the label in another context where the index would notnormally appear, you should the new [[Index-label dot syntax]] (&amp;lt;code&amp;gt;Animal . 'Cat'&amp;lt;/code&amp;gt;) associates a text literal with its index to prevent it from getting out of sync, and to warn if it ever does. These [[Keeping text literals consistent with index labels| features]] help avoid common errors when updating text labels in Indexes.&lt;br /&gt;
&lt;br /&gt;
=== Callable ===&lt;br /&gt;
&lt;br /&gt;
The new object [[Class]] [[Callable]] is a variable-like object, meaning it has a [[Definition]] and a computed value, but can be used for convenience and documentation when the computed value itself is something that can be called, such as a [[Local function]] (aka ''lambda function''), a [[handle]] to an global function, a Python class or a Python function.&lt;br /&gt;
&lt;br /&gt;
If you &amp;quot;compute&amp;quot; the identity of a callable data item inside a normal [[Variable]] instance, &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;, you could call it using the syntax &amp;lt;code&amp;gt;X-&amp;gt;(a,b,c)&amp;lt;/code&amp;gt;. On your influence diagram the object would have a rounded rectangle and thus would not communicate that the result is something that can be called. When you change its class to be a [[Callable]], you can then invoke the call using the syntax &amp;lt;code&amp;gt;X(a,b,c)&amp;lt;/code&amp;gt; and the shape of the node changes to something that resembles a function shape, thus communicating that this holds something that is callable.&lt;br /&gt;
&lt;br /&gt;
To create a callable, first create a [[Variable]] node, then use the [[Class]] dropdown from the [[Object window]] or [[Attribute pane]] to change the class to ''Callable''.&lt;br /&gt;
&lt;br /&gt;
=== Struct ===&lt;br /&gt;
A [[Struct]] defines a new atomic, immutable data type. For use when you need to bundle multiple heterogeneous items and don't want their dimensionalities to interact. Array abstract treats an instance of a Struct as a single cell (an atom).&lt;br /&gt;
&lt;br /&gt;
=== Expression and Lazy qualifiers ===&lt;br /&gt;
An expression passed to a function parameter declared with the qualifier as &amp;lt;code&amp;gt;[[Function_parameter_qualifiers#Expression|Expression]]&amp;lt;/code&amp;gt; can now include local variable identifiers. The local variables are captured (similar to how they would be captured by a [[Local function]]).&lt;br /&gt;
&lt;br /&gt;
A new function parameter qualifier, [[Function_parameter_qualifiers#Lazy]], has been added, which does lazy evaluation of the expression passed to it. In the function Definition, you can use it as if it were a normal value parameter, but evaluation occurs when the value is used rather than when the function is called, and in the evaluation context (which includes the [[Evaluation modes|evaluation mode]]) where the value is used instead as in the context of the call.&lt;br /&gt;
&lt;br /&gt;
=== Excess parameter qualifier ===&lt;br /&gt;
A new function declaration allows a function to tolerate or capture excess named parameters in the call that are not declared as parameter names in the function's Parameters declaration. It can also be used in a [[Struct]] declaration.&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
=== ParseJSON ===&lt;br /&gt;
Changed to parse to [[Struct]]s, thus greatly simplifying and improving the convenience of using JSON in Analytica expressions. &lt;br /&gt;
&lt;br /&gt;
For parsing with a schema, a Struct's declaration serves as the schema, which is far easier and more familiar for an Analytica user than the former scheme for specifying a schema.&lt;br /&gt;
&lt;br /&gt;
[[MakeJSON]] is able to generate JSON from a Struct (or nested structs) as well, which is the most convenient representation for JSON representations.&lt;br /&gt;
&lt;br /&gt;
=== SpreadsheetOpen ===&lt;br /&gt;
Added a new «backend» parameter to [[SpreadsheetOpen]] with a new option of &amp;lt;code&amp;gt;'LibXl'&amp;lt;/code&amp;gt;, allowing you to read and manipulate a spreadsheet without having Excel installed. But unlike the Excel backend, the &amp;lt;b&amp;gt;LibXl&amp;lt;/b&amp;gt; option does not have a calculation engine (so can't recompute cell formulas after you change cells). This option is be better when you simply want to read (or write) data in a *.xlsx file format.&lt;br /&gt;
&lt;br /&gt;
== Example models and libraries ==&lt;br /&gt;
&lt;br /&gt;
* There is a new &amp;quot;Auto insurance claim risk analysis.ana&amp;quot; in the Example Models / Risk Analysis folder.&lt;br /&gt;
* The [[Mutables library]] has been updated. It provides a new [[Mutable]] [[Struct]] which is superior to the older representation, which displays the actual value in result table cells and is atomic. The legacy functions ([[MutableNew]], [[MutableSet]] and [[MutableGet]]) are still there for backward compatibility, but have been changed to just wrap the new Mutable.&lt;br /&gt;
&lt;br /&gt;
== Result tables and graphs ==&lt;br /&gt;
* A blank (none) entry was added to the [[XY_comparison#Use_comparison_index|comparison index pulldown]]. Use this to quickly unset the comparison index without having to re-enter the [[XY_comparison]] dialog. Also, the pulldown is now visible and enabled in browse mode.&lt;br /&gt;
* Comparison variables are no longer summed over slicer indexes that are set to '''Totals''' when the value for that variable does not include the slicer index. Note that this results in some changes to what is displayed in table body cells and in axis scaling on graphs.&lt;br /&gt;
&lt;br /&gt;
== Assista ==&lt;br /&gt;
&lt;br /&gt;
You can now copy-paste from Expression blocks in Assista's response using the little copy icon in the top-right corner of the expression block.&lt;br /&gt;
&lt;br /&gt;
== Experimental ==&lt;br /&gt;
* A way for an Analytica model running in desktop Analytica to [[MCP server in Analytica|act as a Model Context Protocol (MCP) server]] for use by Large Language Models (LLMs).&lt;br /&gt;
&lt;br /&gt;
== ADE ==&lt;br /&gt;
* Added a new example: &amp;lt;code&amp;gt;Mcp_server&amp;lt;/code&amp;gt;.  This is an MCP server that wraps ADE. Among other things, it can give AI agents like Claude Code the ability to build, explore and use Analytica models.&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.0%3F&amp;diff=63732</id>
		<title>What's new in Analytica 7.0?</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.0%3F&amp;diff=63732"/>
		<updated>2026-02-11T22:27:54Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: /* Index label auto updates */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:What's new pages]]&lt;br /&gt;
[[category:Analytica releases]]&lt;br /&gt;
&lt;br /&gt;
[[Analytica 7.0]] will be the next major Analytica release and is currently in [[Beta Tester Page|beta testing]]. Go to [[Beta Tester Page]] to try it. The current official release is [[Analytica 6.6]]. &lt;br /&gt;
&lt;br /&gt;
==Highlights of Analytica 7.0==&lt;br /&gt;
&lt;br /&gt;
* '''[[#Python integration|Python integration]]:''' The major enhancement is integration with Python and hence the entire Python ecosystem of libraries. You can easily call functions from Python libraries, access Python variables, and even write Python code right inside Analytica variables and functions. So now you can mix and match Analytica and Python according to which language you think best for your modeling or coding needs.&lt;br /&gt;
*  '''[[#Index label auto updates|Index label auto updates]]:''' A common source of errors has been when you change a text label in an Index without remembering to change expressions that refer to that same text label. Changes to labels now update automatically in expressions in most cases.&lt;br /&gt;
*  The '''Analytica Enterprise'''' edition has been renamed the [[#Developer Edition (formerly known as Enterprise) |Developer edition]], which better reflects what it is.&lt;br /&gt;
* It introduces two new object Classes:  &lt;br /&gt;
** [[Struct]] lets you bundle disparate values, like text, numbeers, atoms and arrays, together in one object that does not array abstract -- similar to Records and Classes in other languages).  &lt;br /&gt;
** [[Callable]] is like a user-defined Function but it's Definition can be a [[handle]] to a Python class or a Python function. &lt;br /&gt;
* [[ParseJSON]] and [[MakeJSON]] now use Structs, which are much more convenient for representing the hierarchical structure of JSON.&lt;br /&gt;
* [[#SpreadsheetOpen|Read and write spreadsheets without Excel]]:  This is faster and more robust, and you don't need Excel installed.&lt;br /&gt;
&lt;br /&gt;
== [[Using Python from Analytica|Python integration]] ==&lt;br /&gt;
&lt;br /&gt;
You can now write Python code inside Analytica definitions! It's easy to call Python functions, with Analytica-style Intelligent Arrays!. So you can access the vast ecosystem of Python libraries (''modules'' in Python lingo). Among the gazillion possibilities are specialized libraries for data visualization, statistics, machine learning, and much more.&lt;br /&gt;
It means that you can mix and match Analytica and Python -- write Analytica code for what's easiest in Analytica and Python code for what's easiest in Python.  &lt;br /&gt;
&lt;br /&gt;
See: [[Using Python from Analytica]]&lt;br /&gt;
(In [[Analytica Developer]] edition or better). &lt;br /&gt;
&lt;br /&gt;
For the Analytica modeler, this puts a ton of resources at your fingertips. &lt;br /&gt;
&lt;br /&gt;
It's also pretty cool for the Python developer. Analytica is like a new interactive development environment with a lot of unique advantages, especially during interactive code development:&lt;br /&gt;
* Analytica's dependency maintenance can be really convenient during interactive development, creating automatic dependency maintenance between your Python functions, classes and variables that don't exist in Python.&lt;br /&gt;
* The visual influence diagram layout can be a super useful to way organize and visualize your code.&lt;br /&gt;
* It naturally encourages declarative code practices, which leads to better and more maintainable coding style.&lt;br /&gt;
* You get the benefits of Analytica's edit tables, plus for results, Analytica's multi-D result tables and one-click, no-code, graphing.&lt;br /&gt;
* It is easy to wrap existing Python models to get Monte Carlo, parametric analysis and sensitivity analysis with Analytica ease.&lt;br /&gt;
* Sometimes one or the other language is more convenient for a particular task. You can freely switch between whichever language feels better suited to the immediate task, and intermix languages easily.&lt;br /&gt;
&lt;br /&gt;
== Developer Edition (formerly known as Enterprise) ==&lt;br /&gt;
&lt;br /&gt;
Analytica's middle-tier edition formerly known as the ''Enterprise Edition'', it is now called the [[Analytica Developer|Analytica Developer edition]]. That name better reflects what it is--software for developers of decision applications.  If you're now a user of Analytica Enterprise you don't have to update your license or do anything special. The name will just change when you install Analytica 7.0.  In Analytica docs, when you select &amp;quot;7.0&amp;quot; on the release bar (at the top of pages that have release-contingent content), all the docs automatically use the new Analytica Developer edition name. &lt;br /&gt;
&lt;br /&gt;
== Analytica language extensions ==&lt;br /&gt;
&lt;br /&gt;
=== Index label auto updates ===&lt;br /&gt;
&lt;br /&gt;
When you change the identifier of a variable, Analytica automatically updates all Definitions to use the new name. But, when you change a text label in an Index, it previously cause cause errors in Definitions using that label. For example, if you have&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  Index Animal := ['Cat', 'Dog']&lt;br /&gt;
  Variable Sound := IF Animal = 'Cat' THEN 'Miaow' ELSE 'Woof'&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
If you change &amp;lt;code&amp;gt; 'Cat'&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;'Feline' &amp;lt;/code&amp;gt; in Index &amp;lt;code&amp;gt;Animal&amp;lt;/code&amp;gt;, the Definition of &amp;lt;code&amp;gt;Sound&amp;lt;/code&amp;gt; will now automatically update to&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     IF Animal = 'Feline' THEN 'Miaow' ELSE 'Woof'&lt;br /&gt;
&amp;lt;/code&amp;gt;)&lt;br /&gt;
It does this wherever it sees &amp;lt;code&amp;gt;Animal=&amp;lt;label&amp;gt;&amp;lt;/code&amp;gt;).&lt;br /&gt;
If you use the label in another context where the index would notnormally appear, you should the new [[Index-label dot syntax]] (&amp;lt;code&amp;gt;Animal . 'Cat'&amp;lt;/code&amp;gt;) associates a text literal with its index to prevent it from getting out of sync, and to warn if it ever does. These [[Keeping text literals consistent with index labels| features]] help avoid common errors when updating text labels in Indexes.&lt;br /&gt;
&lt;br /&gt;
=== Callable ===&lt;br /&gt;
&lt;br /&gt;
The new object [[Class]] [[Callable]] is a variable-like object, meaning it has a [[Definition]] and a computed value, but can be used for convenience and documentation when the computed value itself is something that can be called, such as a [[Local function]] (aka ''lambda function''), a [[handle]] to an global function, a Python class or a Python function.&lt;br /&gt;
&lt;br /&gt;
If you &amp;quot;compute&amp;quot; the identity of a callable data item inside a normal [[Variable]] instance, &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;, you could call it using the syntax &amp;lt;code&amp;gt;X-&amp;gt;(a,b,c)&amp;lt;/code&amp;gt;. On your influence diagram the object would have a rounded rectangle and thus would not communicate that the result is something that can be called. When you change its class to be a [[Callable]], you can then invoke the call using the syntax &amp;lt;code&amp;gt;X(a,b,c)&amp;lt;/code&amp;gt; and the shape of the node changes to something that resembles a function shape, thus communicating that this holds something that is callable.&lt;br /&gt;
&lt;br /&gt;
To create a callable, first create a [[Variable]] node, then use the [[Class]] dropdown from the [[Object window]] or [[Attribute pane]] to change the class to ''Callable''.&lt;br /&gt;
&lt;br /&gt;
=== Struct ===&lt;br /&gt;
A [[Struct]] defines a new atomic, immutable data type. For use when you need to bundle multiple heterogeneous items and don't want their dimensionalities to interact. Array abstract treats an instance of a Struct as a single cell (an atom).&lt;br /&gt;
&lt;br /&gt;
=== Expression and Lazy qualifiers ===&lt;br /&gt;
An expression passed to a function parameter declared with the qualifier as &amp;lt;code&amp;gt;[[Function_parameter_qualifiers#Expression|Expression]]&amp;lt;/code&amp;gt; can now include local variable identifiers. The local variables are captured (similar to how they would be captured by a [[Local function]]).&lt;br /&gt;
&lt;br /&gt;
A new function parameter qualifier, [[Function_parameter_qualifiers#Lazy]], has been added, which does lazy evaluation of the expression passed to it. In the function Definition, you can use it as if it were a normal value parameter, but evaluation occurs when the value is used rather than when the function is called, and in the evaluation context (which includes the [[Evaluation modes|evaluation mode]]) where the value is used instead as in the context of the call.&lt;br /&gt;
&lt;br /&gt;
=== Excess parameter qualifier ===&lt;br /&gt;
A new function declaration allows a function to tolerate or capture excess named parameters in the call that are not declared as parameter names in the function's Parameters declaration. It can also be used in a [[Struct]] declaration.&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
=== ParseJSON ===&lt;br /&gt;
Changed to parse to [[Struct]]s, thus greatly simplifying and improving the convenience of using JSON in Analytica expressions. &lt;br /&gt;
&lt;br /&gt;
For parsing with a schema, a Struct's declaration serves as the schema, which is far easier and more familiar for an Analytica user than the former scheme for specifying a schema.&lt;br /&gt;
&lt;br /&gt;
[[MakeJSON]] is able to generate JSON from a Struct (or nested structs) as well, which is the most convenient representation for JSON representations.&lt;br /&gt;
&lt;br /&gt;
=== SpreadsheetOpen ===&lt;br /&gt;
Added a new «backend» parameter to [[SpreadsheetOpen]] with a new option of &amp;lt;code&amp;gt;'LibXl'&amp;lt;/code&amp;gt;, allowing you to read and manipulate a spreadsheet without having Excel installed. But unlike the Excel backend, the &amp;lt;b&amp;gt;LibXl&amp;lt;/b&amp;gt; option does not have a calculation engine (so can't recompute cell formulas after you change cells). This option is be better when you simply want to read (or write) data in a *.xlsx file format.&lt;br /&gt;
&lt;br /&gt;
== Example models and libraries ==&lt;br /&gt;
&lt;br /&gt;
* There is a new &amp;quot;Auto insurance claim risk analysis.ana&amp;quot; in the Example Models / Risk Analysis folder.&lt;br /&gt;
* The [[Mutables library]] has been updated. It provides a new [[Mutable]] [[Struct]] which is superior to the older representation, which displays the actual value in result table cells and is atomic. The legacy functions ([[MutableNew]], [[MutableSet]] and [[MutableGet]]) are still there for backward compatibility, but have been changed to just wrap the new Mutable.&lt;br /&gt;
&lt;br /&gt;
== Result tables and graphs ==&lt;br /&gt;
* A blank (none) entry was added to the [[XY_comparison#Use_comparison_index|comparison index pulldown]]. Use this to quickly unset the comparison index without having to re-enter the [[XY_comparison]] dialog. Also, the pulldown is now visible and enabled in browse mode.&lt;br /&gt;
* Comparison variables are no longer summed over slicer indexes that are set to '''Totals''' when the value for that variable does not include the slicer index. Note that this results in some changes to what is displayed in table body cells and in axis scaling on graphs.&lt;br /&gt;
&lt;br /&gt;
== Assista ==&lt;br /&gt;
&lt;br /&gt;
You can now copy-paste from Expression blocks in Assista's response using the little copy icon in the top-right corner of the expression block.&lt;br /&gt;
&lt;br /&gt;
== Experimental ==&lt;br /&gt;
* A way for an Analytica model running in desktop Analytica to [[MCP server in Analytica|act as a Model Context Protocol (MCP) server]] for use by Large Language Models (LLMs).&lt;br /&gt;
&lt;br /&gt;
== ADE ==&lt;br /&gt;
* Added a new example: &amp;lt;code&amp;gt;Mcp_server&amp;lt;/code&amp;gt;.  This is an MCP server that wraps ADE. Among other things, it can give AI agents like Claude Code the ability to build, explore and use Analytica models.&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.0%3F&amp;diff=63731</id>
		<title>What's new in Analytica 7.0?</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.0%3F&amp;diff=63731"/>
		<updated>2026-02-11T22:27:33Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: /* Index label auto updates */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:What's new pages]]&lt;br /&gt;
[[category:Analytica releases]]&lt;br /&gt;
&lt;br /&gt;
[[Analytica 7.0]] will be the next major Analytica release and is currently in [[Beta Tester Page|beta testing]]. Go to [[Beta Tester Page]] to try it. The current official release is [[Analytica 6.6]]. &lt;br /&gt;
&lt;br /&gt;
==Highlights of Analytica 7.0==&lt;br /&gt;
&lt;br /&gt;
* '''[[#Python integration|Python integration]]:''' The major enhancement is integration with Python and hence the entire Python ecosystem of libraries. You can easily call functions from Python libraries, access Python variables, and even write Python code right inside Analytica variables and functions. So now you can mix and match Analytica and Python according to which language you think best for your modeling or coding needs.&lt;br /&gt;
*  '''[[#Index label auto updates|Index label auto updates]]:''' A common source of errors has been when you change a text label in an Index without remembering to change expressions that refer to that same text label. Changes to labels now update automatically in expressions in most cases.&lt;br /&gt;
*  The '''Analytica Enterprise'''' edition has been renamed the [[#Developer Edition (formerly known as Enterprise) |Developer edition]], which better reflects what it is.&lt;br /&gt;
* It introduces two new object Classes:  &lt;br /&gt;
** [[Struct]] lets you bundle disparate values, like text, numbeers, atoms and arrays, together in one object that does not array abstract -- similar to Records and Classes in other languages).  &lt;br /&gt;
** [[Callable]] is like a user-defined Function but it's Definition can be a [[handle]] to a Python class or a Python function. &lt;br /&gt;
* [[ParseJSON]] and [[MakeJSON]] now use Structs, which are much more convenient for representing the hierarchical structure of JSON.&lt;br /&gt;
* [[#SpreadsheetOpen|Read and write spreadsheets without Excel]]:  This is faster and more robust, and you don't need Excel installed.&lt;br /&gt;
&lt;br /&gt;
== [[Using Python from Analytica|Python integration]] ==&lt;br /&gt;
&lt;br /&gt;
You can now write Python code inside Analytica definitions! It's easy to call Python functions, with Analytica-style Intelligent Arrays!. So you can access the vast ecosystem of Python libraries (''modules'' in Python lingo). Among the gazillion possibilities are specialized libraries for data visualization, statistics, machine learning, and much more.&lt;br /&gt;
It means that you can mix and match Analytica and Python -- write Analytica code for what's easiest in Analytica and Python code for what's easiest in Python.  &lt;br /&gt;
&lt;br /&gt;
See: [[Using Python from Analytica]]&lt;br /&gt;
(In [[Analytica Developer]] edition or better). &lt;br /&gt;
&lt;br /&gt;
For the Analytica modeler, this puts a ton of resources at your fingertips. &lt;br /&gt;
&lt;br /&gt;
It's also pretty cool for the Python developer. Analytica is like a new interactive development environment with a lot of unique advantages, especially during interactive code development:&lt;br /&gt;
* Analytica's dependency maintenance can be really convenient during interactive development, creating automatic dependency maintenance between your Python functions, classes and variables that don't exist in Python.&lt;br /&gt;
* The visual influence diagram layout can be a super useful to way organize and visualize your code.&lt;br /&gt;
* It naturally encourages declarative code practices, which leads to better and more maintainable coding style.&lt;br /&gt;
* You get the benefits of Analytica's edit tables, plus for results, Analytica's multi-D result tables and one-click, no-code, graphing.&lt;br /&gt;
* It is easy to wrap existing Python models to get Monte Carlo, parametric analysis and sensitivity analysis with Analytica ease.&lt;br /&gt;
* Sometimes one or the other language is more convenient for a particular task. You can freely switch between whichever language feels better suited to the immediate task, and intermix languages easily.&lt;br /&gt;
&lt;br /&gt;
== Developer Edition (formerly known as Enterprise) ==&lt;br /&gt;
&lt;br /&gt;
Analytica's middle-tier edition formerly known as the ''Enterprise Edition'', it is now called the [[Analytica Developer|Analytica Developer edition]]. That name better reflects what it is--software for developers of decision applications.  If you're now a user of Analytica Enterprise you don't have to update your license or do anything special. The name will just change when you install Analytica 7.0.  In Analytica docs, when you select &amp;quot;7.0&amp;quot; on the release bar (at the top of pages that have release-contingent content), all the docs automatically use the new Analytica Developer edition name. &lt;br /&gt;
&lt;br /&gt;
== Analytica language extensions ==&lt;br /&gt;
&lt;br /&gt;
=== Index label auto updates ===&lt;br /&gt;
&lt;br /&gt;
=== Index label auto updates ===&lt;br /&gt;
&lt;br /&gt;
When you change the identifier of a variable, Analytica automatically updates all Definitions to use the new name. But, when you change a text label in an Index, it previously cause cause errors in Definitions using that label. For example, if you have&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  Index Animal := ['Cat', 'Dog']&lt;br /&gt;
  Variable Sound := IF Animal = 'Cat' THEN 'Miaow' ELSE 'Woof'&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
If you change &amp;lt;code&amp;gt; 'Cat'&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;'Feline' &amp;lt;/code&amp;gt; in Index &amp;lt;code&amp;gt;Animal&amp;lt;/code&amp;gt;, the Definition of &amp;lt;code&amp;gt;Sound&amp;lt;/code&amp;gt; will now automatically update to&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     IF Animal = 'Feline' THEN 'Miaow' ELSE 'Woof'&lt;br /&gt;
&amp;lt;/code&amp;gt;)&lt;br /&gt;
It does this wherever it sees &amp;lt;code&amp;gt;Animal=&amp;lt;label&amp;gt;&amp;lt;/code&amp;gt;).&lt;br /&gt;
If you use the label in another context where the index would notnormally appear, you should the new [[Index-label dot syntax]] (&amp;lt;code&amp;gt;Animal . 'Cat'&amp;lt;/code&amp;gt;) associates a text literal with its index to prevent it from getting out of sync, and to warn if it ever does. These [[Keeping text literals consistent with index labels| features]] help avoid common errors when updating text labels in Indexes.&lt;br /&gt;
&lt;br /&gt;
=== Callable ===&lt;br /&gt;
&lt;br /&gt;
The new object [[Class]] [[Callable]] is a variable-like object, meaning it has a [[Definition]] and a computed value, but can be used for convenience and documentation when the computed value itself is something that can be called, such as a [[Local function]] (aka ''lambda function''), a [[handle]] to an global function, a Python class or a Python function.&lt;br /&gt;
&lt;br /&gt;
If you &amp;quot;compute&amp;quot; the identity of a callable data item inside a normal [[Variable]] instance, &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;, you could call it using the syntax &amp;lt;code&amp;gt;X-&amp;gt;(a,b,c)&amp;lt;/code&amp;gt;. On your influence diagram the object would have a rounded rectangle and thus would not communicate that the result is something that can be called. When you change its class to be a [[Callable]], you can then invoke the call using the syntax &amp;lt;code&amp;gt;X(a,b,c)&amp;lt;/code&amp;gt; and the shape of the node changes to something that resembles a function shape, thus communicating that this holds something that is callable.&lt;br /&gt;
&lt;br /&gt;
To create a callable, first create a [[Variable]] node, then use the [[Class]] dropdown from the [[Object window]] or [[Attribute pane]] to change the class to ''Callable''.&lt;br /&gt;
&lt;br /&gt;
=== Struct ===&lt;br /&gt;
A [[Struct]] defines a new atomic, immutable data type. For use when you need to bundle multiple heterogeneous items and don't want their dimensionalities to interact. Array abstract treats an instance of a Struct as a single cell (an atom).&lt;br /&gt;
&lt;br /&gt;
=== Expression and Lazy qualifiers ===&lt;br /&gt;
An expression passed to a function parameter declared with the qualifier as &amp;lt;code&amp;gt;[[Function_parameter_qualifiers#Expression|Expression]]&amp;lt;/code&amp;gt; can now include local variable identifiers. The local variables are captured (similar to how they would be captured by a [[Local function]]).&lt;br /&gt;
&lt;br /&gt;
A new function parameter qualifier, [[Function_parameter_qualifiers#Lazy]], has been added, which does lazy evaluation of the expression passed to it. In the function Definition, you can use it as if it were a normal value parameter, but evaluation occurs when the value is used rather than when the function is called, and in the evaluation context (which includes the [[Evaluation modes|evaluation mode]]) where the value is used instead as in the context of the call.&lt;br /&gt;
&lt;br /&gt;
=== Excess parameter qualifier ===&lt;br /&gt;
A new function declaration allows a function to tolerate or capture excess named parameters in the call that are not declared as parameter names in the function's Parameters declaration. It can also be used in a [[Struct]] declaration.&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
=== ParseJSON ===&lt;br /&gt;
Changed to parse to [[Struct]]s, thus greatly simplifying and improving the convenience of using JSON in Analytica expressions. &lt;br /&gt;
&lt;br /&gt;
For parsing with a schema, a Struct's declaration serves as the schema, which is far easier and more familiar for an Analytica user than the former scheme for specifying a schema.&lt;br /&gt;
&lt;br /&gt;
[[MakeJSON]] is able to generate JSON from a Struct (or nested structs) as well, which is the most convenient representation for JSON representations.&lt;br /&gt;
&lt;br /&gt;
=== SpreadsheetOpen ===&lt;br /&gt;
Added a new «backend» parameter to [[SpreadsheetOpen]] with a new option of &amp;lt;code&amp;gt;'LibXl'&amp;lt;/code&amp;gt;, allowing you to read and manipulate a spreadsheet without having Excel installed. But unlike the Excel backend, the &amp;lt;b&amp;gt;LibXl&amp;lt;/b&amp;gt; option does not have a calculation engine (so can't recompute cell formulas after you change cells). This option is be better when you simply want to read (or write) data in a *.xlsx file format.&lt;br /&gt;
&lt;br /&gt;
== Example models and libraries ==&lt;br /&gt;
&lt;br /&gt;
* There is a new &amp;quot;Auto insurance claim risk analysis.ana&amp;quot; in the Example Models / Risk Analysis folder.&lt;br /&gt;
* The [[Mutables library]] has been updated. It provides a new [[Mutable]] [[Struct]] which is superior to the older representation, which displays the actual value in result table cells and is atomic. The legacy functions ([[MutableNew]], [[MutableSet]] and [[MutableGet]]) are still there for backward compatibility, but have been changed to just wrap the new Mutable.&lt;br /&gt;
&lt;br /&gt;
== Result tables and graphs ==&lt;br /&gt;
* A blank (none) entry was added to the [[XY_comparison#Use_comparison_index|comparison index pulldown]]. Use this to quickly unset the comparison index without having to re-enter the [[XY_comparison]] dialog. Also, the pulldown is now visible and enabled in browse mode.&lt;br /&gt;
* Comparison variables are no longer summed over slicer indexes that are set to '''Totals''' when the value for that variable does not include the slicer index. Note that this results in some changes to what is displayed in table body cells and in axis scaling on graphs.&lt;br /&gt;
&lt;br /&gt;
== Assista ==&lt;br /&gt;
&lt;br /&gt;
You can now copy-paste from Expression blocks in Assista's response using the little copy icon in the top-right corner of the expression block.&lt;br /&gt;
&lt;br /&gt;
== Experimental ==&lt;br /&gt;
* A way for an Analytica model running in desktop Analytica to [[MCP server in Analytica|act as a Model Context Protocol (MCP) server]] for use by Large Language Models (LLMs).&lt;br /&gt;
&lt;br /&gt;
== ADE ==&lt;br /&gt;
* Added a new example: &amp;lt;code&amp;gt;Mcp_server&amp;lt;/code&amp;gt;.  This is an MCP server that wraps ADE. Among other things, it can give AI agents like Claude Code the ability to build, explore and use Analytica models.&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.0%3F&amp;diff=63730</id>
		<title>What's new in Analytica 7.0?</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.0%3F&amp;diff=63730"/>
		<updated>2026-02-11T20:26:26Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: /* Highlights of Analytica 7.0 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:What's new pages]]&lt;br /&gt;
[[category:Analytica releases]]&lt;br /&gt;
&lt;br /&gt;
[[Analytica 7.0]] will be the next major Analytica release and is currently in [[Beta Tester Page|beta testing]]. Go to [[Beta Tester Page]] to try it. The current official release is [[Analytica 6.6]]. &lt;br /&gt;
&lt;br /&gt;
==Highlights of Analytica 7.0==&lt;br /&gt;
&lt;br /&gt;
* '''[[#Python integration|Python integration]]:''' The major enhancement is integration with Python and hence the entire Python ecosystem of libraries. You can easily call functions from Python libraries, access Python variables, and even write Python code right inside Analytica variables and functions. So now you can mix and match Analytica and Python according to which language you think best for your modeling or coding needs.&lt;br /&gt;
*  '''[[#Index label auto updates|Index label auto updates]]:''' A common source of errors has been when you change a text label in an Index without remembering to change expressions that refer to that same text label. Changes to labels now update automatically in expressions in most cases.&lt;br /&gt;
*  The '''Analytica Enterprise'''' edition has been renamed the [[#Developer Edition (formerly known as Enterprise) |Developer edition]], which better reflects what it is.&lt;br /&gt;
* It introduces two new object Classes:  &lt;br /&gt;
** [[Struct]] lets you bundle disparate values, like text, numbeers, atoms and arrays, together in one object that does not array abstract -- similar to Records and Classes in other languages).  &lt;br /&gt;
** [[Callable]] is like a user-defined Function but it's Definition can be a [[handle]] to a Python class or a Python function. &lt;br /&gt;
* [[ParseJSON]] and [[MakeJSON]] now use Structs, which are much more convenient for representing the hierarchical structure of JSON.&lt;br /&gt;
* [[#SpreadsheetOpen|Read and write spreadsheets without Excel]]:  This is faster and more robust, and you don't need Excel installed.&lt;br /&gt;
&lt;br /&gt;
== [[Using Python from Analytica|Python integration]] ==&lt;br /&gt;
&lt;br /&gt;
You can now write Python code inside Analytica definitions! It's easy to call Python functions, with Analytica-style Intelligent Arrays!. So you can access the vast ecosystem of Python libraries (''modules'' in Python lingo). Among the gazillion possibilities are specialized libraries for data visualization, statistics, machine learning, and much more.&lt;br /&gt;
It means that you can mix and match Analytica and Python -- write Analytica code for what's easiest in Analytica and Python code for what's easiest in Python.  &lt;br /&gt;
&lt;br /&gt;
See: [[Using Python from Analytica]]&lt;br /&gt;
(In [[Analytica Developer]] edition or better). &lt;br /&gt;
&lt;br /&gt;
For the Analytica modeler, this puts a ton of resources at your fingertips. &lt;br /&gt;
&lt;br /&gt;
It's also pretty cool for the Python developer. Analytica is like a new interactive development environment with a lot of unique advantages, especially during interactive code development:&lt;br /&gt;
* Analytica's dependency maintenance can be really convenient during interactive development, creating automatic dependency maintenance between your Python functions, classes and variables that don't exist in Python.&lt;br /&gt;
* The visual influence diagram layout can be a super useful to way organize and visualize your code.&lt;br /&gt;
* It naturally encourages declarative code practices, which leads to better and more maintainable coding style.&lt;br /&gt;
* You get the benefits of Analytica's edit tables, plus for results, Analytica's multi-D result tables and one-click, no-code, graphing.&lt;br /&gt;
* It is easy to wrap existing Python models to get Monte Carlo, parametric analysis and sensitivity analysis with Analytica ease.&lt;br /&gt;
* Sometimes one or the other language is more convenient for a particular task. You can freely switch between whichever language feels better suited to the immediate task, and intermix languages easily.&lt;br /&gt;
&lt;br /&gt;
== Developer Edition (formerly known as Enterprise) ==&lt;br /&gt;
&lt;br /&gt;
Analytica's middle-tier edition formerly known as the ''Enterprise Edition'', it is now called the [[Analytica Developer|Analytica Developer edition]]. That name better reflects what it is--software for developers of decision applications.  If you're now a user of Analytica Enterprise you don't have to update your license or do anything special. The name will just change when you install Analytica 7.0.  In Analytica docs, when you select &amp;quot;7.0&amp;quot; on the release bar (at the top of pages that have release-contingent content), all the docs automatically use the new Analytica Developer edition name. &lt;br /&gt;
&lt;br /&gt;
== Analytica language extensions ==&lt;br /&gt;
&lt;br /&gt;
=== Index label auto updates ===&lt;br /&gt;
&lt;br /&gt;
When you change a text label in an Index, it can update code to use the new text label. Iit automatically updates text literals in other expressions that compare to or subscript on an index. The new [[Index-label dot syntax]] ( &amp;lt;code&amp;gt;I . &amp;quot;label&amp;quot;&amp;lt;/code&amp;gt;) associates a text literal with its index to prevent it from getting out of sync, and to warn if it ever does. These [[Keeping text literals consistent with index labels| features]] help avoid common errors when updating text labels in Indexes. &lt;br /&gt;
&lt;br /&gt;
=== Callable ===&lt;br /&gt;
&lt;br /&gt;
The new object [[Class]] [[Callable]] is a variable-like object, meaning it has a [[Definition]] and a computed value, but can be used for convenience and documentation when the computed value itself is something that can be called, such as a [[Local function]] (aka ''lambda function''), a [[handle]] to an global function, a Python class or a Python function.&lt;br /&gt;
&lt;br /&gt;
If you &amp;quot;compute&amp;quot; the identity of a callable data item inside a normal [[Variable]] instance, &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;, you could call it using the syntax &amp;lt;code&amp;gt;X-&amp;gt;(a,b,c)&amp;lt;/code&amp;gt;. On your influence diagram the object would have a rounded rectangle and thus would not communicate that the result is something that can be called. When you change its class to be a [[Callable]], you can then invoke the call using the syntax &amp;lt;code&amp;gt;X(a,b,c)&amp;lt;/code&amp;gt; and the shape of the node changes to something that resembles a function shape, thus communicating that this holds something that is callable.&lt;br /&gt;
&lt;br /&gt;
To create a callable, first create a [[Variable]] node, then use the [[Class]] dropdown from the [[Object window]] or [[Attribute pane]] to change the class to ''Callable''.&lt;br /&gt;
&lt;br /&gt;
=== Struct ===&lt;br /&gt;
A [[Struct]] defines a new atomic, immutable data type. For use when you need to bundle multiple heterogeneous items and don't want their dimensionalities to interact. Array abstract treats an instance of a Struct as a single cell (an atom).&lt;br /&gt;
&lt;br /&gt;
=== Expression and Lazy qualifiers ===&lt;br /&gt;
An expression passed to a function parameter declared with the qualifier as &amp;lt;code&amp;gt;[[Function_parameter_qualifiers#Expression|Expression]]&amp;lt;/code&amp;gt; can now include local variable identifiers. The local variables are captured (similar to how they would be captured by a [[Local function]]).&lt;br /&gt;
&lt;br /&gt;
A new function parameter qualifier, [[Function_parameter_qualifiers#Lazy]], has been added, which does lazy evaluation of the expression passed to it. In the function Definition, you can use it as if it were a normal value parameter, but evaluation occurs when the value is used rather than when the function is called, and in the evaluation context (which includes the [[Evaluation modes|evaluation mode]]) where the value is used instead as in the context of the call.&lt;br /&gt;
&lt;br /&gt;
=== Excess parameter qualifier ===&lt;br /&gt;
A new function declaration allows a function to tolerate or capture excess named parameters in the call that are not declared as parameter names in the function's Parameters declaration. It can also be used in a [[Struct]] declaration.&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
=== ParseJSON ===&lt;br /&gt;
Changed to parse to [[Struct]]s, thus greatly simplifying and improving the convenience of using JSON in Analytica expressions. &lt;br /&gt;
&lt;br /&gt;
For parsing with a schema, a Struct's declaration serves as the schema, which is far easier and more familiar for an Analytica user than the former scheme for specifying a schema.&lt;br /&gt;
&lt;br /&gt;
[[MakeJSON]] is able to generate JSON from a Struct (or nested structs) as well, which is the most convenient representation for JSON representations.&lt;br /&gt;
&lt;br /&gt;
=== SpreadsheetOpen ===&lt;br /&gt;
Added a new «backend» parameter to [[SpreadsheetOpen]] with a new option of &amp;lt;code&amp;gt;'LibXl'&amp;lt;/code&amp;gt;, allowing you to read and manipulate a spreadsheet without having Excel installed. But unlike the Excel backend, the &amp;lt;b&amp;gt;LibXl&amp;lt;/b&amp;gt; option does not have a calculation engine (so can't recompute cell formulas after you change cells). This option is be better when you simply want to read (or write) data in a *.xlsx file format.&lt;br /&gt;
&lt;br /&gt;
== Example models and libraries ==&lt;br /&gt;
&lt;br /&gt;
* There is a new &amp;quot;Auto insurance claim risk analysis.ana&amp;quot; in the Example Models / Risk Analysis folder.&lt;br /&gt;
* The [[Mutables library]] has been updated. It provides a new [[Mutable]] [[Struct]] which is superior to the older representation, which displays the actual value in result table cells and is atomic. The legacy functions ([[MutableNew]], [[MutableSet]] and [[MutableGet]]) are still there for backward compatibility, but have been changed to just wrap the new Mutable.&lt;br /&gt;
&lt;br /&gt;
== Result tables and graphs ==&lt;br /&gt;
* A blank (none) entry was added to the [[XY_comparison#Use_comparison_index|comparison index pulldown]]. Use this to quickly unset the comparison index without having to re-enter the [[XY_comparison]] dialog. Also, the pulldown is now visible and enabled in browse mode.&lt;br /&gt;
* Comparison variables are no longer summed over slicer indexes that are set to '''Totals''' when the value for that variable does not include the slicer index. Note that this results in some changes to what is displayed in table body cells and in axis scaling on graphs.&lt;br /&gt;
&lt;br /&gt;
== Assista ==&lt;br /&gt;
&lt;br /&gt;
You can now copy-paste from Expression blocks in Assista's response using the little copy icon in the top-right corner of the expression block.&lt;br /&gt;
&lt;br /&gt;
== Experimental ==&lt;br /&gt;
* A way for an Analytica model running in desktop Analytica to [[MCP server in Analytica|act as a Model Context Protocol (MCP) server]] for use by Large Language Models (LLMs).&lt;br /&gt;
&lt;br /&gt;
== ADE ==&lt;br /&gt;
* Added a new example: &amp;lt;code&amp;gt;Mcp_server&amp;lt;/code&amp;gt;.  This is an MCP server that wraps ADE. Among other things, it can give AI agents like Claude Code the ability to build, explore and use Analytica models.&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.0%3F&amp;diff=63729</id>
		<title>What's new in Analytica 7.0?</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.0%3F&amp;diff=63729"/>
		<updated>2026-02-11T20:25:55Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: /* Highlights of Analytica 7.0 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:What's new pages]]&lt;br /&gt;
[[category:Analytica releases]]&lt;br /&gt;
&lt;br /&gt;
[[Analytica 7.0]] will be the next major Analytica release and is currently in [[Beta Tester Page|beta testing]]. Go to [[Beta Tester Page]] to try it. The current official release is [[Analytica 6.6]]. &lt;br /&gt;
&lt;br /&gt;
==Highlights of Analytica 7.0==&lt;br /&gt;
&lt;br /&gt;
* '''[[#Python integration|Python integration]]:''' The major enhancement is integration with Python and hence the entire Python ecosystem of libraries. You can easily call functions from Python libraries, access Python variables, and even write Python code right inside Analytica variables and functions. So now you can mix and match Analytica and Python according to which language you think best for your modeling or coding needs.&lt;br /&gt;
*  '''[[#Index label auto updates|Index label auto updates:''' A common source of errors has been when you change a text label in an Index without remembering to change expressions that refer to that same text label. Changes to labels now update automatically in expressions in most cases.&lt;br /&gt;
*  The '''Analytica Enterprise'''' edition has been renamed the [[#Developer Edition (formerly known as Enterprise) |Developer edition]], which better reflects what it is.&lt;br /&gt;
* It introduces two new object Classes:  &lt;br /&gt;
** [[Struct]] lets you bundle disparate values, like text, numbeers, atoms and arrays, together in one object that does not array abstract -- similar to Records and Classes in other languages).  &lt;br /&gt;
** [[Callable]] is like a user-defined Function but it's Definition can be a [[handle]] to a Python class or a Python function. &lt;br /&gt;
* [[ParseJSON]] and [[MakeJSON]] now use Structs, which are much more convenient for representing the hierarchical structure of JSON.&lt;br /&gt;
* [[#SpreadsheetOpen|Read and write spreadsheets without Excel]]:  This is faster and more robust, and you don't need Excel installed.&lt;br /&gt;
&lt;br /&gt;
== [[Using Python from Analytica|Python integration]] ==&lt;br /&gt;
&lt;br /&gt;
You can now write Python code inside Analytica definitions! It's easy to call Python functions, with Analytica-style Intelligent Arrays!. So you can access the vast ecosystem of Python libraries (''modules'' in Python lingo). Among the gazillion possibilities are specialized libraries for data visualization, statistics, machine learning, and much more.&lt;br /&gt;
It means that you can mix and match Analytica and Python -- write Analytica code for what's easiest in Analytica and Python code for what's easiest in Python.  &lt;br /&gt;
&lt;br /&gt;
See: [[Using Python from Analytica]]&lt;br /&gt;
(In [[Analytica Developer]] edition or better). &lt;br /&gt;
&lt;br /&gt;
For the Analytica modeler, this puts a ton of resources at your fingertips. &lt;br /&gt;
&lt;br /&gt;
It's also pretty cool for the Python developer. Analytica is like a new interactive development environment with a lot of unique advantages, especially during interactive code development:&lt;br /&gt;
* Analytica's dependency maintenance can be really convenient during interactive development, creating automatic dependency maintenance between your Python functions, classes and variables that don't exist in Python.&lt;br /&gt;
* The visual influence diagram layout can be a super useful to way organize and visualize your code.&lt;br /&gt;
* It naturally encourages declarative code practices, which leads to better and more maintainable coding style.&lt;br /&gt;
* You get the benefits of Analytica's edit tables, plus for results, Analytica's multi-D result tables and one-click, no-code, graphing.&lt;br /&gt;
* It is easy to wrap existing Python models to get Monte Carlo, parametric analysis and sensitivity analysis with Analytica ease.&lt;br /&gt;
* Sometimes one or the other language is more convenient for a particular task. You can freely switch between whichever language feels better suited to the immediate task, and intermix languages easily.&lt;br /&gt;
&lt;br /&gt;
== Developer Edition (formerly known as Enterprise) ==&lt;br /&gt;
&lt;br /&gt;
Analytica's middle-tier edition formerly known as the ''Enterprise Edition'', it is now called the [[Analytica Developer|Analytica Developer edition]]. That name better reflects what it is--software for developers of decision applications.  If you're now a user of Analytica Enterprise you don't have to update your license or do anything special. The name will just change when you install Analytica 7.0.  In Analytica docs, when you select &amp;quot;7.0&amp;quot; on the release bar (at the top of pages that have release-contingent content), all the docs automatically use the new Analytica Developer edition name. &lt;br /&gt;
&lt;br /&gt;
== Analytica language extensions ==&lt;br /&gt;
&lt;br /&gt;
=== Index label auto updates ===&lt;br /&gt;
&lt;br /&gt;
When you change a text label in an Index, it can update code to use the new text label. Iit automatically updates text literals in other expressions that compare to or subscript on an index. The new [[Index-label dot syntax]] ( &amp;lt;code&amp;gt;I . &amp;quot;label&amp;quot;&amp;lt;/code&amp;gt;) associates a text literal with its index to prevent it from getting out of sync, and to warn if it ever does. These [[Keeping text literals consistent with index labels| features]] help avoid common errors when updating text labels in Indexes. &lt;br /&gt;
&lt;br /&gt;
=== Callable ===&lt;br /&gt;
&lt;br /&gt;
The new object [[Class]] [[Callable]] is a variable-like object, meaning it has a [[Definition]] and a computed value, but can be used for convenience and documentation when the computed value itself is something that can be called, such as a [[Local function]] (aka ''lambda function''), a [[handle]] to an global function, a Python class or a Python function.&lt;br /&gt;
&lt;br /&gt;
If you &amp;quot;compute&amp;quot; the identity of a callable data item inside a normal [[Variable]] instance, &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;, you could call it using the syntax &amp;lt;code&amp;gt;X-&amp;gt;(a,b,c)&amp;lt;/code&amp;gt;. On your influence diagram the object would have a rounded rectangle and thus would not communicate that the result is something that can be called. When you change its class to be a [[Callable]], you can then invoke the call using the syntax &amp;lt;code&amp;gt;X(a,b,c)&amp;lt;/code&amp;gt; and the shape of the node changes to something that resembles a function shape, thus communicating that this holds something that is callable.&lt;br /&gt;
&lt;br /&gt;
To create a callable, first create a [[Variable]] node, then use the [[Class]] dropdown from the [[Object window]] or [[Attribute pane]] to change the class to ''Callable''.&lt;br /&gt;
&lt;br /&gt;
=== Struct ===&lt;br /&gt;
A [[Struct]] defines a new atomic, immutable data type. For use when you need to bundle multiple heterogeneous items and don't want their dimensionalities to interact. Array abstract treats an instance of a Struct as a single cell (an atom).&lt;br /&gt;
&lt;br /&gt;
=== Expression and Lazy qualifiers ===&lt;br /&gt;
An expression passed to a function parameter declared with the qualifier as &amp;lt;code&amp;gt;[[Function_parameter_qualifiers#Expression|Expression]]&amp;lt;/code&amp;gt; can now include local variable identifiers. The local variables are captured (similar to how they would be captured by a [[Local function]]).&lt;br /&gt;
&lt;br /&gt;
A new function parameter qualifier, [[Function_parameter_qualifiers#Lazy]], has been added, which does lazy evaluation of the expression passed to it. In the function Definition, you can use it as if it were a normal value parameter, but evaluation occurs when the value is used rather than when the function is called, and in the evaluation context (which includes the [[Evaluation modes|evaluation mode]]) where the value is used instead as in the context of the call.&lt;br /&gt;
&lt;br /&gt;
=== Excess parameter qualifier ===&lt;br /&gt;
A new function declaration allows a function to tolerate or capture excess named parameters in the call that are not declared as parameter names in the function's Parameters declaration. It can also be used in a [[Struct]] declaration.&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
=== ParseJSON ===&lt;br /&gt;
Changed to parse to [[Struct]]s, thus greatly simplifying and improving the convenience of using JSON in Analytica expressions. &lt;br /&gt;
&lt;br /&gt;
For parsing with a schema, a Struct's declaration serves as the schema, which is far easier and more familiar for an Analytica user than the former scheme for specifying a schema.&lt;br /&gt;
&lt;br /&gt;
[[MakeJSON]] is able to generate JSON from a Struct (or nested structs) as well, which is the most convenient representation for JSON representations.&lt;br /&gt;
&lt;br /&gt;
=== SpreadsheetOpen ===&lt;br /&gt;
Added a new «backend» parameter to [[SpreadsheetOpen]] with a new option of &amp;lt;code&amp;gt;'LibXl'&amp;lt;/code&amp;gt;, allowing you to read and manipulate a spreadsheet without having Excel installed. But unlike the Excel backend, the &amp;lt;b&amp;gt;LibXl&amp;lt;/b&amp;gt; option does not have a calculation engine (so can't recompute cell formulas after you change cells). This option is be better when you simply want to read (or write) data in a *.xlsx file format.&lt;br /&gt;
&lt;br /&gt;
== Example models and libraries ==&lt;br /&gt;
&lt;br /&gt;
* There is a new &amp;quot;Auto insurance claim risk analysis.ana&amp;quot; in the Example Models / Risk Analysis folder.&lt;br /&gt;
* The [[Mutables library]] has been updated. It provides a new [[Mutable]] [[Struct]] which is superior to the older representation, which displays the actual value in result table cells and is atomic. The legacy functions ([[MutableNew]], [[MutableSet]] and [[MutableGet]]) are still there for backward compatibility, but have been changed to just wrap the new Mutable.&lt;br /&gt;
&lt;br /&gt;
== Result tables and graphs ==&lt;br /&gt;
* A blank (none) entry was added to the [[XY_comparison#Use_comparison_index|comparison index pulldown]]. Use this to quickly unset the comparison index without having to re-enter the [[XY_comparison]] dialog. Also, the pulldown is now visible and enabled in browse mode.&lt;br /&gt;
* Comparison variables are no longer summed over slicer indexes that are set to '''Totals''' when the value for that variable does not include the slicer index. Note that this results in some changes to what is displayed in table body cells and in axis scaling on graphs.&lt;br /&gt;
&lt;br /&gt;
== Assista ==&lt;br /&gt;
&lt;br /&gt;
You can now copy-paste from Expression blocks in Assista's response using the little copy icon in the top-right corner of the expression block.&lt;br /&gt;
&lt;br /&gt;
== Experimental ==&lt;br /&gt;
* A way for an Analytica model running in desktop Analytica to [[MCP server in Analytica|act as a Model Context Protocol (MCP) server]] for use by Large Language Models (LLMs).&lt;br /&gt;
&lt;br /&gt;
== ADE ==&lt;br /&gt;
* Added a new example: &amp;lt;code&amp;gt;Mcp_server&amp;lt;/code&amp;gt;.  This is an MCP server that wraps ADE. Among other things, it can give AI agents like Claude Code the ability to build, explore and use Analytica models.&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=Analytica_Enterprise&amp;diff=63693</id>
		<title>Analytica Enterprise</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=Analytica_Enterprise&amp;diff=63693"/>
		<updated>2026-01-28T01:09:54Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  [[Category:Analytica User Guide]]&lt;br /&gt;
[[Category: Analytica Enterprise]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;breadcrumbs&amp;gt;Analytica User Guide &amp;gt;Working with Large Models &amp;gt; {{PAGENAME}}&amp;lt;/breadcrumbs&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
{{ReleaseBar}} &lt;br /&gt;
&lt;br /&gt;
The {{Analytica Enterprise}} edition {{Release|7.0||(formerly known as the Analytica Enterprise edition prior to [[Analytica 7.0]])}} offers all the functionality of Analytica Professional, plus your model can: &lt;br /&gt;
* read from and write to external data sources (e.g., [[Database access|databases]], [[ReadTextFile|text]], [[ParseCSV|csv]], [[ParseJSON|JSON]], {{Release|5.0||or binary data}} files, web pages and [[ReadFromUrl|web services]])&lt;br /&gt;
* run and communicate with other applications with [[COM Integration|COM]]&lt;br /&gt;
* use [[Analytica Enterprise#Huge Arrays|Huge Arrays]] (up to 100 million elements per Index dimension)&lt;br /&gt;
* apply the [[Performance Profiler library|Performance Profiler]] to see computational effort by variable&lt;br /&gt;
* create [[Obfuscated and Browse-Only Models|Browse-only models]]&lt;br /&gt;
* [[Obfuscated and Browse-Only Models|encrypt (obfuscate)]] sensitive and confidential data or algorithms.&lt;br /&gt;
&lt;br /&gt;
You need either {{Analytica Enterprise}} or [[Analytica_Optimizer_Guide|Analytica Optimizer]] to create very large models or to integrate Analytica with external data sources and databases. You can use [[Analytica Cloud Platform|ACP]] or the [[ADE_User_Guide|Analytica Decision Engine]] to run models created with {{Analytica Enterprise}} or Optimizer with these features. You can use any edition of Analytica to run a model that uses buttons, or was saved as browse-only with hidden definitions.&lt;br /&gt;
&lt;br /&gt;
You can order or upgrade to Analytica {{Developer}} [http://www.lumina.com/shoppingcart/productorder/ here].&lt;br /&gt;
&lt;br /&gt;
==Huge Arrays==&lt;br /&gt;
&lt;br /&gt;
Free Analytica and Analytica Professional are limited to Index sizes (and Sample sizes) of 32,000 elements. {{Analytica Enterprise}} and above ([[Analytica Optimizer Guide|Optimizer]], [[Analytica Cloud Platform|ACP]]. and [[ADE User Guide|ADE]]) can manage indexes and arrays of up to two billion elements in any dimension. The only practical limit on model sizes is the memory on your computer.  It also lets you read in large datasets from databases, using the ODBC functions.&lt;br /&gt;
Huge Arrays means they can also handle sample size for probabilistic simulation up to this size. You can set this in the [[Uncertainty Setup dialog]] from the [[Result menu]].&lt;br /&gt;
===Typescript Window===&lt;br /&gt;
&lt;br /&gt;
The [[Typescript]] window offers an old-fashioned command-line user interface, like the Windows CMD program or a Unix shell, showing a prompt — the title of the model or module — at the start of each line. You can type in a [[script]] command. It prints any results as text, and show another prompt. This window is occasionally useful for advanced users who wish to inspect internal details of a model. You can also use it to test out commands that you want to use in a [[Buttons#Script_Attribute|button script]].&lt;br /&gt;
&lt;br /&gt;
To open the [[Typescript]] window, press the '''F12''' key.&lt;br /&gt;
&lt;br /&gt;
:[[File:huge_arrays_1.png|400px]]&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
* [[Editions of Analytica]]&lt;br /&gt;
* [http://www.lumina.com/shoppingcart/productorder/ order Analytica {{Developer}}]&lt;br /&gt;
* [[Arrays and Indexes]]&lt;br /&gt;
* [[Working with Large Models]]&lt;br /&gt;
* [[Editions of Analytica]]&lt;br /&gt;
* [[Analytica Optimizer Guide]]&lt;br /&gt;
* [[ADE User Guide]]&lt;br /&gt;
* [[Typescript]]&lt;br /&gt;
* [[Analytica Script]]&lt;br /&gt;
* [[Scripting Guide]]&lt;br /&gt;
&amp;lt;footer&amp;gt;Performance Profiler library / {{PAGENAME}} / User-defined Functions and Libraries&amp;lt;/footer&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.0%3F&amp;diff=63692</id>
		<title>What's new in Analytica 7.0?</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.0%3F&amp;diff=63692"/>
		<updated>2026-01-28T00:30:13Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: /* Experimental */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:What's new pages]]&lt;br /&gt;
[[category:Analytica releases]]&lt;br /&gt;
&lt;br /&gt;
[[Analytica 7.0]] will be the next major Analytica release and is currently in [[Beta Tester Page|beta testing]]. Go to [[Beta Tester Page]] to try it. The current official release is [[Analytica 6.6]]. &lt;br /&gt;
&lt;br /&gt;
==Highlights of Analytica 7.0==&lt;br /&gt;
&lt;br /&gt;
* '''[[#Python integration|Python integration]]:''' The major enhancement is integration with Python and hence the entire Python ecosystem of libraries. You can easily call functions from Python libraries, access Python variables, and even write Python code right inside Analytica variables and functions. So now you can mix and match Analytica and Python according to which language you think best for your modeling or coding needs.&lt;br /&gt;
*  '''Index label updating:''' A common source of errors has been when you change a text label in an Index without remembering to change expressions that refer to that same text label. [[# Index label auto updates|New features]] now automatically update these labels, and so eliminate most of those errors.&lt;br /&gt;
*  The '''Analytica Enterprise'''' edition has been renamed the [[#Developer Edition (formerly known as Enterprise) |Developer edition]], which better reflects what it is.&lt;br /&gt;
* It introduces two new object Classes:  &lt;br /&gt;
** [[Struct]] lets you bundle disparate values, like text, numbeers, atoms and arrays, together in one object that does not array abstract -- similar to Records and Classes in other languages).  &lt;br /&gt;
** [[Callable]] is like a user-defined Function but it's Definition can be a [[handle]] to a Python class or a Python function. &lt;br /&gt;
* [[ParseJSON]] and [[MakeJSON]] now use Structs, which are much more convenient for representing the hierarchical structure of JSON.&lt;br /&gt;
* [[#SpreadsheetOpen|Read and write spreadsheets without Excel]]:  This is faster and more robust, and you don't need Excel installed.&lt;br /&gt;
&lt;br /&gt;
== [[Using Python from Analytica|Python integration]] ==&lt;br /&gt;
&lt;br /&gt;
You can now write Python code inside Analytica definitions! It's easy to call Python functions, with Analytica-style Intelligent Arrays!. So you can access the vast ecosystem of Python libraries (''modules'' in Python lingo). Among the gazillion possibilities are specialized libraries for data visualization, statistics, machine learning, and much more.&lt;br /&gt;
It means that you can mix and match Analytica and Python -- write Analytica code for what's easiest in Analytica and Python code for what's easiest in Python.  &lt;br /&gt;
&lt;br /&gt;
See: [[Using Python from Analytica]]&lt;br /&gt;
(In [[Analytica Developer]] edition or better). &lt;br /&gt;
&lt;br /&gt;
For the Analytica modeler, this puts a ton of resources at your fingertips. &lt;br /&gt;
&lt;br /&gt;
It's also pretty cool for the Python developer. Analytica is like a new interactive development environment with a lot of unique advantages, especially during interactive code development:&lt;br /&gt;
* Analytica's dependency maintenance can be really convenient during interactive development, creating automatic dependency maintenance between your Python functions, classes and variables that don't exist in Python.&lt;br /&gt;
* The visual influence diagram layout can be a super useful to way organize and visualize your code.&lt;br /&gt;
* It naturally encourages declarative code practices, which leads to better and more maintainable coding style.&lt;br /&gt;
* You get the benefits of Analytica's edit tables, plus for results, Analytica's multi-D result tables and one-click, no-code, graphing.&lt;br /&gt;
* It is easy to wrap existing Python models to get Monte Carlo, parametric analysis and sensitivity analysis with Analytica ease.&lt;br /&gt;
* Sometimes one or the other language is more convenient for a particular task. You can freely switch between whichever language feels better suited to the immediate task, and intermix languages easily.&lt;br /&gt;
&lt;br /&gt;
== Developer Edition (formerly known as Enterprise) ==&lt;br /&gt;
&lt;br /&gt;
Analytica's middle-tier edition formerly known as the ''Enterprise Edition'', it is now called the [[Analytica Developer|Analytica Developer edition]]. That name better reflects what it is--software for developers of decision applications.  If you're now a user of Analytica Enterprise you don't have to update your license or do anything special. The name will just change when you install Analytica 7.0.  In Analytica docs, when you select &amp;quot;7.0&amp;quot; on the release bar (at the top of pages that have release-contingent content), all the docs automatically use the new Analytica Developer edition name. &lt;br /&gt;
&lt;br /&gt;
== Analytica language extensions ==&lt;br /&gt;
&lt;br /&gt;
=== Index label auto updates ===&lt;br /&gt;
&lt;br /&gt;
When you change a text label in an Index, it can update code to use the new text label. Iit automatically updates text literals in other expressions that compare to or subscript on an index. The new [[Index-label dot syntax]] ( &amp;lt;code&amp;gt;I . &amp;quot;label&amp;quot;&amp;lt;/code&amp;gt;) associates a text literal with its index to prevent it from getting out of sync, and to warn if it ever does. These [[Keeping text literals consistent with index labels| features]] help avoid common errors when updating text labels in Indexes. &lt;br /&gt;
&lt;br /&gt;
=== Callable ===&lt;br /&gt;
&lt;br /&gt;
The new object [[Class]] [[Callable]] is a variable-like object, meaning it has a [[Definition]] and a computed value, but can be used for convenience and documentation when the computed value itself is something that can be called, such as a [[Local function]] (aka ''lambda function''), a [[handle]] to an global function, a Python class or a Python function.&lt;br /&gt;
&lt;br /&gt;
If you &amp;quot;compute&amp;quot; the identity of a callable data item inside a normal [[Variable]] instance, &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;, you could call it using the syntax &amp;lt;code&amp;gt;X-&amp;gt;(a,b,c)&amp;lt;/code&amp;gt;. On your influence diagram the object would have a rounded rectangle and thus would not communicate that the result is something that can be called. When you change its class to be a [[Callable]], you can then invoke the call using the syntax &amp;lt;code&amp;gt;X(a,b,c)&amp;lt;/code&amp;gt; and the shape of the node changes to something that resembles a function shape, thus communicating that this holds something that is callable.&lt;br /&gt;
&lt;br /&gt;
To create a callable, first create a [[Variable]] node, then use the [[Class]] dropdown from the [[Object window]] or [[Attribute pane]] to change the class to ''Callable''.&lt;br /&gt;
&lt;br /&gt;
=== Struct ===&lt;br /&gt;
A [[Struct]] defines a new atomic, immutable data type. For use when you need to bundle multiple heterogeneous items and don't want their dimensionalities to interact. Array abstract treats an instance of a Struct as a single cell (an atom).&lt;br /&gt;
&lt;br /&gt;
=== Expression and Lazy qualifiers ===&lt;br /&gt;
An expression passed to a function parameter declared with the qualifier as &amp;lt;code&amp;gt;[[Function_parameter_qualifiers#Expression|Expression]]&amp;lt;/code&amp;gt; can now include local variable identifiers. The local variables are captured (similar to how they would be captured by a [[Local function]]).&lt;br /&gt;
&lt;br /&gt;
A new function parameter qualifier, [[Function_parameter_qualifiers#Lazy]], has been added, which does lazy evaluation of the expression passed to it. In the function Definition, you can use it as if it were a normal value parameter, but evaluation occurs when the value is used rather than when the function is called, and in the evaluation context (which includes the [[Evaluation modes|evaluation mode]]) where the value is used instead as in the context of the call.&lt;br /&gt;
&lt;br /&gt;
=== Excess parameter qualifier ===&lt;br /&gt;
A new function declaration allows a function to tolerate or capture excess named parameters in the call that are not declared as parameter names in the function's Parameters declaration. It can also be used in a [[Struct]] declaration.&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
=== ParseJSON ===&lt;br /&gt;
Changed to parse to [[Struct]]s, thus greatly simplifying and improving the convenience of using JSON in Analytica expressions. &lt;br /&gt;
&lt;br /&gt;
For parsing with a schema, a Struct's declaration serves as the schema, which is far easier and more familiar for an Analytica user than the former scheme for specifying a schema.&lt;br /&gt;
&lt;br /&gt;
[[MakeJSON]] is able to generate JSON from a Struct (or nested structs) as well, which is the most convenient representation for JSON representations.&lt;br /&gt;
&lt;br /&gt;
=== SpreadsheetOpen ===&lt;br /&gt;
Added a new «backend» parameter to [[SpreadsheetOpen]] with a new option of &amp;lt;code&amp;gt;'LibXl'&amp;lt;/code&amp;gt;, allowing you to read and manipulate a spreadsheet without having Excel installed. But unlike the Excel backend, the &amp;lt;b&amp;gt;LibXl&amp;lt;/b&amp;gt; option does not have a calculation engine (so can't recompute cell formulas after you change cells). This option is be better when you simply want to read (or write) data in a *.xlsx file format.&lt;br /&gt;
&lt;br /&gt;
== Example models and libraries ==&lt;br /&gt;
&lt;br /&gt;
* There is a new &amp;quot;Auto insurance claim risk analysis.ana&amp;quot; in the Example Models / Risk Analysis folder.&lt;br /&gt;
* The [[Mutables library]] has been updated. It provides a new [[Mutable]] [[Struct]] which is superior to the older representation, which displays the actual value in result table cells and is atomic. The legacy functions ([[MutableNew]], [[MutableSet]] and [[MutableGet]]) are still there for backward compatibility, but have been changed to just wrap the new Mutable.&lt;br /&gt;
&lt;br /&gt;
== Result tables and graphs ==&lt;br /&gt;
* A blank (none) entry was added to the [[XY_comparison#Use_comparison_index|comparison index pulldown]]. Use this to quickly unset the comparison index without having to re-enter the [[XY_comparison]] dialog. Also, the pulldown is now visible and enabled in browse mode.&lt;br /&gt;
* Comparison variables are no longer summed over slicer indexes that are set to '''Totals''' when the value for that variable does not include the slicer index. Note that this results in some changes to what is displayed in table body cells and in axis scaling on graphs.&lt;br /&gt;
&lt;br /&gt;
== Assista ==&lt;br /&gt;
&lt;br /&gt;
You can now copy-paste from Expression blocks in Assista's response using the little copy icon in the top-right corner of the expression block.&lt;br /&gt;
&lt;br /&gt;
== Experimental ==&lt;br /&gt;
* A way for an Analytica model running in desktop Analytica to [[MCP server in Analytica|act as a Model Context Protocol (MCP) server]] for use by Large Language Models (LLMs).&lt;br /&gt;
&lt;br /&gt;
== ADE ==&lt;br /&gt;
* Added a new example: &amp;lt;code&amp;gt;Mcp_server&amp;lt;/code&amp;gt;.  This is an MCP server that wraps ADE. Among other things, it can give AI agents like Claude Code the ability to build, explore and use Analytica models.&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.0%3F&amp;diff=63691</id>
		<title>What's new in Analytica 7.0?</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.0%3F&amp;diff=63691"/>
		<updated>2026-01-28T00:29:08Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: /* Highlights of Analytica 7.0 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:What's new pages]]&lt;br /&gt;
[[category:Analytica releases]]&lt;br /&gt;
&lt;br /&gt;
[[Analytica 7.0]] will be the next major Analytica release and is currently in [[Beta Tester Page|beta testing]]. Go to [[Beta Tester Page]] to try it. The current official release is [[Analytica 6.6]]. &lt;br /&gt;
&lt;br /&gt;
==Highlights of Analytica 7.0==&lt;br /&gt;
&lt;br /&gt;
* '''[[#Python integration|Python integration]]:''' The major enhancement is integration with Python and hence the entire Python ecosystem of libraries. You can easily call functions from Python libraries, access Python variables, and even write Python code right inside Analytica variables and functions. So now you can mix and match Analytica and Python according to which language you think best for your modeling or coding needs.&lt;br /&gt;
*  '''Index label updating:''' A common source of errors has been when you change a text label in an Index without remembering to change expressions that refer to that same text label. [[# Index label auto updates|New features]] now automatically update these labels, and so eliminate most of those errors.&lt;br /&gt;
*  The '''Analytica Enterprise'''' edition has been renamed the [[#Developer Edition (formerly known as Enterprise) |Developer edition]], which better reflects what it is.&lt;br /&gt;
* It introduces two new object Classes:  &lt;br /&gt;
** [[Struct]] lets you bundle disparate values, like text, numbeers, atoms and arrays, together in one object that does not array abstract -- similar to Records and Classes in other languages).  &lt;br /&gt;
** [[Callable]] is like a user-defined Function but it's Definition can be a [[handle]] to a Python class or a Python function. &lt;br /&gt;
* [[ParseJSON]] and [[MakeJSON]] now use Structs, which are much more convenient for representing the hierarchical structure of JSON.&lt;br /&gt;
* [[#SpreadsheetOpen|Read and write spreadsheets without Excel]]:  This is faster and more robust, and you don't need Excel installed.&lt;br /&gt;
&lt;br /&gt;
== [[Using Python from Analytica|Python integration]] ==&lt;br /&gt;
&lt;br /&gt;
You can now write Python code inside Analytica definitions! It's easy to call Python functions, with Analytica-style Intelligent Arrays!. So you can access the vast ecosystem of Python libraries (''modules'' in Python lingo). Among the gazillion possibilities are specialized libraries for data visualization, statistics, machine learning, and much more.&lt;br /&gt;
It means that you can mix and match Analytica and Python -- write Analytica code for what's easiest in Analytica and Python code for what's easiest in Python.  &lt;br /&gt;
&lt;br /&gt;
See: [[Using Python from Analytica]]&lt;br /&gt;
(In [[Analytica Developer]] edition or better). &lt;br /&gt;
&lt;br /&gt;
For the Analytica modeler, this puts a ton of resources at your fingertips. &lt;br /&gt;
&lt;br /&gt;
It's also pretty cool for the Python developer. Analytica is like a new interactive development environment with a lot of unique advantages, especially during interactive code development:&lt;br /&gt;
* Analytica's dependency maintenance can be really convenient during interactive development, creating automatic dependency maintenance between your Python functions, classes and variables that don't exist in Python.&lt;br /&gt;
* The visual influence diagram layout can be a super useful to way organize and visualize your code.&lt;br /&gt;
* It naturally encourages declarative code practices, which leads to better and more maintainable coding style.&lt;br /&gt;
* You get the benefits of Analytica's edit tables, plus for results, Analytica's multi-D result tables and one-click, no-code, graphing.&lt;br /&gt;
* It is easy to wrap existing Python models to get Monte Carlo, parametric analysis and sensitivity analysis with Analytica ease.&lt;br /&gt;
* Sometimes one or the other language is more convenient for a particular task. You can freely switch between whichever language feels better suited to the immediate task, and intermix languages easily.&lt;br /&gt;
&lt;br /&gt;
== Developer Edition (formerly known as Enterprise) ==&lt;br /&gt;
&lt;br /&gt;
Analytica's middle-tier edition formerly known as the ''Enterprise Edition'', it is now called the [[Analytica Developer|Analytica Developer edition]]. That name better reflects what it is--software for developers of decision applications.  If you're now a user of Analytica Enterprise you don't have to update your license or do anything special. The name will just change when you install Analytica 7.0.  In Analytica docs, when you select &amp;quot;7.0&amp;quot; on the release bar (at the top of pages that have release-contingent content), all the docs automatically use the new Analytica Developer edition name. &lt;br /&gt;
&lt;br /&gt;
== Analytica language extensions ==&lt;br /&gt;
&lt;br /&gt;
=== Index label auto updates ===&lt;br /&gt;
&lt;br /&gt;
When you change a text label in an Index, it can update code to use the new text label. Iit automatically updates text literals in other expressions that compare to or subscript on an index. The new [[Index-label dot syntax]] ( &amp;lt;code&amp;gt;I . &amp;quot;label&amp;quot;&amp;lt;/code&amp;gt;) associates a text literal with its index to prevent it from getting out of sync, and to warn if it ever does. These [[Keeping text literals consistent with index labels| features]] help avoid common errors when updating text labels in Indexes. &lt;br /&gt;
&lt;br /&gt;
=== Callable ===&lt;br /&gt;
&lt;br /&gt;
The new object [[Class]] [[Callable]] is a variable-like object, meaning it has a [[Definition]] and a computed value, but can be used for convenience and documentation when the computed value itself is something that can be called, such as a [[Local function]] (aka ''lambda function''), a [[handle]] to an global function, a Python class or a Python function.&lt;br /&gt;
&lt;br /&gt;
If you &amp;quot;compute&amp;quot; the identity of a callable data item inside a normal [[Variable]] instance, &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;, you could call it using the syntax &amp;lt;code&amp;gt;X-&amp;gt;(a,b,c)&amp;lt;/code&amp;gt;. On your influence diagram the object would have a rounded rectangle and thus would not communicate that the result is something that can be called. When you change its class to be a [[Callable]], you can then invoke the call using the syntax &amp;lt;code&amp;gt;X(a,b,c)&amp;lt;/code&amp;gt; and the shape of the node changes to something that resembles a function shape, thus communicating that this holds something that is callable.&lt;br /&gt;
&lt;br /&gt;
To create a callable, first create a [[Variable]] node, then use the [[Class]] dropdown from the [[Object window]] or [[Attribute pane]] to change the class to ''Callable''.&lt;br /&gt;
&lt;br /&gt;
=== Struct ===&lt;br /&gt;
A [[Struct]] defines a new atomic, immutable data type. For use when you need to bundle multiple heterogeneous items and don't want their dimensionalities to interact. Array abstract treats an instance of a Struct as a single cell (an atom).&lt;br /&gt;
&lt;br /&gt;
=== Expression and Lazy qualifiers ===&lt;br /&gt;
An expression passed to a function parameter declared with the qualifier as &amp;lt;code&amp;gt;[[Function_parameter_qualifiers#Expression|Expression]]&amp;lt;/code&amp;gt; can now include local variable identifiers. The local variables are captured (similar to how they would be captured by a [[Local function]]).&lt;br /&gt;
&lt;br /&gt;
A new function parameter qualifier, [[Function_parameter_qualifiers#Lazy]], has been added, which does lazy evaluation of the expression passed to it. In the function Definition, you can use it as if it were a normal value parameter, but evaluation occurs when the value is used rather than when the function is called, and in the evaluation context (which includes the [[Evaluation modes|evaluation mode]]) where the value is used instead as in the context of the call.&lt;br /&gt;
&lt;br /&gt;
=== Excess parameter qualifier ===&lt;br /&gt;
A new function declaration allows a function to tolerate or capture excess named parameters in the call that are not declared as parameter names in the function's Parameters declaration. It can also be used in a [[Struct]] declaration.&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
=== ParseJSON ===&lt;br /&gt;
Changed to parse to [[Struct]]s, thus greatly simplifying and improving the convenience of using JSON in Analytica expressions. &lt;br /&gt;
&lt;br /&gt;
For parsing with a schema, a Struct's declaration serves as the schema, which is far easier and more familiar for an Analytica user than the former scheme for specifying a schema.&lt;br /&gt;
&lt;br /&gt;
[[MakeJSON]] is able to generate JSON from a Struct (or nested structs) as well, which is the most convenient representation for JSON representations.&lt;br /&gt;
&lt;br /&gt;
=== SpreadsheetOpen ===&lt;br /&gt;
Added a new «backend» parameter to [[SpreadsheetOpen]] with a new option of &amp;lt;code&amp;gt;'LibXl'&amp;lt;/code&amp;gt;, allowing you to read and manipulate a spreadsheet without having Excel installed. But unlike the Excel backend, the &amp;lt;b&amp;gt;LibXl&amp;lt;/b&amp;gt; option does not have a calculation engine (so can't recompute cell formulas after you change cells). This option is be better when you simply want to read (or write) data in a *.xlsx file format.&lt;br /&gt;
&lt;br /&gt;
== Example models and libraries ==&lt;br /&gt;
&lt;br /&gt;
* There is a new &amp;quot;Auto insurance claim risk analysis.ana&amp;quot; in the Example Models / Risk Analysis folder.&lt;br /&gt;
* The [[Mutables library]] has been updated. It provides a new [[Mutable]] [[Struct]] which is superior to the older representation, which displays the actual value in result table cells and is atomic. The legacy functions ([[MutableNew]], [[MutableSet]] and [[MutableGet]]) are still there for backward compatibility, but have been changed to just wrap the new Mutable.&lt;br /&gt;
&lt;br /&gt;
== Result tables and graphs ==&lt;br /&gt;
* A blank (none) entry was added to the [[XY_comparison#Use_comparison_index|comparison index pulldown]]. Use this to quickly unset the comparison index without having to re-enter the [[XY_comparison]] dialog. Also, the pulldown is now visible and enabled in browse mode.&lt;br /&gt;
* Comparison variables are no longer summed over slicer indexes that are set to '''Totals''' when the value for that variable does not include the slicer index. Note that this results in some changes to what is displayed in table body cells and in axis scaling on graphs.&lt;br /&gt;
&lt;br /&gt;
== Assista ==&lt;br /&gt;
&lt;br /&gt;
You can now copy-paste from Expression blocks in Assista's response using the little copy icon in the top-right corner of the expression block.&lt;br /&gt;
&lt;br /&gt;
== Experimental ==&lt;br /&gt;
* A way for an Analytica model running in desktop Analytica to [[MCP server in Analytica|act as a Model Context Protocol (MCP) server]].&lt;br /&gt;
&lt;br /&gt;
== ADE ==&lt;br /&gt;
* Added a new example: &amp;lt;code&amp;gt;Mcp_server&amp;lt;/code&amp;gt;.  This is an MCP server that wraps ADE. Among other things, it can give AI agents like Claude Code the ability to build, explore and use Analytica models.&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.0%3F&amp;diff=63690</id>
		<title>What's new in Analytica 7.0?</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.0%3F&amp;diff=63690"/>
		<updated>2026-01-28T00:27:02Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: /* Python integration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:What's new pages]]&lt;br /&gt;
[[category:Analytica releases]]&lt;br /&gt;
&lt;br /&gt;
[[Analytica 7.0]] will be the next major Analytica release and is currently in [[Beta Tester Page|beta testing]]. Go to [[Beta Tester Page]] to try it. The current official release is [[Analytica 6.6]]. &lt;br /&gt;
&lt;br /&gt;
==Highlights of Analytica 7.0==&lt;br /&gt;
&lt;br /&gt;
* '''Python integration:''' The major enhancement is integration with Python and hence the entire Python ecosystem of libraries. You can easily call functions from Python libraries, access Python variables, and even write Python code right inside Analytica variables and functions. So now you can mix and match Analytica and Python according to which language you think best for your modeling or coding needs.&lt;br /&gt;
*  '''Index label updating:''' A common source of errors has been when you change a text label in an Index without remembering to change expressions that refer to that same text label. [[# Index label auto updates|New features]] now automatically update these labels, and so eliminate most of those errors.&lt;br /&gt;
*  '''Enterprise renamed Developer edition:''' The Analytica Enterprise edition has been renamed the [[#Developer Edition (formerly known as Enterprise) |Developer edition]], which better reflects what it is.&lt;br /&gt;
* It introduces two new object Classes:  &lt;br /&gt;
** [[Struct]] lets you bundle disparate values, like text, numbeers, atoms and arrays, together in one object that does not array abstract -- similar to Records and Classes in other languages).  &lt;br /&gt;
** [[Callable]] is like a user-defined Function but it's Definition can be a [[handle]] to a Python class or a Python function. &lt;br /&gt;
* [[ParseJSON]] and [[MakeJSON]] now use Structs, which are much more convenient for representing the hierarchical structure of JSON.&lt;br /&gt;
* [[#SpreadsheetOpen|Read and write spreadsheets without Excel]]:  This is faster and more robust, and you don't need Excel installed.&lt;br /&gt;
&lt;br /&gt;
== [[Using Python from Analytica|Python integration]] ==&lt;br /&gt;
&lt;br /&gt;
You can now write Python code inside Analytica definitions! It's easy to call Python functions, with Analytica-style Intelligent Arrays!. So you can access the vast ecosystem of Python libraries (''modules'' in Python lingo). Among the gazillion possibilities are specialized libraries for data visualization, statistics, machine learning, and much more.&lt;br /&gt;
It means that you can mix and match Analytica and Python -- write Analytica code for what's easiest in Analytica and Python code for what's easiest in Python.  &lt;br /&gt;
&lt;br /&gt;
See: [[Using Python from Analytica]]&lt;br /&gt;
(In [[Analytica Developer]] edition or better). &lt;br /&gt;
&lt;br /&gt;
For the Analytica modeler, this puts a ton of resources at your fingertips. &lt;br /&gt;
&lt;br /&gt;
It's also pretty cool for the Python developer. Analytica is like a new interactive development environment with a lot of unique advantages, especially during interactive code development:&lt;br /&gt;
* Analytica's dependency maintenance can be really convenient during interactive development, creating automatic dependency maintenance between your Python functions, classes and variables that don't exist in Python.&lt;br /&gt;
* The visual influence diagram layout can be a super useful to way organize and visualize your code.&lt;br /&gt;
* It naturally encourages declarative code practices, which leads to better and more maintainable coding style.&lt;br /&gt;
* You get the benefits of Analytica's edit tables, plus for results, Analytica's multi-D result tables and one-click, no-code, graphing.&lt;br /&gt;
* It is easy to wrap existing Python models to get Monte Carlo, parametric analysis and sensitivity analysis with Analytica ease.&lt;br /&gt;
* Sometimes one or the other language is more convenient for a particular task. You can freely switch between whichever language feels better suited to the immediate task, and intermix languages easily.&lt;br /&gt;
&lt;br /&gt;
== Developer Edition (formerly known as Enterprise) ==&lt;br /&gt;
&lt;br /&gt;
Analytica's middle-tier edition formerly known as the ''Enterprise Edition'', it is now called the [[Analytica Developer|Analytica Developer edition]]. That name better reflects what it is--software for developers of decision applications.  If you're now a user of Analytica Enterprise you don't have to update your license or do anything special. The name will just change when you install Analytica 7.0.  In Analytica docs, when you select &amp;quot;7.0&amp;quot; on the release bar (at the top of pages that have release-contingent content), all the docs automatically use the new Analytica Developer edition name. &lt;br /&gt;
&lt;br /&gt;
== Analytica language extensions ==&lt;br /&gt;
&lt;br /&gt;
=== Index label auto updates ===&lt;br /&gt;
&lt;br /&gt;
When you change a text label in an Index, it can update code to use the new text label. Iit automatically updates text literals in other expressions that compare to or subscript on an index. The new [[Index-label dot syntax]] ( &amp;lt;code&amp;gt;I . &amp;quot;label&amp;quot;&amp;lt;/code&amp;gt;) associates a text literal with its index to prevent it from getting out of sync, and to warn if it ever does. These [[Keeping text literals consistent with index labels| features]] help avoid common errors when updating text labels in Indexes. &lt;br /&gt;
&lt;br /&gt;
=== Callable ===&lt;br /&gt;
&lt;br /&gt;
The new object [[Class]] [[Callable]] is a variable-like object, meaning it has a [[Definition]] and a computed value, but can be used for convenience and documentation when the computed value itself is something that can be called, such as a [[Local function]] (aka ''lambda function''), a [[handle]] to an global function, a Python class or a Python function.&lt;br /&gt;
&lt;br /&gt;
If you &amp;quot;compute&amp;quot; the identity of a callable data item inside a normal [[Variable]] instance, &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;, you could call it using the syntax &amp;lt;code&amp;gt;X-&amp;gt;(a,b,c)&amp;lt;/code&amp;gt;. On your influence diagram the object would have a rounded rectangle and thus would not communicate that the result is something that can be called. When you change its class to be a [[Callable]], you can then invoke the call using the syntax &amp;lt;code&amp;gt;X(a,b,c)&amp;lt;/code&amp;gt; and the shape of the node changes to something that resembles a function shape, thus communicating that this holds something that is callable.&lt;br /&gt;
&lt;br /&gt;
To create a callable, first create a [[Variable]] node, then use the [[Class]] dropdown from the [[Object window]] or [[Attribute pane]] to change the class to ''Callable''.&lt;br /&gt;
&lt;br /&gt;
=== Struct ===&lt;br /&gt;
A [[Struct]] defines a new atomic, immutable data type. For use when you need to bundle multiple heterogeneous items and don't want their dimensionalities to interact. Array abstract treats an instance of a Struct as a single cell (an atom).&lt;br /&gt;
&lt;br /&gt;
=== Expression and Lazy qualifiers ===&lt;br /&gt;
An expression passed to a function parameter declared with the qualifier as &amp;lt;code&amp;gt;[[Function_parameter_qualifiers#Expression|Expression]]&amp;lt;/code&amp;gt; can now include local variable identifiers. The local variables are captured (similar to how they would be captured by a [[Local function]]).&lt;br /&gt;
&lt;br /&gt;
A new function parameter qualifier, [[Function_parameter_qualifiers#Lazy]], has been added, which does lazy evaluation of the expression passed to it. In the function Definition, you can use it as if it were a normal value parameter, but evaluation occurs when the value is used rather than when the function is called, and in the evaluation context (which includes the [[Evaluation modes|evaluation mode]]) where the value is used instead as in the context of the call.&lt;br /&gt;
&lt;br /&gt;
=== Excess parameter qualifier ===&lt;br /&gt;
A new function declaration allows a function to tolerate or capture excess named parameters in the call that are not declared as parameter names in the function's Parameters declaration. It can also be used in a [[Struct]] declaration.&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
=== ParseJSON ===&lt;br /&gt;
Changed to parse to [[Struct]]s, thus greatly simplifying and improving the convenience of using JSON in Analytica expressions. &lt;br /&gt;
&lt;br /&gt;
For parsing with a schema, a Struct's declaration serves as the schema, which is far easier and more familiar for an Analytica user than the former scheme for specifying a schema.&lt;br /&gt;
&lt;br /&gt;
[[MakeJSON]] is able to generate JSON from a Struct (or nested structs) as well, which is the most convenient representation for JSON representations.&lt;br /&gt;
&lt;br /&gt;
=== SpreadsheetOpen ===&lt;br /&gt;
Added a new «backend» parameter to [[SpreadsheetOpen]] with a new option of &amp;lt;code&amp;gt;'LibXl'&amp;lt;/code&amp;gt;, allowing you to read and manipulate a spreadsheet without having Excel installed. But unlike the Excel backend, the &amp;lt;b&amp;gt;LibXl&amp;lt;/b&amp;gt; option does not have a calculation engine (so can't recompute cell formulas after you change cells). This option is be better when you simply want to read (or write) data in a *.xlsx file format.&lt;br /&gt;
&lt;br /&gt;
== Example models and libraries ==&lt;br /&gt;
&lt;br /&gt;
* There is a new &amp;quot;Auto insurance claim risk analysis.ana&amp;quot; in the Example Models / Risk Analysis folder.&lt;br /&gt;
* The [[Mutables library]] has been updated. It provides a new [[Mutable]] [[Struct]] which is superior to the older representation, which displays the actual value in result table cells and is atomic. The legacy functions ([[MutableNew]], [[MutableSet]] and [[MutableGet]]) are still there for backward compatibility, but have been changed to just wrap the new Mutable.&lt;br /&gt;
&lt;br /&gt;
== Result tables and graphs ==&lt;br /&gt;
* A blank (none) entry was added to the [[XY_comparison#Use_comparison_index|comparison index pulldown]]. Use this to quickly unset the comparison index without having to re-enter the [[XY_comparison]] dialog. Also, the pulldown is now visible and enabled in browse mode.&lt;br /&gt;
* Comparison variables are no longer summed over slicer indexes that are set to '''Totals''' when the value for that variable does not include the slicer index. Note that this results in some changes to what is displayed in table body cells and in axis scaling on graphs.&lt;br /&gt;
&lt;br /&gt;
== Assista ==&lt;br /&gt;
&lt;br /&gt;
You can now copy-paste from Expression blocks in Assista's response using the little copy icon in the top-right corner of the expression block.&lt;br /&gt;
&lt;br /&gt;
== Experimental ==&lt;br /&gt;
* A way for an Analytica model running in desktop Analytica to [[MCP server in Analytica|act as a Model Context Protocol (MCP) server]].&lt;br /&gt;
&lt;br /&gt;
== ADE ==&lt;br /&gt;
* Added a new example: &amp;lt;code&amp;gt;Mcp_server&amp;lt;/code&amp;gt;.  This is an MCP server that wraps ADE. Among other things, it can give AI agents like Claude Code the ability to build, explore and use Analytica models.&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.0%3F&amp;diff=63689</id>
		<title>What's new in Analytica 7.0?</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.0%3F&amp;diff=63689"/>
		<updated>2026-01-28T00:12:18Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: /* Highlights of Analytica 7.0 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:What's new pages]]&lt;br /&gt;
[[category:Analytica releases]]&lt;br /&gt;
&lt;br /&gt;
[[Analytica 7.0]] will be the next major Analytica release and is currently in [[Beta Tester Page|beta testing]]. Go to [[Beta Tester Page]] to try it. The current official release is [[Analytica 6.6]]. &lt;br /&gt;
&lt;br /&gt;
==Highlights of Analytica 7.0==&lt;br /&gt;
&lt;br /&gt;
* '''Python integration:''' The major enhancement is integration with Python and hence the entire Python ecosystem of libraries. You can easily call functions from Python libraries, access Python variables, and even write Python code right inside Analytica variables and functions. So now you can mix and match Analytica and Python according to which language you think best for your modeling or coding needs.&lt;br /&gt;
*  '''Index label updating:''' A common source of errors has been when you change a text label in an Index without remembering to change expressions that refer to that same text label. [[# Index label auto updates|New features]] now automatically update these labels, and so eliminate most of those errors.&lt;br /&gt;
*  '''Enterprise renamed Developer edition:''' The Analytica Enterprise edition has been renamed the [[#Developer Edition (formerly known as Enterprise) |Developer edition]], which better reflects what it is.&lt;br /&gt;
* It introduces two new object Classes:  &lt;br /&gt;
** [[Struct]] lets you bundle disparate values, like text, numbeers, atoms and arrays, together in one object that does not array abstract -- similar to Records and Classes in other languages).  &lt;br /&gt;
** [[Callable]] is like a user-defined Function but it's Definition can be a [[handle]] to a Python class or a Python function. &lt;br /&gt;
* [[ParseJSON]] and [[MakeJSON]] now use Structs, which are much more convenient for representing the hierarchical structure of JSON.&lt;br /&gt;
* [[#SpreadsheetOpen|Read and write spreadsheets without Excel]]:  This is faster and more robust, and you don't need Excel installed.&lt;br /&gt;
&lt;br /&gt;
== [[Using Python from Analytica|Python integration]] ==&lt;br /&gt;
&lt;br /&gt;
You can now benefit from the large ecosystem of Python libraries from the [[Analytica Developer]] edition or better (i.e., [[Analytica Optimizer]] edition or [[ADE]]). Use Python libraries (called modules in Python lingo) or Python code directly from your Analytica model, and it is super easy and convenient to do so!  Among the gazillion possibilities are specialized data visualizations, using machine learning libraries, third party libraries, etc. &lt;br /&gt;
&lt;br /&gt;
See: [[Using Python from Analytica]]&lt;br /&gt;
&lt;br /&gt;
For the Analytica modeler, this puts a ton of resources at your fingertips.&lt;br /&gt;
&lt;br /&gt;
For the Python developer, this is also pretty cool. Analytica is like a new interactive development environment in which there are a lot of unique advantages, especially during interactive code development, including these:&lt;br /&gt;
* Analytica's dependency maintenance can be really convenient during interactive development, creating automatic dependency maintenance between your python functions, classes and variables that don't exist in Python.&lt;br /&gt;
* The visual influence diagram layout can be a super useful to way organize and visualize your code.&lt;br /&gt;
* It naturally encourages declarative code practices, which leads to better and more maintainable coding style.&lt;br /&gt;
* You get the benefits of Analytica's edit tables, plus for results, Analytica's multi-D result tables and one-click, no-code, graphing.&lt;br /&gt;
* It is easy to wrap existing Python models to get Monte Carlo, parametric analysis and sensitivity analysis with Analytica ease.&lt;br /&gt;
* Sometimes one or the other language is more convenient for a particular task. You can freely switch between whichever language feels better suited to the immediate task, and intermix languages easily.&lt;br /&gt;
&lt;br /&gt;
== Developer Edition (formerly known as Enterprise) ==&lt;br /&gt;
&lt;br /&gt;
Analytica's middle-tier edition formerly known as the ''Enterprise Edition'', it is now called the [[Analytica Developer|Analytica Developer edition]]. That name better reflects what it is--software for developers of decision applications.  If you're now a user of Analytica Enterprise you don't have to update your license or do anything special. The name will just change when you install Analytica 7.0.  In Analytica docs, when you select &amp;quot;7.0&amp;quot; on the release bar (at the top of pages that have release-contingent content), all the docs automatically use the new Analytica Developer edition name. &lt;br /&gt;
&lt;br /&gt;
== Analytica language extensions ==&lt;br /&gt;
&lt;br /&gt;
=== Index label auto updates ===&lt;br /&gt;
&lt;br /&gt;
When you change a text label in an Index, it can update code to use the new text label. Iit automatically updates text literals in other expressions that compare to or subscript on an index. The new [[Index-label dot syntax]] ( &amp;lt;code&amp;gt;I . &amp;quot;label&amp;quot;&amp;lt;/code&amp;gt;) associates a text literal with its index to prevent it from getting out of sync, and to warn if it ever does. These [[Keeping text literals consistent with index labels| features]] help avoid common errors when updating text labels in Indexes. &lt;br /&gt;
&lt;br /&gt;
=== Callable ===&lt;br /&gt;
&lt;br /&gt;
The new object [[Class]] [[Callable]] is a variable-like object, meaning it has a [[Definition]] and a computed value, but can be used for convenience and documentation when the computed value itself is something that can be called, such as a [[Local function]] (aka ''lambda function''), a [[handle]] to an global function, a Python class or a Python function.&lt;br /&gt;
&lt;br /&gt;
If you &amp;quot;compute&amp;quot; the identity of a callable data item inside a normal [[Variable]] instance, &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;, you could call it using the syntax &amp;lt;code&amp;gt;X-&amp;gt;(a,b,c)&amp;lt;/code&amp;gt;. On your influence diagram the object would have a rounded rectangle and thus would not communicate that the result is something that can be called. When you change its class to be a [[Callable]], you can then invoke the call using the syntax &amp;lt;code&amp;gt;X(a,b,c)&amp;lt;/code&amp;gt; and the shape of the node changes to something that resembles a function shape, thus communicating that this holds something that is callable.&lt;br /&gt;
&lt;br /&gt;
To create a callable, first create a [[Variable]] node, then use the [[Class]] dropdown from the [[Object window]] or [[Attribute pane]] to change the class to ''Callable''.&lt;br /&gt;
&lt;br /&gt;
=== Struct ===&lt;br /&gt;
A [[Struct]] defines a new atomic, immutable data type. For use when you need to bundle multiple heterogeneous items and don't want their dimensionalities to interact. Array abstract treats an instance of a Struct as a single cell (an atom).&lt;br /&gt;
&lt;br /&gt;
=== Expression and Lazy qualifiers ===&lt;br /&gt;
An expression passed to a function parameter declared with the qualifier as &amp;lt;code&amp;gt;[[Function_parameter_qualifiers#Expression|Expression]]&amp;lt;/code&amp;gt; can now include local variable identifiers. The local variables are captured (similar to how they would be captured by a [[Local function]]).&lt;br /&gt;
&lt;br /&gt;
A new function parameter qualifier, [[Function_parameter_qualifiers#Lazy]], has been added, which does lazy evaluation of the expression passed to it. In the function Definition, you can use it as if it were a normal value parameter, but evaluation occurs when the value is used rather than when the function is called, and in the evaluation context (which includes the [[Evaluation modes|evaluation mode]]) where the value is used instead as in the context of the call.&lt;br /&gt;
&lt;br /&gt;
=== Excess parameter qualifier ===&lt;br /&gt;
A new function declaration allows a function to tolerate or capture excess named parameters in the call that are not declared as parameter names in the function's Parameters declaration. It can also be used in a [[Struct]] declaration.&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
=== ParseJSON ===&lt;br /&gt;
Changed to parse to [[Struct]]s, thus greatly simplifying and improving the convenience of using JSON in Analytica expressions. &lt;br /&gt;
&lt;br /&gt;
For parsing with a schema, a Struct's declaration serves as the schema, which is far easier and more familiar for an Analytica user than the former scheme for specifying a schema.&lt;br /&gt;
&lt;br /&gt;
[[MakeJSON]] is able to generate JSON from a Struct (or nested structs) as well, which is the most convenient representation for JSON representations.&lt;br /&gt;
&lt;br /&gt;
=== SpreadsheetOpen ===&lt;br /&gt;
Added a new «backend» parameter to [[SpreadsheetOpen]] with a new option of &amp;lt;code&amp;gt;'LibXl'&amp;lt;/code&amp;gt;, allowing you to read and manipulate a spreadsheet without having Excel installed. But unlike the Excel backend, the &amp;lt;b&amp;gt;LibXl&amp;lt;/b&amp;gt; option does not have a calculation engine (so can't recompute cell formulas after you change cells). This option is be better when you simply want to read (or write) data in a *.xlsx file format.&lt;br /&gt;
&lt;br /&gt;
== Example models and libraries ==&lt;br /&gt;
&lt;br /&gt;
* There is a new &amp;quot;Auto insurance claim risk analysis.ana&amp;quot; in the Example Models / Risk Analysis folder.&lt;br /&gt;
* The [[Mutables library]] has been updated. It provides a new [[Mutable]] [[Struct]] which is superior to the older representation, which displays the actual value in result table cells and is atomic. The legacy functions ([[MutableNew]], [[MutableSet]] and [[MutableGet]]) are still there for backward compatibility, but have been changed to just wrap the new Mutable.&lt;br /&gt;
&lt;br /&gt;
== Result tables and graphs ==&lt;br /&gt;
* A blank (none) entry was added to the [[XY_comparison#Use_comparison_index|comparison index pulldown]]. Use this to quickly unset the comparison index without having to re-enter the [[XY_comparison]] dialog. Also, the pulldown is now visible and enabled in browse mode.&lt;br /&gt;
* Comparison variables are no longer summed over slicer indexes that are set to '''Totals''' when the value for that variable does not include the slicer index. Note that this results in some changes to what is displayed in table body cells and in axis scaling on graphs.&lt;br /&gt;
&lt;br /&gt;
== Assista ==&lt;br /&gt;
&lt;br /&gt;
You can now copy-paste from Expression blocks in Assista's response using the little copy icon in the top-right corner of the expression block.&lt;br /&gt;
&lt;br /&gt;
== Experimental ==&lt;br /&gt;
* A way for an Analytica model running in desktop Analytica to [[MCP server in Analytica|act as a Model Context Protocol (MCP) server]].&lt;br /&gt;
&lt;br /&gt;
== ADE ==&lt;br /&gt;
* Added a new example: &amp;lt;code&amp;gt;Mcp_server&amp;lt;/code&amp;gt;.  This is an MCP server that wraps ADE. Among other things, it can give AI agents like Claude Code the ability to build, explore and use Analytica models.&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.0%3F&amp;diff=63688</id>
		<title>What's new in Analytica 7.0?</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.0%3F&amp;diff=63688"/>
		<updated>2026-01-27T22:59:04Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: /* Highlights of Analytica 7.0 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:What's new pages]]&lt;br /&gt;
[[category:Analytica releases]]&lt;br /&gt;
&lt;br /&gt;
[[Analytica 7.0]] will be the next major Analytica release and is currently in [[Beta Tester Page|beta testing]]. Go to [[Beta Tester Page]] to try it. The current official release is [[Analytica 6.6]]. &lt;br /&gt;
&lt;br /&gt;
==Highlights of Analytica 7.0==&lt;br /&gt;
&lt;br /&gt;
* '''Python integration:''' The major enhancement is integration with Python and hence the entire Python ecosystem of libraries. You can easily call functions from Python libraries, access Python variables, and even write Python code right inside Analytica variables and functions. So now you can mix and match Analytica and Python according to which language you think best for your modeling or coding needs.&lt;br /&gt;
*  '''Index label updating:''' A common source of errors has been when you change a text label in an Index without remembering to change expressions that refer to that same text label. [[# Index label auto updates|New features]] now automatically update these labels, and so eliminate most of those errors.&lt;br /&gt;
*  '''Enterprise renamed Developer edition:''' The Analytica Enterprise edition has been renamed the [[#Developer Edition (formerly known as Enterprise) |Developer edition]], which better reflects what it is.&lt;br /&gt;
* It introduces two new object Classes:  &lt;br /&gt;
** [[Struct]] lets you bundle disparate values, like text, numbeers, atoms and arrays, together in one object that does not array abstract -- similar to Records and Classes in other languages).  &lt;br /&gt;
** [[Callable]] is like a user-defined Function but it's Definition can be a [[handle]] to a Python class or a Python function. &lt;br /&gt;
* [[ParseJSON]] and [[MakeJSON]] now use Structs, which are much more convenient for representing the hierarchical structure of JSON.&lt;br /&gt;
&lt;br /&gt;
== [[Using Python from Analytica|Python integration]] ==&lt;br /&gt;
&lt;br /&gt;
You can now benefit from the large ecosystem of Python libraries from the [[Analytica Developer]] edition or better (i.e., [[Analytica Optimizer]] edition or [[ADE]]). Use Python libraries (called modules in Python lingo) or Python code directly from your Analytica model, and it is super easy and convenient to do so!  Among the gazillion possibilities are specialized data visualizations, using machine learning libraries, third party libraries, etc. &lt;br /&gt;
&lt;br /&gt;
See: [[Using Python from Analytica]]&lt;br /&gt;
&lt;br /&gt;
For the Analytica modeler, this puts a ton of resources at your fingertips.&lt;br /&gt;
&lt;br /&gt;
For the Python developer, this is also pretty cool. Analytica is like a new interactive development environment in which there are a lot of unique advantages, especially during interactive code development, including these:&lt;br /&gt;
* Analytica's dependency maintenance can be really convenient during interactive development, creating automatic dependency maintenance between your python functions, classes and variables that don't exist in Python.&lt;br /&gt;
* The visual influence diagram layout can be a super useful to way organize and visualize your code.&lt;br /&gt;
* It naturally encourages declarative code practices, which leads to better and more maintainable coding style.&lt;br /&gt;
* You get the benefits of Analytica's edit tables, plus for results, Analytica's multi-D result tables and one-click, no-code, graphing.&lt;br /&gt;
* It is easy to wrap existing Python models to get Monte Carlo, parametric analysis and sensitivity analysis with Analytica ease.&lt;br /&gt;
* Sometimes one or the other language is more convenient for a particular task. You can freely switch between whichever language feels better suited to the immediate task, and intermix languages easily.&lt;br /&gt;
&lt;br /&gt;
== Developer Edition (formerly known as Enterprise) ==&lt;br /&gt;
&lt;br /&gt;
Analytica's middle-tier edition formerly known as the ''Enterprise Edition'', it is now called the [[Analytica Developer|Analytica Developer edition]]. That name better reflects what it is--software for developers of decision applications.  If you're now a user of Analytica Enterprise you don't have to update your license or do anything special. The name will just change when you install Analytica 7.0.  In Analytica docs, when you select &amp;quot;7.0&amp;quot; on the release bar (at the top of pages that have release-contingent content), all the docs automatically use the new Analytica Developer edition name. &lt;br /&gt;
&lt;br /&gt;
== Analytica language extensions ==&lt;br /&gt;
&lt;br /&gt;
=== Index label auto updates ===&lt;br /&gt;
&lt;br /&gt;
When you change a text label in an Index, it can update code to use the new text label. Iit automatically updates text literals in other expressions that compare to or subscript on an index. The new [[Index-label dot syntax]] ( &amp;lt;code&amp;gt;I . &amp;quot;label&amp;quot;&amp;lt;/code&amp;gt;) associates a text literal with its index to prevent it from getting out of sync, and to warn if it ever does. These [[Keeping text literals consistent with index labels| features]] help avoid common errors when updating text labels in Indexes. &lt;br /&gt;
&lt;br /&gt;
=== Callable ===&lt;br /&gt;
&lt;br /&gt;
The new object [[Class]] [[Callable]] is a variable-like object, meaning it has a [[Definition]] and a computed value, but can be used for convenience and documentation when the computed value itself is something that can be called, such as a [[Local function]] (aka ''lambda function''), a [[handle]] to an global function, a Python class or a Python function.&lt;br /&gt;
&lt;br /&gt;
If you &amp;quot;compute&amp;quot; the identity of a callable data item inside a normal [[Variable]] instance, &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;, you could call it using the syntax &amp;lt;code&amp;gt;X-&amp;gt;(a,b,c)&amp;lt;/code&amp;gt;. On your influence diagram the object would have a rounded rectangle and thus would not communicate that the result is something that can be called. When you change its class to be a [[Callable]], you can then invoke the call using the syntax &amp;lt;code&amp;gt;X(a,b,c)&amp;lt;/code&amp;gt; and the shape of the node changes to something that resembles a function shape, thus communicating that this holds something that is callable.&lt;br /&gt;
&lt;br /&gt;
To create a callable, first create a [[Variable]] node, then use the [[Class]] dropdown from the [[Object window]] or [[Attribute pane]] to change the class to ''Callable''.&lt;br /&gt;
&lt;br /&gt;
=== Struct ===&lt;br /&gt;
A [[Struct]] defines a new atomic, immutable data type. For use when you need to bundle multiple heterogeneous items and don't want their dimensionalities to interact. Array abstract treats an instance of a Struct as a single cell (an atom).&lt;br /&gt;
&lt;br /&gt;
=== Expression and Lazy qualifiers ===&lt;br /&gt;
An expression passed to a function parameter declared with the qualifier as &amp;lt;code&amp;gt;[[Function_parameter_qualifiers#Expression|Expression]]&amp;lt;/code&amp;gt; can now include local variable identifiers. The local variables are captured (similar to how they would be captured by a [[Local function]]).&lt;br /&gt;
&lt;br /&gt;
A new function parameter qualifier, [[Function_parameter_qualifiers#Lazy]], has been added, which does lazy evaluation of the expression passed to it. In the function Definition, you can use it as if it were a normal value parameter, but evaluation occurs when the value is used rather than when the function is called, and in the evaluation context (which includes the [[Evaluation modes|evaluation mode]]) where the value is used instead as in the context of the call.&lt;br /&gt;
&lt;br /&gt;
=== Excess parameter qualifier ===&lt;br /&gt;
A new function declaration allows a function to tolerate or capture excess named parameters in the call that are not declared as parameter names in the function's Parameters declaration. It can also be used in a [[Struct]] declaration.&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
=== ParseJSON ===&lt;br /&gt;
Changed to parse to [[Struct]]s, thus greatly simplifying and improving the convenience of using JSON in Analytica expressions. &lt;br /&gt;
&lt;br /&gt;
For parsing with a schema, a Struct's declaration serves as the schema, which is far easier and more familiar for an Analytica user than the former scheme for specifying a schema.&lt;br /&gt;
&lt;br /&gt;
[[MakeJSON]] is able to generate JSON from a Struct (or nested structs) as well, which is the most convenient representation for JSON representations.&lt;br /&gt;
&lt;br /&gt;
=== SpreadsheetOpen ===&lt;br /&gt;
Added a new «backend» parameter to [[SpreadsheetOpen]] with a new option of &amp;lt;code&amp;gt;'LibXl'&amp;lt;/code&amp;gt;, allowing you to read and manipulate a spreadsheet without having Excel installed. But unlike the Excel backend, the &amp;lt;b&amp;gt;LibXl&amp;lt;/b&amp;gt; option does not have a calculation engine (so can't recompute cell formulas after you change cells). This option is be better when you simply want to read (or write) data in a *.xlsx file format.&lt;br /&gt;
&lt;br /&gt;
== Example models and libraries ==&lt;br /&gt;
&lt;br /&gt;
* There is a new &amp;quot;Auto insurance claim risk analysis.ana&amp;quot; in the Example Models / Risk Analysis folder.&lt;br /&gt;
* The [[Mutables library]] has been updated. It provides a new [[Mutable]] [[Struct]] which is superior to the older representation, which displays the actual value in result table cells and is atomic. The legacy functions ([[MutableNew]], [[MutableSet]] and [[MutableGet]]) are still there for backward compatibility, but have been changed to just wrap the new Mutable.&lt;br /&gt;
&lt;br /&gt;
== Result tables and graphs ==&lt;br /&gt;
* A blank (none) entry was added to the [[XY_comparison#Use_comparison_index|comparison index pulldown]]. Use this to quickly unset the comparison index without having to re-enter the [[XY_comparison]] dialog. Also, the pulldown is now visible and enabled in browse mode.&lt;br /&gt;
* Comparison variables are no longer summed over slicer indexes that are set to '''Totals''' when the value for that variable does not include the slicer index. Note that this results in some changes to what is displayed in table body cells and in axis scaling on graphs.&lt;br /&gt;
&lt;br /&gt;
== Assista ==&lt;br /&gt;
&lt;br /&gt;
You can now copy-paste from Expression blocks in Assista's response using the little copy icon in the top-right corner of the expression block.&lt;br /&gt;
&lt;br /&gt;
== Experimental ==&lt;br /&gt;
* A way for an Analytica model running in desktop Analytica to [[MCP server in Analytica|act as a Model Context Protocol (MCP) server]].&lt;br /&gt;
&lt;br /&gt;
== ADE ==&lt;br /&gt;
* Added a new example: &amp;lt;code&amp;gt;Mcp_server&amp;lt;/code&amp;gt;.  This is an MCP server that wraps ADE. Among other things, it can give AI agents like Claude Code the ability to build, explore and use Analytica models.&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=ChangeNodeVisibility&amp;diff=63677</id>
		<title>ChangeNodeVisibility</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=ChangeNodeVisibility&amp;diff=63677"/>
		<updated>2026-01-20T23:46:45Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: /* See Also */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; [[category:User-interface functions]]&lt;br /&gt;
{{ReleaseBar}}&lt;br /&gt;
''new to [[Analytica 5.0]]''&lt;br /&gt;
&lt;br /&gt;
== ChangeNodeVisibility(obj, option'', what'') ==&lt;br /&gt;
&lt;br /&gt;
This function can hide or show a node  in its Diagram, or display it as &amp;quot;disabled&amp;quot; -- i.e. grayed out to show it is not currently available. For example:&lt;br /&gt;
  ChangeNodeVisibility(A, 'Hidden')&lt;br /&gt;
hides the node for object A in its Diagram.  You can use it to create a dynamic user interface in which certain user inputs or user outputs appear or disappear based on the state of other user inputs. In such cases, you might use ChangeNodeVisibility() in the [[OnChange]] attribute of a checkbox or Choice menu user input to control whether other user inputs or outputs are shown. &lt;br /&gt;
&lt;br /&gt;
You can also use this function to query the current visibility state of the node. For example:&lt;br /&gt;
  ChangeNodeVisibility(A, 'Is Visible?')&lt;br /&gt;
returns true if node A is currently visible. &lt;br /&gt;
&lt;br /&gt;
=== «obj» parameter ===&lt;br /&gt;
&lt;br /&gt;
The «obj» parameter is a handle to the node that you want to change or query. &lt;br /&gt;
&lt;br /&gt;
=== «option» parameter ===&lt;br /&gt;
&lt;br /&gt;
Change the visibility state by setting the «option» parameter to:&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;Hidden&amp;quot;&amp;lt;/code&amp;gt;: The node is not visible in its parent diagram.  &lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;Disabled&amp;quot;&amp;lt;/code&amp;gt;: The node is visible but disabled. It appears &amp;quot;grayed out&amp;quot; and does not respond to user input.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;Visible&amp;quot;&amp;lt;/code&amp;gt;: The node is visible in the diagram user interface.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;Enabled&amp;quot;&amp;lt;/code&amp;gt;: Synonymous with ''Visible'', but this parameter definition may be clearer to a reviewer if your interface is disabling and enabling user inputs (rather than making them visible or hidden).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
While a &amp;quot;Hidden&amp;quot; node is invisible in its diagram, the object will still appear and its [[Object Window]] accessible in the [[Outline window]],  [[Find Dialog]], and links to it that might appear in results, or in inputs and outputs of other variables, etc. It also remains selectable on the diagram in edit mode, even though it is invisible. These options let you hide it more securely:&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;Very hidden&amp;quot;&amp;lt;/code&amp;gt;: Node is invisible in its diagram, the [[Outline window]], hierarchy stripe, [[Find Dialog]], etc. However, you can still hyperlink to it if a hyperlink exists.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;Extremely hidden&amp;quot;&amp;lt;/code&amp;gt;: Set so that you can't reach the node via existing hyperlinks get to it from the Analytica UI in general. At this level, it appears to the end-user as if it doesn't exist&lt;br /&gt;
&lt;br /&gt;
It is sometimes useful to hide (or disable) a node in Browse mode but enable it in Edit mode. Hence these options:&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;Hidden in browse&amp;quot;&amp;lt;/code&amp;gt;: Make the node is present and visible is edit mode, but does not appear on the diagram in browse mode.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;Disabled in browse&amp;quot;&amp;lt;/code&amp;gt;: Make the node disabled in browse mode. It is enabled in edit mode.&lt;br /&gt;
{{Release|1=6.6|2=|3=&lt;br /&gt;
And sometimes it is nice to just hide the node entirely while calculations are in progress:&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;Hidden while computing&amp;quot;&amp;lt;/code&amp;gt;: (New to [[Analytica 6.6]]) Hidden while a calculation is in progress, visible otherwise.}}&lt;br /&gt;
&lt;br /&gt;
These options let you query a nodes visibility state. (Note that they all end with a question mark.):&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;Is Visible?&amp;quot;&amp;lt;/code&amp;gt;: Returns true if the node is visible, and true if disabled but visible. False if not visible on influence diagram.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;Is Hidden?&amp;quot;&amp;lt;/code&amp;gt;: Returns true if the node is hidden (not visible), true otherwise.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;Is Disabled?&amp;quot;&amp;lt;/code&amp;gt;: Returns true if the node is hidden or disabled. True if visible and enabled.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;Is Enabled?&amp;quot;&amp;lt;/code&amp;gt;: Returns true if the node is visible and enabled. False otherwise.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;How hidden?&amp;quot;&amp;lt;/code&amp;gt;: Returns the option text describing the visibility state; &amp;lt;code&amp;gt;&amp;quot;Visible&amp;quot;, &amp;quot;Hidden&amp;quot;, &amp;quot;Hidden in browse&amp;quot;, &amp;quot;Very Hidden&amp;quot;, &amp;quot;Extremely hidden&amp;quot;, &amp;quot;Disabled&amp;quot;, &amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;quot;Disabled in browse&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
When you query the visibility state and specify «what» to be &amp;lt;code&amp;gt;'UserInputs'&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;'UserOutputs'&amp;lt;/code&amp;gt;, the result is a 1-D array with a local index, where the local index contains the handles of each user input or each user output node, and the value is the result for that node.&lt;br /&gt;
&lt;br /&gt;
=== «what» parameter ===&lt;br /&gt;
&lt;br /&gt;
By default, if you omit «what», the functions changes (or queries) the visibility of the node for «obj».  But, you can also change the visibility of the user inputs or outputs for a Variable. You set «what» to &amp;lt;code&amp;gt;'UserInputs'&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;'UserOutputs'&amp;lt;/code&amp;gt; to change the visibility of all inputs or all outputs of the variable. If you want to changed the visibility of a single user input or user output node, then you should ensure that this is a handle to the user input node, not a handle to the original variable node, and that «what» is omitted. You can also pass &amp;lt;code&amp;gt;'Original'&amp;lt;/code&amp;gt; to «what» to change the visibility of the original (not the alias) of «obj».&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
Hide, show, disable or re-enable the user inputs for variable &amp;lt;code&amp;gt;Gender&amp;lt;/code&amp;gt;:&lt;br /&gt;
:[[ChangeNodeVisibility]]( [[Handle]](Gender), 'Hidden', 'UserInputs' )&lt;br /&gt;
:[[ChangeNodeVisibility]]( [[Handle]](Gender), 'Visible', 'UserInputs' )&lt;br /&gt;
:[[ChangeNodeVisibility]]( [[Handle]](Gender), 'Disabled', 'UserInputs' )&lt;br /&gt;
:[[ChangeNodeVisibility]]( [[Handle]](Gender), 'Enabled', 'UserInputs' )&lt;br /&gt;
&lt;br /&gt;
Hide your model details module node from your end user:&lt;br /&gt;
:[[ChangeNodeVisibility]]( Handle(Model_details), 'Hidden in browse' )&lt;br /&gt;
&lt;br /&gt;
Make visible user input nodes only when the user makes the choice to edit them. In this example, we augment the car cost model which begins in [[Tutorial: Create a model]]. With the following addition to the OnChange field, the user may change the estimated annual maintenance cost and the estimated miles driven per year:&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;Variable := Choice(Self, 2, 0)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
:[[ChangeNodeVisibility]]( [[handle]](  Maintenance_cost  ), IF Self = 'No' THEN 'Hidden' ELSE 'Visible', 'UserInputs' );&lt;br /&gt;
:[[ChangeNodeVisibility]]( [[handle]](  Mpy  ), IF Self = 'No' THEN 'Hidden' ELSE 'Visible', 'UserInputs' )&lt;br /&gt;
&lt;br /&gt;
:[[image:Onchange_example1.gif]]&lt;br /&gt;
:[[image:Onchange_example2.gif]]&lt;br /&gt;
&lt;br /&gt;
== Example Video ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;iframe width=&amp;quot;640&amp;quot; height=&amp;quot;360&amp;quot; src=&amp;quot;https://www.youtube.com/embed/LshPSRoTl7o&amp;quot; frameborder=&amp;quot;0&amp;quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Video:''' [https://youtu.be/LshPSRoTl7o Hiding and disabling UI elements] (5 minutes)&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [http://lumina.com/blog/analytica-5.0-video-short-hiding-and-disabling-model-user-interface-control Analytica Video Short: Hiding and Disabling Model User-Interface Controls] on the Lumina Blog&lt;br /&gt;
* [[NodeInfo]] attribute&lt;br /&gt;
* [[OnChange]]&lt;br /&gt;
* [[OnClick]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Keywords:''' Show node, Make visible, Hide node, Make invisible&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.0%3F&amp;diff=63570</id>
		<title>What's new in Analytica 7.0?</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_7.0%3F&amp;diff=63570"/>
		<updated>2025-12-17T02:24:36Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: added highlights section, reordered sections, and more.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:What's new pages]]&lt;br /&gt;
[[category:Analytica releases]]&lt;br /&gt;
&lt;br /&gt;
[[Analytica 7.0]] will be the next major Analytica release and is currently in [[Beta Tester Page|beta testing]]. Go to [[Beta Tester Page]] to try it. The current official release is [[Analytica 6.6]]. &lt;br /&gt;
&lt;br /&gt;
==Highlights of Analytica 7.0==&lt;br /&gt;
&lt;br /&gt;
* The major enhancement is integration with Python and hence the entire Python ecosystem of libraries. You can easily call functions from Python libraries, access Python variables, and even write Python code right inside Analytica variables and functions. So now you can mix and match Analytica and Python according to which language you think best for your modeling or coding needs.&lt;br /&gt;
* A common source of errors has been when you change a text label in an Index without remembering to change expressions that refer to that same text label. [[# Index label auto updates|New features]] now automatically update these labels, and so eliminate most of those errors.&lt;br /&gt;
* The Analytica Enterprise edition has been renamed the [[#Developer Edition (formerly known as Enterprise) |Developer edition]], which better reflects what it is.&lt;br /&gt;
* It introduces two new object Classes:  &lt;br /&gt;
** [[Struct]] lets you bundle disparate values, like text, numbeers, atoms and arrays, together in one object that does not array abstract -- similar to Records and Classes in other languages).  &lt;br /&gt;
** [[Callable]] is like a user-defined Function but it's Definition can be a [[handle]] to a Python class or a Python function. &lt;br /&gt;
* [[ParseJSON]] and [[MakeJSON]] now use Structs, which are much more convenient for representing the hierarchical structure of JSON.&lt;br /&gt;
&lt;br /&gt;
== [[Using Python from Analytica|Python integration]] ==&lt;br /&gt;
&lt;br /&gt;
You can now benefit from the large ecosystem of Python libraries from the [[Analytica Developer]] edition or better (i.e., [[Analytica Optimizer]] edition or [[ADE]]). Use Python libraries (called modules in Python lingo) or Python code directly from your Analytica model, and it is super easy and convenient to do so!  Among the gazillion possibilities are specialized data visualizations, using machine learning libraries, third party libraries, etc. &lt;br /&gt;
&lt;br /&gt;
See: [[Using Python from Analytica]]&lt;br /&gt;
&lt;br /&gt;
For the Analytica modeler, this puts a ton of resources at your fingertips.&lt;br /&gt;
&lt;br /&gt;
For the Python developer, this is also pretty cool. Analytica is like a new interactive development environment in which there are a lot of unique advantages, especially during interactive code development, including these:&lt;br /&gt;
* Analytica's dependency maintenance can be really convenient during interactive development, creating automatic dependency maintenance between your python functions, classes and variables that don't exist in Python.&lt;br /&gt;
* The visual influence diagram layout can be a super useful to way organize and visualize your code.&lt;br /&gt;
* It naturally encourages declarative code practices, which leads to better and more maintainable coding style.&lt;br /&gt;
* You get the benefits of Analytica's edit tables, plus for results, Analytica's multi-D result tables and one-click, no-code, graphing.&lt;br /&gt;
* It is easy to wrap existing Python models to get Monte Carlo, parametric analysis and sensitivity analysis with Analytica ease.&lt;br /&gt;
* Sometimes one or the other language is more convenient for a particular task. You can freely switch between whichever language feels better suited to the immediate task, and intermix languages easily.&lt;br /&gt;
&lt;br /&gt;
== Developer Edition (formerly known as Enterprise) ==&lt;br /&gt;
&lt;br /&gt;
Analytica's middle-tier edition formerly known as the ''Enterprise Edition'', it is now called the [[Analytica Developer|Analytica Developer edition]]. That name better reflects what it is--software for developers of decision applications.  If you're now a user of Analytica Enterprise you don't have to update your license or do anything special. The name will just change when you install Analytica 7.0.  In Analytica docs, when you select &amp;quot;7.0&amp;quot; on the release bar (at the top of pages that have release-contingent content), all the docs automatically use the new Analytica Developer edition name. &lt;br /&gt;
&lt;br /&gt;
== Analytica language extensions ==&lt;br /&gt;
&lt;br /&gt;
=== Index label auto updates ===&lt;br /&gt;
&lt;br /&gt;
When you change a text label in an Index, it can update code to use the new text label. Iit automatically updates text literals in other expressions that compare to or subscript on an index. The new [[Index-label dot syntax]] ( &amp;lt;code&amp;gt;I . &amp;quot;label&amp;quot;&amp;lt;/code&amp;gt;) associates a text literal with its index to prevent it from getting out of sync, and to warn if it ever does. These [[Keeping text literals consistent with index labels| features]] help avoid common errors when updating text labels in Indexes. &lt;br /&gt;
&lt;br /&gt;
=== Callable ===&lt;br /&gt;
&lt;br /&gt;
The new object [[Class]] [[Callable]] is a variable-like object, meaning it has a [[Definition]] and a computed value, but can be used for convenience and documentation when the computed value itself is something that can be called, such as a [[Local function]] (aka ''lambda function''), a [[handle]] to an global function, a Python class or a Python function.&lt;br /&gt;
&lt;br /&gt;
If you &amp;quot;compute&amp;quot; the identity of a callable data item inside a normal [[Variable]] instance, &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;, you could call it using the syntax &amp;lt;code&amp;gt;X-&amp;gt;(a,b,c)&amp;lt;/code&amp;gt;. On your influence diagram the object would have a rounded rectangle and thus would not communicate that the result is something that can be called. When you change its class to be a [[Callable]], you can then invoke the call using the syntax &amp;lt;code&amp;gt;X(a,b,c)&amp;lt;/code&amp;gt; and the shape of the node changes to something that resembles a function shape, thus communicating that this holds something that is callable.&lt;br /&gt;
&lt;br /&gt;
To create a callable, first create a [[Variable]] node, then use the [[Class]] dropdown from the [[Object window]] or [[Attribute pane]] to change the class to ''Callable''.&lt;br /&gt;
&lt;br /&gt;
=== Struct ===&lt;br /&gt;
A [[Struct]] defines a new atomic, immutable data type. For use when you need to bundle multiple heterogeneous items and don't want their dimensionalities to interact. Array abstract treats an instance of a Struct as a single cell (an atom).&lt;br /&gt;
&lt;br /&gt;
=== Expression and Lazy qualifiers ===&lt;br /&gt;
An expression passed to a function parameter declared with the qualifier as &amp;lt;code&amp;gt;[[Function_parameter_qualifiers#Expression|Expression]]&amp;lt;/code&amp;gt; can now include local variable identifiers. The local variables are captured (similar to how they would be captured by a [[Local function]]).&lt;br /&gt;
&lt;br /&gt;
A new function parameter qualifier, [[Function_parameter_qualifiers#Lazy]], has been added, which does lazy evaluation of the expression passed to it. In the function Definition, you can use it as if it were a normal value parameter, but evaluation occurs when the value is used rather than when the function is called, and in the evaluation context (which includes the [[Evaluation modes|evaluation mode]]) where the value is used instead as in the context of the call.&lt;br /&gt;
&lt;br /&gt;
=== Excess parameter qualifier ===&lt;br /&gt;
A new function declaration allows a function to tolerate or capture excess named parameters in the call that are not declared as parameter names in the function's Parameters declaration. It can also be used in a [[Struct]] declaration.&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
=== ParseJSON ===&lt;br /&gt;
Changed to parse to [[Struct]]s, thus greatly simplifying and improving the convenience of using JSON in Analytica expressions. &lt;br /&gt;
&lt;br /&gt;
For parsing with a schema, a Struct's declaration serves as the schema, which is far easier and more familiar for an Analytica user than the former scheme for specifying a schema.&lt;br /&gt;
&lt;br /&gt;
[[MakeJSON]] is able to generate JSON from a Struct (or nested structs) as well, which is the most convenient representation for JSON representations.&lt;br /&gt;
&lt;br /&gt;
== Example models and libraries ==&lt;br /&gt;
&lt;br /&gt;
* There is a new &amp;quot;Auto insurance claim risk analysis.ana&amp;quot; in the Example Models / Risk Analysis folder.&lt;br /&gt;
* The [[Mutables library]] has been updated. It provides a new [[Mutable]] [[Struct]] which is superior to the older representation, which displays the actual value in result table cells and is atomic. The legacy functions ([[MutableNew]], [[MutableSet]] and [[MutableGet]]) are still there for backward compatibility, but have been changed to just wrap the new Mutable.&lt;br /&gt;
&lt;br /&gt;
== Result tables and graphs ==&lt;br /&gt;
* A blank (none) entry was added to the [[XY_comparison#Use_comparison_index|comparison index pulldown]]. Use this to quickly unset the comparison index without having to re-enter the [[XY_comparison]] dialog. Also, the pulldown is now visible and enabled in browse mode.&lt;br /&gt;
* Comparison variables are no longer summed over slicer indexes that are set to '''Totals''' when the value for that variable does not include the slicer index. Note that this results in some changes to what is displayed in table body cells and in axis scaling on graphs.&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=Why_Analytica_doesn%27t_need_Map_and_Reduce_functions&amp;diff=63569</id>
		<title>Why Analytica doesn't need Map and Reduce functions</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=Why_Analytica_doesn%27t_need_Map_and_Reduce_functions&amp;diff=63569"/>
		<updated>2025-12-17T01:38:32Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Map'' and ''reduce'' are operations in many modern programming languages. ''Map'' applies an operation over every element of an array, while ''reduce'' applies an operation repeatedly to eliminate a dimension. They accept a function or operator, which often takes the form of a '''[[Lambda function]]'''. Analytica has no need for an explicit map function, because (almost) all functions and operators automatically generalize to work over array dimensions. It has no need for a reduce function because functions like, Sum(), Average(), Min() and other array-reducing functions automatically work over specified dimensions (indexes).  Even user-defined functions automatically generalize to work over arrays. Where conventional procedural languages like Python, and even the latest versions of Excel, require explicit instructions for array operations, Analytica's declarative structure and Intelligent Arrays handle the heavy lifting automatically.&lt;br /&gt;
&lt;br /&gt;
=== What is a Lambda function? ===&lt;br /&gt;
&lt;br /&gt;
A Lambda is a small, anonymous (nameless) function that can be stored and manipulated as a data value in a variable or array. Languages that need map and reduce to apply functions and operations to an array, they let you specify the function as a lambda function. Analytica doesn't need them for that purpose.  But it does support lambda functions,  called [[Local functions]], for some other use cases wherer the concise, inline logic of lambda functions can be useful.&lt;br /&gt;
&lt;br /&gt;
==== In Python ====&lt;br /&gt;
In Python, a lambda is often used with higher-order functions like &amp;lt;code&amp;gt;map()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;filter()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# A list of numbers&lt;br /&gt;
numbers = [1, 2, 3, 4, 5]&lt;br /&gt;
&lt;br /&gt;
# Using lambda with map() to square each number&lt;br /&gt;
squared_numbers = list(map(lambda x: x**2, numbers))&lt;br /&gt;
print(squared_numbers)&lt;br /&gt;
# Output: [1, 4, 9, 16, 25]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== In Excel ====&lt;br /&gt;
Microsoft 365 introduced the &amp;lt;code&amp;gt;LAMBDA&amp;lt;/code&amp;gt; function to give users a way to create reusable custom functions directly within Excel's formula language. Unlike Python and other languages, you must still give it a name to be used elsewhere.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# In the Name Manager, you define a named lambda:&lt;br /&gt;
Name: CircleArea&lt;br /&gt;
Refers to: =LAMBDA(r, PI()*r^2)&lt;br /&gt;
&lt;br /&gt;
# Now you can apply your custom function to a cell:&lt;br /&gt;
=CircleArea(A1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Why Analytica rarely needs Lambdas ===&lt;br /&gt;
&lt;br /&gt;
The core reason Analytica doesn't need a lambda function for map, reduce and filter operations lies in its architecture. It is a '''declarative, array-based language''', which means you focus on describing ''what'' a variable is, not ''how'' to compute it.&lt;br /&gt;
&lt;br /&gt;
==== 1. Declarative vs. procedural approach ====&lt;br /&gt;
Most programming languages are procedural—they require you to specify a sequence of steps. Lambda functions are a solution for making this process more concise for simple operations. Analytica, on the other hand, is a declarative language, much like Excel's formula model. The software handles the execution order based on the dependencies you define, freeing you from worrying about control flow.&lt;br /&gt;
&lt;br /&gt;
==== 2. Intelligent Arrays (Array abstraction) ====&lt;br /&gt;
Analytica’s &amp;quot;Intelligent Arrays&amp;quot; allow operators and functions to work on entire arrays simultaneously, eliminating the need for &amp;lt;code&amp;gt;MAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;REDUCE&amp;lt;/code&amp;gt;, or explicit loops. When you write &amp;lt;code&amp;gt;Revenue - Costs&amp;lt;/code&amp;gt;, Analytica automatically applies that subtraction to every corresponding element in the &amp;lt;code&amp;gt;Revenue&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Costs&amp;lt;/code&amp;gt; arrays. This is array abstraction at its finest.&lt;br /&gt;
&lt;br /&gt;
Here is how Analytica's approach compares to procedural languages:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Operation&lt;br /&gt;
! Excel with &amp;lt;code&amp;gt;MAP&amp;lt;/code&amp;gt;&lt;br /&gt;
! Python with &amp;lt;code&amp;gt;lambda&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt;&lt;br /&gt;
! Analytica (Intelligent Arrays)&lt;br /&gt;
|-&lt;br /&gt;
| '''Square all numbers'''&lt;br /&gt;
| &amp;lt;code&amp;gt;=MAP(A1:A5, LAMBDA(x, x^2))&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;list(map(lambda x: x**2, numbers))&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;numbers^2&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Calculate total demand over routes'''&lt;br /&gt;
| Uses helper column or &amp;lt;code&amp;gt;REDUCE&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;sum(map(lambda j: demands[j], route))&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;[[Sum]](Demands, Route)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filter for even numbers'''&lt;br /&gt;
| &amp;lt;code&amp;gt;=FILTER(A1:A5, MAP(A1:A5, LAMBDA(x, ISEVEN(x))))&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;list(filter(lambda x: x % 2 == 0, numbers))&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;[[Subset]]([[Mod]](numbers, 2) = 0)&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Note:'' Python programmers usually prefer to use ''comprehension'' syntax rather than calling map or filter functions with lambda functions. The table shows the map and reduce syntax since that is the topic of this page. But for completeness, we note that the above examples can be written in Python using comprehensions as:&lt;br /&gt;
* &amp;lt;code&amp;gt;[ x**2 for x in numbers]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;sum( [demands[j] for j in route] )&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;[ x for x in numbers if x % 2 == 0 ]&amp;lt;/code&amp;gt;&lt;br /&gt;
Even so, unlike Analytica these still require you to explicitly specify the iteration.&lt;br /&gt;
&lt;br /&gt;
==== 3. Simpler, more reliable code ====&lt;br /&gt;
By replacing complex looping constructs with intuitive, natural expressions, Analytica makes code both simpler to write and easier to understand.&lt;br /&gt;
* '''Readability:''' The final formula for a variable is a clear description of its purpose. &amp;lt;code&amp;gt;Profit = Revenue - Expenses&amp;lt;/code&amp;gt; is far more transparent than a multi-step formula involving helper columns or complex array functions.&lt;br /&gt;
* '''Flexibility:''' Adding a new dimension—like &amp;quot;Time&amp;quot; or &amp;quot;Region&amp;quot;—is as simple as adding an index. The formulas that depend on those variables automatically adjust without error-prone code changes.&lt;br /&gt;
* '''Less code, fewer errors:''' The reduction in explicit instructions dramatically reduces the number of formulas needed, which in turn reduces the chances of human error.&lt;br /&gt;
&lt;br /&gt;
=== Local functions in Analytica ===&lt;br /&gt;
Although you don't need to use [[Lambda function]]s for map, reduce and filter operations, they can still be useful in Analytica. In fact, although [[Lambda function]]s have recently found their way to procedural languages like Python and C++, they actually originated in functional languages, even to the point where some definitions of what qualifies as a functional language center around the ability to manipulate anonymous functions similar to any other data type.  Analytica's ability to manipulate functions as data, and to create custom lambdas on the fly during evaluation, enables numerous capabilities that fall into the category of advanced programming.  There are esoteric cases in advanced algorithms where you don't want array abstraction's automatic map-reduce behavior, and [[Local functions]] can be a useful abstraction to avoid those difficulties.&lt;br /&gt;
&lt;br /&gt;
=== A simpler way of thinking ===&lt;br /&gt;
Analytica's declarative, array-based philosophy is fundamentally different from the procedural mindset that requires lambdas. It's a paradigm shift that allows users to model complex problems more directly and with greater clarity, ultimately simplifying the entire process of writing and understanding code. Instead of focusing on the mechanics of how a calculation is performed, you can focus on the logic of the problem itself.&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=Why_Analytica_doesn%27t_need_Map_and_Reduce_functions&amp;diff=63568</id>
		<title>Why Analytica doesn't need Map and Reduce functions</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=Why_Analytica_doesn%27t_need_Map_and_Reduce_functions&amp;diff=63568"/>
		<updated>2025-12-17T01:25:32Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: /* Why Analytica doesn't need Lambdas in many common cases */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Map'' and ''reduce'' are operations in many modern programming languages. ''Map'' applies an operation over every element of an array, while ''reduce'' applies an operation repeatedly to eliminate a dimension. The accept a function or operator, which often takes the form of a '''[[Lambda function]]'''. In Analytica, there is no need for separate and explicit map and reduce operations. This difference highlights a fundamental distinction in how these languages operate: while procedural languages like Python, and even the latest versions of Excel, require explicit instructions for array operations, Analytica's declarative structure and Intelligent Arrays handle the heavy lifting automatically.&lt;br /&gt;
&lt;br /&gt;
=== What is a Lambda function? ===&lt;br /&gt;
&lt;br /&gt;
A Lambda is a small, anonymous (nameless) function that can be stored and manipulated as a data value, such as being held in an array or variable. In Analytica, they are called [[Local functions]].  With respect to their use case for the map and reduce functions found in other languages, they often passed as an argument to apply repeatedly. It allows for concise, inline logic without the need for a formal function definition.&lt;br /&gt;
&lt;br /&gt;
==== In Python ====&lt;br /&gt;
In Python, a lambda is often used with higher-order functions like &amp;lt;code&amp;gt;map()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;filter()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# A list of numbers&lt;br /&gt;
numbers = [1, 2, 3, 4, 5]&lt;br /&gt;
&lt;br /&gt;
# Using lambda with map() to square each number&lt;br /&gt;
squared_numbers = list(map(lambda x: x**2, numbers))&lt;br /&gt;
print(squared_numbers)&lt;br /&gt;
# Output: [1, 4, 9, 16, 25]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== In Excel ====&lt;br /&gt;
Microsoft 365 introduced the &amp;lt;code&amp;gt;LAMBDA&amp;lt;/code&amp;gt; function to give users a way to create reusable custom functions directly within Excel's formula language. Unlike Python and other languages, you must still give it a name to be used elsewhere.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# In the Name Manager, you define a named lambda:&lt;br /&gt;
Name: CircleArea&lt;br /&gt;
Refers to: =LAMBDA(r, PI()*r^2)&lt;br /&gt;
&lt;br /&gt;
# Now you can apply your custom function to a cell:&lt;br /&gt;
=CircleArea(A1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Why Analytica doesn't usually need Lambdas ===&lt;br /&gt;
&lt;br /&gt;
The core reason Analytica doesn't need a lambda function for map, reduce and filter operations lies in its architecture. It is a '''declarative, array-based language''', which means you focus on describing ''what'' a variable is, not ''how'' to compute it.&lt;br /&gt;
&lt;br /&gt;
==== 1. Declarative vs. procedural approach ====&lt;br /&gt;
Most programming languages are procedural—they require you to specify a sequence of steps. Lambda functions are a solution for making this process more concise for simple operations. Analytica, on the other hand, is a declarative language, much like Excel's formula model. The software handles the execution order based on the dependencies you define, freeing you from worrying about control flow.&lt;br /&gt;
&lt;br /&gt;
==== 2. Intelligent Arrays (Array abstraction) ====&lt;br /&gt;
Analytica’s &amp;quot;Intelligent Arrays&amp;quot; allow operators and functions to work on entire arrays simultaneously, eliminating the need for &amp;lt;code&amp;gt;MAP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;REDUCE&amp;lt;/code&amp;gt;, or explicit loops. When you write &amp;lt;code&amp;gt;Revenue - Costs&amp;lt;/code&amp;gt;, Analytica automatically applies that subtraction to every corresponding element in the &amp;lt;code&amp;gt;Revenue&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Costs&amp;lt;/code&amp;gt; arrays. This is array abstraction at its finest.&lt;br /&gt;
&lt;br /&gt;
Here is how Analytica's approach compares to procedural languages:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Operation&lt;br /&gt;
! Excel with &amp;lt;code&amp;gt;MAP&amp;lt;/code&amp;gt;&lt;br /&gt;
! Python with &amp;lt;code&amp;gt;lambda&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt;&lt;br /&gt;
! Analytica (Intelligent Arrays)&lt;br /&gt;
|-&lt;br /&gt;
| '''Square all numbers'''&lt;br /&gt;
| &amp;lt;code&amp;gt;=MAP(A1:A5, LAMBDA(x, x^2))&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;list(map(lambda x: x**2, numbers))&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;numbers^2&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Calculate total demand over routes'''&lt;br /&gt;
| Uses helper column or &amp;lt;code&amp;gt;REDUCE&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;sum(map(lambda j: demands[j], route))&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;[[Sum]](Demands, Route)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Filter for even numbers'''&lt;br /&gt;
| &amp;lt;code&amp;gt;=FILTER(A1:A5, MAP(A1:A5, LAMBDA(x, ISEVEN(x))))&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;list(filter(lambda x: x % 2 == 0, numbers))&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;[[Subset]]([[Mod]](numbers, 2) = 0)&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Note:'' Python programmers usually prefer to use ''comprehension'' syntax rather than calling map or filter functions with lambda functions. The table shows the map and reduce syntax since that is the topic of this page. But for completeness, we note that the above examples can be written in Python using comprehensions as:&lt;br /&gt;
* &amp;lt;code&amp;gt;[ x**2 for x in numbers]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;sum( [demands[j] for j in route] )&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;[ x for x in numbers if x % 2 == 0 ]&amp;lt;/code&amp;gt;&lt;br /&gt;
Even so, unlike Analytica these still require you to explicitly specify the iteration.&lt;br /&gt;
&lt;br /&gt;
==== 3. Simpler, more reliable code ====&lt;br /&gt;
By replacing complex looping constructs with intuitive, natural expressions, Analytica makes code both simpler to write and easier to understand.&lt;br /&gt;
* '''Readability:''' The final formula for a variable is a clear description of its purpose. &amp;lt;code&amp;gt;Profit = Revenue - Expenses&amp;lt;/code&amp;gt; is far more transparent than a multi-step formula involving helper columns or complex array functions.&lt;br /&gt;
* '''Flexibility:''' Adding a new dimension—like &amp;quot;Time&amp;quot; or &amp;quot;Region&amp;quot;—is as simple as adding an index. The formulas that depend on those variables automatically adjust without error-prone code changes.&lt;br /&gt;
* '''Less code, fewer errors:''' The reduction in explicit instructions dramatically reduces the number of formulas needed, which in turn reduces the chances of human error.&lt;br /&gt;
&lt;br /&gt;
=== Local functions in Analytica ===&lt;br /&gt;
Although you don't need to use [[Lambda function]]s for map, reduce and filter operations, they can still be useful in Analytica. In fact, although [[Lambda function]]s have recently found their way to procedural languages like Python and C++, they actually originated in functional languages, even to the point where some definitions of what qualifies as a functional language center around the ability to manipulate anonymous functions similar to any other data type.  Analytica's ability to manipulate functions as data, and to create custom lambdas on the fly during evaluation, enables numerous capabilities that fall into the category of advanced programming.  There are esoteric cases in advanced algorithms where you don't want array abstraction's automatic map-reduce behavior, and [[Local functions]] can be a useful abstraction to avoid those difficulties.&lt;br /&gt;
&lt;br /&gt;
=== A simpler way of thinking ===&lt;br /&gt;
Analytica's declarative, array-based philosophy is fundamentally different from the procedural mindset that requires lambdas. It's a paradigm shift that allows users to model complex problems more directly and with greater clarity, ultimately simplifying the entire process of writing and understanding code. Instead of focusing on the mechanics of how a calculation is performed, you can focus on the logic of the problem itself.&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_6.6%3F&amp;diff=63567</id>
		<title>What's new in Analytica 6.6?</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_6.6%3F&amp;diff=63567"/>
		<updated>2025-12-16T22:22:06Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: /* Graphing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:What's new pages]]&lt;br /&gt;
[[category:Analytica releases]]&lt;br /&gt;
&amp;lt;!--This page lists new features in release 6.6, which is currently in beta testing prior to final release. Analytica 6.6 is currently in [[Beta Tester Page|Beta Testing]].  If have have an active subscription license, we encourage you to try it out from the [[Beta Tester Page]].--&amp;gt;&lt;br /&gt;
This page lists new features in release 6.6 (the current release) of Analytica (including [[ACP]] and [[ADE]]) since the previous [[Analytica 6.5]] release. &lt;br /&gt;
&lt;br /&gt;
Analytica normally prompts you to download and install the new release the next time you run it.&lt;br /&gt;
If not, you can download it from [https://analytica.com/users/renew-upgrade/ Renew, upgrade or download].&lt;br /&gt;
&lt;br /&gt;
== Highlights of 6.6 ==&lt;br /&gt;
&lt;br /&gt;
* [[#Assista|Assista]], the Analytica AI Assistant, is faster and more reponsive.&lt;br /&gt;
* The [[#Keelin Metalog distribution 2.0|Keelin (or Metalog) distribution]] is now the preferred method to define any continuous distribution, because it now avoids the occasional infeasibility problem that previously bedeviled it.&lt;br /&gt;
* You can select [[#Diagrams and controls|All in Checkboxes]] for parametric analysis  and in Multichoice.&lt;br /&gt;
* You can use [[Links_or_URL_in_model_attributes#Extended_HTML_markup| html to set text styles in text nodes]], including bold, italic, underline, bold, colors, bullets, and more in desktop Analytica. Even more html tags work in ACP.&lt;br /&gt;
* [[#Expression language|Sum(x, All) sums over All indexes of x]]. Similar for Min, Max, Product, and more.&lt;br /&gt;
* The new [[OAuth2Authorize]] function lets you access web services, such as Google docs, sheets, Salesforce, etc to read or write data.&lt;br /&gt;
* You can specify a [[#Graphing|Fill origin for graphs]] to let you show colored bands around the center line -- e.g. for probability bands over time.&lt;br /&gt;
&lt;br /&gt;
== Assista ==&lt;br /&gt;
* The chat UI is faster. Responses start streaming sooner.&lt;br /&gt;
* You can use the Enter key (or Ctrl+Alt) to submit responses without having to click to submit button. The Return key adds a new line (the behavior elsewhere in Analytica).  If you have the [[Preferences_dialog#Personal_Preferences|Use Return to enter data]] preference set, then the Return key will submit responses and the Enter key adds a new line.&lt;br /&gt;
&lt;br /&gt;
== Keelin Metalog distribution 2.0 ==&lt;br /&gt;
Introducing the '''''always feasible''''', [[Keelin|infinitely flexible distribution]]!&lt;br /&gt;
&lt;br /&gt;
The  [[Keelin (MetaLog) distribution]] has become popular due to its ability to closely match the shapes of all the standard continuous distributions as well as offering enormous flexibility in matching amost any shape. But up until now it has been plagued by finding some parameter combinations ''infleasible'',  so it would sometimes fail t to find a valid distribution to fit.&lt;br /&gt;
&lt;br /&gt;
[[Analytica 6.6]] fixes this problem with the MetaLog 2.0 distribution. It includes many new results from &lt;br /&gt;
* Manel Baucells, Lonnie Chrisman, Thomas W. Keelin and Stephen Xu (2025), &amp;quot;[https://papers.ssrn.com/sol3/papers.cfm?abstract_id=5279416 On the properties of the Metalog distribution]&amp;quot; (preprint), forthcoming.&lt;br /&gt;
&lt;br /&gt;
New features include:&lt;br /&gt;
* The resulting [[Keelin (MetaLog) distribution]]s are ''always'' feasible.&lt;br /&gt;
* There are closed-form analytic expressions for all central and standardized moments (see [[KeelinPropertyFromA#Basic_statistics_and_moments]]). &lt;br /&gt;
* There is a closed-form analytic expression for partial expectation (see [[KeelinPropertyFromA#Partial_expectation]]). This makes the Keelin distribution especially convenient for many problems that use piecewise-linear transformations of an uncertain quantity.&lt;br /&gt;
* It uses the superior basis order of the MetaLog 2.0.&lt;br /&gt;
* You can also specify the desired «mean», in addition to «values» (data points).&lt;br /&gt;
* New set of functions with names of the form &amp;lt;code&amp;gt;&amp;lt;x&amp;gt;KeelinFromA(...)&amp;lt;/code&amp;gt;use the «a» coefficient vector from [[KeelinCoefficients]]:&lt;br /&gt;
** &amp;lt;code&amp;gt;[[KeelinFromA]](...)&amp;lt;/code&amp;gt; -- analog to &amp;lt;code&amp;gt;[[Keelin]](...)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;[[DensKeelinFromA]](...)&amp;lt;/code&amp;gt; -- analog to &amp;lt;code&amp;gt;[[DensKeelin]](...)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;[[CumKeelinFromA]](...)&amp;lt;/code&amp;gt; -- analog to &amp;lt;code&amp;gt;[[CumKeelin]](...)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;[[CumKeelinInvFromA]](...)&amp;lt;/code&amp;gt; -- analog to &amp;lt;code&amp;gt;[[CumKeelinInv]](...)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;[[KeelinPropertyFromA]](...)&amp;lt;/code&amp;gt; -- ''new to [[Analytica 6.6]]''&lt;br /&gt;
*:When using the Keelin distribution,  you can either use a quantile parameterization or an «a»-vector parameterization. These new functions make it clearer that you are using the «a»-vector parameterization, instead of using the original (analogous) functions with a special flag. &lt;br /&gt;
* A new option uses a [https://docs.analytica.com/index.php?title=Keelin_(MetaLog)_distribution&amp;amp;anarelease=6.6#Using_direct_method_for_bounds direct method for bounded support] as an alternative to the previous [https://docs.analytica.com/index.php?title=Keelin_(MetaLog)_distribution&amp;amp;anarelease=6.6#Using_the_Transform_method_for_bounds transform-method for bounded support].&lt;br /&gt;
&lt;br /&gt;
== Diagrams and controls ==&lt;br /&gt;
* [[Checkbox]] now has an &amp;quot;include ALL&amp;quot; option, enabling [[Parametric analysis]] even with a checkbox.&lt;br /&gt;
* [[Multichoice]] controls include a new option at the top to ''select '''all''''', ''select '''none''''' or ''select '''first''''', depending on the context. These are more obvious to the user than using the &amp;lt;code&amp;gt;Ctrl+A&amp;lt;/code&amp;gt; key.&lt;br /&gt;
* A text node can display several [[Links_or_URL_in_model_attributes#Extended_HTML_markup|new html formatting options]], including changes to text color, bullets and numbered lists.&lt;br /&gt;
* A new [[ChangeNodeVisibility|node visibility option]] lets you hide a node while Analytica is computing.&lt;br /&gt;
&lt;br /&gt;
== Expression language ==&lt;br /&gt;
* There is a new separate &amp;lt;code&amp;gt;Boolean&amp;lt;/code&amp;gt; data type. To preserve backward compatibility, the values continue to display as 0 or 1, but the [[Number format dialog]] provides an option to display values with the boolean data type as True or False to distinguish them from 0 and 1. &lt;br /&gt;
* You can now find the maximum over all indexes of &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; using &lt;br /&gt;
*::&amp;lt;code&amp;gt;[[Max]](X, All)&amp;lt;/code&amp;gt; &lt;br /&gt;
*:as a shortcut for &lt;br /&gt;
*::&amp;lt;code&amp;gt;[[Max]]( X, ...[[IndexesOf]](X) )&amp;lt;/code&amp;gt;&lt;br /&gt;
*:which uses [[Repeated parameter forwarding]]. The &amp;lt;code&amp;gt;All&amp;lt;/code&amp;gt; keyword works for these array-reducing functions, [[Sum]],  [[Min]], [[BitAnd]], [[BitOr]] and [[BitXOr]].&lt;br /&gt;
* If you write your own function, and want it to accept the keyword &amp;lt;code&amp;gt;All&amp;lt;/code&amp;gt; for a repeated index parameter, you can include a new &amp;lt;code&amp;gt;OrAll&amp;lt;/code&amp;gt; [[Function parameter qualifiers|function parameter qualifier]].&lt;br /&gt;
* When passing a [[Local function]] (aka '''lambda function''') as a parameter to a function call, you no longer have to include a function name (which wasn't used anyway).&lt;br /&gt;
* You can use '.. operator ([[Repeated parameter forwarding]]) on literal lists to &amp;quot;splat&amp;quot; lists (or 1-D arrays) together into the list. Example:&lt;br /&gt;
*:&amp;lt;code&amp;gt;[[Local]] s1 := 'c'..'f', s2 := 'h'..'k' Do [ 'a', 'b', ...s1, 'g', ...s2, 'l' ]&amp;lt;/code&amp;gt;&lt;br /&gt;
*::&amp;amp;rarr; &amp;lt;code&amp;gt;['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l']&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Built-in functions ==&lt;br /&gt;
* [[OAuth2Authorize]]: A new function to log into web services such as Google docs, sheets, Salesforce, etc., which makes it much easier for Analytica models to access (read from or write to) web applications that require authentication.&lt;br /&gt;
* &amp;lt;code&amp;gt;[[TypeOf]](x, shallow: True)&amp;lt;/code&amp;gt; now returns &amp;lt;code&amp;gt;&amp;quot;Image&amp;quot;&amp;lt;/code&amp;gt; when &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; is an image.&lt;br /&gt;
* When &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; is an image, &amp;lt;code&amp;gt;f&amp;quot;{x:H}&amp;quot;&amp;lt;/code&amp;gt; returns the long hex string that appears in a [[Pict]] attribute in a model file (but without the parens around it that appear in the model file).&lt;br /&gt;
* [[ReadTextFile]] returns the file encoding as its fourth return value.&lt;br /&gt;
* [[RunConsoleProcess]] is able to launch several applications that it previous could not, including PowerShell.&lt;br /&gt;
* New syntactic extensions added to the [[Arrow_operator#x_.E2.86.92_.5Bi.5D|arrow operator]], namely   &amp;lt;code&amp;gt;x&amp;amp;rarr;[n]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;x&amp;amp;rarr;[m..n]&amp;lt;/code&amp;gt; for [[Text values]] and [[In-memory binary data terms]].&lt;br /&gt;
&lt;br /&gt;
== File saving and loading ==&lt;br /&gt;
* '''Add Library...''' defaults to ''Link to filed module or library'' for almost all the standard libraries, which is the preferred way to add libraries to your model. (Except it still defaults to ''Embed a copy'' for the [[ACP Style Library]] since that library acts more module-like and changes its internal state).&lt;br /&gt;
* You can now set the [[Att_Dirties]] attribute (to 0) for your own user Variables. When set to 0, a change to the Definition doesn't dirty the Library or module that contains the Variable.&lt;br /&gt;
&lt;br /&gt;
== Example models and libraries ==&lt;br /&gt;
* A new example model included: &amp;lt;code&amp;gt;&amp;quot;Engineering / Generator availability.ana&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* An able to handle file paths &amp;gt; 256 characters in most cases. Actually taking advantage of this requires you to have long paths enabled in Windows, e.g., by setting the registry setting&lt;br /&gt;
*::&amp;lt;code&amp;gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem :: LongPathsEnabled = 1&amp;lt;/code&amp;gt;&lt;br /&gt;
*:or  by using the &amp;lt;code&amp;gt;\\unc\.... &amp;lt;/code&amp;gt; syntax for file paths. However, long file paths are not supported by Microsoft One drive or by Microsoft office, including Excel, so you cannot use long paths for files within a One drive folder or when opening a spreadsheet file.&lt;br /&gt;
* Several of the diagram themes in the [[Themes Library]] were renamed. &lt;br /&gt;
&lt;br /&gt;
== Graphing ==&lt;br /&gt;
* For Filled-area charts, in '''Graph set up''' you can now set the '''Fill type''' to &amp;quot;From origin&amp;quot;., and then select the '''Fill origin''' in the graph. A common use is in probability bands plot to select &amp;lt;code&amp;gt;.Probability=0.5&amp;lt;/code&amp;gt; as the fill origin, to produce a plot like this:&lt;br /&gt;
*:::[[image:filled_bands_plot.png]]&lt;br /&gt;
*: You could previously do this by placing the [[Plot solid prob bands]] function in the [[OnGraphDraw]] attribute, but the new feature is much easier to configure, with just a few clicks in the [[Graph setup dialog]].&lt;br /&gt;
* '''Graph Setup / Text / Adapt displayed font sizes to graph height''' now uses the current height of the  graph window you were viewing as the reference height, so that the font sizes you select in the graph setup dialog will be correct when the graph is at that height.  Font sizes automatically adjust when you change the graph window size. Previously the reference height was fixed at the default result window height (a graph of 241 pixels tall), which tended to make the fonts way too large for normal window heights.  We now recommend using this setting by default so that text on graphs is easily legible at various sizes.&lt;br /&gt;
&lt;br /&gt;
== Other GUI ==&lt;br /&gt;
* There are a few new options on the '''Windows''' menu:&lt;br /&gt;
** Bring next window to front &lt;br /&gt;
** Bring previous window to front&lt;br /&gt;
** [[Typescript window|Typescript console]] to show the Typescript window. (Still also available with ctrl+'.)&lt;br /&gt;
&lt;br /&gt;
== Licensing ==&lt;br /&gt;
* [[ParseJSON]] and [[MakeJSON]] no longer require {{Analytica Enterprise}}.&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=Graph_setup_dialog&amp;diff=63566</id>
		<title>Graph setup dialog</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=Graph_setup_dialog&amp;diff=63566"/>
		<updated>2025-12-16T21:41:59Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: /* Chart Type tab */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Analytica User Guide]] &lt;br /&gt;
[[Category: Windows and dialogs]]&lt;br /&gt;
[[Category: Graphs]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;breadcrumbs&amp;gt;Analytica User Guide &amp;gt; Graphs &amp;gt; {{PAGENAME}}&amp;lt;/breadcrumbs&amp;gt;&lt;br /&gt;
{{ReleaseBar}}&lt;br /&gt;
&lt;br /&gt;
==About graph setup==&lt;br /&gt;
The '''Graph setup dialog''' lets you apply a wide variety of graphing styles and options to the selected graph, or as the new defaults for all graphs in this model. It also lets you use or define graph templates, to apply a standard collection of styles and options to a graph.&lt;br /&gt;
&lt;br /&gt;
When you display the result of a variable, it shows it as a table or graph, according to how you last viewed it. The first time you view a result, it appears as a graph, unless you changed the default result view in the [[Preferences]] dialog.&lt;br /&gt;
&lt;br /&gt;
When displaying a graph, Analytica uses the default graphing settings, unless you have selected other settings for it. You can modify these with the [[Graph setup dialog]].&lt;br /&gt;
&lt;br /&gt;
'''To open the Graph setup dialog''': First display a graph. Then do one of these:&lt;br /&gt;
&lt;br /&gt;
* Select '''Graph Setup '''from the [[Result menu]].&lt;br /&gt;
* Select '''Graph Setup '''from the [[right mouse button menu]].&lt;br /&gt;
* Double-click the graph in the [[Result window]].&lt;br /&gt;
&lt;br /&gt;
The graph setup dialog has six tabs:&lt;br /&gt;
&lt;br /&gt;
* '''[[#Chart Type tab|Chart Type]]:''' Select the line style, effects, area fill, border, stacked, and assign color, symbol, or dash styles.&lt;br /&gt;
* '''[[#Axis Ranges tab|Axis Ranges]]:''' Set the ranges or autoscale, type (reverse, categorical, log, or hide) labels and number of ticks ticks on each axis. &lt;br /&gt;
* '''[[#Style tab|Style]]:''' Style of grid, frame, tick marks, and where to display the Key.&lt;br /&gt;
* '''[[#Text tab|Text]]:''' Set the font, size, style,a nd color for axis and key titles and labels.&lt;br /&gt;
* '''[[#Background tab|Background]]:''' Fill color, gradient, or pattern for the graph background (main, plot, or key areas.)&lt;br /&gt;
* '''[[#Preview tab|Preview]]:''' Show the graph with current settings so you can see their effects before you apply or cancel them.&lt;br /&gt;
&lt;br /&gt;
Each tabs shows the style template menu, and these three buttons:&lt;br /&gt;
&lt;br /&gt;
* '''Apply: '''Apply any changes to settings to the current graph, and close the dialog.&lt;br /&gt;
* '''Set Default: '''Save any changed settings on the current tab as the default for all graphs, and close the dialog. It does not affect any settings that you have not changed since you opened the '''Graph setup '''dialog. Changing a default affects all graphs that use the default, but not graphs for which you override the default (in the past or future).&lt;br /&gt;
* '''Cancel: '''Close the dialog without changing or saving anything.&lt;br /&gt;
&lt;br /&gt;
==Chart Type tab==&lt;br /&gt;
This tab lets you set the style and arrangement of the graph.&lt;br /&gt;
&lt;br /&gt;
:{{Release||5.9|[[Image:GraphSetupDialog_LineStyleSettings5.png]]}}{{Release|6.0|6.2|[[Image:GraphSetupDialog_LineStyleSettings6.png]]}}{{Release|6.3||&lt;br /&gt;
[[Image:GraphSetupDialog LineStyleSettings6.3.png]]}}&lt;br /&gt;
&lt;br /&gt;
'''Line style''': &lt;br /&gt;
&lt;br /&gt;
:[[File:Chapter7 13.png]] Line segments join the data points.&lt;br /&gt;
&lt;br /&gt;
:[[File:Chapter7 14.png]] Line segments, with a symbol at each data point. &lt;br /&gt;
&lt;br /&gt;
:[[File:Chapter7 15.png]] A symbol at each data point with no lines.&lt;br /&gt;
&lt;br /&gt;
:[[File:Chapter7 16.png]] A pixel at each data point, with no line.&lt;br /&gt;
&lt;br /&gt;
:[[File:Chapter7 17.png]] A histogram or step function, with a vertical line and horizontal line from each data point to the next.&lt;br /&gt;
&lt;br /&gt;
:[[File:Chapter7 18.png]] A bar centered on each x value, with height showing the y value. Forces the graph to be discrete.&lt;br /&gt;
&lt;br /&gt;
'''Swap horizontal and vertical''': Check this box to exchange the x and y axes, so that x axis is vertical and y axis is horizontal. If x values are discrete with long labels, swapping axes gives a more easily legible bar graph.&lt;br /&gt;
&lt;br /&gt;
'''3D effects''': Check to use three-dimensional style to view graphs. For a bar graph line style, it offers the choice of ''Box ''or ''Cylindrical ''shapes for the bars.&lt;br /&gt;
&lt;br /&gt;
'''Sort by data spread''': Shows up in [[Analytica 5.0]] or later when your independent axis (X-axis) is categorical. Causes the categories in the X-axis to be re-ordered in decreasing order of data spread (or increasing order when you ''reverse order'' in the '''Axis Ranges''' tab). This is extremely useful when creating Tornado charts, since it automatically orders your tornado bars for you.&lt;br /&gt;
&lt;br /&gt;
'''Line style settings''': Displays when you select a line style showing lines.&lt;br /&gt;
&lt;br /&gt;
* '''Area fill:''' Check to fill in the area beneath each line with a solid color. If there are multiple lines, the graph has a '''''key index'''''. It draws the fill areas from last to first element of the key index, which works well if the y values are sorted from smallest to largest over the key index. Otherwise, later values obscure earlier ones. Here’s an example.&lt;br /&gt;
&lt;br /&gt;
:[[File:Chapter7 19.png]]&lt;br /&gt;
&lt;br /&gt;
* '''Fill type: '''Normally it fills the area from the Y-origin to the curve. If you select &amp;quot; When you create an XY plot, each of your curves may define a polygon, in which case the Polygon fill types instead fill the areas surrounded by the curve. When your curve crosses itself, the option ''Polygon alternate'' fills the areas that are surrounded an odd number of times, whereas &amp;quot;Polygon solid&amp;quot; fills areas surrounded any number of times.{{Release|6.3||&lt;br /&gt;
* ''With border: ''Appears with Area fill turned. Controls whether a think black border line appears along the edge of a filled area line style.}}&lt;br /&gt;
* ''Transparency: ''Drag the cursor to change transparency of fill colors between opaque and transparent. Transparency lets you see fill lines and areas that would otherwise be obscured behind others.&lt;br /&gt;
* ''Line thickness: ''Select the thickness of lines to display. (Only for styles that show lines.)&lt;br /&gt;
* ''Use separate color/symbol keys: ''Check to display two key index roles, one indicated by color and the other by symbol type or size.{{Release|6.0||&lt;br /&gt;
* ''Separate dash style key: ''Check to display the dash style role selector, which you can use to depict the values along one index using a dash style at the same time you use color to depict a different value, which separate keys. Since there are only 5 distinct dash styles, works best for indexes having five or fewer different values.}}&lt;br /&gt;
* ''Allow variable symbol size: ''Check to have the size of symbols vary with their value.&lt;br /&gt;
* ''Symbol size: ''Enter a number to specify size of symbols in typographic points.&lt;br /&gt;
* ''Min symbol size and Max symbol size: ''If you check ''Allow variable symbol size'', use these fields to specify the range of symbol sizes from smallest and largest.{{Release|5.3||&lt;br /&gt;
* ''Where steps transition: ''This option appears for step charts, and controls where the step transition occurs. Left and right transitions change in Y at the point, whereas Mid steps at the midpoint between points. }}&lt;br /&gt;
&lt;br /&gt;
'''Bar graph settings''': Displays when you select ''Bar ''graph line style:&lt;br /&gt;
* ''Shape: Box / Cylindrical'': When '''3-D effects''' are on, different 3-D shapes for the bar prisms.&lt;br /&gt;
* ''Enable bar outlines'': ([[Analytica 5.0]] or later). When on (default), a fine black line appears around the edges of the bars delineating their outline. (Note: If the bars get too narrow, the outline is automatically removed). &lt;br /&gt;
* ''Stacked bars: ''Check to show bars stacked one on top of the other over the key index, instead of side by side. The values for each bar are cumulated over the key index.&lt;br /&gt;
* ''Variable origin: ''Check if you want to set the origin (starting point) for each bar other than zero (the default). The graph then displays a '''Bar Origin '''menu to let you select the bar origin.&lt;br /&gt;
* ''Bar overlap: ''With stacked bars, they overlap 100%. You can specify partial overlap between 0 and 100%.&lt;br /&gt;
&lt;br /&gt;
== Axis Ranges tab ==&lt;br /&gt;
This tab lets you control the display for each axis, vertical and horizontal, including scaling, range, and tickmarks.&lt;br /&gt;
&lt;br /&gt;
:{{Release||5.9|[[Image:GraphSetupDialog_AxisRanges5.png]]}}{{Release|6.0||[[Image:GraphSetupDialog_AxisRanges6.png]]}}&lt;br /&gt;
&lt;br /&gt;
'''Autoscale''': Uncheck this box if you want to specify the range for the axis, instead of letting Analytica select the range automatically to include all values.&lt;br /&gt;
&lt;br /&gt;
'''Max and Min''': The maximum and minimum values of the range to use when you have unchecked '''Autoscale'''. '''Include zero'''Check if you want to include the origin (zero) in the range. You can also select the manual scaling range while viewing the graph graph using [[Interactive graph zooming]].&lt;br /&gt;
&lt;br /&gt;
'''Approx. &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; ticks''': Specify the number of tick marks to display along the axis. Analytica might not match the number exactly, in the interests of clarity.&lt;br /&gt;
&lt;br /&gt;
'''Reverse order''': Check this box if you want to show the values ordered from large to small instead of the default small to large.&lt;br /&gt;
&lt;br /&gt;
'''Categorical''': Treat this axis as categorical. Usually, Analytica figures out the quantity is categorical without help. Occasionally, if the values are numerical, you might want to control it yourself. See [[Probability density and mass graphs]].&lt;br /&gt;
&lt;br /&gt;
'''Log scale''': Check if you want to display this on a log scale. This is useful for numbers that vary by several orders of magnitude. It uses a “double log” scale with zero if the values include negative and positive numbers.&lt;br /&gt;
&lt;br /&gt;
'''Set default''': If you have changed settings for an axis that is an index of the variable being graphed, clicking this button applies these changes to that index for ''all ''graphs that use that index. For example, if the scale is the '''Index Time''', you can use this to change the [[Time]] scale (e.g., start and end year) for every graph that displays a value over [[Time]], unless you want to override that default in another graph.&lt;br /&gt;
&lt;br /&gt;
{{Release|6.0||&lt;br /&gt;
'''Hide labels''': When checked, the values are not shown on the corresponding axis. }}&lt;br /&gt;
&lt;br /&gt;
== Style tab ==&lt;br /&gt;
The '''Style '''tab lets you modify the display of the style and color of the grid, frame, and tick marks, and where to display the key.&lt;br /&gt;
&lt;br /&gt;
:{{Release||5.9|[[Image:GraphSetupDialog_Style5.png]]}}{{Release|6.0||[[Image:GraphSetupDialog_Style6.png]]}}&lt;br /&gt;
&lt;br /&gt;
'''Grid''': Select the radio button to control the display of the grid over the graphing area. You can also select the color. A light or medium gray is often a good choice.&lt;br /&gt;
&lt;br /&gt;
'''Frame''': Select the radio button to control the display of the lines framing the graphing area. You can also select the color for the frame. It is usually best to make the frame the same color as the grid, or a darker shade of the same color.&lt;br /&gt;
&lt;br /&gt;
'''Tick marks''': The top radio buttons control where to show tick marks. The lower ones control how they are displayed.&lt;br /&gt;
&lt;br /&gt;
'''Display key''': Select the radio button to control where to display the key on the graph. Select the ''Show border'' checkbox to display an outline rectangle around the key.&lt;br /&gt;
&lt;br /&gt;
== Text tab ==&lt;br /&gt;
The '''Text '''tab lets you change the font, size, style, and color on the graph for the text of axis titles, axis labels (i.e., numbers or text identifying points along each axis), {{Release|6.0||graph title (appearing above the graph)}}, key titles, and key labels (i.e., identifying values in the key).&lt;br /&gt;
&lt;br /&gt;
:{{Release||5.9|[[Image:GraphSetupDialog_Text5.png]]}}{{Release|6.0||[[Image:GraphSetupDialog_Text6.png]]}}&lt;br /&gt;
&lt;br /&gt;
'''Font''': Select the font family. Graphic designers recommend using the same font for all text, which you can easily do by leaving all except axis titles as “(Same as axis titles).”&lt;br /&gt;
&lt;br /&gt;
'''Size''': The size in typographic points. Set to 0 if you want that type of text to not display.&lt;br /&gt;
&lt;br /&gt;
'''Color''': Select the color.&lt;br /&gt;
&lt;br /&gt;
'''Bold, Italics, and Underline''': Check these boxes to add bold, italic, and underlined formats to the text.&lt;br /&gt;
&lt;br /&gt;
:[[File:Chapter7 23.png]]&lt;br /&gt;
&lt;br /&gt;
'''Axis Label Rotation''': Enter a number from -90 to 90 degrees to rotate the labels for each axis. For example, for a bar graph with many long labels along the horizontal axis, they won’t all fit. By rotating them by 45 or 90 degrees, you can make them all fit without getting truncated.&lt;br /&gt;
&lt;br /&gt;
'''Adapt displayed font sizes to graph height''': If you check this box, the font size automatically adjusts when you make the graph window larger or smaller. This can be useful when you give a demo and want to expand graphs so they are easily readable to people at the back of the room. The font sizes match those specified at the default graph height of 300 pixels.&lt;br /&gt;
&lt;br /&gt;
== Background tab ==&lt;br /&gt;
This tab lets you control the fill color, gradient, or pattern on the graph background. The main area covers the entire graph window (exclusive of the top area containing indexes). The plot area is the rectangle showing the graph values. If you leave or set the '''Fill '''to '''None '''for the '''Plot area '''or '''Key area''', they show the same fill settings (if any) as the '''Main area'''.&lt;br /&gt;
&lt;br /&gt;
:[[File:Chapter7 24.png]]&lt;br /&gt;
&lt;br /&gt;
'''Fill''': Select from:&lt;br /&gt;
&lt;br /&gt;
* '''None: '''No fill. Default to blank (white) background.&lt;br /&gt;
* '''Solid: '''Use a solid fill with the selected '''Color 1'''.&lt;br /&gt;
* '''Gradient: '''Use a gradient of color, going from '''Color 1 '''to '''Color 2''', in the direction you specify in '''Gradient style'''.&lt;br /&gt;
* '''Hatch: '''Use a hatched fill using the selected '''Hatch Style '''with '''Color 1 '''and '''Color 2'''.&lt;br /&gt;
&lt;br /&gt;
Graphic designers recommend avoiding hatched backgrounds, and using solid or gradient back- grounds with pale colors, if at all. The data should not be overwhelmed by the background.&lt;br /&gt;
&lt;br /&gt;
== Preview tab ==&lt;br /&gt;
This tab shows the graph using the current settings so that you can see their effects before you decide to '''Apply '''or '''Cancel '''them.&lt;br /&gt;
&lt;br /&gt;
:[[File:Chapter7 25.png]]&lt;br /&gt;
&lt;br /&gt;
== Categorical and Continuous Plots ==&lt;br /&gt;
Distinctions regarding whether your results are treated as being '''''categorical''''', '''''continuous''''', or '''''discrete''''' impact how the data is plotted. Analytica usually infers the appropriate distinctions, but occasionally you might need to provide explicit setting information.&lt;br /&gt;
&lt;br /&gt;
The [[discrete]]] vs. [[continuous]] distinction is determined by the [[domain attribute]], and determines whether probability plots are density and cumulative density plots (continuous) or probability mass and cumulative probability (discrete) plots.&lt;br /&gt;
&lt;br /&gt;
The categorical vs. continuous distinction determines how a graphing axis is laid out. Continuous dimensions require numeric values. The determination of whether a graphing dimension is categorical or continuous is partially determined by the domain attribute. However, the values actually occurring in the dimension are determined by the chart type (bar or non-bar chart) and by the ''Categorical ''checkbox in the axis range setting.&lt;br /&gt;
&lt;br /&gt;
== Exporting graph image type ==&lt;br /&gt;
You can export a graph as an image file in most common formats, including BMP, JPEG, TIFF, PNG, and Enhanced Windows Metafile (EMF):&lt;br /&gt;
&lt;br /&gt;
# Display the graph the way you want.&lt;br /&gt;
# Select '''Export '''from the '''File '''menu, to open the '''Save Graph Image as '''file browser dialog. &amp;lt;br /&amp;gt; [[File:Chapter7 26.png]]&lt;br /&gt;
# If you want to change the defaults, edit the '''File name '''and select the '''Save as type''', i.e., the file format.&lt;br /&gt;
# Click '''Save'''.&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
* [[Graph view of a result]]&lt;br /&gt;
* [[Graph settings]]&lt;br /&gt;
* [[Graph Setting Associations]]&lt;br /&gt;
* [[Interactive graph zooming]]&lt;br /&gt;
* [[Toggling Key Item Visibility]]&lt;br /&gt;
* [[Graph templates]]&lt;br /&gt;
* [[Graph Style Templates]]&lt;br /&gt;
* [[Graphs]]&lt;br /&gt;
* [[Customization of Graph Colors]]&lt;br /&gt;
* [[Graphing roles]]&lt;br /&gt;
* [[Graphics, frames, and text in a diagram]]&lt;br /&gt;
* [[Preferences]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;footer&amp;gt;Graphing roles / {{PAGENAME}} / Changing Series Colors&amp;lt;/footer&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=Graph_setup_dialog&amp;diff=63565</id>
		<title>Graph setup dialog</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=Graph_setup_dialog&amp;diff=63565"/>
		<updated>2025-12-16T21:40:49Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: /* Chart Type tab */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Analytica User Guide]] &lt;br /&gt;
[[Category: Windows and dialogs]]&lt;br /&gt;
[[Category: Graphs]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;breadcrumbs&amp;gt;Analytica User Guide &amp;gt; Graphs &amp;gt; {{PAGENAME}}&amp;lt;/breadcrumbs&amp;gt;&lt;br /&gt;
{{ReleaseBar}}&lt;br /&gt;
&lt;br /&gt;
==About graph setup==&lt;br /&gt;
The '''Graph setup dialog''' lets you apply a wide variety of graphing styles and options to the selected graph, or as the new defaults for all graphs in this model. It also lets you use or define graph templates, to apply a standard collection of styles and options to a graph.&lt;br /&gt;
&lt;br /&gt;
When you display the result of a variable, it shows it as a table or graph, according to how you last viewed it. The first time you view a result, it appears as a graph, unless you changed the default result view in the [[Preferences]] dialog.&lt;br /&gt;
&lt;br /&gt;
When displaying a graph, Analytica uses the default graphing settings, unless you have selected other settings for it. You can modify these with the [[Graph setup dialog]].&lt;br /&gt;
&lt;br /&gt;
'''To open the Graph setup dialog''': First display a graph. Then do one of these:&lt;br /&gt;
&lt;br /&gt;
* Select '''Graph Setup '''from the [[Result menu]].&lt;br /&gt;
* Select '''Graph Setup '''from the [[right mouse button menu]].&lt;br /&gt;
* Double-click the graph in the [[Result window]].&lt;br /&gt;
&lt;br /&gt;
The graph setup dialog has six tabs:&lt;br /&gt;
&lt;br /&gt;
* '''[[#Chart Type tab|Chart Type]]:''' Select the line style, effects, area fill, border, stacked, and assign color, symbol, or dash styles.&lt;br /&gt;
* '''[[#Axis Ranges tab|Axis Ranges]]:''' Set the ranges or autoscale, type (reverse, categorical, log, or hide) labels and number of ticks ticks on each axis. &lt;br /&gt;
* '''[[#Style tab|Style]]:''' Style of grid, frame, tick marks, and where to display the Key.&lt;br /&gt;
* '''[[#Text tab|Text]]:''' Set the font, size, style,a nd color for axis and key titles and labels.&lt;br /&gt;
* '''[[#Background tab|Background]]:''' Fill color, gradient, or pattern for the graph background (main, plot, or key areas.)&lt;br /&gt;
* '''[[#Preview tab|Preview]]:''' Show the graph with current settings so you can see their effects before you apply or cancel them.&lt;br /&gt;
&lt;br /&gt;
Each tabs shows the style template menu, and these three buttons:&lt;br /&gt;
&lt;br /&gt;
* '''Apply: '''Apply any changes to settings to the current graph, and close the dialog.&lt;br /&gt;
* '''Set Default: '''Save any changed settings on the current tab as the default for all graphs, and close the dialog. It does not affect any settings that you have not changed since you opened the '''Graph setup '''dialog. Changing a default affects all graphs that use the default, but not graphs for which you override the default (in the past or future).&lt;br /&gt;
* '''Cancel: '''Close the dialog without changing or saving anything.&lt;br /&gt;
&lt;br /&gt;
==Chart Type tab==&lt;br /&gt;
This tab shows options for modifying the style and arrangement of the graph.&lt;br /&gt;
&lt;br /&gt;
:{{Release||5.9|[[Image:GraphSetupDialog_LineStyleSettings5.png]]}}{{Release|6.0|6.2|[[Image:GraphSetupDialog_LineStyleSettings6.png]]}}{{Release|6.3||&lt;br /&gt;
[[Image:GraphSetupDialog LineStyleSettings6.3.png]]}}&lt;br /&gt;
&lt;br /&gt;
'''Line style''': &lt;br /&gt;
&lt;br /&gt;
:[[File:Chapter7 13.png]] Line segments join the data points.&lt;br /&gt;
&lt;br /&gt;
:[[File:Chapter7 14.png]] Line segments, with a symbol at each data point. &lt;br /&gt;
&lt;br /&gt;
:[[File:Chapter7 15.png]] A symbol at each data point with no lines.&lt;br /&gt;
&lt;br /&gt;
:[[File:Chapter7 16.png]] A pixel at each data point, with no line.&lt;br /&gt;
&lt;br /&gt;
:[[File:Chapter7 17.png]] A histogram or step function, with a vertical line and horizontal line from each data point to the next.&lt;br /&gt;
&lt;br /&gt;
:[[File:Chapter7 18.png]] A bar centered on each x value, with height showing the y value. Forces the graph to be discrete.&lt;br /&gt;
&lt;br /&gt;
'''Swap horizontal and vertical''': Check this box to exchange the x and y axes, so that x axis is vertical and y axis is horizontal. If x values are discrete with long labels, swapping axes gives a more easily legible bar graph.&lt;br /&gt;
&lt;br /&gt;
'''3D effects''': Check to use three-dimensional style to view graphs. For a bar graph line style, it offers the choice of ''Box ''or ''Cylindrical ''shapes for the bars.&lt;br /&gt;
&lt;br /&gt;
'''Sort by data spread''': Shows up in [[Analytica 5.0]] or later when your independent axis (X-axis) is categorical. Causes the categories in the X-axis to be re-ordered in decreasing order of data spread (or increasing order when you ''reverse order'' in the '''Axis Ranges''' tab). This is extremely useful when creating Tornado charts, since it automatically orders your tornado bars for you.&lt;br /&gt;
&lt;br /&gt;
'''Line style settings''': Displays when you select a line style showing lines.&lt;br /&gt;
&lt;br /&gt;
* '''Area fill:''' Check to fill in the area beneath each line with a solid color. If there are multiple lines, the graph has a '''''key index'''''. It draws the fill areas from last to first element of the key index, which works well if the y values are sorted from smallest to largest over the key index. Otherwise, later values obscure earlier ones. Here’s an example.&lt;br /&gt;
&lt;br /&gt;
:[[File:Chapter7 19.png]]&lt;br /&gt;
&lt;br /&gt;
* '''Fill type: '''Normally it fills the area from the Y-origin to the curve. If you select &amp;quot; When you create an XY plot, each of your curves may define a polygon, in which case the Polygon fill types instead fill the areas surrounded by the curve. When your curve crosses itself, the option ''Polygon alternate'' fills the areas that are surrounded an odd number of times, whereas &amp;quot;Polygon solid&amp;quot; fills areas surrounded any number of times.{{Release|6.3||&lt;br /&gt;
* ''With border: ''Appears with Area fill turned. Controls whether a think black border line appears along the edge of a filled area line style.}}&lt;br /&gt;
* ''Transparency: ''Drag the cursor to change transparency of fill colors between opaque and transparent. Transparency lets you see fill lines and areas that would otherwise be obscured behind others.&lt;br /&gt;
* ''Line thickness: ''Select the thickness of lines to display. (Only for styles that show lines.)&lt;br /&gt;
* ''Use separate color/symbol keys: ''Check to display two key index roles, one indicated by color and the other by symbol type or size.{{Release|6.0||&lt;br /&gt;
* ''Separate dash style key: ''Check to display the dash style role selector, which you can use to depict the values along one index using a dash style at the same time you use color to depict a different value, which separate keys. Since there are only 5 distinct dash styles, works best for indexes having five or fewer different values.}}&lt;br /&gt;
* ''Allow variable symbol size: ''Check to have the size of symbols vary with their value.&lt;br /&gt;
* ''Symbol size: ''Enter a number to specify size of symbols in typographic points.&lt;br /&gt;
* ''Min symbol size and Max symbol size: ''If you check ''Allow variable symbol size'', use these fields to specify the range of symbol sizes from smallest and largest.{{Release|5.3||&lt;br /&gt;
* ''Where steps transition: ''This option appears for step charts, and controls where the step transition occurs. Left and right transitions change in Y at the point, whereas Mid steps at the midpoint between points. }}&lt;br /&gt;
&lt;br /&gt;
'''Bar graph settings''': Displays when you select ''Bar ''graph line style:&lt;br /&gt;
* ''Shape: Box / Cylindrical'': When '''3-D effects''' are on, different 3-D shapes for the bar prisms.&lt;br /&gt;
* ''Enable bar outlines'': ([[Analytica 5.0]] or later). When on (default), a fine black line appears around the edges of the bars delineating their outline. (Note: If the bars get too narrow, the outline is automatically removed). &lt;br /&gt;
* ''Stacked bars: ''Check to show bars stacked one on top of the other over the key index, instead of side by side. The values for each bar are cumulated over the key index.&lt;br /&gt;
* ''Variable origin: ''Check if you want to set the origin (starting point) for each bar other than zero (the default). The graph then displays a '''Bar Origin '''menu to let you select the bar origin.&lt;br /&gt;
* ''Bar overlap: ''With stacked bars, they overlap 100%. You can specify partial overlap between 0 and 100%.&lt;br /&gt;
&lt;br /&gt;
== Axis Ranges tab ==&lt;br /&gt;
This tab lets you control the display for each axis, vertical and horizontal, including scaling, range, and tickmarks.&lt;br /&gt;
&lt;br /&gt;
:{{Release||5.9|[[Image:GraphSetupDialog_AxisRanges5.png]]}}{{Release|6.0||[[Image:GraphSetupDialog_AxisRanges6.png]]}}&lt;br /&gt;
&lt;br /&gt;
'''Autoscale''': Uncheck this box if you want to specify the range for the axis, instead of letting Analytica select the range automatically to include all values.&lt;br /&gt;
&lt;br /&gt;
'''Max and Min''': The maximum and minimum values of the range to use when you have unchecked '''Autoscale'''. '''Include zero'''Check if you want to include the origin (zero) in the range. You can also select the manual scaling range while viewing the graph graph using [[Interactive graph zooming]].&lt;br /&gt;
&lt;br /&gt;
'''Approx. &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; ticks''': Specify the number of tick marks to display along the axis. Analytica might not match the number exactly, in the interests of clarity.&lt;br /&gt;
&lt;br /&gt;
'''Reverse order''': Check this box if you want to show the values ordered from large to small instead of the default small to large.&lt;br /&gt;
&lt;br /&gt;
'''Categorical''': Treat this axis as categorical. Usually, Analytica figures out the quantity is categorical without help. Occasionally, if the values are numerical, you might want to control it yourself. See [[Probability density and mass graphs]].&lt;br /&gt;
&lt;br /&gt;
'''Log scale''': Check if you want to display this on a log scale. This is useful for numbers that vary by several orders of magnitude. It uses a “double log” scale with zero if the values include negative and positive numbers.&lt;br /&gt;
&lt;br /&gt;
'''Set default''': If you have changed settings for an axis that is an index of the variable being graphed, clicking this button applies these changes to that index for ''all ''graphs that use that index. For example, if the scale is the '''Index Time''', you can use this to change the [[Time]] scale (e.g., start and end year) for every graph that displays a value over [[Time]], unless you want to override that default in another graph.&lt;br /&gt;
&lt;br /&gt;
{{Release|6.0||&lt;br /&gt;
'''Hide labels''': When checked, the values are not shown on the corresponding axis. }}&lt;br /&gt;
&lt;br /&gt;
== Style tab ==&lt;br /&gt;
The '''Style '''tab lets you modify the display of the style and color of the grid, frame, and tick marks, and where to display the key.&lt;br /&gt;
&lt;br /&gt;
:{{Release||5.9|[[Image:GraphSetupDialog_Style5.png]]}}{{Release|6.0||[[Image:GraphSetupDialog_Style6.png]]}}&lt;br /&gt;
&lt;br /&gt;
'''Grid''': Select the radio button to control the display of the grid over the graphing area. You can also select the color. A light or medium gray is often a good choice.&lt;br /&gt;
&lt;br /&gt;
'''Frame''': Select the radio button to control the display of the lines framing the graphing area. You can also select the color for the frame. It is usually best to make the frame the same color as the grid, or a darker shade of the same color.&lt;br /&gt;
&lt;br /&gt;
'''Tick marks''': The top radio buttons control where to show tick marks. The lower ones control how they are displayed.&lt;br /&gt;
&lt;br /&gt;
'''Display key''': Select the radio button to control where to display the key on the graph. Select the ''Show border'' checkbox to display an outline rectangle around the key.&lt;br /&gt;
&lt;br /&gt;
== Text tab ==&lt;br /&gt;
The '''Text '''tab lets you change the font, size, style, and color on the graph for the text of axis titles, axis labels (i.e., numbers or text identifying points along each axis), {{Release|6.0||graph title (appearing above the graph)}}, key titles, and key labels (i.e., identifying values in the key).&lt;br /&gt;
&lt;br /&gt;
:{{Release||5.9|[[Image:GraphSetupDialog_Text5.png]]}}{{Release|6.0||[[Image:GraphSetupDialog_Text6.png]]}}&lt;br /&gt;
&lt;br /&gt;
'''Font''': Select the font family. Graphic designers recommend using the same font for all text, which you can easily do by leaving all except axis titles as “(Same as axis titles).”&lt;br /&gt;
&lt;br /&gt;
'''Size''': The size in typographic points. Set to 0 if you want that type of text to not display.&lt;br /&gt;
&lt;br /&gt;
'''Color''': Select the color.&lt;br /&gt;
&lt;br /&gt;
'''Bold, Italics, and Underline''': Check these boxes to add bold, italic, and underlined formats to the text.&lt;br /&gt;
&lt;br /&gt;
:[[File:Chapter7 23.png]]&lt;br /&gt;
&lt;br /&gt;
'''Axis Label Rotation''': Enter a number from -90 to 90 degrees to rotate the labels for each axis. For example, for a bar graph with many long labels along the horizontal axis, they won’t all fit. By rotating them by 45 or 90 degrees, you can make them all fit without getting truncated.&lt;br /&gt;
&lt;br /&gt;
'''Adapt displayed font sizes to graph height''': If you check this box, the font size automatically adjusts when you make the graph window larger or smaller. This can be useful when you give a demo and want to expand graphs so they are easily readable to people at the back of the room. The font sizes match those specified at the default graph height of 300 pixels.&lt;br /&gt;
&lt;br /&gt;
== Background tab ==&lt;br /&gt;
This tab lets you control the fill color, gradient, or pattern on the graph background. The main area covers the entire graph window (exclusive of the top area containing indexes). The plot area is the rectangle showing the graph values. If you leave or set the '''Fill '''to '''None '''for the '''Plot area '''or '''Key area''', they show the same fill settings (if any) as the '''Main area'''.&lt;br /&gt;
&lt;br /&gt;
:[[File:Chapter7 24.png]]&lt;br /&gt;
&lt;br /&gt;
'''Fill''': Select from:&lt;br /&gt;
&lt;br /&gt;
* '''None: '''No fill. Default to blank (white) background.&lt;br /&gt;
* '''Solid: '''Use a solid fill with the selected '''Color 1'''.&lt;br /&gt;
* '''Gradient: '''Use a gradient of color, going from '''Color 1 '''to '''Color 2''', in the direction you specify in '''Gradient style'''.&lt;br /&gt;
* '''Hatch: '''Use a hatched fill using the selected '''Hatch Style '''with '''Color 1 '''and '''Color 2'''.&lt;br /&gt;
&lt;br /&gt;
Graphic designers recommend avoiding hatched backgrounds, and using solid or gradient back- grounds with pale colors, if at all. The data should not be overwhelmed by the background.&lt;br /&gt;
&lt;br /&gt;
== Preview tab ==&lt;br /&gt;
This tab shows the graph using the current settings so that you can see their effects before you decide to '''Apply '''or '''Cancel '''them.&lt;br /&gt;
&lt;br /&gt;
:[[File:Chapter7 25.png]]&lt;br /&gt;
&lt;br /&gt;
== Categorical and Continuous Plots ==&lt;br /&gt;
Distinctions regarding whether your results are treated as being '''''categorical''''', '''''continuous''''', or '''''discrete''''' impact how the data is plotted. Analytica usually infers the appropriate distinctions, but occasionally you might need to provide explicit setting information.&lt;br /&gt;
&lt;br /&gt;
The [[discrete]]] vs. [[continuous]] distinction is determined by the [[domain attribute]], and determines whether probability plots are density and cumulative density plots (continuous) or probability mass and cumulative probability (discrete) plots.&lt;br /&gt;
&lt;br /&gt;
The categorical vs. continuous distinction determines how a graphing axis is laid out. Continuous dimensions require numeric values. The determination of whether a graphing dimension is categorical or continuous is partially determined by the domain attribute. However, the values actually occurring in the dimension are determined by the chart type (bar or non-bar chart) and by the ''Categorical ''checkbox in the axis range setting.&lt;br /&gt;
&lt;br /&gt;
== Exporting graph image type ==&lt;br /&gt;
You can export a graph as an image file in most common formats, including BMP, JPEG, TIFF, PNG, and Enhanced Windows Metafile (EMF):&lt;br /&gt;
&lt;br /&gt;
# Display the graph the way you want.&lt;br /&gt;
# Select '''Export '''from the '''File '''menu, to open the '''Save Graph Image as '''file browser dialog. &amp;lt;br /&amp;gt; [[File:Chapter7 26.png]]&lt;br /&gt;
# If you want to change the defaults, edit the '''File name '''and select the '''Save as type''', i.e., the file format.&lt;br /&gt;
# Click '''Save'''.&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
* [[Graph view of a result]]&lt;br /&gt;
* [[Graph settings]]&lt;br /&gt;
* [[Graph Setting Associations]]&lt;br /&gt;
* [[Interactive graph zooming]]&lt;br /&gt;
* [[Toggling Key Item Visibility]]&lt;br /&gt;
* [[Graph templates]]&lt;br /&gt;
* [[Graph Style Templates]]&lt;br /&gt;
* [[Graphs]]&lt;br /&gt;
* [[Customization of Graph Colors]]&lt;br /&gt;
* [[Graphing roles]]&lt;br /&gt;
* [[Graphics, frames, and text in a diagram]]&lt;br /&gt;
* [[Preferences]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;footer&amp;gt;Graphing roles / {{PAGENAME}} / Changing Series Colors&amp;lt;/footer&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=Graph_setup_dialog&amp;diff=63564</id>
		<title>Graph setup dialog</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=Graph_setup_dialog&amp;diff=63564"/>
		<updated>2025-12-16T21:35:03Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: Added summary of the 6 tabs with links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Analytica User Guide]] &lt;br /&gt;
[[Category: Windows and dialogs]]&lt;br /&gt;
[[Category: Graphs]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;breadcrumbs&amp;gt;Analytica User Guide &amp;gt; Graphs &amp;gt; {{PAGENAME}}&amp;lt;/breadcrumbs&amp;gt;&lt;br /&gt;
{{ReleaseBar}}&lt;br /&gt;
&lt;br /&gt;
==About graph setup==&lt;br /&gt;
The '''Graph setup dialog''' lets you apply a wide variety of graphing styles and options to the selected graph, or as the new defaults for all graphs in this model. It also lets you use or define graph templates, to apply a standard collection of styles and options to a graph.&lt;br /&gt;
&lt;br /&gt;
When you display the result of a variable, it shows it as a table or graph, according to how you last viewed it. The first time you view a result, it appears as a graph, unless you changed the default result view in the [[Preferences]] dialog.&lt;br /&gt;
&lt;br /&gt;
When displaying a graph, Analytica uses the default graphing settings, unless you have selected other settings for it. You can modify these with the [[Graph setup dialog]].&lt;br /&gt;
&lt;br /&gt;
'''To open the Graph setup dialog''': First display a graph. Then do one of these:&lt;br /&gt;
&lt;br /&gt;
* Select '''Graph Setup '''from the [[Result menu]].&lt;br /&gt;
* Select '''Graph Setup '''from the [[right mouse button menu]].&lt;br /&gt;
* Double-click the graph in the [[Result window]].&lt;br /&gt;
&lt;br /&gt;
The graph setup dialog has six tabs:&lt;br /&gt;
&lt;br /&gt;
* '''[[#Chart Type tab|Chart Type]]:''' Select the line style, effects, area fill, border, stacked, and assign color, symbol, or dash styles.&lt;br /&gt;
* '''[[#Axis Ranges tab|Axis Ranges]]:''' Set the ranges or autoscale, type (reverse, categorical, log, or hide) labels and number of ticks ticks on each axis. &lt;br /&gt;
* '''[[#Style tab|Style]]:''' Style of grid, frame, tick marks, and where to display the Key.&lt;br /&gt;
* '''[[#Text tab|Text]]:''' Set the font, size, style,a nd color for axis and key titles and labels.&lt;br /&gt;
* '''[[#Background tab|Background]]:''' Fill color, gradient, or pattern for the graph background (main, plot, or key areas.)&lt;br /&gt;
* '''[[#Preview tab|Preview]]:''' Show the graph with current settings so you can see their effects before you apply or cancel them.&lt;br /&gt;
&lt;br /&gt;
Each tabs shows the style template menu, and these three buttons:&lt;br /&gt;
&lt;br /&gt;
* '''Apply: '''Apply any changes to settings to the current graph, and close the dialog.&lt;br /&gt;
* '''Set Default: '''Save any changed settings on the current tab as the default for all graphs, and close the dialog. It does not affect any settings that you have not changed since you opened the '''Graph setup '''dialog. Changing a default affects all graphs that use the default, but not graphs for which you override the default (in the past or future).&lt;br /&gt;
* '''Cancel: '''Close the dialog without changing or saving anything.&lt;br /&gt;
&lt;br /&gt;
==Chart Type tab==&lt;br /&gt;
This tab shows options for modifying the style and arrangement of the graph.&lt;br /&gt;
&lt;br /&gt;
:{{Release||5.9|[[Image:GraphSetupDialog_LineStyleSettings5.png]]}}{{Release|6.0|6.2|[[Image:GraphSetupDialog_LineStyleSettings6.png]]}}{{Release|6.3||&lt;br /&gt;
[[Image:GraphSetupDialog LineStyleSettings6.3.png]]}}&lt;br /&gt;
&lt;br /&gt;
'''Line style''': &lt;br /&gt;
&lt;br /&gt;
:[[File:Chapter7 13.png]] Line segments join the data points.&lt;br /&gt;
&lt;br /&gt;
:[[File:Chapter7 14.png]] Line segments, with a symbol at each data point. &lt;br /&gt;
&lt;br /&gt;
:[[File:Chapter7 15.png]] A symbol at each data point with no lines.&lt;br /&gt;
&lt;br /&gt;
:[[File:Chapter7 16.png]] A pixel at each data point, with no line.&lt;br /&gt;
&lt;br /&gt;
:[[File:Chapter7 17.png]] A histogram or step function, with a vertical line and horizontal line from each data point to the next.&lt;br /&gt;
&lt;br /&gt;
:[[File:Chapter7 18.png]] A bar centered on each x value, with height showing the y value. Forces the graph to be discrete.&lt;br /&gt;
&lt;br /&gt;
'''Swap horizontal and vertical''': Check this box to exchange the x and y axes, so that x axis is vertical and y axis is horizontal. If x values are discrete with long labels, swapping axes gives a more easily legible bar graph.&lt;br /&gt;
&lt;br /&gt;
'''3D effects''': Check to use three-dimensional style to view graphs. For a bar graph line style, it offers the choice of ''Box ''or ''Cylindrical ''shapes for the bars.&lt;br /&gt;
&lt;br /&gt;
'''Sort by data spread''': Shows up in [[Analytica 5.0]] or later when your independent axis (X-axis) is categorical. Causes the categories in the X-axis to be re-ordered in decreasing order of data spread (or increasing order when you ''reverse order'' in the '''Axis Ranges''' tab). This is extremely useful when creating Tornado charts, since it automatically orders your tornado bars for you.&lt;br /&gt;
&lt;br /&gt;
'''Line style settings''': Displays when you select a line style showing lines.&lt;br /&gt;
&lt;br /&gt;
* ''Area fill: ''Check to fill in the area beneath each line with a solid color. If there are multiple lines, the graph has a '''''key index'''''. It draws the fill areas from last to first element of the key index, which works well if the y values are sorted from smallest to largest over the key index. Otherwise, later values obscure earlier ones. Here’s an example.&lt;br /&gt;
&lt;br /&gt;
:[[File:Chapter7 19.png]]&lt;br /&gt;
&lt;br /&gt;
* ''Fill type: ''Normally an area fill paints the area from the Y-origin to the curve. When you create an XY plot, each of your curves may define a polygon, in which case the Polygon fill types instead fill the areas surrounded by the curve. When your curve crosses itself, the option ''Polygon alternate'' fills the areas that are surrounded an odd number of times, whereas &amp;quot;Polygon solid&amp;quot; fills areas surrounded any number of times.{{Release|6.3||&lt;br /&gt;
* ''With border: ''Appears with Area fill turned. Controls whether a think black border line appears along the edge of a filled area line style.}}&lt;br /&gt;
* ''Transparency: ''Drag the cursor to change transparency of fill colors between opaque and transparent. Transparency lets you see fill lines and areas that would otherwise be obscured behind others.&lt;br /&gt;
* ''Line thickness: ''Select the thickness of lines to display. (Only for styles that show lines.)&lt;br /&gt;
* ''Use separate color/symbol keys: ''Check to display two key index roles, one indicated by color and the other by symbol type or size.{{Release|6.0||&lt;br /&gt;
* ''Separate dash style key: ''Check to display the dash style role selector, which you can use to depict the values along one index using a dash style at the same time you use color to depict a different value, which separate keys. Since there are only 5 distinct dash styles, works best for indexes having five or fewer different values.}}&lt;br /&gt;
* ''Allow variable symbol size: ''Check to have the size of symbols vary with their value.&lt;br /&gt;
* ''Symbol size: ''Enter a number to specify size of symbols in typographic points.&lt;br /&gt;
* ''Min symbol size and Max symbol size: ''If you check ''Allow variable symbol size'', use these fields to specify the range of symbol sizes from smallest and largest.{{Release|5.3||&lt;br /&gt;
* ''Where steps transition: ''This option appears for step charts, and controls where the step transition occurs. Left and right transitions change in Y at the point, whereas Mid steps at the midpoint between points. }}&lt;br /&gt;
&lt;br /&gt;
'''Bar graph settings''': Displays when you select ''Bar ''graph line style:&lt;br /&gt;
* ''Shape: Box / Cylindrical'': When '''3-D effects''' are on, different 3-D shapes for the bar prisms.&lt;br /&gt;
* ''Enable bar outlines'': ([[Analytica 5.0]] or later). When on (default), a fine black line appears around the edges of the bars delineating their outline. (Note: If the bars get too narrow, the outline is automatically removed). &lt;br /&gt;
* ''Stacked bars: ''Check to show bars stacked one on top of the other over the key index, instead of side by side. The values for each bar are cumulated over the key index.&lt;br /&gt;
* ''Variable origin: ''Check if you want to set the origin (starting point) for each bar other than zero (the default). The graph then displays a '''Bar Origin '''menu to let you select the bar origin.&lt;br /&gt;
* ''Bar overlap: ''With stacked bars, they overlap 100%. You can specify partial overlap between 0 and 100%.&lt;br /&gt;
&lt;br /&gt;
== Axis Ranges tab ==&lt;br /&gt;
This tab lets you control the display for each axis, vertical and horizontal, including scaling, range, and tickmarks.&lt;br /&gt;
&lt;br /&gt;
:{{Release||5.9|[[Image:GraphSetupDialog_AxisRanges5.png]]}}{{Release|6.0||[[Image:GraphSetupDialog_AxisRanges6.png]]}}&lt;br /&gt;
&lt;br /&gt;
'''Autoscale''': Uncheck this box if you want to specify the range for the axis, instead of letting Analytica select the range automatically to include all values.&lt;br /&gt;
&lt;br /&gt;
'''Max and Min''': The maximum and minimum values of the range to use when you have unchecked '''Autoscale'''. '''Include zero'''Check if you want to include the origin (zero) in the range. You can also select the manual scaling range while viewing the graph graph using [[Interactive graph zooming]].&lt;br /&gt;
&lt;br /&gt;
'''Approx. &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; ticks''': Specify the number of tick marks to display along the axis. Analytica might not match the number exactly, in the interests of clarity.&lt;br /&gt;
&lt;br /&gt;
'''Reverse order''': Check this box if you want to show the values ordered from large to small instead of the default small to large.&lt;br /&gt;
&lt;br /&gt;
'''Categorical''': Treat this axis as categorical. Usually, Analytica figures out the quantity is categorical without help. Occasionally, if the values are numerical, you might want to control it yourself. See [[Probability density and mass graphs]].&lt;br /&gt;
&lt;br /&gt;
'''Log scale''': Check if you want to display this on a log scale. This is useful for numbers that vary by several orders of magnitude. It uses a “double log” scale with zero if the values include negative and positive numbers.&lt;br /&gt;
&lt;br /&gt;
'''Set default''': If you have changed settings for an axis that is an index of the variable being graphed, clicking this button applies these changes to that index for ''all ''graphs that use that index. For example, if the scale is the '''Index Time''', you can use this to change the [[Time]] scale (e.g., start and end year) for every graph that displays a value over [[Time]], unless you want to override that default in another graph.&lt;br /&gt;
&lt;br /&gt;
{{Release|6.0||&lt;br /&gt;
'''Hide labels''': When checked, the values are not shown on the corresponding axis. }}&lt;br /&gt;
&lt;br /&gt;
== Style tab ==&lt;br /&gt;
The '''Style '''tab lets you modify the display of the style and color of the grid, frame, and tick marks, and where to display the key.&lt;br /&gt;
&lt;br /&gt;
:{{Release||5.9|[[Image:GraphSetupDialog_Style5.png]]}}{{Release|6.0||[[Image:GraphSetupDialog_Style6.png]]}}&lt;br /&gt;
&lt;br /&gt;
'''Grid''': Select the radio button to control the display of the grid over the graphing area. You can also select the color. A light or medium gray is often a good choice.&lt;br /&gt;
&lt;br /&gt;
'''Frame''': Select the radio button to control the display of the lines framing the graphing area. You can also select the color for the frame. It is usually best to make the frame the same color as the grid, or a darker shade of the same color.&lt;br /&gt;
&lt;br /&gt;
'''Tick marks''': The top radio buttons control where to show tick marks. The lower ones control how they are displayed.&lt;br /&gt;
&lt;br /&gt;
'''Display key''': Select the radio button to control where to display the key on the graph. Select the ''Show border'' checkbox to display an outline rectangle around the key.&lt;br /&gt;
&lt;br /&gt;
== Text tab ==&lt;br /&gt;
The '''Text '''tab lets you change the font, size, style, and color on the graph for the text of axis titles, axis labels (i.e., numbers or text identifying points along each axis), {{Release|6.0||graph title (appearing above the graph)}}, key titles, and key labels (i.e., identifying values in the key).&lt;br /&gt;
&lt;br /&gt;
:{{Release||5.9|[[Image:GraphSetupDialog_Text5.png]]}}{{Release|6.0||[[Image:GraphSetupDialog_Text6.png]]}}&lt;br /&gt;
&lt;br /&gt;
'''Font''': Select the font family. Graphic designers recommend using the same font for all text, which you can easily do by leaving all except axis titles as “(Same as axis titles).”&lt;br /&gt;
&lt;br /&gt;
'''Size''': The size in typographic points. Set to 0 if you want that type of text to not display.&lt;br /&gt;
&lt;br /&gt;
'''Color''': Select the color.&lt;br /&gt;
&lt;br /&gt;
'''Bold, Italics, and Underline''': Check these boxes to add bold, italic, and underlined formats to the text.&lt;br /&gt;
&lt;br /&gt;
:[[File:Chapter7 23.png]]&lt;br /&gt;
&lt;br /&gt;
'''Axis Label Rotation''': Enter a number from -90 to 90 degrees to rotate the labels for each axis. For example, for a bar graph with many long labels along the horizontal axis, they won’t all fit. By rotating them by 45 or 90 degrees, you can make them all fit without getting truncated.&lt;br /&gt;
&lt;br /&gt;
'''Adapt displayed font sizes to graph height''': If you check this box, the font size automatically adjusts when you make the graph window larger or smaller. This can be useful when you give a demo and want to expand graphs so they are easily readable to people at the back of the room. The font sizes match those specified at the default graph height of 300 pixels.&lt;br /&gt;
&lt;br /&gt;
== Background tab ==&lt;br /&gt;
This tab lets you control the fill color, gradient, or pattern on the graph background. The main area covers the entire graph window (exclusive of the top area containing indexes). The plot area is the rectangle showing the graph values. If you leave or set the '''Fill '''to '''None '''for the '''Plot area '''or '''Key area''', they show the same fill settings (if any) as the '''Main area'''.&lt;br /&gt;
&lt;br /&gt;
:[[File:Chapter7 24.png]]&lt;br /&gt;
&lt;br /&gt;
'''Fill''': Select from:&lt;br /&gt;
&lt;br /&gt;
* '''None: '''No fill. Default to blank (white) background.&lt;br /&gt;
* '''Solid: '''Use a solid fill with the selected '''Color 1'''.&lt;br /&gt;
* '''Gradient: '''Use a gradient of color, going from '''Color 1 '''to '''Color 2''', in the direction you specify in '''Gradient style'''.&lt;br /&gt;
* '''Hatch: '''Use a hatched fill using the selected '''Hatch Style '''with '''Color 1 '''and '''Color 2'''.&lt;br /&gt;
&lt;br /&gt;
Graphic designers recommend avoiding hatched backgrounds, and using solid or gradient back- grounds with pale colors, if at all. The data should not be overwhelmed by the background.&lt;br /&gt;
&lt;br /&gt;
== Preview tab ==&lt;br /&gt;
This tab shows the graph using the current settings so that you can see their effects before you decide to '''Apply '''or '''Cancel '''them.&lt;br /&gt;
&lt;br /&gt;
:[[File:Chapter7 25.png]]&lt;br /&gt;
&lt;br /&gt;
== Categorical and Continuous Plots ==&lt;br /&gt;
Distinctions regarding whether your results are treated as being '''''categorical''''', '''''continuous''''', or '''''discrete''''' impact how the data is plotted. Analytica usually infers the appropriate distinctions, but occasionally you might need to provide explicit setting information.&lt;br /&gt;
&lt;br /&gt;
The [[discrete]]] vs. [[continuous]] distinction is determined by the [[domain attribute]], and determines whether probability plots are density and cumulative density plots (continuous) or probability mass and cumulative probability (discrete) plots.&lt;br /&gt;
&lt;br /&gt;
The categorical vs. continuous distinction determines how a graphing axis is laid out. Continuous dimensions require numeric values. The determination of whether a graphing dimension is categorical or continuous is partially determined by the domain attribute. However, the values actually occurring in the dimension are determined by the chart type (bar or non-bar chart) and by the ''Categorical ''checkbox in the axis range setting.&lt;br /&gt;
&lt;br /&gt;
== Exporting graph image type ==&lt;br /&gt;
You can export a graph as an image file in most common formats, including BMP, JPEG, TIFF, PNG, and Enhanced Windows Metafile (EMF):&lt;br /&gt;
&lt;br /&gt;
# Display the graph the way you want.&lt;br /&gt;
# Select '''Export '''from the '''File '''menu, to open the '''Save Graph Image as '''file browser dialog. &amp;lt;br /&amp;gt; [[File:Chapter7 26.png]]&lt;br /&gt;
# If you want to change the defaults, edit the '''File name '''and select the '''Save as type''', i.e., the file format.&lt;br /&gt;
# Click '''Save'''.&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
* [[Graph view of a result]]&lt;br /&gt;
* [[Graph settings]]&lt;br /&gt;
* [[Graph Setting Associations]]&lt;br /&gt;
* [[Interactive graph zooming]]&lt;br /&gt;
* [[Toggling Key Item Visibility]]&lt;br /&gt;
* [[Graph templates]]&lt;br /&gt;
* [[Graph Style Templates]]&lt;br /&gt;
* [[Graphs]]&lt;br /&gt;
* [[Customization of Graph Colors]]&lt;br /&gt;
* [[Graphing roles]]&lt;br /&gt;
* [[Graphics, frames, and text in a diagram]]&lt;br /&gt;
* [[Preferences]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;footer&amp;gt;Graphing roles / {{PAGENAME}} / Changing Series Colors&amp;lt;/footer&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_6.6%3F&amp;diff=63563</id>
		<title>What's new in Analytica 6.6?</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_6.6%3F&amp;diff=63563"/>
		<updated>2025-12-16T21:24:18Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: /* Graphing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:What's new pages]]&lt;br /&gt;
[[category:Analytica releases]]&lt;br /&gt;
&amp;lt;!--This page lists new features in release 6.6, which is currently in beta testing prior to final release. Analytica 6.6 is currently in [[Beta Tester Page|Beta Testing]].  If have have an active subscription license, we encourage you to try it out from the [[Beta Tester Page]].--&amp;gt;&lt;br /&gt;
This page lists new features in release 6.6 (the current release) of Analytica (including [[ACP]] and [[ADE]]) since the previous [[Analytica 6.5]] release. &lt;br /&gt;
&lt;br /&gt;
Analytica normally prompts you to download and install the new release the next time you run it.&lt;br /&gt;
If not, you can download it from [https://analytica.com/users/renew-upgrade/ Renew, upgrade or download].&lt;br /&gt;
&lt;br /&gt;
== Highlights of 6.6 ==&lt;br /&gt;
&lt;br /&gt;
* [[#Assista|Assista]], the Analytica AI Assistant, is faster and more reponsive.&lt;br /&gt;
* The [[#Keelin Metalog distribution 2.0|Keelin (or Metalog) distribution]] is now the preferred method to define any continuous distribution, because it now avoids the occasional infeasibility problem that previously bedeviled it.&lt;br /&gt;
* You can select [[#Diagrams and controls|All in Checkboxes]] for parametric analysis  and in Multichoice.&lt;br /&gt;
* You can use [[Links_or_URL_in_model_attributes#Extended_HTML_markup| html to set text styles in text nodes]], including bold, italic, underline, bold, colors, bullets, and more in desktop Analytica. Even more html tags work in ACP.&lt;br /&gt;
* [[#Expression language|Sum(x, All) sums over All indexes of x]]. Similar for Min, Max, Product, and more.&lt;br /&gt;
* The new [[OAuth2Authorize]] function lets you access web services, such as Google docs, sheets, Salesforce, etc to read or write data.&lt;br /&gt;
* You can specify a [[#Graphing|Fill origin for graphs]] to let you show colored bands around the center line -- e.g. for probability bands over time.&lt;br /&gt;
&lt;br /&gt;
== Assista ==&lt;br /&gt;
* The chat UI is faster. Responses start streaming sooner.&lt;br /&gt;
* You can use the Enter key (or Ctrl+Alt) to submit responses without having to click to submit button. The Return key adds a new line (the behavior elsewhere in Analytica).  If you have the [[Preferences_dialog#Personal_Preferences|Use Return to enter data]] preference set, then the Return key will submit responses and the Enter key adds a new line.&lt;br /&gt;
&lt;br /&gt;
== Keelin Metalog distribution 2.0 ==&lt;br /&gt;
Introducing the '''''always feasible''''', [[Keelin|infinitely flexible distribution]]!&lt;br /&gt;
&lt;br /&gt;
The  [[Keelin (MetaLog) distribution]] has become popular due to its ability to closely match the shapes of all the standard continuous distributions as well as offering enormous flexibility in matching amost any shape. But up until now it has been plagued by finding some parameter combinations ''infleasible'',  so it would sometimes fail t to find a valid distribution to fit.&lt;br /&gt;
&lt;br /&gt;
[[Analytica 6.6]] fixes this problem with the MetaLog 2.0 distribution. It includes many new results from &lt;br /&gt;
* Manel Baucells, Lonnie Chrisman, Thomas W. Keelin and Stephen Xu (2025), &amp;quot;[https://papers.ssrn.com/sol3/papers.cfm?abstract_id=5279416 On the properties of the Metalog distribution]&amp;quot; (preprint), forthcoming.&lt;br /&gt;
&lt;br /&gt;
New features include:&lt;br /&gt;
* The resulting [[Keelin (MetaLog) distribution]]s are ''always'' feasible.&lt;br /&gt;
* There are closed-form analytic expressions for all central and standardized moments (see [[KeelinPropertyFromA#Basic_statistics_and_moments]]). &lt;br /&gt;
* There is a closed-form analytic expression for partial expectation (see [[KeelinPropertyFromA#Partial_expectation]]). This makes the Keelin distribution especially convenient for many problems that use piecewise-linear transformations of an uncertain quantity.&lt;br /&gt;
* It uses the superior basis order of the MetaLog 2.0.&lt;br /&gt;
* You can also specify the desired «mean», in addition to «values» (data points).&lt;br /&gt;
* New set of functions with names of the form &amp;lt;code&amp;gt;&amp;lt;x&amp;gt;KeelinFromA(...)&amp;lt;/code&amp;gt;use the «a» coefficient vector from [[KeelinCoefficients]]:&lt;br /&gt;
** &amp;lt;code&amp;gt;[[KeelinFromA]](...)&amp;lt;/code&amp;gt; -- analog to &amp;lt;code&amp;gt;[[Keelin]](...)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;[[DensKeelinFromA]](...)&amp;lt;/code&amp;gt; -- analog to &amp;lt;code&amp;gt;[[DensKeelin]](...)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;[[CumKeelinFromA]](...)&amp;lt;/code&amp;gt; -- analog to &amp;lt;code&amp;gt;[[CumKeelin]](...)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;[[CumKeelinInvFromA]](...)&amp;lt;/code&amp;gt; -- analog to &amp;lt;code&amp;gt;[[CumKeelinInv]](...)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;[[KeelinPropertyFromA]](...)&amp;lt;/code&amp;gt; -- ''new to [[Analytica 6.6]]''&lt;br /&gt;
*:When using the Keelin distribution,  you can either use a quantile parameterization or an «a»-vector parameterization. These new functions make it clearer that you are using the «a»-vector parameterization, instead of using the original (analogous) functions with a special flag. &lt;br /&gt;
* A new option uses a [https://docs.analytica.com/index.php?title=Keelin_(MetaLog)_distribution&amp;amp;anarelease=6.6#Using_direct_method_for_bounds direct method for bounded support] as an alternative to the previous [https://docs.analytica.com/index.php?title=Keelin_(MetaLog)_distribution&amp;amp;anarelease=6.6#Using_the_Transform_method_for_bounds transform-method for bounded support].&lt;br /&gt;
&lt;br /&gt;
== Diagrams and controls ==&lt;br /&gt;
* [[Checkbox]] now has an &amp;quot;include ALL&amp;quot; option, enabling [[Parametric analysis]] even with a checkbox.&lt;br /&gt;
* [[Multichoice]] controls include a new option at the top to ''select '''all''''', ''select '''none''''' or ''select '''first''''', depending on the context. These are more obvious to the user than using the &amp;lt;code&amp;gt;Ctrl+A&amp;lt;/code&amp;gt; key.&lt;br /&gt;
* A text node can display several [[Links_or_URL_in_model_attributes#Extended_HTML_markup|new html formatting options]], including changes to text color, bullets and numbered lists.&lt;br /&gt;
* A new [[ChangeNodeVisibility|node visibility option]] lets you hide a node while Analytica is computing.&lt;br /&gt;
&lt;br /&gt;
== Expression language ==&lt;br /&gt;
* There is a new separate &amp;lt;code&amp;gt;Boolean&amp;lt;/code&amp;gt; data type. To preserve backward compatibility, the values continue to display as 0 or 1, but the [[Number format dialog]] provides an option to display values with the boolean data type as True or False to distinguish them from 0 and 1. &lt;br /&gt;
* You can now find the maximum over all indexes of &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; using &lt;br /&gt;
*::&amp;lt;code&amp;gt;[[Max]](X, All)&amp;lt;/code&amp;gt; &lt;br /&gt;
*:as a shortcut for &lt;br /&gt;
*::&amp;lt;code&amp;gt;[[Max]]( X, ...[[IndexesOf]](X) )&amp;lt;/code&amp;gt;&lt;br /&gt;
*:which uses [[Repeated parameter forwarding]]. The &amp;lt;code&amp;gt;All&amp;lt;/code&amp;gt; keyword works for these array-reducing functions, [[Sum]],  [[Min]], [[BitAnd]], [[BitOr]] and [[BitXOr]].&lt;br /&gt;
* If you write your own function, and want it to accept the keyword &amp;lt;code&amp;gt;All&amp;lt;/code&amp;gt; for a repeated index parameter, you can include a new &amp;lt;code&amp;gt;OrAll&amp;lt;/code&amp;gt; [[Function parameter qualifiers|function parameter qualifier]].&lt;br /&gt;
* When passing a [[Local function]] (aka '''lambda function''') as a parameter to a function call, you no longer have to include a function name (which wasn't used anyway).&lt;br /&gt;
* You can use '.. operator ([[Repeated parameter forwarding]]) on literal lists to &amp;quot;splat&amp;quot; lists (or 1-D arrays) together into the list. Example:&lt;br /&gt;
*:&amp;lt;code&amp;gt;[[Local]] s1 := 'c'..'f', s2 := 'h'..'k' Do [ 'a', 'b', ...s1, 'g', ...s2, 'l' ]&amp;lt;/code&amp;gt;&lt;br /&gt;
*::&amp;amp;rarr; &amp;lt;code&amp;gt;['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l']&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Built-in functions ==&lt;br /&gt;
* [[OAuth2Authorize]]: A new function to log into web services such as Google docs, sheets, Salesforce, etc., which makes it much easier for Analytica models to access (read from or write to) web applications that require authentication.&lt;br /&gt;
* &amp;lt;code&amp;gt;[[TypeOf]](x, shallow: True)&amp;lt;/code&amp;gt; now returns &amp;lt;code&amp;gt;&amp;quot;Image&amp;quot;&amp;lt;/code&amp;gt; when &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; is an image.&lt;br /&gt;
* When &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; is an image, &amp;lt;code&amp;gt;f&amp;quot;{x:H}&amp;quot;&amp;lt;/code&amp;gt; returns the long hex string that appears in a [[Pict]] attribute in a model file (but without the parens around it that appear in the model file).&lt;br /&gt;
* [[ReadTextFile]] returns the file encoding as its fourth return value.&lt;br /&gt;
* [[RunConsoleProcess]] is able to launch several applications that it previous could not, including PowerShell.&lt;br /&gt;
* New syntactic extensions added to the [[Arrow_operator#x_.E2.86.92_.5Bi.5D|arrow operator]], namely   &amp;lt;code&amp;gt;x&amp;amp;rarr;[n]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;x&amp;amp;rarr;[m..n]&amp;lt;/code&amp;gt; for [[Text values]] and [[In-memory binary data terms]].&lt;br /&gt;
&lt;br /&gt;
== File saving and loading ==&lt;br /&gt;
* '''Add Library...''' defaults to ''Link to filed module or library'' for almost all the standard libraries, which is the preferred way to add libraries to your model. (Except it still defaults to ''Embed a copy'' for the [[ACP Style Library]] since that library acts more module-like and changes its internal state).&lt;br /&gt;
* You can now set the [[Att_Dirties]] attribute (to 0) for your own user Variables. When set to 0, a change to the Definition doesn't dirty the Library or module that contains the Variable.&lt;br /&gt;
&lt;br /&gt;
== Example models and libraries ==&lt;br /&gt;
* A new example model included: &amp;lt;code&amp;gt;&amp;quot;Engineering / Generator availability.ana&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* An able to handle file paths &amp;gt; 256 characters in most cases. Actually taking advantage of this requires you to have long paths enabled in Windows, e.g., by setting the registry setting&lt;br /&gt;
*::&amp;lt;code&amp;gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem :: LongPathsEnabled = 1&amp;lt;/code&amp;gt;&lt;br /&gt;
*:or  by using the &amp;lt;code&amp;gt;\\unc\.... &amp;lt;/code&amp;gt; syntax for file paths. However, long file paths are not supported by Microsoft One drive or by Microsoft office, including Excel, so you cannot use long paths for files within a One drive folder or when opening a spreadsheet file.&lt;br /&gt;
* Several of the diagram themes in the [[Themes Library]] were renamed. &lt;br /&gt;
&lt;br /&gt;
== Graphing ==&lt;br /&gt;
* For Filled-area charts, you can now set the Fill type to &amp;quot;From origin&amp;quot;. &lt;br /&gt;
*: One example usage for this is to select &amp;lt;code&amp;gt;.Probability=0.5&amp;lt;/code&amp;gt; as the fill origin in a probability bands plot, which results in a plot like this one&lt;br /&gt;
*:::[[image:filled_bands_plot.png]]&lt;br /&gt;
*: You could previously do this by placing the [[Plot solid prob bands]] function in the [[OnGraphDraw]] attribute, but the new feature is much easier to configure, with just a few clicks in the [[Graph setup dialog]].&lt;br /&gt;
* '''Graph Setup / Text / Adapt displayed font sizes to graph height''' now uses the current height of the  graph window you were viewing as the reference height, so that the font sizes you select in the graph setup dialog will be correct when the graph is at that height.  Font sizes automatically adjust when you change the graph window size. Previously the reference height was fixed at the default result window height (a graph of 241 pixels tall), which tended to make the fonts way too large for normal window heights.  We now recommend using this setting by default so that text on graphs is easily legible at various sizes.&lt;br /&gt;
&lt;br /&gt;
== Other GUI ==&lt;br /&gt;
* There are a few new options on the '''Windows''' menu:&lt;br /&gt;
** Bring next window to front &lt;br /&gt;
** Bring previous window to front&lt;br /&gt;
** [[Typescript window|Typescript console]] to show the Typescript window. (Still also available with ctrl+'.)&lt;br /&gt;
&lt;br /&gt;
== Licensing ==&lt;br /&gt;
* [[ParseJSON]] and [[MakeJSON]] no longer require {{Analytica Enterprise}}.&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_6.6%3F&amp;diff=63562</id>
		<title>What's new in Analytica 6.6?</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_6.6%3F&amp;diff=63562"/>
		<updated>2025-12-16T19:49:35Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: /* Other GUI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:What's new pages]]&lt;br /&gt;
[[category:Analytica releases]]&lt;br /&gt;
&amp;lt;!--This page lists new features in release 6.6, which is currently in beta testing prior to final release. Analytica 6.6 is currently in [[Beta Tester Page|Beta Testing]].  If have have an active subscription license, we encourage you to try it out from the [[Beta Tester Page]].--&amp;gt;&lt;br /&gt;
This page lists new features in release 6.6 (the current release) of Analytica (including [[ACP]] and [[ADE]]) since the previous [[Analytica 6.5]] release. &lt;br /&gt;
&lt;br /&gt;
Analytica normally prompts you to download and install the new release the next time you run it.&lt;br /&gt;
If not, you can download it from [https://analytica.com/users/renew-upgrade/ Renew, upgrade or download].&lt;br /&gt;
&lt;br /&gt;
== Highlights of 6.6 ==&lt;br /&gt;
&lt;br /&gt;
* [[#Assista|Assista]], the Analytica AI Assistant, is faster and more reponsive.&lt;br /&gt;
* The [[#Keelin Metalog distribution 2.0|Keelin (or Metalog) distribution]] is now the preferred method to define any continuous distribution, because it now avoids the occasional infeasibility problem that previously bedeviled it.&lt;br /&gt;
* You can select [[#Diagrams and controls|All in Checkboxes]] for parametric analysis  and in Multichoice.&lt;br /&gt;
* You can use [[Links_or_URL_in_model_attributes#Extended_HTML_markup| html to set text styles in text nodes]], including bold, italic, underline, bold, colors, bullets, and more in desktop Analytica. Even more html tags work in ACP.&lt;br /&gt;
* [[#Expression language|Sum(x, All) sums over All indexes of x]]. Similar for Min, Max, Product, and more.&lt;br /&gt;
* The new [[OAuth2Authorize]] function lets you access web services, such as Google docs, sheets, Salesforce, etc to read or write data.&lt;br /&gt;
* You can specify a [[#Graphing|Fill origin for graphs]] to let you show colored bands around the center line -- e.g. for probability bands over time.&lt;br /&gt;
&lt;br /&gt;
== Assista ==&lt;br /&gt;
* The chat UI is faster. Responses start streaming sooner.&lt;br /&gt;
* You can use the Enter key (or Ctrl+Alt) to submit responses without having to click to submit button. The Return key adds a new line (the behavior elsewhere in Analytica).  If you have the [[Preferences_dialog#Personal_Preferences|Use Return to enter data]] preference set, then the Return key will submit responses and the Enter key adds a new line.&lt;br /&gt;
&lt;br /&gt;
== Keelin Metalog distribution 2.0 ==&lt;br /&gt;
Introducing the '''''always feasible''''', [[Keelin|infinitely flexible distribution]]!&lt;br /&gt;
&lt;br /&gt;
The  [[Keelin (MetaLog) distribution]] has become popular due to its ability to closely match the shapes of all the standard continuous distributions as well as offering enormous flexibility in matching amost any shape. But up until now it has been plagued by finding some parameter combinations ''infleasible'',  so it would sometimes fail t to find a valid distribution to fit.&lt;br /&gt;
&lt;br /&gt;
[[Analytica 6.6]] fixes this problem with the MetaLog 2.0 distribution. It includes many new results from &lt;br /&gt;
* Manel Baucells, Lonnie Chrisman, Thomas W. Keelin and Stephen Xu (2025), &amp;quot;[https://papers.ssrn.com/sol3/papers.cfm?abstract_id=5279416 On the properties of the Metalog distribution]&amp;quot; (preprint), forthcoming.&lt;br /&gt;
&lt;br /&gt;
New features include:&lt;br /&gt;
* The resulting [[Keelin (MetaLog) distribution]]s are ''always'' feasible.&lt;br /&gt;
* There are closed-form analytic expressions for all central and standardized moments (see [[KeelinPropertyFromA#Basic_statistics_and_moments]]). &lt;br /&gt;
* There is a closed-form analytic expression for partial expectation (see [[KeelinPropertyFromA#Partial_expectation]]). This makes the Keelin distribution especially convenient for many problems that use piecewise-linear transformations of an uncertain quantity.&lt;br /&gt;
* It uses the superior basis order of the MetaLog 2.0.&lt;br /&gt;
* You can also specify the desired «mean», in addition to «values» (data points).&lt;br /&gt;
* New set of functions with names of the form &amp;lt;code&amp;gt;&amp;lt;x&amp;gt;KeelinFromA(...)&amp;lt;/code&amp;gt;use the «a» coefficient vector from [[KeelinCoefficients]]:&lt;br /&gt;
** &amp;lt;code&amp;gt;[[KeelinFromA]](...)&amp;lt;/code&amp;gt; -- analog to &amp;lt;code&amp;gt;[[Keelin]](...)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;[[DensKeelinFromA]](...)&amp;lt;/code&amp;gt; -- analog to &amp;lt;code&amp;gt;[[DensKeelin]](...)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;[[CumKeelinFromA]](...)&amp;lt;/code&amp;gt; -- analog to &amp;lt;code&amp;gt;[[CumKeelin]](...)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;[[CumKeelinInvFromA]](...)&amp;lt;/code&amp;gt; -- analog to &amp;lt;code&amp;gt;[[CumKeelinInv]](...)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;[[KeelinPropertyFromA]](...)&amp;lt;/code&amp;gt; -- ''new to [[Analytica 6.6]]''&lt;br /&gt;
*:When using the Keelin distribution,  you can either use a quantile parameterization or an «a»-vector parameterization. These new functions make it clearer that you are using the «a»-vector parameterization, instead of using the original (analogous) functions with a special flag. &lt;br /&gt;
* A new option uses a [https://docs.analytica.com/index.php?title=Keelin_(MetaLog)_distribution&amp;amp;anarelease=6.6#Using_direct_method_for_bounds direct method for bounded support] as an alternative to the previous [https://docs.analytica.com/index.php?title=Keelin_(MetaLog)_distribution&amp;amp;anarelease=6.6#Using_the_Transform_method_for_bounds transform-method for bounded support].&lt;br /&gt;
&lt;br /&gt;
== Diagrams and controls ==&lt;br /&gt;
* [[Checkbox]] now has an &amp;quot;include ALL&amp;quot; option, enabling [[Parametric analysis]] even with a checkbox.&lt;br /&gt;
* [[Multichoice]] controls include a new option at the top to ''select '''all''''', ''select '''none''''' or ''select '''first''''', depending on the context. These are more obvious to the user than using the &amp;lt;code&amp;gt;Ctrl+A&amp;lt;/code&amp;gt; key.&lt;br /&gt;
* A text node can display several [[Links_or_URL_in_model_attributes#Extended_HTML_markup|new html formatting options]], including changes to text color, bullets and numbered lists.&lt;br /&gt;
* A new [[ChangeNodeVisibility|node visibility option]] lets you hide a node while Analytica is computing.&lt;br /&gt;
&lt;br /&gt;
== Expression language ==&lt;br /&gt;
* There is a new separate &amp;lt;code&amp;gt;Boolean&amp;lt;/code&amp;gt; data type. To preserve backward compatibility, the values continue to display as 0 or 1, but the [[Number format dialog]] provides an option to display values with the boolean data type as True or False to distinguish them from 0 and 1. &lt;br /&gt;
* You can now find the maximum over all indexes of &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; using &lt;br /&gt;
*::&amp;lt;code&amp;gt;[[Max]](X, All)&amp;lt;/code&amp;gt; &lt;br /&gt;
*:as a shortcut for &lt;br /&gt;
*::&amp;lt;code&amp;gt;[[Max]]( X, ...[[IndexesOf]](X) )&amp;lt;/code&amp;gt;&lt;br /&gt;
*:which uses [[Repeated parameter forwarding]]. The &amp;lt;code&amp;gt;All&amp;lt;/code&amp;gt; keyword works for these array-reducing functions, [[Sum]],  [[Min]], [[BitAnd]], [[BitOr]] and [[BitXOr]].&lt;br /&gt;
* If you write your own function, and want it to accept the keyword &amp;lt;code&amp;gt;All&amp;lt;/code&amp;gt; for a repeated index parameter, you can include a new &amp;lt;code&amp;gt;OrAll&amp;lt;/code&amp;gt; [[Function parameter qualifiers|function parameter qualifier]].&lt;br /&gt;
* When passing a [[Local function]] (aka '''lambda function''') as a parameter to a function call, you no longer have to include a function name (which wasn't used anyway).&lt;br /&gt;
* You can use '.. operator ([[Repeated parameter forwarding]]) on literal lists to &amp;quot;splat&amp;quot; lists (or 1-D arrays) together into the list. Example:&lt;br /&gt;
*:&amp;lt;code&amp;gt;[[Local]] s1 := 'c'..'f', s2 := 'h'..'k' Do [ 'a', 'b', ...s1, 'g', ...s2, 'l' ]&amp;lt;/code&amp;gt;&lt;br /&gt;
*::&amp;amp;rarr; &amp;lt;code&amp;gt;['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l']&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Built-in functions ==&lt;br /&gt;
* [[OAuth2Authorize]]: A new function to log into web services such as Google docs, sheets, Salesforce, etc., which makes it much easier for Analytica models to access (read from or write to) web applications that require authentication.&lt;br /&gt;
* &amp;lt;code&amp;gt;[[TypeOf]](x, shallow: True)&amp;lt;/code&amp;gt; now returns &amp;lt;code&amp;gt;&amp;quot;Image&amp;quot;&amp;lt;/code&amp;gt; when &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; is an image.&lt;br /&gt;
* When &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; is an image, &amp;lt;code&amp;gt;f&amp;quot;{x:H}&amp;quot;&amp;lt;/code&amp;gt; returns the long hex string that appears in a [[Pict]] attribute in a model file (but without the parens around it that appear in the model file).&lt;br /&gt;
* [[ReadTextFile]] returns the file encoding as its fourth return value.&lt;br /&gt;
* [[RunConsoleProcess]] is able to launch several applications that it previous could not, including PowerShell.&lt;br /&gt;
* New syntactic extensions added to the [[Arrow_operator#x_.E2.86.92_.5Bi.5D|arrow operator]], namely   &amp;lt;code&amp;gt;x&amp;amp;rarr;[n]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;x&amp;amp;rarr;[m..n]&amp;lt;/code&amp;gt; for [[Text values]] and [[In-memory binary data terms]].&lt;br /&gt;
&lt;br /&gt;
== File saving and loading ==&lt;br /&gt;
* '''Add Library...''' defaults to ''Link to filed module or library'' for almost all the standard libraries, which is the preferred way to add libraries to your model. (Except it still defaults to ''Embed a copy'' for the [[ACP Style Library]] since that library acts more module-like and changes its internal state).&lt;br /&gt;
* You can now set the [[Att_Dirties]] attribute (to 0) for your own user Variables. When set to 0, a change to the Definition doesn't dirty the Library or module that contains the Variable.&lt;br /&gt;
&lt;br /&gt;
== Example models and libraries ==&lt;br /&gt;
* A new example model included: &amp;lt;code&amp;gt;&amp;quot;Engineering / Generator availability.ana&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* An able to handle file paths &amp;gt; 256 characters in most cases. Actually taking advantage of this requires you to have long paths enabled in Windows, e.g., by setting the registry setting&lt;br /&gt;
*::&amp;lt;code&amp;gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem :: LongPathsEnabled = 1&amp;lt;/code&amp;gt;&lt;br /&gt;
*:or  by using the &amp;lt;code&amp;gt;\\unc\.... &amp;lt;/code&amp;gt; syntax for file paths. However, long file paths are not supported by Microsoft One drive or by Microsoft office, including Excel, so you cannot use long paths for files within a One drive folder or when opening a spreadsheet file.&lt;br /&gt;
* Several of the diagram themes in the [[Themes Library]] were renamed. &lt;br /&gt;
&lt;br /&gt;
== Graphing ==&lt;br /&gt;
* Control over the fill origin for a filled-area line chart using Fill type = &amp;quot;From origin&amp;quot;. &lt;br /&gt;
*: One example usage for this is to select &amp;lt;code&amp;gt;.Probability=0.5&amp;lt;/code&amp;gt; as the fill origin in a probability bands plot, which results in a plot like this one&lt;br /&gt;
*:::[[image:filled_bands_plot.png]]&lt;br /&gt;
*: You could previously do this by placing the [[Plot solid prob bands]] function in the [[OnGraphDraw]] attribute, but the new feature is much easier to configure, with just a few clicks in the [[Graph setup dialog]].&lt;br /&gt;
* '''Graph Setup / Text / Adapt displayed font sizes to graph height''' now uses the current height of the  graph window you were viewing as the reference height, so that the font sizes you select in the graph setup dialog will be correct when the graph is at that height.  Font sizes automatically adjust when you change the graph window size. Previously the reference height was fixed at the default result window height (a graph of 241 pixels tall), which tended to make the fonts way too large for normal window heights.  We now recommend using this setting by default so that text on graphs is easily legible at various sizes.&lt;br /&gt;
&lt;br /&gt;
== Other GUI ==&lt;br /&gt;
* There are a few new options on the '''Windows''' menu:&lt;br /&gt;
** Bring next window to front &lt;br /&gt;
** Bring previous window to front&lt;br /&gt;
** [[Typescript window|Typescript console]] to show the Typescript window. (Still also available with ctrl+'.)&lt;br /&gt;
&lt;br /&gt;
== Licensing ==&lt;br /&gt;
* [[ParseJSON]] and [[MakeJSON]] no longer require {{Analytica Enterprise}}.&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_6.6%3F&amp;diff=63561</id>
		<title>What's new in Analytica 6.6?</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_6.6%3F&amp;diff=63561"/>
		<updated>2025-12-16T19:48:26Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: /* Graphing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:What's new pages]]&lt;br /&gt;
[[category:Analytica releases]]&lt;br /&gt;
&amp;lt;!--This page lists new features in release 6.6, which is currently in beta testing prior to final release. Analytica 6.6 is currently in [[Beta Tester Page|Beta Testing]].  If have have an active subscription license, we encourage you to try it out from the [[Beta Tester Page]].--&amp;gt;&lt;br /&gt;
This page lists new features in release 6.6 (the current release) of Analytica (including [[ACP]] and [[ADE]]) since the previous [[Analytica 6.5]] release. &lt;br /&gt;
&lt;br /&gt;
Analytica normally prompts you to download and install the new release the next time you run it.&lt;br /&gt;
If not, you can download it from [https://analytica.com/users/renew-upgrade/ Renew, upgrade or download].&lt;br /&gt;
&lt;br /&gt;
== Highlights of 6.6 ==&lt;br /&gt;
&lt;br /&gt;
* [[#Assista|Assista]], the Analytica AI Assistant, is faster and more reponsive.&lt;br /&gt;
* The [[#Keelin Metalog distribution 2.0|Keelin (or Metalog) distribution]] is now the preferred method to define any continuous distribution, because it now avoids the occasional infeasibility problem that previously bedeviled it.&lt;br /&gt;
* You can select [[#Diagrams and controls|All in Checkboxes]] for parametric analysis  and in Multichoice.&lt;br /&gt;
* You can use [[Links_or_URL_in_model_attributes#Extended_HTML_markup| html to set text styles in text nodes]], including bold, italic, underline, bold, colors, bullets, and more in desktop Analytica. Even more html tags work in ACP.&lt;br /&gt;
* [[#Expression language|Sum(x, All) sums over All indexes of x]]. Similar for Min, Max, Product, and more.&lt;br /&gt;
* The new [[OAuth2Authorize]] function lets you access web services, such as Google docs, sheets, Salesforce, etc to read or write data.&lt;br /&gt;
* You can specify a [[#Graphing|Fill origin for graphs]] to let you show colored bands around the center line -- e.g. for probability bands over time.&lt;br /&gt;
&lt;br /&gt;
== Assista ==&lt;br /&gt;
* The chat UI is faster. Responses start streaming sooner.&lt;br /&gt;
* You can use the Enter key (or Ctrl+Alt) to submit responses without having to click to submit button. The Return key adds a new line (the behavior elsewhere in Analytica).  If you have the [[Preferences_dialog#Personal_Preferences|Use Return to enter data]] preference set, then the Return key will submit responses and the Enter key adds a new line.&lt;br /&gt;
&lt;br /&gt;
== Keelin Metalog distribution 2.0 ==&lt;br /&gt;
Introducing the '''''always feasible''''', [[Keelin|infinitely flexible distribution]]!&lt;br /&gt;
&lt;br /&gt;
The  [[Keelin (MetaLog) distribution]] has become popular due to its ability to closely match the shapes of all the standard continuous distributions as well as offering enormous flexibility in matching amost any shape. But up until now it has been plagued by finding some parameter combinations ''infleasible'',  so it would sometimes fail t to find a valid distribution to fit.&lt;br /&gt;
&lt;br /&gt;
[[Analytica 6.6]] fixes this problem with the MetaLog 2.0 distribution. It includes many new results from &lt;br /&gt;
* Manel Baucells, Lonnie Chrisman, Thomas W. Keelin and Stephen Xu (2025), &amp;quot;[https://papers.ssrn.com/sol3/papers.cfm?abstract_id=5279416 On the properties of the Metalog distribution]&amp;quot; (preprint), forthcoming.&lt;br /&gt;
&lt;br /&gt;
New features include:&lt;br /&gt;
* The resulting [[Keelin (MetaLog) distribution]]s are ''always'' feasible.&lt;br /&gt;
* There are closed-form analytic expressions for all central and standardized moments (see [[KeelinPropertyFromA#Basic_statistics_and_moments]]). &lt;br /&gt;
* There is a closed-form analytic expression for partial expectation (see [[KeelinPropertyFromA#Partial_expectation]]). This makes the Keelin distribution especially convenient for many problems that use piecewise-linear transformations of an uncertain quantity.&lt;br /&gt;
* It uses the superior basis order of the MetaLog 2.0.&lt;br /&gt;
* You can also specify the desired «mean», in addition to «values» (data points).&lt;br /&gt;
* New set of functions with names of the form &amp;lt;code&amp;gt;&amp;lt;x&amp;gt;KeelinFromA(...)&amp;lt;/code&amp;gt;use the «a» coefficient vector from [[KeelinCoefficients]]:&lt;br /&gt;
** &amp;lt;code&amp;gt;[[KeelinFromA]](...)&amp;lt;/code&amp;gt; -- analog to &amp;lt;code&amp;gt;[[Keelin]](...)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;[[DensKeelinFromA]](...)&amp;lt;/code&amp;gt; -- analog to &amp;lt;code&amp;gt;[[DensKeelin]](...)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;[[CumKeelinFromA]](...)&amp;lt;/code&amp;gt; -- analog to &amp;lt;code&amp;gt;[[CumKeelin]](...)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;[[CumKeelinInvFromA]](...)&amp;lt;/code&amp;gt; -- analog to &amp;lt;code&amp;gt;[[CumKeelinInv]](...)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;[[KeelinPropertyFromA]](...)&amp;lt;/code&amp;gt; -- ''new to [[Analytica 6.6]]''&lt;br /&gt;
*:When using the Keelin distribution,  you can either use a quantile parameterization or an «a»-vector parameterization. These new functions make it clearer that you are using the «a»-vector parameterization, instead of using the original (analogous) functions with a special flag. &lt;br /&gt;
* A new option uses a [https://docs.analytica.com/index.php?title=Keelin_(MetaLog)_distribution&amp;amp;anarelease=6.6#Using_direct_method_for_bounds direct method for bounded support] as an alternative to the previous [https://docs.analytica.com/index.php?title=Keelin_(MetaLog)_distribution&amp;amp;anarelease=6.6#Using_the_Transform_method_for_bounds transform-method for bounded support].&lt;br /&gt;
&lt;br /&gt;
== Diagrams and controls ==&lt;br /&gt;
* [[Checkbox]] now has an &amp;quot;include ALL&amp;quot; option, enabling [[Parametric analysis]] even with a checkbox.&lt;br /&gt;
* [[Multichoice]] controls include a new option at the top to ''select '''all''''', ''select '''none''''' or ''select '''first''''', depending on the context. These are more obvious to the user than using the &amp;lt;code&amp;gt;Ctrl+A&amp;lt;/code&amp;gt; key.&lt;br /&gt;
* A text node can display several [[Links_or_URL_in_model_attributes#Extended_HTML_markup|new html formatting options]], including changes to text color, bullets and numbered lists.&lt;br /&gt;
* A new [[ChangeNodeVisibility|node visibility option]] lets you hide a node while Analytica is computing.&lt;br /&gt;
&lt;br /&gt;
== Expression language ==&lt;br /&gt;
* There is a new separate &amp;lt;code&amp;gt;Boolean&amp;lt;/code&amp;gt; data type. To preserve backward compatibility, the values continue to display as 0 or 1, but the [[Number format dialog]] provides an option to display values with the boolean data type as True or False to distinguish them from 0 and 1. &lt;br /&gt;
* You can now find the maximum over all indexes of &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; using &lt;br /&gt;
*::&amp;lt;code&amp;gt;[[Max]](X, All)&amp;lt;/code&amp;gt; &lt;br /&gt;
*:as a shortcut for &lt;br /&gt;
*::&amp;lt;code&amp;gt;[[Max]]( X, ...[[IndexesOf]](X) )&amp;lt;/code&amp;gt;&lt;br /&gt;
*:which uses [[Repeated parameter forwarding]]. The &amp;lt;code&amp;gt;All&amp;lt;/code&amp;gt; keyword works for these array-reducing functions, [[Sum]],  [[Min]], [[BitAnd]], [[BitOr]] and [[BitXOr]].&lt;br /&gt;
* If you write your own function, and want it to accept the keyword &amp;lt;code&amp;gt;All&amp;lt;/code&amp;gt; for a repeated index parameter, you can include a new &amp;lt;code&amp;gt;OrAll&amp;lt;/code&amp;gt; [[Function parameter qualifiers|function parameter qualifier]].&lt;br /&gt;
* When passing a [[Local function]] (aka '''lambda function''') as a parameter to a function call, you no longer have to include a function name (which wasn't used anyway).&lt;br /&gt;
* You can use '.. operator ([[Repeated parameter forwarding]]) on literal lists to &amp;quot;splat&amp;quot; lists (or 1-D arrays) together into the list. Example:&lt;br /&gt;
*:&amp;lt;code&amp;gt;[[Local]] s1 := 'c'..'f', s2 := 'h'..'k' Do [ 'a', 'b', ...s1, 'g', ...s2, 'l' ]&amp;lt;/code&amp;gt;&lt;br /&gt;
*::&amp;amp;rarr; &amp;lt;code&amp;gt;['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l']&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Built-in functions ==&lt;br /&gt;
* [[OAuth2Authorize]]: A new function to log into web services such as Google docs, sheets, Salesforce, etc., which makes it much easier for Analytica models to access (read from or write to) web applications that require authentication.&lt;br /&gt;
* &amp;lt;code&amp;gt;[[TypeOf]](x, shallow: True)&amp;lt;/code&amp;gt; now returns &amp;lt;code&amp;gt;&amp;quot;Image&amp;quot;&amp;lt;/code&amp;gt; when &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; is an image.&lt;br /&gt;
* When &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; is an image, &amp;lt;code&amp;gt;f&amp;quot;{x:H}&amp;quot;&amp;lt;/code&amp;gt; returns the long hex string that appears in a [[Pict]] attribute in a model file (but without the parens around it that appear in the model file).&lt;br /&gt;
* [[ReadTextFile]] returns the file encoding as its fourth return value.&lt;br /&gt;
* [[RunConsoleProcess]] is able to launch several applications that it previous could not, including PowerShell.&lt;br /&gt;
* New syntactic extensions added to the [[Arrow_operator#x_.E2.86.92_.5Bi.5D|arrow operator]], namely   &amp;lt;code&amp;gt;x&amp;amp;rarr;[n]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;x&amp;amp;rarr;[m..n]&amp;lt;/code&amp;gt; for [[Text values]] and [[In-memory binary data terms]].&lt;br /&gt;
&lt;br /&gt;
== File saving and loading ==&lt;br /&gt;
* '''Add Library...''' defaults to ''Link to filed module or library'' for almost all the standard libraries, which is the preferred way to add libraries to your model. (Except it still defaults to ''Embed a copy'' for the [[ACP Style Library]] since that library acts more module-like and changes its internal state).&lt;br /&gt;
* You can now set the [[Att_Dirties]] attribute (to 0) for your own user Variables. When set to 0, a change to the Definition doesn't dirty the Library or module that contains the Variable.&lt;br /&gt;
&lt;br /&gt;
== Example models and libraries ==&lt;br /&gt;
* A new example model included: &amp;lt;code&amp;gt;&amp;quot;Engineering / Generator availability.ana&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* An able to handle file paths &amp;gt; 256 characters in most cases. Actually taking advantage of this requires you to have long paths enabled in Windows, e.g., by setting the registry setting&lt;br /&gt;
*::&amp;lt;code&amp;gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem :: LongPathsEnabled = 1&amp;lt;/code&amp;gt;&lt;br /&gt;
*:or  by using the &amp;lt;code&amp;gt;\\unc\.... &amp;lt;/code&amp;gt; syntax for file paths. However, long file paths are not supported by Microsoft One drive or by Microsoft office, including Excel, so you cannot use long paths for files within a One drive folder or when opening a spreadsheet file.&lt;br /&gt;
* Several of the diagram themes in the [[Themes Library]] were renamed. &lt;br /&gt;
&lt;br /&gt;
== Graphing ==&lt;br /&gt;
* Control over the fill origin for a filled-area line chart using Fill type = &amp;quot;From origin&amp;quot;. &lt;br /&gt;
*: One example usage for this is to select &amp;lt;code&amp;gt;.Probability=0.5&amp;lt;/code&amp;gt; as the fill origin in a probability bands plot, which results in a plot like this one&lt;br /&gt;
*:::[[image:filled_bands_plot.png]]&lt;br /&gt;
*: You could previously do this by placing the [[Plot solid prob bands]] function in the [[OnGraphDraw]] attribute, but the new feature is much easier to configure, with just a few clicks in the [[Graph setup dialog]].&lt;br /&gt;
* '''Graph Setup / Text / Adapt displayed font sizes to graph height''' now uses the current height of the  graph window you were viewing as the reference height, so that the font sizes you select in the graph setup dialog will be correct when the graph is at that height.  Font sizes automatically adjust when you change the graph window size. Previously the reference height was fixed at the default result window height (a graph of 241 pixels tall), which tended to make the fonts way too large for normal window heights.  We now recommend using this setting by default so that text on graphs is easily legible at various sizes.&lt;br /&gt;
&lt;br /&gt;
== Other GUI ==&lt;br /&gt;
* There are a few new options on the '''Windows''' menu:&lt;br /&gt;
** Bring next window to front &lt;br /&gt;
** Bring previous window to front&lt;br /&gt;
** [[Typescript window|Typescript console]]&lt;br /&gt;
&lt;br /&gt;
== Licensing ==&lt;br /&gt;
* [[ParseJSON]] and [[MakeJSON]] no longer require {{Analytica Enterprise}}.&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_6.6%3F&amp;diff=63560</id>
		<title>What's new in Analytica 6.6?</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_6.6%3F&amp;diff=63560"/>
		<updated>2025-12-16T19:41:25Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: /* Built-in functions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:What's new pages]]&lt;br /&gt;
[[category:Analytica releases]]&lt;br /&gt;
&amp;lt;!--This page lists new features in release 6.6, which is currently in beta testing prior to final release. Analytica 6.6 is currently in [[Beta Tester Page|Beta Testing]].  If have have an active subscription license, we encourage you to try it out from the [[Beta Tester Page]].--&amp;gt;&lt;br /&gt;
This page lists new features in release 6.6 (the current release) of Analytica (including [[ACP]] and [[ADE]]) since the previous [[Analytica 6.5]] release. &lt;br /&gt;
&lt;br /&gt;
Analytica normally prompts you to download and install the new release the next time you run it.&lt;br /&gt;
If not, you can download it from [https://analytica.com/users/renew-upgrade/ Renew, upgrade or download].&lt;br /&gt;
&lt;br /&gt;
== Highlights of 6.6 ==&lt;br /&gt;
&lt;br /&gt;
* [[#Assista|Assista]], the Analytica AI Assistant, is faster and more reponsive.&lt;br /&gt;
* The [[#Keelin Metalog distribution 2.0|Keelin (or Metalog) distribution]] is now the preferred method to define any continuous distribution, because it now avoids the occasional infeasibility problem that previously bedeviled it.&lt;br /&gt;
* You can select [[#Diagrams and controls|All in Checkboxes]] for parametric analysis  and in Multichoice.&lt;br /&gt;
* You can use [[Links_or_URL_in_model_attributes#Extended_HTML_markup| html to set text styles in text nodes]], including bold, italic, underline, bold, colors, bullets, and more in desktop Analytica. Even more html tags work in ACP.&lt;br /&gt;
* [[#Expression language|Sum(x, All) sums over All indexes of x]]. Similar for Min, Max, Product, and more.&lt;br /&gt;
* The new [[OAuth2Authorize]] function lets you access web services, such as Google docs, sheets, Salesforce, etc to read or write data.&lt;br /&gt;
* You can specify a [[#Graphing|Fill origin for graphs]] to let you show colored bands around the center line -- e.g. for probability bands over time.&lt;br /&gt;
&lt;br /&gt;
== Assista ==&lt;br /&gt;
* The chat UI is faster. Responses start streaming sooner.&lt;br /&gt;
* You can use the Enter key (or Ctrl+Alt) to submit responses without having to click to submit button. The Return key adds a new line (the behavior elsewhere in Analytica).  If you have the [[Preferences_dialog#Personal_Preferences|Use Return to enter data]] preference set, then the Return key will submit responses and the Enter key adds a new line.&lt;br /&gt;
&lt;br /&gt;
== Keelin Metalog distribution 2.0 ==&lt;br /&gt;
Introducing the '''''always feasible''''', [[Keelin|infinitely flexible distribution]]!&lt;br /&gt;
&lt;br /&gt;
The  [[Keelin (MetaLog) distribution]] has become popular due to its ability to closely match the shapes of all the standard continuous distributions as well as offering enormous flexibility in matching amost any shape. But up until now it has been plagued by finding some parameter combinations ''infleasible'',  so it would sometimes fail t to find a valid distribution to fit.&lt;br /&gt;
&lt;br /&gt;
[[Analytica 6.6]] fixes this problem with the MetaLog 2.0 distribution. It includes many new results from &lt;br /&gt;
* Manel Baucells, Lonnie Chrisman, Thomas W. Keelin and Stephen Xu (2025), &amp;quot;[https://papers.ssrn.com/sol3/papers.cfm?abstract_id=5279416 On the properties of the Metalog distribution]&amp;quot; (preprint), forthcoming.&lt;br /&gt;
&lt;br /&gt;
New features include:&lt;br /&gt;
* The resulting [[Keelin (MetaLog) distribution]]s are ''always'' feasible.&lt;br /&gt;
* There are closed-form analytic expressions for all central and standardized moments (see [[KeelinPropertyFromA#Basic_statistics_and_moments]]). &lt;br /&gt;
* There is a closed-form analytic expression for partial expectation (see [[KeelinPropertyFromA#Partial_expectation]]). This makes the Keelin distribution especially convenient for many problems that use piecewise-linear transformations of an uncertain quantity.&lt;br /&gt;
* It uses the superior basis order of the MetaLog 2.0.&lt;br /&gt;
* You can also specify the desired «mean», in addition to «values» (data points).&lt;br /&gt;
* New set of functions with names of the form &amp;lt;code&amp;gt;&amp;lt;x&amp;gt;KeelinFromA(...)&amp;lt;/code&amp;gt;use the «a» coefficient vector from [[KeelinCoefficients]]:&lt;br /&gt;
** &amp;lt;code&amp;gt;[[KeelinFromA]](...)&amp;lt;/code&amp;gt; -- analog to &amp;lt;code&amp;gt;[[Keelin]](...)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;[[DensKeelinFromA]](...)&amp;lt;/code&amp;gt; -- analog to &amp;lt;code&amp;gt;[[DensKeelin]](...)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;[[CumKeelinFromA]](...)&amp;lt;/code&amp;gt; -- analog to &amp;lt;code&amp;gt;[[CumKeelin]](...)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;[[CumKeelinInvFromA]](...)&amp;lt;/code&amp;gt; -- analog to &amp;lt;code&amp;gt;[[CumKeelinInv]](...)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;[[KeelinPropertyFromA]](...)&amp;lt;/code&amp;gt; -- ''new to [[Analytica 6.6]]''&lt;br /&gt;
*:When using the Keelin distribution,  you can either use a quantile parameterization or an «a»-vector parameterization. These new functions make it clearer that you are using the «a»-vector parameterization, instead of using the original (analogous) functions with a special flag. &lt;br /&gt;
* A new option uses a [https://docs.analytica.com/index.php?title=Keelin_(MetaLog)_distribution&amp;amp;anarelease=6.6#Using_direct_method_for_bounds direct method for bounded support] as an alternative to the previous [https://docs.analytica.com/index.php?title=Keelin_(MetaLog)_distribution&amp;amp;anarelease=6.6#Using_the_Transform_method_for_bounds transform-method for bounded support].&lt;br /&gt;
&lt;br /&gt;
== Diagrams and controls ==&lt;br /&gt;
* [[Checkbox]] now has an &amp;quot;include ALL&amp;quot; option, enabling [[Parametric analysis]] even with a checkbox.&lt;br /&gt;
* [[Multichoice]] controls include a new option at the top to ''select '''all''''', ''select '''none''''' or ''select '''first''''', depending on the context. These are more obvious to the user than using the &amp;lt;code&amp;gt;Ctrl+A&amp;lt;/code&amp;gt; key.&lt;br /&gt;
* A text node can display several [[Links_or_URL_in_model_attributes#Extended_HTML_markup|new html formatting options]], including changes to text color, bullets and numbered lists.&lt;br /&gt;
* A new [[ChangeNodeVisibility|node visibility option]] lets you hide a node while Analytica is computing.&lt;br /&gt;
&lt;br /&gt;
== Expression language ==&lt;br /&gt;
* There is a new separate &amp;lt;code&amp;gt;Boolean&amp;lt;/code&amp;gt; data type. To preserve backward compatibility, the values continue to display as 0 or 1, but the [[Number format dialog]] provides an option to display values with the boolean data type as True or False to distinguish them from 0 and 1. &lt;br /&gt;
* You can now find the maximum over all indexes of &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; using &lt;br /&gt;
*::&amp;lt;code&amp;gt;[[Max]](X, All)&amp;lt;/code&amp;gt; &lt;br /&gt;
*:as a shortcut for &lt;br /&gt;
*::&amp;lt;code&amp;gt;[[Max]]( X, ...[[IndexesOf]](X) )&amp;lt;/code&amp;gt;&lt;br /&gt;
*:which uses [[Repeated parameter forwarding]]. The &amp;lt;code&amp;gt;All&amp;lt;/code&amp;gt; keyword works for these array-reducing functions, [[Sum]],  [[Min]], [[BitAnd]], [[BitOr]] and [[BitXOr]].&lt;br /&gt;
* If you write your own function, and want it to accept the keyword &amp;lt;code&amp;gt;All&amp;lt;/code&amp;gt; for a repeated index parameter, you can include a new &amp;lt;code&amp;gt;OrAll&amp;lt;/code&amp;gt; [[Function parameter qualifiers|function parameter qualifier]].&lt;br /&gt;
* When passing a [[Local function]] (aka '''lambda function''') as a parameter to a function call, you no longer have to include a function name (which wasn't used anyway).&lt;br /&gt;
* You can use '.. operator ([[Repeated parameter forwarding]]) on literal lists to &amp;quot;splat&amp;quot; lists (or 1-D arrays) together into the list. Example:&lt;br /&gt;
*:&amp;lt;code&amp;gt;[[Local]] s1 := 'c'..'f', s2 := 'h'..'k' Do [ 'a', 'b', ...s1, 'g', ...s2, 'l' ]&amp;lt;/code&amp;gt;&lt;br /&gt;
*::&amp;amp;rarr; &amp;lt;code&amp;gt;['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l']&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Built-in functions ==&lt;br /&gt;
* [[OAuth2Authorize]]: A new function to log into web services such as Google docs, sheets, Salesforce, etc., which makes it much easier for Analytica models to access (read from or write to) web applications that require authentication.&lt;br /&gt;
* &amp;lt;code&amp;gt;[[TypeOf]](x, shallow: True)&amp;lt;/code&amp;gt; now returns &amp;lt;code&amp;gt;&amp;quot;Image&amp;quot;&amp;lt;/code&amp;gt; when &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; is an image.&lt;br /&gt;
* When &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; is an image, &amp;lt;code&amp;gt;f&amp;quot;{x:H}&amp;quot;&amp;lt;/code&amp;gt; returns the long hex string that appears in a [[Pict]] attribute in a model file (but without the parens around it that appear in the model file).&lt;br /&gt;
* [[ReadTextFile]] returns the file encoding as its fourth return value.&lt;br /&gt;
* [[RunConsoleProcess]] is able to launch several applications that it previous could not, including PowerShell.&lt;br /&gt;
* New syntactic extensions added to the [[Arrow_operator#x_.E2.86.92_.5Bi.5D|arrow operator]], namely   &amp;lt;code&amp;gt;x&amp;amp;rarr;[n]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;x&amp;amp;rarr;[m..n]&amp;lt;/code&amp;gt; for [[Text values]] and [[In-memory binary data terms]].&lt;br /&gt;
&lt;br /&gt;
== File saving and loading ==&lt;br /&gt;
* '''Add Library...''' defaults to ''Link to filed module or library'' for almost all the standard libraries, which is the preferred way to add libraries to your model. (Except it still defaults to ''Embed a copy'' for the [[ACP Style Library]] since that library acts more module-like and changes its internal state).&lt;br /&gt;
* You can now set the [[Att_Dirties]] attribute (to 0) for your own user Variables. When set to 0, a change to the Definition doesn't dirty the Library or module that contains the Variable.&lt;br /&gt;
&lt;br /&gt;
== Example models and libraries ==&lt;br /&gt;
* A new example model included: &amp;lt;code&amp;gt;&amp;quot;Engineering / Generator availability.ana&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* An able to handle file paths &amp;gt; 256 characters in most cases. Actually taking advantage of this requires you to have long paths enabled in Windows, e.g., by setting the registry setting&lt;br /&gt;
*::&amp;lt;code&amp;gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem :: LongPathsEnabled = 1&amp;lt;/code&amp;gt;&lt;br /&gt;
*:or  by using the &amp;lt;code&amp;gt;\\unc\.... &amp;lt;/code&amp;gt; syntax for file paths. However, long file paths are not supported by Microsoft One drive or by Microsoft office, including Excel, so you cannot use long paths for files within a One drive folder or when opening a spreadsheet file.&lt;br /&gt;
* Several of the diagram themes in the [[Themes Library]] were renamed. &lt;br /&gt;
&lt;br /&gt;
== Graphing ==&lt;br /&gt;
* Control over the fill origin for a filled-area line chart using Fill type = &amp;quot;From origin&amp;quot;. &lt;br /&gt;
*: One example usage for this is to select &amp;lt;code&amp;gt;.Probability=0.5&amp;lt;/code&amp;gt; as the fill origin in a probability bands plot, which results in a plot like this one&lt;br /&gt;
*:::[[image:filled_bands_plot.png]]&lt;br /&gt;
*: This example is already easily achieved by placing the [[Plot solid prob bands]] function in the [[OnGraphDraw]] attribute, but with the new feature it is also directly configurable with a few [[Graph setup dialog]] clicks.&lt;br /&gt;
* When you turn on '''Graph Setup / Text / Adapt displayed font sizes to graph height''', it now uses the current height of the graph you were viewing as the reference height, such that when the graph has that same height, the point sizes shown in the graph setup dialog will be the correct font sizes. Previously the reference height was fixed at the default result window height (a graph of 241 pixels tall).&lt;br /&gt;
&lt;br /&gt;
== Other GUI ==&lt;br /&gt;
* There are a few new options on the '''Windows''' menu:&lt;br /&gt;
** Bring next window to front &lt;br /&gt;
** Bring previous window to front&lt;br /&gt;
** [[Typescript window|Typescript console]]&lt;br /&gt;
&lt;br /&gt;
== Licensing ==&lt;br /&gt;
* [[ParseJSON]] and [[MakeJSON]] no longer require {{Analytica Enterprise}}.&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_6.6%3F&amp;diff=63559</id>
		<title>What's new in Analytica 6.6?</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_6.6%3F&amp;diff=63559"/>
		<updated>2025-12-16T19:37:44Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: /* Expression language */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:What's new pages]]&lt;br /&gt;
[[category:Analytica releases]]&lt;br /&gt;
&amp;lt;!--This page lists new features in release 6.6, which is currently in beta testing prior to final release. Analytica 6.6 is currently in [[Beta Tester Page|Beta Testing]].  If have have an active subscription license, we encourage you to try it out from the [[Beta Tester Page]].--&amp;gt;&lt;br /&gt;
This page lists new features in release 6.6 (the current release) of Analytica (including [[ACP]] and [[ADE]]) since the previous [[Analytica 6.5]] release. &lt;br /&gt;
&lt;br /&gt;
Analytica normally prompts you to download and install the new release the next time you run it.&lt;br /&gt;
If not, you can download it from [https://analytica.com/users/renew-upgrade/ Renew, upgrade or download].&lt;br /&gt;
&lt;br /&gt;
== Highlights of 6.6 ==&lt;br /&gt;
&lt;br /&gt;
* [[#Assista|Assista]], the Analytica AI Assistant, is faster and more reponsive.&lt;br /&gt;
* The [[#Keelin Metalog distribution 2.0|Keelin (or Metalog) distribution]] is now the preferred method to define any continuous distribution, because it now avoids the occasional infeasibility problem that previously bedeviled it.&lt;br /&gt;
* You can select [[#Diagrams and controls|All in Checkboxes]] for parametric analysis  and in Multichoice.&lt;br /&gt;
* You can use [[Links_or_URL_in_model_attributes#Extended_HTML_markup| html to set text styles in text nodes]], including bold, italic, underline, bold, colors, bullets, and more in desktop Analytica. Even more html tags work in ACP.&lt;br /&gt;
* [[#Expression language|Sum(x, All) sums over All indexes of x]]. Similar for Min, Max, Product, and more.&lt;br /&gt;
* The new [[OAuth2Authorize]] function lets you access web services, such as Google docs, sheets, Salesforce, etc to read or write data.&lt;br /&gt;
* You can specify a [[#Graphing|Fill origin for graphs]] to let you show colored bands around the center line -- e.g. for probability bands over time.&lt;br /&gt;
&lt;br /&gt;
== Assista ==&lt;br /&gt;
* The chat UI is faster. Responses start streaming sooner.&lt;br /&gt;
* You can use the Enter key (or Ctrl+Alt) to submit responses without having to click to submit button. The Return key adds a new line (the behavior elsewhere in Analytica).  If you have the [[Preferences_dialog#Personal_Preferences|Use Return to enter data]] preference set, then the Return key will submit responses and the Enter key adds a new line.&lt;br /&gt;
&lt;br /&gt;
== Keelin Metalog distribution 2.0 ==&lt;br /&gt;
Introducing the '''''always feasible''''', [[Keelin|infinitely flexible distribution]]!&lt;br /&gt;
&lt;br /&gt;
The  [[Keelin (MetaLog) distribution]] has become popular due to its ability to closely match the shapes of all the standard continuous distributions as well as offering enormous flexibility in matching amost any shape. But up until now it has been plagued by finding some parameter combinations ''infleasible'',  so it would sometimes fail t to find a valid distribution to fit.&lt;br /&gt;
&lt;br /&gt;
[[Analytica 6.6]] fixes this problem with the MetaLog 2.0 distribution. It includes many new results from &lt;br /&gt;
* Manel Baucells, Lonnie Chrisman, Thomas W. Keelin and Stephen Xu (2025), &amp;quot;[https://papers.ssrn.com/sol3/papers.cfm?abstract_id=5279416 On the properties of the Metalog distribution]&amp;quot; (preprint), forthcoming.&lt;br /&gt;
&lt;br /&gt;
New features include:&lt;br /&gt;
* The resulting [[Keelin (MetaLog) distribution]]s are ''always'' feasible.&lt;br /&gt;
* There are closed-form analytic expressions for all central and standardized moments (see [[KeelinPropertyFromA#Basic_statistics_and_moments]]). &lt;br /&gt;
* There is a closed-form analytic expression for partial expectation (see [[KeelinPropertyFromA#Partial_expectation]]). This makes the Keelin distribution especially convenient for many problems that use piecewise-linear transformations of an uncertain quantity.&lt;br /&gt;
* It uses the superior basis order of the MetaLog 2.0.&lt;br /&gt;
* You can also specify the desired «mean», in addition to «values» (data points).&lt;br /&gt;
* New set of functions with names of the form &amp;lt;code&amp;gt;&amp;lt;x&amp;gt;KeelinFromA(...)&amp;lt;/code&amp;gt;use the «a» coefficient vector from [[KeelinCoefficients]]:&lt;br /&gt;
** &amp;lt;code&amp;gt;[[KeelinFromA]](...)&amp;lt;/code&amp;gt; -- analog to &amp;lt;code&amp;gt;[[Keelin]](...)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;[[DensKeelinFromA]](...)&amp;lt;/code&amp;gt; -- analog to &amp;lt;code&amp;gt;[[DensKeelin]](...)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;[[CumKeelinFromA]](...)&amp;lt;/code&amp;gt; -- analog to &amp;lt;code&amp;gt;[[CumKeelin]](...)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;[[CumKeelinInvFromA]](...)&amp;lt;/code&amp;gt; -- analog to &amp;lt;code&amp;gt;[[CumKeelinInv]](...)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;[[KeelinPropertyFromA]](...)&amp;lt;/code&amp;gt; -- ''new to [[Analytica 6.6]]''&lt;br /&gt;
*:When using the Keelin distribution,  you can either use a quantile parameterization or an «a»-vector parameterization. These new functions make it clearer that you are using the «a»-vector parameterization, instead of using the original (analogous) functions with a special flag. &lt;br /&gt;
* A new option uses a [https://docs.analytica.com/index.php?title=Keelin_(MetaLog)_distribution&amp;amp;anarelease=6.6#Using_direct_method_for_bounds direct method for bounded support] as an alternative to the previous [https://docs.analytica.com/index.php?title=Keelin_(MetaLog)_distribution&amp;amp;anarelease=6.6#Using_the_Transform_method_for_bounds transform-method for bounded support].&lt;br /&gt;
&lt;br /&gt;
== Diagrams and controls ==&lt;br /&gt;
* [[Checkbox]] now has an &amp;quot;include ALL&amp;quot; option, enabling [[Parametric analysis]] even with a checkbox.&lt;br /&gt;
* [[Multichoice]] controls include a new option at the top to ''select '''all''''', ''select '''none''''' or ''select '''first''''', depending on the context. These are more obvious to the user than using the &amp;lt;code&amp;gt;Ctrl+A&amp;lt;/code&amp;gt; key.&lt;br /&gt;
* A text node can display several [[Links_or_URL_in_model_attributes#Extended_HTML_markup|new html formatting options]], including changes to text color, bullets and numbered lists.&lt;br /&gt;
* A new [[ChangeNodeVisibility|node visibility option]] lets you hide a node while Analytica is computing.&lt;br /&gt;
&lt;br /&gt;
== Expression language ==&lt;br /&gt;
* There is a new separate &amp;lt;code&amp;gt;Boolean&amp;lt;/code&amp;gt; data type. To preserve backward compatibility, the values continue to display as 0 or 1, but the [[Number format dialog]] provides an option to display values with the boolean data type as True or False to distinguish them from 0 and 1. &lt;br /&gt;
* You can now find the maximum over all indexes of &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; using &lt;br /&gt;
*::&amp;lt;code&amp;gt;[[Max]](X, All)&amp;lt;/code&amp;gt; &lt;br /&gt;
*:as a shortcut for &lt;br /&gt;
*::&amp;lt;code&amp;gt;[[Max]]( X, ...[[IndexesOf]](X) )&amp;lt;/code&amp;gt;&lt;br /&gt;
*:which uses [[Repeated parameter forwarding]]. The &amp;lt;code&amp;gt;All&amp;lt;/code&amp;gt; keyword works for these array-reducing functions, [[Sum]],  [[Min]], [[BitAnd]], [[BitOr]] and [[BitXOr]].&lt;br /&gt;
* If you write your own function, and want it to accept the keyword &amp;lt;code&amp;gt;All&amp;lt;/code&amp;gt; for a repeated index parameter, you can include a new &amp;lt;code&amp;gt;OrAll&amp;lt;/code&amp;gt; [[Function parameter qualifiers|function parameter qualifier]].&lt;br /&gt;
* When passing a [[Local function]] (aka '''lambda function''') as a parameter to a function call, you no longer have to include a function name (which wasn't used anyway).&lt;br /&gt;
* You can use '.. operator ([[Repeated parameter forwarding]]) on literal lists to &amp;quot;splat&amp;quot; lists (or 1-D arrays) together into the list. Example:&lt;br /&gt;
*:&amp;lt;code&amp;gt;[[Local]] s1 := 'c'..'f', s2 := 'h'..'k' Do [ 'a', 'b', ...s1, 'g', ...s2, 'l' ]&amp;lt;/code&amp;gt;&lt;br /&gt;
*::&amp;amp;rarr; &amp;lt;code&amp;gt;['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l']&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Built-in functions ==&lt;br /&gt;
* New function [[OAuth2Authorize]]. This is used to log into web services such as Google docs, etc.&lt;br /&gt;
* &amp;lt;code&amp;gt;[[TypeOf]]( x, shallow:True )&amp;lt;/code&amp;gt; now returns &amp;lt;code&amp;gt;&amp;quot;Image&amp;quot;&amp;lt;/code&amp;gt; when &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; is an image.&lt;br /&gt;
* When &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; is an image, &amp;lt;code&amp;gt;f&amp;quot;{x:H}&amp;quot;&amp;lt;/code&amp;gt; returns the long hex string that appears in a [[Pict]] attribute in a model file (but without the parens around it that appear in the model file).&lt;br /&gt;
* [[ReadTextFile]] returns the file encoding as its fourth return value.&lt;br /&gt;
* [[RunConsoleProcess]] is able to launch several applications that it previous could not, including PowerShell.&lt;br /&gt;
* New syntactic extensions added to the [[Arrow_operator#x_.E2.86.92_.5Bi.5D|arrow operator]], namely   &amp;lt;code&amp;gt;x&amp;amp;rarr;[n]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;x&amp;amp;rarr;[m..n]&amp;lt;/code&amp;gt; for [[Text values]] and [[In-memory binary data terms]].&lt;br /&gt;
&lt;br /&gt;
== File saving and loading ==&lt;br /&gt;
* '''Add Library...''' defaults to ''Link to filed module or library'' for almost all the standard libraries, which is the preferred way to add libraries to your model. (Except it still defaults to ''Embed a copy'' for the [[ACP Style Library]] since that library acts more module-like and changes its internal state).&lt;br /&gt;
* You can now set the [[Att_Dirties]] attribute (to 0) for your own user Variables. When set to 0, a change to the Definition doesn't dirty the Library or module that contains the Variable.&lt;br /&gt;
&lt;br /&gt;
== Example models and libraries ==&lt;br /&gt;
* A new example model included: &amp;lt;code&amp;gt;&amp;quot;Engineering / Generator availability.ana&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* An able to handle file paths &amp;gt; 256 characters in most cases. Actually taking advantage of this requires you to have long paths enabled in Windows, e.g., by setting the registry setting&lt;br /&gt;
*::&amp;lt;code&amp;gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem :: LongPathsEnabled = 1&amp;lt;/code&amp;gt;&lt;br /&gt;
*:or  by using the &amp;lt;code&amp;gt;\\unc\.... &amp;lt;/code&amp;gt; syntax for file paths. However, long file paths are not supported by Microsoft One drive or by Microsoft office, including Excel, so you cannot use long paths for files within a One drive folder or when opening a spreadsheet file.&lt;br /&gt;
* Several of the diagram themes in the [[Themes Library]] were renamed. &lt;br /&gt;
&lt;br /&gt;
== Graphing ==&lt;br /&gt;
* Control over the fill origin for a filled-area line chart using Fill type = &amp;quot;From origin&amp;quot;. &lt;br /&gt;
*: One example usage for this is to select &amp;lt;code&amp;gt;.Probability=0.5&amp;lt;/code&amp;gt; as the fill origin in a probability bands plot, which results in a plot like this one&lt;br /&gt;
*:::[[image:filled_bands_plot.png]]&lt;br /&gt;
*: This example is already easily achieved by placing the [[Plot solid prob bands]] function in the [[OnGraphDraw]] attribute, but with the new feature it is also directly configurable with a few [[Graph setup dialog]] clicks.&lt;br /&gt;
* When you turn on '''Graph Setup / Text / Adapt displayed font sizes to graph height''', it now uses the current height of the graph you were viewing as the reference height, such that when the graph has that same height, the point sizes shown in the graph setup dialog will be the correct font sizes. Previously the reference height was fixed at the default result window height (a graph of 241 pixels tall).&lt;br /&gt;
&lt;br /&gt;
== Other GUI ==&lt;br /&gt;
* There are a few new options on the '''Windows''' menu:&lt;br /&gt;
** Bring next window to front &lt;br /&gt;
** Bring previous window to front&lt;br /&gt;
** [[Typescript window|Typescript console]]&lt;br /&gt;
&lt;br /&gt;
== Licensing ==&lt;br /&gt;
* [[ParseJSON]] and [[MakeJSON]] no longer require {{Analytica Enterprise}}.&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_6.6%3F&amp;diff=63558</id>
		<title>What's new in Analytica 6.6?</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_6.6%3F&amp;diff=63558"/>
		<updated>2025-12-16T19:28:01Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: /* Diagrams and controls */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:What's new pages]]&lt;br /&gt;
[[category:Analytica releases]]&lt;br /&gt;
&amp;lt;!--This page lists new features in release 6.6, which is currently in beta testing prior to final release. Analytica 6.6 is currently in [[Beta Tester Page|Beta Testing]].  If have have an active subscription license, we encourage you to try it out from the [[Beta Tester Page]].--&amp;gt;&lt;br /&gt;
This page lists new features in release 6.6 (the current release) of Analytica (including [[ACP]] and [[ADE]]) since the previous [[Analytica 6.5]] release. &lt;br /&gt;
&lt;br /&gt;
Analytica normally prompts you to download and install the new release the next time you run it.&lt;br /&gt;
If not, you can download it from [https://analytica.com/users/renew-upgrade/ Renew, upgrade or download].&lt;br /&gt;
&lt;br /&gt;
== Highlights of 6.6 ==&lt;br /&gt;
&lt;br /&gt;
* [[#Assista|Assista]], the Analytica AI Assistant, is faster and more reponsive.&lt;br /&gt;
* The [[#Keelin Metalog distribution 2.0|Keelin (or Metalog) distribution]] is now the preferred method to define any continuous distribution, because it now avoids the occasional infeasibility problem that previously bedeviled it.&lt;br /&gt;
* You can select [[#Diagrams and controls|All in Checkboxes]] for parametric analysis  and in Multichoice.&lt;br /&gt;
* You can use [[Links_or_URL_in_model_attributes#Extended_HTML_markup| html to set text styles in text nodes]], including bold, italic, underline, bold, colors, bullets, and more in desktop Analytica. Even more html tags work in ACP.&lt;br /&gt;
* [[#Expression language|Sum(x, All) sums over All indexes of x]]. Similar for Min, Max, Product, and more.&lt;br /&gt;
* The new [[OAuth2Authorize]] function lets you access web services, such as Google docs, sheets, Salesforce, etc to read or write data.&lt;br /&gt;
* You can specify a [[#Graphing|Fill origin for graphs]] to let you show colored bands around the center line -- e.g. for probability bands over time.&lt;br /&gt;
&lt;br /&gt;
== Assista ==&lt;br /&gt;
* The chat UI is faster. Responses start streaming sooner.&lt;br /&gt;
* You can use the Enter key (or Ctrl+Alt) to submit responses without having to click to submit button. The Return key adds a new line (the behavior elsewhere in Analytica).  If you have the [[Preferences_dialog#Personal_Preferences|Use Return to enter data]] preference set, then the Return key will submit responses and the Enter key adds a new line.&lt;br /&gt;
&lt;br /&gt;
== Keelin Metalog distribution 2.0 ==&lt;br /&gt;
Introducing the '''''always feasible''''', [[Keelin|infinitely flexible distribution]]!&lt;br /&gt;
&lt;br /&gt;
The  [[Keelin (MetaLog) distribution]] has become popular due to its ability to closely match the shapes of all the standard continuous distributions as well as offering enormous flexibility in matching amost any shape. But up until now it has been plagued by finding some parameter combinations ''infleasible'',  so it would sometimes fail t to find a valid distribution to fit.&lt;br /&gt;
&lt;br /&gt;
[[Analytica 6.6]] fixes this problem with the MetaLog 2.0 distribution. It includes many new results from &lt;br /&gt;
* Manel Baucells, Lonnie Chrisman, Thomas W. Keelin and Stephen Xu (2025), &amp;quot;[https://papers.ssrn.com/sol3/papers.cfm?abstract_id=5279416 On the properties of the Metalog distribution]&amp;quot; (preprint), forthcoming.&lt;br /&gt;
&lt;br /&gt;
New features include:&lt;br /&gt;
* The resulting [[Keelin (MetaLog) distribution]]s are ''always'' feasible.&lt;br /&gt;
* There are closed-form analytic expressions for all central and standardized moments (see [[KeelinPropertyFromA#Basic_statistics_and_moments]]). &lt;br /&gt;
* There is a closed-form analytic expression for partial expectation (see [[KeelinPropertyFromA#Partial_expectation]]). This makes the Keelin distribution especially convenient for many problems that use piecewise-linear transformations of an uncertain quantity.&lt;br /&gt;
* It uses the superior basis order of the MetaLog 2.0.&lt;br /&gt;
* You can also specify the desired «mean», in addition to «values» (data points).&lt;br /&gt;
* New set of functions with names of the form &amp;lt;code&amp;gt;&amp;lt;x&amp;gt;KeelinFromA(...)&amp;lt;/code&amp;gt;use the «a» coefficient vector from [[KeelinCoefficients]]:&lt;br /&gt;
** &amp;lt;code&amp;gt;[[KeelinFromA]](...)&amp;lt;/code&amp;gt; -- analog to &amp;lt;code&amp;gt;[[Keelin]](...)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;[[DensKeelinFromA]](...)&amp;lt;/code&amp;gt; -- analog to &amp;lt;code&amp;gt;[[DensKeelin]](...)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;[[CumKeelinFromA]](...)&amp;lt;/code&amp;gt; -- analog to &amp;lt;code&amp;gt;[[CumKeelin]](...)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;[[CumKeelinInvFromA]](...)&amp;lt;/code&amp;gt; -- analog to &amp;lt;code&amp;gt;[[CumKeelinInv]](...)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;[[KeelinPropertyFromA]](...)&amp;lt;/code&amp;gt; -- ''new to [[Analytica 6.6]]''&lt;br /&gt;
*:When using the Keelin distribution,  you can either use a quantile parameterization or an «a»-vector parameterization. These new functions make it clearer that you are using the «a»-vector parameterization, instead of using the original (analogous) functions with a special flag. &lt;br /&gt;
* A new option uses a [https://docs.analytica.com/index.php?title=Keelin_(MetaLog)_distribution&amp;amp;anarelease=6.6#Using_direct_method_for_bounds direct method for bounded support] as an alternative to the previous [https://docs.analytica.com/index.php?title=Keelin_(MetaLog)_distribution&amp;amp;anarelease=6.6#Using_the_Transform_method_for_bounds transform-method for bounded support].&lt;br /&gt;
&lt;br /&gt;
== Diagrams and controls ==&lt;br /&gt;
* [[Checkbox]] now has an &amp;quot;include ALL&amp;quot; option, enabling [[Parametric analysis]] even with a checkbox.&lt;br /&gt;
* [[Multichoice]] controls include a new option at the top to ''select '''all''''', ''select '''none''''' or ''select '''first''''', depending on the context. These are more obvious to the user than using the &amp;lt;code&amp;gt;Ctrl+A&amp;lt;/code&amp;gt; key.&lt;br /&gt;
* A text node can display several [[Links_or_URL_in_model_attributes#Extended_HTML_markup|new html formatting options]], including changes to text color, bullets and numbered lists.&lt;br /&gt;
* A new [[ChangeNodeVisibility|node visibility option]] lets you hide a node while Analytica is computing.&lt;br /&gt;
&lt;br /&gt;
== Expression language ==&lt;br /&gt;
* There is a new separate &amp;lt;code&amp;gt;Boolean&amp;lt;/code&amp;gt; data type. To preserve backward compatibility, the values continue to display as 0 or 1, but the [[Number format dialog]] provides an option to display values with the boolean data type as True or False to distinguish them from 0 and 1. &lt;br /&gt;
* You can now find the maximum over all indexes of &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; using &lt;br /&gt;
*::&amp;lt;code&amp;gt;[[Max]]( X, All }&amp;lt;/code&amp;gt; &lt;br /&gt;
*:This is a shortcut for &lt;br /&gt;
*::&amp;lt;code&amp;gt;[[Max]]( X, ...[[IndexesOf]](X) )&amp;lt;/code&amp;gt;&lt;br /&gt;
*:which uses [[Repeated parameter forwarding]]. The &amp;lt;code&amp;gt;All&amp;lt;/code&amp;gt; keyword can be used in this fashion with [[Min]], [[Sum]], [[BitAnd]], [[BitOr]] and [[BitXOr]].&lt;br /&gt;
* If you write your own function, and want it to accept the keyword &amp;lt;code&amp;gt;All&amp;lt;/code&amp;gt; for a repeated index parameter, you can include a new &amp;lt;code&amp;gt;OrAll&amp;lt;/code&amp;gt; [[Function parameter qualifiers|function parameter qualifier]].&lt;br /&gt;
* When passing a [[Local function]] (aka '''lambda function''') as a parameter to a function call, you no longer have to include a function name (which wasn't used anyway).&lt;br /&gt;
* [[Repeated parameter forwarding]] can now be used on literal lists to &amp;quot;splat&amp;quot; lists (or 1-D arrays) together into the list. Example:&lt;br /&gt;
*:&amp;lt;code&amp;gt;[[Local]] s1 := 'c'..'f', s2 := 'h'..'k' Do [ 'a', 'b', ...s1, 'g', ...s2, 'l' ]&amp;lt;/code&amp;gt;&lt;br /&gt;
*::&amp;amp;rarr; &amp;lt;code&amp;gt;['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l']&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Built-in functions ==&lt;br /&gt;
* New function [[OAuth2Authorize]]. This is used to log into web services such as Google docs, etc.&lt;br /&gt;
* &amp;lt;code&amp;gt;[[TypeOf]]( x, shallow:True )&amp;lt;/code&amp;gt; now returns &amp;lt;code&amp;gt;&amp;quot;Image&amp;quot;&amp;lt;/code&amp;gt; when &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; is an image.&lt;br /&gt;
* When &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; is an image, &amp;lt;code&amp;gt;f&amp;quot;{x:H}&amp;quot;&amp;lt;/code&amp;gt; returns the long hex string that appears in a [[Pict]] attribute in a model file (but without the parens around it that appear in the model file).&lt;br /&gt;
* [[ReadTextFile]] returns the file encoding as its fourth return value.&lt;br /&gt;
* [[RunConsoleProcess]] is able to launch several applications that it previous could not, including PowerShell.&lt;br /&gt;
* New syntactic extensions added to the [[Arrow_operator#x_.E2.86.92_.5Bi.5D|arrow operator]], namely   &amp;lt;code&amp;gt;x&amp;amp;rarr;[n]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;x&amp;amp;rarr;[m..n]&amp;lt;/code&amp;gt; for [[Text values]] and [[In-memory binary data terms]].&lt;br /&gt;
&lt;br /&gt;
== File saving and loading ==&lt;br /&gt;
* '''Add Library...''' defaults to ''Link to filed module or library'' for almost all the standard libraries, which is the preferred way to add libraries to your model. (Except it still defaults to ''Embed a copy'' for the [[ACP Style Library]] since that library acts more module-like and changes its internal state).&lt;br /&gt;
* You can now set the [[Att_Dirties]] attribute (to 0) for your own user Variables. When set to 0, a change to the Definition doesn't dirty the Library or module that contains the Variable.&lt;br /&gt;
&lt;br /&gt;
== Example models and libraries ==&lt;br /&gt;
* A new example model included: &amp;lt;code&amp;gt;&amp;quot;Engineering / Generator availability.ana&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* An able to handle file paths &amp;gt; 256 characters in most cases. Actually taking advantage of this requires you to have long paths enabled in Windows, e.g., by setting the registry setting&lt;br /&gt;
*::&amp;lt;code&amp;gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem :: LongPathsEnabled = 1&amp;lt;/code&amp;gt;&lt;br /&gt;
*:or  by using the &amp;lt;code&amp;gt;\\unc\.... &amp;lt;/code&amp;gt; syntax for file paths. However, long file paths are not supported by Microsoft One drive or by Microsoft office, including Excel, so you cannot use long paths for files within a One drive folder or when opening a spreadsheet file.&lt;br /&gt;
* Several of the diagram themes in the [[Themes Library]] were renamed. &lt;br /&gt;
&lt;br /&gt;
== Graphing ==&lt;br /&gt;
* Control over the fill origin for a filled-area line chart using Fill type = &amp;quot;From origin&amp;quot;. &lt;br /&gt;
*: One example usage for this is to select &amp;lt;code&amp;gt;.Probability=0.5&amp;lt;/code&amp;gt; as the fill origin in a probability bands plot, which results in a plot like this one&lt;br /&gt;
*:::[[image:filled_bands_plot.png]]&lt;br /&gt;
*: This example is already easily achieved by placing the [[Plot solid prob bands]] function in the [[OnGraphDraw]] attribute, but with the new feature it is also directly configurable with a few [[Graph setup dialog]] clicks.&lt;br /&gt;
* When you turn on '''Graph Setup / Text / Adapt displayed font sizes to graph height''', it now uses the current height of the graph you were viewing as the reference height, such that when the graph has that same height, the point sizes shown in the graph setup dialog will be the correct font sizes. Previously the reference height was fixed at the default result window height (a graph of 241 pixels tall).&lt;br /&gt;
&lt;br /&gt;
== Other GUI ==&lt;br /&gt;
* There are a few new options on the '''Windows''' menu:&lt;br /&gt;
** Bring next window to front &lt;br /&gt;
** Bring previous window to front&lt;br /&gt;
** [[Typescript window|Typescript console]]&lt;br /&gt;
&lt;br /&gt;
== Licensing ==&lt;br /&gt;
* [[ParseJSON]] and [[MakeJSON]] no longer require {{Analytica Enterprise}}.&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_6.6%3F&amp;diff=63557</id>
		<title>What's new in Analytica 6.6?</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=What%27s_new_in_Analytica_6.6%3F&amp;diff=63557"/>
		<updated>2025-12-16T19:25:08Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: /* Keelin Metalog distribution 2.0 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:What's new pages]]&lt;br /&gt;
[[category:Analytica releases]]&lt;br /&gt;
&amp;lt;!--This page lists new features in release 6.6, which is currently in beta testing prior to final release. Analytica 6.6 is currently in [[Beta Tester Page|Beta Testing]].  If have have an active subscription license, we encourage you to try it out from the [[Beta Tester Page]].--&amp;gt;&lt;br /&gt;
This page lists new features in release 6.6 (the current release) of Analytica (including [[ACP]] and [[ADE]]) since the previous [[Analytica 6.5]] release. &lt;br /&gt;
&lt;br /&gt;
Analytica normally prompts you to download and install the new release the next time you run it.&lt;br /&gt;
If not, you can download it from [https://analytica.com/users/renew-upgrade/ Renew, upgrade or download].&lt;br /&gt;
&lt;br /&gt;
== Highlights of 6.6 ==&lt;br /&gt;
&lt;br /&gt;
* [[#Assista|Assista]], the Analytica AI Assistant, is faster and more reponsive.&lt;br /&gt;
* The [[#Keelin Metalog distribution 2.0|Keelin (or Metalog) distribution]] is now the preferred method to define any continuous distribution, because it now avoids the occasional infeasibility problem that previously bedeviled it.&lt;br /&gt;
* You can select [[#Diagrams and controls|All in Checkboxes]] for parametric analysis  and in Multichoice.&lt;br /&gt;
* You can use [[Links_or_URL_in_model_attributes#Extended_HTML_markup| html to set text styles in text nodes]], including bold, italic, underline, bold, colors, bullets, and more in desktop Analytica. Even more html tags work in ACP.&lt;br /&gt;
* [[#Expression language|Sum(x, All) sums over All indexes of x]]. Similar for Min, Max, Product, and more.&lt;br /&gt;
* The new [[OAuth2Authorize]] function lets you access web services, such as Google docs, sheets, Salesforce, etc to read or write data.&lt;br /&gt;
* You can specify a [[#Graphing|Fill origin for graphs]] to let you show colored bands around the center line -- e.g. for probability bands over time.&lt;br /&gt;
&lt;br /&gt;
== Assista ==&lt;br /&gt;
* The chat UI is faster. Responses start streaming sooner.&lt;br /&gt;
* You can use the Enter key (or Ctrl+Alt) to submit responses without having to click to submit button. The Return key adds a new line (the behavior elsewhere in Analytica).  If you have the [[Preferences_dialog#Personal_Preferences|Use Return to enter data]] preference set, then the Return key will submit responses and the Enter key adds a new line.&lt;br /&gt;
&lt;br /&gt;
== Keelin Metalog distribution 2.0 ==&lt;br /&gt;
Introducing the '''''always feasible''''', [[Keelin|infinitely flexible distribution]]!&lt;br /&gt;
&lt;br /&gt;
The  [[Keelin (MetaLog) distribution]] has become popular due to its ability to closely match the shapes of all the standard continuous distributions as well as offering enormous flexibility in matching amost any shape. But up until now it has been plagued by finding some parameter combinations ''infleasible'',  so it would sometimes fail t to find a valid distribution to fit.&lt;br /&gt;
&lt;br /&gt;
[[Analytica 6.6]] fixes this problem with the MetaLog 2.0 distribution. It includes many new results from &lt;br /&gt;
* Manel Baucells, Lonnie Chrisman, Thomas W. Keelin and Stephen Xu (2025), &amp;quot;[https://papers.ssrn.com/sol3/papers.cfm?abstract_id=5279416 On the properties of the Metalog distribution]&amp;quot; (preprint), forthcoming.&lt;br /&gt;
&lt;br /&gt;
New features include:&lt;br /&gt;
* The resulting [[Keelin (MetaLog) distribution]]s are ''always'' feasible.&lt;br /&gt;
* There are closed-form analytic expressions for all central and standardized moments (see [[KeelinPropertyFromA#Basic_statistics_and_moments]]). &lt;br /&gt;
* There is a closed-form analytic expression for partial expectation (see [[KeelinPropertyFromA#Partial_expectation]]). This makes the Keelin distribution especially convenient for many problems that use piecewise-linear transformations of an uncertain quantity.&lt;br /&gt;
* It uses the superior basis order of the MetaLog 2.0.&lt;br /&gt;
* You can also specify the desired «mean», in addition to «values» (data points).&lt;br /&gt;
* New set of functions with names of the form &amp;lt;code&amp;gt;&amp;lt;x&amp;gt;KeelinFromA(...)&amp;lt;/code&amp;gt;use the «a» coefficient vector from [[KeelinCoefficients]]:&lt;br /&gt;
** &amp;lt;code&amp;gt;[[KeelinFromA]](...)&amp;lt;/code&amp;gt; -- analog to &amp;lt;code&amp;gt;[[Keelin]](...)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;[[DensKeelinFromA]](...)&amp;lt;/code&amp;gt; -- analog to &amp;lt;code&amp;gt;[[DensKeelin]](...)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;[[CumKeelinFromA]](...)&amp;lt;/code&amp;gt; -- analog to &amp;lt;code&amp;gt;[[CumKeelin]](...)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;[[CumKeelinInvFromA]](...)&amp;lt;/code&amp;gt; -- analog to &amp;lt;code&amp;gt;[[CumKeelinInv]](...)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;[[KeelinPropertyFromA]](...)&amp;lt;/code&amp;gt; -- ''new to [[Analytica 6.6]]''&lt;br /&gt;
*:When using the Keelin distribution,  you can either use a quantile parameterization or an «a»-vector parameterization. These new functions make it clearer that you are using the «a»-vector parameterization, instead of using the original (analogous) functions with a special flag. &lt;br /&gt;
* A new option uses a [https://docs.analytica.com/index.php?title=Keelin_(MetaLog)_distribution&amp;amp;anarelease=6.6#Using_direct_method_for_bounds direct method for bounded support] as an alternative to the previous [https://docs.analytica.com/index.php?title=Keelin_(MetaLog)_distribution&amp;amp;anarelease=6.6#Using_the_Transform_method_for_bounds transform-method for bounded support].&lt;br /&gt;
&lt;br /&gt;
== Diagrams and controls ==&lt;br /&gt;
* [[Checkbox]] now has an &amp;quot;include ALL&amp;quot; option, enabling [[Parametric analysis]] even with a checkbox.&lt;br /&gt;
* A [[Multichoice]] control includes a new &amp;quot;meta-item&amp;quot; at the top to ''select '''all''''', ''select '''none''''' or ''select '''first''''', depending on the context. These mimic the behavior of the &amp;lt;code&amp;gt;Ctrl+A&amp;lt;/code&amp;gt; key.&lt;br /&gt;
* A text node can display several [[Links_or_URL_in_model_attributes#Extended_HTML_markup|new formatting options corresponding to html tags]], including changes to text color, bullets and numbered lists.&lt;br /&gt;
* A new [[ChangeNodeVisibility|node visibility option]] allows you to hide a node while Analytica is computing.&lt;br /&gt;
&lt;br /&gt;
== Expression language ==&lt;br /&gt;
* There is a new separate &amp;lt;code&amp;gt;Boolean&amp;lt;/code&amp;gt; data type. To preserve backward compatibility, the values continue to display as 0 or 1, but the [[Number format dialog]] provides an option to display values with the boolean data type as True or False to distinguish them from 0 and 1. &lt;br /&gt;
* You can now find the maximum over all indexes of &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; using &lt;br /&gt;
*::&amp;lt;code&amp;gt;[[Max]]( X, All }&amp;lt;/code&amp;gt; &lt;br /&gt;
*:This is a shortcut for &lt;br /&gt;
*::&amp;lt;code&amp;gt;[[Max]]( X, ...[[IndexesOf]](X) )&amp;lt;/code&amp;gt;&lt;br /&gt;
*:which uses [[Repeated parameter forwarding]]. The &amp;lt;code&amp;gt;All&amp;lt;/code&amp;gt; keyword can be used in this fashion with [[Min]], [[Sum]], [[BitAnd]], [[BitOr]] and [[BitXOr]].&lt;br /&gt;
* If you write your own function, and want it to accept the keyword &amp;lt;code&amp;gt;All&amp;lt;/code&amp;gt; for a repeated index parameter, you can include a new &amp;lt;code&amp;gt;OrAll&amp;lt;/code&amp;gt; [[Function parameter qualifiers|function parameter qualifier]].&lt;br /&gt;
* When passing a [[Local function]] (aka '''lambda function''') as a parameter to a function call, you no longer have to include a function name (which wasn't used anyway).&lt;br /&gt;
* [[Repeated parameter forwarding]] can now be used on literal lists to &amp;quot;splat&amp;quot; lists (or 1-D arrays) together into the list. Example:&lt;br /&gt;
*:&amp;lt;code&amp;gt;[[Local]] s1 := 'c'..'f', s2 := 'h'..'k' Do [ 'a', 'b', ...s1, 'g', ...s2, 'l' ]&amp;lt;/code&amp;gt;&lt;br /&gt;
*::&amp;amp;rarr; &amp;lt;code&amp;gt;['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l']&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Built-in functions ==&lt;br /&gt;
* New function [[OAuth2Authorize]]. This is used to log into web services such as Google docs, etc.&lt;br /&gt;
* &amp;lt;code&amp;gt;[[TypeOf]]( x, shallow:True )&amp;lt;/code&amp;gt; now returns &amp;lt;code&amp;gt;&amp;quot;Image&amp;quot;&amp;lt;/code&amp;gt; when &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; is an image.&lt;br /&gt;
* When &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; is an image, &amp;lt;code&amp;gt;f&amp;quot;{x:H}&amp;quot;&amp;lt;/code&amp;gt; returns the long hex string that appears in a [[Pict]] attribute in a model file (but without the parens around it that appear in the model file).&lt;br /&gt;
* [[ReadTextFile]] returns the file encoding as its fourth return value.&lt;br /&gt;
* [[RunConsoleProcess]] is able to launch several applications that it previous could not, including PowerShell.&lt;br /&gt;
* New syntactic extensions added to the [[Arrow_operator#x_.E2.86.92_.5Bi.5D|arrow operator]], namely   &amp;lt;code&amp;gt;x&amp;amp;rarr;[n]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;x&amp;amp;rarr;[m..n]&amp;lt;/code&amp;gt; for [[Text values]] and [[In-memory binary data terms]].&lt;br /&gt;
&lt;br /&gt;
== File saving and loading ==&lt;br /&gt;
* '''Add Library...''' defaults to ''Link to filed module or library'' for almost all the standard libraries, which is the preferred way to add libraries to your model. (Except it still defaults to ''Embed a copy'' for the [[ACP Style Library]] since that library acts more module-like and changes its internal state).&lt;br /&gt;
* You can now set the [[Att_Dirties]] attribute (to 0) for your own user Variables. When set to 0, a change to the Definition doesn't dirty the Library or module that contains the Variable.&lt;br /&gt;
&lt;br /&gt;
== Example models and libraries ==&lt;br /&gt;
* A new example model included: &amp;lt;code&amp;gt;&amp;quot;Engineering / Generator availability.ana&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* An able to handle file paths &amp;gt; 256 characters in most cases. Actually taking advantage of this requires you to have long paths enabled in Windows, e.g., by setting the registry setting&lt;br /&gt;
*::&amp;lt;code&amp;gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem :: LongPathsEnabled = 1&amp;lt;/code&amp;gt;&lt;br /&gt;
*:or  by using the &amp;lt;code&amp;gt;\\unc\.... &amp;lt;/code&amp;gt; syntax for file paths. However, long file paths are not supported by Microsoft One drive or by Microsoft office, including Excel, so you cannot use long paths for files within a One drive folder or when opening a spreadsheet file.&lt;br /&gt;
* Several of the diagram themes in the [[Themes Library]] were renamed. &lt;br /&gt;
&lt;br /&gt;
== Graphing ==&lt;br /&gt;
* Control over the fill origin for a filled-area line chart using Fill type = &amp;quot;From origin&amp;quot;. &lt;br /&gt;
*: One example usage for this is to select &amp;lt;code&amp;gt;.Probability=0.5&amp;lt;/code&amp;gt; as the fill origin in a probability bands plot, which results in a plot like this one&lt;br /&gt;
*:::[[image:filled_bands_plot.png]]&lt;br /&gt;
*: This example is already easily achieved by placing the [[Plot solid prob bands]] function in the [[OnGraphDraw]] attribute, but with the new feature it is also directly configurable with a few [[Graph setup dialog]] clicks.&lt;br /&gt;
* When you turn on '''Graph Setup / Text / Adapt displayed font sizes to graph height''', it now uses the current height of the graph you were viewing as the reference height, such that when the graph has that same height, the point sizes shown in the graph setup dialog will be the correct font sizes. Previously the reference height was fixed at the default result window height (a graph of 241 pixels tall).&lt;br /&gt;
&lt;br /&gt;
== Other GUI ==&lt;br /&gt;
* There are a few new options on the '''Windows''' menu:&lt;br /&gt;
** Bring next window to front &lt;br /&gt;
** Bring previous window to front&lt;br /&gt;
** [[Typescript window|Typescript console]]&lt;br /&gt;
&lt;br /&gt;
== Licensing ==&lt;br /&gt;
* [[ParseJSON]] and [[MakeJSON]] no longer require {{Analytica Enterprise}}.&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=Struct&amp;diff=63555</id>
		<title>Struct</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=Struct&amp;diff=63555"/>
		<updated>2025-12-14T21:04:12Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: /* Member functions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:Objects]]&lt;br /&gt;
[[category:Variables]]&lt;br /&gt;
''new to [[Analytica 7.0]]''&lt;br /&gt;
&lt;br /&gt;
Most programming languages have a way to bundle a set of disparate data into a packet, often called Records, Classes, or  Structs. In Analytica, you can do this using an array with an [[Index]], but this doesn't work so well if the values in the array are disparate, for example, if they include numbers, text, references to other data, or array values with different dimensions.  For example, if you want to create lists or hierarchies,  represent JSON data or html.  Thta's why Analytica has introduced Structs to represent these kinds of data structures. &lt;br /&gt;
&lt;br /&gt;
A struct instance can have multiple member fields,  which can be of varioust data types and dimensionality. For example, a struct could have a scalar member, a 1-D member and a 2-D member, where the dimensions of the members are unrelated. Each struct value is treated as an atomic element, and it does not apply Array abstraction within the Struct.&lt;br /&gt;
&lt;br /&gt;
== Struct class ==&lt;br /&gt;
&lt;br /&gt;
A [[Struct]] object defines a new atomic data type.  It appears on a diagram with a shape that resembles a function, but with flat midsections on both the left and right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[image:MyDtype_Struct.png]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After you define a [[Struct]], you can create instances of it. Instances are ''atomic'' and ''immutable'': ''Atomic''meaning that [[Array Abstraction]] treats it as a single cell -- even though it may have multiple elements.''Immutable'' meaning that, it cannot be destructively altered after it's been created.&lt;br /&gt;
&lt;br /&gt;
A [[Struct]] is an [[Objects and Values|Object]]. An instance of a struct is a [[Objects and Values|Value]].&lt;br /&gt;
&lt;br /&gt;
== When to use a Struct ==&lt;br /&gt;
&lt;br /&gt;
These are examples of when a Struct may be convenient:&lt;br /&gt;
* To represent hierarchical data, such as from html or JSON.&lt;br /&gt;
&lt;br /&gt;
* If you want your data type to be an opaque atomic unit with multiple internal items. &lt;br /&gt;
&lt;br /&gt;
* To [[Returning multiple values|return multiple return values]] with varying dimensions as an alternative to capturing multiple return values.&lt;br /&gt;
&lt;br /&gt;
* To pass complex data structures among user-defined functions.&lt;br /&gt;
&lt;br /&gt;
* To enforce a distinction that does not exist in Analytica, but is used in another platform or service that you are integrating with.&lt;br /&gt;
&lt;br /&gt;
== Defining a Struct ==&lt;br /&gt;
To define a [[Struct]], you can first create a [[UDF|user function]] object by draggin the functio node from the [[Create and edit nodes|object Toolbar]]). Then change its class to &amp;lt;code&amp;gt;Struct&amp;lt;/code&amp;gt; in its [[Object window]] or [[Attribute window]].&lt;br /&gt;
&lt;br /&gt;
A Struct uses the [[Parameters]] attribute with the same [[Function Parameter Qualifiers]] as a [[User-Defined Function]] (UDF), for example:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;Struct MyDtype( a : atom ; b : Text [I] ; c: Number[J] )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This Struct has three members -- &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; with any atomic data type, &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, which is text and may be an array of texts with index &amp;lt;code&amp;gt;I&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;, which must be a numberand may have index &amp;lt;code&amp;gt;J&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
The default [[Definition]] of a Struct is &amp;lt;code&amp;gt;Self&amp;lt;/code&amp;gt;.  Sometimes you may specify a more specialized definition -- see [[#Constructor customization]] below.&lt;br /&gt;
&lt;br /&gt;
== Instantiating a value ==&lt;br /&gt;
&lt;br /&gt;
To create an instance of a Struct, you simply call the name of your struct as if it were a function from within an expression. In the previous example, that might be:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;MyDtype( Category, Category_aliases, Category_IDs )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If any value passed to a constructor parameter has extra indexes (dimensions), i.e. other than those specified in each paramter, [[Array Abstraction]] kicks in and creates an array of struct instances over those extra indexes.&lt;br /&gt;
&lt;br /&gt;
== Accessing member values ==&lt;br /&gt;
Use the [[Arrow operator]] to access a member values of a Struct. E.g.,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;inst -&amp;gt; b&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where &amp;lt;code&amp;gt;inst&amp;lt;/code&amp;gt; was obtained by calling the Struct.&lt;br /&gt;
&lt;br /&gt;
The left-hand side of the arrow can be a single instance, an array of instances, or even [[Null]].  The right-hand side of the arrow is the name of a member value.&lt;br /&gt;
&lt;br /&gt;
== Member functions ==&lt;br /&gt;
&lt;br /&gt;
You can define ''member functions'' to access values from a Struct, for example:&lt;br /&gt;
:&amp;lt;code&amp;gt;inst -&amp;gt; F(x, y)&amp;lt;/code&amp;gt;&lt;br /&gt;
The parameters must be passed by value (e.g., no Index parameters). Keep in mind that the instance is immutable so these functions can't usually modify the internal state of the instance (see Section [[#Immutability]] for exceptions).&lt;br /&gt;
&lt;br /&gt;
You can define a Struct ''member function'' using a standard user-defined function. Open the [[Struct]]'s diagram (as you would open up the diagram of a Module node) and drag a Function object into the diagram. In the Function's [[Object window]], set its  parameters ensuring that the first parameter is declared as Self using the Struct datatype and [[Objects and Values|Atom]] qualifier, for example:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;Function F( Self: MyDtype Atom; param1; param2)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It can have zero or more additional parameters. These are the ones passed to the function when it is called using the syntax &amp;lt;code&amp;gt;inst &amp;amp;rarr; F(x,y)&amp;lt;/code&amp;gt;. These parameters can have any data type qualifier, dimensionality declaration; however,  for now they cannot handle [[Function_parameter_qualifiers#Evaluation_Mode_Qualifiers|evaluation mode qualifiers]] or [[Function_parameter_qualifiers#Object_Class_Qualifiers|Object class qualifiers]].&lt;br /&gt;
&lt;br /&gt;
You can also introduce global variables that are &amp;quot;private&amp;quot; to the Struct and its member functions by adding normal variable nodes to the diagram. Note that these are contained in the Struct definition, not in each instance. To have a value that varies with each instance, you must use a member value.&lt;br /&gt;
&lt;br /&gt;
== Constructor customization ==&lt;br /&gt;
The member values of an instance are usually the parameter names that appear in the [[Parameter]] attribute of the struct (its Constructor's parameter names). However, in some use cases the constructor may change the member values, such as by adding new members, transforming the named members, or even removing members. These changes must be performed in the [[Definition]] of the constructor.&lt;br /&gt;
&lt;br /&gt;
When you first view the [[Object window]] of a [[Struct]], the [[Definition]] might not be visible (because altering the member values is somewhat esoteric). If you don't see it, use the [[Object_Window#Selecting_Attributes_to_Display|Attribute visibility popup]] to make it visible.&lt;br /&gt;
&lt;br /&gt;
Inside the constructor (and only in the constructor) the members can be assigned.  For example:&lt;br /&gt;
&lt;br /&gt;
 [[Struct]] MyDType( a : atom ; b : Text [I] ; c : Number [J] )&lt;br /&gt;
 '''Definition''': &lt;br /&gt;
        Self -&amp;gt; creationTime := [[Today]](true);&lt;br /&gt;
        Self -&amp;gt; c := c / [[Sum]](C,  J);&lt;br /&gt;
        Self&lt;br /&gt;
&lt;br /&gt;
The final value is always &amp;lt;code&amp;gt;Self&amp;lt;/code&amp;gt; whether or not your Definition actually returns &amp;lt;code&amp;gt;Self&amp;lt;/code&amp;gt;, although it is clearer to do. Notice that in this example, it adds a new member value, &amp;lt;code&amp;gt;creationTime&amp;lt;/code&amp;gt;, and changes the member value &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; to the normalized value.&lt;br /&gt;
&lt;br /&gt;
When you change the member values in the constructor, you should consider whether you will ever assign values of your Struct to a definition or other expression attribute, or whether instances will even need to be saved directly in the model file. These cases require a text representation that is valid expression and which results in an equivalent instance. In the event that you alter the members, you may need to add a custom [[#ExpressionText]] member function that prints out a constructor call expression.&lt;br /&gt;
&lt;br /&gt;
== Using an excess parameter in the constructor ==&lt;br /&gt;
&lt;br /&gt;
An ''excess parameter'' is a catch-all parameter that allows the caller to include named parameters that aren't listed in the parameters. It can be either named or unnamed.&lt;br /&gt;
&lt;br /&gt;
The constructor has an unnamed excess parameter when the last parameter is named &amp;lt;code&amp;gt;&amp;quot;...&amp;quot;&amp;lt;/code&amp;gt;. For example,&lt;br /&gt;
&lt;br /&gt;
 [[Struct]] MyDType2( a : atom ; b : Text[I] ; ... )&lt;br /&gt;
&lt;br /&gt;
When declared in this fashion, a caller can specify parameters other than &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, for example:&lt;br /&gt;
&lt;br /&gt;
 MyDType2( a:5, b:f&amp;quot;I={I}&amp;quot;, c:14, d:=J^2 )&lt;br /&gt;
&lt;br /&gt;
When an unnamed excess parameter is used in this way, the additional parameters are automatically added as members. Hence, in this example, &amp;lt;code&amp;gt;MyDType2&amp;lt;/code&amp;gt; has members &amp;lt;code&amp;gt;['a', 'b', 'c', 'd']&amp;lt;/code&amp;gt;. Because the excess parameter is unnamed, there is no way to refer to it in the constructor's definition. &lt;br /&gt;
&lt;br /&gt;
To specify that the excess parameters not be added to the struct instance, you can use&lt;br /&gt;
 [[Struct]] MyDType3( a : atom ; b : Text[I] ; ... : nonMember )&lt;br /&gt;
&lt;br /&gt;
A ''named excess parameter'' is declared using a named that starts with &amp;lt;code&amp;gt;&amp;quot;...&amp;quot;&amp;lt;/code&amp;gt;, which again must be the last parameter in the declaration. For example,&lt;br /&gt;
&lt;br /&gt;
 [[Struct]] MyDType3( a : atom ; b : Text[I] ; ...kw )&lt;br /&gt;
&lt;br /&gt;
Inside the constructor's definition, it can now refer to the local variable &amp;lt;code&amp;gt;kw&amp;lt;/code&amp;gt;. The value of &amp;lt;code&amp;gt;kw&amp;lt;/code&amp;gt; is itself a struct instance where each argument is a member. For example, when called as&lt;br /&gt;
 MyDType3( a:5, b:f&amp;quot;{I}&amp;quot;, y:43, z:'hello' )&lt;br /&gt;
The Definition of MyDType3 could reference &amp;lt;code&amp;gt;kw-&amp;gt;y&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;kw-&amp;gt;z&amp;lt;/code&amp;gt; when called in this example; however, those would fail with an error when &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;z&amp;lt;/code&amp;gt; is not specified.&lt;br /&gt;
&lt;br /&gt;
== Equality and comparison ==&lt;br /&gt;
&lt;br /&gt;
Two struct instances are equal (i.e., &amp;lt;code&amp;gt;s1=s2&amp;lt;/code&amp;gt; is true) only when they are of the same Struct, have the same member names and have the same  member values. In other words, &amp;lt;code&amp;gt;s1=s2&amp;lt;/code&amp;gt; is based on &amp;quot;deep equality&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Shallow equality tests whether two instances are the exact same instance (as opposed to whether the two instances are equal). The following can be used to test whether two instances are the exact same instance:&lt;br /&gt;
:&amp;lt;code&amp;gt;s1-&amp;gt;_addr = s2-&amp;gt;_addr&amp;lt;/code&amp;gt;&lt;br /&gt;
The special &amp;lt;code&amp;gt;_addr&amp;lt;/code&amp;gt; member value returns an integer that is unique to each instance.&lt;br /&gt;
&lt;br /&gt;
Inequality comparisons are also based on the &amp;quot;deep&amp;quot; member values, based on the internal member value ordering.&lt;br /&gt;
&lt;br /&gt;
== Basic properties about an instance ==&lt;br /&gt;
&lt;br /&gt;
You can get a list of the member value names using:&lt;br /&gt;
:&amp;lt;code&amp;gt;inst -&amp;gt; _members&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can test whether it has a given member using:&lt;br /&gt;
:&amp;lt;code&amp;gt;inst -&amp;gt; Has('name')&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you have the name of a member value as text in a variable memberName, you can access its value using:&lt;br /&gt;
:&amp;lt;code&amp;gt;`-&amp;gt;`( inst, memberName )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With this syntax, you can also specify a default value to use when the instance does not have the specified name by specifying the optional «defVal» parameter:&lt;br /&gt;
:&amp;lt;code&amp;gt;`-&amp;gt;`( inst, memberName, defVal: Null )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that it wouldn't work to write &amp;lt;code&amp;gt;inst -&amp;gt; memberName&amp;lt;/code&amp;gt; because that would look for a member value named &amp;quot;memberName&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
You can get a handle to the instance's Struct object using&lt;br /&gt;
:&amp;lt;code&amp;gt;inst -&amp;gt; _type&amp;lt;/code&amp;gt;&lt;br /&gt;
You can get the name of the Struct (without a [[Namespaces|namespace]] prefix) from &amp;lt;code&amp;gt;[[TypeOf]](inst)&amp;lt;/code&amp;gt;. You can detect that an atom is a struct instance using&lt;br /&gt;
:&amp;lt;code&amp;gt;[[TypeOf]]( inst, shallow:true ) = &amp;quot;Struct&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Special member functions ==&lt;br /&gt;
&lt;br /&gt;
You can customize the behavior of your struct instances by adding special member functions (with reserved member function names). You add these as you would your own member functions to your Struct's diagram using the reserved name. Your implementation must match the required parameters for the special function.&lt;br /&gt;
&lt;br /&gt;
=== Customizing how a value is printed ===&lt;br /&gt;
My default, an instance of your Struct will display in a result table cell or in the [[Typescript window|Typescript console]] as, e.g., &amp;lt;code&amp;gt;«YourStructName»&amp;lt;/code&amp;gt;. You can customize this by adding a member function named &amp;lt;code&amp;gt;DisplayName&amp;lt;/code&amp;gt;. E.g., &lt;br /&gt;
&lt;br /&gt;
 Function DisplayName( Self : MyDtype atom )&lt;br /&gt;
 '''Definition''': f&amp;quot;«{[[TypeOf]](Self)} a={Self-&amp;gt;a}»&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Because &amp;lt;code&amp;gt;DisplayName&amp;lt;/code&amp;gt; occurs while individual cells are drawing on the screen, errors that occur while it is evaluating are not displayed. If an error occurs, it will silently fall back to the default display name.&lt;br /&gt;
&lt;br /&gt;
When your instance is &amp;quot;printed&amp;quot; to an expression (e.g., as a result of an assignment),  you need to ensure that the text is a valid expression that creates a logically equivalent instance. This happens by default unless you alter the members in your constructor (see [[#Constructor customization]] above). To control this, add a member function name &amp;lt;code&amp;gt;ExpressionText(Self)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Value expansion (in a result table) ===&lt;br /&gt;
When a struct instance appears in the cell of a result table, it appears as a hyperlink. Double clicking on it expands the value. By default, it expands into the member values. You can change this by adding a member function named  &amp;lt;code&amp;gt;Expand(Self)&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Your expansion code cannot simply create an array of your member values (assuming they have different dimensionalities) since this would combine their dimensions.  Instead, you should wrap each non-atomic value in &amp;lt;code&amp;gt;_HyperlinkedCellvalue&amp;lt;/code&amp;gt;. For example:&lt;br /&gt;
&lt;br /&gt;
 Function Expand( Self )&lt;br /&gt;
 '''Definition''': [ 'a' : Self-&amp;gt;a, &lt;br /&gt;
               'b' : _HyperlinkedCellValue( Self-&amp;gt;b ), &lt;br /&gt;
               'c' : _HyperlinkedCellValue( Self-&amp;gt;c ) ]&lt;br /&gt;
&lt;br /&gt;
You can also introduce a local index for the expansion.&lt;br /&gt;
&lt;br /&gt;
After it expands, the result table displays a title showing the current &amp;quot;path&amp;quot; to the result view. Ideally this title is also a valid expression that produces the same result. When you customize the expansion, you may also need to customize the expansion title. You can do this by adding a member function&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;Function TitleForExpand(Self : Tuple  atom ; subTitle : text atom ; memberNum :  optional  positive atom )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The «subTitle» is the title up to the point of this expansion, and «memberNum» exposes which cell number was expanded from the previous level.&lt;br /&gt;
&lt;br /&gt;
=== Finalizers ===&lt;br /&gt;
&lt;br /&gt;
A finalizer is a member function that is called when the struct instance value is released for last time.&lt;br /&gt;
&lt;br /&gt;
You can add a customized finalizer, for example, to ensure that a resource gets cleaned up. An example use case would be when your [[Struct]] is a temporary file, with the finalizer ensuring that the temporary file is deleted when the instance is released. This is an example where the constructor would pick a unique file name that doesn't already exist, and the finalizer calls [[FileSystemDelete]]. &lt;br /&gt;
&lt;br /&gt;
To add a finalizer, add a member function named &amp;lt;code&amp;gt;Finalizer(Self)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Finalizers should have a low probability of an error occurring while the finalizer is evaluating. In the event that an error occurs, it is not possible for Analytica to report the error, so the error will occur silently. If you do not catch it (in a [[Try]]), your full finalizer code might not run.&lt;br /&gt;
&lt;br /&gt;
=== Callable values ===&lt;br /&gt;
&lt;br /&gt;
You can make an instance of your Struct &amp;quot;''callable''&amp;quot;, such that you can call the instance using e.g.,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;inst -&amp;gt; ( x, y )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To make it callable, create a member function named &amp;lt;code&amp;gt;`()`&amp;lt;/code&amp;gt; -- make sure to include the backtics as part of the name, and no spaces between the parens. For example:&lt;br /&gt;
&lt;br /&gt;
 Function `()`( alpha, pwr )&lt;br /&gt;
 '''Definition''': (1-alpha) * Self-&amp;gt;a + alpha * [[Sum]]( b^pwr, I )&lt;br /&gt;
&lt;br /&gt;
If you do this, you can also use a [[Callable]]  object class to hold your instance (or an array of instances) and then call it using the name of your callable as if it were a normal function (even though the logical function itself is computed), e.g.,&lt;br /&gt;
&lt;br /&gt;
:[[Callable]] F1 := MyDType( x,y,z )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And call it:&lt;br /&gt;
:&amp;lt;code&amp;gt;F1(0.3, 2) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Custom atomic subscripting ===&lt;br /&gt;
Your data type can support the syntax&lt;br /&gt;
:&amp;lt;code&amp;gt;inst -&amp;gt; [n]&amp;lt;/code&amp;gt;&lt;br /&gt;
by adding a member function named &amp;lt;code&amp;gt;`[]`&amp;lt;/code&amp;gt;. It can have either one or two parameters (after &amp;lt;code&amp;gt;Self&amp;lt;/code&amp;gt;). With one parameter, only &amp;lt;code&amp;gt;inst -&amp;gt; [n]&amp;lt;/code&amp;gt; is supported (so that &amp;lt;code&amp;gt;inst -&amp;gt; [m..n]&amp;lt;/code&amp;gt; would array abstract returning a list). With two parameters, where the second parameter is optional, it can include special handling of &amp;lt;code&amp;gt;inst -&amp;gt; [m..n]&amp;lt;/code&amp;gt;, for example by returning a new collection instance of the same type. &lt;br /&gt;
&lt;br /&gt;
 Function `[]`( Self : Tuple atom ; m,n : optional number atom )&lt;br /&gt;
&lt;br /&gt;
In this example, if &amp;lt;code&amp;gt;inst -&amp;gt; [m]&amp;lt;/code&amp;gt; is called, then the «n» parameter is omitted. If &amp;lt;code&amp;gt;inst -&amp;gt; [m..n]&amp;lt;/code&amp;gt; is called, both parameters are provided. If &amp;lt;code&amp;gt;inst -&amp;gt; [m..]&amp;lt;/code&amp;gt; is called, then «n» is [[INF]]. And if &amp;lt;code&amp;gt;inst-&amp;gt;[..n]&amp;lt;/code&amp;gt; is called, then «m» is omitted.&lt;br /&gt;
&lt;br /&gt;
=== Operator overloading ===&lt;br /&gt;
&lt;br /&gt;
At present, only these operators can be overloaded by adding a member function with the given name.&lt;br /&gt;
&lt;br /&gt;
* Function `#`( Self )&lt;br /&gt;
&lt;br /&gt;
=== Overloading the &amp;lt;code&amp;gt;`-&amp;gt;`&amp;lt;/code&amp;gt; operator ===&lt;br /&gt;
&lt;br /&gt;
It is possible to overload the right-arrow operator for a Struct, intercepting attempts to read a member value or to set  a member value. &lt;br /&gt;
&lt;br /&gt;
If you only want to intercept attempts to read member values, add the following member function in your struct:&lt;br /&gt;
 Function `-&amp;gt;`( Self : '''''YourStruct''''' atom ; member : Text atom ; defVal : optional named )&lt;br /&gt;
By sure to change '''''YourStruct''''' to the actual name of your struct. This will be called when code evaluates&lt;br /&gt;
:&amp;lt;code&amp;gt;inst -&amp;gt; member&amp;lt;/code&amp;gt;&lt;br /&gt;
on an instance &amp;lt;code&amp;gt;inst&amp;lt;/code&amp;gt; of your struct. Your function can return values for members that don't actually exist, or deny members that might exist, or just intercept the read and then forward it in the usual way. &lt;br /&gt;
&lt;br /&gt;
Exceptions: Member functions with names beginning with an underscore are never intercepted (such as the special &amp;lt;code&amp;gt;inst-&amp;gt;_members&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;inst-&amp;gt;_type&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;inst-&amp;gt;_addr&amp;lt;/code&amp;gt; virtual members).  Also, calls to member local functions or member functions are never intercepted -- this intercepts member value access only.&lt;br /&gt;
&lt;br /&gt;
Your implementation of the overload will often want to access the actual members of the class. It must not use the usual arrow operator for this because that would result in an infinite recursion.  Instead, you can use the raw member access function, &amp;lt;code&amp;gt;`-&amp;gt;!`&amp;lt;/code&amp;gt;, which behaves the same same as &amp;lt;code&amp;gt;`-&amp;gt;`&amp;lt;/code&amp;gt; except that it cannot be overridden. This function can only be called using a function call syntax, it cannot be used as an infix operator. &lt;br /&gt;
&lt;br /&gt;
Here is a contrived example that makes is look like the file contents is a member value. (It would be better to just add a member function for this, but it makes for an easy example).&lt;br /&gt;
&lt;br /&gt;
 Struct TextFile( filename : Text atom )&lt;br /&gt;
 &lt;br /&gt;
 Function TextFile::`-&amp;gt;`( Self : TextFile atom ; member : Text atom ; defVal : optional named )&lt;br /&gt;
 '''Definition''':&lt;br /&gt;
 [[If]] TextLowerCase(member) = &amp;quot;contents&amp;quot; Then &lt;br /&gt;
   [[ReadTextFile]](filename)&lt;br /&gt;
 [[Else]]&lt;br /&gt;
   `-&amp;gt;!`( Self, member, defVal:defVal )&lt;br /&gt;
&lt;br /&gt;
You can also use an override of &amp;lt;code&amp;gt;`-&amp;gt;`&amp;lt;/code&amp;gt; to intercept attempts to assign to a member, such as an assignment like&lt;br /&gt;
  inst -&amp;gt; val := newVal&lt;br /&gt;
&lt;br /&gt;
A struct instance is itself immutable, so such assignments are not generally valid, but using an override you can make it appear that a member is mutable. This could be useful, for example, when using a struct to wrap an object from a different programming language, or in a web service, where members can be assigned. The overload could send the change through an API, keeping a familiar assignment syntax.&lt;br /&gt;
&lt;br /&gt;
To add an overload that can also intercept member assignments (as well as reading member values), the member function should have this signature:&lt;br /&gt;
&lt;br /&gt;
 Function `-&amp;gt;`( Self : '''''YourStruct''''' atom ; member : Text atom ; defVal : optional named ; rhs : optional named )&lt;br /&gt;
&lt;br /&gt;
Inside the definition, use &amp;lt;code&amp;gt;IsNotSpecified(rhs)&amp;lt;/code&amp;gt; to determine whether it is a read or an assignment.&lt;br /&gt;
&lt;br /&gt;
== Assignment ==&lt;br /&gt;
Sometimes a button's [[OnClick]] expression assigns a result value to a global variable. When you do so, it sets the definition of the global variable to an expression that results in the same value when evaluated. It is also an expression that can be saved with a model file.&lt;br /&gt;
&lt;br /&gt;
In the case of a Struct, this means that the expression must be a call to the Struct's constructor with parameter values that result in a logically equivalent instance. &lt;br /&gt;
&lt;br /&gt;
In the cases where you have customized constructor logic that alters what member values are actually stored, if you want assignment (and saving to a model file) to work successfully, you need to include the custom member function:&lt;br /&gt;
&lt;br /&gt;
 Function ToExpression( Self : MyStruct atom )&lt;br /&gt;
&lt;br /&gt;
This can return the textual expression that results in an equivalent value, but in general, it can be difficult to get the textual expression correct. Hence, the recommended way to implement the function is to return an instance of the generic built-in &amp;lt;code&amp;gt;_Struct&amp;lt;/code&amp;gt; with member names that correspond to your constructor parameter names.&lt;br /&gt;
&lt;br /&gt;
===  Example ===&lt;br /&gt;
&lt;br /&gt;
This example uses the [[Mutables library]].&lt;br /&gt;
&lt;br /&gt;
 Struct S( x : nonMember )&lt;br /&gt;
 '''Definition: ''' Self-&amp;gt;mutable_val := Mutable(x)&lt;br /&gt;
 &amp;amp;nbsp;&lt;br /&gt;
 Function ToExpression( Self : S atom )&lt;br /&gt;
 '''Definition:''' _Struct( x: Self-&amp;gt;mutable_val-&amp;gt;val )&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;_Struct&amp;lt;/code&amp;gt; returned has the parameter name &amp;lt;/code&amp;gt;x, which matches the parameter name in &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt;'s constructor with the value that should appear in the call to the constructor.&lt;br /&gt;
&lt;br /&gt;
When you assign a value containing an instance of &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; to a global, the definition contains something like &amp;lt;code&amp;gt;S( 'Foo' )&amp;lt;/code&amp;gt; -- a valid call to the constructor.&lt;br /&gt;
&lt;br /&gt;
=== Repeated parameters ===&lt;br /&gt;
When your constructor has a repeated parameter, you need to set the &amp;lt;code&amp;gt;_Struct&amp;lt;/code&amp;gt; element to a list, where each item in the list corresponds to one argument passed to the parameter. If all of the items that should be passed to the repeated parameter have the same dimensionality and none are a scalar reference, then a list is fine.&lt;br /&gt;
&lt;br /&gt;
 Struct S2( people : ... Text atom nonMember )&lt;br /&gt;
 '''Definition:''' Self-&amp;gt;people_ids := PersonToId( people )&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
 Function ToExpression( Self : S2 atom )&lt;br /&gt;
 '''Definition:''' &lt;br /&gt;
      Local people := IdToPerson( Self-&amp;gt;people_ids );               { This is a list of text }&lt;br /&gt;
      _Struct( people : people )&lt;br /&gt;
&lt;br /&gt;
A more nuanced case occurs when the items to the repeated parameter may have different dimensionalities. In this case, you need to take the [[reference]] of each item in the list so that its dimensions don't combine with the indexes of its sibling elements.&lt;br /&gt;
&lt;br /&gt;
 Struct S3( items : ... nonMember )&lt;br /&gt;
 '''Definition:''' &lt;br /&gt;
      Self-&amp;gt;first := items[@=1];&lt;br /&gt;
      [[Local]] refd := ([[For]] xi := repeated items Do \xi); {refs to keep dims separate}&lt;br /&gt;
      Self-&amp;gt;rest := refd[@=2..[[Size]](items,listLen:true)]&lt;br /&gt;
 &amp;amp;nbsp;&lt;br /&gt;
 Function ToExpression( Self : S3 atom )&lt;br /&gt;
 '''Definition:'''  _Struct( items : [\Self-&amp;gt;first, ...Self-&amp;gt;rest ] )&lt;br /&gt;
&lt;br /&gt;
To keep the dimensionalities separate for each item is &amp;lt;code&amp;gt;Self-&amp;gt;Rest&amp;lt;/code&amp;gt;, the constructor takes the reference of each repeated item. In &amp;lt;code&amp;gt;ToExpression&amp;lt;/code&amp;gt;, these are already references so it simply forwards them into the list for «items».&lt;br /&gt;
&lt;br /&gt;
== Immutability ==&lt;br /&gt;
The &amp;lt;code&amp;gt;Self&amp;lt;/code&amp;gt; members can be altered from within the [[Struct]] constructor, but cannot be altered once the fully-constructed instance has been returned by the constructor. From that point on, the members of a struct instance are never changed.&lt;br /&gt;
&lt;br /&gt;
However, a struct can hold a [[Mutable]] or a [[Local_functions_and_local_value_captures#Local_value_capture|captured local]] which actually makes it possible for the internal state of an instance to be changed. The mutable or the local's identity never changes, and changes to this type of internal state does not result in any downstream invalidation.&lt;br /&gt;
&lt;br /&gt;
== Generic Struct ==&lt;br /&gt;
A built-in struct named &amp;lt;code&amp;gt;_Struct&amp;lt;/code&amp;gt; (with an underscore) can be used as a generic Struct that you can instantiate on arbitrary members without having to define your own Struct object. To instantiate, every parameter must be named, but can be whatever name you want, e.g.,&lt;br /&gt;
&lt;br /&gt;
 _Struct( date:Today(), name: 'Donald', address: '1600 Pennsylvania Avenue' )&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
Examples in this section demonstrate various aspects of a Struct and member functions.&lt;br /&gt;
&lt;br /&gt;
=== Tuple ===&lt;br /&gt;
A Tuple is a ordered list of items, each item having a different dimensionality. It can be implemented as a Struct.&lt;br /&gt;
&lt;br /&gt;
To create a tuple (after the Tuple Struct is defined), use:&lt;br /&gt;
 Tuple( x, y, z )&lt;br /&gt;
with any number of values. The values passed can have different dimensionalities. The collection is held in a single cell (if you have an array of Tuples), and the dimensionalities of the items are kept separate.&lt;br /&gt;
&lt;br /&gt;
 Struct Tuple( items : ... ;&lt;br /&gt;
               direct : hidden optional named boolean atom )&lt;br /&gt;
 '''Definition''':&lt;br /&gt;
    [[If]] direct [[Then]] (&lt;br /&gt;
        [[For]] xi:= repeated items Do &lt;br /&gt;
            [[If]] [[Not]] [[IsReference]](xi) then &lt;br /&gt;
                Error(&amp;quot;When using direct:True to Tuple, all «items» must be references&amp;quot;);&lt;br /&gt;
        Self-&amp;gt;items := items&lt;br /&gt;
    ) [[Else]] (&lt;br /&gt;
        Self-&amp;gt;items := ([[For]] xi := repeated items Do \xi)&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
 Function Tuple::Length( Self : Tuple atom )&lt;br /&gt;
 '''Definition''': &lt;br /&gt;
    [[Size]]( Self-&amp;gt;items, True )&lt;br /&gt;
&lt;br /&gt;
 Function Tuple::Expand ( Self : Tuple atom )&lt;br /&gt;
 '''Definition''':&lt;br /&gt;
    [[Local]] i:=f&amp;quot;[{1..[[size]](Self-&amp;gt;items)}]&amp;quot;;&lt;br /&gt;
    [[For]] ii:=@i do (&lt;br /&gt;
        [[Local]] xi := #(Self-&amp;gt;items[@=ii]);&lt;br /&gt;
        [[If]] [[Size]]([[IndexesOf]](xi))&amp;gt;0 then&lt;br /&gt;
            _HyperlinkedCellValue(xi)&lt;br /&gt;
        [[Else]]&lt;br /&gt;
             xi&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
 Function Tuple::`[]`(Self : Tuple atom ; m,n : optional number atom )&lt;br /&gt;
 '''Definition''':&lt;br /&gt;
    [[If]] [[IsNotSpecified]](n) Then &lt;br /&gt;
        #(Self-&amp;gt;items[@=m,defVal:Null])&lt;br /&gt;
    [[Else]] (&lt;br /&gt;
        [[If]] [[IsNotSpecified]](m) [[Then]] m := 1;&lt;br /&gt;
        [[If]] n&amp;gt;[[Size]](Self-&amp;gt;items) [[Then]] n := [[Size]](Self-&amp;gt;items);&lt;br /&gt;
        Tuple( ...Self-&amp;gt;items[@=m..n], direct:True )&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
 Function Tuple::TitleForExpand(Self : Tuple  atom ; subTitle : text atom ; memberNum :  optional  positive atom )&lt;br /&gt;
 '''Definition''':&lt;br /&gt;
    [[If]] [[IsNotSpecified]](memberNum) [[Then]]&lt;br /&gt;
        f&amp;quot;{subTitle}-&amp;gt;&amp;quot;&lt;br /&gt;
    [[Else]]&lt;br /&gt;
        f&amp;quot;{subTitle}-&amp;gt;[{memberNum:I}]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 Function Tuple::ToExpression( Self : Tuple atom )&lt;br /&gt;
 '''Definition''': _Struct( items: Self-&amp;gt;items )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Reference ===&lt;br /&gt;
This example demonstrates how a [[reference]] could be implemented using Struct if it weren't already built into the Analytica language. Note that the keywords Ref and Reference are already in use, so we need to pick a different name.&lt;br /&gt;
&lt;br /&gt;
 Struct _Ref( r : [I] ; I : optional ... index = common )&lt;br /&gt;
&lt;br /&gt;
 Function _Ref::`#`( Self : _Ref atom )&lt;br /&gt;
 '''Definition''': Self-&amp;gt;r&lt;br /&gt;
&lt;br /&gt;
 Function _Ref::Expand( Self : _Ref atom )&lt;br /&gt;
 '''Definition''': `#`(Self)&lt;br /&gt;
&lt;br /&gt;
 Function _Ref::TitleForExpand(Self : _Ref atom ; subTitle : text atom ; memberNum :  optional  positive atom )&lt;br /&gt;
 '''Definition''':&lt;br /&gt;
            f&amp;quot;#{subTitle}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Arrow operator]]&lt;br /&gt;
* [[Callable]]&lt;br /&gt;
* [[User-Defined Functions]]&lt;br /&gt;
* [[Function Parameter Qualifiers]]&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=Struct&amp;diff=63554</id>
		<title>Struct</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=Struct&amp;diff=63554"/>
		<updated>2025-12-14T20:57:15Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: /* Instantiating a value */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:Objects]]&lt;br /&gt;
[[category:Variables]]&lt;br /&gt;
''new to [[Analytica 7.0]]''&lt;br /&gt;
&lt;br /&gt;
Most programming languages have a way to bundle a set of disparate data into a packet, often called Records, Classes, or  Structs. In Analytica, you can do this using an array with an [[Index]], but this doesn't work so well if the values in the array are disparate, for example, if they include numbers, text, references to other data, or array values with different dimensions.  For example, if you want to create lists or hierarchies,  represent JSON data or html.  Thta's why Analytica has introduced Structs to represent these kinds of data structures. &lt;br /&gt;
&lt;br /&gt;
A struct instance can have multiple member fields,  which can be of varioust data types and dimensionality. For example, a struct could have a scalar member, a 1-D member and a 2-D member, where the dimensions of the members are unrelated. Each struct value is treated as an atomic element, and it does not apply Array abstraction within the Struct.&lt;br /&gt;
&lt;br /&gt;
== Struct class ==&lt;br /&gt;
&lt;br /&gt;
A [[Struct]] object defines a new atomic data type.  It appears on a diagram with a shape that resembles a function, but with flat midsections on both the left and right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[image:MyDtype_Struct.png]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After you define a [[Struct]], you can create instances of it. Instances are ''atomic'' and ''immutable'': ''Atomic''meaning that [[Array Abstraction]] treats it as a single cell -- even though it may have multiple elements.''Immutable'' meaning that, it cannot be destructively altered after it's been created.&lt;br /&gt;
&lt;br /&gt;
A [[Struct]] is an [[Objects and Values|Object]]. An instance of a struct is a [[Objects and Values|Value]].&lt;br /&gt;
&lt;br /&gt;
== When to use a Struct ==&lt;br /&gt;
&lt;br /&gt;
These are examples of when a Struct may be convenient:&lt;br /&gt;
* To represent hierarchical data, such as from html or JSON.&lt;br /&gt;
&lt;br /&gt;
* If you want your data type to be an opaque atomic unit with multiple internal items. &lt;br /&gt;
&lt;br /&gt;
* To [[Returning multiple values|return multiple return values]] with varying dimensions as an alternative to capturing multiple return values.&lt;br /&gt;
&lt;br /&gt;
* To pass complex data structures among user-defined functions.&lt;br /&gt;
&lt;br /&gt;
* To enforce a distinction that does not exist in Analytica, but is used in another platform or service that you are integrating with.&lt;br /&gt;
&lt;br /&gt;
== Defining a Struct ==&lt;br /&gt;
To define a [[Struct]], you can first create a [[UDF|user function]] object by draggin the functio node from the [[Create and edit nodes|object Toolbar]]). Then change its class to &amp;lt;code&amp;gt;Struct&amp;lt;/code&amp;gt; in its [[Object window]] or [[Attribute window]].&lt;br /&gt;
&lt;br /&gt;
A Struct uses the [[Parameters]] attribute with the same [[Function Parameter Qualifiers]] as a [[User-Defined Function]] (UDF), for example:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;Struct MyDtype( a : atom ; b : Text [I] ; c: Number[J] )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This Struct has three members -- &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; with any atomic data type, &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, which is text and may be an array of texts with index &amp;lt;code&amp;gt;I&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;, which must be a numberand may have index &amp;lt;code&amp;gt;J&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
The default [[Definition]] of a Struct is &amp;lt;code&amp;gt;Self&amp;lt;/code&amp;gt;.  Sometimes you may specify a more specialized definition -- see [[#Constructor customization]] below.&lt;br /&gt;
&lt;br /&gt;
== Instantiating a value ==&lt;br /&gt;
&lt;br /&gt;
To create an instance of a Struct, you simply call the name of your struct as if it were a function from within an expression. In the previous example, that might be:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;MyDtype( Category, Category_aliases, Category_IDs )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If any value passed to a constructor parameter has extra indexes (dimensions), i.e. other than those specified in each paramter, [[Array Abstraction]] kicks in and creates an array of struct instances over those extra indexes.&lt;br /&gt;
&lt;br /&gt;
== Accessing member values ==&lt;br /&gt;
Use the [[Arrow operator]] to access a member values of a Struct. E.g.,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;inst -&amp;gt; b&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where &amp;lt;code&amp;gt;inst&amp;lt;/code&amp;gt; was obtained by calling the Struct.&lt;br /&gt;
&lt;br /&gt;
The left-hand side of the arrow can be a single instance, an array of instances, or even [[Null]].  The right-hand side of the arrow is the name of a member value.&lt;br /&gt;
&lt;br /&gt;
== Member functions ==&lt;br /&gt;
&lt;br /&gt;
You can introduce your own ''member functions'' that are called using the syntax:&lt;br /&gt;
:&amp;lt;code&amp;gt;inst -&amp;gt; F(x, y)&amp;lt;/code&amp;gt;&lt;br /&gt;
The parameters are limited to be passed by values (e.g., no Index parameters). Keep in mind that the instance is immutable so these functions can't usually modify the internal state of the instance (see Section [[#Immutability]] for exceptions).&lt;br /&gt;
&lt;br /&gt;
To create your own ''member function'', open up  the [[Struct]]'s diagram (as you would open up the diagram of a Module node) and drag a Function object to the diagram. In its [[Object window]], set the parameters ensuring that the first parameter is declared as, e.g., &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;Function F( Self : MyDtype atom ; param1  ; param2 )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first parameter should be named &amp;lt;code&amp;gt;Self&amp;lt;/code&amp;gt; and should have the Struct  name as its data type and the [[Objects and Values|atom]] qualifier. You can have zero or more additional parameters -- these are the ones passed to the function when it is called using the syntax &amp;lt;code&amp;gt;inst &amp;amp;rarr; F(x,y)&amp;lt;/code&amp;gt;. These parameters can have any data type qualifier, dimensionality declaration; however,  for now they cannot handle [[Function_parameter_qualifiers#Evaluation_Mode_Qualifiers|evaluation mode qualifiers]] or [[Function_parameter_qualifiers#Object_Class_Qualifiers|Object class qualifiers]].&lt;br /&gt;
&lt;br /&gt;
You can also introduce global variables that are &amp;quot;private&amp;quot; to the Struct and its member functions by adding normal variable nodes to the diagram. Note that these are contained in the Struct definition, not in each instance (to have a value that varies with each instance, you must use a member value.&lt;br /&gt;
&lt;br /&gt;
== Constructor customization ==&lt;br /&gt;
The member values of an instance are usually the parameter names that appear in the [[Parameter]] attribute of the struct (its Constructor's parameter names). However, in some use cases the constructor may change the member values, such as by adding new members, transforming the named members, or even removing members. These changes must be performed in the [[Definition]] of the constructor.&lt;br /&gt;
&lt;br /&gt;
When you first view the [[Object window]] of a [[Struct]], the [[Definition]] might not be visible (because altering the member values is somewhat esoteric). If you don't see it, use the [[Object_Window#Selecting_Attributes_to_Display|Attribute visibility popup]] to make it visible.&lt;br /&gt;
&lt;br /&gt;
Inside the constructor (and only in the constructor) the members can be assigned.  For example:&lt;br /&gt;
&lt;br /&gt;
 [[Struct]] MyDType( a : atom ; b : Text [I] ; c : Number [J] )&lt;br /&gt;
 '''Definition''': &lt;br /&gt;
        Self -&amp;gt; creationTime := [[Today]](true);&lt;br /&gt;
        Self -&amp;gt; c := c / [[Sum]](C,  J);&lt;br /&gt;
        Self&lt;br /&gt;
&lt;br /&gt;
The final value is always &amp;lt;code&amp;gt;Self&amp;lt;/code&amp;gt; whether or not your Definition actually returns &amp;lt;code&amp;gt;Self&amp;lt;/code&amp;gt;, although it is clearer to do. Notice that in this example, it adds a new member value, &amp;lt;code&amp;gt;creationTime&amp;lt;/code&amp;gt;, and changes the member value &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; to the normalized value.&lt;br /&gt;
&lt;br /&gt;
When you change the member values in the constructor, you should consider whether you will ever assign values of your Struct to a definition or other expression attribute, or whether instances will even need to be saved directly in the model file. These cases require a text representation that is valid expression and which results in an equivalent instance. In the event that you alter the members, you may need to add a custom [[#ExpressionText]] member function that prints out a constructor call expression.&lt;br /&gt;
&lt;br /&gt;
== Using an excess parameter in the constructor ==&lt;br /&gt;
&lt;br /&gt;
An ''excess parameter'' is a catch-all parameter that allows the caller to include named parameters that aren't listed in the parameters. It can be either named or unnamed.&lt;br /&gt;
&lt;br /&gt;
The constructor has an unnamed excess parameter when the last parameter is named &amp;lt;code&amp;gt;&amp;quot;...&amp;quot;&amp;lt;/code&amp;gt;. For example,&lt;br /&gt;
&lt;br /&gt;
 [[Struct]] MyDType2( a : atom ; b : Text[I] ; ... )&lt;br /&gt;
&lt;br /&gt;
When declared in this fashion, a caller can specify parameters other than &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, for example:&lt;br /&gt;
&lt;br /&gt;
 MyDType2( a:5, b:f&amp;quot;I={I}&amp;quot;, c:14, d:=J^2 )&lt;br /&gt;
&lt;br /&gt;
When an unnamed excess parameter is used in this way, the additional parameters are automatically added as members. Hence, in this example, &amp;lt;code&amp;gt;MyDType2&amp;lt;/code&amp;gt; has members &amp;lt;code&amp;gt;['a', 'b', 'c', 'd']&amp;lt;/code&amp;gt;. Because the excess parameter is unnamed, there is no way to refer to it in the constructor's definition. &lt;br /&gt;
&lt;br /&gt;
To specify that the excess parameters not be added to the struct instance, you can use&lt;br /&gt;
 [[Struct]] MyDType3( a : atom ; b : Text[I] ; ... : nonMember )&lt;br /&gt;
&lt;br /&gt;
A ''named excess parameter'' is declared using a named that starts with &amp;lt;code&amp;gt;&amp;quot;...&amp;quot;&amp;lt;/code&amp;gt;, which again must be the last parameter in the declaration. For example,&lt;br /&gt;
&lt;br /&gt;
 [[Struct]] MyDType3( a : atom ; b : Text[I] ; ...kw )&lt;br /&gt;
&lt;br /&gt;
Inside the constructor's definition, it can now refer to the local variable &amp;lt;code&amp;gt;kw&amp;lt;/code&amp;gt;. The value of &amp;lt;code&amp;gt;kw&amp;lt;/code&amp;gt; is itself a struct instance where each argument is a member. For example, when called as&lt;br /&gt;
 MyDType3( a:5, b:f&amp;quot;{I}&amp;quot;, y:43, z:'hello' )&lt;br /&gt;
The Definition of MyDType3 could reference &amp;lt;code&amp;gt;kw-&amp;gt;y&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;kw-&amp;gt;z&amp;lt;/code&amp;gt; when called in this example; however, those would fail with an error when &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;z&amp;lt;/code&amp;gt; is not specified.&lt;br /&gt;
&lt;br /&gt;
== Equality and comparison ==&lt;br /&gt;
&lt;br /&gt;
Two struct instances are equal (i.e., &amp;lt;code&amp;gt;s1=s2&amp;lt;/code&amp;gt; is true) only when they are of the same Struct, have the same member names and have the same  member values. In other words, &amp;lt;code&amp;gt;s1=s2&amp;lt;/code&amp;gt; is based on &amp;quot;deep equality&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Shallow equality tests whether two instances are the exact same instance (as opposed to whether the two instances are equal). The following can be used to test whether two instances are the exact same instance:&lt;br /&gt;
:&amp;lt;code&amp;gt;s1-&amp;gt;_addr = s2-&amp;gt;_addr&amp;lt;/code&amp;gt;&lt;br /&gt;
The special &amp;lt;code&amp;gt;_addr&amp;lt;/code&amp;gt; member value returns an integer that is unique to each instance.&lt;br /&gt;
&lt;br /&gt;
Inequality comparisons are also based on the &amp;quot;deep&amp;quot; member values, based on the internal member value ordering.&lt;br /&gt;
&lt;br /&gt;
== Basic properties about an instance ==&lt;br /&gt;
&lt;br /&gt;
You can get a list of the member value names using:&lt;br /&gt;
:&amp;lt;code&amp;gt;inst -&amp;gt; _members&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can test whether it has a given member using:&lt;br /&gt;
:&amp;lt;code&amp;gt;inst -&amp;gt; Has('name')&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you have the name of a member value as text in a variable memberName, you can access its value using:&lt;br /&gt;
:&amp;lt;code&amp;gt;`-&amp;gt;`( inst, memberName )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With this syntax, you can also specify a default value to use when the instance does not have the specified name by specifying the optional «defVal» parameter:&lt;br /&gt;
:&amp;lt;code&amp;gt;`-&amp;gt;`( inst, memberName, defVal: Null )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that it wouldn't work to write &amp;lt;code&amp;gt;inst -&amp;gt; memberName&amp;lt;/code&amp;gt; because that would look for a member value named &amp;quot;memberName&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
You can get a handle to the instance's Struct object using&lt;br /&gt;
:&amp;lt;code&amp;gt;inst -&amp;gt; _type&amp;lt;/code&amp;gt;&lt;br /&gt;
You can get the name of the Struct (without a [[Namespaces|namespace]] prefix) from &amp;lt;code&amp;gt;[[TypeOf]](inst)&amp;lt;/code&amp;gt;. You can detect that an atom is a struct instance using&lt;br /&gt;
:&amp;lt;code&amp;gt;[[TypeOf]]( inst, shallow:true ) = &amp;quot;Struct&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Special member functions ==&lt;br /&gt;
&lt;br /&gt;
You can customize the behavior of your struct instances by adding special member functions (with reserved member function names). You add these as you would your own member functions to your Struct's diagram using the reserved name. Your implementation must match the required parameters for the special function.&lt;br /&gt;
&lt;br /&gt;
=== Customizing how a value is printed ===&lt;br /&gt;
My default, an instance of your Struct will display in a result table cell or in the [[Typescript window|Typescript console]] as, e.g., &amp;lt;code&amp;gt;«YourStructName»&amp;lt;/code&amp;gt;. You can customize this by adding a member function named &amp;lt;code&amp;gt;DisplayName&amp;lt;/code&amp;gt;. E.g., &lt;br /&gt;
&lt;br /&gt;
 Function DisplayName( Self : MyDtype atom )&lt;br /&gt;
 '''Definition''': f&amp;quot;«{[[TypeOf]](Self)} a={Self-&amp;gt;a}»&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Because &amp;lt;code&amp;gt;DisplayName&amp;lt;/code&amp;gt; occurs while individual cells are drawing on the screen, errors that occur while it is evaluating are not displayed. If an error occurs, it will silently fall back to the default display name.&lt;br /&gt;
&lt;br /&gt;
When your instance is &amp;quot;printed&amp;quot; to an expression (e.g., as a result of an assignment),  you need to ensure that the text is a valid expression that creates a logically equivalent instance. This happens by default unless you alter the members in your constructor (see [[#Constructor customization]] above). To control this, add a member function name &amp;lt;code&amp;gt;ExpressionText(Self)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Value expansion (in a result table) ===&lt;br /&gt;
When a struct instance appears in the cell of a result table, it appears as a hyperlink. Double clicking on it expands the value. By default, it expands into the member values. You can change this by adding a member function named  &amp;lt;code&amp;gt;Expand(Self)&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Your expansion code cannot simply create an array of your member values (assuming they have different dimensionalities) since this would combine their dimensions.  Instead, you should wrap each non-atomic value in &amp;lt;code&amp;gt;_HyperlinkedCellvalue&amp;lt;/code&amp;gt;. For example:&lt;br /&gt;
&lt;br /&gt;
 Function Expand( Self )&lt;br /&gt;
 '''Definition''': [ 'a' : Self-&amp;gt;a, &lt;br /&gt;
               'b' : _HyperlinkedCellValue( Self-&amp;gt;b ), &lt;br /&gt;
               'c' : _HyperlinkedCellValue( Self-&amp;gt;c ) ]&lt;br /&gt;
&lt;br /&gt;
You can also introduce a local index for the expansion.&lt;br /&gt;
&lt;br /&gt;
After it expands, the result table displays a title showing the current &amp;quot;path&amp;quot; to the result view. Ideally this title is also a valid expression that produces the same result. When you customize the expansion, you may also need to customize the expansion title. You can do this by adding a member function&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;Function TitleForExpand(Self : Tuple  atom ; subTitle : text atom ; memberNum :  optional  positive atom )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The «subTitle» is the title up to the point of this expansion, and «memberNum» exposes which cell number was expanded from the previous level.&lt;br /&gt;
&lt;br /&gt;
=== Finalizers ===&lt;br /&gt;
&lt;br /&gt;
A finalizer is a member function that is called when the struct instance value is released for last time.&lt;br /&gt;
&lt;br /&gt;
You can add a customized finalizer, for example, to ensure that a resource gets cleaned up. An example use case would be when your [[Struct]] is a temporary file, with the finalizer ensuring that the temporary file is deleted when the instance is released. This is an example where the constructor would pick a unique file name that doesn't already exist, and the finalizer calls [[FileSystemDelete]]. &lt;br /&gt;
&lt;br /&gt;
To add a finalizer, add a member function named &amp;lt;code&amp;gt;Finalizer(Self)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Finalizers should have a low probability of an error occurring while the finalizer is evaluating. In the event that an error occurs, it is not possible for Analytica to report the error, so the error will occur silently. If you do not catch it (in a [[Try]]), your full finalizer code might not run.&lt;br /&gt;
&lt;br /&gt;
=== Callable values ===&lt;br /&gt;
&lt;br /&gt;
You can make an instance of your Struct &amp;quot;''callable''&amp;quot;, such that you can call the instance using e.g.,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;inst -&amp;gt; ( x, y )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To make it callable, create a member function named &amp;lt;code&amp;gt;`()`&amp;lt;/code&amp;gt; -- make sure to include the backtics as part of the name, and no spaces between the parens. For example:&lt;br /&gt;
&lt;br /&gt;
 Function `()`( alpha, pwr )&lt;br /&gt;
 '''Definition''': (1-alpha) * Self-&amp;gt;a + alpha * [[Sum]]( b^pwr, I )&lt;br /&gt;
&lt;br /&gt;
If you do this, you can also use a [[Callable]]  object class to hold your instance (or an array of instances) and then call it using the name of your callable as if it were a normal function (even though the logical function itself is computed), e.g.,&lt;br /&gt;
&lt;br /&gt;
:[[Callable]] F1 := MyDType( x,y,z )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And call it:&lt;br /&gt;
:&amp;lt;code&amp;gt;F1(0.3, 2) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Custom atomic subscripting ===&lt;br /&gt;
Your data type can support the syntax&lt;br /&gt;
:&amp;lt;code&amp;gt;inst -&amp;gt; [n]&amp;lt;/code&amp;gt;&lt;br /&gt;
by adding a member function named &amp;lt;code&amp;gt;`[]`&amp;lt;/code&amp;gt;. It can have either one or two parameters (after &amp;lt;code&amp;gt;Self&amp;lt;/code&amp;gt;). With one parameter, only &amp;lt;code&amp;gt;inst -&amp;gt; [n]&amp;lt;/code&amp;gt; is supported (so that &amp;lt;code&amp;gt;inst -&amp;gt; [m..n]&amp;lt;/code&amp;gt; would array abstract returning a list). With two parameters, where the second parameter is optional, it can include special handling of &amp;lt;code&amp;gt;inst -&amp;gt; [m..n]&amp;lt;/code&amp;gt;, for example by returning a new collection instance of the same type. &lt;br /&gt;
&lt;br /&gt;
 Function `[]`( Self : Tuple atom ; m,n : optional number atom )&lt;br /&gt;
&lt;br /&gt;
In this example, if &amp;lt;code&amp;gt;inst -&amp;gt; [m]&amp;lt;/code&amp;gt; is called, then the «n» parameter is omitted. If &amp;lt;code&amp;gt;inst -&amp;gt; [m..n]&amp;lt;/code&amp;gt; is called, both parameters are provided. If &amp;lt;code&amp;gt;inst -&amp;gt; [m..]&amp;lt;/code&amp;gt; is called, then «n» is [[INF]]. And if &amp;lt;code&amp;gt;inst-&amp;gt;[..n]&amp;lt;/code&amp;gt; is called, then «m» is omitted.&lt;br /&gt;
&lt;br /&gt;
=== Operator overloading ===&lt;br /&gt;
&lt;br /&gt;
At present, only these operators can be overloaded by adding a member function with the given name.&lt;br /&gt;
&lt;br /&gt;
* Function `#`( Self )&lt;br /&gt;
&lt;br /&gt;
=== Overloading the &amp;lt;code&amp;gt;`-&amp;gt;`&amp;lt;/code&amp;gt; operator ===&lt;br /&gt;
&lt;br /&gt;
It is possible to overload the right-arrow operator for a Struct, intercepting attempts to read a member value or to set  a member value. &lt;br /&gt;
&lt;br /&gt;
If you only want to intercept attempts to read member values, add the following member function in your struct:&lt;br /&gt;
 Function `-&amp;gt;`( Self : '''''YourStruct''''' atom ; member : Text atom ; defVal : optional named )&lt;br /&gt;
By sure to change '''''YourStruct''''' to the actual name of your struct. This will be called when code evaluates&lt;br /&gt;
:&amp;lt;code&amp;gt;inst -&amp;gt; member&amp;lt;/code&amp;gt;&lt;br /&gt;
on an instance &amp;lt;code&amp;gt;inst&amp;lt;/code&amp;gt; of your struct. Your function can return values for members that don't actually exist, or deny members that might exist, or just intercept the read and then forward it in the usual way. &lt;br /&gt;
&lt;br /&gt;
Exceptions: Member functions with names beginning with an underscore are never intercepted (such as the special &amp;lt;code&amp;gt;inst-&amp;gt;_members&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;inst-&amp;gt;_type&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;inst-&amp;gt;_addr&amp;lt;/code&amp;gt; virtual members).  Also, calls to member local functions or member functions are never intercepted -- this intercepts member value access only.&lt;br /&gt;
&lt;br /&gt;
Your implementation of the overload will often want to access the actual members of the class. It must not use the usual arrow operator for this because that would result in an infinite recursion.  Instead, you can use the raw member access function, &amp;lt;code&amp;gt;`-&amp;gt;!`&amp;lt;/code&amp;gt;, which behaves the same same as &amp;lt;code&amp;gt;`-&amp;gt;`&amp;lt;/code&amp;gt; except that it cannot be overridden. This function can only be called using a function call syntax, it cannot be used as an infix operator. &lt;br /&gt;
&lt;br /&gt;
Here is a contrived example that makes is look like the file contents is a member value. (It would be better to just add a member function for this, but it makes for an easy example).&lt;br /&gt;
&lt;br /&gt;
 Struct TextFile( filename : Text atom )&lt;br /&gt;
 &lt;br /&gt;
 Function TextFile::`-&amp;gt;`( Self : TextFile atom ; member : Text atom ; defVal : optional named )&lt;br /&gt;
 '''Definition''':&lt;br /&gt;
 [[If]] TextLowerCase(member) = &amp;quot;contents&amp;quot; Then &lt;br /&gt;
   [[ReadTextFile]](filename)&lt;br /&gt;
 [[Else]]&lt;br /&gt;
   `-&amp;gt;!`( Self, member, defVal:defVal )&lt;br /&gt;
&lt;br /&gt;
You can also use an override of &amp;lt;code&amp;gt;`-&amp;gt;`&amp;lt;/code&amp;gt; to intercept attempts to assign to a member, such as an assignment like&lt;br /&gt;
  inst -&amp;gt; val := newVal&lt;br /&gt;
&lt;br /&gt;
A struct instance is itself immutable, so such assignments are not generally valid, but using an override you can make it appear that a member is mutable. This could be useful, for example, when using a struct to wrap an object from a different programming language, or in a web service, where members can be assigned. The overload could send the change through an API, keeping a familiar assignment syntax.&lt;br /&gt;
&lt;br /&gt;
To add an overload that can also intercept member assignments (as well as reading member values), the member function should have this signature:&lt;br /&gt;
&lt;br /&gt;
 Function `-&amp;gt;`( Self : '''''YourStruct''''' atom ; member : Text atom ; defVal : optional named ; rhs : optional named )&lt;br /&gt;
&lt;br /&gt;
Inside the definition, use &amp;lt;code&amp;gt;IsNotSpecified(rhs)&amp;lt;/code&amp;gt; to determine whether it is a read or an assignment.&lt;br /&gt;
&lt;br /&gt;
== Assignment ==&lt;br /&gt;
Sometimes a button's [[OnClick]] expression assigns a result value to a global variable. When you do so, it sets the definition of the global variable to an expression that results in the same value when evaluated. It is also an expression that can be saved with a model file.&lt;br /&gt;
&lt;br /&gt;
In the case of a Struct, this means that the expression must be a call to the Struct's constructor with parameter values that result in a logically equivalent instance. &lt;br /&gt;
&lt;br /&gt;
In the cases where you have customized constructor logic that alters what member values are actually stored, if you want assignment (and saving to a model file) to work successfully, you need to include the custom member function:&lt;br /&gt;
&lt;br /&gt;
 Function ToExpression( Self : MyStruct atom )&lt;br /&gt;
&lt;br /&gt;
This can return the textual expression that results in an equivalent value, but in general, it can be difficult to get the textual expression correct. Hence, the recommended way to implement the function is to return an instance of the generic built-in &amp;lt;code&amp;gt;_Struct&amp;lt;/code&amp;gt; with member names that correspond to your constructor parameter names.&lt;br /&gt;
&lt;br /&gt;
===  Example ===&lt;br /&gt;
&lt;br /&gt;
This example uses the [[Mutables library]].&lt;br /&gt;
&lt;br /&gt;
 Struct S( x : nonMember )&lt;br /&gt;
 '''Definition: ''' Self-&amp;gt;mutable_val := Mutable(x)&lt;br /&gt;
 &amp;amp;nbsp;&lt;br /&gt;
 Function ToExpression( Self : S atom )&lt;br /&gt;
 '''Definition:''' _Struct( x: Self-&amp;gt;mutable_val-&amp;gt;val )&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;_Struct&amp;lt;/code&amp;gt; returned has the parameter name &amp;lt;/code&amp;gt;x, which matches the parameter name in &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt;'s constructor with the value that should appear in the call to the constructor.&lt;br /&gt;
&lt;br /&gt;
When you assign a value containing an instance of &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; to a global, the definition contains something like &amp;lt;code&amp;gt;S( 'Foo' )&amp;lt;/code&amp;gt; -- a valid call to the constructor.&lt;br /&gt;
&lt;br /&gt;
=== Repeated parameters ===&lt;br /&gt;
When your constructor has a repeated parameter, you need to set the &amp;lt;code&amp;gt;_Struct&amp;lt;/code&amp;gt; element to a list, where each item in the list corresponds to one argument passed to the parameter. If all of the items that should be passed to the repeated parameter have the same dimensionality and none are a scalar reference, then a list is fine.&lt;br /&gt;
&lt;br /&gt;
 Struct S2( people : ... Text atom nonMember )&lt;br /&gt;
 '''Definition:''' Self-&amp;gt;people_ids := PersonToId( people )&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
 Function ToExpression( Self : S2 atom )&lt;br /&gt;
 '''Definition:''' &lt;br /&gt;
      Local people := IdToPerson( Self-&amp;gt;people_ids );               { This is a list of text }&lt;br /&gt;
      _Struct( people : people )&lt;br /&gt;
&lt;br /&gt;
A more nuanced case occurs when the items to the repeated parameter may have different dimensionalities. In this case, you need to take the [[reference]] of each item in the list so that its dimensions don't combine with the indexes of its sibling elements.&lt;br /&gt;
&lt;br /&gt;
 Struct S3( items : ... nonMember )&lt;br /&gt;
 '''Definition:''' &lt;br /&gt;
      Self-&amp;gt;first := items[@=1];&lt;br /&gt;
      [[Local]] refd := ([[For]] xi := repeated items Do \xi); {refs to keep dims separate}&lt;br /&gt;
      Self-&amp;gt;rest := refd[@=2..[[Size]](items,listLen:true)]&lt;br /&gt;
 &amp;amp;nbsp;&lt;br /&gt;
 Function ToExpression( Self : S3 atom )&lt;br /&gt;
 '''Definition:'''  _Struct( items : [\Self-&amp;gt;first, ...Self-&amp;gt;rest ] )&lt;br /&gt;
&lt;br /&gt;
To keep the dimensionalities separate for each item is &amp;lt;code&amp;gt;Self-&amp;gt;Rest&amp;lt;/code&amp;gt;, the constructor takes the reference of each repeated item. In &amp;lt;code&amp;gt;ToExpression&amp;lt;/code&amp;gt;, these are already references so it simply forwards them into the list for «items».&lt;br /&gt;
&lt;br /&gt;
== Immutability ==&lt;br /&gt;
The &amp;lt;code&amp;gt;Self&amp;lt;/code&amp;gt; members can be altered from within the [[Struct]] constructor, but cannot be altered once the fully-constructed instance has been returned by the constructor. From that point on, the members of a struct instance are never changed.&lt;br /&gt;
&lt;br /&gt;
However, a struct can hold a [[Mutable]] or a [[Local_functions_and_local_value_captures#Local_value_capture|captured local]] which actually makes it possible for the internal state of an instance to be changed. The mutable or the local's identity never changes, and changes to this type of internal state does not result in any downstream invalidation.&lt;br /&gt;
&lt;br /&gt;
== Generic Struct ==&lt;br /&gt;
A built-in struct named &amp;lt;code&amp;gt;_Struct&amp;lt;/code&amp;gt; (with an underscore) can be used as a generic Struct that you can instantiate on arbitrary members without having to define your own Struct object. To instantiate, every parameter must be named, but can be whatever name you want, e.g.,&lt;br /&gt;
&lt;br /&gt;
 _Struct( date:Today(), name: 'Donald', address: '1600 Pennsylvania Avenue' )&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
Examples in this section demonstrate various aspects of a Struct and member functions.&lt;br /&gt;
&lt;br /&gt;
=== Tuple ===&lt;br /&gt;
A Tuple is a ordered list of items, each item having a different dimensionality. It can be implemented as a Struct.&lt;br /&gt;
&lt;br /&gt;
To create a tuple (after the Tuple Struct is defined), use:&lt;br /&gt;
 Tuple( x, y, z )&lt;br /&gt;
with any number of values. The values passed can have different dimensionalities. The collection is held in a single cell (if you have an array of Tuples), and the dimensionalities of the items are kept separate.&lt;br /&gt;
&lt;br /&gt;
 Struct Tuple( items : ... ;&lt;br /&gt;
               direct : hidden optional named boolean atom )&lt;br /&gt;
 '''Definition''':&lt;br /&gt;
    [[If]] direct [[Then]] (&lt;br /&gt;
        [[For]] xi:= repeated items Do &lt;br /&gt;
            [[If]] [[Not]] [[IsReference]](xi) then &lt;br /&gt;
                Error(&amp;quot;When using direct:True to Tuple, all «items» must be references&amp;quot;);&lt;br /&gt;
        Self-&amp;gt;items := items&lt;br /&gt;
    ) [[Else]] (&lt;br /&gt;
        Self-&amp;gt;items := ([[For]] xi := repeated items Do \xi)&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
 Function Tuple::Length( Self : Tuple atom )&lt;br /&gt;
 '''Definition''': &lt;br /&gt;
    [[Size]]( Self-&amp;gt;items, True )&lt;br /&gt;
&lt;br /&gt;
 Function Tuple::Expand ( Self : Tuple atom )&lt;br /&gt;
 '''Definition''':&lt;br /&gt;
    [[Local]] i:=f&amp;quot;[{1..[[size]](Self-&amp;gt;items)}]&amp;quot;;&lt;br /&gt;
    [[For]] ii:=@i do (&lt;br /&gt;
        [[Local]] xi := #(Self-&amp;gt;items[@=ii]);&lt;br /&gt;
        [[If]] [[Size]]([[IndexesOf]](xi))&amp;gt;0 then&lt;br /&gt;
            _HyperlinkedCellValue(xi)&lt;br /&gt;
        [[Else]]&lt;br /&gt;
             xi&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
 Function Tuple::`[]`(Self : Tuple atom ; m,n : optional number atom )&lt;br /&gt;
 '''Definition''':&lt;br /&gt;
    [[If]] [[IsNotSpecified]](n) Then &lt;br /&gt;
        #(Self-&amp;gt;items[@=m,defVal:Null])&lt;br /&gt;
    [[Else]] (&lt;br /&gt;
        [[If]] [[IsNotSpecified]](m) [[Then]] m := 1;&lt;br /&gt;
        [[If]] n&amp;gt;[[Size]](Self-&amp;gt;items) [[Then]] n := [[Size]](Self-&amp;gt;items);&lt;br /&gt;
        Tuple( ...Self-&amp;gt;items[@=m..n], direct:True )&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
 Function Tuple::TitleForExpand(Self : Tuple  atom ; subTitle : text atom ; memberNum :  optional  positive atom )&lt;br /&gt;
 '''Definition''':&lt;br /&gt;
    [[If]] [[IsNotSpecified]](memberNum) [[Then]]&lt;br /&gt;
        f&amp;quot;{subTitle}-&amp;gt;&amp;quot;&lt;br /&gt;
    [[Else]]&lt;br /&gt;
        f&amp;quot;{subTitle}-&amp;gt;[{memberNum:I}]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 Function Tuple::ToExpression( Self : Tuple atom )&lt;br /&gt;
 '''Definition''': _Struct( items: Self-&amp;gt;items )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Reference ===&lt;br /&gt;
This example demonstrates how a [[reference]] could be implemented using Struct if it weren't already built into the Analytica language. Note that the keywords Ref and Reference are already in use, so we need to pick a different name.&lt;br /&gt;
&lt;br /&gt;
 Struct _Ref( r : [I] ; I : optional ... index = common )&lt;br /&gt;
&lt;br /&gt;
 Function _Ref::`#`( Self : _Ref atom )&lt;br /&gt;
 '''Definition''': Self-&amp;gt;r&lt;br /&gt;
&lt;br /&gt;
 Function _Ref::Expand( Self : _Ref atom )&lt;br /&gt;
 '''Definition''': `#`(Self)&lt;br /&gt;
&lt;br /&gt;
 Function _Ref::TitleForExpand(Self : _Ref atom ; subTitle : text atom ; memberNum :  optional  positive atom )&lt;br /&gt;
 '''Definition''':&lt;br /&gt;
            f&amp;quot;#{subTitle}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Arrow operator]]&lt;br /&gt;
* [[Callable]]&lt;br /&gt;
* [[User-Defined Functions]]&lt;br /&gt;
* [[Function Parameter Qualifiers]]&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=Struct&amp;diff=63553</id>
		<title>Struct</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=Struct&amp;diff=63553"/>
		<updated>2025-12-14T20:55:49Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: /* Defining a Struct */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:Objects]]&lt;br /&gt;
[[category:Variables]]&lt;br /&gt;
''new to [[Analytica 7.0]]''&lt;br /&gt;
&lt;br /&gt;
Most programming languages have a way to bundle a set of disparate data into a packet, often called Records, Classes, or  Structs. In Analytica, you can do this using an array with an [[Index]], but this doesn't work so well if the values in the array are disparate, for example, if they include numbers, text, references to other data, or array values with different dimensions.  For example, if you want to create lists or hierarchies,  represent JSON data or html.  Thta's why Analytica has introduced Structs to represent these kinds of data structures. &lt;br /&gt;
&lt;br /&gt;
A struct instance can have multiple member fields,  which can be of varioust data types and dimensionality. For example, a struct could have a scalar member, a 1-D member and a 2-D member, where the dimensions of the members are unrelated. Each struct value is treated as an atomic element, and it does not apply Array abstraction within the Struct.&lt;br /&gt;
&lt;br /&gt;
== Struct class ==&lt;br /&gt;
&lt;br /&gt;
A [[Struct]] object defines a new atomic data type.  It appears on a diagram with a shape that resembles a function, but with flat midsections on both the left and right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[image:MyDtype_Struct.png]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After you define a [[Struct]], you can create instances of it. Instances are ''atomic'' and ''immutable'': ''Atomic''meaning that [[Array Abstraction]] treats it as a single cell -- even though it may have multiple elements.''Immutable'' meaning that, it cannot be destructively altered after it's been created.&lt;br /&gt;
&lt;br /&gt;
A [[Struct]] is an [[Objects and Values|Object]]. An instance of a struct is a [[Objects and Values|Value]].&lt;br /&gt;
&lt;br /&gt;
== When to use a Struct ==&lt;br /&gt;
&lt;br /&gt;
These are examples of when a Struct may be convenient:&lt;br /&gt;
* To represent hierarchical data, such as from html or JSON.&lt;br /&gt;
&lt;br /&gt;
* If you want your data type to be an opaque atomic unit with multiple internal items. &lt;br /&gt;
&lt;br /&gt;
* To [[Returning multiple values|return multiple return values]] with varying dimensions as an alternative to capturing multiple return values.&lt;br /&gt;
&lt;br /&gt;
* To pass complex data structures among user-defined functions.&lt;br /&gt;
&lt;br /&gt;
* To enforce a distinction that does not exist in Analytica, but is used in another platform or service that you are integrating with.&lt;br /&gt;
&lt;br /&gt;
== Defining a Struct ==&lt;br /&gt;
To define a [[Struct]], you can first create a [[UDF|user function]] object by draggin the functio node from the [[Create and edit nodes|object Toolbar]]). Then change its class to &amp;lt;code&amp;gt;Struct&amp;lt;/code&amp;gt; in its [[Object window]] or [[Attribute window]].&lt;br /&gt;
&lt;br /&gt;
A Struct uses the [[Parameters]] attribute with the same [[Function Parameter Qualifiers]] as a [[User-Defined Function]] (UDF), for example:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;Struct MyDtype( a : atom ; b : Text [I] ; c: Number[J] )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This Struct has three members -- &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; with any atomic data type, &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, which is text and may be an array of texts with index &amp;lt;code&amp;gt;I&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;, which must be a numberand may have index &amp;lt;code&amp;gt;J&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
The default [[Definition]] of a Struct is &amp;lt;code&amp;gt;Self&amp;lt;/code&amp;gt;.  Sometimes you may specify a more specialized definition -- see [[#Constructor customization]] below.&lt;br /&gt;
&lt;br /&gt;
== Instantiating a value ==&lt;br /&gt;
&lt;br /&gt;
To create an instance of a Struct, you simply call the name of your struct as if it were a function from within an expression. In the previous example, that might be:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;MyDtype( Category, Category_aliases, Category_IDs )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If any of the values passed to the constructor parameters have extra indexes (dimensions), [[Array Abstraction]] kicks in and creates an array of struct instances over those extra indexes.&lt;br /&gt;
&lt;br /&gt;
== Accessing member values ==&lt;br /&gt;
Use the [[Arrow operator]] to access a member values of a Struct. E.g.,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;inst -&amp;gt; b&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where &amp;lt;code&amp;gt;inst&amp;lt;/code&amp;gt; was obtained by calling the Struct.&lt;br /&gt;
&lt;br /&gt;
The left-hand side of the arrow can be a single instance, an array of instances, or even [[Null]].  The right-hand side of the arrow is the name of a member value.&lt;br /&gt;
&lt;br /&gt;
== Member functions ==&lt;br /&gt;
&lt;br /&gt;
You can introduce your own ''member functions'' that are called using the syntax:&lt;br /&gt;
:&amp;lt;code&amp;gt;inst -&amp;gt; F(x, y)&amp;lt;/code&amp;gt;&lt;br /&gt;
The parameters are limited to be passed by values (e.g., no Index parameters). Keep in mind that the instance is immutable so these functions can't usually modify the internal state of the instance (see Section [[#Immutability]] for exceptions).&lt;br /&gt;
&lt;br /&gt;
To create your own ''member function'', open up  the [[Struct]]'s diagram (as you would open up the diagram of a Module node) and drag a Function object to the diagram. In its [[Object window]], set the parameters ensuring that the first parameter is declared as, e.g., &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;Function F( Self : MyDtype atom ; param1  ; param2 )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first parameter should be named &amp;lt;code&amp;gt;Self&amp;lt;/code&amp;gt; and should have the Struct  name as its data type and the [[Objects and Values|atom]] qualifier. You can have zero or more additional parameters -- these are the ones passed to the function when it is called using the syntax &amp;lt;code&amp;gt;inst &amp;amp;rarr; F(x,y)&amp;lt;/code&amp;gt;. These parameters can have any data type qualifier, dimensionality declaration; however,  for now they cannot handle [[Function_parameter_qualifiers#Evaluation_Mode_Qualifiers|evaluation mode qualifiers]] or [[Function_parameter_qualifiers#Object_Class_Qualifiers|Object class qualifiers]].&lt;br /&gt;
&lt;br /&gt;
You can also introduce global variables that are &amp;quot;private&amp;quot; to the Struct and its member functions by adding normal variable nodes to the diagram. Note that these are contained in the Struct definition, not in each instance (to have a value that varies with each instance, you must use a member value.&lt;br /&gt;
&lt;br /&gt;
== Constructor customization ==&lt;br /&gt;
The member values of an instance are usually the parameter names that appear in the [[Parameter]] attribute of the struct (its Constructor's parameter names). However, in some use cases the constructor may change the member values, such as by adding new members, transforming the named members, or even removing members. These changes must be performed in the [[Definition]] of the constructor.&lt;br /&gt;
&lt;br /&gt;
When you first view the [[Object window]] of a [[Struct]], the [[Definition]] might not be visible (because altering the member values is somewhat esoteric). If you don't see it, use the [[Object_Window#Selecting_Attributes_to_Display|Attribute visibility popup]] to make it visible.&lt;br /&gt;
&lt;br /&gt;
Inside the constructor (and only in the constructor) the members can be assigned.  For example:&lt;br /&gt;
&lt;br /&gt;
 [[Struct]] MyDType( a : atom ; b : Text [I] ; c : Number [J] )&lt;br /&gt;
 '''Definition''': &lt;br /&gt;
        Self -&amp;gt; creationTime := [[Today]](true);&lt;br /&gt;
        Self -&amp;gt; c := c / [[Sum]](C,  J);&lt;br /&gt;
        Self&lt;br /&gt;
&lt;br /&gt;
The final value is always &amp;lt;code&amp;gt;Self&amp;lt;/code&amp;gt; whether or not your Definition actually returns &amp;lt;code&amp;gt;Self&amp;lt;/code&amp;gt;, although it is clearer to do. Notice that in this example, it adds a new member value, &amp;lt;code&amp;gt;creationTime&amp;lt;/code&amp;gt;, and changes the member value &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; to the normalized value.&lt;br /&gt;
&lt;br /&gt;
When you change the member values in the constructor, you should consider whether you will ever assign values of your Struct to a definition or other expression attribute, or whether instances will even need to be saved directly in the model file. These cases require a text representation that is valid expression and which results in an equivalent instance. In the event that you alter the members, you may need to add a custom [[#ExpressionText]] member function that prints out a constructor call expression.&lt;br /&gt;
&lt;br /&gt;
== Using an excess parameter in the constructor ==&lt;br /&gt;
&lt;br /&gt;
An ''excess parameter'' is a catch-all parameter that allows the caller to include named parameters that aren't listed in the parameters. It can be either named or unnamed.&lt;br /&gt;
&lt;br /&gt;
The constructor has an unnamed excess parameter when the last parameter is named &amp;lt;code&amp;gt;&amp;quot;...&amp;quot;&amp;lt;/code&amp;gt;. For example,&lt;br /&gt;
&lt;br /&gt;
 [[Struct]] MyDType2( a : atom ; b : Text[I] ; ... )&lt;br /&gt;
&lt;br /&gt;
When declared in this fashion, a caller can specify parameters other than &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, for example:&lt;br /&gt;
&lt;br /&gt;
 MyDType2( a:5, b:f&amp;quot;I={I}&amp;quot;, c:14, d:=J^2 )&lt;br /&gt;
&lt;br /&gt;
When an unnamed excess parameter is used in this way, the additional parameters are automatically added as members. Hence, in this example, &amp;lt;code&amp;gt;MyDType2&amp;lt;/code&amp;gt; has members &amp;lt;code&amp;gt;['a', 'b', 'c', 'd']&amp;lt;/code&amp;gt;. Because the excess parameter is unnamed, there is no way to refer to it in the constructor's definition. &lt;br /&gt;
&lt;br /&gt;
To specify that the excess parameters not be added to the struct instance, you can use&lt;br /&gt;
 [[Struct]] MyDType3( a : atom ; b : Text[I] ; ... : nonMember )&lt;br /&gt;
&lt;br /&gt;
A ''named excess parameter'' is declared using a named that starts with &amp;lt;code&amp;gt;&amp;quot;...&amp;quot;&amp;lt;/code&amp;gt;, which again must be the last parameter in the declaration. For example,&lt;br /&gt;
&lt;br /&gt;
 [[Struct]] MyDType3( a : atom ; b : Text[I] ; ...kw )&lt;br /&gt;
&lt;br /&gt;
Inside the constructor's definition, it can now refer to the local variable &amp;lt;code&amp;gt;kw&amp;lt;/code&amp;gt;. The value of &amp;lt;code&amp;gt;kw&amp;lt;/code&amp;gt; is itself a struct instance where each argument is a member. For example, when called as&lt;br /&gt;
 MyDType3( a:5, b:f&amp;quot;{I}&amp;quot;, y:43, z:'hello' )&lt;br /&gt;
The Definition of MyDType3 could reference &amp;lt;code&amp;gt;kw-&amp;gt;y&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;kw-&amp;gt;z&amp;lt;/code&amp;gt; when called in this example; however, those would fail with an error when &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;z&amp;lt;/code&amp;gt; is not specified.&lt;br /&gt;
&lt;br /&gt;
== Equality and comparison ==&lt;br /&gt;
&lt;br /&gt;
Two struct instances are equal (i.e., &amp;lt;code&amp;gt;s1=s2&amp;lt;/code&amp;gt; is true) only when they are of the same Struct, have the same member names and have the same  member values. In other words, &amp;lt;code&amp;gt;s1=s2&amp;lt;/code&amp;gt; is based on &amp;quot;deep equality&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Shallow equality tests whether two instances are the exact same instance (as opposed to whether the two instances are equal). The following can be used to test whether two instances are the exact same instance:&lt;br /&gt;
:&amp;lt;code&amp;gt;s1-&amp;gt;_addr = s2-&amp;gt;_addr&amp;lt;/code&amp;gt;&lt;br /&gt;
The special &amp;lt;code&amp;gt;_addr&amp;lt;/code&amp;gt; member value returns an integer that is unique to each instance.&lt;br /&gt;
&lt;br /&gt;
Inequality comparisons are also based on the &amp;quot;deep&amp;quot; member values, based on the internal member value ordering.&lt;br /&gt;
&lt;br /&gt;
== Basic properties about an instance ==&lt;br /&gt;
&lt;br /&gt;
You can get a list of the member value names using:&lt;br /&gt;
:&amp;lt;code&amp;gt;inst -&amp;gt; _members&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can test whether it has a given member using:&lt;br /&gt;
:&amp;lt;code&amp;gt;inst -&amp;gt; Has('name')&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you have the name of a member value as text in a variable memberName, you can access its value using:&lt;br /&gt;
:&amp;lt;code&amp;gt;`-&amp;gt;`( inst, memberName )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With this syntax, you can also specify a default value to use when the instance does not have the specified name by specifying the optional «defVal» parameter:&lt;br /&gt;
:&amp;lt;code&amp;gt;`-&amp;gt;`( inst, memberName, defVal: Null )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that it wouldn't work to write &amp;lt;code&amp;gt;inst -&amp;gt; memberName&amp;lt;/code&amp;gt; because that would look for a member value named &amp;quot;memberName&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
You can get a handle to the instance's Struct object using&lt;br /&gt;
:&amp;lt;code&amp;gt;inst -&amp;gt; _type&amp;lt;/code&amp;gt;&lt;br /&gt;
You can get the name of the Struct (without a [[Namespaces|namespace]] prefix) from &amp;lt;code&amp;gt;[[TypeOf]](inst)&amp;lt;/code&amp;gt;. You can detect that an atom is a struct instance using&lt;br /&gt;
:&amp;lt;code&amp;gt;[[TypeOf]]( inst, shallow:true ) = &amp;quot;Struct&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Special member functions ==&lt;br /&gt;
&lt;br /&gt;
You can customize the behavior of your struct instances by adding special member functions (with reserved member function names). You add these as you would your own member functions to your Struct's diagram using the reserved name. Your implementation must match the required parameters for the special function.&lt;br /&gt;
&lt;br /&gt;
=== Customizing how a value is printed ===&lt;br /&gt;
My default, an instance of your Struct will display in a result table cell or in the [[Typescript window|Typescript console]] as, e.g., &amp;lt;code&amp;gt;«YourStructName»&amp;lt;/code&amp;gt;. You can customize this by adding a member function named &amp;lt;code&amp;gt;DisplayName&amp;lt;/code&amp;gt;. E.g., &lt;br /&gt;
&lt;br /&gt;
 Function DisplayName( Self : MyDtype atom )&lt;br /&gt;
 '''Definition''': f&amp;quot;«{[[TypeOf]](Self)} a={Self-&amp;gt;a}»&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Because &amp;lt;code&amp;gt;DisplayName&amp;lt;/code&amp;gt; occurs while individual cells are drawing on the screen, errors that occur while it is evaluating are not displayed. If an error occurs, it will silently fall back to the default display name.&lt;br /&gt;
&lt;br /&gt;
When your instance is &amp;quot;printed&amp;quot; to an expression (e.g., as a result of an assignment),  you need to ensure that the text is a valid expression that creates a logically equivalent instance. This happens by default unless you alter the members in your constructor (see [[#Constructor customization]] above). To control this, add a member function name &amp;lt;code&amp;gt;ExpressionText(Self)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Value expansion (in a result table) ===&lt;br /&gt;
When a struct instance appears in the cell of a result table, it appears as a hyperlink. Double clicking on it expands the value. By default, it expands into the member values. You can change this by adding a member function named  &amp;lt;code&amp;gt;Expand(Self)&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Your expansion code cannot simply create an array of your member values (assuming they have different dimensionalities) since this would combine their dimensions.  Instead, you should wrap each non-atomic value in &amp;lt;code&amp;gt;_HyperlinkedCellvalue&amp;lt;/code&amp;gt;. For example:&lt;br /&gt;
&lt;br /&gt;
 Function Expand( Self )&lt;br /&gt;
 '''Definition''': [ 'a' : Self-&amp;gt;a, &lt;br /&gt;
               'b' : _HyperlinkedCellValue( Self-&amp;gt;b ), &lt;br /&gt;
               'c' : _HyperlinkedCellValue( Self-&amp;gt;c ) ]&lt;br /&gt;
&lt;br /&gt;
You can also introduce a local index for the expansion.&lt;br /&gt;
&lt;br /&gt;
After it expands, the result table displays a title showing the current &amp;quot;path&amp;quot; to the result view. Ideally this title is also a valid expression that produces the same result. When you customize the expansion, you may also need to customize the expansion title. You can do this by adding a member function&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;Function TitleForExpand(Self : Tuple  atom ; subTitle : text atom ; memberNum :  optional  positive atom )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The «subTitle» is the title up to the point of this expansion, and «memberNum» exposes which cell number was expanded from the previous level.&lt;br /&gt;
&lt;br /&gt;
=== Finalizers ===&lt;br /&gt;
&lt;br /&gt;
A finalizer is a member function that is called when the struct instance value is released for last time.&lt;br /&gt;
&lt;br /&gt;
You can add a customized finalizer, for example, to ensure that a resource gets cleaned up. An example use case would be when your [[Struct]] is a temporary file, with the finalizer ensuring that the temporary file is deleted when the instance is released. This is an example where the constructor would pick a unique file name that doesn't already exist, and the finalizer calls [[FileSystemDelete]]. &lt;br /&gt;
&lt;br /&gt;
To add a finalizer, add a member function named &amp;lt;code&amp;gt;Finalizer(Self)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Finalizers should have a low probability of an error occurring while the finalizer is evaluating. In the event that an error occurs, it is not possible for Analytica to report the error, so the error will occur silently. If you do not catch it (in a [[Try]]), your full finalizer code might not run.&lt;br /&gt;
&lt;br /&gt;
=== Callable values ===&lt;br /&gt;
&lt;br /&gt;
You can make an instance of your Struct &amp;quot;''callable''&amp;quot;, such that you can call the instance using e.g.,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;inst -&amp;gt; ( x, y )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To make it callable, create a member function named &amp;lt;code&amp;gt;`()`&amp;lt;/code&amp;gt; -- make sure to include the backtics as part of the name, and no spaces between the parens. For example:&lt;br /&gt;
&lt;br /&gt;
 Function `()`( alpha, pwr )&lt;br /&gt;
 '''Definition''': (1-alpha) * Self-&amp;gt;a + alpha * [[Sum]]( b^pwr, I )&lt;br /&gt;
&lt;br /&gt;
If you do this, you can also use a [[Callable]]  object class to hold your instance (or an array of instances) and then call it using the name of your callable as if it were a normal function (even though the logical function itself is computed), e.g.,&lt;br /&gt;
&lt;br /&gt;
:[[Callable]] F1 := MyDType( x,y,z )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And call it:&lt;br /&gt;
:&amp;lt;code&amp;gt;F1(0.3, 2) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Custom atomic subscripting ===&lt;br /&gt;
Your data type can support the syntax&lt;br /&gt;
:&amp;lt;code&amp;gt;inst -&amp;gt; [n]&amp;lt;/code&amp;gt;&lt;br /&gt;
by adding a member function named &amp;lt;code&amp;gt;`[]`&amp;lt;/code&amp;gt;. It can have either one or two parameters (after &amp;lt;code&amp;gt;Self&amp;lt;/code&amp;gt;). With one parameter, only &amp;lt;code&amp;gt;inst -&amp;gt; [n]&amp;lt;/code&amp;gt; is supported (so that &amp;lt;code&amp;gt;inst -&amp;gt; [m..n]&amp;lt;/code&amp;gt; would array abstract returning a list). With two parameters, where the second parameter is optional, it can include special handling of &amp;lt;code&amp;gt;inst -&amp;gt; [m..n]&amp;lt;/code&amp;gt;, for example by returning a new collection instance of the same type. &lt;br /&gt;
&lt;br /&gt;
 Function `[]`( Self : Tuple atom ; m,n : optional number atom )&lt;br /&gt;
&lt;br /&gt;
In this example, if &amp;lt;code&amp;gt;inst -&amp;gt; [m]&amp;lt;/code&amp;gt; is called, then the «n» parameter is omitted. If &amp;lt;code&amp;gt;inst -&amp;gt; [m..n]&amp;lt;/code&amp;gt; is called, both parameters are provided. If &amp;lt;code&amp;gt;inst -&amp;gt; [m..]&amp;lt;/code&amp;gt; is called, then «n» is [[INF]]. And if &amp;lt;code&amp;gt;inst-&amp;gt;[..n]&amp;lt;/code&amp;gt; is called, then «m» is omitted.&lt;br /&gt;
&lt;br /&gt;
=== Operator overloading ===&lt;br /&gt;
&lt;br /&gt;
At present, only these operators can be overloaded by adding a member function with the given name.&lt;br /&gt;
&lt;br /&gt;
* Function `#`( Self )&lt;br /&gt;
&lt;br /&gt;
=== Overloading the &amp;lt;code&amp;gt;`-&amp;gt;`&amp;lt;/code&amp;gt; operator ===&lt;br /&gt;
&lt;br /&gt;
It is possible to overload the right-arrow operator for a Struct, intercepting attempts to read a member value or to set  a member value. &lt;br /&gt;
&lt;br /&gt;
If you only want to intercept attempts to read member values, add the following member function in your struct:&lt;br /&gt;
 Function `-&amp;gt;`( Self : '''''YourStruct''''' atom ; member : Text atom ; defVal : optional named )&lt;br /&gt;
By sure to change '''''YourStruct''''' to the actual name of your struct. This will be called when code evaluates&lt;br /&gt;
:&amp;lt;code&amp;gt;inst -&amp;gt; member&amp;lt;/code&amp;gt;&lt;br /&gt;
on an instance &amp;lt;code&amp;gt;inst&amp;lt;/code&amp;gt; of your struct. Your function can return values for members that don't actually exist, or deny members that might exist, or just intercept the read and then forward it in the usual way. &lt;br /&gt;
&lt;br /&gt;
Exceptions: Member functions with names beginning with an underscore are never intercepted (such as the special &amp;lt;code&amp;gt;inst-&amp;gt;_members&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;inst-&amp;gt;_type&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;inst-&amp;gt;_addr&amp;lt;/code&amp;gt; virtual members).  Also, calls to member local functions or member functions are never intercepted -- this intercepts member value access only.&lt;br /&gt;
&lt;br /&gt;
Your implementation of the overload will often want to access the actual members of the class. It must not use the usual arrow operator for this because that would result in an infinite recursion.  Instead, you can use the raw member access function, &amp;lt;code&amp;gt;`-&amp;gt;!`&amp;lt;/code&amp;gt;, which behaves the same same as &amp;lt;code&amp;gt;`-&amp;gt;`&amp;lt;/code&amp;gt; except that it cannot be overridden. This function can only be called using a function call syntax, it cannot be used as an infix operator. &lt;br /&gt;
&lt;br /&gt;
Here is a contrived example that makes is look like the file contents is a member value. (It would be better to just add a member function for this, but it makes for an easy example).&lt;br /&gt;
&lt;br /&gt;
 Struct TextFile( filename : Text atom )&lt;br /&gt;
 &lt;br /&gt;
 Function TextFile::`-&amp;gt;`( Self : TextFile atom ; member : Text atom ; defVal : optional named )&lt;br /&gt;
 '''Definition''':&lt;br /&gt;
 [[If]] TextLowerCase(member) = &amp;quot;contents&amp;quot; Then &lt;br /&gt;
   [[ReadTextFile]](filename)&lt;br /&gt;
 [[Else]]&lt;br /&gt;
   `-&amp;gt;!`( Self, member, defVal:defVal )&lt;br /&gt;
&lt;br /&gt;
You can also use an override of &amp;lt;code&amp;gt;`-&amp;gt;`&amp;lt;/code&amp;gt; to intercept attempts to assign to a member, such as an assignment like&lt;br /&gt;
  inst -&amp;gt; val := newVal&lt;br /&gt;
&lt;br /&gt;
A struct instance is itself immutable, so such assignments are not generally valid, but using an override you can make it appear that a member is mutable. This could be useful, for example, when using a struct to wrap an object from a different programming language, or in a web service, where members can be assigned. The overload could send the change through an API, keeping a familiar assignment syntax.&lt;br /&gt;
&lt;br /&gt;
To add an overload that can also intercept member assignments (as well as reading member values), the member function should have this signature:&lt;br /&gt;
&lt;br /&gt;
 Function `-&amp;gt;`( Self : '''''YourStruct''''' atom ; member : Text atom ; defVal : optional named ; rhs : optional named )&lt;br /&gt;
&lt;br /&gt;
Inside the definition, use &amp;lt;code&amp;gt;IsNotSpecified(rhs)&amp;lt;/code&amp;gt; to determine whether it is a read or an assignment.&lt;br /&gt;
&lt;br /&gt;
== Assignment ==&lt;br /&gt;
Sometimes a button's [[OnClick]] expression assigns a result value to a global variable. When you do so, it sets the definition of the global variable to an expression that results in the same value when evaluated. It is also an expression that can be saved with a model file.&lt;br /&gt;
&lt;br /&gt;
In the case of a Struct, this means that the expression must be a call to the Struct's constructor with parameter values that result in a logically equivalent instance. &lt;br /&gt;
&lt;br /&gt;
In the cases where you have customized constructor logic that alters what member values are actually stored, if you want assignment (and saving to a model file) to work successfully, you need to include the custom member function:&lt;br /&gt;
&lt;br /&gt;
 Function ToExpression( Self : MyStruct atom )&lt;br /&gt;
&lt;br /&gt;
This can return the textual expression that results in an equivalent value, but in general, it can be difficult to get the textual expression correct. Hence, the recommended way to implement the function is to return an instance of the generic built-in &amp;lt;code&amp;gt;_Struct&amp;lt;/code&amp;gt; with member names that correspond to your constructor parameter names.&lt;br /&gt;
&lt;br /&gt;
===  Example ===&lt;br /&gt;
&lt;br /&gt;
This example uses the [[Mutables library]].&lt;br /&gt;
&lt;br /&gt;
 Struct S( x : nonMember )&lt;br /&gt;
 '''Definition: ''' Self-&amp;gt;mutable_val := Mutable(x)&lt;br /&gt;
 &amp;amp;nbsp;&lt;br /&gt;
 Function ToExpression( Self : S atom )&lt;br /&gt;
 '''Definition:''' _Struct( x: Self-&amp;gt;mutable_val-&amp;gt;val )&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;_Struct&amp;lt;/code&amp;gt; returned has the parameter name &amp;lt;/code&amp;gt;x, which matches the parameter name in &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt;'s constructor with the value that should appear in the call to the constructor.&lt;br /&gt;
&lt;br /&gt;
When you assign a value containing an instance of &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; to a global, the definition contains something like &amp;lt;code&amp;gt;S( 'Foo' )&amp;lt;/code&amp;gt; -- a valid call to the constructor.&lt;br /&gt;
&lt;br /&gt;
=== Repeated parameters ===&lt;br /&gt;
When your constructor has a repeated parameter, you need to set the &amp;lt;code&amp;gt;_Struct&amp;lt;/code&amp;gt; element to a list, where each item in the list corresponds to one argument passed to the parameter. If all of the items that should be passed to the repeated parameter have the same dimensionality and none are a scalar reference, then a list is fine.&lt;br /&gt;
&lt;br /&gt;
 Struct S2( people : ... Text atom nonMember )&lt;br /&gt;
 '''Definition:''' Self-&amp;gt;people_ids := PersonToId( people )&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
 Function ToExpression( Self : S2 atom )&lt;br /&gt;
 '''Definition:''' &lt;br /&gt;
      Local people := IdToPerson( Self-&amp;gt;people_ids );               { This is a list of text }&lt;br /&gt;
      _Struct( people : people )&lt;br /&gt;
&lt;br /&gt;
A more nuanced case occurs when the items to the repeated parameter may have different dimensionalities. In this case, you need to take the [[reference]] of each item in the list so that its dimensions don't combine with the indexes of its sibling elements.&lt;br /&gt;
&lt;br /&gt;
 Struct S3( items : ... nonMember )&lt;br /&gt;
 '''Definition:''' &lt;br /&gt;
      Self-&amp;gt;first := items[@=1];&lt;br /&gt;
      [[Local]] refd := ([[For]] xi := repeated items Do \xi); {refs to keep dims separate}&lt;br /&gt;
      Self-&amp;gt;rest := refd[@=2..[[Size]](items,listLen:true)]&lt;br /&gt;
 &amp;amp;nbsp;&lt;br /&gt;
 Function ToExpression( Self : S3 atom )&lt;br /&gt;
 '''Definition:'''  _Struct( items : [\Self-&amp;gt;first, ...Self-&amp;gt;rest ] )&lt;br /&gt;
&lt;br /&gt;
To keep the dimensionalities separate for each item is &amp;lt;code&amp;gt;Self-&amp;gt;Rest&amp;lt;/code&amp;gt;, the constructor takes the reference of each repeated item. In &amp;lt;code&amp;gt;ToExpression&amp;lt;/code&amp;gt;, these are already references so it simply forwards them into the list for «items».&lt;br /&gt;
&lt;br /&gt;
== Immutability ==&lt;br /&gt;
The &amp;lt;code&amp;gt;Self&amp;lt;/code&amp;gt; members can be altered from within the [[Struct]] constructor, but cannot be altered once the fully-constructed instance has been returned by the constructor. From that point on, the members of a struct instance are never changed.&lt;br /&gt;
&lt;br /&gt;
However, a struct can hold a [[Mutable]] or a [[Local_functions_and_local_value_captures#Local_value_capture|captured local]] which actually makes it possible for the internal state of an instance to be changed. The mutable or the local's identity never changes, and changes to this type of internal state does not result in any downstream invalidation.&lt;br /&gt;
&lt;br /&gt;
== Generic Struct ==&lt;br /&gt;
A built-in struct named &amp;lt;code&amp;gt;_Struct&amp;lt;/code&amp;gt; (with an underscore) can be used as a generic Struct that you can instantiate on arbitrary members without having to define your own Struct object. To instantiate, every parameter must be named, but can be whatever name you want, e.g.,&lt;br /&gt;
&lt;br /&gt;
 _Struct( date:Today(), name: 'Donald', address: '1600 Pennsylvania Avenue' )&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
Examples in this section demonstrate various aspects of a Struct and member functions.&lt;br /&gt;
&lt;br /&gt;
=== Tuple ===&lt;br /&gt;
A Tuple is a ordered list of items, each item having a different dimensionality. It can be implemented as a Struct.&lt;br /&gt;
&lt;br /&gt;
To create a tuple (after the Tuple Struct is defined), use:&lt;br /&gt;
 Tuple( x, y, z )&lt;br /&gt;
with any number of values. The values passed can have different dimensionalities. The collection is held in a single cell (if you have an array of Tuples), and the dimensionalities of the items are kept separate.&lt;br /&gt;
&lt;br /&gt;
 Struct Tuple( items : ... ;&lt;br /&gt;
               direct : hidden optional named boolean atom )&lt;br /&gt;
 '''Definition''':&lt;br /&gt;
    [[If]] direct [[Then]] (&lt;br /&gt;
        [[For]] xi:= repeated items Do &lt;br /&gt;
            [[If]] [[Not]] [[IsReference]](xi) then &lt;br /&gt;
                Error(&amp;quot;When using direct:True to Tuple, all «items» must be references&amp;quot;);&lt;br /&gt;
        Self-&amp;gt;items := items&lt;br /&gt;
    ) [[Else]] (&lt;br /&gt;
        Self-&amp;gt;items := ([[For]] xi := repeated items Do \xi)&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
 Function Tuple::Length( Self : Tuple atom )&lt;br /&gt;
 '''Definition''': &lt;br /&gt;
    [[Size]]( Self-&amp;gt;items, True )&lt;br /&gt;
&lt;br /&gt;
 Function Tuple::Expand ( Self : Tuple atom )&lt;br /&gt;
 '''Definition''':&lt;br /&gt;
    [[Local]] i:=f&amp;quot;[{1..[[size]](Self-&amp;gt;items)}]&amp;quot;;&lt;br /&gt;
    [[For]] ii:=@i do (&lt;br /&gt;
        [[Local]] xi := #(Self-&amp;gt;items[@=ii]);&lt;br /&gt;
        [[If]] [[Size]]([[IndexesOf]](xi))&amp;gt;0 then&lt;br /&gt;
            _HyperlinkedCellValue(xi)&lt;br /&gt;
        [[Else]]&lt;br /&gt;
             xi&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
 Function Tuple::`[]`(Self : Tuple atom ; m,n : optional number atom )&lt;br /&gt;
 '''Definition''':&lt;br /&gt;
    [[If]] [[IsNotSpecified]](n) Then &lt;br /&gt;
        #(Self-&amp;gt;items[@=m,defVal:Null])&lt;br /&gt;
    [[Else]] (&lt;br /&gt;
        [[If]] [[IsNotSpecified]](m) [[Then]] m := 1;&lt;br /&gt;
        [[If]] n&amp;gt;[[Size]](Self-&amp;gt;items) [[Then]] n := [[Size]](Self-&amp;gt;items);&lt;br /&gt;
        Tuple( ...Self-&amp;gt;items[@=m..n], direct:True )&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
 Function Tuple::TitleForExpand(Self : Tuple  atom ; subTitle : text atom ; memberNum :  optional  positive atom )&lt;br /&gt;
 '''Definition''':&lt;br /&gt;
    [[If]] [[IsNotSpecified]](memberNum) [[Then]]&lt;br /&gt;
        f&amp;quot;{subTitle}-&amp;gt;&amp;quot;&lt;br /&gt;
    [[Else]]&lt;br /&gt;
        f&amp;quot;{subTitle}-&amp;gt;[{memberNum:I}]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 Function Tuple::ToExpression( Self : Tuple atom )&lt;br /&gt;
 '''Definition''': _Struct( items: Self-&amp;gt;items )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Reference ===&lt;br /&gt;
This example demonstrates how a [[reference]] could be implemented using Struct if it weren't already built into the Analytica language. Note that the keywords Ref and Reference are already in use, so we need to pick a different name.&lt;br /&gt;
&lt;br /&gt;
 Struct _Ref( r : [I] ; I : optional ... index = common )&lt;br /&gt;
&lt;br /&gt;
 Function _Ref::`#`( Self : _Ref atom )&lt;br /&gt;
 '''Definition''': Self-&amp;gt;r&lt;br /&gt;
&lt;br /&gt;
 Function _Ref::Expand( Self : _Ref atom )&lt;br /&gt;
 '''Definition''': `#`(Self)&lt;br /&gt;
&lt;br /&gt;
 Function _Ref::TitleForExpand(Self : _Ref atom ; subTitle : text atom ; memberNum :  optional  positive atom )&lt;br /&gt;
 '''Definition''':&lt;br /&gt;
            f&amp;quot;#{subTitle}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Arrow operator]]&lt;br /&gt;
* [[Callable]]&lt;br /&gt;
* [[User-Defined Functions]]&lt;br /&gt;
* [[Function Parameter Qualifiers]]&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=Struct&amp;diff=63552</id>
		<title>Struct</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=Struct&amp;diff=63552"/>
		<updated>2025-12-14T20:50:14Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: /* When to use a Struct */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:Objects]]&lt;br /&gt;
[[category:Variables]]&lt;br /&gt;
''new to [[Analytica 7.0]]''&lt;br /&gt;
&lt;br /&gt;
Most programming languages have a way to bundle a set of disparate data into a packet, often called Records, Classes, or  Structs. In Analytica, you can do this using an array with an [[Index]], but this doesn't work so well if the values in the array are disparate, for example, if they include numbers, text, references to other data, or array values with different dimensions.  For example, if you want to create lists or hierarchies,  represent JSON data or html.  Thta's why Analytica has introduced Structs to represent these kinds of data structures. &lt;br /&gt;
&lt;br /&gt;
A struct instance can have multiple member fields,  which can be of varioust data types and dimensionality. For example, a struct could have a scalar member, a 1-D member and a 2-D member, where the dimensions of the members are unrelated. Each struct value is treated as an atomic element, and it does not apply Array abstraction within the Struct.&lt;br /&gt;
&lt;br /&gt;
== Struct class ==&lt;br /&gt;
&lt;br /&gt;
A [[Struct]] object defines a new atomic data type.  It appears on a diagram with a shape that resembles a function, but with flat midsections on both the left and right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[image:MyDtype_Struct.png]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After you define a [[Struct]], you can create instances of it. Instances are ''atomic'' and ''immutable'': ''Atomic''meaning that [[Array Abstraction]] treats it as a single cell -- even though it may have multiple elements.''Immutable'' meaning that, it cannot be destructively altered after it's been created.&lt;br /&gt;
&lt;br /&gt;
A [[Struct]] is an [[Objects and Values|Object]]. An instance of a struct is a [[Objects and Values|Value]].&lt;br /&gt;
&lt;br /&gt;
== When to use a Struct ==&lt;br /&gt;
&lt;br /&gt;
These are examples of when a Struct may be convenient:&lt;br /&gt;
* To represent hierarchical data, such as from html or JSON.&lt;br /&gt;
&lt;br /&gt;
* If you want your data type to be an opaque atomic unit with multiple internal items. &lt;br /&gt;
&lt;br /&gt;
* To [[Returning multiple values|return multiple return values]] with varying dimensions as an alternative to capturing multiple return values.&lt;br /&gt;
&lt;br /&gt;
* To pass complex data structures among user-defined functions.&lt;br /&gt;
&lt;br /&gt;
* To enforce a distinction that does not exist in Analytica, but is used in another platform or service that you are integrating with.&lt;br /&gt;
&lt;br /&gt;
== Defining a Struct ==&lt;br /&gt;
To create an object whose class is [[Struct]], you can first create a [[UDF|user function]] object, and then change its class to &amp;lt;code&amp;gt;Struct&amp;lt;/code&amp;gt; in its [[Object window]] or [[Attribute window]].&lt;br /&gt;
&lt;br /&gt;
A Struct uses the [[Parameters]] attribute with just the same [[Function Parameter Qualifiers]] as a [[User-Defined Function]] (UDF)., for example:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;Struct MyDtype( a : atom ; b : Text [I] ; c: Number[J] )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This data type has three members -- &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;. The &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; field can have any atomic data type, the &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; member must be text and may have the index &amp;lt;code&amp;gt;I&amp;lt;/code&amp;gt;, and the &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; member must be a numeric and may have index &amp;lt;code&amp;gt;J&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
The default [[Definition]] of a Struct is &amp;lt;code&amp;gt;Self&amp;lt;/code&amp;gt;.  Sometimes it makes sense to include a more specialized definition -- see [[#Constructor customization]] below.&lt;br /&gt;
&lt;br /&gt;
== Instantiating a value ==&lt;br /&gt;
&lt;br /&gt;
To create an instance of a Struct, you simply call the name of your struct as if it were a function from within an expression. In the previous example, that might be:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;MyDtype( Category, Category_aliases, Category_IDs )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If any of the values passed to the constructor parameters have extra indexes (dimensions), [[Array Abstraction]] kicks in and creates an array of struct instances over those extra indexes.&lt;br /&gt;
&lt;br /&gt;
== Accessing member values ==&lt;br /&gt;
Use the [[Arrow operator]] to access a member values of a Struct. E.g.,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;inst -&amp;gt; b&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where &amp;lt;code&amp;gt;inst&amp;lt;/code&amp;gt; was obtained by calling the Struct.&lt;br /&gt;
&lt;br /&gt;
The left-hand side of the arrow can be a single instance, an array of instances, or even [[Null]].  The right-hand side of the arrow is the name of a member value.&lt;br /&gt;
&lt;br /&gt;
== Member functions ==&lt;br /&gt;
&lt;br /&gt;
You can introduce your own ''member functions'' that are called using the syntax:&lt;br /&gt;
:&amp;lt;code&amp;gt;inst -&amp;gt; F(x, y)&amp;lt;/code&amp;gt;&lt;br /&gt;
The parameters are limited to be passed by values (e.g., no Index parameters). Keep in mind that the instance is immutable so these functions can't usually modify the internal state of the instance (see Section [[#Immutability]] for exceptions).&lt;br /&gt;
&lt;br /&gt;
To create your own ''member function'', open up  the [[Struct]]'s diagram (as you would open up the diagram of a Module node) and drag a Function object to the diagram. In its [[Object window]], set the parameters ensuring that the first parameter is declared as, e.g., &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;Function F( Self : MyDtype atom ; param1  ; param2 )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first parameter should be named &amp;lt;code&amp;gt;Self&amp;lt;/code&amp;gt; and should have the Struct  name as its data type and the [[Objects and Values|atom]] qualifier. You can have zero or more additional parameters -- these are the ones passed to the function when it is called using the syntax &amp;lt;code&amp;gt;inst &amp;amp;rarr; F(x,y)&amp;lt;/code&amp;gt;. These parameters can have any data type qualifier, dimensionality declaration; however,  for now they cannot handle [[Function_parameter_qualifiers#Evaluation_Mode_Qualifiers|evaluation mode qualifiers]] or [[Function_parameter_qualifiers#Object_Class_Qualifiers|Object class qualifiers]].&lt;br /&gt;
&lt;br /&gt;
You can also introduce global variables that are &amp;quot;private&amp;quot; to the Struct and its member functions by adding normal variable nodes to the diagram. Note that these are contained in the Struct definition, not in each instance (to have a value that varies with each instance, you must use a member value.&lt;br /&gt;
&lt;br /&gt;
== Constructor customization ==&lt;br /&gt;
The member values of an instance are usually the parameter names that appear in the [[Parameter]] attribute of the struct (its Constructor's parameter names). However, in some use cases the constructor may change the member values, such as by adding new members, transforming the named members, or even removing members. These changes must be performed in the [[Definition]] of the constructor.&lt;br /&gt;
&lt;br /&gt;
When you first view the [[Object window]] of a [[Struct]], the [[Definition]] might not be visible (because altering the member values is somewhat esoteric). If you don't see it, use the [[Object_Window#Selecting_Attributes_to_Display|Attribute visibility popup]] to make it visible.&lt;br /&gt;
&lt;br /&gt;
Inside the constructor (and only in the constructor) the members can be assigned.  For example:&lt;br /&gt;
&lt;br /&gt;
 [[Struct]] MyDType( a : atom ; b : Text [I] ; c : Number [J] )&lt;br /&gt;
 '''Definition''': &lt;br /&gt;
        Self -&amp;gt; creationTime := [[Today]](true);&lt;br /&gt;
        Self -&amp;gt; c := c / [[Sum]](C,  J);&lt;br /&gt;
        Self&lt;br /&gt;
&lt;br /&gt;
The final value is always &amp;lt;code&amp;gt;Self&amp;lt;/code&amp;gt; whether or not your Definition actually returns &amp;lt;code&amp;gt;Self&amp;lt;/code&amp;gt;, although it is clearer to do. Notice that in this example, it adds a new member value, &amp;lt;code&amp;gt;creationTime&amp;lt;/code&amp;gt;, and changes the member value &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; to the normalized value.&lt;br /&gt;
&lt;br /&gt;
When you change the member values in the constructor, you should consider whether you will ever assign values of your Struct to a definition or other expression attribute, or whether instances will even need to be saved directly in the model file. These cases require a text representation that is valid expression and which results in an equivalent instance. In the event that you alter the members, you may need to add a custom [[#ExpressionText]] member function that prints out a constructor call expression.&lt;br /&gt;
&lt;br /&gt;
== Using an excess parameter in the constructor ==&lt;br /&gt;
&lt;br /&gt;
An ''excess parameter'' is a catch-all parameter that allows the caller to include named parameters that aren't listed in the parameters. It can be either named or unnamed.&lt;br /&gt;
&lt;br /&gt;
The constructor has an unnamed excess parameter when the last parameter is named &amp;lt;code&amp;gt;&amp;quot;...&amp;quot;&amp;lt;/code&amp;gt;. For example,&lt;br /&gt;
&lt;br /&gt;
 [[Struct]] MyDType2( a : atom ; b : Text[I] ; ... )&lt;br /&gt;
&lt;br /&gt;
When declared in this fashion, a caller can specify parameters other than &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, for example:&lt;br /&gt;
&lt;br /&gt;
 MyDType2( a:5, b:f&amp;quot;I={I}&amp;quot;, c:14, d:=J^2 )&lt;br /&gt;
&lt;br /&gt;
When an unnamed excess parameter is used in this way, the additional parameters are automatically added as members. Hence, in this example, &amp;lt;code&amp;gt;MyDType2&amp;lt;/code&amp;gt; has members &amp;lt;code&amp;gt;['a', 'b', 'c', 'd']&amp;lt;/code&amp;gt;. Because the excess parameter is unnamed, there is no way to refer to it in the constructor's definition. &lt;br /&gt;
&lt;br /&gt;
To specify that the excess parameters not be added to the struct instance, you can use&lt;br /&gt;
 [[Struct]] MyDType3( a : atom ; b : Text[I] ; ... : nonMember )&lt;br /&gt;
&lt;br /&gt;
A ''named excess parameter'' is declared using a named that starts with &amp;lt;code&amp;gt;&amp;quot;...&amp;quot;&amp;lt;/code&amp;gt;, which again must be the last parameter in the declaration. For example,&lt;br /&gt;
&lt;br /&gt;
 [[Struct]] MyDType3( a : atom ; b : Text[I] ; ...kw )&lt;br /&gt;
&lt;br /&gt;
Inside the constructor's definition, it can now refer to the local variable &amp;lt;code&amp;gt;kw&amp;lt;/code&amp;gt;. The value of &amp;lt;code&amp;gt;kw&amp;lt;/code&amp;gt; is itself a struct instance where each argument is a member. For example, when called as&lt;br /&gt;
 MyDType3( a:5, b:f&amp;quot;{I}&amp;quot;, y:43, z:'hello' )&lt;br /&gt;
The Definition of MyDType3 could reference &amp;lt;code&amp;gt;kw-&amp;gt;y&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;kw-&amp;gt;z&amp;lt;/code&amp;gt; when called in this example; however, those would fail with an error when &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;z&amp;lt;/code&amp;gt; is not specified.&lt;br /&gt;
&lt;br /&gt;
== Equality and comparison ==&lt;br /&gt;
&lt;br /&gt;
Two struct instances are equal (i.e., &amp;lt;code&amp;gt;s1=s2&amp;lt;/code&amp;gt; is true) only when they are of the same Struct, have the same member names and have the same  member values. In other words, &amp;lt;code&amp;gt;s1=s2&amp;lt;/code&amp;gt; is based on &amp;quot;deep equality&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Shallow equality tests whether two instances are the exact same instance (as opposed to whether the two instances are equal). The following can be used to test whether two instances are the exact same instance:&lt;br /&gt;
:&amp;lt;code&amp;gt;s1-&amp;gt;_addr = s2-&amp;gt;_addr&amp;lt;/code&amp;gt;&lt;br /&gt;
The special &amp;lt;code&amp;gt;_addr&amp;lt;/code&amp;gt; member value returns an integer that is unique to each instance.&lt;br /&gt;
&lt;br /&gt;
Inequality comparisons are also based on the &amp;quot;deep&amp;quot; member values, based on the internal member value ordering.&lt;br /&gt;
&lt;br /&gt;
== Basic properties about an instance ==&lt;br /&gt;
&lt;br /&gt;
You can get a list of the member value names using:&lt;br /&gt;
:&amp;lt;code&amp;gt;inst -&amp;gt; _members&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can test whether it has a given member using:&lt;br /&gt;
:&amp;lt;code&amp;gt;inst -&amp;gt; Has('name')&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you have the name of a member value as text in a variable memberName, you can access its value using:&lt;br /&gt;
:&amp;lt;code&amp;gt;`-&amp;gt;`( inst, memberName )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With this syntax, you can also specify a default value to use when the instance does not have the specified name by specifying the optional «defVal» parameter:&lt;br /&gt;
:&amp;lt;code&amp;gt;`-&amp;gt;`( inst, memberName, defVal: Null )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that it wouldn't work to write &amp;lt;code&amp;gt;inst -&amp;gt; memberName&amp;lt;/code&amp;gt; because that would look for a member value named &amp;quot;memberName&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
You can get a handle to the instance's Struct object using&lt;br /&gt;
:&amp;lt;code&amp;gt;inst -&amp;gt; _type&amp;lt;/code&amp;gt;&lt;br /&gt;
You can get the name of the Struct (without a [[Namespaces|namespace]] prefix) from &amp;lt;code&amp;gt;[[TypeOf]](inst)&amp;lt;/code&amp;gt;. You can detect that an atom is a struct instance using&lt;br /&gt;
:&amp;lt;code&amp;gt;[[TypeOf]]( inst, shallow:true ) = &amp;quot;Struct&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Special member functions ==&lt;br /&gt;
&lt;br /&gt;
You can customize the behavior of your struct instances by adding special member functions (with reserved member function names). You add these as you would your own member functions to your Struct's diagram using the reserved name. Your implementation must match the required parameters for the special function.&lt;br /&gt;
&lt;br /&gt;
=== Customizing how a value is printed ===&lt;br /&gt;
My default, an instance of your Struct will display in a result table cell or in the [[Typescript window|Typescript console]] as, e.g., &amp;lt;code&amp;gt;«YourStructName»&amp;lt;/code&amp;gt;. You can customize this by adding a member function named &amp;lt;code&amp;gt;DisplayName&amp;lt;/code&amp;gt;. E.g., &lt;br /&gt;
&lt;br /&gt;
 Function DisplayName( Self : MyDtype atom )&lt;br /&gt;
 '''Definition''': f&amp;quot;«{[[TypeOf]](Self)} a={Self-&amp;gt;a}»&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Because &amp;lt;code&amp;gt;DisplayName&amp;lt;/code&amp;gt; occurs while individual cells are drawing on the screen, errors that occur while it is evaluating are not displayed. If an error occurs, it will silently fall back to the default display name.&lt;br /&gt;
&lt;br /&gt;
When your instance is &amp;quot;printed&amp;quot; to an expression (e.g., as a result of an assignment),  you need to ensure that the text is a valid expression that creates a logically equivalent instance. This happens by default unless you alter the members in your constructor (see [[#Constructor customization]] above). To control this, add a member function name &amp;lt;code&amp;gt;ExpressionText(Self)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Value expansion (in a result table) ===&lt;br /&gt;
When a struct instance appears in the cell of a result table, it appears as a hyperlink. Double clicking on it expands the value. By default, it expands into the member values. You can change this by adding a member function named  &amp;lt;code&amp;gt;Expand(Self)&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Your expansion code cannot simply create an array of your member values (assuming they have different dimensionalities) since this would combine their dimensions.  Instead, you should wrap each non-atomic value in &amp;lt;code&amp;gt;_HyperlinkedCellvalue&amp;lt;/code&amp;gt;. For example:&lt;br /&gt;
&lt;br /&gt;
 Function Expand( Self )&lt;br /&gt;
 '''Definition''': [ 'a' : Self-&amp;gt;a, &lt;br /&gt;
               'b' : _HyperlinkedCellValue( Self-&amp;gt;b ), &lt;br /&gt;
               'c' : _HyperlinkedCellValue( Self-&amp;gt;c ) ]&lt;br /&gt;
&lt;br /&gt;
You can also introduce a local index for the expansion.&lt;br /&gt;
&lt;br /&gt;
After it expands, the result table displays a title showing the current &amp;quot;path&amp;quot; to the result view. Ideally this title is also a valid expression that produces the same result. When you customize the expansion, you may also need to customize the expansion title. You can do this by adding a member function&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;Function TitleForExpand(Self : Tuple  atom ; subTitle : text atom ; memberNum :  optional  positive atom )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The «subTitle» is the title up to the point of this expansion, and «memberNum» exposes which cell number was expanded from the previous level.&lt;br /&gt;
&lt;br /&gt;
=== Finalizers ===&lt;br /&gt;
&lt;br /&gt;
A finalizer is a member function that is called when the struct instance value is released for last time.&lt;br /&gt;
&lt;br /&gt;
You can add a customized finalizer, for example, to ensure that a resource gets cleaned up. An example use case would be when your [[Struct]] is a temporary file, with the finalizer ensuring that the temporary file is deleted when the instance is released. This is an example where the constructor would pick a unique file name that doesn't already exist, and the finalizer calls [[FileSystemDelete]]. &lt;br /&gt;
&lt;br /&gt;
To add a finalizer, add a member function named &amp;lt;code&amp;gt;Finalizer(Self)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Finalizers should have a low probability of an error occurring while the finalizer is evaluating. In the event that an error occurs, it is not possible for Analytica to report the error, so the error will occur silently. If you do not catch it (in a [[Try]]), your full finalizer code might not run.&lt;br /&gt;
&lt;br /&gt;
=== Callable values ===&lt;br /&gt;
&lt;br /&gt;
You can make an instance of your Struct &amp;quot;''callable''&amp;quot;, such that you can call the instance using e.g.,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;inst -&amp;gt; ( x, y )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To make it callable, create a member function named &amp;lt;code&amp;gt;`()`&amp;lt;/code&amp;gt; -- make sure to include the backtics as part of the name, and no spaces between the parens. For example:&lt;br /&gt;
&lt;br /&gt;
 Function `()`( alpha, pwr )&lt;br /&gt;
 '''Definition''': (1-alpha) * Self-&amp;gt;a + alpha * [[Sum]]( b^pwr, I )&lt;br /&gt;
&lt;br /&gt;
If you do this, you can also use a [[Callable]]  object class to hold your instance (or an array of instances) and then call it using the name of your callable as if it were a normal function (even though the logical function itself is computed), e.g.,&lt;br /&gt;
&lt;br /&gt;
:[[Callable]] F1 := MyDType( x,y,z )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And call it:&lt;br /&gt;
:&amp;lt;code&amp;gt;F1(0.3, 2) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Custom atomic subscripting ===&lt;br /&gt;
Your data type can support the syntax&lt;br /&gt;
:&amp;lt;code&amp;gt;inst -&amp;gt; [n]&amp;lt;/code&amp;gt;&lt;br /&gt;
by adding a member function named &amp;lt;code&amp;gt;`[]`&amp;lt;/code&amp;gt;. It can have either one or two parameters (after &amp;lt;code&amp;gt;Self&amp;lt;/code&amp;gt;). With one parameter, only &amp;lt;code&amp;gt;inst -&amp;gt; [n]&amp;lt;/code&amp;gt; is supported (so that &amp;lt;code&amp;gt;inst -&amp;gt; [m..n]&amp;lt;/code&amp;gt; would array abstract returning a list). With two parameters, where the second parameter is optional, it can include special handling of &amp;lt;code&amp;gt;inst -&amp;gt; [m..n]&amp;lt;/code&amp;gt;, for example by returning a new collection instance of the same type. &lt;br /&gt;
&lt;br /&gt;
 Function `[]`( Self : Tuple atom ; m,n : optional number atom )&lt;br /&gt;
&lt;br /&gt;
In this example, if &amp;lt;code&amp;gt;inst -&amp;gt; [m]&amp;lt;/code&amp;gt; is called, then the «n» parameter is omitted. If &amp;lt;code&amp;gt;inst -&amp;gt; [m..n]&amp;lt;/code&amp;gt; is called, both parameters are provided. If &amp;lt;code&amp;gt;inst -&amp;gt; [m..]&amp;lt;/code&amp;gt; is called, then «n» is [[INF]]. And if &amp;lt;code&amp;gt;inst-&amp;gt;[..n]&amp;lt;/code&amp;gt; is called, then «m» is omitted.&lt;br /&gt;
&lt;br /&gt;
=== Operator overloading ===&lt;br /&gt;
&lt;br /&gt;
At present, only these operators can be overloaded by adding a member function with the given name.&lt;br /&gt;
&lt;br /&gt;
* Function `#`( Self )&lt;br /&gt;
&lt;br /&gt;
=== Overloading the &amp;lt;code&amp;gt;`-&amp;gt;`&amp;lt;/code&amp;gt; operator ===&lt;br /&gt;
&lt;br /&gt;
It is possible to overload the right-arrow operator for a Struct, intercepting attempts to read a member value or to set  a member value. &lt;br /&gt;
&lt;br /&gt;
If you only want to intercept attempts to read member values, add the following member function in your struct:&lt;br /&gt;
 Function `-&amp;gt;`( Self : '''''YourStruct''''' atom ; member : Text atom ; defVal : optional named )&lt;br /&gt;
By sure to change '''''YourStruct''''' to the actual name of your struct. This will be called when code evaluates&lt;br /&gt;
:&amp;lt;code&amp;gt;inst -&amp;gt; member&amp;lt;/code&amp;gt;&lt;br /&gt;
on an instance &amp;lt;code&amp;gt;inst&amp;lt;/code&amp;gt; of your struct. Your function can return values for members that don't actually exist, or deny members that might exist, or just intercept the read and then forward it in the usual way. &lt;br /&gt;
&lt;br /&gt;
Exceptions: Member functions with names beginning with an underscore are never intercepted (such as the special &amp;lt;code&amp;gt;inst-&amp;gt;_members&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;inst-&amp;gt;_type&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;inst-&amp;gt;_addr&amp;lt;/code&amp;gt; virtual members).  Also, calls to member local functions or member functions are never intercepted -- this intercepts member value access only.&lt;br /&gt;
&lt;br /&gt;
Your implementation of the overload will often want to access the actual members of the class. It must not use the usual arrow operator for this because that would result in an infinite recursion.  Instead, you can use the raw member access function, &amp;lt;code&amp;gt;`-&amp;gt;!`&amp;lt;/code&amp;gt;, which behaves the same same as &amp;lt;code&amp;gt;`-&amp;gt;`&amp;lt;/code&amp;gt; except that it cannot be overridden. This function can only be called using a function call syntax, it cannot be used as an infix operator. &lt;br /&gt;
&lt;br /&gt;
Here is a contrived example that makes is look like the file contents is a member value. (It would be better to just add a member function for this, but it makes for an easy example).&lt;br /&gt;
&lt;br /&gt;
 Struct TextFile( filename : Text atom )&lt;br /&gt;
 &lt;br /&gt;
 Function TextFile::`-&amp;gt;`( Self : TextFile atom ; member : Text atom ; defVal : optional named )&lt;br /&gt;
 '''Definition''':&lt;br /&gt;
 [[If]] TextLowerCase(member) = &amp;quot;contents&amp;quot; Then &lt;br /&gt;
   [[ReadTextFile]](filename)&lt;br /&gt;
 [[Else]]&lt;br /&gt;
   `-&amp;gt;!`( Self, member, defVal:defVal )&lt;br /&gt;
&lt;br /&gt;
You can also use an override of &amp;lt;code&amp;gt;`-&amp;gt;`&amp;lt;/code&amp;gt; to intercept attempts to assign to a member, such as an assignment like&lt;br /&gt;
  inst -&amp;gt; val := newVal&lt;br /&gt;
&lt;br /&gt;
A struct instance is itself immutable, so such assignments are not generally valid, but using an override you can make it appear that a member is mutable. This could be useful, for example, when using a struct to wrap an object from a different programming language, or in a web service, where members can be assigned. The overload could send the change through an API, keeping a familiar assignment syntax.&lt;br /&gt;
&lt;br /&gt;
To add an overload that can also intercept member assignments (as well as reading member values), the member function should have this signature:&lt;br /&gt;
&lt;br /&gt;
 Function `-&amp;gt;`( Self : '''''YourStruct''''' atom ; member : Text atom ; defVal : optional named ; rhs : optional named )&lt;br /&gt;
&lt;br /&gt;
Inside the definition, use &amp;lt;code&amp;gt;IsNotSpecified(rhs)&amp;lt;/code&amp;gt; to determine whether it is a read or an assignment.&lt;br /&gt;
&lt;br /&gt;
== Assignment ==&lt;br /&gt;
Sometimes a button's [[OnClick]] expression assigns a result value to a global variable. When you do so, it sets the definition of the global variable to an expression that results in the same value when evaluated. It is also an expression that can be saved with a model file.&lt;br /&gt;
&lt;br /&gt;
In the case of a Struct, this means that the expression must be a call to the Struct's constructor with parameter values that result in a logically equivalent instance. &lt;br /&gt;
&lt;br /&gt;
In the cases where you have customized constructor logic that alters what member values are actually stored, if you want assignment (and saving to a model file) to work successfully, you need to include the custom member function:&lt;br /&gt;
&lt;br /&gt;
 Function ToExpression( Self : MyStruct atom )&lt;br /&gt;
&lt;br /&gt;
This can return the textual expression that results in an equivalent value, but in general, it can be difficult to get the textual expression correct. Hence, the recommended way to implement the function is to return an instance of the generic built-in &amp;lt;code&amp;gt;_Struct&amp;lt;/code&amp;gt; with member names that correspond to your constructor parameter names.&lt;br /&gt;
&lt;br /&gt;
===  Example ===&lt;br /&gt;
&lt;br /&gt;
This example uses the [[Mutables library]].&lt;br /&gt;
&lt;br /&gt;
 Struct S( x : nonMember )&lt;br /&gt;
 '''Definition: ''' Self-&amp;gt;mutable_val := Mutable(x)&lt;br /&gt;
 &amp;amp;nbsp;&lt;br /&gt;
 Function ToExpression( Self : S atom )&lt;br /&gt;
 '''Definition:''' _Struct( x: Self-&amp;gt;mutable_val-&amp;gt;val )&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;_Struct&amp;lt;/code&amp;gt; returned has the parameter name &amp;lt;/code&amp;gt;x, which matches the parameter name in &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt;'s constructor with the value that should appear in the call to the constructor.&lt;br /&gt;
&lt;br /&gt;
When you assign a value containing an instance of &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; to a global, the definition contains something like &amp;lt;code&amp;gt;S( 'Foo' )&amp;lt;/code&amp;gt; -- a valid call to the constructor.&lt;br /&gt;
&lt;br /&gt;
=== Repeated parameters ===&lt;br /&gt;
When your constructor has a repeated parameter, you need to set the &amp;lt;code&amp;gt;_Struct&amp;lt;/code&amp;gt; element to a list, where each item in the list corresponds to one argument passed to the parameter. If all of the items that should be passed to the repeated parameter have the same dimensionality and none are a scalar reference, then a list is fine.&lt;br /&gt;
&lt;br /&gt;
 Struct S2( people : ... Text atom nonMember )&lt;br /&gt;
 '''Definition:''' Self-&amp;gt;people_ids := PersonToId( people )&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
 Function ToExpression( Self : S2 atom )&lt;br /&gt;
 '''Definition:''' &lt;br /&gt;
      Local people := IdToPerson( Self-&amp;gt;people_ids );               { This is a list of text }&lt;br /&gt;
      _Struct( people : people )&lt;br /&gt;
&lt;br /&gt;
A more nuanced case occurs when the items to the repeated parameter may have different dimensionalities. In this case, you need to take the [[reference]] of each item in the list so that its dimensions don't combine with the indexes of its sibling elements.&lt;br /&gt;
&lt;br /&gt;
 Struct S3( items : ... nonMember )&lt;br /&gt;
 '''Definition:''' &lt;br /&gt;
      Self-&amp;gt;first := items[@=1];&lt;br /&gt;
      [[Local]] refd := ([[For]] xi := repeated items Do \xi); {refs to keep dims separate}&lt;br /&gt;
      Self-&amp;gt;rest := refd[@=2..[[Size]](items,listLen:true)]&lt;br /&gt;
 &amp;amp;nbsp;&lt;br /&gt;
 Function ToExpression( Self : S3 atom )&lt;br /&gt;
 '''Definition:'''  _Struct( items : [\Self-&amp;gt;first, ...Self-&amp;gt;rest ] )&lt;br /&gt;
&lt;br /&gt;
To keep the dimensionalities separate for each item is &amp;lt;code&amp;gt;Self-&amp;gt;Rest&amp;lt;/code&amp;gt;, the constructor takes the reference of each repeated item. In &amp;lt;code&amp;gt;ToExpression&amp;lt;/code&amp;gt;, these are already references so it simply forwards them into the list for «items».&lt;br /&gt;
&lt;br /&gt;
== Immutability ==&lt;br /&gt;
The &amp;lt;code&amp;gt;Self&amp;lt;/code&amp;gt; members can be altered from within the [[Struct]] constructor, but cannot be altered once the fully-constructed instance has been returned by the constructor. From that point on, the members of a struct instance are never changed.&lt;br /&gt;
&lt;br /&gt;
However, a struct can hold a [[Mutable]] or a [[Local_functions_and_local_value_captures#Local_value_capture|captured local]] which actually makes it possible for the internal state of an instance to be changed. The mutable or the local's identity never changes, and changes to this type of internal state does not result in any downstream invalidation.&lt;br /&gt;
&lt;br /&gt;
== Generic Struct ==&lt;br /&gt;
A built-in struct named &amp;lt;code&amp;gt;_Struct&amp;lt;/code&amp;gt; (with an underscore) can be used as a generic Struct that you can instantiate on arbitrary members without having to define your own Struct object. To instantiate, every parameter must be named, but can be whatever name you want, e.g.,&lt;br /&gt;
&lt;br /&gt;
 _Struct( date:Today(), name: 'Donald', address: '1600 Pennsylvania Avenue' )&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
Examples in this section demonstrate various aspects of a Struct and member functions.&lt;br /&gt;
&lt;br /&gt;
=== Tuple ===&lt;br /&gt;
A Tuple is a ordered list of items, each item having a different dimensionality. It can be implemented as a Struct.&lt;br /&gt;
&lt;br /&gt;
To create a tuple (after the Tuple Struct is defined), use:&lt;br /&gt;
 Tuple( x, y, z )&lt;br /&gt;
with any number of values. The values passed can have different dimensionalities. The collection is held in a single cell (if you have an array of Tuples), and the dimensionalities of the items are kept separate.&lt;br /&gt;
&lt;br /&gt;
 Struct Tuple( items : ... ;&lt;br /&gt;
               direct : hidden optional named boolean atom )&lt;br /&gt;
 '''Definition''':&lt;br /&gt;
    [[If]] direct [[Then]] (&lt;br /&gt;
        [[For]] xi:= repeated items Do &lt;br /&gt;
            [[If]] [[Not]] [[IsReference]](xi) then &lt;br /&gt;
                Error(&amp;quot;When using direct:True to Tuple, all «items» must be references&amp;quot;);&lt;br /&gt;
        Self-&amp;gt;items := items&lt;br /&gt;
    ) [[Else]] (&lt;br /&gt;
        Self-&amp;gt;items := ([[For]] xi := repeated items Do \xi)&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
 Function Tuple::Length( Self : Tuple atom )&lt;br /&gt;
 '''Definition''': &lt;br /&gt;
    [[Size]]( Self-&amp;gt;items, True )&lt;br /&gt;
&lt;br /&gt;
 Function Tuple::Expand ( Self : Tuple atom )&lt;br /&gt;
 '''Definition''':&lt;br /&gt;
    [[Local]] i:=f&amp;quot;[{1..[[size]](Self-&amp;gt;items)}]&amp;quot;;&lt;br /&gt;
    [[For]] ii:=@i do (&lt;br /&gt;
        [[Local]] xi := #(Self-&amp;gt;items[@=ii]);&lt;br /&gt;
        [[If]] [[Size]]([[IndexesOf]](xi))&amp;gt;0 then&lt;br /&gt;
            _HyperlinkedCellValue(xi)&lt;br /&gt;
        [[Else]]&lt;br /&gt;
             xi&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
 Function Tuple::`[]`(Self : Tuple atom ; m,n : optional number atom )&lt;br /&gt;
 '''Definition''':&lt;br /&gt;
    [[If]] [[IsNotSpecified]](n) Then &lt;br /&gt;
        #(Self-&amp;gt;items[@=m,defVal:Null])&lt;br /&gt;
    [[Else]] (&lt;br /&gt;
        [[If]] [[IsNotSpecified]](m) [[Then]] m := 1;&lt;br /&gt;
        [[If]] n&amp;gt;[[Size]](Self-&amp;gt;items) [[Then]] n := [[Size]](Self-&amp;gt;items);&lt;br /&gt;
        Tuple( ...Self-&amp;gt;items[@=m..n], direct:True )&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
 Function Tuple::TitleForExpand(Self : Tuple  atom ; subTitle : text atom ; memberNum :  optional  positive atom )&lt;br /&gt;
 '''Definition''':&lt;br /&gt;
    [[If]] [[IsNotSpecified]](memberNum) [[Then]]&lt;br /&gt;
        f&amp;quot;{subTitle}-&amp;gt;&amp;quot;&lt;br /&gt;
    [[Else]]&lt;br /&gt;
        f&amp;quot;{subTitle}-&amp;gt;[{memberNum:I}]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 Function Tuple::ToExpression( Self : Tuple atom )&lt;br /&gt;
 '''Definition''': _Struct( items: Self-&amp;gt;items )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Reference ===&lt;br /&gt;
This example demonstrates how a [[reference]] could be implemented using Struct if it weren't already built into the Analytica language. Note that the keywords Ref and Reference are already in use, so we need to pick a different name.&lt;br /&gt;
&lt;br /&gt;
 Struct _Ref( r : [I] ; I : optional ... index = common )&lt;br /&gt;
&lt;br /&gt;
 Function _Ref::`#`( Self : _Ref atom )&lt;br /&gt;
 '''Definition''': Self-&amp;gt;r&lt;br /&gt;
&lt;br /&gt;
 Function _Ref::Expand( Self : _Ref atom )&lt;br /&gt;
 '''Definition''': `#`(Self)&lt;br /&gt;
&lt;br /&gt;
 Function _Ref::TitleForExpand(Self : _Ref atom ; subTitle : text atom ; memberNum :  optional  positive atom )&lt;br /&gt;
 '''Definition''':&lt;br /&gt;
            f&amp;quot;#{subTitle}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Arrow operator]]&lt;br /&gt;
* [[Callable]]&lt;br /&gt;
* [[User-Defined Functions]]&lt;br /&gt;
* [[Function Parameter Qualifiers]]&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
	<entry>
		<id>https://docs.analytica.com/index.php?title=Struct&amp;diff=63551</id>
		<title>Struct</title>
		<link rel="alternate" type="text/html" href="https://docs.analytica.com/index.php?title=Struct&amp;diff=63551"/>
		<updated>2025-12-13T21:32:20Z</updated>

		<summary type="html">&lt;p&gt;Mhenrion: /* Defining a Struct */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:Objects]]&lt;br /&gt;
[[category:Variables]]&lt;br /&gt;
''new to [[Analytica 7.0]]''&lt;br /&gt;
&lt;br /&gt;
Most programming languages have a way to bundle a set of disparate data into a packet, often called Records, Classes, or  Structs. In Analytica, you can do this using an array with an [[Index]], but this doesn't work so well if the values in the array are disparate, for example, if they include numbers, text, references to other data, or array values with different dimensions.  For example, if you want to create lists or hierarchies,  represent JSON data or html.  Thta's why Analytica has introduced Structs to represent these kinds of data structures. &lt;br /&gt;
&lt;br /&gt;
A struct instance can have multiple member fields,  which can be of varioust data types and dimensionality. For example, a struct could have a scalar member, a 1-D member and a 2-D member, where the dimensions of the members are unrelated. Each struct value is treated as an atomic element, and it does not apply Array abstraction within the Struct.&lt;br /&gt;
&lt;br /&gt;
== Struct class ==&lt;br /&gt;
&lt;br /&gt;
A [[Struct]] object defines a new atomic data type.  It appears on a diagram with a shape that resembles a function, but with flat midsections on both the left and right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[image:MyDtype_Struct.png]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After you define a [[Struct]], you can create instances of it. Instances are ''atomic'' and ''immutable'': ''Atomic''meaning that [[Array Abstraction]] treats it as a single cell -- even though it may have multiple elements.''Immutable'' meaning that, it cannot be destructively altered after it's been created.&lt;br /&gt;
&lt;br /&gt;
A [[Struct]] is an [[Objects and Values|Object]]. An instance of a struct is a [[Objects and Values|Value]].&lt;br /&gt;
&lt;br /&gt;
== When to use a Struct ==&lt;br /&gt;
&lt;br /&gt;
These are examples of when a Struct may be convenient:&lt;br /&gt;
* Representing hierarchical data, such as from html or JSON.&lt;br /&gt;
&lt;br /&gt;
* If your data type should act as if it is an opaque atomic unit, and especially if there are multiple internal items, then a [[Struct]] is a good candidate. A struct can also provide one way to [[Returning multiple values|return multiple return values]] with differing dimensionalities as an alternative to capturing multiple return values.&lt;br /&gt;
&lt;br /&gt;
* Passing complex data structures between many user-defined functions.&lt;br /&gt;
&lt;br /&gt;
* When you want to enforce a distinction that does not exist in Analytica, but might exist in another platform or service that you are integrating with. &lt;br /&gt;
&lt;br /&gt;
== Defining a Struct ==&lt;br /&gt;
To create an object whose class is [[Struct]], you can first create a [[UDF|user function]] object, and then change its class to &amp;lt;code&amp;gt;Struct&amp;lt;/code&amp;gt; in its [[Object window]] or [[Attribute window]].&lt;br /&gt;
&lt;br /&gt;
A Struct uses the [[Parameters]] attribute with just the same [[Function Parameter Qualifiers]] as a [[User-Defined Function]] (UDF)., for example:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;Struct MyDtype( a : atom ; b : Text [I] ; c: Number[J] )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This data type has three members -- &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;. The &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; field can have any atomic data type, the &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; member must be text and may have the index &amp;lt;code&amp;gt;I&amp;lt;/code&amp;gt;, and the &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; member must be a numeric and may have index &amp;lt;code&amp;gt;J&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
The default [[Definition]] of a Struct is &amp;lt;code&amp;gt;Self&amp;lt;/code&amp;gt;.  Sometimes it makes sense to include a more specialized definition -- see [[#Constructor customization]] below.&lt;br /&gt;
&lt;br /&gt;
== Instantiating a value ==&lt;br /&gt;
&lt;br /&gt;
To create an instance of a Struct, you simply call the name of your struct as if it were a function from within an expression. In the previous example, that might be:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;MyDtype( Category, Category_aliases, Category_IDs )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If any of the values passed to the constructor parameters have extra indexes (dimensions), [[Array Abstraction]] kicks in and creates an array of struct instances over those extra indexes.&lt;br /&gt;
&lt;br /&gt;
== Accessing member values ==&lt;br /&gt;
Use the [[Arrow operator]] to access a member values of a Struct. E.g.,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;inst -&amp;gt; b&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where &amp;lt;code&amp;gt;inst&amp;lt;/code&amp;gt; was obtained by calling the Struct.&lt;br /&gt;
&lt;br /&gt;
The left-hand side of the arrow can be a single instance, an array of instances, or even [[Null]].  The right-hand side of the arrow is the name of a member value.&lt;br /&gt;
&lt;br /&gt;
== Member functions ==&lt;br /&gt;
&lt;br /&gt;
You can introduce your own ''member functions'' that are called using the syntax:&lt;br /&gt;
:&amp;lt;code&amp;gt;inst -&amp;gt; F(x, y)&amp;lt;/code&amp;gt;&lt;br /&gt;
The parameters are limited to be passed by values (e.g., no Index parameters). Keep in mind that the instance is immutable so these functions can't usually modify the internal state of the instance (see Section [[#Immutability]] for exceptions).&lt;br /&gt;
&lt;br /&gt;
To create your own ''member function'', open up  the [[Struct]]'s diagram (as you would open up the diagram of a Module node) and drag a Function object to the diagram. In its [[Object window]], set the parameters ensuring that the first parameter is declared as, e.g., &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;Function F( Self : MyDtype atom ; param1  ; param2 )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first parameter should be named &amp;lt;code&amp;gt;Self&amp;lt;/code&amp;gt; and should have the Struct  name as its data type and the [[Objects and Values|atom]] qualifier. You can have zero or more additional parameters -- these are the ones passed to the function when it is called using the syntax &amp;lt;code&amp;gt;inst &amp;amp;rarr; F(x,y)&amp;lt;/code&amp;gt;. These parameters can have any data type qualifier, dimensionality declaration; however,  for now they cannot handle [[Function_parameter_qualifiers#Evaluation_Mode_Qualifiers|evaluation mode qualifiers]] or [[Function_parameter_qualifiers#Object_Class_Qualifiers|Object class qualifiers]].&lt;br /&gt;
&lt;br /&gt;
You can also introduce global variables that are &amp;quot;private&amp;quot; to the Struct and its member functions by adding normal variable nodes to the diagram. Note that these are contained in the Struct definition, not in each instance (to have a value that varies with each instance, you must use a member value.&lt;br /&gt;
&lt;br /&gt;
== Constructor customization ==&lt;br /&gt;
The member values of an instance are usually the parameter names that appear in the [[Parameter]] attribute of the struct (its Constructor's parameter names). However, in some use cases the constructor may change the member values, such as by adding new members, transforming the named members, or even removing members. These changes must be performed in the [[Definition]] of the constructor.&lt;br /&gt;
&lt;br /&gt;
When you first view the [[Object window]] of a [[Struct]], the [[Definition]] might not be visible (because altering the member values is somewhat esoteric). If you don't see it, use the [[Object_Window#Selecting_Attributes_to_Display|Attribute visibility popup]] to make it visible.&lt;br /&gt;
&lt;br /&gt;
Inside the constructor (and only in the constructor) the members can be assigned.  For example:&lt;br /&gt;
&lt;br /&gt;
 [[Struct]] MyDType( a : atom ; b : Text [I] ; c : Number [J] )&lt;br /&gt;
 '''Definition''': &lt;br /&gt;
        Self -&amp;gt; creationTime := [[Today]](true);&lt;br /&gt;
        Self -&amp;gt; c := c / [[Sum]](C,  J);&lt;br /&gt;
        Self&lt;br /&gt;
&lt;br /&gt;
The final value is always &amp;lt;code&amp;gt;Self&amp;lt;/code&amp;gt; whether or not your Definition actually returns &amp;lt;code&amp;gt;Self&amp;lt;/code&amp;gt;, although it is clearer to do. Notice that in this example, it adds a new member value, &amp;lt;code&amp;gt;creationTime&amp;lt;/code&amp;gt;, and changes the member value &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; to the normalized value.&lt;br /&gt;
&lt;br /&gt;
When you change the member values in the constructor, you should consider whether you will ever assign values of your Struct to a definition or other expression attribute, or whether instances will even need to be saved directly in the model file. These cases require a text representation that is valid expression and which results in an equivalent instance. In the event that you alter the members, you may need to add a custom [[#ExpressionText]] member function that prints out a constructor call expression.&lt;br /&gt;
&lt;br /&gt;
== Using an excess parameter in the constructor ==&lt;br /&gt;
&lt;br /&gt;
An ''excess parameter'' is a catch-all parameter that allows the caller to include named parameters that aren't listed in the parameters. It can be either named or unnamed.&lt;br /&gt;
&lt;br /&gt;
The constructor has an unnamed excess parameter when the last parameter is named &amp;lt;code&amp;gt;&amp;quot;...&amp;quot;&amp;lt;/code&amp;gt;. For example,&lt;br /&gt;
&lt;br /&gt;
 [[Struct]] MyDType2( a : atom ; b : Text[I] ; ... )&lt;br /&gt;
&lt;br /&gt;
When declared in this fashion, a caller can specify parameters other than &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;, for example:&lt;br /&gt;
&lt;br /&gt;
 MyDType2( a:5, b:f&amp;quot;I={I}&amp;quot;, c:14, d:=J^2 )&lt;br /&gt;
&lt;br /&gt;
When an unnamed excess parameter is used in this way, the additional parameters are automatically added as members. Hence, in this example, &amp;lt;code&amp;gt;MyDType2&amp;lt;/code&amp;gt; has members &amp;lt;code&amp;gt;['a', 'b', 'c', 'd']&amp;lt;/code&amp;gt;. Because the excess parameter is unnamed, there is no way to refer to it in the constructor's definition. &lt;br /&gt;
&lt;br /&gt;
To specify that the excess parameters not be added to the struct instance, you can use&lt;br /&gt;
 [[Struct]] MyDType3( a : atom ; b : Text[I] ; ... : nonMember )&lt;br /&gt;
&lt;br /&gt;
A ''named excess parameter'' is declared using a named that starts with &amp;lt;code&amp;gt;&amp;quot;...&amp;quot;&amp;lt;/code&amp;gt;, which again must be the last parameter in the declaration. For example,&lt;br /&gt;
&lt;br /&gt;
 [[Struct]] MyDType3( a : atom ; b : Text[I] ; ...kw )&lt;br /&gt;
&lt;br /&gt;
Inside the constructor's definition, it can now refer to the local variable &amp;lt;code&amp;gt;kw&amp;lt;/code&amp;gt;. The value of &amp;lt;code&amp;gt;kw&amp;lt;/code&amp;gt; is itself a struct instance where each argument is a member. For example, when called as&lt;br /&gt;
 MyDType3( a:5, b:f&amp;quot;{I}&amp;quot;, y:43, z:'hello' )&lt;br /&gt;
The Definition of MyDType3 could reference &amp;lt;code&amp;gt;kw-&amp;gt;y&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;kw-&amp;gt;z&amp;lt;/code&amp;gt; when called in this example; however, those would fail with an error when &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;z&amp;lt;/code&amp;gt; is not specified.&lt;br /&gt;
&lt;br /&gt;
== Equality and comparison ==&lt;br /&gt;
&lt;br /&gt;
Two struct instances are equal (i.e., &amp;lt;code&amp;gt;s1=s2&amp;lt;/code&amp;gt; is true) only when they are of the same Struct, have the same member names and have the same  member values. In other words, &amp;lt;code&amp;gt;s1=s2&amp;lt;/code&amp;gt; is based on &amp;quot;deep equality&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Shallow equality tests whether two instances are the exact same instance (as opposed to whether the two instances are equal). The following can be used to test whether two instances are the exact same instance:&lt;br /&gt;
:&amp;lt;code&amp;gt;s1-&amp;gt;_addr = s2-&amp;gt;_addr&amp;lt;/code&amp;gt;&lt;br /&gt;
The special &amp;lt;code&amp;gt;_addr&amp;lt;/code&amp;gt; member value returns an integer that is unique to each instance.&lt;br /&gt;
&lt;br /&gt;
Inequality comparisons are also based on the &amp;quot;deep&amp;quot; member values, based on the internal member value ordering.&lt;br /&gt;
&lt;br /&gt;
== Basic properties about an instance ==&lt;br /&gt;
&lt;br /&gt;
You can get a list of the member value names using:&lt;br /&gt;
:&amp;lt;code&amp;gt;inst -&amp;gt; _members&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can test whether it has a given member using:&lt;br /&gt;
:&amp;lt;code&amp;gt;inst -&amp;gt; Has('name')&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you have the name of a member value as text in a variable memberName, you can access its value using:&lt;br /&gt;
:&amp;lt;code&amp;gt;`-&amp;gt;`( inst, memberName )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With this syntax, you can also specify a default value to use when the instance does not have the specified name by specifying the optional «defVal» parameter:&lt;br /&gt;
:&amp;lt;code&amp;gt;`-&amp;gt;`( inst, memberName, defVal: Null )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that it wouldn't work to write &amp;lt;code&amp;gt;inst -&amp;gt; memberName&amp;lt;/code&amp;gt; because that would look for a member value named &amp;quot;memberName&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
You can get a handle to the instance's Struct object using&lt;br /&gt;
:&amp;lt;code&amp;gt;inst -&amp;gt; _type&amp;lt;/code&amp;gt;&lt;br /&gt;
You can get the name of the Struct (without a [[Namespaces|namespace]] prefix) from &amp;lt;code&amp;gt;[[TypeOf]](inst)&amp;lt;/code&amp;gt;. You can detect that an atom is a struct instance using&lt;br /&gt;
:&amp;lt;code&amp;gt;[[TypeOf]]( inst, shallow:true ) = &amp;quot;Struct&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Special member functions ==&lt;br /&gt;
&lt;br /&gt;
You can customize the behavior of your struct instances by adding special member functions (with reserved member function names). You add these as you would your own member functions to your Struct's diagram using the reserved name. Your implementation must match the required parameters for the special function.&lt;br /&gt;
&lt;br /&gt;
=== Customizing how a value is printed ===&lt;br /&gt;
My default, an instance of your Struct will display in a result table cell or in the [[Typescript window|Typescript console]] as, e.g., &amp;lt;code&amp;gt;«YourStructName»&amp;lt;/code&amp;gt;. You can customize this by adding a member function named &amp;lt;code&amp;gt;DisplayName&amp;lt;/code&amp;gt;. E.g., &lt;br /&gt;
&lt;br /&gt;
 Function DisplayName( Self : MyDtype atom )&lt;br /&gt;
 '''Definition''': f&amp;quot;«{[[TypeOf]](Self)} a={Self-&amp;gt;a}»&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Because &amp;lt;code&amp;gt;DisplayName&amp;lt;/code&amp;gt; occurs while individual cells are drawing on the screen, errors that occur while it is evaluating are not displayed. If an error occurs, it will silently fall back to the default display name.&lt;br /&gt;
&lt;br /&gt;
When your instance is &amp;quot;printed&amp;quot; to an expression (e.g., as a result of an assignment),  you need to ensure that the text is a valid expression that creates a logically equivalent instance. This happens by default unless you alter the members in your constructor (see [[#Constructor customization]] above). To control this, add a member function name &amp;lt;code&amp;gt;ExpressionText(Self)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Value expansion (in a result table) ===&lt;br /&gt;
When a struct instance appears in the cell of a result table, it appears as a hyperlink. Double clicking on it expands the value. By default, it expands into the member values. You can change this by adding a member function named  &amp;lt;code&amp;gt;Expand(Self)&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Your expansion code cannot simply create an array of your member values (assuming they have different dimensionalities) since this would combine their dimensions.  Instead, you should wrap each non-atomic value in &amp;lt;code&amp;gt;_HyperlinkedCellvalue&amp;lt;/code&amp;gt;. For example:&lt;br /&gt;
&lt;br /&gt;
 Function Expand( Self )&lt;br /&gt;
 '''Definition''': [ 'a' : Self-&amp;gt;a, &lt;br /&gt;
               'b' : _HyperlinkedCellValue( Self-&amp;gt;b ), &lt;br /&gt;
               'c' : _HyperlinkedCellValue( Self-&amp;gt;c ) ]&lt;br /&gt;
&lt;br /&gt;
You can also introduce a local index for the expansion.&lt;br /&gt;
&lt;br /&gt;
After it expands, the result table displays a title showing the current &amp;quot;path&amp;quot; to the result view. Ideally this title is also a valid expression that produces the same result. When you customize the expansion, you may also need to customize the expansion title. You can do this by adding a member function&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;Function TitleForExpand(Self : Tuple  atom ; subTitle : text atom ; memberNum :  optional  positive atom )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The «subTitle» is the title up to the point of this expansion, and «memberNum» exposes which cell number was expanded from the previous level.&lt;br /&gt;
&lt;br /&gt;
=== Finalizers ===&lt;br /&gt;
&lt;br /&gt;
A finalizer is a member function that is called when the struct instance value is released for last time.&lt;br /&gt;
&lt;br /&gt;
You can add a customized finalizer, for example, to ensure that a resource gets cleaned up. An example use case would be when your [[Struct]] is a temporary file, with the finalizer ensuring that the temporary file is deleted when the instance is released. This is an example where the constructor would pick a unique file name that doesn't already exist, and the finalizer calls [[FileSystemDelete]]. &lt;br /&gt;
&lt;br /&gt;
To add a finalizer, add a member function named &amp;lt;code&amp;gt;Finalizer(Self)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Finalizers should have a low probability of an error occurring while the finalizer is evaluating. In the event that an error occurs, it is not possible for Analytica to report the error, so the error will occur silently. If you do not catch it (in a [[Try]]), your full finalizer code might not run.&lt;br /&gt;
&lt;br /&gt;
=== Callable values ===&lt;br /&gt;
&lt;br /&gt;
You can make an instance of your Struct &amp;quot;''callable''&amp;quot;, such that you can call the instance using e.g.,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;inst -&amp;gt; ( x, y )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To make it callable, create a member function named &amp;lt;code&amp;gt;`()`&amp;lt;/code&amp;gt; -- make sure to include the backtics as part of the name, and no spaces between the parens. For example:&lt;br /&gt;
&lt;br /&gt;
 Function `()`( alpha, pwr )&lt;br /&gt;
 '''Definition''': (1-alpha) * Self-&amp;gt;a + alpha * [[Sum]]( b^pwr, I )&lt;br /&gt;
&lt;br /&gt;
If you do this, you can also use a [[Callable]]  object class to hold your instance (or an array of instances) and then call it using the name of your callable as if it were a normal function (even though the logical function itself is computed), e.g.,&lt;br /&gt;
&lt;br /&gt;
:[[Callable]] F1 := MyDType( x,y,z )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And call it:&lt;br /&gt;
:&amp;lt;code&amp;gt;F1(0.3, 2) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Custom atomic subscripting ===&lt;br /&gt;
Your data type can support the syntax&lt;br /&gt;
:&amp;lt;code&amp;gt;inst -&amp;gt; [n]&amp;lt;/code&amp;gt;&lt;br /&gt;
by adding a member function named &amp;lt;code&amp;gt;`[]`&amp;lt;/code&amp;gt;. It can have either one or two parameters (after &amp;lt;code&amp;gt;Self&amp;lt;/code&amp;gt;). With one parameter, only &amp;lt;code&amp;gt;inst -&amp;gt; [n]&amp;lt;/code&amp;gt; is supported (so that &amp;lt;code&amp;gt;inst -&amp;gt; [m..n]&amp;lt;/code&amp;gt; would array abstract returning a list). With two parameters, where the second parameter is optional, it can include special handling of &amp;lt;code&amp;gt;inst -&amp;gt; [m..n]&amp;lt;/code&amp;gt;, for example by returning a new collection instance of the same type. &lt;br /&gt;
&lt;br /&gt;
 Function `[]`( Self : Tuple atom ; m,n : optional number atom )&lt;br /&gt;
&lt;br /&gt;
In this example, if &amp;lt;code&amp;gt;inst -&amp;gt; [m]&amp;lt;/code&amp;gt; is called, then the «n» parameter is omitted. If &amp;lt;code&amp;gt;inst -&amp;gt; [m..n]&amp;lt;/code&amp;gt; is called, both parameters are provided. If &amp;lt;code&amp;gt;inst -&amp;gt; [m..]&amp;lt;/code&amp;gt; is called, then «n» is [[INF]]. And if &amp;lt;code&amp;gt;inst-&amp;gt;[..n]&amp;lt;/code&amp;gt; is called, then «m» is omitted.&lt;br /&gt;
&lt;br /&gt;
=== Operator overloading ===&lt;br /&gt;
&lt;br /&gt;
At present, only these operators can be overloaded by adding a member function with the given name.&lt;br /&gt;
&lt;br /&gt;
* Function `#`( Self )&lt;br /&gt;
&lt;br /&gt;
=== Overloading the &amp;lt;code&amp;gt;`-&amp;gt;`&amp;lt;/code&amp;gt; operator ===&lt;br /&gt;
&lt;br /&gt;
It is possible to overload the right-arrow operator for a Struct, intercepting attempts to read a member value or to set  a member value. &lt;br /&gt;
&lt;br /&gt;
If you only want to intercept attempts to read member values, add the following member function in your struct:&lt;br /&gt;
 Function `-&amp;gt;`( Self : '''''YourStruct''''' atom ; member : Text atom ; defVal : optional named )&lt;br /&gt;
By sure to change '''''YourStruct''''' to the actual name of your struct. This will be called when code evaluates&lt;br /&gt;
:&amp;lt;code&amp;gt;inst -&amp;gt; member&amp;lt;/code&amp;gt;&lt;br /&gt;
on an instance &amp;lt;code&amp;gt;inst&amp;lt;/code&amp;gt; of your struct. Your function can return values for members that don't actually exist, or deny members that might exist, or just intercept the read and then forward it in the usual way. &lt;br /&gt;
&lt;br /&gt;
Exceptions: Member functions with names beginning with an underscore are never intercepted (such as the special &amp;lt;code&amp;gt;inst-&amp;gt;_members&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;inst-&amp;gt;_type&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;inst-&amp;gt;_addr&amp;lt;/code&amp;gt; virtual members).  Also, calls to member local functions or member functions are never intercepted -- this intercepts member value access only.&lt;br /&gt;
&lt;br /&gt;
Your implementation of the overload will often want to access the actual members of the class. It must not use the usual arrow operator for this because that would result in an infinite recursion.  Instead, you can use the raw member access function, &amp;lt;code&amp;gt;`-&amp;gt;!`&amp;lt;/code&amp;gt;, which behaves the same same as &amp;lt;code&amp;gt;`-&amp;gt;`&amp;lt;/code&amp;gt; except that it cannot be overridden. This function can only be called using a function call syntax, it cannot be used as an infix operator. &lt;br /&gt;
&lt;br /&gt;
Here is a contrived example that makes is look like the file contents is a member value. (It would be better to just add a member function for this, but it makes for an easy example).&lt;br /&gt;
&lt;br /&gt;
 Struct TextFile( filename : Text atom )&lt;br /&gt;
 &lt;br /&gt;
 Function TextFile::`-&amp;gt;`( Self : TextFile atom ; member : Text atom ; defVal : optional named )&lt;br /&gt;
 '''Definition''':&lt;br /&gt;
 [[If]] TextLowerCase(member) = &amp;quot;contents&amp;quot; Then &lt;br /&gt;
   [[ReadTextFile]](filename)&lt;br /&gt;
 [[Else]]&lt;br /&gt;
   `-&amp;gt;!`( Self, member, defVal:defVal )&lt;br /&gt;
&lt;br /&gt;
You can also use an override of &amp;lt;code&amp;gt;`-&amp;gt;`&amp;lt;/code&amp;gt; to intercept attempts to assign to a member, such as an assignment like&lt;br /&gt;
  inst -&amp;gt; val := newVal&lt;br /&gt;
&lt;br /&gt;
A struct instance is itself immutable, so such assignments are not generally valid, but using an override you can make it appear that a member is mutable. This could be useful, for example, when using a struct to wrap an object from a different programming language, or in a web service, where members can be assigned. The overload could send the change through an API, keeping a familiar assignment syntax.&lt;br /&gt;
&lt;br /&gt;
To add an overload that can also intercept member assignments (as well as reading member values), the member function should have this signature:&lt;br /&gt;
&lt;br /&gt;
 Function `-&amp;gt;`( Self : '''''YourStruct''''' atom ; member : Text atom ; defVal : optional named ; rhs : optional named )&lt;br /&gt;
&lt;br /&gt;
Inside the definition, use &amp;lt;code&amp;gt;IsNotSpecified(rhs)&amp;lt;/code&amp;gt; to determine whether it is a read or an assignment.&lt;br /&gt;
&lt;br /&gt;
== Assignment ==&lt;br /&gt;
Sometimes a button's [[OnClick]] expression assigns a result value to a global variable. When you do so, it sets the definition of the global variable to an expression that results in the same value when evaluated. It is also an expression that can be saved with a model file.&lt;br /&gt;
&lt;br /&gt;
In the case of a Struct, this means that the expression must be a call to the Struct's constructor with parameter values that result in a logically equivalent instance. &lt;br /&gt;
&lt;br /&gt;
In the cases where you have customized constructor logic that alters what member values are actually stored, if you want assignment (and saving to a model file) to work successfully, you need to include the custom member function:&lt;br /&gt;
&lt;br /&gt;
 Function ToExpression( Self : MyStruct atom )&lt;br /&gt;
&lt;br /&gt;
This can return the textual expression that results in an equivalent value, but in general, it can be difficult to get the textual expression correct. Hence, the recommended way to implement the function is to return an instance of the generic built-in &amp;lt;code&amp;gt;_Struct&amp;lt;/code&amp;gt; with member names that correspond to your constructor parameter names.&lt;br /&gt;
&lt;br /&gt;
===  Example ===&lt;br /&gt;
&lt;br /&gt;
This example uses the [[Mutables library]].&lt;br /&gt;
&lt;br /&gt;
 Struct S( x : nonMember )&lt;br /&gt;
 '''Definition: ''' Self-&amp;gt;mutable_val := Mutable(x)&lt;br /&gt;
 &amp;amp;nbsp;&lt;br /&gt;
 Function ToExpression( Self : S atom )&lt;br /&gt;
 '''Definition:''' _Struct( x: Self-&amp;gt;mutable_val-&amp;gt;val )&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;_Struct&amp;lt;/code&amp;gt; returned has the parameter name &amp;lt;/code&amp;gt;x, which matches the parameter name in &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt;'s constructor with the value that should appear in the call to the constructor.&lt;br /&gt;
&lt;br /&gt;
When you assign a value containing an instance of &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; to a global, the definition contains something like &amp;lt;code&amp;gt;S( 'Foo' )&amp;lt;/code&amp;gt; -- a valid call to the constructor.&lt;br /&gt;
&lt;br /&gt;
=== Repeated parameters ===&lt;br /&gt;
When your constructor has a repeated parameter, you need to set the &amp;lt;code&amp;gt;_Struct&amp;lt;/code&amp;gt; element to a list, where each item in the list corresponds to one argument passed to the parameter. If all of the items that should be passed to the repeated parameter have the same dimensionality and none are a scalar reference, then a list is fine.&lt;br /&gt;
&lt;br /&gt;
 Struct S2( people : ... Text atom nonMember )&lt;br /&gt;
 '''Definition:''' Self-&amp;gt;people_ids := PersonToId( people )&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
 Function ToExpression( Self : S2 atom )&lt;br /&gt;
 '''Definition:''' &lt;br /&gt;
      Local people := IdToPerson( Self-&amp;gt;people_ids );               { This is a list of text }&lt;br /&gt;
      _Struct( people : people )&lt;br /&gt;
&lt;br /&gt;
A more nuanced case occurs when the items to the repeated parameter may have different dimensionalities. In this case, you need to take the [[reference]] of each item in the list so that its dimensions don't combine with the indexes of its sibling elements.&lt;br /&gt;
&lt;br /&gt;
 Struct S3( items : ... nonMember )&lt;br /&gt;
 '''Definition:''' &lt;br /&gt;
      Self-&amp;gt;first := items[@=1];&lt;br /&gt;
      [[Local]] refd := ([[For]] xi := repeated items Do \xi); {refs to keep dims separate}&lt;br /&gt;
      Self-&amp;gt;rest := refd[@=2..[[Size]](items,listLen:true)]&lt;br /&gt;
 &amp;amp;nbsp;&lt;br /&gt;
 Function ToExpression( Self : S3 atom )&lt;br /&gt;
 '''Definition:'''  _Struct( items : [\Self-&amp;gt;first, ...Self-&amp;gt;rest ] )&lt;br /&gt;
&lt;br /&gt;
To keep the dimensionalities separate for each item is &amp;lt;code&amp;gt;Self-&amp;gt;Rest&amp;lt;/code&amp;gt;, the constructor takes the reference of each repeated item. In &amp;lt;code&amp;gt;ToExpression&amp;lt;/code&amp;gt;, these are already references so it simply forwards them into the list for «items».&lt;br /&gt;
&lt;br /&gt;
== Immutability ==&lt;br /&gt;
The &amp;lt;code&amp;gt;Self&amp;lt;/code&amp;gt; members can be altered from within the [[Struct]] constructor, but cannot be altered once the fully-constructed instance has been returned by the constructor. From that point on, the members of a struct instance are never changed.&lt;br /&gt;
&lt;br /&gt;
However, a struct can hold a [[Mutable]] or a [[Local_functions_and_local_value_captures#Local_value_capture|captured local]] which actually makes it possible for the internal state of an instance to be changed. The mutable or the local's identity never changes, and changes to this type of internal state does not result in any downstream invalidation.&lt;br /&gt;
&lt;br /&gt;
== Generic Struct ==&lt;br /&gt;
A built-in struct named &amp;lt;code&amp;gt;_Struct&amp;lt;/code&amp;gt; (with an underscore) can be used as a generic Struct that you can instantiate on arbitrary members without having to define your own Struct object. To instantiate, every parameter must be named, but can be whatever name you want, e.g.,&lt;br /&gt;
&lt;br /&gt;
 _Struct( date:Today(), name: 'Donald', address: '1600 Pennsylvania Avenue' )&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
Examples in this section demonstrate various aspects of a Struct and member functions.&lt;br /&gt;
&lt;br /&gt;
=== Tuple ===&lt;br /&gt;
A Tuple is a ordered list of items, each item having a different dimensionality. It can be implemented as a Struct.&lt;br /&gt;
&lt;br /&gt;
To create a tuple (after the Tuple Struct is defined), use:&lt;br /&gt;
 Tuple( x, y, z )&lt;br /&gt;
with any number of values. The values passed can have different dimensionalities. The collection is held in a single cell (if you have an array of Tuples), and the dimensionalities of the items are kept separate.&lt;br /&gt;
&lt;br /&gt;
 Struct Tuple( items : ... ;&lt;br /&gt;
               direct : hidden optional named boolean atom )&lt;br /&gt;
 '''Definition''':&lt;br /&gt;
    [[If]] direct [[Then]] (&lt;br /&gt;
        [[For]] xi:= repeated items Do &lt;br /&gt;
            [[If]] [[Not]] [[IsReference]](xi) then &lt;br /&gt;
                Error(&amp;quot;When using direct:True to Tuple, all «items» must be references&amp;quot;);&lt;br /&gt;
        Self-&amp;gt;items := items&lt;br /&gt;
    ) [[Else]] (&lt;br /&gt;
        Self-&amp;gt;items := ([[For]] xi := repeated items Do \xi)&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
 Function Tuple::Length( Self : Tuple atom )&lt;br /&gt;
 '''Definition''': &lt;br /&gt;
    [[Size]]( Self-&amp;gt;items, True )&lt;br /&gt;
&lt;br /&gt;
 Function Tuple::Expand ( Self : Tuple atom )&lt;br /&gt;
 '''Definition''':&lt;br /&gt;
    [[Local]] i:=f&amp;quot;[{1..[[size]](Self-&amp;gt;items)}]&amp;quot;;&lt;br /&gt;
    [[For]] ii:=@i do (&lt;br /&gt;
        [[Local]] xi := #(Self-&amp;gt;items[@=ii]);&lt;br /&gt;
        [[If]] [[Size]]([[IndexesOf]](xi))&amp;gt;0 then&lt;br /&gt;
            _HyperlinkedCellValue(xi)&lt;br /&gt;
        [[Else]]&lt;br /&gt;
             xi&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
 Function Tuple::`[]`(Self : Tuple atom ; m,n : optional number atom )&lt;br /&gt;
 '''Definition''':&lt;br /&gt;
    [[If]] [[IsNotSpecified]](n) Then &lt;br /&gt;
        #(Self-&amp;gt;items[@=m,defVal:Null])&lt;br /&gt;
    [[Else]] (&lt;br /&gt;
        [[If]] [[IsNotSpecified]](m) [[Then]] m := 1;&lt;br /&gt;
        [[If]] n&amp;gt;[[Size]](Self-&amp;gt;items) [[Then]] n := [[Size]](Self-&amp;gt;items);&lt;br /&gt;
        Tuple( ...Self-&amp;gt;items[@=m..n], direct:True )&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
 Function Tuple::TitleForExpand(Self : Tuple  atom ; subTitle : text atom ; memberNum :  optional  positive atom )&lt;br /&gt;
 '''Definition''':&lt;br /&gt;
    [[If]] [[IsNotSpecified]](memberNum) [[Then]]&lt;br /&gt;
        f&amp;quot;{subTitle}-&amp;gt;&amp;quot;&lt;br /&gt;
    [[Else]]&lt;br /&gt;
        f&amp;quot;{subTitle}-&amp;gt;[{memberNum:I}]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 Function Tuple::ToExpression( Self : Tuple atom )&lt;br /&gt;
 '''Definition''': _Struct( items: Self-&amp;gt;items )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Reference ===&lt;br /&gt;
This example demonstrates how a [[reference]] could be implemented using Struct if it weren't already built into the Analytica language. Note that the keywords Ref and Reference are already in use, so we need to pick a different name.&lt;br /&gt;
&lt;br /&gt;
 Struct _Ref( r : [I] ; I : optional ... index = common )&lt;br /&gt;
&lt;br /&gt;
 Function _Ref::`#`( Self : _Ref atom )&lt;br /&gt;
 '''Definition''': Self-&amp;gt;r&lt;br /&gt;
&lt;br /&gt;
 Function _Ref::Expand( Self : _Ref atom )&lt;br /&gt;
 '''Definition''': `#`(Self)&lt;br /&gt;
&lt;br /&gt;
 Function _Ref::TitleForExpand(Self : _Ref atom ; subTitle : text atom ; memberNum :  optional  positive atom )&lt;br /&gt;
 '''Definition''':&lt;br /&gt;
            f&amp;quot;#{subTitle}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Arrow operator]]&lt;br /&gt;
* [[Callable]]&lt;br /&gt;
* [[User-Defined Functions]]&lt;br /&gt;
* [[Function Parameter Qualifiers]]&lt;/div&gt;</summary>
		<author><name>Mhenrion</name></author>
	</entry>
</feed>