Search code examples
quantum-computingq#

How to pass one Q# operation to another Q# operation from C# or F#


I have the following Q# operations

operation VQC (cirq:((Double[],Qubit[])=>Unit is Adj),measurement:Pauli[], args: Double[], nQubits:Int) : Double {
    let res=EstimateFrequencyA(cirq(args,_),Measure(measurement,_),nQubits,1000);
    return 2.*res-1.;                   
}

operation Cirq(args:Double[],qs: Qubit[]):Unit is Adj{      
    Rz(args[0],qs[0] );
    CNOT(qs[0],qs[1]);
    Ry(args[1],qs[1]);

}

How can I pass the Cirq operation into the VQC operation from C# or F#?


Solution

  • Looks like you can use SimulatorBase.Get<> to get an instance of the operation type you need to pass and to pass it instead.

    Here is C# driver code (F# should be similar):

    using QuantumSimulator qsim = new QuantumSimulator();
    Pauli[] paulis = { Pauli.PauliX, Pauli.PauliZ };
    double[] doubles = { 2.0, 0.5 };
    IAdjointable cirqInstance = qsim.Get<IAdjointable, Cirq>();
    double result = VQC.Run(qsim, cirqInstance, new QArray<Pauli>(paulis), new QArray<Double>(doubles), 2).Result;
    Console.WriteLine(result);