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.10.0

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.10.0
File
cppmodel-0.10.0-py3-none-win_arm64.whl Python 3 none Windows ARM64 Details
cppmodel-0.10.0-py3-none-win_amd64.whl Python 3 none Windows x86-64 Details
cppmodel-0.10.0-py3-none-manylinux_2_28_x86_64.whl Python 3 none Linux glibc 2.28+ x86-64 Details
cppmodel-0.10.0-py3-none-manylinux_2_28_aarch64.whl Python 3 none Linux glibc 2.28+ ARM64 Details
cppmodel-0.10.0-py3-none-macosx_11_0_universal2.whl Python 3 none macOS 11.0+ universal2 (ARM64, x86-64) Details

Total release size: 17.4 MB

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

Download URL cppmodel-0.10.0-py3-none-win_arm64.whl
Size 2.2 MB
Tags Python 3 Windows ARM64
SHA-256 checksum
How to use checksums
96c024000626cc6979a85320a2b586e5b66328c46530007428590af5f58581c8
BLAKE2b-256 checksum
How to use checksums
5d266354cc3e38ca6e7263cdcd2dac0958e16e64c15ade275944ec4517a704fa
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL cppmodel-0.10.0-py3-none-win_amd64.whl
Size 2.3 MB
Tags Python 3 Windows x86-64
SHA-256 checksum
How to use checksums
46437d23676d1d872333226ce83484511dd6c3bcbe08622325d98728772ff3b7
BLAKE2b-256 checksum
How to use checksums
a176320b8635f3e47e1abdb89ef84c016080f2d8c438503d1a3aa4d50353d332
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL cppmodel-0.10.0-py3-none-manylinux_2_28_x86_64.whl
Size 3.7 MB
Tags Linux glibc 2.28+ x86-64 Python 3
SHA-256 checksum
How to use checksums
0eac128a3057719de05a1ccc5d38ca96dea63a510c3eda20fdffee58a603575a
BLAKE2b-256 checksum
How to use checksums
758a15f18f5b6a6a3594d3dbac77253e607cf3ec82f657519f69d9fb6f673c5c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL cppmodel-0.10.0-py3-none-manylinux_2_28_aarch64.whl
Size 3.9 MB
Tags Linux glibc 2.28+ ARM64 Python 3
SHA-256 checksum
How to use checksums
f7f4053c86208499e869d58f931c12921ed140720e06cfb04973edc7d2acf942
BLAKE2b-256 checksum
How to use checksums
731eca142fdea73a67179a39a51ac6854e3d63a48085c72740bb5a5083eb0ba3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

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

Security for cppmodel 0.10.0

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