| 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) { |
nothing calls this directly
no test coverage detected