Skip to main content

problemreductions/rules/
qubo_casts.rs

1//! Numeric variant reduction for QUBO.
2
3use crate::impl_variant_reduction;
4use crate::models::algebraic::QUBO;
5use crate::rules::ReductionError;
6use crate::types::i64_to_exact_f64;
7
8impl_variant_reduction!(
9    QUBO,
10    <i64> => <f64>,
11    fields: [num_vars, num_quadratic_terms],
12    |src| {
13        let entries = src
14            .entries()
15            .iter()
16            .map(|&(i, j, value)| i64_to_exact_f64(value).map(|value| (i, j, value)))
17            .collect::<Result<Vec<_>, _>>()
18            .map_err(|error| {
19                ReductionError::inexact_float_conversion::<QUBO<i64>, QUBO<f64>>(error)
20            })?;
21        QUBO::from_entries(src.num_vars(), entries)
22            .map_err(ReductionError::construction::<QUBO<i64>, QUBO<f64>>)?
23    }
24);
25
26#[cfg(test)]
27#[path = "../unit_tests/rules/qubo_casts.rs"]
28mod tests;