|
8 | 8 | using namespace stim; |
9 | 9 |
|
10 | 10 | TEST(conversions, stabilizer_state_vector_to_circuit_basic) { |
| 11 | + ASSERT_THROW(stabilizer_state_vector_to_circuit({}, false), std::invalid_argument); |
| 12 | + |
11 | 13 | ASSERT_THROW( |
12 | 14 | stabilizer_state_vector_to_circuit( |
13 | 15 | { |
14 | | - {0.5}, |
| 16 | + {0}, |
15 | 17 | }, |
16 | 18 | false), |
17 | 19 | std::invalid_argument); |
@@ -175,6 +177,35 @@ TEST(conversions, stabilizer_state_vector_to_circuit_fuzz_round_trip) { |
175 | 177 | } |
176 | 178 | } |
177 | 179 |
|
| 180 | +TEST(conversions, stabilizer_state_vector_to_circuit_unnormalized_fuzz_round_trip) { |
| 181 | + auto rng = INDEPENDENT_TEST_RNG(); |
| 182 | + auto little_endian = true; |
| 183 | + |
| 184 | + for (size_t i = 0; i < 100; i++) { |
| 185 | + // Pick a random stabilizer state. |
| 186 | + size_t n = i % 5; |
| 187 | + TableauSimulator<64> sim(INDEPENDENT_TEST_RNG(), n); |
| 188 | + sim.inv_state = Tableau<64>::random(n, rng); |
| 189 | + auto desired_vec = sim.to_state_vector(little_endian); |
| 190 | + |
| 191 | + // Unnormalize by multiplying by a random non-zero factor. |
| 192 | + auto scaled_vec = desired_vec; |
| 193 | + std::uniform_real_distribution<float> dist(-1000.0, +1000.0); |
| 194 | + std::complex<float> scale = {dist(rng), dist(rng)}; |
| 195 | + while (std::norm(scale) < 0.01) { |
| 196 | + scale = {dist(rng), dist(rng)}; |
| 197 | + } |
| 198 | + for (auto &c : scaled_vec) { |
| 199 | + c *= scale; |
| 200 | + } |
| 201 | + |
| 202 | + // Round trip through a circuit. |
| 203 | + auto circuit = stabilizer_state_vector_to_circuit(scaled_vec, little_endian); |
| 204 | + auto actual_vec = circuit_to_output_state_vector(circuit, little_endian); |
| 205 | + ASSERT_EQ(actual_vec, desired_vec) << " scale=" << scale; |
| 206 | + } |
| 207 | +} |
| 208 | + |
178 | 209 | TEST(conversions, circuit_to_output_state_vector) { |
179 | 210 | ASSERT_EQ(circuit_to_output_state_vector(Circuit(""), false), (std::vector<std::complex<float>>{{1}})); |
180 | 211 | ASSERT_EQ( |
|
0 commit comments