Skip to main content

PAYNT - Probabilistic progrAm sYNThesizer

Project description

PAYNT

Build Status 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.2.2.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.2.2-cp314-cp314t-manylinux_2_34_x86_64.whl (74.4 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.34+ x86-64

paynt-0.2.2-cp314-cp314t-manylinux_2_34_aarch64.whl (67.9 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.34+ ARM64

paynt-0.2.2-cp314-cp314t-macosx_15_0_x86_64.whl (59.7 MB view details)

Uploaded CPython 3.14tmacOS 15.0+ x86-64

paynt-0.2.2-cp314-cp314t-macosx_14_0_arm64.whl (55.2 MB view details)

Uploaded CPython 3.14tmacOS 14.0+ ARM64

paynt-0.2.2-cp314-cp314-manylinux_2_34_x86_64.whl (74.4 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.34+ x86-64

paynt-0.2.2-cp314-cp314-manylinux_2_34_aarch64.whl (67.9 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.34+ ARM64

paynt-0.2.2-cp314-cp314-macosx_15_0_x86_64.whl (59.7 MB view details)

Uploaded CPython 3.14macOS 15.0+ x86-64

paynt-0.2.2-cp314-cp314-macosx_14_0_arm64.whl (55.1 MB view details)

Uploaded CPython 3.14macOS 14.0+ ARM64

paynt-0.2.2-cp313-cp313-manylinux_2_34_x86_64.whl (74.4 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.34+ x86-64

paynt-0.2.2-cp313-cp313-manylinux_2_34_aarch64.whl (67.9 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.34+ ARM64

paynt-0.2.2-cp313-cp313-macosx_15_0_x86_64.whl (59.7 MB view details)

Uploaded CPython 3.13macOS 15.0+ x86-64

paynt-0.2.2-cp313-cp313-macosx_14_0_arm64.whl (55.1 MB view details)

Uploaded CPython 3.13macOS 14.0+ ARM64

paynt-0.2.2-cp312-cp312-manylinux_2_34_x86_64.whl (74.4 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ x86-64

paynt-0.2.2-cp312-cp312-manylinux_2_34_aarch64.whl (67.9 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ ARM64

paynt-0.2.2-cp312-cp312-macosx_15_0_x86_64.whl (59.7 MB view details)

Uploaded CPython 3.12macOS 15.0+ x86-64

paynt-0.2.2-cp312-cp312-macosx_14_0_arm64.whl (55.1 MB view details)

Uploaded CPython 3.12macOS 14.0+ ARM64

paynt-0.2.2-cp311-cp311-manylinux_2_34_x86_64.whl (74.4 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ x86-64

paynt-0.2.2-cp311-cp311-manylinux_2_34_aarch64.whl (67.9 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ ARM64

paynt-0.2.2-cp311-cp311-macosx_15_0_x86_64.whl (59.7 MB view details)

Uploaded CPython 3.11macOS 15.0+ x86-64

paynt-0.2.2-cp311-cp311-macosx_14_0_arm64.whl (55.1 MB view details)

Uploaded CPython 3.11macOS 14.0+ ARM64

paynt-0.2.2-cp310-cp310-manylinux_2_34_x86_64.whl (74.4 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.34+ x86-64

paynt-0.2.2-cp310-cp310-manylinux_2_34_aarch64.whl (67.9 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.34+ ARM64

paynt-0.2.2-cp310-cp310-macosx_15_0_x86_64.whl (59.7 MB view details)

Uploaded CPython 3.10macOS 15.0+ x86-64

paynt-0.2.2-cp310-cp310-macosx_14_0_arm64.whl (55.1 MB view details)

Uploaded CPython 3.10macOS 14.0+ ARM64

File details

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

File metadata

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

File hashes

Hashes for paynt-0.2.2.tar.gz
Algorithm Hash digest
SHA256 65ec6e5dc69f7d71efb43a16be850c6bebe29ce79b91cd741079a2c07ebe8ee1
MD5 7f2ae81a4273e54bb3c2f149ba98f6e3
BLAKE2b-256 9fdd5f4c845db78b20f264b63ac4ae0d0cbf845ca255cadefe4407e3c5aaac18

See more details on using hashes here.

Provenance

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

Publisher: tag.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.2.2-cp314-cp314t-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for paynt-0.2.2-cp314-cp314t-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 cac49a26378d980834989f004d1f838998f67229dc05e14f43d23db97cd8577b
MD5 1d30e51d93bb47ae796806c66d6ec05f
BLAKE2b-256 f99eacdee2b22f3134fc8cc7d25ce22615c87edbc1de2f09d22e21f7a7184126

See more details on using hashes here.

Provenance

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

Publisher: tag.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.2.2-cp314-cp314t-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for paynt-0.2.2-cp314-cp314t-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 a92bb7711eb60c6d9eb4cbe4a55a947c3a2624372a675c1004e5ae0462b0d18d
MD5 f86877d0bd2714e3fadfe302dccf2c6d
BLAKE2b-256 768e1833a2999591bfe06dfaa404fd955dd3e3c745ce3f60f0b670010237676e

See more details on using hashes here.

Provenance

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

Publisher: tag.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.2.2-cp314-cp314t-macosx_15_0_x86_64.whl.

File metadata

File hashes

Hashes for paynt-0.2.2-cp314-cp314t-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 34872fa5f90bb32633136d809cc6e9a998671a78d42d4f50e3e3e9fffc2b92d9
MD5 68591d80595fbb2568fb43df1b6dc821
BLAKE2b-256 271b88ec70b03122e518e8746e339c2346eda9df322cd2741018abaf802a15e4

See more details on using hashes here.

Provenance

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

Publisher: tag.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.2.2-cp314-cp314t-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for paynt-0.2.2-cp314-cp314t-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 8535efaa0632a9326093a958b30dadeb4207a97701d08486754540e371290a4e
MD5 31e1681caad6890b96d81d55fb50064f
BLAKE2b-256 dcf75cf555ad45f3305ee590e2a5e69ee5de828f453b83613c7a9714fdf54539

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.2.2-cp314-cp314t-macosx_14_0_arm64.whl:

Publisher: tag.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.2.2-cp314-cp314-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for paynt-0.2.2-cp314-cp314-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 5cf753c575c2463062394d074351a542311612dfab5a732ffc3ba99d1093dd01
MD5 b3181ab9628f843da4d3be7685d5aa9f
BLAKE2b-256 8fad730639c5380ffa77721310c3a06592deb27696be4cdffa9575dead328210

See more details on using hashes here.

Provenance

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

Publisher: tag.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.2.2-cp314-cp314-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for paynt-0.2.2-cp314-cp314-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 68b485046bc615546b58d55c6d53e942c4b9a4a30dbf784fea3b87a260943841
MD5 914ab7054ee70c11752107c5c19550c2
BLAKE2b-256 57d4344b9b631531c94b109bd700bd43d64eaa9999a19b76cc7a3bc24cf09ad8

See more details on using hashes here.

Provenance

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

Publisher: tag.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.2.2-cp314-cp314-macosx_15_0_x86_64.whl.

File metadata

File hashes

Hashes for paynt-0.2.2-cp314-cp314-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 76be692183294922ed490a7da8e5dd197b57120297cab269d69c3ac99f014d4e
MD5 f3eb83ec354acb6eaf0099ce2bf54013
BLAKE2b-256 45b384f68ea62151a6098ac7a613177ce7b2d5083779b677bb30ac4ea316a379

See more details on using hashes here.

Provenance

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

Publisher: tag.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.2.2-cp314-cp314-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for paynt-0.2.2-cp314-cp314-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 e51feb4aaba90c31e77c18e0ed2ab978bbcc507424c1ff2d7a37ada991b80df1
MD5 e0d8bf1c7ff9d09e0cb8358aa653ad73
BLAKE2b-256 dfbe431f5226aa6ac89cb199a67f325637fa31ae30793a4e276fb9ab361689ed

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.2.2-cp314-cp314-macosx_14_0_arm64.whl:

Publisher: tag.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.2.2-cp313-cp313-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for paynt-0.2.2-cp313-cp313-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 7d95712e1b4a0f67b2cef1ed445061c4040d158a42513b27404bdace658f7681
MD5 a4d0045165b4ee090c433efe451a5fb5
BLAKE2b-256 e70cbf5b8ac36ce5618ca9bc8f58d44b020f0a0c1e6e746c40bba5b6b80a6668

See more details on using hashes here.

Provenance

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

Publisher: tag.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.2.2-cp313-cp313-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for paynt-0.2.2-cp313-cp313-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 ea654b6a95bb35ec141273d5be934458e2aeed088474a4a61074dfaf68481f90
MD5 86fab5eff86b779002d97204313ddb06
BLAKE2b-256 f3c4a0ccf27bf004a6703188290880969658b217dca36f5ef1fe379446abcacc

See more details on using hashes here.

Provenance

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

Publisher: tag.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.2.2-cp313-cp313-macosx_15_0_x86_64.whl.

File metadata

File hashes

Hashes for paynt-0.2.2-cp313-cp313-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 0640192f50770ecacb8908e31fb8a7fdde2ff7aeccbfe6dfdb5f00975e46004f
MD5 c838c011d74887002b545e232142fa96
BLAKE2b-256 403584efaf37127f8276a0c964e0a94c9a8bcf72319cd7f773cb372522136b7a

See more details on using hashes here.

Provenance

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

Publisher: tag.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.2.2-cp313-cp313-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for paynt-0.2.2-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 12259c1ea799bc2966418bc42cfba0ac8b6da68d4a67087d96018d583d0e2ceb
MD5 65a8b1c472f02b380b00ea7937f714cb
BLAKE2b-256 fd38a7d0452442d4c943b4ef3bff8a52bbfbe1e803eea19fc07e4ae9c85c2382

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.2.2-cp313-cp313-macosx_14_0_arm64.whl:

Publisher: tag.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.2.2-cp312-cp312-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for paynt-0.2.2-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 ab9f2c03b15c5c4aa5be6c07c6abf2e97aa1275e3c0ad9887de61865b8062b9a
MD5 ac7448f99f1109cd91d8462ead05fe66
BLAKE2b-256 38b98d997077bfc27cd14cad4d5ec94457ae486be2e188a76f0c5740d3c50305

See more details on using hashes here.

Provenance

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

Publisher: tag.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.2.2-cp312-cp312-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for paynt-0.2.2-cp312-cp312-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 0c9e6fd5a1d32ca76b43b157fdc3c2eda2e4b0c1014e8509cfd953bc8a91daeb
MD5 a324b562ba74db4222594700553e5e6b
BLAKE2b-256 c2ca042d10d92c38970d1451031fe88739a0c89a31593cefd35b42f5483c4884

See more details on using hashes here.

Provenance

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

Publisher: tag.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.2.2-cp312-cp312-macosx_15_0_x86_64.whl.

File metadata

File hashes

Hashes for paynt-0.2.2-cp312-cp312-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 e00649b72572e30bc11b871560b49736f5b040eb2d37e2f5c48c1d2680526632
MD5 f7925d6eee2f33aa7e87c7dd68c06de6
BLAKE2b-256 061c73c3859c940e515b2a83e928466e17ca898f278ef0eddaf7ab70732c840a

See more details on using hashes here.

Provenance

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

Publisher: tag.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.2.2-cp312-cp312-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for paynt-0.2.2-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 08c5b7444c647d4a46f6c9480e20b2412473c3b5f088ba6a6531778479eb18da
MD5 9d76e77c91e385ad2212c2d9d82554ce
BLAKE2b-256 dfed2da1bb5ffd00d720a5a9fdca13df69322c7cfd7163978acf442cea5cc9b4

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.2.2-cp312-cp312-macosx_14_0_arm64.whl:

Publisher: tag.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.2.2-cp311-cp311-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for paynt-0.2.2-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 05e521686307d6b0684f99be39d1a3e19b020d5482225a7bab81e14a30bbbc48
MD5 2da23e093e23c6b210e7f0bba25eaaea
BLAKE2b-256 cb3dc746004b7de84eb3117acc985755fecd774ded1c8b1dcc34b2949f30f341

See more details on using hashes here.

Provenance

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

Publisher: tag.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.2.2-cp311-cp311-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for paynt-0.2.2-cp311-cp311-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 494a7114bc403313afc858ce78d8675fcebaa4175968eb3f20f558bb0c87edc4
MD5 4b6c88bf2708a7a45c7a6e7d5f7af401
BLAKE2b-256 c10bd8aa3f2265575bf8c4a4ed18c96a1c3a534d70a3df1b08a532442c26d79f

See more details on using hashes here.

Provenance

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

Publisher: tag.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.2.2-cp311-cp311-macosx_15_0_x86_64.whl.

File metadata

File hashes

Hashes for paynt-0.2.2-cp311-cp311-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 d080bcec9bbdfc2876af45a75da2ebbdeb2a2d077321e0a597d9ec190d285ee1
MD5 1e7b863c704f14695475eb802eba3a97
BLAKE2b-256 28a527b80c8068b960885a3f587d9afc42fe2050730606838c7f85a3652003b6

See more details on using hashes here.

Provenance

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

Publisher: tag.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.2.2-cp311-cp311-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for paynt-0.2.2-cp311-cp311-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 7bdffd1b4809b9c9941645f22ea684145dd0cd4d87254f7b7b87d5e54dabc542
MD5 ea9b72b6d50d9deec4ae9a525fd6c7b4
BLAKE2b-256 11849b8b2589bb5f56ac2cc34cc2060bfb8402abe3d68ed5424bbadd0f8ee06b

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.2.2-cp311-cp311-macosx_14_0_arm64.whl:

Publisher: tag.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.2.2-cp310-cp310-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for paynt-0.2.2-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 8e839ac9d89c94eeb777cd5e7fba0bb434d3806f830d01a76ebc8948a96718d1
MD5 3ec466b329b9c748001ce22777bc2d5d
BLAKE2b-256 3fa1427614bce374b1287d5d640df249506b3073e81920bf77d7aa2084e8d804

See more details on using hashes here.

Provenance

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

Publisher: tag.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.2.2-cp310-cp310-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for paynt-0.2.2-cp310-cp310-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 98ef5b3df6495d40d64c0288d8c352ed82d9e2d3ebe2b51a4f34ef51ad256aa8
MD5 bb8fa95680c9df70b2110892d750ab6b
BLAKE2b-256 e366c41f03af111614d0c23d31eb862099c4f2a406714b819e41468a88be63a4

See more details on using hashes here.

Provenance

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

Publisher: tag.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.2.2-cp310-cp310-macosx_15_0_x86_64.whl.

File metadata

File hashes

Hashes for paynt-0.2.2-cp310-cp310-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 bbcf7b73aaabc67b137761d3f2319b3a16a993107dad546011eea8072be524de
MD5 644f133aeab08120d2ca886c848d76e8
BLAKE2b-256 75e0b155ec9b63c8dce3e26d5fec7ccb189686bbf2b13fb8bb846dd6d3e010ce

See more details on using hashes here.

Provenance

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

Publisher: tag.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.2.2-cp310-cp310-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for paynt-0.2.2-cp310-cp310-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 4f7a6ed8c0a0644a928babcf1d8136341efcd38cdec7e7d4667a3e7cb69602f7
MD5 ea0ad131f9781d52669a7334859709bb
BLAKE2b-256 6b2fbc0886d6ea0e638519147cec4525526eeb38b10053d7fe71c80263562ae9

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.2.2-cp310-cp310-macosx_14_0_arm64.whl:

Publisher: tag.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