Releases: amkrajewski/nimplex
v0.8.0
Major Changes:
-
Implemented a new functionality of generating limited compositional graphs where one can independently select min/max values of each component, expressed as either integer limits expressed as quanta of
nDivdivisions per component/dimension (e.g.,[[0,12],[2,8],[0,6]]) or fractional limits (e.g.,[[0,1],[0.167,0.667],[0,0.5]]), both of which are inclusive, with the latter collapsed to the nearest intexger point (which for a given float depends onnDiv). A simple example if depicted in the figure below.
The implementation is quite efficient, taking the same order of magnitude of time and space as the unconstrained graph generation, despite several additional things that need to be computed. It can be used to generate limited graphs of arbitrary dimensionality, expressing design problems like "any high entropy alloy (HEA) with at least 5% and at most 45% of each of 7 metallic components, less than 5% of boron, and between 4% and 12% of carbon". A simple example of such cutout from a larger compositional space is depicted below.
This functionality can, as usual, be accessed through (1) the nim interface by calling simplex_graph_limited(dim: int, ndiv: int, limit: seq[seq[int]]) or simplex_graph_limited_fractional(dim: int, ndiv: int, limit: seq[seq[float]]), (2) respective Python bindings simplex_graph_limited_py or simplex_graph_limited_fractional_py, or (3) from the command line interface (CLI), outputting shape, data, or NumPy stored data; e.g. by requesting Limited graph with Fractional node positions in NumPy format with specific limits:
./nimplex -c LFN 4 12 "[[0,1],[0,0.666],[0.153,0.5],[0.075,1]]"- Comprehensive set of tests has been added for the limited graph functionality and several other tests were improved.
Minor Changes:
- Improved
devcontainer.jsonandDockerfiles, used for running tutorials, to be faster and more reliable. - Documentation improvements including updated
README, documentation webpage,CITATION.cff. - Updated the testing suite runners to reflect current popular systems.
Full Changelog: v0.7.1...v0.8.0
v0.7.1
Minor Changes:
- The
nimblebranch installation, which is the one installed bynimble install nimplex(similar to Python'spip install), now adds a binary installation to its effects; thus, as long as you havenimblepackage directory in your PATH, you should be able to runnimplex's CLI by just typingnimplexin your command line. You can alternatively call it directly, depending on your system (e.g.,~/.nimble/bin/nimplexfor default installation on Ubuntu). - Imports in the
utilssubmodules on thenimblebranch were adjusted to work both with and without all ofnimplexinstalled for the convenience of users compiling certain parts as Python.so/.pydlibraries. - The
nimbleversion now includes slightly modified tests to account for its slightly different structure. - This version addresses recent issues with
Arraymancer's CUDA dependency on certain machines by pinningnimcudato a slightly older version.
Full Changelog: v0.7.0...v0.7.1
v0.7.0
Major Changes:
-
Finalized the
stitchingutility (docs here) which contains functions related to the automation of combining ("stitching") of the compositional graphs to form graph complexes so that much more complex graphs can be built from simpler ones while retaining homogeneous structure of the space. Furthermore, one can keep track of the provenance of the subgraphs and use this information to deploy computational (e.g., ML) models on the per-subgraph basis, which should be extremely useful for (a) combining the power of many specialized models and (b) creating stacked spaces for multi-step problems broken down into individual steps. -
Added a Jupyter notebook
03.CompositioalSpaceComplexes.ipynbdemonstrating the new graph complex construction ("stitching") capability. The included runnable examples demonstrate how to:-
Plot graphs using
igraph, which can be done quite directly usingnimplex's point grid and neighbor listsedges = [(i,n) for i in range(len(gridAtt)) for n in nList[i]] -
Identify ordered subsystems in
nimplexgrids, likeA-B-CandC-A-BwithinA-B-C-D-EandD-C-G-F-A-H-Bto establish connectivity between them. We will use this to combine 3 4-component systems (tetrahedra) by 2 3-component subsystems (triangles) to create a chain.
- Identify all subspaces of a given order in low dimensional and high dimensional spaces (e.g., all quantized compositions of any 3 things out of N) and combine ("stitch") them together to form a simplex graphs that intersect themselves in 3D because of high dimensionality, yet still have the same (graph) structure.
- Construct a graph complex to explore all ternary combinations of
["Ti50Zr50", "Hf95Ti5", "NbTaWHf", "Mo80Nb10W10", "TiTa2", "Nb96Mo3W1", "Zr49 Hf1 Mo50"](7 alloys) under equilibrium phase constraint (relatively expensive to compute) and then explore the space with an additional low-cost screenig constraint (RMSAD - alloy strenght surrogate) that could also be an ML surrogate.
-
-
Added automated tests for the new stitching capability.
-
Improvements in the (prototype!) plotting library in
utils/ternaryPlot.nim. It will be finalized and officially supported in the next major future release.- Many code improvements, including work towards more generality.
- Added new open-source font (
MartianMono). - Label placing improvements.
- Higher visibility path plotting with
pathType = "highvis"option - Improved path visibility alongside the edges
- Added color selection with OKlab for any N-component elemental space.
- Added some experimental Python bindings. More will follow for the most common use cases.
- Experimental phases-plotting example.
-
The paper has been accepted at the npj Unconventional Computing journal!
Minor Changes:
- Documentation improvements.
- Added
.pre-commit-config.yamlhooks with some basic checks. - Updated installation instructions.
- Added an example on how to call
pythonfunctions fromnim.
Full Changelog: v0.6.0...v0.7.0
v0.6.0
Major Changes
-
Created an example end-use tutorial on Path Planning in Functionally Graded Materials based on thermodynamic calculations and machine learning while leveraging
nimplexto effortlessly create design spaces formed by alloy powders while relating them to underlying elemental space and describing all possible changes to every composition through simplex graphs which can then encode property-related problems such as avoiding high gradient magnitude changes (see example below).

The thermodynamic calculations usepycalphadand modified strength surrogate model by Tandoc2023 (10.1038/s41524-023-00993-x) is used as an example for property modeling. You can quickly play with it by opening the Codespace below. Everything is pre-installed and you just need to follow a Jupyter notebook (Tutorial 02): -
Added a high entropy alloy thermodynamic database by @ShuangLin212 for users to play with when combined with pycalphad in the aforementioned tutorial.
-
Added a (beta of) high-quality high-performance plotting script under
utils/ternaryPlot.nimwhich generates neat highly-automated ternary plots with compositional, property, desirability, and feasibility overlays. Multiple axis and labeling options can be used. In the future, this will be turned into a binarynimandpythonlibraries callable from tools likePyTorch. You can see example renders at the end of this release note. -
Improved the CLI interface experience by colorizing the terminal outputs and streamlining instructions.
Minor Changes
- Updated Action definitions.
- Proofread of documentation and tutorial by @amkrajewski, @amr8004, @rdamaral, and @bocklund.
- Minor updates in the first tutorial.
New Contributors
Full Changelog: v0.5.1...v0.6.0
v0.5.1
Major Changes:
-
Running simplex graph generation using CLI to check its shape (
__Sconfigurations), now counts all graph edges (possible transitions). E.g../nimplex -c GIS 7 12now returns:Running with configuration: @["GIS", "7", "12"] Nodes Shape: [18564, 7] Edges Count: 519792
Minor Changes:
- Edge counting (see above) added to the testing suite.
- Minor optimizations all around.
- Stylistic improvements in the CLI text printouts.
- Added new changelog-generating script for the documentation page.
- Quick Start style improvements by @rdamaral
- Documentation style improvements by @lukeamyers
New Contributors:
- Thanks to @rdamaral for making his first contribution in the form of proofreading and improving style of the
quickstart.ipynbexamples notebook!
Full Changelog: v0.5.0...v0.5.1
v0.5.0 (Public Release)
Major Changes:
- Added helper functions
pure_component_indexesandpure_component_indexes_internalto immediately get positions of all pure components in the grid / graph nodes. Also added matching Python bindings. - Added a Quick Start guide Jupyter notebook showing how to use nimplex in Python as a native library or through CLI with any other language like Julia (through binary data exchange) or Ada (through plain text). Also, added the
devcontainer.jsonspecification. Now, you can immediately lunch an environment and play with nimplex in one click!
- Optimized
nimpyimports and Python binding compilation based on the use case to make our fast compilation even faster and our small binary even smaller.
Minor Changes:
- Moved the documentation introduction to a separate file, to keep core library file relatively concise.
- Small typo fixes all around the software.
- Added a convenience script
runAll.niminteststo run them all in a predetermined order. Simply:nim c -r -f -d:release tests/runAll
- Added a nice new logo!
New Contributors:
- Thanks to @lukeamyers for catching a typo in one of the Python binding function names and making his first contribution to nimplex!
Full Changelog: v0.4.4...v0.5.0
v0.4.4
Major Changes:
- Automated compilation and upload of binaries into the release for a platform matrix (Linux X86_64, Windows X86_64, Mac X86_64 (intel), Mac ARM64 (M1/2/3).
Full Changelog: v0.4.3...v0.4.4
v0.4.3
Major Changes:
- Introduced
utilsdirectory for utility submodules not needed in the core library. - Added utility procedure for moving from simplex to cartesian coordinates for plotting purposes.
- Officially added the MIT license to the repository.
Minor Changes:
- Documentation improvements.
Full Changelog: v0.4.2...v0.4.3
v0.4.2
Major Changes:
- Implemented several procedures (most critically
attainable2elemental) related to the interaction between elemental compositional spaces and attainable compositional spaces. One can now, for instance, take several different steels and link all possible compositions they can create to the space of pure elements. 5 high-level Python-only functions were added.
Minor Changes:
- Added tests for
attainable2elemental. - Added runnable examples for
attainable2elemental.
Full Changelog: v0.4.1...v0.4.2
v0.4.1
Major Changes:
- Documented all functionalities of the code in both generated documentation webpage and README.
- Automated the testing process. Iterated through several improvements to it.
- Reorganized parts of the code to skip or include them during (1) documentation generation and (2) library packaging (for Python); all to keep things clean.
Minor Changes:
- Improved the software description for nimble.
- Added auxiliary information to the documentation, such as an introduction to compositional spaces.
- Simplified
outFunctionparameters and operation.
Full Changelog: v0.4.0...v0.4.1




