// Experimental hybrid optimization: minimize the sampled expectation of Z.
// A one-qubit teaching problem; no claim of quantum advantage or NN autograd.
import aner.quantum

fn energy(theta: Float64, backend: QuantumBackend, seed: Int64) {
    return quantum.circuit(qubits: 1).ry(0, theta)
        .run(backend: backend, shots: 8192, seed: seed).sampled_z(0)
}

let backend = quantum.cpu()
let half_pi = 1.5707963267948966
var theta = 0.4
print("Initial sampled energy")
print(energy(theta, backend, 100))
for step in Range(40) {
    // Parameter shift for this single Ry rotation and Pauli-Z observable.
    let plus = energy(theta + half_pi, backend, 2026 + 2 * step)
    let minus = energy(theta - half_pi, backend, 2027 + 2 * step)
    let gradient = (plus - minus) / 2.0
    theta -= 0.3 * gradient
}
print("Final angle in radians")
print(theta)
print("Final sampled energy; the ideal minimum is -1")
print(energy(theta, backend, 9000))
