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.0.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.0-cp314-cp314t-manylinux_2_34_x86_64.whl (39.1 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.34+ x86-64

paynt-0.4.0-cp314-cp314t-manylinux_2_34_aarch64.whl (36.0 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.34+ ARM64

paynt-0.4.0-cp314-cp314t-macosx_15_0_x86_64.whl (31.0 MB view details)

Uploaded CPython 3.14tmacOS 15.0+ x86-64

paynt-0.4.0-cp314-cp314t-macosx_15_0_arm64.whl (28.1 MB view details)

Uploaded CPython 3.14tmacOS 15.0+ ARM64

paynt-0.4.0-cp314-cp314-manylinux_2_34_x86_64.whl (39.1 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.34+ x86-64

paynt-0.4.0-cp314-cp314-manylinux_2_34_aarch64.whl (36.0 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.34+ ARM64

paynt-0.4.0-cp314-cp314-macosx_15_0_x86_64.whl (31.0 MB view details)

Uploaded CPython 3.14macOS 15.0+ x86-64

paynt-0.4.0-cp314-cp314-macosx_15_0_arm64.whl (28.1 MB view details)

Uploaded CPython 3.14macOS 15.0+ ARM64

paynt-0.4.0-cp313-cp313-manylinux_2_34_x86_64.whl (39.1 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.34+ x86-64

paynt-0.4.0-cp313-cp313-manylinux_2_34_aarch64.whl (36.0 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.34+ ARM64

paynt-0.4.0-cp313-cp313-macosx_15_0_x86_64.whl (31.0 MB view details)

Uploaded CPython 3.13macOS 15.0+ x86-64

paynt-0.4.0-cp313-cp313-macosx_15_0_arm64.whl (28.1 MB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

paynt-0.4.0-cp312-cp312-manylinux_2_34_x86_64.whl (39.1 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ x86-64

paynt-0.4.0-cp312-cp312-manylinux_2_34_aarch64.whl (36.0 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ ARM64

paynt-0.4.0-cp312-cp312-macosx_15_0_x86_64.whl (31.0 MB view details)

Uploaded CPython 3.12macOS 15.0+ x86-64

paynt-0.4.0-cp312-cp312-macosx_15_0_arm64.whl (28.1 MB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

paynt-0.4.0-cp311-cp311-manylinux_2_34_x86_64.whl (39.1 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ x86-64

paynt-0.4.0-cp311-cp311-manylinux_2_34_aarch64.whl (36.0 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ ARM64

paynt-0.4.0-cp311-cp311-macosx_15_0_x86_64.whl (30.9 MB view details)

Uploaded CPython 3.11macOS 15.0+ x86-64

paynt-0.4.0-cp311-cp311-macosx_15_0_arm64.whl (28.1 MB view details)

Uploaded CPython 3.11macOS 15.0+ ARM64

paynt-0.4.0-cp310-cp310-manylinux_2_34_x86_64.whl (39.1 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.34+ x86-64

paynt-0.4.0-cp310-cp310-manylinux_2_34_aarch64.whl (36.0 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.34+ ARM64

paynt-0.4.0-cp310-cp310-macosx_15_0_x86_64.whl (30.9 MB view details)

Uploaded CPython 3.10macOS 15.0+ x86-64

paynt-0.4.0-cp310-cp310-macosx_15_0_arm64.whl (28.1 MB view details)

Uploaded CPython 3.10macOS 15.0+ ARM64

File details

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

File metadata

  • Download URL: paynt-0.4.0.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.0.tar.gz
Algorithm Hash digest
SHA256 25af7eb640b769d45623e4db997807976e07365d17b27666697b5f56e73029e6
MD5 2b936e876399a8440e3fac49ba7639f8
BLAKE2b-256 b56cbf8bbcd041a3b31d1ec865e01428482e183006245e82d79f874d97f05a9e

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.0.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.4.0-cp314-cp314t-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for paynt-0.4.0-cp314-cp314t-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 348e4203a54d12bb0b19c1bb2e02ed4faab2042ceb626834481055e62e57136a
MD5 254ccc3627a5dd179e3ec71d8a4e92c6
BLAKE2b-256 d62584f9cda6e594cf22954d45d48ab788c719ac8c8da26aabf426d5778fa96a

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.0-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.4.0-cp314-cp314t-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for paynt-0.4.0-cp314-cp314t-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 989b93d374d5c884ad348b2a087b88a0624fb2bc8fb53630f5dac4fa89a58bad
MD5 c776877fe2f9bd3ca0609d549f7d2d48
BLAKE2b-256 3dd8838d164e116f3292ea72e2d9004297e6a9c58ca3b07f6b57a6e29c60688e

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.0-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.4.0-cp314-cp314t-macosx_15_0_x86_64.whl.

File metadata

File hashes

Hashes for paynt-0.4.0-cp314-cp314t-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 921e570711e566225f41d110a4193eb2a6fa65f681cf13179c0e1f4b8a975ead
MD5 201924fa682a6339ffa98ba73b6c0317
BLAKE2b-256 b7f23fb608192110646d0660a8c7338e6c4a7e32ec81e666e45c2aea6beb7084

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.0-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.4.0-cp314-cp314t-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for paynt-0.4.0-cp314-cp314t-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 20ddf9ff7c4894ef2e629713fe7112b22fa7cb121525269efc9351b4f7a1107b
MD5 94a4ff78dd2dd2f2c8c0f2383e1263a7
BLAKE2b-256 12ee12177e059728d67bb96677a546b1771163de93a8897822f313513cbb0d88

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.0-cp314-cp314t-macosx_15_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.4.0-cp314-cp314-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for paynt-0.4.0-cp314-cp314-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 bfcedd0cc485f408ada270d8cfcd3b02c829eb667e3a8573844f0fa79c8fdafa
MD5 b70f382444dd72486d53631f1ad8aca9
BLAKE2b-256 9fc522d0edf866252e807a537986888a2179e6bd07e7da302c039f182afd6056

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.0-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.4.0-cp314-cp314-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for paynt-0.4.0-cp314-cp314-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 1de9921fd991325a0e7173b0c4e411835ab00820c3284345d9a5bacc3ac3c798
MD5 146d4377bcf993660ebb4050459dd31f
BLAKE2b-256 18bcd2e2d956466be51cc32dc11f5efbb3e4f2bd4bf432e386b960cba5ee1e63

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.0-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.4.0-cp314-cp314-macosx_15_0_x86_64.whl.

File metadata

File hashes

Hashes for paynt-0.4.0-cp314-cp314-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 226b01d9b33fe305e79ce56b5322b481ba7f40ca081a794c27aca04be7f1698d
MD5 7fa42524debe312f88a8d13f22147507
BLAKE2b-256 4d928a8fdcc10a5e341f8c0fdacd27bd56065fe7188e9cc8334bc850e6f3cce6

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.0-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.4.0-cp314-cp314-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for paynt-0.4.0-cp314-cp314-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 3060b2ebdd7bea5c655d9004248d47354897372a0f231fcc6cf1b59f12bafae0
MD5 8a1f18325cc148ef67c552a5e178edf8
BLAKE2b-256 83c518ec24d89ff698105dc215c0733f08ad61f513ea2237c9b058a819ba1802

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.0-cp314-cp314-macosx_15_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.4.0-cp313-cp313-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for paynt-0.4.0-cp313-cp313-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 5b0f673fa6dcbdf4981336ecee8a49181adc07bec8647a69935a10823e655bbf
MD5 652b586a191af50cb89ff102af3e6bed
BLAKE2b-256 06d0ac05d5ffe24862104cce8dd10216ef3947fe907cdb96c00b60166b0482a6

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.0-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.4.0-cp313-cp313-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for paynt-0.4.0-cp313-cp313-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 62aff45d7e8b1975cc94709a0dc41bfa84fb87cc59dea19b2897d22b3fcf6484
MD5 781ab46188ce0c1094e051496b89e61f
BLAKE2b-256 d116bc34df540a760f99703315259a904d26b214ba6846f38d521b784b4197d8

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.0-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.4.0-cp313-cp313-macosx_15_0_x86_64.whl.

File metadata

File hashes

Hashes for paynt-0.4.0-cp313-cp313-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 f5a07b5b666d6a8c5547e4b0c4d5b03ca6d79e824d7bbdfa62a4cbb8d45fec52
MD5 3d097d27d09c4f82860d4e1dc3e18148
BLAKE2b-256 be10fecf2a928eb96b983d36d1fe30cd23c777e21eb81e8a863ba1312ac3879d

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.0-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.4.0-cp313-cp313-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for paynt-0.4.0-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 f9a8166a1d3d0c3902bbc2e1c670d1ec02e37fb449f57568e0a46599f0a05d3f
MD5 421cc327744bbdc61f9818b8bc77394c
BLAKE2b-256 02f74079864d8aeb5de630bef3332ef567b9da34dc130a8dd3da58f5580d7a00

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.0-cp313-cp313-macosx_15_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.4.0-cp312-cp312-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for paynt-0.4.0-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 fcdc43afc57353d54d663f8ce6f74564a8b4516b9d73c6d92f2e9d3bfc5c5054
MD5 db45024460858ec327b09c5a4988e000
BLAKE2b-256 ba537f4278f097f9b0d0143188b2d6cfb1cc7bccc5f056c60af10cae866a40c6

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.0-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.4.0-cp312-cp312-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for paynt-0.4.0-cp312-cp312-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 c98c1ef7f0fb5e1b031e0fd6bc488768621824cf274706603b216e98ae33bdc2
MD5 70e0eade01a302a3715edf4ec9921685
BLAKE2b-256 9735730344ba08a83995019df63766fc2373f3c2d55a1d823248fb80682f9d5f

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.0-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.4.0-cp312-cp312-macosx_15_0_x86_64.whl.

File metadata

File hashes

Hashes for paynt-0.4.0-cp312-cp312-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 2d644eede2879b5a89bf363b44a4b0b034b636fd79e488147a093085cb3b1e70
MD5 3318536283e07ee45252ffe967293500
BLAKE2b-256 157215a366dfdb767a6c47f1947e302002534c5e84e5df7cb54283439d9e8535

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.0-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.4.0-cp312-cp312-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for paynt-0.4.0-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 d88e96bdc66258e03fce6505c12524c7171ad53a6200e6a3b91cd01862dfd456
MD5 988664993c74d19d8a6bba8fbc51fcef
BLAKE2b-256 22b034dd785c2d94c5287af77e06db43a7ff063bc76119da4004dfc60149cdff

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.0-cp312-cp312-macosx_15_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.4.0-cp311-cp311-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for paynt-0.4.0-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 f7a8699f455affe7cb9f8d337b9092b647e870638566aed76678147305d02525
MD5 f8fa45afc57cceb7d99c9c05a87ac776
BLAKE2b-256 35efc020c2ebc4007da101f91c426f3fcba8fd593394b0a1ba4db50d043a562a

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.0-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.4.0-cp311-cp311-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for paynt-0.4.0-cp311-cp311-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 780b164c001e93dafe6aadc1446f0d4076b89fc8c38e8db9b8bb626bdbbd2e51
MD5 1923e62600adf73fe9e25485e2946fc0
BLAKE2b-256 0955287c3228cd0395577c9b884824758e4962862e04742a9ee1c14ef299df5a

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.0-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.4.0-cp311-cp311-macosx_15_0_x86_64.whl.

File metadata

File hashes

Hashes for paynt-0.4.0-cp311-cp311-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 285ccd3928c3e99ff422471fc98a70ed55278b2e3fd484c88063741a8aa64bc9
MD5 3908d6e416bcdd58b5622d9646cb916c
BLAKE2b-256 e7f463cf376572dfdded9a037d742751206d1dcbdf955ccea446ec356ff4a8f5

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.0-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.4.0-cp311-cp311-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for paynt-0.4.0-cp311-cp311-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 af08f28d153d615ce81b118936f93caa378830f1656d0392a735f19d14992459
MD5 ea1117d110e4438ebc54b719cbf5e6bf
BLAKE2b-256 d2dc4ffc6f395b047bda7895404a821572dd39ee544f7f7aa3594e6c177f4175

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.0-cp311-cp311-macosx_15_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.4.0-cp310-cp310-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for paynt-0.4.0-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 7f5607f11b3b91187198d49541625e5b1a38a3d7d692d47bd04d817cc2360cef
MD5 3e6a1803df3dcc8dd15cbbf024cdb2b9
BLAKE2b-256 8e1db6e5d67538995fdf1f5906e769f63e3bbf8e4439a19861c71a78a49cfd49

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.0-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.4.0-cp310-cp310-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for paynt-0.4.0-cp310-cp310-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 c9d6bc7980968c2a3ddfc9802454bc9f6779ab94043136e5beaad0d97733ca5e
MD5 2b84ca07123fda46c7438841fc012f8f
BLAKE2b-256 99d550636366d166d98914debbf2107e06700ee8094e35f8553932af60d9bfaf

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.0-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.4.0-cp310-cp310-macosx_15_0_x86_64.whl.

File metadata

File hashes

Hashes for paynt-0.4.0-cp310-cp310-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 a871d928ec8370ba257f5c0ba57cf3a7e412a13332191115a44e2a9a8658ca0d
MD5 a9ad76942c6f8c22bfb67f8f4aaf6e1a
BLAKE2b-256 802786a85b9b8b2b5edef2632738e861fc71ecf3039baca2d14882d3bacaa6e6

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.0-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.4.0-cp310-cp310-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for paynt-0.4.0-cp310-cp310-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 bceb6375b2c0af241e5a9460a906adf5dd57abe953576dd9ab7cd8b64dd2529d
MD5 314d305ad64c9d694a34ce3f7ee8d588
BLAKE2b-256 4fa5c5c365385627c674441c747761993018be436f114b7243b10b07d3f1b759

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.4.0-cp310-cp310-macosx_15_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