use super::*;
use crate::circuit::ansatz::Ansatz;
use crate::qis::pauli::PauliString;
#[test]
fn test_real_amplitudes() {
let ansatz = real_amplitudes(3, 2, EntanglementTopology::Linear);
let circuit = ansatz.build_circuit("theta").unwrap();
assert_eq!(circuit.num_qubits(), 3);
assert_eq!(ansatz.num_parameters(), 9);
assert_eq!(circuit.parameters().len(), 9);
assert_eq!(circuit.operations().len(), 13);
}
#[test]
fn test_efficient_su2() {
let ansatz = efficient_su2(2, 1, EntanglementTopology::Full);
let circuit = ansatz.build_circuit("p").unwrap();
assert_eq!(circuit.num_qubits(), 2);
assert_eq!(ansatz.num_parameters(), 8);
assert_eq!(circuit.parameters().len(), 8);
}
#[test]
fn test_zz_feature_map_basic() {
let fm = zz_feature_map(3, 1, EntanglementTopology::Full);
let circuit = fm.build_circuit("x").unwrap();
assert_eq!(fm.num_qubits(), 3);
assert_eq!(fm.num_parameters(), 3);
let syms = circuit.symbols();
assert!(syms.contains("x_0") && syms.contains("x_1") && syms.contains("x_2"));
assert_eq!(circuit.operations().len(), 15);
}
#[test]
fn test_zz_feature_map_reps_multiplies_depth() {
let fm_1rep = zz_feature_map(2, 1, EntanglementTopology::Full);
let fm_2rep = zz_feature_map(2, 2, EntanglementTopology::Full);
let c1 = fm_1rep.build_circuit("x").unwrap();
let c2 = fm_2rep.build_circuit("x").unwrap();
assert_eq!(c2.operations().len(), c1.operations().len() * 2);
assert_eq!(fm_1rep.num_parameters(), fm_2rep.num_parameters());
}
#[test]
fn test_zz_feature_map_linear_topology() {
let fm = zz_feature_map(3, 1, EntanglementTopology::Linear);
let circuit = fm.build_circuit("x").unwrap();
assert_eq!(circuit.operations().len(), 12);
}
#[test]
fn test_pauli_feature_map_facade_z_zz() {
let paulis = vec![
("Z".parse::<PauliString>().unwrap(), "Z".to_string()),
("ZZ".parse::<PauliString>().unwrap(), "ZZ".to_string()),
];
let fm = pauli_feature_map(2, 1, paulis, EntanglementTopology::Full);
let circuit = fm.build_circuit("x").unwrap();
assert_eq!(fm.num_qubits(), 2);
assert_eq!(fm.num_parameters(), 2);
let syms = circuit.symbols();
assert!(syms.contains("x_0") && syms.contains("x_1"));
assert_eq!(circuit.operations().len(), 7);
}
#[test]
fn test_pauli_feature_map_facade_zzz_3local() {
let paulis = vec![("ZZZ".parse::<PauliString>().unwrap(), "ZZZ".to_string())];
let fm = pauli_feature_map(3, 1, paulis, EntanglementTopology::Full);
let circuit = fm.build_circuit("x").unwrap();
assert_eq!(fm.num_qubits(), 3);
assert_eq!(fm.num_parameters(), 3);
assert_eq!(circuit.operations().len(), 8);
}
#[test]
fn test_pauli_feature_map_facade_invalid_zero_qubits() {
let fm = pauli_feature_map(0, 1, vec![], EntanglementTopology::Full);
assert!(fm.build_circuit("x").is_err());
}