Analytica Release Notes/Changes in Patch Build 4.4.3
This page lists changes that have been incorporated into the 4.4.3 patch release since the 4.4.2 patch release. In pages like What's new in Analytica 4.4?, we usually only list enhancements, not small bug fixes like the ones listed here. But because this is a patch release, and its only purpose is to provide fixes to lots of small bugs, we list them here.
- Major internal refactorization of core code, related to file handling and streams.
- Improved robustness to avoid data loss when file system errors occur while saving models.
- Fundamental change to the way Tables are parsed. Increased stability and speed at load time.
- New Proactively evaluate indexes preference, and changed this default to be off for new models. Turning this off may dramatically reduce model load time.
- New Enlarge attribute & table fonts preference setting. Improved GUI layout and management when large fonts are used.
- Improvements to handling of zero-length indexes.
- Lots of bug fixes. See below.
Potential Backward Compatibility Considerations
- We recommend that you turn off the Proactively Evaluate Indexes preference setting when you start using 4.4.3, but there is a small chance this could alter the starting random number generator seed. This would simply mean that you'd see slightly different numbers for random samples. This only happens if your model has a computed index that uses a random number or a random sample during its computation (which is a rare).
- We have removed numerous archaic legacy attributes and commands. These are attributes and commands from the days of DEMOS (i.e., the 1980s), many of which were never functional in Analytica for Windows. If you are using a model from that era, or possibly from the Analytica 1.0 days, there is very a small chance it might use on of these and complain when the model is loaded, or certain buttons controls are run. Even in those cases, other than the error message, you are unlikely to notice any difference in computations. The removed identifiers are: Activate, SetPath, Launch, Laser, Script, MacScribe, Color, Comment, EditTable, Repeat, GetResource, DdeExecute, DdeInitiate, DdeTerminate, GetUrl, ReadUrl, Map, Record, PauseRecord, EndRecord, Put, Scatter, SetPath, Slice, Update, and EndUpdate. Also eliminated the class Version. The elimination of these unclutters the name space and frees up these identifiers for use in models.
All in «module»syntax for the decisions and constraints parameters of DefineOptimization does not parse in 4.4.3. This is an inadvertent bug that was introduced and not discovered in time. Sorry about the inconvenience. This will be repaired in the next build.
- Many typescript commands that accept an identifier parameter used to work if you supplied only a partial identifier. They now require a full and complete identifier. For example,
Show Result Net_might have previously opened the result window for
Net_present_value, but will now issue an error. If you have these, you should update your button scripts with the full identifiers even if you don't upgrade!
File Saving and Loading
- When variables with table definitions (Table, DetermTable, ProbTable and IntraTable) are first parsed (during the Checking phase of the model load), the parser no longer has to evaluate the table indexes. This has several consequences:
- The parsing and evaluation phases are more distinct, rather than intertwined.
- Many models load much faster, especially if you have
ProactivelyEvaluate Index : 0set.
- Table indexes are evaluated later when you view or evaluate a table. Thus, evaluation time is shifted from load time to evaluation time (you can still force the evaluation of selected variables or indexes at load time by configuring Proactive Evaluation if you want).
- When you view an edit table for the first time, the table index might need to be evaluated (particularly if they are computed indexes). So you may experience delays or evaluation error messages when you attempt to view an edit table. These would have happened at an earlier point in 4.4.2, when you first parsed the definition.
- If a table index has an evaluation error, or is not a valid index (i.e., not a list), the variable with the table is now considered parsed, while formerly it would be cross-hatched, meaning it was considered unparsed.
- When a Dynamic with a non-Time dynamic index is parsed (such as
Dynamic[I](1,self[I-1]*1.2)), the dynamic index is no longer evaluated at parse time. Consequences:
- Better separation between parsing and evaluation.
- Faster load times, since the dynamic index isn't computed at parse time.
Dynamic[I](...)variables are considered parsed even when
Iis undefined or has an evaluation error. Previously, these would appear hatched (unparsed).
- File saving is been made more robust to a wide variety of disk failures that might occur while saving a model file, reducing the changes of losing information as a result of disk or network failure/outage, disk full, media defects, etc.
- When using Add Module... or Add Library... without merge, an error appears when an identifier collision occurs. We've added a Repeat for all checkbox, so you don't have keep answering the question for all identifier collisions.
- When using Add Library... to reload a library and change it from linked to embedded at the time, it would sometimes end up as linked.
- Model loading has three stages: Reading, Checking (aka parsing), and Evaluating. The last stage evaluates anything that is marked for Proactive Evaluation. There were some errors that would occur while proactively evaluating an object that would cause the entire Evaluating stage to abort, thus some variables or indexes that should have been evaluated at load time were not evaluated. If this happens in your model (which is very unlikely -- we saw it in only one model), you might actually see an increase in load time in 4.4.3 if those remaining objects take a long time to evaluate. Of course, we recommend turning off the Proactively evaluate indexes preference setting, which will avoid this.
- A certain variable was cross-hatched after the model was loaded, but would parse without error when you pressed [!] or evaluated it. This was due to an interaction of table parsing, index evaluation, and a violated check condition that involved a dependency on an edit table not yet parsed.
- The typescript command Save has been revived.
- When an XML-format model file contains odd characters (e.g., ascii value less than 32) appearing as an XML "entity", e.g.,
, the XML parser would treat this as malformed and would stop loading the model, causing parts of the model to be lost. The official XML standard actually does not allow entity characters below 32, but Analytica does allow these characters in text (which could appear in attributes). To prevent loss of information, Analytica's XML parser has been modified to recognize these entities as legal anyway.
- A model file that begins with the UTF-8 prefix control characters "ï»¿" would fail to load. These characters are sometimes (but rarely) inserted by text editors or other programs. Analytica will now skip over these if they are present.
- A Chr(4) character in a model file would cause the load to abort, and a Chr(27) character would cause a message "do you want to continue reading?", as if an error had occurred. These characters could legitimately appear in a model file, so they are now accepted.
- The Att_PrevIndexValues attribute was saved (and loaded) incorrectly in the XML model format when multi-line index elements are present. After reloading, an extra tilde would appear in the index item. The bug was on the saving side (the model file was wrong).
Numerous bugs have been fixed that could result in an application crash.
- A crash when copying a certain module.
- A crash when opening a model with a file path exceeding 260 characters.
- A crash when configuring the email address in the Publish to Cloud... account tab.
- Publish to Cloud... would hang when used to publish an encrypted (aka obfuscated) model.
- A crash when copying from a discrete PDF result table.
- A crash when you add items to an extremely long list, then close the object window while it is still working on the operation.
- Graphics splotches and crash when an excessive number of windows are open simultaneously (e.g., on the order of 65 object windows or 150 diagrams).
- A memory leak, which in rare cases also caused a crash, related to the use of text values, with many possible manifestations.
- A crash when answering "yes" to a particular "out of domain bounds" range warning.
- Odd behavior, including a blank window, and potential loss of data in edit table when viewing a huge table in expr view containing more than 16383 lines.
- An internal bug that printed "unimplemented term type in print" to the typescript window when viewing a certain mid value.
- Crash that occurred when executing a "SpliceIndex All" command in a button script in a particular model.
- Crash that occurred when trying to save a particular model that had a TableCellDefault set to itself.
- A crash that occurred while trying to view an edit table when a computed index (I1) has changed length and depends on a table, which itself depends on a computed index (I2) that has changed length.
- A case where Analytica would hang (and would have to be terminated via task manager) when it ran out of memory while creating a graph.
- A crash or an incorrectly reported "insufficient memory" error when evaluating or displaying a smoothed PDF of a result where the first and last values in the sample are NaN.
- A crash after a node resize after hiding the hierarchy bar.
- Crash (or false report of insufficient memory) when Kernel Density Estimation processes a sample consisting of many NaN values.
- Intermittent crash when calling RunConsoleProcess.
- Crash when declaring an alias object from the typescript window.
- A copy/paste of an index, while the index is in an unspliced state, could in some cases cause the index to get into a bad state, such that later Analytica would hang when a
- The AdeTest program (examples that come with ADE) would crash when receiving a result of «null» from GetAttribute.
- An occassional intermittent crash when ADE terminates itself after the process monitored by CAEngine::MonitorProcess terminates.
Evaluation and Built-in Functions
- A new NumberToText funtion has been added. This provides an alternative to
""&x(number-to-text coercion). It will be added to the User Guide and Definition menu as an "official" new function when 4.5 is released. (For now, it is a preliminary, behind-the-scenes, implementation, but documented here on the wiki).
- The result of
Floor(date)should be a date-time number, but a integer number was being returned instead.
- Eliminated an inefficiency in Subscript in a certain case involving the subscripting of a local variable that is computed with If-Then-Else.
- Eliminated an inefficiency in the evaluation of DetermTable. The inefficiency was triggered only with a particular combination of indexes, but when it did happen, it took much longer than If-Then-Else and consumed excessive memory.
- Added a «default» parameter to JoinText to specify the result when all value are null, and hence there are no items to join. For example,
JoinText(A,I,',',default:null)returns null if A contains only null values along I. This is particularly useful when joining along 2 dimensions, so you don't get extra commas. However, in other cases it is useful to rely on this being the empty string,
"", since JoinText is a text function, so this default behavior has been left in place.
- Added an option to JoinText to not ignore Null values. This is useful when you need to maintain column-correspondence.
- A complex interaction between the evaluation of a Choice, a computed index and table splicing resulted in a certain Choice control displaying the option "Platform" but evaluated to a different value, "Choice". The choice index was computed, and depended on an unspliced Table, which had a table index that was also computed and unspliced.
- When you define an index as
[1,«null»,2], the second index element should be the value «null», but was incorrectly evaluating to be a handle to the system variable Null.
- When you have a meta-only index with a cell that contains
Domain of X, the corresponding Mid and IndexValue should be a handle (i.e.,
Handle(Domain of X)), not a parsed expression.
- The SpreadsheetSetRange function returned a cryptic error, "Unknown error x800A03EC", when one of the cell values being supplied was a handle.
- When you imported a 1-D array using
SpreadsheetRange(...,howToIndex:8), the row index labels imported ok, but the cells didn't -- they had the row labels instead.
- The function Concat was returning the wrong result for the following:
Concat( A[I=[3,4] ], B, ,J)<code>. The result had an implicit index, whereas it should have been indexed by <code>.K.
- When GetFract is applied to a sample containing NaNs, there were several odd and inconsistent treatments with the ordering of values, and did not always match the ordering of Sort.
- Internally, Analytica has three real-number data types: Floating point, fixed point, and integer.
Abs(x)was previously returning a floating point result, but now returns a data type matching the data type of x.
- The ReadFromURL function now supports HTTPS and proxy server settings automatically.
- The functions
WhatIf(y,x)inherently produce nonsense results when a distribution function or random number is downstream of x and used in the computation of y. The nonsense is inherent to the use of finite differencing, but these functions will now detect this situation and issue a warning (provided, of course, that the Show Result Warnings preference is on).
- Removed the useless and non-functional built-in function
Q_MakeRect-- a relict from an earlier era.
- Fixed a numeric instability in Kernel Density Smoothing (Function Pdf) that appeared when using a smoothing factor < -0.9 and equal-X values. The fix slightly alters the X values used in the PDF for all equal-X PDFs at any smoothing factor (both from the function and in the UI). The instability was rare, but when it occurred, caused the density at certain points to become extremely large.
- Add Library... or Add Module... would sometimes position the new module node under existing nodes.
- Help balloon linger over other windows, e.g., number format dialog, or over an external window.
- Help balloon flickers when hovering over the node displaying the balloon.
- Help balloons containing the special characters ≥ or ≤ display the wrong character.
- Slight decrease in text margin for a text node so that a few additional pixels fit on each line before a line wrap.
- The scalar result value in an output node was a few pixels too low relative to the label.
- Diagram scroll bar is off after leaving maximized model
- Numerous glitches fixed that were observed in a an extremely wide diagram (typically > 20 to 30 screen widths).
- An Alias button is missing its bevel.
- A certain button was not executing its script when pressed.
- After a Select All, the reference node loses its solid handles, so you cannot distinguish it from the others.
- Text nodes not resizing by proper increment. Snap to grid was constraining a text node size to a 2*grid size, whereas a 1*grid size is fine for a text node.
- Text outside of node border disappears when moving nodes around on diagram (redraw issue).
- An "Undo resizing" menu command had no effect on an input node button.
- Change Image Format was not working for converting a particular EMF image to raster formats like PNG.
- Node handles were slightly asymmetrical, probably related to one-pixel width changes to nodes in the 4.4.2 release.
- A pulldown menu for a Choice input node is too narrow, with text outside of the menu and the form node, which looked bad.
- A checkbox input node became small after adding units.
- Node titles were not centered vertically after changing node font size.
- When using a smaller print page size, the diagram scroll bar would get off and the diagram would go blank.
- An arrow would disappear for no good reason, after entering a value into an edit table that violates a check attribute.
- After renaming node, input/output/alias nodes don't update their titles (repaint issue).
- Right click in input/output nodes doesn't work in browse mode.
- A broken input node involving Choice(domain of X)
- After an undo of a resize of a Table edit button, an input node is drawn in the wrong location.
- A node title was not vertically centered in a legacy model when ClearType fonts is turned off.
- A module node inherits its color from its parent, unless you've explicit set its color to something else. But there was no way outside of typescript to clear an explicit setting so that it would go back to inheriting from the parent. Now, it does this when you set it to the same color as the parent.
- When using Analytica with non-English regional settings, dates would get stored incorrectly as they were entered into the cells of the edit table, sometimes (depending on the region) breaking the definition. They are supposed to be stored in the canonical form, e.g., 23-Aug-2012, using a 3-letter english name independent of regional setting (in the table view, they display according to regional settings).
- When using Analytica with non-English regional settings, and you have an index containing dates, the Att_PrevIndexValue did not save the date values correctly. The dates should be written to the file in the canonical format, e.g., 23-Aug-2012, regardless of region. But they were being written in regional format, which caused Table Splicing malfunctions in some regions, or when sharing models across different regions.
- When one of the indexes of a Table is changed to zero-length, other indexes of the table would be dropped from table (which now has zero cells). This would be relevant later when the index is changed back to a non-zero length.
- In result tables, cells containing the value «null» are now displayed in a light gray color to minimize the visual interference, making it easier to see the non-null values.
- In some cases, when you request the result of a variable in a Dynamic loop, which at the time has been partially computed, it would display the partially computed result (with uncomputed cells blank), whereas it should have finished the remaining computation before showing the result.
- When you export a table that contains Nulls, then re-import it, the cells would end up with the text
'«null»', rather than the value of «null».
- After adding a variable's own identifier as an index label while editing a ProbTable, the edit table window would vanish unexpectedly. When you tried to reopen it, it would hang for a very long time, then woudld appear in a highly distorted state. Stack overflow errors appeared in the typescript window.
- When you view the result table for an index, the row headers are blank, the index values are shown in the body cells. However, this didn't work right for a meta-only index, where the index values are handles. The result table display shows both row header values and body cells (which were the same).
- Suppose you have a ProbTable without a self-index (which is an error). When you use the object chooser to add Self to the table, it would delete the entire definition.
- Eliminated annoying delays that occurred when moving or resizing edit table windows when a extremely long index.
- Problem pasting text that is encoded in double quotes, in which the table would end up with a blank cell rather than with the text.
- Handles to domain indexes now appear as blue hyperlinks in tables, and jump to the object whose domain is depicted.
- In very wide tables, as you scroll to the right, somewhere around the 43rd page and above portions of the columns didn't paint, leaving white gaps.
- The "Warning: Table contains one or more Undefined Cells" should not appear when you are trying to view an edit table.
- The default grid color has been changed from black to gray, which looks better.
- Lines in plots are now anti-aliased so they look smoother.
- Improved the appearance of text that is rotated, including the text of the Y-axis label.
- A Reverse Order option has been added to the right-mouse context menu when viewing a graph, when you click on a graph key or graph axis. This makes it possible (and easy) to reverse the order that items in a key are displayed.
- In a probability bands graph with teh key on the right or left of the plot, the initial key ordering has been changed to match the ordering in the plot (e.g., 0.95 is at the top of the key, 0.05 is at the bottom of they key, to match the fact that the 95th percentile appears as the top line in the plot).
- Double clicking on a graph opens the Graph Setup dialog, as usual. But if you double click an axis (or select Graph Setup... from the right-mouse context menu while pointing to the axis), it opens it in the Axis Ranges tab.
- Graph key was not using the categorical ordering specified by the domain. When you have a categorical value dimension on a graph (as opposed to an index dimension), the graphing engine needs to come up with an ordering of the possible values. It will normally do that by sorting them alphabetically. But if you want to explicitly control the ordering, you can specify the domain for the variable, and the ordering is taken from the domain.
- A categorical value can now be used as a color key. Previously, only indexes could be used for color. Also, when the primary result value is used for color, it is possible to assign another index as the vertical axis. This combination makes it easy to create a 2-D categorical matrix, with color reflecting the category. There were ways to do this previously, but it was more convoluted.
- When a comparison index is used as they key of a bar graph, but the result value is independent of this index, and the bar origin is on but set to 0, the bars were depicted with one bar in each column, whereas it should have had a cluster of three bars in each column.
- When a handle to a domain index appears in axis or key labels of a graph, it was displaying as "DomainIndex". Now the title (or identifier) of the variable is displayed.
- The size of the color swabs on the key of a bar chart would enlarge as symbol size is increased. The same was true for line-only and step charts. This doesn't make sense since there are no symbols in these graphs, and could result mis-alignments in the key.
- A stacked line plot with color key stacked the lines backward. Instead of being stacked from the beginning of the index, with the second item on top of the first, etc., they are stacked in the opposite order. The problem requires the key to be on the left or right of the graph (it was fine if the key is at the bottom), or if the Y-axis order was reversed.
- Fixed a case where a graph wouldn't display (just kept showing the [Compute] button with no error message) after a comparison variable was added to the graph.
- In a particular case, an index was not showing up as an option for the horizonal axis, when it should have been.
- The balloon that appears when you click on a data point in a graph would show the wrong value in one particular (degenerate) case. This would happen when there is a comparison variable variable that is not being depicted on the graph, and which has an index that is not present on the graph or in any graphing role.
- Fixed a case where Analytica became unresponsive, not responding to Ctrl+Break or redrawing, while a huge graph was rendering.
- Fixed a UI glitch where the [XY] button was not visible when the result graph was first opened.
- The graph frame and grid for a graph of all-NaN values was highly distorted.
- The object window, attribute pane, outliner, and table windows, have been updated to support larger fonts gracefully, so that things align, don't wrap poorly, fit the data being displayed, etc. A preference setting, Enlarge attribute & table fonts, has been explored on the Preference Dialog. Windows already open adjust to changes to the AttributeFontSize and TableFontSize system variables.
- Some buttons were not selected when using the TAB key to tab through the Object Finder dialog.
- The term obfuscate has been uniformly replaced by the term encrypt. For example, in Analytica Enterprise on the Save a Copy In... dialog, the checkbox now reads Lock and encrypt the copy.
- Refined text in the crash recovery dialog.
- The Integer number format was changed to show integers at full precision after 1e+15.
- Expression Assist now shows indexes values when typing
If In1=when the index
In1is a computed index that has already been computed. Previously, it only showed values when In1 was a literal list.
- The Find... button in the Function Finder (Paste Identifier...) can now be reached via the TAB key.
- The graphics in the installer looked patchy when run on a display set to 125% DPI mode (and in other non-100% DPI modes). These should look higher quality now in these display DPI settings.
- The object window would truncate long identifiers in the Inputs and Outputs when the identifier would not fit in the allocated width. It now moves the title to the right to allow the longest identifier to be fully visible without any truncation.
- When viewing an extremely long table definition in the textual expr view, there were several problems with scrolling. It was not possible to scroll all the way to the bottom, and at times the scroll bar would stop responding.
- Text pasted from one cell in a list of labels to another cell would incorrectly get parsed as an expression (when the text could be validly parsed as an expression).
- The Value attribute would change to Computing and stay that way after adding elements to a list or editing the Time definition.
- When there is a syntax error, the position of the error in the error dialog is identified with an up arrow (↑) character instead of a caret (^).
Example Models and Libraries
- Added to the Distribution Densities Library: CumBinomialInv, CumGeometric, CumGeometricInv.
- Added to the Distribution Variations Library: Weibull_10_50_90
- In Distribution Variations Library, fixed a bug in Triangular_10_50_90 and Triangular_10_mode_90 in which 90 was being used instead of the p90 fractile. Note: These are legacy function names that are present to support earlier models that used them. The preferred functions to use (which didn't have the problem) are: Triangular10_50_90 and Triangular10_mode_90.
- Contains an updated ACP Style Library
- The command
SpliceIndex Alldid not process all unspliced indexes at it should have.
Tutorialcommand now opens the Analytica Tutorial.
- Removed the following anachronistic commands: Activate, SetPath, Launch, Laser, Script, MacScribe, Color, Comment, EditTable, Repeat, GetResource, DdeExecute, DdeInitiate, DdeTerminate, GetUrl, ReadUrl, Map, Record, PauseRecord, EndRecord, Put, Scatter, SetPath, Slice, Update, and EndUpdate. Also eliminated the class Version. The elimination of these unclutters the name space and frees up these identifiers for use in models.
- Updated the Save command to actually work, and provide many useful variations.
- Changes to the MakeChangesInTable:
- it was not able to change a Table into a DetermTable when the Domain acts as Self Index preference is set.
- Fixed a bug introduced in 4.4.1 and 4.4.2 where it was not using the index order correctly for table indexes in a non-canonical ordering. So
MakeChangeInTable DT DetermTable(J,I) 1(2('value'))would change cell
DT[@I=1,@J=2]instead of cell
ResumePhotowould start the output at the beginning of the file and clobber any previous logged contents at those positions. The result captured log would be garbage.
- The scrollbar in the typescript window would appear at the top as attributes are displayed, sometimes making it impossible to use to scroll backward.
- When copy/pasting into the typescript window, some extra characters would appear at the end, and when you start to backspace, the line would corrupt.
- The current object, as depicted by the typescript window prompt, would (incorrectly) change to Graph_primary_valdim when setting certain attributes.
- Too many tildes were displayed when viewing the value of
- The Evaluation Time information should not display in Analytica Professional, and should display in Power Player when using the Show and Profile commands.
- Many typescript commands that accept an identifier used to be happy if you gave it a partial identifier. For example, if you used the command
Open Diagram Key_, it would open the diagram named
Key_resultsif that happened to be the first identifier it found that started with "Key_". These command now expect the full and complete identifier, or they will issue an error. The previous forgiveness was a disadvantage, since you might screw things up by later adding a module named
Key_Assumptions. Note that this change may impact some legacy button scripts, but that it is very easy to fix.
- Identifiers appearing to the left of an assignment operator in a script attribute were not updated when the identifier was renamed.
- Increased the stack size in ADE to be the same as Analytica. Because of a smaller stack, some deeply nested computations that succeeded in Analytica experienced a stack overflow in ADE.
- Sped up CAObject::DefTable when retrieving SubTables.
- In AdeTest, the image isn't visible immediately when executing CAObject::PictureToStream
- AdeTest retained a lock on the image file after using CAObject::PictureToFile
- The return value of CAEngine::SaveModel is false after a successful save. On occurs when called via ActiveX automation (does not occur when using COM).
- CAObject::DefinitionType returned 0 ("general expression") when it should have returned -1 ("definition does not parse").
- Nested buttons, where one button script runs two or more other button scripts, failed to execute when the top bottom was launched via CAEngine::SendCommand.
- CATable::IndexNames was returning the name of local indexes without the dot, e.g., "my_index" rather than ".my_index".
CATable::IndexName(n)included the dot.