Skip to main content

PAYNT - Probabilistic progrAm sYNThesizer

Project description

PAYNT

CI (Latest) CI (Stable & Fetched) PyPI - Version

PAYNT (Probabilistic progrAm sYNThesizer) is a tool for the automated synthesis of probabilistic programs. PAYNT takes a program with holes (a so-called sketch) and a PCTL specification, and outputs a concrete hole assignment that yields a satisfying program, if such an assignment exists. PAYNT also supports the synthesis of finite-state controllers for POMDPs, Dec-POMDPs and one-sided POSMGs, synthesis of decision trees for MDPs and synthesis of policy trees for families of MDPs. Internally, PAYNT interprets the incomplete probabilistic program as a family of Markov chains and uses state-of-the-art synthesis methods on top of the model checker Storm to identify satisfying realization. PAYNT is implemented in Python and uses stormpy, Python bindings for Storm. PAYNT is hosted on github.

PAYNT is described in

  • [1] PAYNT: A Tool for Inductive Synthesis of Probabilistic Programs by Roman Andriushchenko, Milan Ceska, Sebastian Junges, Joost-Pieter Katoen and Simon Stupinsky. In: CAV'21.
  • [2] An Oracle-Guided Approach to Constrained Policy Synthesis Under Uncertainty by Roman Andriushchenko, Milan Ceska, Sebastian Junges, Joost-Pieter Katoen and Filip Macak. Journal of Artificial Intelligence Research (2025).

Installation

(a) For users

To download and install PAYNT, use:

pip install paynt

Alternatively, you may build PAYNT from source:

git clone https://github.com/randriu/synthesis.git
cd synthesis
python3 -m venv venv && source venv/bin/activate
pip install .

(b) For developers

PAYNT depends on Storm and stormpy. For developers, we recommend having local installations of both Storm and stormpy (see section below). If you have stormpy installed in your developer environment, you can use:

pip install -r build-requirements.txt
pip install . --no-build-isolation

which builds and installs PAYNT directly into your environment. Note that the Storm backends used by both PAYNT and stormpy need to be the same. While we implemented several routines that check the backend compatibility, it is up to the developer to make sure of it.

PAYNT is also available as a docker image:

docker pull randriu/paynt
docker run --rm -it randriu/paynt
python3 -m paynt --help

Installing Storm and stormpy

Please refer to Storm documentation and stormpy documentation for more information. Here we provide a list of commands that build master branch of Storm and stormpy in virtual environment without further explanation:

python3 -m venv venv && source venv/bin/activate
mkdir prerequisites && cd prerequisites
git clone https://github.com/moves-rwth/storm.git
git clone https://github.com/moves-rwth/stormpy.git
mkdir storm/build && cd storm/build
cmake ..
make storm storm-cli storm-pomdp
cd - && cd stormpy
pip install . --config-settings=cmake.define.USE_STORM_DFT=OFF --config-settings=cmake.define.USE_STORM_GSPN=OFF

Running PAYNT

PAYNT can be executed using the command in the following form:

python3 -m paynt PROJECT [OPTIONS]

where PROJECT is the path to the benchmark folder and the most important options are:

  • --sketch SKETCH: the file in the PROJECT folder containing the template description or a POMDP program [default: sketch.templ]
  • --props PROPS: the file in the PROJECT folder containing synthesis specification [default: sketch.props]
  • --method [ar|cegis|hybrid]: the synthesis method [default: ar]

Options associated with the synthesis of finite-state controllers (FSCs) for a POMDP include:

  • --fsc-memory-size INTEGER implicit memory size for (Dec-)POMDP FSCs [default: 1]
  • --fsc-synthesis: enables incremental synthesis of FSCs for a (Dec-)POMDP using iterative exploration of k-FSCs
  • --posterior-aware: enables the synthesis of posterior aware FSCs

SAYNT [6] and Storm associated options (pomdp-api branch of Storm and Stormpy are needed):

  • --storm-pomdp: enables the use of Storm features, this flag is necessary for the other options in this section to work
  • --iterative-storm INTEGER INTEGER INTEGER: runs the SAYNT algorithm, the parameters represent overall timeout, paynt timeout, storm timeout respectivelly. The recommended parameters for 15 minute runtime are 900 60 10
  • --get-storm-result INTEGER: runs PAYNT for specified amount of seconds and then runs Storm using the computed FSC at cut-offs
  • --storm-options [cutoff|clip2|clip4|overapp|5mil|10mil|20mil|refine]: sets the options for Storm [default: cutoff]
  • --prune-storm: if enabled Storm results are used to prune the family of FSCs
  • --unfold-strategy-storm [paynt|storm|cutoff]: sets how the memory is unfolded [default: storm]
  • --use-storm-cutoffs: if enabled the actions from cut-offs are considered in the prioritization and unfolding
  • --export-synthesis PATH: stores the synthesis result to speciefied PATH

Other options:

  • --help: shows the help message of the PAYNT and aborts
  • --export [jani|drn|pomdp]: exports the model to .drn/.pomdp and aborts

Here are various PAYNT calls:

python3 -m paynt models/archive/cav21-paynt/maze --props hard.props
python3 -m paynt models/archive/cav21-paynt/maze --props hard.props --method hybrid
python3 -m paynt models/archive/uai22-pomdp/grid-avoid-4-0
python3 -m paynt models/archive/uai22-pomdp/grid-avoid-4-0 --fsc-memory-size 2
python3 -m paynt models/archive/uai22-pomdp/grid-avoid-4-0 --fsc-memory-size 5
timeout 10s python3 -m paynt models/archive/uai22-pomdp/grid-avoid-4-0 --fsc-synthesis
python3 -m paynt models/archive/cav23-saynt/4x3-95 --fsc-synthesis --storm-pomdp --iterative-storm 180 60 10
python3 -m paynt models/archive/cav23-saynt/rocks-12 --fsc-synthesis --storm-pomdp --get-storm-result 0

The Python environment can be deactivated by running

deactivate

You might consider creating an alias (e.g. in your .bashrc) for simpler usage:

paynt() {
    source /path/to/your/venv/bin/activate
    python3 /path/to/your/paynt.py $@
    deactivate
}

PAYNT tutorial

For instance, here is a simple PAYNT call:

python3 -m paynt models/archive/cav21-paynt/grid --props easy.props hybrid

Now we will investigate the Grid model discussed in [1]. PAYNT inspects the content of this folder and locates the required files for the synthesis process: the sketch and the specification list. In the example above, the sketch file is models/archive/cav21-paynt/grid/sketch.templ (in this case, --sketch option could have been omitted), the specification file is models/archive/cav21-paynt/grid/easy.props and the sketch does not have undefined constants, only holes. Finally, the last argument specifies the selected synthesis method: hybrid.

Getting started with PAYNT

Having the tool installed, you can quickly test it by navigating to the tool folder, activating the Python environment and asking PAYNT to evaluate a simple synthesis problem:

cd /home/cav21/synthesis
source env/bin/activate
python3 -m paynt models/archive/cav21-paynt/dpm-demo --method hybrid

The syntax of the command is described in more detail in the following chapters of this README. For now, we can see that we ask PAYNT to look at the sketch (located in directory models/archive/cav21-paynt/dpm-demo) for the dynamic power manager discussed in Section 2 in [1] and synthesize it wrt. specification in file models/archive/cav21-paynt/dpm-demo/sketch.props using the advanced hybrid approach. The tool will print a series of log messages and, in the end, a short summary of the synthesis process, similar to the one below:

formula 1: R{"requests_lost"}<=1 [F "finished"]
optimal setting: formula: R{"power"}min=? [F "finished"]; direction: min; eps: 0.0

method: Hybrid, synthesis time: 12.39 s
number of holes: 7, family size: 12150
super MDP size: 1502, average MDP size: 1502, MPD checks: 2, iterations: 1
average DTMC size: 172, DTMC checks: 2708, iterations: 1354

optimal: 9100.064246
hole assignment: P1=1,P2=0,P3=0,P4=2,T1=0.0,T3=0.8,QMAX=5

The contents of such summary will be again discussed later. Nonetheless, we can already notice the last line where tool reports a hole assignment that yields the optimal program. The python environment can be deactivated by runnning

deactivate

Synthesizing probabilistic programs with PAYNT

Reading the output of PAYNT

Running PAYNT produces a sequence of log and a summary printed at the end of the synthesis process. For instance, if we run

python3 -m paynt models/archive/cav21-paynt/dpm-demo --method hybrid

we obtain the following summary:

formula 1: R{"requests_lost"}<=1 [F "finished"]
optimal setting: formula: R{"power"}min=? [F "finished"]; direction: min; eps: 0.0

method: Hybrid, synthesis time: 67.62 s
number of holes: 7, family size: 12150
super MDP size: 1502, average MDP size: 956, MPD checks: 116, iterations: 59
average DTMC size: 234, DTMC checks: 14206, iterations: 7103

optimal: 9100.064246
hole assignment: P1=1,P2=2,P3=2,P4=2,T1=0.0,T3=0.8,QMAX=5

This summary contains information about the synthesized sketch as well as the results of the synthesis process. The first lines repeat the synthesised specifications and, if included, the optimizing property. Next, the synthesis was carried out using the hybrid method and it on our machine it took 68 seconds. We can see that this particular DPM benchmark contains 7 holes (parameters) and 12K family members. The following lines are statistics about deductive (MDP-based) or inductive (counterexample-based) analysis, including sizes of analyzed MDPs/DTMCs, number of particular model checking calls, overall iterations count etc. Notice that only the hybrid method contains both MDP- and DTMC-related information since CEGIS never deals with MDPs, and AR works exclusively with MDPs.

Finally, the last lines show the synthesis result. In our case, PAYNT printed a hole assignment yielding optimal solution as well as the induced optimal value.

Sketching language

PAYNT takes as an input a sketch -- program description in PRISM language containing some undefined parameters (holes) with associated options from domains -- and a specification given as a list of temporal logic constraints (interpreted as a conjunction of these constrains) possibly including an optimal objective. Before explaining the sketching language, let us briefly present the key ideas of the PRISM language -- the full documentation of the language is available in the PRISM manual.

A PRISM program consists of one or more reactive modules that may interact with each other using synchronisation. A module has a set of (bounded) variables that span its state space. Possible transitions between states of a module are described by a set of guarded commands of the form:

[action] guard -> prob_1 : update_1 + ... + prob_n : update_n; 

If the guard evaluates to true, an update of the variables is chosen according to the probability distribution given by expressions p_1 through p_n. The actions are used to force two or more modules to make the command simultaneously (i.e. to synchronise).

Recall that the sketch is a PRISM program with holes and allows us to compactly describe a set of candidates program. The holes can appear in guards and updates. Replacing each hole with one of its options yields a complete program with the semantics given by a finite-state Markov chain.

We exemplify the usage of PAYNT by the following synthesis problem.

The server for request processing

Consider a server for request processing depicted in Figure above. Requests are generated (externally) in random intervals and upon arrival stored in a request queue of capacity Qmax. When the queue is full, the request is lost. The server has three profiles -- sleeping, idle and active -- that differ in their power consumption. The requests are processed by the server only when it is in the active state. Switching from a low-energy state into the active state requires additional energy as well as an additional random latency before the request can be processed. We further assume that the power consumption of request processing depends on the current queue size. The operation time of the server finite but given by a random process.

The goal of the synthesis process is to design power manager (PM) that controls the server. The PM observes the current queue size and then sets the desired power profile. We assume that the PM distinguishes between four queue occupancy levels determined by the threshold levels T1,T2, and T3. In other words, the PM observes the queue occupancy of the intervals: [0, T1], [T1, T2] etc. The values of these levels are unknown and thus are defined using four holes. For each occupancy level, the PM changes to the associated power profile P1, ..., P4 in {0,1,2}, where numbers 0 through 2 encode the profiles sleeping, idle and active}, respectively. The strategy which profile to used for the particular occupy is also unknown and thus defined using another four holes. Finally, the queue capacity Qmax is also unknown and thus the sketch includes in total 8 holes. In the sketch, the definition of the hole takes place outside of any module (typically in the beginning of the program) and must include its data type (int or double) as well as the domain:

// profiles desired at observation levels
// 0 - sleep, 1 - idle, 2 - active
hole int P1 in {0,1,2};
hole int P2 in {0,1,2};
hole int P3 in {0,1,2};
hole int P4 in {0,1,2};

// observation level thresholds
hole double T1 in {0.0,0.1,0.2,0.3,0.4};
hole double T2 in {0.5};
hole double T3 in {0.6,0.7,0.8};

// queue size
hole int QMAX in {1,2,3,4,5,6,7,8,9,10};

The following sketch fragment describes the module for the described power manager. The modules implementing other components of the server are omitted here for brevity -- the entire sketch is available in this file.

module PM
    pm  :  [0..2] init 0; // 0 - sleep, 1 - idle, 2 - active
    [tick0] q <= T1*QMAX -> (pm'=P1);
    [tick0] q > T1*QMAX & q <= T2*QMAX -> (pm'=P2);
    [tick0] q > T2*QMAX & q <= T3*QMAX -> (pm'=P3);
    [tick0] q > T3*QMAX -> (pm'=P4);
endmodule

Note that the domains of the holes defined above ensure that T1 < T2 < T3, however PAYNT further supports restrictions --- additional constraints on parameter combinations. The resulting sketch describes a design space of 10 x 5 x 4 x 34 = 16,200 different power managers where the average size of the underlying MC (of the complete system) is around 900 states.

Specification of the required behaviour

The goal is to find the concrete power manager, i.e., the instantiation of the holes, that minimizes power consumption while the expected number of lost requests during the operation time of the server is at most 1. In general, a specification is formalized as a list of temporal logic formulae in the PRISM syntax. Here is a specification available within the benchmark directory here:

R{"requests_lost"}<= 1 [ F "finished" ]
R{"power"}min=? [ F "finished" ]

We can see that the speicification file can additionally contain at most one optimizing property. Furthermore, one can specify relative precision for satisfying such criterion (epsilon-optimality), e.g.

R{"power"}min{0.05}=? [ F "finished" ]

For the given sketch and specification, PAYNT effectively explores the design space and finds a hole assignment inducing a program that satisfies the specification, provided that such assignment exists. Otherwise, it reports that such design does not exist. If the specification also includes an optimizing criterion, PAYNT will find hole assignments that satisfies constraints in the specification and has an optimal behaviour.

Interpretation of the synthesis results

PAYNT produces the following output containing the hole assignment and the quality wrt. the specification of the corresponding program:

optimal: 9100.064246
hole assignment: P1=1,P2=2,P3=2,P4=2,T1=0.0,T3=0.8,QMAX=5

The obtained optimal power manager has queue capacity 5 with thresholds (after rounding) at 0, 2 and 4. In addition, the power manager always maintains an active profile unless the request queue is empty, in which case the device is put into an idle state. This solution guarantees expected number of lost requests to be at most one and has the power consumption of 9,100 units. To double-check that there are no controllers having expected power consumption less than 9100, we can modify the specification file models/archive/cav21-paynt/dpm-demo/sketch.props as follows:

R{"requests_lost"} <= 1 [ F "finished" ]
R{"power"}<=9100 [ F "finished" ]

Running PAYNT again (with hybrid synthesis approach) will produce the following result

formula 1: R{"requests_lost"}<=1 [F "finished"]
formula 2: R{"power"}<=9100 [F "finished"]

method: Hybrid, synthesis time: 67.52 s
number of holes: 7, family size: 12150
super MDP size: 1502, average MDP size: 962, MPD checks: 116, iterations: 59
average DTMC size: 237, DTMC checks: 14126, iterations: 7063

feasible: no

from which we can see that PAYNT indeed proved non-existence of a better solution.

We might further consider a more complex program sketch Grid (discussed in [1]), where we synthesize controller for a robot in an unpredictable environment.

python3 -m paynt models/archive/cav21-paynt/grid --props easy.props --method hybrid

This sketch describes a family of 65K members, where each member has, on average 1225 states. Even though this is a much larger family with much larger chains than in the sketch considered before, the pruning ability of the advanced hybrid approach allows PAYNT to handle this specification in a matter of seconds. Meanwhile, one-by-one enumeration

python3 -m paynt models/archive/cav21-paynt/grid --props easy.props --method onebyone

might take up to 20 minutes.

Testing PAYNT

As reported in the paper, PAYNT is tested with unit tests and regression tests. These tests currently cover more than 90% of the source code lines. The unit tests which cover the specific logic components to maintain their correct functionality. You can run the regression and unit tests (~5 minutes) with the following sequence of commands:

cd paynt/paynt_tests
python3 -m pytest --cov=./../paynt/ --cov-report term-missing test_synthesis.py test_model_checking.py

This command prints the coverage report, displaying the resulting coverage for individual source files. Our tests currently cover more than 90% of the source code lines, even though the result shows 82% because ~10% of the source code is only temporary functions for debugging purposes that have no functionality.


References

Most of the algorithms are described in:

  • [3] Inductive Synthesis for Probabilistic Programs Reaches New Horizons by Roman Andriushchenko, Milan Ceska, Sebastian Junges, Joost-Pieter Katoen. In: TACAS'21.
  • [4] Counterexample-Driven Synthesis for Probabilistic Program Sketches by Milan Ceska, Christian Hensel, Sebastian Junges, Joost-Pieter Katoen. In: FM'19.
  • [5] Shepherding Hordes of Markov Chains by Milan Ceska, Nils Jansen, Sebastian Junges, Joost-Pieter Katoen. In: TACAS'19.
  • [6] Inductive Synthesis of Finite-State Controllers for POMDPs by Roman Andriushchenko, Milan Ceska, Sebastian Junges, Joost-Pieter Katoen. In: UAI'22.
  • [7] Search and Explore: Symbiotic Policy Synthesis in POMDPs by Roman Andriushchenko, Alexander Bork, Milan Ceska, Sebastian Junges, Joost-Pieter Katoen, Filip Macak. In: CAV'23.
  • [8] Policies Grow on Trees: Model Checking Families of MDPs by Roman Andriushchenko, Milan Ceska, Sebastian Junges, and Filip Macak. In: ATVA'24.
  • [9] Small Decision Trees for MDPs with Deductive Synthesis by by Roman Andriushchenko, Milan Ceska, Sebastian Junges, and Filip Macak. In: CAV'25.

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

paynt-0.4.1.tar.gz (10.5 MB view details)

Uploaded Source

Built Distributions

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

paynt-0.4.1-cp314-cp314t-manylinux_2_34_x86_64.whl (43.1 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.34+ x86-64

paynt-0.4.1-cp314-cp314t-manylinux_2_34_aarch64.whl (39.7 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.34+ ARM64

paynt-0.4.1-cp314-cp314t-macosx_15_0_x86_64.whl (31.8 MB view details)

Uploaded CPython 3.14tmacOS 15.0+ x86-64

paynt-0.4.1-cp314-cp314t-macosx_15_0_arm64.whl (28.9 MB view details)

Uploaded CPython 3.14tmacOS 15.0+ ARM64

paynt-0.4.1-cp314-cp314-manylinux_2_34_x86_64.whl (43.1 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.34+ x86-64

paynt-0.4.1-cp314-cp314-manylinux_2_34_aarch64.whl (39.8 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.34+ ARM64

paynt-0.4.1-cp314-cp314-macosx_15_0_x86_64.whl (31.8 MB view details)

Uploaded CPython 3.14macOS 15.0+ x86-64

paynt-0.4.1-cp314-cp314-macosx_15_0_arm64.whl (28.8 MB view details)

Uploaded CPython 3.14macOS 15.0+ ARM64

paynt-0.4.1-cp313-cp313-manylinux_2_34_x86_64.whl (43.1 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.34+ x86-64

paynt-0.4.1-cp313-cp313-manylinux_2_34_aarch64.whl (39.8 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.34+ ARM64

paynt-0.4.1-cp313-cp313-macosx_15_0_x86_64.whl (31.8 MB view details)

Uploaded CPython 3.13macOS 15.0+ x86-64

paynt-0.4.1-cp313-cp313-macosx_15_0_arm64.whl (28.8 MB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

paynt-0.4.1-cp312-cp312-manylinux_2_34_x86_64.whl (43.1 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ x86-64

paynt-0.4.1-cp312-cp312-manylinux_2_34_aarch64.whl (39.8 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ ARM64

paynt-0.4.1-cp312-cp312-macosx_15_0_x86_64.whl (31.8 MB view details)

Uploaded CPython 3.12macOS 15.0+ x86-64

paynt-0.4.1-cp312-cp312-macosx_15_0_arm64.whl (28.8 MB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

paynt-0.4.1-cp311-cp311-manylinux_2_34_x86_64.whl (43.1 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ x86-64

paynt-0.4.1-cp311-cp311-manylinux_2_34_aarch64.whl (39.8 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ ARM64

paynt-0.4.1-cp311-cp311-macosx_15_0_x86_64.whl (31.8 MB view details)

Uploaded CPython 3.11macOS 15.0+ x86-64

paynt-0.4.1-cp311-cp311-macosx_15_0_arm64.whl (28.8 MB view details)

Uploaded CPython 3.11macOS 15.0+ ARM64

paynt-0.4.1-cp310-cp310-manylinux_2_34_x86_64.whl (43.1 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.34+ x86-64

paynt-0.4.1-cp310-cp310-manylinux_2_34_aarch64.whl (39.7 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.34+ ARM64

paynt-0.4.1-cp310-cp310-macosx_15_0_x86_64.whl (31.8 MB view details)

Uploaded CPython 3.10macOS 15.0+ x86-64

paynt-0.4.1-cp310-cp310-macosx_15_0_arm64.whl (28.8 MB view details)

Uploaded CPython 3.10macOS 15.0+ ARM64

File details

Details for the file paynt-0.4.1.tar.gz.

File metadata

  • Download URL: paynt-0.4.1.tar.gz
  • Upload date:
  • Size: 10.5 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for paynt-0.4.1.tar.gz
Algorithm Hash digest
SHA256 8008cd9b0ca7192374b068be7e66c0d41b189e0b2f551240efcb7bc023168103
MD5 79d8ed448ba3e6e0e40a7ef134b0d84b
BLAKE2b-256 f8e9c156974f8c6a19d8b467d7180d315202dcdd1efe670314760b6fc214bd65

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.1.tar.gz:

Publisher: release.yml on randriu/synthesis

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

File details

Details for the file paynt-0.4.1-cp314-cp314t-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for paynt-0.4.1-cp314-cp314t-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 3d36832c548f09cd992074cc0b4b5b2e2b23178e513a85164eae9eab0479ce5b
MD5 60dd1716564771a4e1bf7d44429e8bb4
BLAKE2b-256 ae5c6b22035f38af7209482cb153b2a21b6218e2f614ccb7998e558bd252a144

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.1-cp314-cp314t-manylinux_2_34_x86_64.whl:

Publisher: release.yml on randriu/synthesis

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

File details

Details for the file paynt-0.4.1-cp314-cp314t-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for paynt-0.4.1-cp314-cp314t-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 761e9c537a0d2c1def01e6fb00c18cd3f7ec4d78bfe862252da8e62592e5646b
MD5 e88ca5f42a5695f217726bb886159cd1
BLAKE2b-256 a5d92f1b10c2a7bff6bf954bb8a51e72b1cb5a205027a1a26bb997f86dc3e83b

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.1-cp314-cp314t-manylinux_2_34_aarch64.whl:

Publisher: release.yml on randriu/synthesis

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

File details

Details for the file paynt-0.4.1-cp314-cp314t-macosx_15_0_x86_64.whl.

File metadata

File hashes

Hashes for paynt-0.4.1-cp314-cp314t-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 ba776238987b33c9e2e5c57dc653752c363c0ad6bd12b2fdb9af58d1aa03d5d8
MD5 73d5bc9ee1e8cfe3e902a86b640929e2
BLAKE2b-256 289421d40c4a7f8684c668aa2e5a3e0522162f864b1e771c78fa65d8c2223ddd

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.1-cp314-cp314t-macosx_15_0_x86_64.whl:

Publisher: release.yml on randriu/synthesis

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

File details

Details for the file paynt-0.4.1-cp314-cp314t-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for paynt-0.4.1-cp314-cp314t-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 e042eec801a5b4a6254916d335814c059178f09d4e94e310fcd784a3f8792c90
MD5 e05f152c64e032aa351f29e84d1fdbda
BLAKE2b-256 42468de4ea28668ac403606303537e6618b15962cff75f630a7242f95e6b9e8d

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.1-cp314-cp314t-macosx_15_0_arm64.whl:

Publisher: release.yml on randriu/synthesis

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

File details

Details for the file paynt-0.4.1-cp314-cp314-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for paynt-0.4.1-cp314-cp314-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 d52eb520f4bf4059668dbcb7e8de6d2d33ef08df690012fd3d849a5ef9d16d98
MD5 a9092cb0d74963b516e049bee37dbdda
BLAKE2b-256 dcb44f75cc77ab5e4a3b305a9ee8874f42bb0b1c8fde0caf4778ab10a8c34dcc

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.1-cp314-cp314-manylinux_2_34_x86_64.whl:

Publisher: release.yml on randriu/synthesis

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

File details

Details for the file paynt-0.4.1-cp314-cp314-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for paynt-0.4.1-cp314-cp314-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 46b6ffd74e9c8839f61ab1e665854e4e95731d40b6a84d33ade6f99b09613da0
MD5 bf96f2cf856a78e8ca19d7ded5aaa31e
BLAKE2b-256 0edf4eba792711d2187e1859eb69176280762fbf04a4987088cd33cedcbadd3a

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.1-cp314-cp314-manylinux_2_34_aarch64.whl:

Publisher: release.yml on randriu/synthesis

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

File details

Details for the file paynt-0.4.1-cp314-cp314-macosx_15_0_x86_64.whl.

File metadata

File hashes

Hashes for paynt-0.4.1-cp314-cp314-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 9411f5c5dd0d2be373ddd6de25b67e52102e3b2ca9ffd79cd68a3483a0e33e63
MD5 2c5ce05993df3ea3e2f741b7b24b74ac
BLAKE2b-256 1eda77330275b726a3f05a3a98808b9973b4a63ab35c1449868ab51de8d98023

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.1-cp314-cp314-macosx_15_0_x86_64.whl:

Publisher: release.yml on randriu/synthesis

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

File details

Details for the file paynt-0.4.1-cp314-cp314-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for paynt-0.4.1-cp314-cp314-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 205aa9c74cb0e5d169925e3ee201b4423f270072c2a3e0eba91c1a70b41e200e
MD5 f5c1731e65bd745da1c5ab90598fb0a8
BLAKE2b-256 e40b6c317e98c2ea3c6ed36c82e7b267d16a908a3af6d8d34920003ae9366637

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.1-cp314-cp314-macosx_15_0_arm64.whl:

Publisher: release.yml on randriu/synthesis

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

File details

Details for the file paynt-0.4.1-cp313-cp313-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for paynt-0.4.1-cp313-cp313-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 eab0e1b959f21055428d9f214b5451d17076fdf815f0b85f55f2cf8541d90d96
MD5 660398c715067166bf6c50122cde29ca
BLAKE2b-256 b4b5add8d21a81efd48cbd8c2e5a0e49d67e2221b9ef277ab4e10de20bab8e71

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.1-cp313-cp313-manylinux_2_34_x86_64.whl:

Publisher: release.yml on randriu/synthesis

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

File details

Details for the file paynt-0.4.1-cp313-cp313-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for paynt-0.4.1-cp313-cp313-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 3f78c89fae0257af52532c12548bd5e3ee483f575fbe20bf683676276b5d7755
MD5 9e923f3e35e58cb5b3cbb45913eaa16f
BLAKE2b-256 1e34fe89a148780ce3fe32c6838f283c738f065ca79efcc195f6306284ae8b3b

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.1-cp313-cp313-manylinux_2_34_aarch64.whl:

Publisher: release.yml on randriu/synthesis

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

File details

Details for the file paynt-0.4.1-cp313-cp313-macosx_15_0_x86_64.whl.

File metadata

File hashes

Hashes for paynt-0.4.1-cp313-cp313-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 92b00cceda783b9123fbd79719eba73410dd07ad5d7912c9f3b06da598fa83fa
MD5 a78c88282a941c112c9db53c24555b0c
BLAKE2b-256 b74f3c8cbe9dba7d5402dd473652279eba1377b1d125d73b08e4cb4a40dd2562

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.1-cp313-cp313-macosx_15_0_x86_64.whl:

Publisher: release.yml on randriu/synthesis

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

File details

Details for the file paynt-0.4.1-cp313-cp313-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for paynt-0.4.1-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 65794070236e288eb7644dae8895a12ae0e1075acafc6c018c314eed7c7fdaf4
MD5 1c68eb92d74ae7556179d71def43ef50
BLAKE2b-256 94d35d6c927d817b8b34a92a7f8013589bb2501275cc85da00f4f310bb9da554

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.1-cp313-cp313-macosx_15_0_arm64.whl:

Publisher: release.yml on randriu/synthesis

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

File details

Details for the file paynt-0.4.1-cp312-cp312-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for paynt-0.4.1-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 f2e3ee4c6f91027218efec0386566440f421cc627a5f3663638c684f9b55803f
MD5 233acaa0cb07a2d955838fab75209ae1
BLAKE2b-256 a5c262df8840fd9dbf123704129880990ad9fc38fb3bb1f4296fcbed49e77907

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.1-cp312-cp312-manylinux_2_34_x86_64.whl:

Publisher: release.yml on randriu/synthesis

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

File details

Details for the file paynt-0.4.1-cp312-cp312-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for paynt-0.4.1-cp312-cp312-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 5aad23d25506cc72c2f42c94ad6b0bb57b902629520f4ae5511adc9823a17dc7
MD5 175ae99b318ec584e7b8ce5c85345204
BLAKE2b-256 12ae98844ae4599c8a84fe592ead1f1e5d23088634c074610702909abe2f2524

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.1-cp312-cp312-manylinux_2_34_aarch64.whl:

Publisher: release.yml on randriu/synthesis

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

File details

Details for the file paynt-0.4.1-cp312-cp312-macosx_15_0_x86_64.whl.

File metadata

File hashes

Hashes for paynt-0.4.1-cp312-cp312-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 a058576ed686dd35bfd08f94bffe74b5eea73c16375ae790c811b0937a0d0413
MD5 ce6747c019f9963c8f59758bd6260a5f
BLAKE2b-256 59a1457c3b797d14016c1674b2e0a3feb163e8a4723efd46154d333f26cc98a4

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.1-cp312-cp312-macosx_15_0_x86_64.whl:

Publisher: release.yml on randriu/synthesis

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

File details

Details for the file paynt-0.4.1-cp312-cp312-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for paynt-0.4.1-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 38ca4f83413adc724f914c84e400f63bed7e1df8e4aeae43d12f78015af6efb9
MD5 66526adf22736b7896c65f0db2cf7726
BLAKE2b-256 e1858c870bc2295b4d2dad0ca377ea73e36e269518fc279d29a3eb8fdacc040e

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.1-cp312-cp312-macosx_15_0_arm64.whl:

Publisher: release.yml on randriu/synthesis

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

File details

Details for the file paynt-0.4.1-cp311-cp311-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for paynt-0.4.1-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 234af429beb15857447d6b8b71b1ae967f46d29ad380bfa28639bf4c3057535d
MD5 8433cc4776fb12153b7b1f768618a192
BLAKE2b-256 f309aab2bc036ee6e080e3576992ed0a39a7913aa409d19dcd6ca4f4b22a68f0

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.1-cp311-cp311-manylinux_2_34_x86_64.whl:

Publisher: release.yml on randriu/synthesis

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

File details

Details for the file paynt-0.4.1-cp311-cp311-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for paynt-0.4.1-cp311-cp311-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 578de36a9b2302e2f28d1e77f581b6523828ea15d2fa7155f973fc1bc414992a
MD5 f42f89e4236b39218ce47a4395b7f54e
BLAKE2b-256 d1b2c50947fb76f717dcd12c271a941b4ef375e675d336b3f3f58d368a014352

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.1-cp311-cp311-manylinux_2_34_aarch64.whl:

Publisher: release.yml on randriu/synthesis

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

File details

Details for the file paynt-0.4.1-cp311-cp311-macosx_15_0_x86_64.whl.

File metadata

File hashes

Hashes for paynt-0.4.1-cp311-cp311-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 4141b3112fda7aa08ef29536b3b5399e5aaee3bd15a8f114039ce2f9fdb9b736
MD5 12a8553a80b1cbe64261fbc41b4048a7
BLAKE2b-256 ac5c9b81f55d1d802429102641ae0124be91fae836dc298235e7b3f022745db9

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.1-cp311-cp311-macosx_15_0_x86_64.whl:

Publisher: release.yml on randriu/synthesis

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

File details

Details for the file paynt-0.4.1-cp311-cp311-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for paynt-0.4.1-cp311-cp311-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 9fe4f10d67db778e9ac13dc6217d0378c65e99066215c37715a8061110f36c75
MD5 52afe5922f9e484ce897c55eb171dbdb
BLAKE2b-256 3fd964cb945a7a92fc2b0d05c3b0882917fb4d57eada1ae6ed0061750d3f2541

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.1-cp311-cp311-macosx_15_0_arm64.whl:

Publisher: release.yml on randriu/synthesis

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

File details

Details for the file paynt-0.4.1-cp310-cp310-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for paynt-0.4.1-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 afa66319c5fb3838994bbf722d65fbe9428faf37fcaffac8bc2b4bfdb7f6648b
MD5 c78dc4253353b98f9077b6167b3c22df
BLAKE2b-256 6ac2dfb0ae9895592df6770888bf4513b0dcedbcfc3eaae167446bc10ae4c9ef

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.1-cp310-cp310-manylinux_2_34_x86_64.whl:

Publisher: release.yml on randriu/synthesis

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

File details

Details for the file paynt-0.4.1-cp310-cp310-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for paynt-0.4.1-cp310-cp310-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 0a3927291714a102bbcd0614e8daea3b4b0a53df8fd983ce5226067ca0620f86
MD5 e58307dd611c2ed4d1199a207e5ca6cc
BLAKE2b-256 ce14fe6389c2efd7ab8c4db51d0aeabba1c460e413e70de1b6fbb2554c06a98b

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.1-cp310-cp310-manylinux_2_34_aarch64.whl:

Publisher: release.yml on randriu/synthesis

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

File details

Details for the file paynt-0.4.1-cp310-cp310-macosx_15_0_x86_64.whl.

File metadata

File hashes

Hashes for paynt-0.4.1-cp310-cp310-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 ef4351129145be4fe19d66e2ab31ef4f64f0526b3006e57088c78c0f1e312f57
MD5 dcfecc6e5815aec146364fd2d1b303bd
BLAKE2b-256 dd9d638c46c4f262e42eb7aff2b8cace2a0faf9e248a94ae0b51f0aaca3c05b2

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.1-cp310-cp310-macosx_15_0_x86_64.whl:

Publisher: release.yml on randriu/synthesis

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

File details

Details for the file paynt-0.4.1-cp310-cp310-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for paynt-0.4.1-cp310-cp310-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 2a36ede209ed03f3e0ea0b5d489833974cc26ed791755dc779f7ae9328a48d92
MD5 1366e10820c1df023c5d2622e2e48a80
BLAKE2b-256 61c1f3d50b3fc855c5632edc385615189cea8e2c3da93dd39975f7441338c96c

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.1-cp310-cp310-macosx_15_0_arm64.whl:

Publisher: release.yml on randriu/synthesis

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