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.