jiuzhang-sdk ✨
Python SDK for the JiuZhang photonic quantum cloud platform, with cloud GBS task submission, result retrieval, local GBS math, sampling, IR serialization, and local handwritten digit recognition helpers.
The SDK provides three core capability groups:
| Capability | Uses the JiuZhang cloud platform | Result source | Typical use |
|---|---|---|---|
| Cloud GBS tasks | Yes | Executed by the JiuZhang cloud platform | Submit GBS experiments, poll status, parse returned results |
| Local GBS sampling | No | Generated locally by numerical libraries | Teaching, prototyping, local validation, notebook demos |
| Local handwritten digit recognition | No | Generated locally by the SDK classifier | Jupyter demos, image-recognition tutorials, local algorithm validation |
Cloud GBS tasks are executed by the JiuZhang cloud platform. Python scripts and Jupyter notebooks submit requests, poll task status, and read results.
Local GBS sampling runs entirely on the local machine and does not call the cloud API. Results are generated by The Walrus numerical backend from the provided matrix and sampling parameters.
Local handwritten digit recognition also runs without the cloud API. Results are generated from local PCA features, a GBS-style feature layer, and a closed-form classifier.
📦 Installation
Install the SDK:
pip install jiuzhang-sdk
The default installation includes cloud task submission, local GBS math and sampling, and local Blackbird / XIR serialization.
🔐 Cloud Credentials
Before submitting a cloud task, prepare these values from the JiuZhang cloud workspace:
| Value | Description |
|---|---|
api_key |
Authentication credential used in the X-Jiuzhang-API-Key request header |
project_id |
Cloud project identifier used to associate tasks with a project |
quantum_computer_id |
Cloud device code, for example PH_QC_04 |
Recommended environment variables:
export JIUZHANG_API_KEY="your-api-key"
export JIUZHANG_PROJECT_ID="your-project-id"
export JIUZHANG_QUANTUM_COMPUTER_ID="PH_QC_04"
export JIUZHANG_BASE_URL="https://cloud.jiuzhangqt.com/api/v1"
☁️ Cloud GBS Workflow
from jiuzhang import CloudClient, GBSParams, parse_gbs_result
client = CloudClient(
base_url="https://cloud.jiuzhangqt.com/api/v1",
api_key="your-api-key",
)
params = GBSParams(
project_id="EXP-demo-project",
quantum_computer_id="PH_QC_04",
mt=500,
pump_energy_nj=4.6,
squeezing_param=0.35,
task_name="GBS experiment",
)
estimate = client.estimate_runtime(
quantum_computer_id=params.quantum_computer_id,
mt_value=params.mt,
pump_energy_nj=params.pump_energy_nj,
)
task = client.submit_task(
project_id=params.project_id,
task_name=params.task_name,
quantum_computer_id=params.quantum_computer_id,
mt_value=params.mt,
pump_energy_nj=params.pump_energy_nj,
squeezing_param=params.squeezing_param,
)
task_id = task["data"]["task_id"]
raw_result = client.get_result(task_id)
result = parse_gbs_result(raw_result)
print(result.status_name)
print(result.sample_count)
print(result.experimental_distribution)
client.close()
One-call helper:
result = client.run_gbs(params, poll_interval=2.0, timeout=300.0)
print(result.status_name)
🌐 Cloud API Methods
| Method | Purpose |
|---|---|
CloudClient(base_url, api_key, timeout=30.0) |
Create an authenticated cloud API client |
CloudClient.from_env() |
Create a client from JIUZHANG_* environment variables |
estimate_runtime(quantum_computer_id, mt_value, pump_energy_nj) |
Estimate runtime before submitting a task |
submit_task(project_id, task_name, quantum_computer_id, mt_value, pump_energy_nj, squeezing_param=None) |
Submit a cloud GBS task |
get_result(task_id) |
Query a task result |
run_experiment(...) |
Estimate, submit, poll, and return raw responses |
estimate_gbs(params) |
Estimate using GBSParams |
submit_gbs(params) |
Submit using GBSParams |
run_gbs(params) |
Run the full workflow and return GBSResult |
close() |
Close the underlying HTTP client |
🧾 Cloud Parameter Object
from jiuzhang import GBSParams
params = GBSParams(
project_id="EXP-demo-project",
quantum_computer_id="PH_QC_04",
mt=500,
pump_energy_nj=4.6,
squeezing_param=0.35,
task_name="GBS experiment",
)
| Field | Description |
|---|---|
project_id |
Cloud project ID |
quantum_computer_id |
Cloud device code |
mt |
Pump pulse time-bin count, validated as 1..500 |
pump_energy_nj |
Pump energy in nJ |
squeezing_param |
Optional squeezing parameter |
shots |
Optional shot count field |
task_name |
Display name for the task |
Helper methods:
| Method | Purpose |
|---|---|
validate() |
Validate fields locally |
input_mode_count() |
Return 3 * mt |
output_mode_count() |
Return 9 * (mt + 80) |
to_cloud_payload() |
Build a cloud payload dictionary |
summary() |
Build a compact parameter summary |
📊 Parsed Result Object
GBSResult is returned by run_gbs() or by parse_gbs_result(raw_result).
| Field or property | Description |
|---|---|
task_id |
Cloud task ID |
status_name |
Normalized task status |
sample_count |
Returned sample count |
result_map_points |
Probability distribution curves |
experimental_distribution |
Experimental distribution points |
ground_truth_distribution |
Reference distribution points |
download_url |
Raw result download URL |
raw |
Original response dictionary |
🧮 Local GBS Sampling
Local GBS sampling does not call the cloud API. Results are generated on the local machine by The Walrus from the adjacency matrix and sampling parameters.
from jiuzhang.local.gbs import (
random_adjacency_matrix,
sample_gbs,
samples_to_distribution,
)
graph = random_adjacency_matrix(8, scale=0.16, seed=7)
samples = sample_gbs(
graph,
shots=24,
mean_photon_count=1.0,
detector="pnr",
cutoff=4,
max_photons=12,
seed=123,
)
distribution = samples_to_distribution(samples)
print(distribution)
| Function | Purpose |
|---|---|
random_adjacency_matrix(modes, scale=0.2, seed=None) |
Generate a symmetric adjacency matrix |
sample_gbs(adjacency, shots=10, mean_photon_count=1.0, detector="pnr", cutoff=5, max_photons=30, seed=None, parallel=False) |
Generate local GBS samples |
samples_to_distribution(samples) |
Convert samples into a normalized pattern distribution |
🧩 Local Math and IR Helpers
from jiuzhang.local.gbs import (
GBSProgram,
dumps_ir,
hafnian,
loop_hafnian,
threshold_probability,
to_blackbird,
to_xir,
torontonian,
)
| Function | Purpose |
|---|---|
hafnian(matrix, loop=False, approx=False, num_samples=1000, method="glynn") |
Compute the Hafnian of a square matrix |
loop_hafnian(matrix, diagonal=None, reps=None, glynn=True) |
Compute the loop Hafnian |
torontonian(matrix, recursive=True) |
Compute the Torontonian |
threshold_probability(mean, covariance, pattern, hbar=2.0, atol=1e-10, rtol=1e-10) |
Compute a threshold detection probability |
GBSProgram(modes, operations=(), name="gbs_program") |
Build a local GBS program |
dumps_ir(program, format="json") |
Serialize a program to JSON, Blackbird, or XIR text |
loads_ir(payload) |
Parse JSON local IR |
to_blackbird(program) |
Serialize to Blackbird text |
to_xir(program) |
Serialize to XIR text |
🧠 Local Handwritten Digit Recognition
from jiuzhang.local.mnist import run_mnist_recognition
result = run_mnist_recognition(
train_size=1200,
test_size=300,
source="digits",
n_components=32,
feature_count=256,
combine=True,
random_state=7,
)
print(result.train)
print(result.accuracy)
print(result.confusion_matrix)
Manual training:
from jiuzhang.local.mnist import GBSMNISTClassifier, load_mnist_data
dataset = load_mnist_data(train_size=1200, test_size=300, source="digits")
classifier = GBSMNISTClassifier(n_components=32, feature_count=256)
classifier.fit(dataset.train_data, dataset.train_labels, combine=True)
predictions = classifier.predict(dataset.test_data)
evaluation = classifier.evaluate(dataset.test_data, dataset.test_labels, reuse=True)
| Parameter | Description |
|---|---|
source |
Dataset source. digits is the bundled offline dataset, and openml downloads MNIST 784 |
train_size |
Number of training samples |
test_size |
Number of test samples |
n_components |
PCA components retained before feature extraction |
feature_count |
Number of local GBS-style features |
combine |
True for GBS-RVFL, False for GBS-ELM |
regularization |
Ridge regularization strength for the output layer |
random_state |
Seed for reproducible experiments |
📄 License
Proprietary. Copyright 2026 JiuZhang Quantum. All rights reserved.
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 jiuzhang_sdk-0.1.3.tar.gz.
File metadata
- Download URL: jiuzhang_sdk-0.1.3.tar.gz
- Upload date:
- Size: 40.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.11.24 {"installer":{"name":"uv","version":"0.11.24","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
268f1881bd4f57ca7d04d2e5b8fb9cf77a7f865ca711b69274e899f4d98f3706
|
|
| MD5 |
20ce8f313bd2978745c2756d3a0ec76b
|
|
| BLAKE2b-256 |
c8f94379312b2e7502226856675f2705be14eac55d78ed581eee63efb7d7c423
|
File details
Details for the file jiuzhang_sdk-0.1.3-py3-none-any.whl.
File metadata
- Download URL: jiuzhang_sdk-0.1.3-py3-none-any.whl
- Upload date:
- Size: 44.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.11.24 {"installer":{"name":"uv","version":"0.11.24","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6f437d13a271bf5720a52f6bf4bd117fdca9c04acc2b654501e411cd1fe772a3
|
|
| MD5 |
63f3d5dfac7adf8600a57fc2262186be
|
|
| BLAKE2b-256 |
2ec4da83a36da848e197d8e37a1877baf5aae2174c46ff346564ebe80d9cfc52
|