Examples#

Library initialization#

#include <custabilizer.h>

int main() {
    custabilizerHandle_t handle;
    custabilizerCreate(&handle);

    custabilizerDestroy(handle);
    return 0;
}

Simple circuit simulation#

This example demonstrates how to create a circuit and apply it using custabilizerFrameSimulatorApplyCircuit().

#include <custabilizer.h>
#include <cuda_runtime.h>

int main() {
    // Create library handle
    custabilizerHandle_t handle;
    custabilizerCreate(&handle);

    // Define a simple circuit
    const char* circuitString =
        "X_ERROR(0.01) 0 1\n"
        "H 0\n"
        "CNOT 0 1\n"
        "M 0 1\n";

    // Create circuit
    int64_t bufferSize;
    custabilizerCircuitSizeFromString(handle, circuitString, &bufferSize);
    void* bufferDevice;
    cudaMalloc(&bufferDevice, bufferSize);

    custabilizerCircuit_t circuit;
    custabilizerCreateCircuitFromString(handle, circuitString, bufferDevice,
                                       bufferSize, &circuit);

    // Set up frame simulator parameters
    int64_t numQubits = 2;
    int64_t numShots = 1017;
    int64_t numMeasurements = 2;
    int64_t stride = ((numShots + 7) / 8 + 3) & ~3;  // Pad to multiple of 4

    // Create frame simulator
    custabilizerFrameSimulator_t frameSimulator;
    custabilizerCreateFrameSimulator(handle, numQubits, numShots,
                                    numMeasurements, stride, &frameSimulator);

    // Allocate and initialize bit tables
    int64_t bitTableBytes = numQubits * stride;
    int64_t mTableBytes = numMeasurements * stride;

    custabilizerBitInt_t* xTableDevice;
    custabilizerBitInt_t* zTableDevice;
    custabilizerBitInt_t* mTableDevice;

    cudaMalloc(&xTableDevice, bitTableBytes);
    cudaMalloc(&zTableDevice, bitTableBytes);
    cudaMalloc(&mTableDevice, mTableBytes);

    cudaMemset(xTableDevice, 0, bitTableBytes);
    cudaMemset(zTableDevice, 0, bitTableBytes);
    cudaMemset(mTableDevice, 0, mTableBytes);

    // Apply circuit to the Pauli frames
    uint64_t seed = 42;
    int randomizeFrameAfterMeasurement = 1;
    cudaStream_t stream = 0;

    custabilizerFrameSimulatorApplyCircuit(handle, frameSimulator, circuit,
                                          randomizeFrameAfterMeasurement, seed,
                                          xTableDevice, zTableDevice, mTableDevice,
                                          stream);

    cudaStreamSynchronize(stream);

    // Clean up
    cudaFree(xTableDevice);
    cudaFree(zTableDevice);
    cudaFree(mTableDevice);
    custabilizerDestroyFrameSimulator(frameSimulator);
    custabilizerDestroyCircuit(circuit);
    cudaFree(bufferDevice);
    custabilizerDestroy(handle);
    return 0;
}