Releases: openmpp/main
Minor release 02 of June 2021
Minor release 02 of June 2021
- potentially breaking change: on Windows 64 bit model exe no longer has
64
name suffix - TablePresent() function for derived table model code
- bug fix in Modgen macros FixedGetTableValue and FixedSetTableValue for cross-compatible models
- bug fix in Modgen hide statement
- significant updates of test_models.pl and build Windows test_models.exe
- enhanced support of model ini-files for Visual Studio
- enhanced model version log
- build documentation archive as part of release
Download source code and binaries:
Download release documentation archive:
Download cluster version (MPI):
Linux downloads:
- Desktop version build on Debian-10 and expected to work on any modern Linux, including Ubuntu 20.04 and CentOS 8
- Cluster (MPI) Debian-10 version expected to work on any modern Linux with Open MPI version 3+ installed, including CentOS 8.
- Cluster (MPI) CentOS-8 version require Open MPI 4.x and it would not work on RedHat / CentOS below 8.2 version.
IMPORTANT:
Full version of OpenM++ source code always included into "Download" links above.
Please do NOT use "Source code (zip)" or "Source code (tar.gz)" archives from "Assets" links below.
It is auto-generated by GitHub release tools and contains only half of OpenM++ source code.
Notes:
- It is highly recommended to download this release in order to use automated test models utility.
- It is recommended to download this release if you want to apply bug fixes mentioned above.
- This release includes a separate documentation archive, which you can download to use an offline version of openM++ documentation. We do recommend using our online documentation which contains the most recent information.
Potentially breaking change
On Windows platform, starting from this release, 64 bit model executable no longer carry 64
suffix and it has the same name as 32 bit executable, for example: RiskPaths.exe
or RiskPathsD.exe
(debug version). We recommend to build, test and use only 64 bit models and stop 32 bit model development.
Also we recommend to install every openM++ release either into a separate folder, for example: C:\openmpp_win_20210602
or, if want to keep the same folder name, for example: C:\openMpp
then completely remove existing content from it before unpacking a new release into C:\openMpp
.
If you unpacking new release into the same folder without cleaning it first then you may need manually delete the model/ompp/bin folder, for example: C:\openMpp\RiskPaths\ompp\bin
. Otherwise model build may fail in Visual Studio or MSBuild. That folder must be deleted manually, Clean
option in Visual Studio does not help.
New utility test_models
The utility test_models builds, runs, and compares results for different versions of the same model, or for the same model built on different platforms. It can process multiple models in a single invocation and can compare OpenM++ and Modgen versions of cross-compatible models. It can play a useful role during incremental model development, and for quality assurance. For more information, please see the topic Test Models on our wiki: https://github.com/openmpp/openmpp.github.io/wiki/Test-Models
Bug fix in Modgen cover macros FixedGetTableValue and FixedSetTableValue
This bug applies only to the Modgen version of a x-compatible model which uses the cover macros FixedGetTableValue
and FixedSetTableValue
introduced in openM++ release 1.8.4. It does not affect openM++ versions of models. The bug manifested in a single cell of a single table, the very first table cell used by either function (where the value 0 was returned instead of the true cell value).
TablePresent function for derived table model code
The language statements suppress_tables and retain_tables were introduced in openM++ Release 1.8.7, and the run-time options Tables.Suppress
and Tables.Retain
introduced in openM++ release 1.8.4. These statements and options allow build-time or run-time suppression of tables. Unfortunately, the Modgen design for derived tables does not associate a given derived table with the model code which implements it. As a result, if a derived table is suppressed, the model code which implements it will still be called. That can produce spurious run-time warnings or useless CPU cycles when that model code attempts to populate a suppressed table.
A new x-compatible function TablePresent
is included in this release to allow model devs to work around the issue. TablePresent
can be used in model code inside a UserTables function. It takes a table name as a single string argument and returns true or false. To use it,
#include omc/include/fixed_modgen_api.h
in the custom.h
file in your model code folder.
Example code fragments which use it (from Alpha2 model):
void UserTables()
{
if (!TablePresent("ut1")) return;
...
}
void UserTables()
{
// copy extended parameters to tables
const int nYears = SIZE(TER_YEARS1);
const int nColours = SIZE(TEC_COLOUR);
// TEP_Target1
if (TablePresent("TET_Target1")) {
for (int nY = 0; nY < nYears; ++nY) {
double dValue = TEP_Target1[nY];
FixedSetTableValue("TET_Target1.VALUE", dValue, nY);
}
}
...
}
A Modgen implementation of TablePresent
is also included for x-compatible models. It always returns the value true.
Incidentally, the openM++ release notes for version 1.8.7 include a sketch of a new design for derived tables which would obviate the need for TablePresent
, for dependency statements, and for GetTableValue
and SetTableValue
. It would also automatically handle the correct ordering of derived table computation, accounting for the logical relationships among derived tables which use other derived tables.
Bug: Modgen hide
statement with a table argument causes run-time error
This bug has been fixed in this release. OpenM++ now silently ignores table arguments to the Modgen hide
statement. A future OpenM++ release may include an enhancement to hide specified tables in the UI.
Details:
If the hide
statement is used in model code with a table as argument, and the model built with OpenM++ 1.8.7, the model may fail with a run-time error such as the following:
DB error: output table not found in tables dictionary: ut1
OpenM++ release 1.8.7 introduced features to suppress or retain parameters and tables when a model is built. In that same release, openM++ attempted to handle the Modgen hide
statement, as described in the version 1.8.7 release notes:
"A table specified in a Modgen hide statement is computed internally by the model, and is not written as metadata or results to the DB."
The implementation of this behavior was faulty, but was also an incorrect call, since the Modgen hide statement, when applied to a table, is just a hint to the UI and should not be implemented in the model structure. This bug was first noticed in routine testing of the HPVMM model, which used the hide
statement to suppress from the UI some large internal tables which are used for inter-model communication to downstream OncoSim. The behavior of hide
for parameters remains as described in the version 1.8.7 release notes.
Minor release 05 of May 2021
Minor release 05 of May 2021
- model code statements to suppress or retain parameters or tables in the model executable
- update Xcode projects for Mac M1
- db schema change: increase option value size to 32000
- UI: remove empty parameters and tables groups
Download source code and binaries:
Download cluster version (MPI):
Linux downloads:
- Desktop version build on Debian-10 and expected to work on any modern Linux, including Ubuntu 20.04 and CentOS 8
- Cluster (MPI) Debian-10 version expected to work on any modern Linux with Open MPI version 3+ installed, including CentOS 8.
- Cluster (MPI) CentOS-8 version require Open MPI 4.x and it would not work on RedHat / CentOS below 8.2 version.
IMPORTANT:
Full version of OpenM++ source code always included into "Download" links above.
Please do NOT use "Source code (zip)" or "Source code (tar.gz)" archives from "Assets" links below.
It is auto-generated by GitHub release tools and contains only half of OpenM++ source code.
Notes:
1.There is a minor change of model database schema: model run options now can be up to 32000 characters long.
This change should not affect existing model databases however it is recommended to rebuild the models and use a new copy of Model.sqlite
database files.
Model code statements to suppress or retain parameters or tables in the model executable
Synopsis:
parameters_suppress param1, param2, param_grp1, ... ;
parameters_retain param1, param2, param_group1, ... ;
tables_suppress table1, table2, table_grp1, ...;
tables_retain table1, table2, table_grp1, ...;
Description:
A family of four new statements has been added to the language. Without affecting a simulation in any way, these statements can trim down a model at build time by selectively suppressing parameters (parameters_suppress) or tables (suppress_tables). Complementary statements (parameters_retain, tables_retain) specify that the model is only to contain specified parameters or tables, suppressing all others. The openM++ compiler will raise an error if a model contains both parameters_suppress
and parameters_retain
, or both tables_suppress
and tables_retain
.
Suppressed parameters are burned into the executable using values when the model is built. Suppressed parameters are absent from the user interface and the database, and from metadata in the database. Large models can benefit significantly both in build time and start-up time by suppressing parameters (no need to read such parameters from the database when launching the model). Suppressing parameters can also be used to simplify the UI of a deployed model.
Suppressed tables are completely removed from the model. Large models can benefit significantly both in build time and run time by suppressing tables.
Table dependencies specified using the dependency
statement are always respected if a suppressed table is required by a non-suppressed table. Such 'internal' tables are computed by the model but not made visible. They are not published as meta data, and results of internal tables are not written to the database.
Branches of the parameter or table hierarchy which become empty because of parameter or table suppression are not published to the DB when the model is built. As a result, the UI will show a trimmed down version of the hierarchy.
Example:
The following code is extracted from a module SuppressRetain.ompp which was added to the large OncoSimX model for testing, to create a model containing only parameters and tables related to breast cancer (OncoSim simulates many cancers).
parameters_retain
SimulationSeed,
SimulationCases,
Breast_Cancer_Parameters
;
tables_retain
TG01_Breast_Cancer_Tables
;
These statements produced a version of OncoSimX trimmed down to only parameters and tables associated with the breast cancer component.
Notes:
OpenM++ also includes the ability to selectively suppress tables at run-time using the options Tables.Suppress
and Tables.Retain
. These options allow a model user to economize processing time and storage by selecting tables of interest in a published model. The model code statements tables_suppress
and tables_retain
are quite different because they remove tables completely from a model. That eliminates the cost of publishing the table metadata to the DB when the model is built. In addition, all C++ generated code and internal attributes associated with a table are absent when a table is suppressed using tables_suppress, making the model run faster and take less memory than the same model with the same table de-activated at runtime using the option Tables.Suppress
.
Models with suppressed parameters build faster because their metadata and Default values are not published to the DB. They also launch faster because there is no need for the model to read the parameters from the DB when the model starts. A suppressed parameter can be made visible and editable in the model UI by changing the suppress/retain statement and rebuilding the model. This is simpler than using the Fixed parameter mechanism, which involves moving a parameter between folders.
Models often contain diagnostic tables used for testing and development, but only needed occasionally subsequently. Instead of commenting out or removing such tables, they can be kept, but added to a table group and then suppressed. That way, the diagnostic tables continue to be parsed and verified when the model is built.
During model development, a model is often modified, built, and run repeatedly when working on a specific component. That process can be accelerated by using parameters_retain
and tables_retain
temporarily to focus only on the parameters and tables associated with the current development activity. That optimizes the model to the current development activity, without changing the logic or simulation.
A table specified in a Modgen hide
statement is computed internally by the model, and is not written as metadata or results to the DB.
A parameter specified in a Modgen hide
statement is burned into the executable, and is not written as metadata or results to the DB. This is different from Modgen, which retains all tables and parameters and passes the hide
statement information to the display layer as a hint.
15 of April 2021: OpenM++ native port on Apple Arm CPU a.k.a. M1 CPU
15 of April2021: OpenM++ native port on Apple Arm:
- openM++ ported to Apple M1 Arm CPU, natively, no x86 emulation
- minor changes in oms web-service an UI scripts to make it more portable
- clean shutdown of oms web-service by API post
- flush model console log output
Download source code and binaries:
Download cluster version (MPI):
Linux downloads:
- Desktop version build on Debian-10 and expected to work on any modern Linux, including Ubuntu 20.04 and CentOS 8
- Cluster (MPI) Debian-10 version expected to work on any modern Linux with Open MPI version 3+ installed, including CentOS 8.
- Cluster (MPI) CentOS-8 version require Open MPI 4.x and it would not work on RedHat / CentOS below 8.2 version.
IMPORTANT:
Full version of OpenM++ source code always included into "Download" links above.
Please do NOT use "Source code (zip)" or "Source code (tar.gz)" archives from "Assets" links below.
It is auto-generated by GitHub release tools and contains only half of OpenM++ source code.
Notes:
1.It is recommended to install this release if you want to use openM++ on new Apple M1 CPU.
This is a native port of openM++ to Apple Arm and Rosetta emulation is not required to build, debug or run models.
2.This release is also fixing a problem with UI not started from Visual Studio on Windows 7.
Please keep in mind, Windows 7 is no longer supported by Microsoft, we do our best to fix the problems but cannot provide any guarantee.
Minor release 07 of April 2021
Minor release 07 of April 2021:
- clairvoyance detection and handling
- bug fix: update global time at the end of simulation in time-based models
- AddressSanitizer support to detect and debug memory violation issues (please go to our wiki for details)
- support model development run options (please go to our wiki for details)
- support EventTrace options to improve development process
- improve model trace performance for network shares
- SimulationSeed in the example models is now set to 1 instead of 16807
- UI: support persistent view for model parameters even model UI started from IDE debug session
- support multi-line values in model ini-files
Download source code and binaries:
Download cluster version (MPI):
Linux downloads:
- Desktop version build on Debian-10 and expected to work on any modern Linux, including Ubuntu 20.04 and CentOS 8
- Cluster (MPI) Debian-10 version expected to work on any modern Linux with Open MPI version 3+ installed, including CentOS 8.
- Cluster (MPI) CentOS-8 version require Open MPI 4.x and it would not work on RedHat / CentOS below 8.2 version.
IMPORTANT:
Full version of OpenM++ source code always included into "Download" links above.
Please do NOT use "Source code (zip)" or "Source code (tar.gz)" archives from "Assets" links below.
It is auto-generated by GitHub release tools and contains only half of OpenM++ source code.
Clairvoyance detection and handling
If an entity A attempts to access another entity B which is in the future of A, an error message will be emitted, a run-time exception will be raised, and the run will be terminated.
Generally, this condition is due to a logic error in model code which should be addressed.
Note that you can trap this run-time exception in the IDE when running a debug version of the model to investigate the condition which caused the exception.
To disable clairvoyance detection and handling, insert the following statement in model code, eg in ompp_framework.ompp
options enable_clairvoyance = on;
If clairvoyance detection and handling is disabled, a warning will be emitted by the ompp compiler.
Thanks to Martin Spielauer for suggesting this enhancement.
SimulationSeed in the example models
The value of SimulationSeed in the ompp example models is now set to 1, so results will differ from previous versions. The previous value of SimulationSeed was 16807, which may have given the misleading impression that 16807 was somehow special as a master seed for the RNGs, which it is not.
Minor release 16 of March 2021
Minor release 16 of March 2021:
- output tables suppression (see below for details).
- fix to Modgen UNDEF_VALUE issue in derived tables (see below for details).
- do not force import of std namespace into model code (this change can break existing models code compilation, see below for details).
- use STL filesystem instead of custom path handling functions.
- cleanup compilation warnings in model c++ code generated by openM++ compiler.
Download source code and binaries:
Download cluster version (MPI):
Linux downloads:
- Desktop version build on Debian-10 and expected to work on any modern Linux, including Ubuntu 20.04 and CentOS 8
- Cluster (MPI) Debian-10 version expected to work on any modern Linux with Open MPI version 3+ installed, including CentOS 8.
- Cluster (MPI) CentOS-8 version require Open MPI 4.x and it would not work on RedHat / CentOS below 8.2 version.
IMPORTANT:
Full version of OpenM++ source code always included into "Download" links above.
Please do NOT use "Source code (zip)" or "Source code (tar.gz)" archives from "Assets" links below.
It is auto-generated by GitHub release tools and contains only half of OpenM++ source code.
Output tables suppression
By default model calculate all output tables and write it into database as model run results. Sometime it may be convenient to save only some output tables to reduce a time of each model run. This can be done by either suppressing model output table(s) or table group(s):
model.exe -Tables.Suppress ageSexIncome
model.exe -Tables.Suppress ageSexIncome,fullAgeSalary,A_TablesGroup
Or by suppressing output for all tables except of some:
model.exe -Tables.Retain ageSexIncome
model.exe -Tables.Retain ageSexIncome,fullAgeSalary,A_TablesGroup
Suppress and Retain options are mutually exclusive and cannot be mixed. For example, this model run would fail:
model.exe -Tables.Suppress ageSexIncome -Tables.Retain fullAgeSalary
Do not force import of std namespace into model code
This release may cause C++ compilation errors in existing models. These errors can be eliminated by inserting the line
using namespace std;
into the model source file custom_early.h.
Starting with this release, openM++ no longer forces the import of the C++ standard library namespace ‘std’ into model code, leaving that choice to the model developer. If the model developer chooses to import the std namespace, model source code can refer to C++ standard library names without a leading std:: prefix, eg.
string s;
If the std namespace is not imported (as in this release), C++ standard library names require a std:: prefix, eg.
std::string s;
Explicit use of the std:: prefix in model code makes clear that the symbol comes from the C++ standard library, which is thoroughly documented with examples at https://en.cppreference.com/w/ and elsewhere. The demonstration models in the openM++ distribution use the std:: prefix to refer to symbols in the C++ standard library.
Fix to Modgen UNDEF_VALUE issue in derived tables
Summary:
This release includes new functions FixedGetTableValue and FixedSetTableValue to replace GetTableValue and SetTableValue to work around a Modgen issue which can result in writing erroneous values (often but not always very large values) to cells of derived tables instead of writing missing (empty) values. To use this functionality in the x-development framework, add the statement:
#include "omc/fixed_modgen_api.h"
to the model file custom.h.
Addressing the issue in Modgen requires that all occurrences of GetTableValue be replaced by FixedGetTableValue and all occurrences of SetTableValue be replaced by FixedSetTableValue.
This is a recommended change and has been implemented in all demonstration models in the openM++ distribution.
If this change is implemented in a model, it is possible that some cells of some derived tables may change. If so, the old values were probably incorrect and the new values correct. See the Details section below for more information on the root cause of these differences.
This issue does not affect openM++. In openM++, the new optional functions are identical to the original functions, and either can be used.
For x-compatible models, FixedGetTableValue and FixedSetTableValue should be used to defend against erroneous derived tables in the Modgen version of a model.
This issue affects many models which use derived tables. It can be detected by a logical analysis of model code, noticing anomalous values in output tables, or by comparing Modgen results to openM++ results. It may manifest more frequently with smaller population sizes due to a higher number of missing table cells. The issue was most recently found in a mechanical comparison of openM++ and Modgen outputs in a large model. The underlying behaviour is documented in the Modgen Developer’s Guide. That said, it is difficult to avoid the underlying issue in all but simple uses of derived tables.
Details:
OpenM++ and Modgen include the concept of derived tables (called user tables in Modgen). Model code which runs after the simulation completes assigns values to a derived table based on the values of other tables, using the function GetTableValue to obtain the value of a table cell, and SetTableValue to write the value of a table cell. A table cell may have an empty (undefined) value, for example if it is a mean with no observations.
In Modgen, if GetTableValue is called for a table cell containing an empty value, the special value UNDEF_VALUE is returned, and if SetTableValue is called with UNDEF_VALUE, a missing (empty) value is recorded. This behaviour is documented in the Modgen Developer’s Guide.
However, if mathematical operations are done using UNDEF_VALUE, a different value may result. Consider the following code fragment:
// if the table cell is empty, Modgen returns UNDEF_VALUE which is 2,147,483,647 and the variable cost is set to that value
double cost = GetTableValue("table.measure", …);
double deflated_cost = cost / 1.05;
// if cell was empty, deflated_cost is 2,045,222,520.952381
SetTableValue("table_deflated.measure", deflated_cost, …);
Because deflated_cost is not equal to UNDEF_VALUE, Modgen thinks it is a valid numeric value, and will write that value to the table cell, producing erroneous output. The value of the cell in table_deflated should be undefined (empty) if cost is undefined.
Standards for floating point math include a special value called a ‘quiet NaN’, where NaN means not-a-number, to handle this kind of situation. A mathematical operation involving a NaN will result in another NaN. In the example, cost would be NaN, and deflated_cost would also be NaN.
OpenM++ uses NaN’s for undefined (missing) values, so missing values propagate correctly in model code, as in the example above.
The new functions in this release convert to and from Modgen’s UNDEF_VALUE and NaN, so that missing (empty) values are NaN, as they are in openM++.
Specifically, in Modgen models
FixedGetTableValue silently converts Modgen’s UNDEF_VALUE to a quiet NaN when reading a cell value, which will then propagate correctly in mathematical operations in model code.
FixedSetTableValue silently converts a quiet NaN to Modgen’s UNDEF_VALUE when writing a cell value.
Note that all logical operations with NaN return false, even ==. In rare situations where it is necessary to determine if a value is NaN, use the C++ standard function
bool std::isnan(x)
Possible new API for derived tables:
The existing API for derived tables has significant design and usability issues.
It might be appealing to replace it with a design which:
1.Enables model code to treat tables, both input and output tables, as normal C++ multi-dimensional arrays, dispensing with the existing string-based interface GetTableValue and SetTableValue.
2.Eliminates the need for the model developer to analyze their own code and specify dependencies among tables
3.Eliminates the need for the model developer to correctly manage the invocation order of multiple UserTables() functions, or portions of code inside such functions, so that upstream tables are computed before computing downstream tables which use them.
4.Enables the framework to compute only the tables required (and in the right order) to produce the specific tables a user requests at run time.
Here’s a short sketch of a language extension which would do that:
1.After the derived_table statement body which gives the dimensions and measures of the table (like user_table now), but before the closing ; which finishes the derived_table statement, the model developer provides a comma separated list of tables which are directly required to compute the derived table.
notional example:
derived_table TheTable {
REGION
*
{
QUANTITY,
RATE
}
}
needs UpstreamTable1, UpstreamTable2
;
2.The openM++ compiler would generate a function declaration with arguments for all upstream tables (read-only) and for the result table (writable), with a function name based on the derived table being computed. Continuing the example, assume that Upstrea...
Minor release 04 of March 2021
Minor release 04 of March 2021:
Resolve specification ambiguity in event processing.
Summary:
This version resolves a specification ambiguity (ie not stating explicitly how something should be done) in ompp and Modgen related to the recomputation of event times. Recomputation of an event time occurs after an event changes an entity attribute used in the time function of the event. The ambiguity comes from an unspecified order of event time recalculations and the possible presence of duplicates.
This change may affect model events and output tables. If model outputs change, any differences are strictly statistical - they are not errors. They are a side effect of Monte Carlo variation (MCE) and tend towards zero as run size (or the number of replicates) is increased.
Of the 30 or so models tested for this ompp version, 4 showed differences: the 3 time-based models CRISM, HPVMM, GMM and the case-based model LifePathsX. All other models tested showed no differences, eg the case-based models RiskPaths, OncoSim, OzProj and the time-based models Dynamis, THIM, IDMM.
Eliminating the specification ambiguity improves exact comparability of ompp and Modgen versions of x-compatible models. It improves exact comparability between future ompp releases. It also improves the correlation of MCE between runs, improving the statistical reliability of run differences.
Because model results may differ from models built with previous ompp releases, this change might be disruptive. Model developers may want to manage the best time to make this change. As with all ompp releases, this version of ompp can co-exist side-by-side with older ompp versions.
This version also resolves the same specification ambiguity for the Modgen version of x-compatible models. This was not done by a change to Modgen, but by a change in the x-compatible files modgen_case_based.mpp or modgen_time_based.mpp. To maintain x-compatibility, model source code files with these names need to be replaced with the versions in this release, which can be found in the code directories of the sample models NewCaseBased and NewTimeBased.
Details:
The architecture of ompp and Modgen is predicated on recalculation of event times having no side-effects on entities. Because an event has not occurred when its next scheduled time is calculated (and may even never occur depending on intervening events), the calculation of a future event time must not, logically, change any attribute of any entity, ie have any side-effects in the present. The absence of any side-effects means that event times can be recalculated freely without affecting model results, statistically. However, if a random number generator (RNG) is used in an event time function, eg when drawing from a statistical distribution of waiting time, the internal state of the RNG changes. An RNG needs to change its internal state to produce a different random value on the next call. So, for example, if an event time function is called once or called twice for the same entity, the statistical effect is identical. However, the presence of the second superfluous call may affect results, because a different random number was used in the calculation of event time. Another example: If the same RNG is used in two different entities A and B (which is what happens with the currently available RNG formulations for time-based ompp models), and if the event time for the same event is recalculated in both A and B after an event occurs (eg a married couple changes region together), then results will depend on whether the event times in A are calculated before B, or whether event times in B are calculated before A, which can affect the future evolution of A and B and model results. Again, the effect is purely statistical. It can, however, impact the comparison of two model runs.
This issue was identified in the StatCan CRISM model, which produced different events and different outputs in ompp and Modgen because ompp and Modgen handled event time processing differently in a particular situation, resulting in different event times and different table results. The situation occurred when linked entities moved together from one region to another due to a triggering event in one of the linked entities. The detailed event traces in the ompp and x-compatible Modgen versions of CRISM become identical after this change.
Specification change:
Event times are recalculated using the same ordering as that used for events, ignoring event time. In addition, a given event (the same event in the same entity) is recomputed at most once when event times are recalculated.
Linux downloads:
- Desktop version build on Debian-10 and expected to work on any modern Linux, including Ubuntu 20.04 and CentOS 8
- Cluster (MPI) Debian-10 version expected to work on any modern Linux with Open MPI version 3+ installed, including CentOS 8.
- Cluster (MPI) CentOS-8 version require Open MPI 4.x and it would not work on RedHat / CentOS below 8.2 version.
Download source code and binaries:
Download cluster version (MPI):
IMPORTANT:
Full version of OpenM++ source code always included into "Download" links above.
Please do NOT use "Source code (zip)" or "Source code (tar.gz)" archives from assets below.
It is auto-generated by GitHub release tools and contains only half of OpenM++ source code.
Minor release 02 of March 2021
Minor release 02 of March 2021:
- make sure model trace file truncated on new model run
- fix language code bug in openMpp R package
- add Linux shell script to start ompp_ui
- pass browser user language to backend web-service
- Docker build: use OS independent build of openMpp R package
Notes:
1.This is a minor release and you can skip it, however we do recommend to install this release if you are using model trace files or openMpp R package.
2.Linux downloads:
- Desktop version build on Debian-10 and expected to work on any modern Linux, including Ubuntu 20.04 and CentOS 8
- Cluster (MPI) Debian-10 version expected to work on any modern Linux with Open MPI version 3+ installed, including CentOS 8.
- Cluster (MPI) CentOS-8 version require Open MPI 4.x and it would not work on RedHat / CentOS below 8.2 version.
Download source code and binaries:
Download cluster version (MPI):
IMPORTANT:
Full version of OpenM++ source code always included into "Download" links above.
Please do NOT use "Source code (zip)" or "Source code (tar.gz)" archives from assets below.
It is auto-generated by GitHub release tools and contains only half of OpenM++ source code.
Minor release 09 of February 2021
Minor release 09 of February 2021
- raise runtime error if entity time uninitialized (non-finite when entering simulation)
- eliminate spurious c++ signed/unsigned warnings using count() in entity sets
- fix: c++ compiler error sometimes occurred with min_over, max_over
Notes:
1.Raise runtime error if entity time uninitialized (non-finite when entering simulation)
Summary:
In OpenM++, an entity must have a valid starting value of time before entering the simulation. This enhancement raises a run-time error and stops the simulation if the starting value of time is non-finite. The model will produce a run-time error message such as the following, and then exit:
Simulation error: error : invalid starting time -inf in new Person with entity_id 1 at global time -inf in simulation member 0 with combined seed 16807
Additional remarks:
At the beginning of the simulation (for time-based models) or the case (for case-based models), before any event has been implemented, global simulation time has the value ‑infinity. After the first event in the simulation (for time-based models) or case (for case-based models), global time will change from ‑infinity to a finite value corresponding to the most recently implemented event. When a new entity is created in the simulation or case, its time attribute is set by default to the current global simulation time. So, any entity created before the first event will have by default a time of ‑infinity. For such entities, model code needs to explicitly set the starting value of time to a finite value before the entity enters the simulation, eg. by inserting "time = 0;" in a Start function.
It is logically appropriate to set global time to -infinity before the first event occurs. Zero is not an appropriate value because a model might reasonably start with negative values of time, eg if time zero is chosen to make a model unrooted in calendar time but distinguish a burn-in period with negative times from a projection period with positive times. As it turned out, initializing global time to ‑infinity was required to address an entity initialization issue in a recent ompp release.
The value 0 is not always a reasonable choice for initializing time. For example, if a new type of entity with time=0 is added to a calendar-based model, it may have a 2000-year catch-up period to other entities in the case and may even count all those the years with a self-scheduling derived attribute like self_scheduling_int(time)
. Yes, that actually happened.
It was necessary to add this feature because a model with an entity with a start time of ‑infinity could produce an endless event loop, because the WAIT()
function will always return ‑infinity if current time is ‑infinity, so time will never advance.
Modgen note:
Modgen sets the default starting time of an actor created before the first event to 0, although that fact seems undocumented in the Modgen Developer's Guide.
It is highly recommended to install this release and re-build your models.
2.Eliminate spurious C++ signed/unsigned warning when using the Count function in entity sets
Summary:
In ompp the use of the Count function in model code which iterates an entity set may produce C++ warning messages such as
warning C4018: '<': signed/unsigned mismatch (compiling source file src/om_developer.cpp)
These warning messages should no longer occur. Thanks to Martin Spielauer for pointing out this issue.
Additional remarks:
These warning messages clutter the output and make it harder to implement an "eliminate all warnings" policy to make model code more robust. This modification arranges that the Count function return type int, which is typically used for iteration in for loops. A future version of ompp may add ranged-based-for iteration of entity set collections, rendering the need to initialize and increment counters unnecessary. To ensure correct values from Count() in this revised implementation, please ensure that entity set size not exceed 2,147,483,647 for 32-bit models, or 9,223,372,036,854,775,807 for 64-bit models.
- Linux downloads:
- Desktop version build on Debian-10 and expected to work on any modern Linux, including Ubuntu 20.04 and CentOS 8
- Cluster (MPI) Debian-10 version expected to work on any modern Linux with Open MPI version 3+ installed, including CentOS 8.
- Cluster (MPI) CentOS-8 version require Open MPI 4.x and it would not work on RedHat / CentOS below 8.2 version.
Download source code and binaries:
Download cluster version (MPI):
IMPORTANT:
Full version of OpenM++ source code always included into "Download" links above.
Please do NOT use "Source code (zip)" or "Source code (tar.gz)" archives from assets below.
It is auto-generated by GitHub release tools and contains only half of OpenM++ source code.
04, of February 2021: new ways to specify the number of cases in case-based models
04, of February 2021: new ways to specify the number of cases in case-based models
- new ways to specify the number of cases in case-based models
- bug fix to time in initialization of linked entities
- start simulation (or case) with global time set to -time_infinite
- fix: label for a table measure or an identity attribute was sometimes ignored
- UI: persistent veiw for model parameters, save and restore default parameter view
- fix output table decimals issue
Notes:
1.This release contains new functionality and important bug fixes in openM++ core.
It is highly recommended to install this release and re-build your models.
2.Bug fix to time in initialization of linked entities
An issue has been resolved relating to the initialization of time when an entity is created by model code during the creation of another entity, and the two entities are linked during initialisation.
Thanks to Martin Spielauer for reporting the issue and providing a worked example.
3.New ways to specify the number of cases in case-based models
This release includes new functionality in 'use' modules to specify the number of cases to simulate in case-based models. Current case-based models specify the number of cases in an entire run in a parameter SimulationCases, and those cases are partitioned equally (to the extent possible) among the members in the run. Included in this release is an alternate 'use' module which instead specifies the number of cases per member (aka subsample, replicate) using the parameter CasesPerMember. In such a model, the total number of cases in a run is the product of CasesPerMember and the number of members specified for the run. This is a more natural way to specify the number of cases for models which use members to represent independent draws from statistical distributions to estimate uncertainty in results. It also fits well with the ompp capability to simulate and store results for runs with different numbers of members, where lower-numbered members share identical draws. That capability allows, for example, a comparison between a run with 16 members and a run with 256 members, by using only the first 16 (comparable) members common to the 2 runs.
This release also contains a 'use' module which allows a case-based model to specify the number of cases endogenously rather than through a parameter. This may be appropriate for a model which uses a microdata input file which needs to be processed in its entirety to produce valid results. Such a model would set the number of cases internally to the number of cases in the input microdata file.
These new capabilities required refactoring some existing 'use' modules. This refactoring was done in such a way that existing models should be unaffected. An example with the new refactoring can be found in the model NewCaseBased included with the ompp distribution.
Please report any problems building existing models with this ompp release.
These new capabilities are not Modgen-compatible. Modgen models can only specify cases for an entire run, using the parameter SimulationCases.
For more information on these and other 'use' modules, please see our wiki. Please note that this portion of our wiki is a work-in-progress.
Parenthetically, these new capabilities were added to provide a clean and general foundation
for the number of cases in case-based models, prior to a forthcoming implementation of case weights in ompp.
The implementation of case weights will involve three aspects: the case weight, the number of cases, and population scaling.
- Linux downloads:
- Desktop version build on Debian-10 and expected to work on any modern Linux, including Ubuntu 20.04 and CentOS 8
- Cluster (MPI) Debian-10 version expected to work on any modern Linux with Open MPI version 3+ installed, including CentOS 8.
- Cluster (MPI) CentOS-8 version require Open MPI 4.x and it would not work on RedHat / CentOS below 8.2 version.
Download source code and binaries:
Download cluster version (MPI):
IMPORTANT:
Full version of OpenM++ source code always included into "Download" links above.
Please do NOT use "Source code (zip)" or "Source code (tar.gz)" archives from assets below.
It is auto-generated by GitHub release tools and contains only half of OpenM++ source code.
Minor release 12 of January 2021
Minor release 12 of January 2021
- fix single cumrate problem, e.g.:
cumrate CumrateSingle[1];
- update axios version to 0.21.1 to patch security issue CVE-2020-28168 identified by GitHub
Notes:
-
This is a minor release and you can skip it if single cumrate problem breaks model compilation.
-
Linux downloads:
- Desktop version build on Debian-10 and expected to work on any modern Linux, including Ubuntu 20.04 and CentOS 8
- Cluster (MPI) Debian-10 version expected to work on any modern Linux with Open MPI version 3+ installed, including CentOS 8.
- Cluster (MPI) CentOS-8 version require Open MPI 4.x and it would not work on RedHat / CentOS below 8.2 version.
Download source code and binaries:
Download cluster version (MPI):
IMPORTANT:
Full version of OpenM++ source code always included into "Download" links above.
Please do NOT use "Source code (zip)" or "Source code (tar.gz)" archives from assets below.
It is auto-generated by GitHub release tools and contains only half of OpenM++ source code.