Skip to main content

problemreductions/rules/
closestvectorproblem_casts.rs

1//! Numeric variant reduction for Closest Vector Problem.
2
3use crate::impl_variant_reduction;
4use crate::models::algebraic::ClosestVectorProblem;
5use crate::rules::ReductionError;
6use crate::types::i64_to_exact_f64;
7
8impl_variant_reduction!(
9    ClosestVectorProblem,
10    <i64> => <f64>,
11    fields: [ambient_dimension, num_basis_vectors],
12    |src| {
13        let target = src
14            .target()
15            .iter()
16            .copied()
17            .map(i64_to_exact_f64)
18            .collect::<Result<Vec<_>, _>>()
19            .map_err(|error| {
20                ReductionError::inexact_float_conversion::<
21                    ClosestVectorProblem<i64>,
22                    ClosestVectorProblem<f64>,
23                >(error)
24            })?;
25        ClosestVectorProblem::new(src.basis().to_vec(), target).map_err(|error| {
26            ReductionError::construction::<ClosestVectorProblem<i64>, ClosestVectorProblem<f64>>(
27                error,
28            )
29        })?
30    }
31);
32
33#[cfg(test)]
34#[path = "../unit_tests/rules/closestvectorproblem_casts.rs"]
35mod tests;