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 package org.sat4j.pb.constraints.pb;
29
30 import java.math.BigInteger;
31
32 import org.sat4j.minisat.constraints.card.AtLeast;
33 import org.sat4j.minisat.constraints.card.Cards;
34 import org.sat4j.minisat.core.ILits;
35 import org.sat4j.minisat.core.UnitPropagationListener;
36 import org.sat4j.specs.ContradictionException;
37 import org.sat4j.specs.IVecInt;
38
39 public class AtLeastPB extends AtLeast implements PBConstr {
40
41
42
43
44 private static final long serialVersionUID = 1L;
45
46 private final BigInteger degree;
47
48 private AtLeastPB(ILits voc, IVecInt ps, int degree) {
49 super(voc, ps, degree);
50 this.degree = BigInteger.valueOf(degree);
51 }
52
53 public static AtLeastPB atLeastNew(UnitPropagationListener s, ILits voc,
54 IVecInt ps, int n) throws ContradictionException {
55 int degree = Cards.niceParameters(s, voc, ps, n);
56 if (degree == 0)
57 return null;
58 return new AtLeastPB(voc, ps, degree);
59 }
60
61 public static AtLeastPB atLeastNew(ILits voc, IVecInt ps, int n) {
62 return new AtLeastPB(voc, ps, n);
63 }
64
65 public BigInteger getCoef(int literal) {
66 return BigInteger.ONE;
67 }
68
69 public BigInteger getDegree() {
70 return degree;
71 }
72
73 public ILits getVocabulary() {
74 return voc;
75 }
76
77 public int[] getLits() {
78 int[] tmp = new int[size()];
79 System.arraycopy(lits, 0, tmp, 0, size());
80 return tmp;
81 }
82
83 public BigInteger[] getCoefs() {
84 BigInteger[] tmp = new BigInteger[size()];
85 for (int i = 0; i < tmp.length; i++)
86 tmp[i] = BigInteger.ONE;
87 return tmp;
88 }
89
90
91
92
93 private boolean learnt = false;
94
95
96
97
98
99
100
101 @Override
102 public boolean learnt() {
103 return learnt;
104 }
105
106 @Override
107 public void setLearnt() {
108 learnt = true;
109 }
110
111 @Override
112 public void register() {
113 assert learnt;
114
115 }
116
117 @Override
118 public void assertConstraint(UnitPropagationListener s) {
119 for (int i = 0; i < size(); i++) {
120 if (getVocabulary().isUnassigned(get(i))) {
121 boolean ret = s.enqueue(get(i), this);
122 assert ret;
123 }
124 }
125 }
126
127 public IVecInt computeAnImpliedClause() {
128 return null;
129 }
130
131 }