Skip to content

Commit e04f8ea

Browse files
committed
Merge pull request anfelbar#4 from carealejo/css
Css: Gecode::branch builtin
2 parents 8fa82cc + fb3469d commit e04f8ea

File tree

3 files changed

+120
-4
lines changed

3 files changed

+120
-4
lines changed

vm/main/coreatoms-decl.hh

+34
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,40 @@ struct CoreAtoms {
102102
atom_t icl_dom;
103103
atom_t icl_def;
104104

105+
// Integer IntVarBranch types
106+
atom_t int_var_none;
107+
atom_t int_var_rnd;
108+
atom_t int_var_degree_min;
109+
atom_t int_var_degree_max;
110+
atom_t int_var_afc_min;
111+
atom_t int_var_min_min;
112+
atom_t int_var_min_max;
113+
atom_t int_var_max_min;
114+
atom_t int_var_max_max;
115+
atom_t int_var_size_min;
116+
atom_t int_var_size_max;
117+
atom_t int_var_size_degree_min;
118+
atom_t int_var_size_degree_max;
119+
atom_t int_var_size_afc_min;
120+
atom_t int_var_size_afc_max;
121+
atom_t int_var_regret_min_min;
122+
atom_t int_var_regret_min_max;
123+
atom_t int_var_regret_max_min;
124+
atom_t int_var_regret_max_max;
125+
126+
// Integer IntValBranch types
127+
atom_t int_val_min;
128+
atom_t int_val_med;
129+
atom_t int_val_max;
130+
atom_t int_val_rad;
131+
atom_t int_val_split_min;
132+
atom_t int_val_split_max;
133+
atom_t int_val_range_min;
134+
atom_t int_val_range_max;
135+
atom_t int_values_min;
136+
atom_t int_values_max;
137+
138+
105139
};
106140

107141
}

vm/main/coreatoms.hh

+32
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,38 @@ void CoreAtoms::initialize(VM vm, AtomTable& atomTable) {
8686
icl_bnd = atomTable.get(vm, MOZART_STR("ICL_BND"));
8787
icl_dom = atomTable.get(vm, MOZART_STR("ICL_DOM"));
8888
icl_def = atomTable.get(vm, MOZART_STR("ICL_DEF"));
89+
90+
int_var_none = atomTable.get(vm, MOZART_STR("INT_VAR_NONE"));
91+
int_var_rnd = atomTable.get(vm, MOZART_STR("INT_VAR_RND"));
92+
int_var_degree_min = atomTable.get(vm, MOZART_STR("INT_VAR_DEGREE_MIN"));
93+
int_var_degree_max = atomTable.get(vm, MOZART_STR("INT_VAR_DEGREE_MAX"));
94+
int_var_afc_min = atomTable.get(vm, MOZART_STR("INT_VAR_AFC_MIN"));
95+
int_var_min_min = atomTable.get(vm, MOZART_STR("INT_VAR_MIN_MIN"));
96+
int_var_min_max = atomTable.get(vm, MOZART_STR("INT_VAR_MIN_MAX"));
97+
int_var_max_min = atomTable.get(vm, MOZART_STR("INT_VAR_MAX_MIN"));
98+
int_var_max_max = atomTable.get(vm, MOZART_STR("INT_VAR_MAX_MAX"));
99+
int_var_size_min = atomTable.get(vm, MOZART_STR("INT_VAR_SIZE_MIN"));
100+
int_var_size_max = atomTable.get(vm, MOZART_STR("INT_VAR_SIZE_MAX"));
101+
int_var_size_degree_min = atomTable.get(vm, MOZART_STR("INT_VAR_SIZE_DEGREE_MIN"));
102+
int_var_size_degree_max = atomTable.get(vm, MOZART_STR("INT_VAR_SIZE_DEGREE_MAX"));
103+
int_var_size_afc_min = atomTable.get(vm, MOZART_STR("INT_VAR_SIZE_AFC_MIN"));
104+
int_var_size_afc_max = atomTable.get(vm, MOZART_STR("INT_VAR_SIZE_AFC_MAX"));
105+
int_var_regret_min_min = atomTable.get(vm, MOZART_STR("INT_VAR_REGRET_MIN_MIN"));
106+
int_var_regret_min_max = atomTable.get(vm, MOZART_STR("INT_VAR_REGRET_MIN_MAX"));
107+
int_var_regret_max_min = atomTable.get(vm, MOZART_STR("INT_VAR_REGRET_MAX_MIN"));
108+
int_var_regret_max_max = atomTable.get(vm, MOZART_STR("INT_VAR_REGRET_MAX_MAX"));
109+
110+
int_val_min = atomTable.get(vm, MOZART_STR("INT_VAL_MIN"));
111+
int_val_med = atomTable.get(vm, MOZART_STR("INT_VAL_MED"));
112+
int_val_max = atomTable.get(vm, MOZART_STR("INT_VAL_MAX"));
113+
int_val_rad = atomTable.get(vm, MOZART_STR("INT_VAL_RND"));
114+
int_val_split_min = atomTable.get(vm, MOZART_STR("INT_VAL_SPLIT_MIN"));
115+
int_val_split_max = atomTable.get(vm, MOZART_STR("INT_VAL_SPLIT_MAX"));
116+
int_val_range_min = atomTable.get(vm, MOZART_STR("INT_VAL_RANGE_MIN"));
117+
int_val_range_max = atomTable.get(vm, MOZART_STR("INT_VAL_RANGE_MAX"));
118+
int_values_min = atomTable.get(vm, MOZART_STR("INT_VALUES_MIN"));
119+
int_values_max = atomTable.get(vm, MOZART_STR("INT_VALUES_MAX"));
120+
89121
}
90122

91123
}

vm/main/modules/modpropagators.hh

+54-4
Original file line numberDiff line numberDiff line change
@@ -37,24 +37,62 @@ public:
3737
raiseTypeError(vm,MOZART_STR("InvalidIntegerConsistencyLevel"),l);
3838
return Gecode::ICL_DEF;
3939
}
40+
41+
static Gecode::IntVarBranch atomToIntVarBranch(VM vm, In bvar){
42+
atom_t a = getArgument<atom_t>(vm,bvar,MOZART_STR("Atom"));
43+
if (a == vm->coreatoms.int_var_none) return Gecode::INT_VAR_NONE;
44+
if (a == vm->coreatoms.int_var_rnd) return Gecode::INT_VAR_RND;
45+
if (a == vm->coreatoms.int_var_degree_min) return Gecode::INT_VAR_DEGREE_MIN;
46+
if (a == vm->coreatoms.int_var_degree_max) return Gecode::INT_VAR_DEGREE_MAX;
47+
if (a == vm->coreatoms.int_var_afc_min) return Gecode::INT_VAR_AFC_MIN;
48+
if (a == vm->coreatoms.int_var_min_min) return Gecode::INT_VAR_MIN_MIN;
49+
if (a == vm->coreatoms.int_var_min_max) return Gecode::INT_VAR_MIN_MAX;
50+
if (a == vm->coreatoms.int_var_max_min) return Gecode::INT_VAR_MAX_MIN;
51+
if (a == vm->coreatoms.int_var_max_max) return Gecode::INT_VAR_MAX_MAX;
52+
if (a == vm->coreatoms.int_var_size_min) return Gecode::INT_VAR_SIZE_MIN;
53+
if (a == vm->coreatoms.int_var_size_max) return Gecode::INT_VAR_SIZE_MAX;
54+
if (a == vm->coreatoms.int_var_size_degree_min) return Gecode::INT_VAR_SIZE_DEGREE_MIN;
55+
if (a == vm->coreatoms.int_var_size_degree_max) return Gecode::INT_VAR_SIZE_DEGREE_MAX;
56+
if (a == vm->coreatoms.int_var_size_afc_min) return Gecode::INT_VAR_SIZE_AFC_MIN;
57+
if (a == vm->coreatoms.int_var_size_afc_max) return Gecode::INT_VAR_SIZE_AFC_MAX;
58+
if (a == vm->coreatoms.int_var_regret_min_min) return Gecode::INT_VAR_REGRET_MIN_MIN;
59+
if (a == vm->coreatoms.int_var_regret_min_max) return Gecode::INT_VAR_REGRET_MIN_MAX;
60+
if (a == vm->coreatoms.int_var_regret_max_min) return Gecode::INT_VAR_REGRET_MAX_MIN;
61+
if (a == vm->coreatoms.int_var_regret_max_max) return Gecode::INT_VAR_REGRET_MAX_MAX;
62+
raiseTypeError(vm,MOZART_STR("InvalidIntegerBranchType"),bvar);
63+
return Gecode::INT_VAR_NONE;
64+
}
65+
66+
static Gecode::IntValBranch atomToIntValBranch(VM vm, In bval){
67+
atom_t a = getArgument<atom_t>(vm,bval,MOZART_STR("Atom"));
68+
if (a == vm->coreatoms.int_val_min) return Gecode::INT_VAL_MIN;
69+
if (a == vm->coreatoms.int_val_med) return Gecode::INT_VAL_MED;
70+
if (a == vm->coreatoms.int_val_max) return Gecode::INT_VAL_MAX;
71+
if (a == vm->coreatoms.int_val_rad) return Gecode::INT_VAL_RND;
72+
if (a == vm->coreatoms.int_val_split_min) return Gecode::INT_VAL_SPLIT_MIN;
73+
if (a == vm->coreatoms.int_val_split_max) return Gecode::INT_VAL_SPLIT_MAX;
74+
if (a == vm->coreatoms.int_val_range_min) return Gecode::INT_VAL_RANGE_MIN;
75+
if (a == vm->coreatoms.int_val_range_max) return Gecode::INT_VAL_RANGE_MAX;
76+
if (a == vm->coreatoms.int_values_min) return Gecode::INT_VALUES_MIN;
77+
if (a == vm->coreatoms.int_values_max) return Gecode::INT_VALUES_MAX;
78+
raiseTypeError(vm,MOZART_STR("InvalidIntegerBranchType"),bval);
79+
return Gecode::INT_VAL_MIN;
80+
}
4081

4182
static Gecode::IntVarArgs getIntVarArgs(VM vm, In x){
4283
size_t width;
4384

4485
if(x.is<Tuple>()){
4586
width = x.as<Tuple>().getWidth();
4687
Gecode::IntVarArgs v(width);
47-
std::cout << "Is tuple" << width << std::endl;
88+
//std::cout << "Is tuple" << width << std::endl;
4889
for(int i=0; i<width; i++){
4990
StableNode* t=x.as<Tuple>().getElement(i);
5091
UnstableNode a = Reference::build(vm, t);
5192
RichNode tt = a;
5293
assert(tt.is<CstIntVar>());
5394
v[i] = IntVarLike(tt.as<CstIntVar>()).intVar(vm);
5495
}
55-
for(int i=0; i<width; i++){
56-
std::cout << v[i].min() << std::endl;
57-
}
5896
return v;
5997
}else if(x.is<Cons>()){
6098
std::cout << "Args is Cons" << std::endl;
@@ -91,6 +129,18 @@ public:
91129
}
92130
};
93131

132+
class Branch: public Builtin<Branch> {
133+
public:
134+
Branch(): Builtin("branch") {}
135+
static void call(VM vm, In x, In bvar, In bval) {
136+
assert(vm->getCurrentSpace()->hasConstraintSpace());
137+
GecodeSpace& home = vm->getCurrentSpace()->getCstSpace();
138+
Gecode::IntVarBranch bvart = atomToIntVarBranch(vm,bvar);
139+
Gecode::IntValBranch bvalt = atomToIntValBranch(vm,bval);
140+
Gecode::branch(home,getIntVarArgs(vm,x),bvart,bvalt);
141+
}
142+
};
143+
94144
}; // class ModIntVarProp
95145
} // namespace builtins
96146
} // namespace mozart

0 commit comments

Comments
 (0)