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};

/// Mphs -> Mp -> Mphs
#[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(())
    })
  }
}