MCPcopy Create free account
hub / github.com/Gecode/gecode / p_global_cardinality

Function p_global_cardinality

gecode/flatzinc/registry.cpp:1011–1045  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1009 }
1010
1011 void p_global_cardinality(FlatZincSpace& s, const ConExpr& ce,
1012 AST::Node* ann) {
1013 IntVarArgs iv0 = s.arg2intvarargs(ce[0]);
1014 IntArgs cover = s.arg2intargs(ce[1]);
1015 IntVarArgs iv1 = s.arg2intvarargs(ce[2]);
1016
1017 Region re;
1018 IntSet cover_s(cover);
1019 IntSetRanges cover_r(cover_s);
1020 IntVarRanges* iv0_ri = re.alloc<IntVarRanges>(iv0.size());
1021 for (int i=iv0.size(); i--;)
1022 iv0_ri[i] = IntVarRanges(iv0[i]);
1023 Iter::Ranges::NaryUnion iv0_r(re,iv0_ri,iv0.size());
1024 Iter::Ranges::Diff<Iter::Ranges::NaryUnion,IntSetRanges>
1025 extra_r(iv0_r,cover_r);
1026 Iter::Ranges::ToValues<Iter::Ranges::Diff<
1027 Iter::Ranges::NaryUnion,IntSetRanges> > extra(extra_r);
1028 for (; extra(); ++extra) {
1029 cover << extra.val();
1030 iv1 << IntVar(s,0,iv0.size());
1031 }
1032 IntPropLevel ipl = s.ann2ipl(ann);
1033 if (ipl==IPL_DEF)
1034 ipl=IPL_BND;
1035 if (ipl==IPL_DOM) {
1036 IntVarArgs allvars = iv0+iv1;
1037 unshare(s, allvars);
1038 count(s, allvars.slice(0,1,iv0.size()),
1039 allvars.slice(iv0.size(),1,iv1.size()),
1040 cover, ipl);
1041 } else {
1042 unshare(s, iv0);
1043 count(s, iv0, iv1, cover, ipl);
1044 }
1045 }
1046
1047 void p_global_cardinality_closed(FlatZincSpace& s, const ConExpr& ce,
1048 AST::Node* ann) {

Callers

nothing calls this directly

Calls 10

IntVarRangesClass · 0.85
unshareFunction · 0.85
arg2intvarargsMethod · 0.80
arg2intargsMethod · 0.80
ann2iplMethod · 0.80
IntVarClass · 0.50
countFunction · 0.50
sizeMethod · 0.45
valMethod · 0.45
sliceMethod · 0.45

Tested by

no test coverage detected