Python client and utilities for tierkreis.
Project description
Tierkreis
Tierkreis is a higher-order dataflow graph program representation and runtime designed for compositional, quantum-classical hybrid algorithms.
For a detailed introduction read the paper: Tierkreis: a Dataflow Framework for Hybrid Quantum-Classical Computing.
This repository contains the source for the tierkreis python package.
The python package provides a complete development and testing environment for writing and running Tierkreis program, and allows you to write extensions ("workers") in python.
Quick-start
Tierkreis works best with the uv package manager. We strongly recommend using it as your package manager for Tierkreis projects.
To get started with Tierkreis start a new uv project in an empty directory with:
uv init
Then add Tierkreis to the project and run the project setup tool.
uv add tierkreis
uv run tkr init project
You can then run the generated example graph at tkr/graphs.main.py.
uv run tkr/graphs/main.py
For a more in depth tutorial see our full getting started guide.
Build graphs
A workflow graph can be constructed by adding nodes to a graph object. For each node one has to define the input and output ports of the node. The following example shows how to multiple a user input with a constant value.
def times_5() -> GraphData:
"""A graph that calculates input*5 """
g = GraphData()
# declare the constant value 5 with the output port "value"
const = g.const(5)
# declare the Input node that reads from a port "value" and maps to a port "value"
user_input = g.input("value")
# use a built in functionality that takes two inputs "a" and "b" and maps to a port "value"
output = g.func(
"builtins.itimes", {"a": const, "b": user_input}
)("value")
# the final output of the graph is put out at a port "value"
g.add({"value": output})
return g
Visualize
To visualize a workflow we provide a separate package tierkreis-visualization found here.
It can be invoked from the command line with tkr-vis.
Opening localhost:8000 will open a browser window with the visualization.
CLI
Tierkreis comes with a command line interface for running workflows.
To see all available options use tkr --help.
To run the hello world example in this repository from the cli
uv run tkr run \
-g ../docs/source/examples/hello_world.py:graph \
-i ../docs/source/examples/data/world.json \
--uv \
--registry-path ../docs/source/examples/example_workers/ \
-o
Explanation:
-gspecifies the graph to run by specifying the location and function to run.-ispecifies the input for the graph function. In this case it loads a json file with the contents{"value": "World!"}--uvenables the use of the UV executor.--registry-pathspecifies the location of the registry to use for the UV executor.-oenables output printing.
Examples
For more involved examples see examples directory.
Under the Hood
Under the hood, Tierkreis consists of three main components.
- Controller: The controller orchestrates the workflow and progresses the computation.
- Executor: Executors are responsible to execute external function calls implemented by workers.
- Worker: A worker is a standalone program which conforms to the Tierkreis worker interface.
The run_workflow() function provides sensible defaults which can be replaced as needed.
Roughly, a workflow runs by
graph = times_5()
# Define a file based controller
storage = ControllerFileStorage(UUID(int=id), name=name, do_cleanup=True)
# Define an executor running binaries from the shell
executor = ShellExecutor(
Path("./examples/launchers"), logs_path=storage.logs_path
)
inputs = {Labels.VALUE: json.dumps(3).encode()},
run_graph(storage, executor, g, inputs)
output_ports = g.nodes[g.output_idx()].inputs.keys()
actual_output = {}
for port in output_ports:
print(json.loads(storage.read_output(Loc(), port)))
Controller
The controller internally stores the progress of the workflow including:
- The definition of nodes
- The status of nodes (not started, started, error, done)
- A map between node in- and output ports
By default, this is stored in the file system under ~/.tierkreis/workflows/<workflow_id>/.
Executor
An executor defines a way to run workers in a workflow.
For example the UvExecutor provided out of the box, will run a python program by executing
uv run main.py <node_definition_path>
The command will be executed in the registry directory of multiple workers which can be configured manually:
executor = UVExecutor(registry_path=Path("/docs/source/examples/example_workers"))
# the path to the directory where workers are stored
Worker
Workers are standalone programs which implement a set of functions which can connect to a Tierkreis controller to add extra primitives.
To define python based workers that run in an isolated environment, you can use the build in Worker utilities and the UVExecutor.
For example, we could define a custom hello world worker:
# The following defines the python program for uv
# /// script
# requires-python = ">=3.12"
# dependencies = ["pydantic", "tierkreis"]
#
# ///
import logging
from sys import argv
from pathlib import Path
from tierkreis import Worker, Value
logger = logging.getLogger(__name__)
worker = Worker("hello_world_worker")
# Workers can expose multiple functions returning a Value object
@worker.function()
def greet(greeting: str, subject: str) -> Value[str]:
logger.info("%s %s", greeting, subject)
return Value(value=greeting + subject)
# The worker will be invoked from the executor with the node definition path as the only argument
def main() -> None:
node_definition_path = argv[1]
logger.info(node_definition_path)
worker.run(Path(node_definition_path))
if __name__ == "__main__":
logger.info("starting worker")
main()
In a graph such a worker would be invoked by calling
g = GraphData()
hello = g.const("hello ")
subject = g.add("world!")
output = g.func(
"hello_world_worker.greet", {"greeting": hello, "subject": subject}
)("value")
g.output({"value": output})
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file tierkreis-2.0.12.tar.gz.
File metadata
- Download URL: tierkreis-2.0.12.tar.gz
- Upload date:
- Size: 130.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
666b033a929bdf58a02515605376faea87a50f8a0685d8cf07f82a6227dc8f4e
|
|
| MD5 |
3542786b042f9c994c70017ab57d70e5
|
|
| BLAKE2b-256 |
9d06a288ef8386764e0354a5eb24006965bf9f16fc3319bb4b17562d2f11c4e9
|
Provenance
The following attestation bundles were made for tierkreis-2.0.12.tar.gz:
Publisher:
release.yml on Quantinuum/tierkreis
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
tierkreis-2.0.12.tar.gz -
Subject digest:
666b033a929bdf58a02515605376faea87a50f8a0685d8cf07f82a6227dc8f4e - Sigstore transparency entry: 1318290556
- Sigstore integration time:
-
Permalink:
Quantinuum/tierkreis@1dd8ae165d5d7d1fee052b3c559e7495da4372c5 -
Branch / Tag:
refs/tags/v2.0.12-post.2 - Owner: https://github.com/Quantinuum
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@1dd8ae165d5d7d1fee052b3c559e7495da4372c5 -
Trigger Event:
release
-
Statement type:
File details
Details for the file tierkreis-2.0.12-py3-none-any.whl.
File metadata
- Download URL: tierkreis-2.0.12-py3-none-any.whl
- Upload date:
- Size: 118.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1119cfbb632ad7d6b40d93805d47fe6b37807d7e34fa32f8b6ecf703c1fe98fd
|
|
| MD5 |
8703480293353a244180adef76f4ba09
|
|
| BLAKE2b-256 |
c0e463588a2eb93e7af0457bda9cfb1bc5def1795cc449f1d8d54fe6bdf84cf8
|
Provenance
The following attestation bundles were made for tierkreis-2.0.12-py3-none-any.whl:
Publisher:
release.yml on Quantinuum/tierkreis
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
tierkreis-2.0.12-py3-none-any.whl -
Subject digest:
1119cfbb632ad7d6b40d93805d47fe6b37807d7e34fa32f8b6ecf703c1fe98fd - Sigstore transparency entry: 1271310799
- Sigstore integration time:
-
Permalink:
Quantinuum/tierkreis@1dd8ae165d5d7d1fee052b3c559e7495da4372c5 -
Branch / Tag:
refs/tags/v2.0.12-post.2 - Owner: https://github.com/Quantinuum
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@1dd8ae165d5d7d1fee052b3c559e7495da4372c5 -
Trigger Event:
release
-
Statement type: