Skip to content

vrtulka23/scinumtools

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

468 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

PyPI Supported Python Versions PyTest License Docs

SciNumTools v2

scinumtools

Python package scinumtools contains essential tools for scientific and numerical calculations, simulation setup and data analysis.

It is intedended for computational and simulation-focused scientists and engineersโ€”especially Python users dealing with units, configurations, and complex numerical workflows.

๐Ÿ” What problem does this solve?

Modern scientific and engineering workflows often require combining symbolic expressions, numerical evaluation, unit handling, and material-specific data into a single pipeline. In practice, these components are typically handled by separate tools:

  • numerical computation (e.g. NumPy/SciPy)
  • symbolic manipulation (e.g. SymPy)
  • unit systems (e.g. Pint)
  • configuration formats such as YAML or JSON

This fragmentation introduces several recurring problems:

  • Inconsistent representations between symbolic and numerical stages
  • Manual and error-prone unit conversions
  • Difficult integration of domain data (e.g. material properties)
  • Lack of validation for input parameters, leading to silent errors or physically invalid configurations
  • Configuration formats lack native support for domain semantics, requiring external interpretation layers

In particular, while formats like YAML are widely used for configuring simulations and models, they do not treat units as first-class entities. As a result, units are either omitted, encoded as strings, or handled externally, which increases the risk of misinterpretation and inconsistencies. Similarly, parameter definitions are typically not validated beyond basic typing, making it easy to define incomplete, incompatible, or physically meaningless inputs.

This project addresses these issues by providing a cohesive framework that integrates expression parsing, evaluation, unit-aware computation, and parameter validation into a single, consistent environment. The goal is not to replace established numerical libraries, but to bridge the gap between symbolic definitions, physical units, structured configuration, and domain-specific data in a lightweight and extensible way.

Note

SciNumTools v2 is implemented in Python and targets Python-based workflows. In contrast, SciNumTools v3 is implemented in C++, moving parameter parsing, unit handling, and validation into a compiled core. This allows configurations to be processed directly within performance-critical code and enables integration with HPC systems and other languages without relying on Python.

โœจ Key features

  • Expression parsing and evaluation
    A flexible system for defining and evaluating mathematical expressions, enabling workflows that combine symbolic structure with numerical execution.
  • Integrated unit handling
    Built-in support for physical units allows calculations to remain consistent and reduces the risk of unit-related errors during model development.
  • Validated parameter definitions
    Parameters can be defined with constraints and semantic meaning, enabling early detection of invalid, inconsistent, or incomplete inputs.
  • Unit-aware configuration support
    Provides a structured alternative to plain YAML-style configurations, where values, units, and constraints are handled explicitly rather than implicitly.
  • Material property integration
    Enables structured inclusion of material-specific parameters directly into computational workflows, avoiding scattered or hard-coded values.
  • Domain-oriented design (DIP support)
    Supports domain-informed processing pipelines, allowing users to encode problem-specific logic while maintaining a clear computational structure.
  • Modular and extensible architecture
    Components such as parsing, evaluation, and data handling are composable and adaptable to different scientific domains.
  • Lightweight and Python-native
    Designed to integrate easily with existing Python ecosystems without imposing heavy dependencies or complex setup requirements.

๐Ÿ“š Documentation

For more information, see the scinumtools documentation. Any comments and suggestions for improvement are heartily welcomed.

โšก Quick start

The newest release of scinumtools is available on PyPi and can be easily installed using pip package manager:

pip3 install scinumtools

The package is organized into four main submodules: expression solver, physical units, material properties, and DIP (Dimensional Input Parameters), which provides structured, unit-aware configuration and validation.

The examples below demonstrate individual components. For complete workflows, see the examples directory or test cases in tests directory.

๐Ÿงฎ Expression Solver

Using expression solver one can quickly build a custom parser that can process numerical, logical and textual expressions. This module is an integral part of other submodules. For more description and examples of Expression Solver, please refer to the documentation. C++ implementation of this module is available in a separate GitHub repository.

>>> from scinumtools.solver import *
>>> class AtomCustom(AtomBase):
>>>     value: str
>>>     def __init__(self, value:str):
>>>         self.value = str(value)
>>>     def __add__(self, other):
>>>         return AtomCustom(self.value + other.value)
>>>     def __gt__(self, other):
>>>         return AtomCustom(len(self.value) > len(other.value))
>>> operators = {'add':OperatorAdd,'gt':OperatorGt,'par':OperatorPar}
>>> steps = [
>>>     dict(operators=['par'],  otype=Otype.ARGS),
>>>     dict(operators=['add'],  otype=Otype.BINARY),
>>>     dict(operators=['gt'],   otype=Otype.BINARY),
>>> ]
>>> with ExpressionSolver(AtomCustom, operators, steps) as es:
>>>     es.solve("(limit + 100 km/s) > (limit + 50000000000 km/s)")
'False'

๐Ÿ“ Physical Units

This submodule has an aim to make calculations with physical units quick and easy. It includes multiple types of units, constants and implements standard numerical operations with physical quantities. Besides that, it features a unit convertor, supports calculations with uncertainties and can be used in combination with third-party libraries like NumPy, or Decimal. For more description and examples of Physical Units, please refer to the documentation. A C++ implementation of this module scnt-puq is currently available also as a Python module pypuq on PyPi.

>>> import numpy as np
>>> from scinumtools.units import Quantity, Unit
>>> Quantity(23.34, 'kg*m2/s2').to('erg')     # unit conversions
Quantity(2.334e+08 erg)
>>> u = Unit()                                # calculations with units
>>> 34*u.cm + 53*u.dm  
Quantity(5.640e+02 cm)
>>> Quantity(23.34, 'cm', abse=0.03)          # uncertainties
Quantity(2.3340(30)e+01 cm)
>>> Quantity(3, 'A').value('dBA')             # logarithmic units
9.542425094393248
>>> np.sqrt(Quantity([23,59,20,10], 'm2'))    # arrays and NumPy
Quantity([4.796 7.681 4.472 3.162] m)

๐Ÿงฑ Material Properties

Simulation setups often require atomic and molecular properties of various materials. The core of this submodule, molecular expression solver, is designed to simplify calculations of such properties from a given molecular formula. For more descriptions and examples of Material Properties, please refer to the documentation.

>>> from scinumtools.units import Quantity
>>> from scinumtools.materials import Substance
>>> s = Substance('H2O', natural=False, mass_density=Quantity(997,'kg/m3'), volume=Quantity(1,'l'))
>>> s.print()
Components:

expr element  isotope  ionisation  mass[Da]  count  Z  N  e
   H       H        1           0  1.007825    2.0  1  0  1
   O       O       16           0 15.994915    1.0  8  8  8

Composite:

Total mass:     Quantity(1.801e+01 Da)
Total number:   3.0

expr  mass[Da]         Z        N         e       x[%]       X[%]
   H  2.015650  2.000000 0.000000  2.000000  66.666667  11.191487
   O 15.994915  8.000000 8.000000  8.000000  33.333333  88.808513
 avg  6.003522  3.333333 2.666667  3.333333  33.333333  33.333333
 sum 18.010565 10.000000 8.000000 10.000000 100.000000 100.000000

Matter:

Mass density:   Quantity(9.970e-01 g*cm-3)
Number density: Quantity(3.334e+22 cm-3)
Volume:         Quantity(1.000e+00 l)
Mass:           Quantity(9.970e+02 g)

expr      n[cm-3]  rho[g/cm3]            N       M[g]
   H 6.667280e+22    0.111579 6.667280e+25 111.579129
   O 3.333640e+22    0.885421 3.333640e+25 885.420871
 avg 3.333640e+22    0.332333 3.333640e+25 332.333333
 sum 1.000092e+23    0.997000 1.000092e+26 997.000000

๐ŸŽ›๏ธ Dimensional Input Parameters

DIP is a serialization language that was designed to collect, manage, convert, document and validate dimensional input parameters used by numerical codes. The main goal of this package is to help developers to focus less on the initialization processes mentioned above and more on actual code development. DIP should serve as a quick tool that makes the user interface with the code clear and straightforward. For more description and examples of DIP, please refer to the documentation. A C++ implementation of this library is currently being developed in a separate GIT repository.

>>> from scinumtools.dip import DIP, Format
>>> with DIP() as dip:
>>>     dip.add_source("settings", 'settings.dip')
>>>     dip.add_unit("length", 1, "m")
>>>     dip.add_string("""
>>>     box
>>>       width float = 23 [length]
>>>       height float = 11.5 cm
>>>     sphere
>>>       radius float = {settings?sphere.radius}
>>>     """)
>>>     env = dip.parse()
>>>     env.data(Format.TUPLE)
{'box.width': (23.0, '[length]'), 'box.height': (11.5, 'cm'), 'sphere.radius': (34.2, 'mm')}

The alternative Python module dipl implements basic loading and dumping functionality of DIP and provides a quick solution for data parsing using DIP.

>>> import dipl
>>>
>>> dipl.load("""
>>> width float = 173.34 cm
>>> age int = 24 yr
>>> """)
{'width': (173.34, 'cm'), 'age': (24, 'yr')}
>>>
>>> dipl.dump({
>>> 'children': ['John','Jenny','Jonah'],
>>> 'car': True
>>> })
children str[3] = ["John","Jenny","Jonah"]
car bool = true

๐Ÿค Contributing, Issues & License

Contributions are welcome. If you find a bug, have a feature request, or want to improve the code or documentation, please open an issue or submit a pull request on GitHub.

  • Issues: Use the issue tracker to report bugs, suggest features, or ask questions
  • Contributing: Fork the repository, create a feature branch, and open a pull request with a clear description of your changes
  • License: This project is released under the MIT License (see LICENSE file for details)

About

Python toolkit for unit-aware scientific computation with runtime expressions and validated parameters.

Topics

Resources

License

Stars

Watchers

Forks

Contributors

Languages