problemreductions/rules/
spinglass_casts.rs1use crate::impl_variant_reduction;
4use crate::models::graph::SpinGlass;
5use crate::rules::ReductionError;
6use crate::topology::SimpleGraph;
7use crate::types::i64_to_exact_f64;
8
9impl_variant_reduction!(
10 SpinGlass,
11 <SimpleGraph, i64> => <SimpleGraph, f64>,
12 fields: [num_spins, num_interactions],
13 |src| {
14 let convert = |values: &[i64]| {
15 values
16 .iter()
17 .copied()
18 .map(i64_to_exact_f64)
19 .collect::<Result<Vec<_>, _>>()
20 .map_err(|error| {
21 ReductionError::inexact_float_conversion::<
22 SpinGlass<SimpleGraph, i64>,
23 SpinGlass<SimpleGraph, f64>,
24 >(error)
25 })
26 };
27 SpinGlass::from_graph(
28 src.graph().clone(),
29 convert(src.couplings())?,
30 convert(src.fields())?,
31 )
32 .map_err(|message| {
33 ReductionError::construction::<
34 SpinGlass<SimpleGraph, i64>,
35 SpinGlass<SimpleGraph, f64>,
36 >(message)
37 })?
38 }
39);