Skip to main content

CppModel for Python

Write CppModel simulations in Python. Every run fetches the inputs and parameters posted for it in your CppModel workspace and submits its execution there, just like a C or C++ simulation built with the CppModel SDK.

pip install cppmodel

Wheels are available for Linux (x86_64 and aarch64, glibc 2.28+), Windows (x64 and ARM64) and macOS 11+ (Apple silicon and Intel), for Python 3.9 and later. Each wheel contains the CppModel library, so nothing else needs installing.

A simulation

import sys
import cppmodel


class Heater(cppmodel.Simulation):
    def init(self):
        self.temperature = 20.0

    def step(self, time_ms):
        setpoint = self.inputs.get("Setpoint", 22.0)        # input, with its fallback
        gain = self.parameters.get("HeaterGain", 0.05)      # parameter, with its fallback

        heater_on = self.temperature < setpoint             # the controller under test
        self.temperature += gain if heater_on else -0.01

        self.outputs["Temperature"] = self.temperature
        self.outputs["HeaterOn"] = heater_on
        self.outputs["CppModel.Step"] = time_ms
        self.outputs["CppModel.StepResult"] = self.temperature < setpoint + 1.0


with Heater("Example - Heater (Python)", total_time_ms=60_000, step_ms=100) as simulation:
    sys.exit(simulation.run())

run() fetches the pending inputs and parameters, calls init(), then step(time_ms) for every step from 0 to total_time_ms, then finalize(), and submits the execution. It returns 0 when every step passed, otherwise the CppModel.Step of the first step whose CppModel.StepResult was 0.

An exception raised in init(), step() or finalize() (Ctrl-C included) aborts the run, submits nothing and is re-raised by run().

Instead of subclassing, you can pass functions that take the simulation as their first argument:

def ramp(sim, time_ms):
    sim.outputs["Ramp"] = time_ms

sim = cppmodel.Simulation("Ramp", total_time_ms=1000, step_ms=100, step=ramp)
sim.run()

Inputs, outputs and parameters

sim.inputs.get(name, fallback) The input's value at the current step, or fallback (recorded as its value)
sim.inputs[name] Same, with fallback 0
sim.inputs.load([{"label", "x", "y"}, ...]) Loads input series locally (x in ms)
sim.outputs[name] = value Sets an output; it holds until set again and is recorded every step. Values are numbers; bools become 1/0
sim.parameters.get(name, fallback) The parameter, storing fallback when it isn't set; a fetched value replaces the fallback
sim.parameters[name] = value Sets a parameter that fetched values never replace
sim.parameters[name] The parameter, or KeyError
sim.results() The execution as submitted: {"inputs", "results", "parameters", ...}

Inputs and outputs are numbers. Parameters keep their JSON type: numbers, bools, strings, lists, dicts and None. All three support in, len(), iteration and keys().

Workspace access

Every run reads its inputs from and records its execution in your workspace, so it needs to sign in. For scripts and CI, set CPPMODEL_USERNAME and CPPMODEL_PASSWORD.

Without credentials, the first run prints a sign-in link and waits 60 seconds for you to sign in (CPPMODEL_LOGIN_TIMEOUT changes that, in seconds); without a sign-in, run() raises. The link goes to the process's standard output, which Jupyter doesn't show, so use credentials in notebooks.

Fingerprint

Each execution records a CppModel.BinaryFingerprint of the simulation's code, so the workspace can tell runs of the same code from runs of changed code. It is the fingerprint of the file your Simulation subclass (or step function) is defined in. Set sim.fingerprint_file to use another file.

Errors

A failing library call raises cppmodel.CppModelError; its status is a cppmodel.Status.

License

The CppModel library is proprietary software of Control Edge AB, used under the CppModel Terms of Service; see LICENSE. The package also contains third-party components under their own licenses, in licenses/.

Metadata

Release files for cppmodel 0.9.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for cppmodel 0.9.1
File
cppmodel-0.9.1-py3-none-win_arm64.whl Python 3 none Windows ARM64 Details
cppmodel-0.9.1-py3-none-win_amd64.whl Python 3 none Windows x86-64 Details
cppmodel-0.9.1-py3-none-manylinux_2_28_x86_64.whl Python 3 none Linux glibc 2.28+ x86-64 Details
cppmodel-0.9.1-py3-none-manylinux_2_28_aarch64.whl Python 3 none Linux glibc 2.28+ ARM64 Details
cppmodel-0.9.1-py3-none-macosx_11_0_universal2.whl Python 3 none macOS 11.0+ universal2 (ARM64, x86-64) Details

Total release size: 16.8 MB

Release files / cppmodel-0.9.1-py3-none-win_arm64.whl

Download URL cppmodel-0.9.1-py3-none-win_arm64.whl
Size 2.1 MB
Tags Python 3 Windows ARM64
SHA-256 checksum
How to use checksums
700b735727e43d2af7d2f63d177d5dfddf157eb9b8a8a1926078b884dca3176a
BLAKE2b-256 checksum
How to use checksums
622a2fd916d968e5b20b919afe46bd2f454b4532819ffbfe28865c5a32f4ef7e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / cppmodel-0.9.1-py3-none-win_amd64.whl

Download URL cppmodel-0.9.1-py3-none-win_amd64.whl
Size 2.2 MB
Tags Python 3 Windows x86-64
SHA-256 checksum
How to use checksums
effb23939a7bdd5a23ec547cbe028e60f5ed52ee1421839a44f3fc1dd8010aa2
BLAKE2b-256 checksum
How to use checksums
050d08ae80293e5d37807d8535fd62f50947b6579511d843ea8d7cb2e2b72864
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / cppmodel-0.9.1-py3-none-manylinux_2_28_x86_64.whl

Download URL cppmodel-0.9.1-py3-none-manylinux_2_28_x86_64.whl
Size 3.6 MB
Tags Linux glibc 2.28+ x86-64 Python 3
SHA-256 checksum
How to use checksums
f633251d621ad5275cda31ed7765e3483cdc4fb1fd407036e9cc6be1c862c835
BLAKE2b-256 checksum
How to use checksums
4d623ae13c07306db31ebf8dfcd59801255d28159decffeefdcb0700a182ba75
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / cppmodel-0.9.1-py3-none-manylinux_2_28_aarch64.whl

Download URL cppmodel-0.9.1-py3-none-manylinux_2_28_aarch64.whl
Size 3.8 MB
Tags Linux glibc 2.28+ ARM64 Python 3
SHA-256 checksum
How to use checksums
ed10a4dd054cb4ca4524a9f53b0bfa5bd1e8c7552df54e43a751e9cefb4f3478
BLAKE2b-256 checksum
How to use checksums
1bbf4488f9ae3a751c144e286e4b8717187fd8195d7a8851a4682d5da76d6fd6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / cppmodel-0.9.1-py3-none-macosx_11_0_universal2.whl

Download URL cppmodel-0.9.1-py3-none-macosx_11_0_universal2.whl
Size 5.2 MB
Tags Python 3 macOS 11.0+ universal2 (ARM64, x86-64)
SHA-256 checksum
How to use checksums
491d9bcffa2c25e5dc4abe243e7871777e178a1aafd3fd01823fe1dca9629740
BLAKE2b-256 checksum
How to use checksums
b84ec5946f88ccebd09e802219033d9b0c287d307fb4a807fac80a44ead3150f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Security for cppmodel 0.9.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page