qsharp icon indicating copy to clipboard operation
qsharp copied to clipboard

Operations for state preparation

Open msoeken opened this issue 1 year ago • 2 comments
trafficstars

Is your feature request related to a problem? Please describe. Operations for uniform and arbitrary state preparation.

Describe the solution you'd like

Single-qubit state preparation and uniform state preparation:

/// # Summary
/// Prepares a single qubit `target` such the probability of being measured 0 is `p0 / (p0 + p1)`
/// and being measured 1 is `p1 / (p0 + p1)`
operation PrepareSingleQubit(p0 : Double, p1 : Double, target : Qubit) : Unit is Adj+Ctl {}

/// # Summary
/// Prepares a state on `qs` that has the same amplitude for the first `numStates` basis states
operation PrepareUniformSuperposition(numStates : Int, qs : Qubit[]) : Unit is Adj+Ctl {}

Arbitrary state preparation (requires UDT for garbage qubit initialization):

newtype PrepareArbitrarySuperposition = (
    /// Number of address qubits
    NIndexQubits: Int,
    /// Number of garbage qubits (depends on target error)
    NGarbageQubits: Int,
    /// Prepare operation with default Select operation
    Prepare: (Qubit[], Qubit[], Qubit[]) => Unit is Adj + Ctl,
    /// Prepare operation with custom Select operation
    PrepareWithSelect: ((Bool[][], Qubit[], Qubit[]) => Unit is Adj + Ctl, Qubit[], Qubit[], Qubit[]) => Unit is Adj + Ctl
);

function MakePrepareArbitrarySuperposition(targetError : Double, coefficients : Double[])
    : PrepareArbitrarySuperposition {}

function MakePrepareArbitrarySuperpositionWithData(targetError : Double, coefficients : Double[], data: Bool[][])
    : PrepareArbitrarySuperposition {}

Here are examples on how to use arbitrary state preparation:

let prepare = MakePrepareArbitrarySuperposition(0.001, [0.1, 0.2, 0.3]);

use address = Qubit[prepare::NIndexQubits];
use garbage = Qubit[prepare::NGarbageQubits];

prepare::Prepare(address, address, [], garbage);

Or when also preparing additional data with each coefficient:

let prepare = MakePrepareArbitrarySuperpositionWithData(0.001, [0.1, 0.2, 0.3], [[false, false], [true, true], [false, false]]);

use address = Qubit[prepare::NIndexQubits];
use data = Qubit[2];
use garbage = Qubit[prepare::NGarbageQubits];

prepare::Prepare(address, address, data, garbage);

msoeken avatar Dec 06 '23 08:12 msoeken

Would stabilizing the state preparation code from the Unstable library solve this issue? If so, we should discuss that.

CC @DmitryVasilevsky @tcNickolas

sezna avatar Aug 13 '24 21:08 sezna

I'm all in favor of stabilizing our state preparation library! It is core functionality for a high-level language

tcNickolas avatar Aug 13 '24 21:08 tcNickolas

I think this is closed as of #2022 (ref #1910), feel free to reopen if this is incorrect.

sezna avatar Dec 28 '24 16:12 sezna