diff --git a/spinoza/src/measurement.rs b/spinoza/src/measurement.rs index 7b24b52..68b8528 100644 --- a/spinoza/src/measurement.rs +++ b/spinoza/src/measurement.rs @@ -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}"); + } }