oxicuda_quantum/embedding/
angle.rs1use crate::error::QuantumResult;
2use crate::gates::parametric::gate_ry;
3use crate::statevec::apply_1q::apply_1q_inplace;
4use crate::statevec::state::StateVector;
5
6pub 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)
33 .expect("data is non-empty with valid f32 angles, so angle_embedding returns Ok");
34 let norm = sv.norm_sq();
35 assert!((norm - 1.0).abs() < 1e-5, "norm={norm}");
36 }
37
38 #[test]
39 fn angle_embedding_empty_errors() {
40 assert!(angle_embedding(&[]).is_err());
41 }
42}