Skip to content

Commit

Permalink
Add test for single qubit measurement
Browse files Browse the repository at this point in the history
- Use output for known inputs/outputs to test the single qubit
  measurement functionality
  • Loading branch information
smu160 committed Oct 24, 2023
1 parent 553cebd commit 7131701
Showing 1 changed file with 104 additions and 0 deletions.
104 changes: 104 additions & 0 deletions spinoza/src/measurement.rs
Original file line number Diff line number Diff line change
Expand Up @@ -105,4 +105,108 @@ mod tests {

assert_float_closeness(sum, 1.0, 0.001);
}

#[test]
fn test_measure_qubit_known_state() {
let n = 3;
let mut reals = Vec::with_capacity(1 << n);
let mut imags = Vec::with_capacity(1 << n);

let vals = vec![
0.034172256444052966,
0.29007027387615136,
-0.1300556493088507,
0.47222164829858637,
-0.032338373524095645,
0.26511510737291843,
0.1259630181898572,
-0.09645897805840803,
-0.31931099330088214,
-0.24644972468157703,
-0.15963222942036193,
-0.14329373536970438,
-0.1564141838467382,
-0.4751067410290973,
0.1034273381193853,
-0.32966556091031934,
];

let mut i = 0;
while i < vals.len() - 1 {
reals.push(vals[i]);
imags.push(vals[i + 1]);
i += 2;
}

let mut state = State { reals, imags, n };

let epsilon = 0.001;

measure_qubit(&mut state, 0, true, Some(0));

assert_float_closeness(state.reals[0], 0.04528096797370981, epsilon);
assert_float_closeness(state.imags[0], 0.38436627101331156, epsilon);
assert_float_closeness(state.reals[1], 0.0, epsilon);
assert_float_closeness(state.imags[1], 0.0, epsilon);

assert_float_closeness(state.reals[2], -0.042850926694402595, epsilon);
assert_float_closeness(state.imags[2], 0.3512986830692283, epsilon);
assert_float_closeness(state.reals[3], 0.0, epsilon);
assert_float_closeness(state.imags[3], 0.0, epsilon);

assert_float_closeness(state.reals[4], -0.42311255872092046, epsilon);
assert_float_closeness(state.imags[4], -0.32656556082875193, epsilon);
assert_float_closeness(state.reals[5], 0.0, epsilon);
assert_float_closeness(state.imags[5], 0.0, epsilon);

assert_float_closeness(state.reals[6], -0.2072612811212442, epsilon);
assert_float_closeness(state.imags[6], -0.6295543626114914, epsilon);
assert_float_closeness(state.reals[7], 0.0, epsilon);
assert_float_closeness(state.imags[7], 0.0, epsilon);
println!("{state}");

measure_qubit(&mut state, 1, true, Some(0));
assert_float_closeness(state.reals[0], 0.06861878352538178, epsilon);
assert_float_closeness(state.imags[0], 0.5824686866330654, epsilon);
assert_float_closeness(state.reals[1], 0.0, epsilon);
assert_float_closeness(state.imags[1], 0.0, epsilon);

assert_float_closeness(state.reals[2], 0.0, epsilon);
assert_float_closeness(state.imags[2], 0.0, epsilon);
assert_float_closeness(state.reals[3], 0.0, epsilon);
assert_float_closeness(state.imags[3], 0.0, epsilon);

assert_float_closeness(state.reals[4], -0.6411848150109799, epsilon);
assert_float_closeness(state.imags[4], -0.49487748447346463, epsilon);
assert_float_closeness(state.reals[5], 0.0, epsilon);
assert_float_closeness(state.imags[5], 0.0, epsilon);

assert_float_closeness(state.reals[6], 0.0, epsilon);
assert_float_closeness(state.imags[6], 0.0, epsilon);
assert_float_closeness(state.reals[7], 0.0, epsilon);
assert_float_closeness(state.imags[7], 0.0, epsilon);
println!("{state}");

measure_qubit(&mut state, 2, true, Some(1));
assert_float_closeness(state.reals[0], -0.7916334352111761, epsilon);
assert_float_closeness(state.imags[0], -0.6109963209838112, epsilon);
assert_float_closeness(state.reals[1], 0.0, epsilon);
assert_float_closeness(state.imags[1], 0.0, epsilon);

assert_float_closeness(state.reals[2], 0.0, epsilon);
assert_float_closeness(state.imags[2], 0.0, epsilon);
assert_float_closeness(state.reals[3], 0.0, epsilon);
assert_float_closeness(state.imags[3], 0.0, epsilon);

assert_float_closeness(state.reals[4], 0.0, epsilon);
assert_float_closeness(state.imags[4], 0.0, epsilon);
assert_float_closeness(state.reals[5], 0.0, epsilon);
assert_float_closeness(state.imags[5], 0.0, epsilon);

assert_float_closeness(state.reals[6], 0.0, epsilon);
assert_float_closeness(state.imags[6], 0.0, epsilon);
assert_float_closeness(state.reals[7], 0.0, epsilon);
assert_float_closeness(state.imags[7], 0.0, epsilon);
println!("{state}");
}
}

0 comments on commit 7131701

Please sign in to comment.