use everett::algorithms::prep;
use everett::{Circuit, DensityMatrixBackend, NoiseModel};
fn main() -> everett::Result<()> {
let bell = prep::bell();
let ideal = DensityMatrixBackend::run(&bell)?;
let rho_ideal = ideal.density_matrix();
println!("ideal Bell state:");
println!(" purity: {:.6}", rho_ideal.purity());
println!(" P(|00>): {:.6}", rho_ideal.probability(0b00));
println!(" P(|11>): {:.6}", rho_ideal.probability(0b11));
println!();
for &p in &[0.01f64, 0.05, 0.10] {
let noise = NoiseModel::uniform_depolarizing(p);
let exec = DensityMatrixBackend::run_with_noise(&bell, &noise)?;
let rho = exec.density_matrix();
println!(
"depolarizing p={p:.2}: purity={:.4} P(00)={:.4} P(11)={:.4}",
rho.purity(),
rho.probability(0b00),
rho.probability(0b11)
);
}
println!();
let mut c = Circuit::new(1);
c.x(0);
for &gamma in &[0.0f64, 0.1, 0.5, 0.9] {
let noise = NoiseModel::amplitude_damping(gamma);
let exec = DensityMatrixBackend::run_with_noise(&c, &noise)?;
let rho = exec.density_matrix();
println!(
"amplitude damping gamma={gamma:.1}: P(|0>)={:.4} P(|1>)={:.4}",
rho.probability(0),
rho.probability(1)
);
}
println!();
let mut c = Circuit::new(1);
c.h(0);
println!("dephasing of |+> state (off-diagonal magnitude):");
for &p in &[0.0f64, 0.1, 0.3, 0.5] {
let noise = NoiseModel::dephasing(p);
let exec = DensityMatrixBackend::run_with_noise(&c, &noise)?;
let rho = exec.density_matrix();
println!(
" p={p:.1}: |rho_01|={:.4} <X>={:.4}",
rho.get(0, 1).norm(),
rho.expectation_pauli(0, 'X')
);
}
Ok(())
}