First Experiment

An Experiment groups repeated, related executions — fixed plans and/or parameter sweeps — into a single runnable unit. Running it through an ExecutionRuntime yields an ExperimentResult whose raw execution records are preserved verbatim.

from microquantum import (
    ExecutionRuntime,
    Experiment,
    ExpectationAnalysis,
    MockBackend,
    Parameter,
    ParameterSweep,
    QuantumCircuit,
)

theta = Parameter("theta")
ansatz = QuantumCircuit(1).ry(theta, 0)

experiment = Experiment("rx-overview", description="RX gate sweep", shots=1024, seed=7)
experiment.add_circuit(ansatz, name="theta=0", parameter_bindings={"theta": 0.0})
experiment.add_sweep(ParameterSweep({"theta": [0.5, 1.0, 2.0]}), base=ansatz)

print(f"planned executions: {experiment.execution_count}")
result = experiment.run(ExecutionRuntime(backend=MockBackend()))

print(f"status:      {result.status}")
print(f"records:     {len(result.records)} (raw, never summarized)")
print(f"failures:    {result.failure_count}")
print(f"fingerprint: {result.records[0].reproducibility['configured_reproducibility']}")

for record in result.records:
    print(f"  {record.parameter_bindings} -> {record.metadata.get('backend')}")

Analysing the result

Raw records feed the analysis layer:

for i, record in enumerate(result.records):
    record.result.expectations = {"Z": 1.0 - 0.25 * i}

analysis = ExpectationAnalysis(result)
print(analysis.keys)
print(analysis.mean("Z"))              # per-label mean across executions

Experiments are fully in-memory and JSON-safe:

from microquantum import ExperimentResult

data = result.to_dict()                # every record serialized
restored = ExperimentResult.from_dict(data)

Next: Overview.