Skip to main content

oxicuda_quantum/embedding/
angle.rs

1use crate::error::QuantumResult;
2use crate::gates::parametric::gate_ry;
3use crate::statevec::apply_1q::apply_1q_inplace;
4use crate::statevec::state::StateVector;
5
6/// Angle embedding: encode `data\[i\]` as RY(data\[i\]) on qubit i of |0⟩^n.
7///
8/// The number of qubits equals `data.len()`.
9pub fn angle_embedding(data: &[f32]) -> QuantumResult<StateVector> {
10    use crate::error::QuantumError;
11    if data.is_empty() {
12        return Err(QuantumError::EmptyInput);
13    }
14
15    let n = data.len();
16    let mut sv = StateVector::new_zero_state(n)?;
17
18    for (q, &angle) in data.iter().enumerate() {
19        apply_1q_inplace(&mut sv, q, &gate_ry(angle))?;
20    }
21
22    Ok(sv)
23}
24
25#[cfg(test)]
26mod tests {
27    use super::*;
28
29    #[test]
30    fn angle_embedding_norm_preserved() {
31        let data = [0.5_f32, 1.2, 0.3];
32        let sv = angle_embedding(&data).unwrap();
33        let norm = sv.norm_sq();
34        assert!((norm - 1.0).abs() < 1e-5, "norm={norm}");
35    }
36
37    #[test]
38    fn angle_embedding_empty_errors() {
39        assert!(angle_embedding(&[]).is_err());
40    }
41}