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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
use crate::{
random::{
arbitrary_constraints, arbitrary_decision_variables, arbitrary_parameters,
arbitrary_split_ids, InstanceParameters,
},
v1::{
instance::{Description, Sense},
Function, ParametricInstance,
},
Evaluate,
};
use proptest::prelude::*;
impl Arbitrary for ParametricInstance {
type Parameters = InstanceParameters;
type Strategy = BoxedStrategy<Self>;
fn arbitrary_with(p: Self::Parameters) -> Self::Strategy {
p.validate().unwrap();
let InstanceParameters {
num_constraints,
objective,
constraint,
kinds,
} = p;
(
Function::arbitrary_with(objective),
arbitrary_constraints(num_constraints, constraint),
Just(kinds),
)
.prop_flat_map(|(objective, constraints, kinds)| {
let mut used_ids = objective.required_ids();
for c in &constraints {
used_ids.extend(c.function().required_ids());
}
(
Just(objective),
Just(constraints),
arbitrary_split_ids(used_ids),
)
.prop_flat_map(
move |(objective, constraints, (decision_variable_ids, parameter_ids))| {
(
Just(objective),
Just(constraints),
arbitrary_decision_variables(decision_variable_ids, kinds.clone()),
arbitrary_parameters(parameter_ids),
Option::<Description>::arbitrary(),
Sense::arbitrary(),
)
.prop_map(
|(
objective,
constraints,
decision_variables,
parameters,
description,
sense,
)| {
ParametricInstance {
objective: Some(objective),
constraints,
decision_variables,
description,
sense: sense as i32,
parameters,
..Default::default()
}
},
)
},
)
})
.boxed()
}
fn arbitrary() -> Self::Strategy {
Self::Parameters::default()
.smaller()
.prop_flat_map(Self::arbitrary_with)
.boxed()
}
}