use crate::circuit::HashMap;
use crate::complex_re;
use crate::states::{ProductState, SuperPosition};
use num_complex::Complex64;
impl SuperPosition {
pub(crate) fn new_with_hash_amplitudes_unchecked(
hash_amplitudes: HashMap<ProductState, Complex64>,
) -> SuperPosition {
let product_dim: usize = hash_amplitudes.keys().next().unwrap().num_qubits();
let mut amplitudes: Vec<Complex64> = vec![num_complex::Complex64::ZERO; 1 << product_dim];
Self::from_hash_to_array(hash_amplitudes, &mut amplitudes);
SuperPosition {
amplitudes,
product_dim,
}
}
pub(crate) fn new_with_register_unchecked<const N: usize>(
amplitudes: [Complex64; N],
) -> SuperPosition {
SuperPosition {
amplitudes: amplitudes.to_vec(),
product_dim: N.trailing_zeros() as usize,
}
}
pub(crate) fn new_unchecked(num_qubits: usize) -> SuperPosition {
let mut new_amps: Vec<Complex64> = vec![num_complex::Complex64::ZERO; 1 << num_qubits];
new_amps[0] = complex_re!(1f64);
SuperPosition {
amplitudes: new_amps,
product_dim: num_qubits,
}
}
pub(crate) fn set_amplitudes_from_states_unchecked(
&mut self,
mut hash_amplitudes: HashMap<ProductState, Complex64>,
) -> &mut SuperPosition {
for (i, amp) in self.amplitudes.iter_mut().enumerate() {
*amp = hash_amplitudes
.remove(&ProductState::binary_basis(i, self.product_dim))
.unwrap_or(complex_re!(0f64));
}
self
}
pub fn new_with_amplitudes_unchecked(amplitudes: &[Complex64]) -> SuperPosition {
let length = amplitudes.len();
SuperPosition {
amplitudes: amplitudes.to_vec(),
product_dim: length.trailing_zeros() as usize,
}
}
pub fn set_amplitudes_unchecked(&mut self, amplitudes: &[Complex64]) -> &mut SuperPosition {
self.amplitudes = amplitudes.to_vec();
self
}
}