Significant changes include:
* Discrete exterior calculus (DEC). In the seed phase, BETSE now
rigorously constructs the Voronoi diagrams and dual triangular meshes
underlying all cell clusters according to DEC theory. DEC operators
and methods are available for external use via the newly introduced
"cells.mesh" object.
* New "fast" and "full" solver types. BETSE can now work from an
equivalent circuit model formalism (e.g. Hodgkin-Huxley based model of
bioelectricity) using the new "fast" solver or from its original
molecular view of bioelectricity using the "full" solver type. This
allows users to tailor their computational perspective to the needs of
their biophysical problem.
* Expression profile read-in. BETSE can now read in expression levels
from a user-defined expression configuration file for any
custom-defined biomolecule, transporter, or channel. This allows
different levels of a biomolecule, transporter, or channel to be
specified on all of the user-defined tissue profiles of a BETSE model,
where expression data can be sourced from experiments or experimental
databases.
* Single cell simulation. BETSE can now simulate a single cell, a
feature requested for fast prototyping of certain simulations.
* SVG model definition. In addition to the original bitmap method of
defining cell cluster and tissue profiles, BETSE also allows use of
Scalable Vector Graphics (SVG) files to define exact locations of
cells in your cluster, with the fill colors of circles defined by
these files now assigning the cell centred at that circle to the
tissue profile associated with that color.
* Mesh refinement. Optionally run a refinement algorithm on BETSE meshes
to generate more computationally robust model geometries.
* Modulator functions. Use a customizable modulator function (e.g.
gradient along the x-axis) to modulate expression of custom
biomolecules, transporters, or pumps.
* Significant bugs resolved, including:
* Gene regulatory network (GRN) equilibrium guarantees. Reactions and
transporter rate expressions in user-defined GRNs now converge to
the appropriate equilibrium constants.
* Arrowhead size in exported visuals sanitized. Arrowheads in exported
stream plots and animations are now sized appropriately rather than
oversized.
* Cation leak channels.
* Deprecations and warnings resolved, including:
* Deprecated usage of the "pytest.config" global. The
betse_test.conftest.pytest_configure() hook now sets the
"betse_test.conftest.EXPORT_SIM_CONF_DIRNAME" global to the value of
the "--export-sim-conf-dirname" option, circumventing
"pytest.config" entirely.
* Deprecated usage of the yaml.load() function with no explicit
"Loader". The betse.lib.yaml.yamls._load_pyyaml() function now
dynamically calls whichever of the yaml.full_load() or yaml.load()
functions are available for the current version of PyYAML, thus
circumventing yaml.load() insecurities under newer PyYAML versions.
* Simulation configuration improvements, including:
* Nameable exports. A human-readable name (e.g., "Cell Cluster:
Transmembrane Voltage") may now be associated with each pipelined
export, including plots, animations, and CSV-formatted files.
* Obsolete settings removed, including:
* A vestigial block of intervention-specific settings.
* Data descriptor encapsulation. Various settings derived from the
currently open YAML-formatted simulation configuration file have now
been refactored from low-level instance variables of the
"betse.science.parameters.Parameters" class to high-level
yaml_alias()-based data descriptors, enabling downstream consumers
(e.g., the BETSEE GUI) to transparently propagate modifications to
these settings back to this file. These include settings pertaining
to:
* Enumeration (i.e., indexation, numbering) of cells in the cell
cluster.
* Matplotlib colormap names.
* Documentation improvements, including:
* Tutorials. Official user- and developer-specific BETSE tutorials
have now been added to the repository. A "Tutorials" subsection
listing this documentation has also been the top-level "README.rst"
file.
* Simulation configuration settings, including:
* Application-specific matplotlib colormaps. Our default
YAML-formatted simulation configuration file now exhaustively
lists the names of all available application-specific matplotlib
colormaps.
* Test suite improvements, including:
* "py.test" exit code. The top-level "test" script now correctly
reports the exact exit code reported by the "py.test" test suite.
* Additional unit tests, including:
* The "betse_test.unit.type.iterable.test_iterables" submodule,
which now exercises the overly intricate and hence fragile
betse.util.type.iterable.iterables.to_iterable() function.
* Debuggability improvements, including:
* Type validation debuggability. Wrapper functions synthesized by the
@type_check decorator now sport the disambiguous name
"__{func_name}_type_checked__" rather than the ambiguous name
"func_type_checked".
* API generalizations, including:
* The "betse.science.pipe" subpackage, such that:
* The existing SimPipeABC.iter_runners_conf() method is now
constrained to strictly return indexable sequences rather than
possibly non-indexable iterables, as external callers commonly
require the former.
* The new SimPipeABC.iter_runners_metadata_kind() method returns a
sequence of the types of all runners declared by the current
pipeline (in sorted lexicographic order).
* The prior "SimPipeRunnerMetadata.name" instance variable has been
renamed to "SimPipeRunnerMetadata.kind" for disambiguity with the
unrelated "name" data descriptor of runner subconfigurations.
* The "betse.lib.matplotlib.mplcolormap" submodule, which defines:
* The iter_colormap_names() iterator, yielding the names of all
currently registered matplotlib colormaps (in sorted lexicographic
order).
* The "betse.util.math.geometry.geopoint" submodule, whose is_point()
function has been generalized to test whether coordinates of each
passed point are strictly numeric or not.
* The "betse.util.type.iterable.iterables" submodule, whose:
* to_iterable() function has been generalized to optionally accept
an "item_cls" parameter, which when non-None coerces all items of
the returned iterable to instances of that parameter.
* The "betse.util.type.iterable.iterget" submodule, whose:
* Newly defined get_item_first() and get_item_first_or_sentinel()
functions retrieve the first items from arbitrarily many
iterables.
* get_item_str_uniquified() has been generalized to optionally
implicitly synthesize default string values for non-compliant
items, as needed for preserving backward compatibility.
* The "betse.util.type.iterable.itersort" submodule, whose:
* _sort_iterable() function has been optimized for the common case
of generators and generator comprehensions.
* The "betse.util.type.iterable.itertest" submodule, whose:
* is_items_unique() function has been:
* Generalized to support iterables not satisfying the
"collections.abc.Sized" protocol (e.g., generators).
* Optimized to induce best-case time complexity in the average
case.
* The "betse.util.type.iterable.mapping.mappings" submodule, which
defines:
* A pair of related die_unless_keys_equal() and is_keys_equal()
functions, efficiently validating and testing whether the passed
set of dictionaries all contain the exact same keys.
* The "betse.util.type.iterable.sequences" submodule, which defines:
* The get_index() function, enabling callers to retrieve items with
arbitrary indices from arbitrary sequences in a manner guaranteed
to raise human-readable exceptions on failure.
* The "betse.util.type.obj.objects" submodule, whose:
* get_method() function has been renamed to get_callable().
* get_method_or_none() function has been renamed to
get_callable_or_none().
* "method_name" parameters accepted by both of the aforementioned
functions have been renamed to "callable_name".
* The "betse.util.type.text.string.strjoin" submodule, which defines:
* A new join_iterable_as_conjunction_double_quoted() function
implicitly coercing all items of the passed iterable to strings.
* The "betse.util.type.types" submodule, which now defines:
* The special "MethodWrapperType" type, formerly available only
under Python >= 3.7 as "types.MethodWrapperType".
* A "ContainerTypes" type supporting both standard Python containers
and Numpy arrays, replacing the prior "ContainerType" type not
supporting Numpy arrays.
* A "SequenceStandardTypes" tuple of all standard sequence types
(i.e., "list", "tuple").
* Significantly fewer obsolete testers and asserters, which have now
been permanently removed in favour of the @type_check decorator.