Skip to main content

problemreductions/rules/
spinglass_casts.rs

1//! Variant reductions for SpinGlass.
2
3use 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);