modelx v0.25.0 (18 February 2024)#
This release introduces the following enhancements, backward-incompatible changes and bug fixes.
To update to modelx v0.25.0, use the following command:
>>> pip install modelx --upgrade
Anaconda users should use the conda
command instead:
>>> conda update modelx
Enhancements#
Introduction of a new property Model.path#
This release introduces a new property path
to the Model
class.
This property holds the path from which the model is loaded or to which it is saved,
represented as a pathlib.Path object.
This property can be accessed within formulas using the special reference _model.path
.
This property make it possible for formulas to locate external files by using paths relative to the model’s location.
Python 3.12 support#
modelx now supports Python 3.12.
Backward Incompatible Changes#
Spec changes due to C-level recursion avoidance#
In this release the following two spec changes are introduced:
The ability to call cells within formulas using the subscription operation
[]
will be removed. This feature was primarily syntactic sugar, so users can adapt their models to use the call operation()
instead.Other methods on
Cells
, such asmatch()
, will not be available anymore. If needed, cells can still be accessed directly using_space.cell_name
, wherecell_name
is the specific name of the cells.
Rationale for backward-incompatible changes
In Python versions prior to 3.11, Python’s recursion mechanism triggered C-level recursion, meaning the recursion depth in Python was constrained by the size of the C-stack.
With Python 3.11, there was a significant change:
Pure Python recursion won’t induce C-level recursion anymore.
This separation appeared to address the issue initially.
However, the introduction of a hardcoded limit on C-level recursion in Python 3.12
revealed that certain dunder methods, like __call__
and __getitem__
, still induce C-level recursion.
Since modelx heavily relies on cells objects calling other cells through __call__
or __getitem__
in their formulas,
the recursion limit for modelx formulas is effectively bound by the C-level recursion limit.
Although Python core developers have plans to increase the hardcoded limit on C-level recursion in future Python releases,
it doesn’t fully resolve the core issue: the modelx recursion limit remains constrained by the C-stack size,
which varies across different platforms. For instance, on Windows, the default C-stack size is smaller and can’t be altered after thread initiation. This limitation has been circumvented by initiating a new thread with a larger stack size for formula execution. In contrast, Linux allows dynamic increase of the C-stack size.
To address this issue comprehensively, a backward-incompatible change is introduced:
In the namespace associated with a modelx space, cell names will now be bound to the CellsImpl.call
method,
bypassing the Cells.__call__
method. This adjustment effectively detaches modelx recursion from C-level recursion,
rendering the recursion in modelx virtually limitless on all supported platforms (Windows, MacOS, Linux).
This restructuring aims to future-proof modelx against recursion limits across different future Python versions and operating systems.
Bug Fixes#
AssertionError during export with Python 3.12 (GH93)
PermissionError in
read_model()
on Windows due to a known issue.