What’s new in Analytica 4.3?

Here are highlights of new and improved features in Analytica 4.3 added since the release 4.2. Additional detail can be found on the Analytica Wiki

Upgrade to Analytica 4.3, Analytica customers who have active support versions 4.0 and higher can upgrade at no cost.

Structured Optimization
(Optimizer edition only)

Structured Optimization is a new set of features in Analytica Optimizer 4.3 that makes the encoding of complex optimization models much easier compared to 4.2 and earlier versions. The new feature set matches the functionality of algebraic optimization languages while leveraging the strengths of Analytica's influence diagrams and Intelligent Array abstraction.  

  • You can define constraints as comparisons (<=, >=, or =) using Analytica’s standard expression syntax, including the use of array-based expressions.  They are placed directly in influence diagrams as Constraint Nodes, a new class of object.  You can define multiple constraint arrays, each with different dimensionalities and variable types. Analytica automatically combines them in the optimization formulation and applies Mixed Integer methods if necessary.
  • It  uses the influence diagram structure of your original model. You no longer need to form decision variables into a vector of scalar values.  Decision variables can remain as multi-dimensional arrays, or a collection of multi-dimensional arrays.  All you need to do is specify Decisions, Constraints, and Objective values if present.  For convenience, you can even specify All Decisions and/or All Constraints in a module or in the entire model.
  • A new function, DefineOptimization(), supports any type of optimization, replacing  the original separate functionsLpDefine(), QpDefine() and NLPDefine().
    (Legacy functions are still supported for models built with earlier versions of Analytica.) 
  • It automatically selects the appropriate solver engine based on problem characteristics, subject to user override.
  • It supports parametric analysis so that you can investigate how solutions vary as you change one or more input assumptions.
  • More generally, it fully supports Intelligent Array abstraction, allowing multi-dimensional definitions for Decisions, Constraints, and intermediate variables.  Array dimensions can be included within the optimization (instrinsic) or used as a basis for multiple optimizations (extrinsic).  Array dimensions can even include special system indexes for Monte Carlo samples (Run) or Dynamic time series (Time).  This greatly simplifies the process of combining optimization with uncertainty or defining dynamically recursive constraints.
  • It greatly expands the richness of the Domain attribute for Decision variables.  You can specify bounds, and variable domains (Continuous, Integer, Grouped Integer, Boolean or discrete) with convenient pull-down menus, or you can enter them as array-based expressions such that bounds and domains vary along an index.
  • It provides library functions that apply optimized values to non-optimizing stages of the model.  It also allows you to revert to original non-optimized definitions.
  • For LPs and QPs, there is no need to separate out matrix coefficients.  It determines these automatically based on model structure.  For large models, it represents linear and quadratic coefficients as sparse matrices, enabling the efficient solution of very large  LP, QP and QCP problems. (Previous releases required explicit representation of every matrix regardless of size.)
  • It integrates with Analytica's built in linear interpolation function to construct piece-wise linear relationships in NLPs.  This is a convenient way to linearize a model so that it can be solved quickly with LP simplex and dual-simplex algorithms.
  • For NLPs that cannont be linearized, it derives analytic formulas for gradients and Jacobians whenever possible to improve performance.

See the  Analytica Optimizer Guide (available through the Help menu) for details and examples demonstrating Structured Optimization.

Domain attribute enhancements

In Decision Theory, the clarity test requires that inputs, decisions, and objectives must be sufficiently well defined.  Enhancements to the domain attribute help increase awareness of quantitative properties in your models.  Promoting clarity of thought is a useful concept when designing a model and teaching the skills of quantitative modeling to students.

If you are an experienced Analytica model builder in earlier Analytica releases, you probably know of the existence of the Domain attribute and its use in a few particular cases, but you likely view it as a minor side-line feature. Now that it has a more uniform semantics, you may now want to start viewing it as an important partner with the Definition, Description, and Units attributes. The Domain attribute plays a variety of roles for various functionalities, but can also be instrumental in reducing modeling errors. Although you may find the changes subtle at first, the domain enhancements are among the most significant enhancements in the 4.3 release. In time, you may find that they have the greatest impact on your thought processes when building a model.

Data type enhancements

Date/time values

Analytica now distinguishes between normal numbers and date-time numeric quantities. Among other things, this enables Analytica to use the date type number format when displaying date/time values, and a numeric format when displaying non-date numbers, within the same view. Definitions, table cells, and entries into input fields are now parsed as date (or times) if the entry appears to be a date or time. Formerly, it was necessary to set the number format to Date for this to occur.

Identifiers preserve capitalization
The capitalization of identifiers is now preserved, so that when Analytica displays an identifier, any camel-case capitalization is preserved. Formerly, identifiers were always displayed with the first letter capitalized, remaining letters lower case. In expression logic, identifiers continue to be case-insensitive.

New built-in functions

New Opimizer Functions (Optimizer edition only)

  • DefineOptimization(): Central encoding function for all optimization problem types
  • OptSolution(): Displays optimal decision values
  • OptObjective(): Displays the maximized or minimized objective quantity
  • OptStatusText() / OptStatusNum():  Display status codes passed by solver engines and text descriptions or numerical codes
  • OptInfo(): Reveals various details about the optimization
  • OptEngineInfo(): Provides information relevant to a specific solver engine
  • OptShadow(): For LP and QP, computes partial derivative of optimized objective relative to constraint limits
  • OptReducedCost(): For LP, computes the amount by which an objective coefficient must be changed in order to cause a change in the optimized objective value
  • OptObjectiveSa(): For LP, computes sensitivities between Decision variables and the Objective quantity.
  • OptRhsSa(): For LP, computes the range over which right hand constraint values can vary without changing the basis of the solution.
  • OptSlack(): Computes the value which, when added to the left hand side of a constraint inequality, makes both sides equal
  • OptFindIIS(): For LP, finds a non-unique Irreducible Infeasible Subset of constraints such that, if any contraint in the subset were to be removed, a feasible solution would exist.
  • OptWriteIIS(): Writes an Irreducibly Infeasible Subset in one of several standard optimization programming formats.
  • OptRead(): Reads a linear or quadratic program definition from an external file
  • OptWrite(): Writes a linear or quadratic program definition to an external file

New Array Functions (all editions)

  • The Dispatch() function computes an allocation of capacity from a set of resources to meet a given demand.
  • CompressMemoryInUseBy() attempts to compress the internal representation of an array, leveraging sparseness and shared subarrays, to reduce memory usage.
  • The ListOfHandles() function takes a list of identifiers and returns a list of handles.

Set functions (all editions)
These new functions perform operations on Sets, i.e., on collections of elements. A set is expressed as a reference to a list containing no duplicate elements, and with no implied ordering between elements. 

  • SetContains()
  • SetsAreEqual()
  • SetIntersection()
  • SetUnion()
  • SetDifference().

New math functions (all editions)
The inverse hyperbolic trig functions

  • ArcCosH()
  • ArcSinH()
  • ArcTanH().

Domain definition functions (all editions)
These functions are used to define the domain attribute from expression view:

  • Continuous()
  • Integer()
  • Boolean()
  • GroupedInteger()
  • Discrete()

Domain access functions (all editions)
These functions allow expressions to access the computed domain components of a variable. (Very advanced):

  • DomainType()
  • DomainLowerBound()
  • DomainUpperBound()
  • DomainIntegerGroup()
  • DomainAllowed()
  • DomainNullOk().

Parsed expression functions (all editions)
For peeking into the internals of Analytica’s parsed expression trees (advanced):

  • ParsedExprParameters()
  • ParsedExprFunction()

Changes to existing functions

  • SubScript and Slice don't issue out-of-range warnings when shifting. 
    e.g.: A[@X = @X-1]
  • SubScript and Slice allow specification of default value (for out-of-range values), which also suppresses the warning when specified
    e.g.: A[@X = @X-1, defVal: 0]
  • Unique():  Faster performance when applied to very large arrays
  • MemoryInUseBy(): Improved accuracy by avoiding double-counting of shared subarrays
  • MdTable():
    • Creates sparse cubes internally when possible.  In some cases, this can dramatically reduce memory load.
    • When a value column in the relational table contains «null», 4.2 treated that cell as unspecified (and thus used the «defaultValue», while 4.3 treats this as specified and uses the value «null» for the cell.  (In such cases, backward compatibility issues might result.)
  • GetProcessInfo() includes new items that reveal information about Analytica objects:

    • GetProcessInfo("User Objects")
    • GetProcessInfo("Total Objects")
    • GetProcesInfo("Free Objects")
  • Functions that write to or read from Excel spreadsheets transfer date-time values as date-time numbers so that cells with dates are imported as dates into Analytica, and Analytica dates are written as dates to Excel.
  • SpreadsheetCell() and SpreadSheetRange():
    The optional parameter «what» has been added to enable reading of the cell formula instead of the cell value.  It also allows you to read in dates as numbers rather than dates, or read formulas in a relative offset format.

Tpescript changes

  • Full precision of scalar result is preserved when printed in typescript
  • The List command is extended to use regular expressions.  For example:
    • List "text" {Lists all identifiers containing the letters "text" within the identifier}
    • List SysFunction "(Get)|(Set)" {Lists all built-in functions containing either Get or Set in the identifier}
  • Typescript extension:  The commands Delete all «Module» or Delete recursive «Module» delete everything recursively inside «Module».

Graphical User Interface enhancements

  • The Compare Results feature places the comparison node more intelligently on the diagram.
  • Number format dialog allows you to change the global default number format.
  • Edit tables containing Checkboxes allow you to select a range of cells and check or uncheck all boxes with a single click.
  • Warning messages contain hyperlinks to Analytica Wiki pages
  • Enhanced dialog box appearance in XP
  • In result tables, cells containing information items now appear in blue to indicate that they are double click-able.  This includes optimization evaluations, references, and handles.

Analytica 64-bit

The maximum number of Analytica user objects has been increased to over 64,000 when using Analytica 64-bit.

(For 32-bit it is still about 31,000)

Preferences

  • The Use Safe Intermediates preference is removed. (Obsolete)
  • The Check value bounds preference has two new sub-options:
    • against Check attribute
    • against domain bounds
  • Domain acts as self index preference is added.