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.3.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.3.0-cp314-cp314t-manylinux_2_34_x86_64.whl (76.7 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.34+ x86-64

paynt-0.3.0-cp314-cp314t-manylinux_2_34_aarch64.whl (70.2 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.34+ ARM64

paynt-0.3.0-cp314-cp314t-macosx_15_0_x86_64.whl (62.2 MB view details)

Uploaded CPython 3.14tmacOS 15.0+ x86-64

paynt-0.3.0-cp314-cp314t-macosx_15_0_arm64.whl (56.7 MB view details)

Uploaded CPython 3.14tmacOS 15.0+ ARM64

paynt-0.3.0-cp314-cp314-manylinux_2_34_x86_64.whl (76.7 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.34+ x86-64

paynt-0.3.0-cp314-cp314-manylinux_2_34_aarch64.whl (70.2 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.34+ ARM64

paynt-0.3.0-cp314-cp314-macosx_15_0_x86_64.whl (62.2 MB view details)

Uploaded CPython 3.14macOS 15.0+ x86-64

paynt-0.3.0-cp314-cp314-macosx_15_0_arm64.whl (56.7 MB view details)

Uploaded CPython 3.14macOS 15.0+ ARM64

paynt-0.3.0-cp313-cp313-manylinux_2_34_x86_64.whl (76.7 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.34+ x86-64

paynt-0.3.0-cp313-cp313-manylinux_2_34_aarch64.whl (70.2 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.34+ ARM64

paynt-0.3.0-cp313-cp313-macosx_15_0_x86_64.whl (62.2 MB view details)

Uploaded CPython 3.13macOS 15.0+ x86-64

paynt-0.3.0-cp313-cp313-macosx_15_0_arm64.whl (56.7 MB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

paynt-0.3.0-cp312-cp312-manylinux_2_34_x86_64.whl (76.7 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ x86-64

paynt-0.3.0-cp312-cp312-manylinux_2_34_aarch64.whl (70.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ ARM64

paynt-0.3.0-cp312-cp312-macosx_15_0_x86_64.whl (62.2 MB view details)

Uploaded CPython 3.12macOS 15.0+ x86-64

paynt-0.3.0-cp312-cp312-macosx_15_0_arm64.whl (56.7 MB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

paynt-0.3.0-cp311-cp311-manylinux_2_34_x86_64.whl (76.7 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ x86-64

paynt-0.3.0-cp311-cp311-manylinux_2_34_aarch64.whl (70.2 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ ARM64

paynt-0.3.0-cp311-cp311-macosx_15_0_x86_64.whl (62.2 MB view details)

Uploaded CPython 3.11macOS 15.0+ x86-64

paynt-0.3.0-cp311-cp311-macosx_15_0_arm64.whl (56.7 MB view details)

Uploaded CPython 3.11macOS 15.0+ ARM64

paynt-0.3.0-cp310-cp310-manylinux_2_34_x86_64.whl (76.7 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.34+ x86-64

paynt-0.3.0-cp310-cp310-manylinux_2_34_aarch64.whl (70.2 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.34+ ARM64

paynt-0.3.0-cp310-cp310-macosx_15_0_x86_64.whl (62.2 MB view details)

Uploaded CPython 3.10macOS 15.0+ x86-64

paynt-0.3.0-cp310-cp310-macosx_15_0_arm64.whl (56.7 MB view details)

Uploaded CPython 3.10macOS 15.0+ ARM64

File details

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

File metadata

  • Download URL: paynt-0.3.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.7

File hashes

Hashes for paynt-0.3.0.tar.gz
Algorithm Hash digest
SHA256 741fc66b4668f2eab73a69c2012a1dc454935e20b1444d1d6f44c3ae6e9a3d56
MD5 746e5d63354beaf88a7c1e769c2f2fb1
BLAKE2b-256 9d6b306fa7968128f430bbb3230d69405e78ff3d27ebfd7750c63253cb6c7a2a

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for paynt-0.3.0-cp314-cp314t-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 2538f5e055fffbfe295bd3ddfca3b13d25b4a14f82fa1d5a243f1ac914d86762
MD5 745af602bf7d1229e4b277e7457505a1
BLAKE2b-256 3bdc718f54b747b5d8fa7354ae3b6a9a49c4b2d3ae18f2809a80ffa899baf878

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for paynt-0.3.0-cp314-cp314t-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 d350ebc58edca239226a03b48385e55fc9cf4162a5610387c76882d12d9007a3
MD5 0206648655171fc0af2b5f0a211dab85
BLAKE2b-256 a04f9e1385562e2485ccf203e08bf0e47f9c145e45aa162b62561e2b83123836

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for paynt-0.3.0-cp314-cp314t-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 3a1836128d15ceb210d49f04ff10db59900f4d6a96b643a549d207286f4a5816
MD5 c67d73ec479c022bbc0ba0fa62a90f8b
BLAKE2b-256 141dbd102f0e088ab7c282b675d587f5c047fb2d8ccf0f49ec68fe83c900056f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for paynt-0.3.0-cp314-cp314t-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 3f8741bf6a16e2365ffd371f4de2464005a9837eaf6dd66fca721f54ea85b0b6
MD5 37ff021ae5f0d04cbb0469ed5a6c63d6
BLAKE2b-256 7b5fd0b721453969f78bcfe1b4fa79ca3e679bd75d87a0b024911e9fca60309f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for paynt-0.3.0-cp314-cp314-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 fbac0db4e856c7360b49db654e937c8c5ac5f951aac2f9f0bdf99183e1f38ad7
MD5 1ddfbdbf7e78a7bd697d9b4bb9a9aceb
BLAKE2b-256 17b775fb58b2ef26bfba932d266f3998134a74ce134e1155bb09366046cd7018

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for paynt-0.3.0-cp314-cp314-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 834181ad680145eb95c99dd1e4711766c9ae41b742b96fed41b44cc78f4ab300
MD5 092b72720757a18597aaad522ff0e322
BLAKE2b-256 09bded86252a3f4a17cfad148112e14816d1debb4de2298f4f9b5ede3aa9fb8e

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for paynt-0.3.0-cp314-cp314-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 4094e342b423128ff85b34548d8bd919bf72bacd8470491cf5d8e2ac5c48f234
MD5 1f548678d2b34f6ff1ffa25cc3f431a8
BLAKE2b-256 391a1eb58e1b765b98f82ccc9a26f3612207dcfe401e1764bfb6def51971ea4c

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for paynt-0.3.0-cp314-cp314-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 a4ae8355562628ed7f605f0e36b503a4c0a25b268a1dbe3b7d8a27057be814e7
MD5 9f882dd9768048003a6045968b7487fb
BLAKE2b-256 704eefe2ba117313765feaad88b3ffa8752271f19bcb38d2155e94ad705a14d2

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.3.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.3.0-cp313-cp313-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for paynt-0.3.0-cp313-cp313-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 49575ce9a83a9f4e2578b187f9be3962d4898c74921c1df4d48fa6b190f84353
MD5 dd6ed600a3aa26dd6d733d8afb10069e
BLAKE2b-256 aa99ed18f3b35f2833ac4d6f17784af12af9feb26b6d3ac4fc179ed41c3c3ae9

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for paynt-0.3.0-cp313-cp313-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 289e5b4fcbbf0a845ad917bd492213beb3bdc1655f3e8cff53a83ca11eb64fc9
MD5 cbc78b780e0ce5cfc1793a937cffb3a5
BLAKE2b-256 8f4f48c2740794e64d8ddcaaad2adc895128d7145ce88b663e8925d377e8581f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for paynt-0.3.0-cp313-cp313-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 a55a3d7f53cd816f4380dcfcc03adda52ca5efa3ad3fe25cd71d880ca9badee1
MD5 383f872ba13b3b9f289cc409a8795b73
BLAKE2b-256 f171643da08b2c29695f41491a0c1fcb1f48c9784bc9800eb97274983a6b892e

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for paynt-0.3.0-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 7d3f801e008780ce73b99f70e772a5e2da37be2514a49779ee6df2a515dd8f6d
MD5 7f316b8fc0ba625de36e1ebb41c2100d
BLAKE2b-256 f3a8c4816cd84a719a95963e28f9354352f5df6085ee1277914fa61c58aefe21

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.3.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.3.0-cp312-cp312-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for paynt-0.3.0-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 455310acdf8bf022e254fe80a5c4bc7788bc4cf1128cdbe2b5e02c2f565f4cd1
MD5 c128adce7f40ad3bc2040397641e1fff
BLAKE2b-256 ce5ace90a208ba1f62a72efbd0b2504859386611ed89827ea0176206d89a5698

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for paynt-0.3.0-cp312-cp312-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 96d442cc855427d070ec235c9987e1d9332dd1d7a76e686602d471302c202220
MD5 10b19850887ddb2e71ed2f3727ebb8cf
BLAKE2b-256 583f31d768e458140d428d76d1a52497d6c614a6c26b165760f1b4ca78295528

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for paynt-0.3.0-cp312-cp312-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 4a5c94fb97376314b2cb7180f17b2d064fe9c8e521e7d57d10c3f9f2cb0fdfa4
MD5 bf01c85a55015365100db94f4034e616
BLAKE2b-256 55594acddc3f282df13b853e2565421712f94238819bcdae4010e9e4b7ceb44d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for paynt-0.3.0-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 f89b9d9bd6b3bda321329c15a4b1f5174d59f6485c23fb216f0ce4a7b9523332
MD5 3e0cf5d59f55e216abb22cd8af0b74cc
BLAKE2b-256 244cc20dc2bda5d69fc4d68729f69ddf983411d87b12a7030b066636df56d4e1

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.3.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.3.0-cp311-cp311-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for paynt-0.3.0-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 b7b21faaa0f488de44c6b6d81bbcb33617edeb36f7f95d64911c9d2cb3e10718
MD5 7192442416c495c4bd05d8ebcf05eabe
BLAKE2b-256 63c626937930486064395046a67785f713823c346b10be3625a3282b59c3425e

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for paynt-0.3.0-cp311-cp311-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 7023aa70844bd33436c23ed6849db1a942dbd58d216a0707b839afdb21b37b7f
MD5 f598af085e37b78f757d3ef70974d658
BLAKE2b-256 241a87518093b445b8e9f5a2ca43b2decf1c45444e8ba9068cea2dfe6fda0330

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for paynt-0.3.0-cp311-cp311-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 752780c85fc51256e50a6b439f2aff81a28ce6c7cd0540325b6a584ff848c940
MD5 de9c15c9cfa37a3ed4bc30628b0b9831
BLAKE2b-256 55cb70d073007f21541a4f68afc9dc15575d6d0dc6afd12f58781ea43bee6c46

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for paynt-0.3.0-cp311-cp311-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 c010d123285e483c95017b5f5bdaf6c8414ba1b35ab00ece8f1d3134d61ab795
MD5 f67b9fa71484e7da22bedf117aab1a47
BLAKE2b-256 f35b1f343350eac77b6964ac41ffa7b82eca92eebe361c9ae86991415d77a42c

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.3.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.3.0-cp310-cp310-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for paynt-0.3.0-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 467e376807e4f8d18e9cc61c60dc65c7ebdbcd241867f40afa4ecc3cd0c5b851
MD5 f6332311dbb67fbe6cd7f02bf0714ab2
BLAKE2b-256 92c3106b9449230871dfeaf52ead69c055289f7b794f2aaa8bad9c039b033994

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for paynt-0.3.0-cp310-cp310-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 5217f4a804df97537a65f70be045596705273fc840ad9878402f30a8aa5abf81
MD5 7968aa1a44cb4eec06a75ed32e7eee83
BLAKE2b-256 db5b027cbc585266acfe067bc4edcdd540e0ee2f4406d4b98bb459a89c085fdd

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for paynt-0.3.0-cp310-cp310-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 20dc8de762c2d1c6fe2afa2d6b040bc66da5494f15e77a6c57719f58fcbd7720
MD5 bb5a158e1b8934a6646828f26c02e1d9
BLAKE2b-256 9f966ac2387df6da24da148c2cc4d3f31a999e77a4c5454ccab0370318cc7f4a

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for paynt-0.3.0-cp310-cp310-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 c76d51ce3c1a1c21c2ef4419ccda1d0186208de64d98033907ec3202315c8be8
MD5 b127c5b3c6c0af9ce7d397007cdb02bc
BLAKE2b-256 c3fab077228d46f8344ce5d4e7ceb3efeebb689289cfbe6acb9588c3929dfcdf

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.3.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