1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
use crate::{
gp::{GpOperations, GpOrsEvaluators, Mp, MphsDefinitions, MphsOrs},
Cstr,
};
use cl_traits::{Length, Push, Storage};
use mop_common::{SolverFuture, TraitCfg};
#[derive(Debug)]
pub struct MphsMpMphs;
impl<AORS, AOS, ASS, BORS, BOS, D, HC, HCRS, HCS, OR, S, SCRS, SCS, SS>
GpOperations<
MphsDefinitions<D, HCS, AOS, SCS>,
MphsOrs<HCRS, AORS, SCRS, ASS>,
Mp<D, BORS, BOS, SS>,
> for MphsMpMphs
where
AORS: AsMut<[OR]> + Extend<OR> + Length<Output = usize> + Storage<Item = OR> + TraitCfg,
AOS: TraitCfg,
ASS: AsMut<[S]> + Push<Input = S> + Storage<Item = S> + TraitCfg,
BORS: AsRef<[OR]> + Length<Output = usize> + Storage<Item = OR> + TraitCfg,
BOS: TraitCfg,
D: TraitCfg,
HC: Cstr<S> + TraitCfg,
HCRS: AsMut<[usize]> + Extend<usize> + Length<Output = usize> + Storage<Item = usize> + TraitCfg,
HCS: AsRef<[HC]> + Storage<Item = HC> + TraitCfg,
OR: Clone + Default + TraitCfg,
S: Clone + TraitCfg,
SCRS: AsMut<[usize]> + Extend<usize> + Length<Output = usize> + Storage<Item = usize> + TraitCfg,
SCS: AsRef<[HC]> + Storage<Item = HC> + TraitCfg,
SS: AsRef<[S]> + Storage<Item = S> + TraitCfg,
{
type Error = crate::Error;
fn convert(_: &MphsDefinitions<D, HCS, AOS, SCS>) -> Result<Mp<D, BORS, BOS, SS>, Self::Error> {
Err(Self::Error::Other("Unsupported conversion"))
}
fn transfer<'a>(
a_defs: &'a MphsDefinitions<D, HCS, AOS, SCS>,
a_rslts: &'a mut MphsOrs<HCRS, AORS, SCRS, ASS>,
b: &'a Mp<D, BORS, BOS, SS>,
) -> SolverFuture<'a, Self::Error> {
alloc::boxed::Box::pin(async move {
let mut c = a_rslts.constructor();
for rslt in b.rslts().iter() {
let ori = rslt.obj_rslts().iter().cloned().rev().skip(1).rev();
let s = (*rslt.solution()).clone();
c = c.or_os_iter(ori, s);
}
GpOrsEvaluators::eval_hard_cstrs_violations(a_defs, a_rslts).await;
GpOrsEvaluators::eval_soft_cstrs_violations(a_defs, a_rslts).await;
Ok(())
})
}
}