Skip to main content

Explicit Units and Dimensional Analysis for Scientific Python

Project description

PicoUnits

Explicit units and dimensional analysis for scientific Python – Built with care by William Bowley


Writing experimental physics models? Need to check dimensions at boundaries? Annoyed by vague configuration files? PicoUnits might be what you're looking for.

PicoUnits is a lightweight dimensional analysis library and DSL for writing dimensionally explicit Python code. PicoUnits support real numbers, complex numbers, and arrays based vectors. It is also a custom DSL called .uiv (unit-informed values), which allows for explicit units in configuration or reference libraries.

PicoUnits: Usage

Python Version License

Picounit is a single dependency (numpy) Python package that does dimensional analysis at runtime. Key features:

  • Pluggable unit systems: Define custom "Unit Frames" for your domain
  • Configuration format: .uiv files with embedded, validated units & .ut for unit types
  • Boundary validation: @unit_validator decorators catch errors at function interfaces
  • Full numeric support: Real, complex, and array-based vectors

But instead of talking about it, let's see some examples:

>>> from PicoUnits import MILLI, LENGTH
>>> 12 * MILLI * LENGTH + 10 * LENGTH
>>> 10.012 (m)

As expected, it returns 10.01 meters, but what is a unit? A more exotic feature of PicoUnits is that its fundamental units are fully abstract. We call this the user's "Unit Frame"; by default, it's SI metric, but it could be astronomical units:

# With a custom .picounit file defining light-years as LENGTH:
>>> from PicoUnits import MILLI, LENGTH
>>> 12 * MILLI * LENGTH + 10 * LENGTH
>>> 10.012 (ly)

All depends on the users .picounit file, which can be generated via the command PicoUnits generate. Another feature is the ability to use the .ut (unit types) and .uiv (unit-informed values) formats, which PicoUnits loads in via recursive attribute injection. So instead of a nested list, you get a wonderful object-based loader.

[version]
format: 0.1.0
unit_frame: units.ut

[model]
voltage: 18 (V)
current_limit: 40 (A) 
time_steps: 50 u(s)

Your .picounit file defines your Unit Frame, your .ut defines any derived units and your .uiv files defines value:unit pairs. This ensures consistency-you can't accidentally load a config file expecting SI metric when your code is running in natural units.

>>> from PicoUnits.parser import Parser
>>> p = Parser(parameters.uiv)
>>> p.model.voltage
>>> 18 (V)

Well, we’ve looked at simple calculations, changing unit frames, and importing units. But what about dimensional checks? Well, the main one is the unit_validator, which is a decorator that checks dimensionally out of a function. Let's intentionally pass wrong units to see what happens:

>>> from PicoUnits import unit_validator, VOLTAGE, IMPEDANCE, CURRENT
>>> @unit_validator(VOLTAGE)
>>> def calculate_voltage(current, impedance):
>>>   return current * impedance
>>> 
>>> calculate_voltage((10+1j) * CURRENT ** 2, 10 * IMPEDANCE)
>>> DimensionError: 'calculate_voltage' returned kg·m²·s⁻³, expected kg·m²·s⁻³·A⁻¹

The unit_validator checks the dimensionality of the output to ensure it matches the expected type. It's very useful when prototyping as it compartmentalizes dimensional checking, decreasing mental overhead.

For a complete worked example, see the multi-stage coilgun simulation which uses PicoUnits for electromagnetic physics calculations.

Documentation

Full documentation is available at docs, and simple to advanced examples are available at examples

Installation

To install, simply:

pip install PicoUnits

or use setuptools locally:

git clone https://github.com/wgbowley/PicoUnits.git
cd PicoUnits
pip install -e .

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

picounits-1.0.3.tar.gz (73.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

picounits-1.0.3-py3-none-any.whl (55.4 kB view details)

Uploaded Python 3

File details

Details for the file picounits-1.0.3.tar.gz.

File metadata

  • Download URL: picounits-1.0.3.tar.gz
  • Upload date:
  • Size: 73.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for picounits-1.0.3.tar.gz
Algorithm Hash digest
SHA256 990d40bd211c7f194ebf3d03f81573d75ad0f62229e3d08df9c546648f3eb629
MD5 6ef5a5c2cbfc40bc46d12438339b13ce
BLAKE2b-256 a77ec06708b0e8628c9096ebb6e9b42e014e93099e528cd84cb00db859b2ecc1

See more details on using hashes here.

Provenance

The following attestation bundles were made for picounits-1.0.3.tar.gz:

Publisher: publish_picounits.yml on wgbowley/PicoUnits

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file picounits-1.0.3-py3-none-any.whl.

File metadata

  • Download URL: picounits-1.0.3-py3-none-any.whl
  • Upload date:
  • Size: 55.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for picounits-1.0.3-py3-none-any.whl
Algorithm Hash digest
SHA256 1338a6f791073ee665eb9a18c2cd32ad07e26e621a4344195fe272a93e8365bb
MD5 f4a889220c0e2df8738e13278d074572
BLAKE2b-256 258e457cb598a42b4bf77b04ca1c6312b6de4bc4f26e2e8a3429989103b01757

See more details on using hashes here.

Provenance

The following attestation bundles were made for picounits-1.0.3-py3-none-any.whl:

Publisher: publish_picounits.yml on wgbowley/PicoUnits

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page