Skip to content
BETSE 1.0.0 (Mighty Maxwell) released.

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.