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)
| File | Reset | |||
|---|---|---|---|---|
| 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.