Skip to main content

PAYNT - Probabilistic progrAm sYNThesizer

Project description

PAYNT

Build Status

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

Uploaded CPython 3.14tmanylinux: glibc 2.34+ x86-64

paynt-0.2.0-cp314-cp314t-macosx_15_0_x86_64.whl (59.6 MB view details)

Uploaded CPython 3.14tmacOS 15.0+ x86-64

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

Uploaded CPython 3.14tmacOS 14.0+ ARM64

paynt-0.2.0-cp314-cp314-manylinux_2_34_x86_64.whl (74.5 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.34+ x86-64

paynt-0.2.0-cp314-cp314-macosx_15_0_x86_64.whl (59.6 MB view details)

Uploaded CPython 3.14macOS 15.0+ x86-64

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

Uploaded CPython 3.14macOS 14.0+ ARM64

paynt-0.2.0-cp313-cp313-manylinux_2_34_x86_64.whl (74.5 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.34+ x86-64

paynt-0.2.0-cp313-cp313-macosx_15_0_x86_64.whl (59.6 MB view details)

Uploaded CPython 3.13macOS 15.0+ x86-64

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

Uploaded CPython 3.13macOS 14.0+ ARM64

paynt-0.2.0-cp312-cp312-manylinux_2_34_x86_64.whl (74.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ x86-64

paynt-0.2.0-cp312-cp312-macosx_15_0_x86_64.whl (59.6 MB view details)

Uploaded CPython 3.12macOS 15.0+ x86-64

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

Uploaded CPython 3.12macOS 14.0+ ARM64

paynt-0.2.0-cp311-cp311-manylinux_2_34_x86_64.whl (74.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ x86-64

paynt-0.2.0-cp311-cp311-macosx_15_0_x86_64.whl (59.6 MB view details)

Uploaded CPython 3.11macOS 15.0+ x86-64

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

Uploaded CPython 3.11macOS 14.0+ ARM64

paynt-0.2.0-cp310-cp310-manylinux_2_34_x86_64.whl (74.5 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.34+ x86-64

paynt-0.2.0-cp310-cp310-macosx_15_0_x86_64.whl (59.6 MB view details)

Uploaded CPython 3.10macOS 15.0+ x86-64

paynt-0.2.0-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.0.tar.gz.

File metadata

  • Download URL: paynt-0.2.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.2.0.tar.gz
Algorithm Hash digest
SHA256 46e7a767b3b09b891b82421f5b953f3f374cc48daf722b38a9af6da2e6e9f33c
MD5 5982bf5be42ee13919835168de2b2042
BLAKE2b-256 f05a7d583c625bfc062212f4ee77c5cede4ff37f6fad9449974c78e897d792c7

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for paynt-0.2.0-cp314-cp314t-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 d1679c7e1f49fc8ca6b42336d83f9878638daf5d6fd696fc385dc6c341bbd233
MD5 878a47044e239b7d0e91658fa4e10ffe
BLAKE2b-256 c312e9d48ab6712d02e5e1ae9a4058d2e6d5cbabd81291e75075a1a7f9ff6602

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for paynt-0.2.0-cp314-cp314t-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 13ce5eda25b6c8d393ab9213536e7fe16afe68f63c76893aaea33675d406767a
MD5 e221b75a726b2872e3165ff837930070
BLAKE2b-256 e0cbba323b3269f778e0d579ea57843b7896657ef761398d18ffc1fb2c11ca37

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.2.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.2.0-cp314-cp314t-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for paynt-0.2.0-cp314-cp314t-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 1ad5a06716eb0b8a01d3d0ed77dec7a79e4e9d6d3f2a9fbde2a4397268bb1adf
MD5 404f4a7e6cebfd017595a7c279bb07e1
BLAKE2b-256 1dd7bb5e040aadd36ca98db132adb28fd38f7bc15458e123565398a56950b51e

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for paynt-0.2.0-cp314-cp314-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 d7cb11cdc5b982bc3de9cc188ef3ae66d4325ee5959130e6d0a278d12a6aadfe
MD5 c9a16f514d68a5293f8d412fd5f6df1c
BLAKE2b-256 91d8bc15b6c5fd1c7496c56b9f28a05a3f1248328eb14716075e0082b270db9d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for paynt-0.2.0-cp314-cp314-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 2d7283b69a65c9492cc657b6db1aab61ad68e2fd800a9ecbd13f893b1f29570d
MD5 4b53a2a2687728af41f86eae64523bd8
BLAKE2b-256 429d2a39de8b2a7a25928052e1602c5c5d4f51832006eafff470822fd5c5afe3

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.2.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.2.0-cp314-cp314-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for paynt-0.2.0-cp314-cp314-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 6656fe05f9c98338d9c946944529588c754b9ea07b5236b44748ccad8a501841
MD5 8ffbac02588a79645f1ef3edd50f993e
BLAKE2b-256 e3035b30f75ad744488e55b530aee600bc80eed85a5f8aacda030aef1a3a08d6

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for paynt-0.2.0-cp313-cp313-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 280a621c5c9e3aa736f3799777cd5aa50101e64316e9b7d1fc860f224bcc4822
MD5 67caf198faaa404784905a53c65d0c6b
BLAKE2b-256 5598b8e224e8b462ec8b207dfdc93959596c58d287e12acb1cec10148c630750

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for paynt-0.2.0-cp313-cp313-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 be4a9b4b8d2ed1d68b319902a575e97fcb9f75ae5f8366af983d73662848d752
MD5 299041b08086fb67b32cbcdbdf81cfb9
BLAKE2b-256 a640b8b1427e84050adbf848a05bdae30c6c5e26cd3dc663d5737e40ddc12f5c

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.2.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.2.0-cp313-cp313-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for paynt-0.2.0-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 b035807bd162f75970d347463cd52336185d45f024c856202cffd2f54992739b
MD5 7bc63266f703134e7ca6bc1937358cca
BLAKE2b-256 2c08d51b44eb5819048af5d1240f2cf6b4cd28d9ea440966706aff11a6a85f38

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for paynt-0.2.0-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 4427609590ee4ef665fc9a622a25228043d52d8c629527ad046caaeae03b8026
MD5 a06869a6947a7c0c5027cb47f12b99f2
BLAKE2b-256 60305f83a260096f03382d89fee18ebdefe525b51b7a571dfd81e502859a8035

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for paynt-0.2.0-cp312-cp312-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 41f49a209b4a245686653adaf4fc08ad6d1f9b26a5de02c07761b49a2096150e
MD5 e782f6a3641c8da329809e40bd2bfe27
BLAKE2b-256 f63477a46695f27c0e39cc9ff8a13e71860ec89b1e69e61a74f3e8ab72260b8a

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.2.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.2.0-cp312-cp312-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for paynt-0.2.0-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 7ea6fe32a1967f5cb4fded1a54925da5c0fbc0bc35bf160a38d387193b60c684
MD5 20968d5344a4c47d2c018c2fc085e703
BLAKE2b-256 eb362128bdc81e3be15af1ce1841d2a37dc070a9a3192908def63e01d38ecad8

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for paynt-0.2.0-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 e3d53c5006940b367e72aba277106f41fe0618e49f76b2909be8434c64eb205d
MD5 26a0001437db9d5bb9b5236a7a054106
BLAKE2b-256 c6a1744db52bf114eb68d3b5c711c865469800914f9bbecb8b5d30fe76363aec

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for paynt-0.2.0-cp311-cp311-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 04b8c486f29ef1c8e0d8fb8f0177bb827a379402ada007a3c7b5d88a352f8d00
MD5 74da9eb9963b668dc3ce0a1cc3d453b7
BLAKE2b-256 d85e48745e2095fefe4c961c9671ac6281aeb9f8d447669d77ec941ce2500e6c

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.2.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.2.0-cp311-cp311-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for paynt-0.2.0-cp311-cp311-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 22d021af64c4cf642af95ef86eaf3ecdf34824eea9daddaa7c930d90b8441e9f
MD5 f5d4d4479bb71255d9abcd0ad0aa9210
BLAKE2b-256 d9d7e1644dfa0cf7861ff9a91eb6c74319dbde366e3fabbb6704259611f74d15

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for paynt-0.2.0-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 e612a3d0a6fd799919a3533c178bf4c1b10d70756f25574c37d394052b202197
MD5 58c0ba1cbe308b21c7fc55ecb047bd3f
BLAKE2b-256 def0f397c774813cb8f0a5a5221d45771d11f45018a55932f1da4e98f3bb10e3

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for paynt-0.2.0-cp310-cp310-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 88a58a34b6c3b11357d7d949cd259f63a406518a79ccf84b6ac163f183f138b0
MD5 a43185c7c287a96589956ac740a65ed7
BLAKE2b-256 c527f61ae731da46452c129164b1f78ebced334681be62d5ee638a1b0429abe2

See more details on using hashes here.

Provenance

The following attestation bundles were made for paynt-0.2.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.2.0-cp310-cp310-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for paynt-0.2.0-cp310-cp310-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 f7fd13c23f599d7a36077bc906dbf105f0e014487ce9a166855d9ede8c45322d
MD5 6d15f248f2d0c406ca51d049fd80182f
BLAKE2b-256 596f2977df45a99665a91b3c59256562e6d25720fa3542c9efa9cbac045f8131

See more details on using hashes here.

Provenance

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