Commit 90f18cd9 authored by Nguyen, Thien Minh's avatar Nguyen, Thien Minh
Browse files

Compute the whole deuteron expectation in Q#



Signed-off-by: default avatarThien Nguyen <nguyentm@ornl.gov>
parent 1de31581
Loading
Loading
Loading
Loading
+92 −17
Original line number Diff line number Diff line
@@ -6,6 +6,8 @@ open QCOR.Intrinsic;
// Note: parameter initialization is done here.
// Returns the final energy.
operation DeuteronVqe(shots: Int, stepper : ((Double, Double[]) => Double[])) : Double {
    // Deuteron Hamiltonian:
    // H = "5.907 - 2.1433 X0X1 - 2.1433 Y0Y1 + .21829 Z0 - 6.125 Z1");
    // Stopping conditions:
    let max_iters = 10;
    let f_tol = 0.01;
@@ -16,10 +18,27 @@ operation DeuteronVqe(shots: Int, stepper : ((Double, Double[]) => Double[])) :
    use qubits = Qubit[2]
    {
        for iter_id in 1..max_iters {
            let xxExp = DeuteronXX(qubits, shots, opt_params[0]);
            let yyExp = DeuteronYY(qubits, shots, opt_params[0]);
            let z0Exp = DeuteronZ0(qubits, shots, opt_params[0]);
            let z1Exp = DeuteronZ1(qubits, shots, opt_params[0]);
            set energy_val = 5.907 - 2.1433 * xxExp - 2.1433 * yyExp + 0.21829 * z0Exp - 6.125 * z1Exp;
            // Stepping...
            set opt_params = stepper(energy_val, opt_params);
        } 
    }
    // Final energy:
    return energy_val;
}

// This is for testing only:
// We should use a nicer implementation...
// XX term
operation DeuteronXX(qubits: Qubit[], shots: Int, theta: Double) : Double {
    mutable numParityOnes = 0;
            for test in 1..shots {
    for shot in 1..shots {
        X(qubits[0]);
                Ry(opt_params[0], qubits[1]);
        Ry(theta, qubits[1]);
        CNOT(qubits[1], qubits[0]);
        // Let's measure <X0X1>
        H(qubits[0]);
@@ -31,13 +50,69 @@ operation DeuteronVqe(shots: Int, stepper : ((Double, Double[]) => Double[])) :
        Reset(qubits[0]);
        Reset(qubits[1]);
    }
            set energy_val =  IntAsDouble(shots - numParityOnes)/IntAsDouble(shots) - IntAsDouble(numParityOnes)/IntAsDouble(shots);
            // Stepping...
            set opt_params = stepper(energy_val, opt_params);
    
    let exp_val =  IntAsDouble(shots - numParityOnes)/IntAsDouble(shots) - IntAsDouble(numParityOnes)/IntAsDouble(shots);
    return exp_val;
}

// YY term
operation DeuteronYY(qubits: Qubit[], shots: Int, theta: Double) : Double {
    mutable numParityOnes = 0;
    for shot in 1..shots {
        X(qubits[0]);
        Ry(theta, qubits[1]);
        CNOT(qubits[1], qubits[0]);
        // Let's measure <Y0Y1>
        Rx(1.57079632679, qubits[0]);
        Rx(1.57079632679, qubits[1]);
        if M(qubits[0]) != M(qubits[1]) 
        {
            set numParityOnes += 1;
        }
        Reset(qubits[0]);
        Reset(qubits[1]);
    }
    
    // Final energy:
    return energy_val;
    let exp_val =  IntAsDouble(shots - numParityOnes)/IntAsDouble(shots) - IntAsDouble(numParityOnes)/IntAsDouble(shots);
    return exp_val;
}

// Z0 term
operation DeuteronZ0(qubits: Qubit[], shots: Int, theta: Double) : Double {
    mutable numParityOnes = 0;
    for shot in 1..shots {
        X(qubits[0]);
        Ry(theta, qubits[1]);
        CNOT(qubits[1], qubits[0]);
        if M(qubits[0]) == One
        {
            set numParityOnes += 1;
        }
        Reset(qubits[0]);
        Reset(qubits[1]);
    }
    
    let exp_val =  IntAsDouble(shots - numParityOnes)/IntAsDouble(shots) - IntAsDouble(numParityOnes)/IntAsDouble(shots);
    return exp_val;
}


// Z1 term
operation DeuteronZ1(qubits: Qubit[], shots: Int, theta: Double) : Double {
    mutable numParityOnes = 0;
    for shot in 1..shots {
        X(qubits[0]);
        Ry(theta, qubits[1]);
        CNOT(qubits[1], qubits[0]);
        if M(qubits[1]) == One
        {
            set numParityOnes += 1;
        }
        Reset(qubits[0]);
        Reset(qubits[1]);
    }
    
    let exp_val =  IntAsDouble(shots - numParityOnes)/IntAsDouble(shots) - IntAsDouble(numParityOnes)/IntAsDouble(shots);
    return exp_val;
}
}
 No newline at end of file