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

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.4
File
cppmodel-0.9.4-py3-none-win_arm64.whl Python 3 none Windows ARM64 Details
cppmodel-0.9.4-py3-none-win_amd64.whl Python 3 none Windows x86-64 Details
cppmodel-0.9.4-py3-none-manylinux_2_28_x86_64.whl Python 3 none Linux glibc 2.28+ x86-64 Details
cppmodel-0.9.4-py3-none-manylinux_2_28_aarch64.whl Python 3 none Linux glibc 2.28+ ARM64 Details
cppmodel-0.9.4-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.4-py3-none-win_arm64.whl

Download URL cppmodel-0.9.4-py3-none-win_arm64.whl
Size 2.1 MB
Tags Python 3 Windows ARM64
SHA-256 checksum
How to use checksums
b017acf9b1da7e7e125e85bce17384638cf3e6c20f5eb7a905a01ff61df09331
BLAKE2b-256 checksum
How to use checksums
27ca4a56612db1bd502c1fcdc462589a916a78bcce08b3e21fad76529a28b2b1
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.4-py3-none-win_amd64.whl

Download URL cppmodel-0.9.4-py3-none-win_amd64.whl
Size 2.2 MB
Tags Python 3 Windows x86-64
SHA-256 checksum
How to use checksums
f4b90b7027b54e87d978485024e3de09197c8a52b25ac306b90b32e2b14ecd66
BLAKE2b-256 checksum
How to use checksums
26020824239741885104944cb494e4dbb8438868e55927ea48de4d6c92749d61
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.4-py3-none-manylinux_2_28_x86_64.whl

Download URL cppmodel-0.9.4-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
21966249e4b928f3652fee597dffb773eb25291659d5d24df4ccfe5dd2cc3291
BLAKE2b-256 checksum
How to use checksums
740752ea9a53ffc1c8f30289d936756005daf65ab66f0db1067847ef0722ddd7
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.4-py3-none-manylinux_2_28_aarch64.whl

Download URL cppmodel-0.9.4-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
95eff426fc475e6c3f31559b6c8ca27aba89996271df508baae367463dc14cee
BLAKE2b-256 checksum
How to use checksums
2537433e265dbeb3e94eb8e433701ab1b6e409841b3e87a0300373c2e5c332e7
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.4-py3-none-macosx_11_0_universal2.whl

Download URL cppmodel-0.9.4-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
a68ec2818c73f04141619cd584955d8b04a2a4287987aef7152cbd5bf59eb466
BLAKE2b-256 checksum
How to use checksums
6cab44605a3c12fcbf8b437a3d45137351fdef0481b6304992d8aedf5e85cf2d
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.4

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