WCNF Formula
- class optilog.formulas.WCNF(var_manager=None)
 Creates an in-memory representation of a WCNF (Weighted Conjunctive Normal Form) formula.
- hard_clauses: List[List[int]]
 The list of all hard clauses in the formula.
- soft_clauses: List[Tuple[int, List[int]]]
 The list of all soft clauses in the formula.
- sum_soft_weights()
 - Return type
 Union[int,float]- Returns
 The sum of all soft weights.
- num_clauses()
 - Return type
 int- Returns
 The number of clauses (soft and hard) in the formula.
- top_weight()
 - Return type
 Union[int,float]- Returns
 The weight for hard clauses =
WCNF.sum_soft_weights + 1.
- feasible(model)
 Checks if a given assignment satisfies the hard constraints of a WCNF formula.
- Parameters
 assignment – A (possibly partial) assignment for the WCNF formula.
- Return type
 Optional[bool]- Returns
 True/False (if the assignment satisfies or not) or None if some hard clause is undefined (notice that the assignment can be partial).
>>> wcnf = WCNF() >>> wcnf.add_clauses([[1,2,3],[-1,-2],[-1,-3],[-2,-3]]) >>> wcnf.add_clauses([[-1], [-2]], weight=1) >>> wcnf.feasible([-1,2,3]) >>> False >>> wcnf.feasible([-1,-2,3]) >>> True >>> wcnf = WCNF() >>> wcnf.add_clauses([[1,2,3], [-1,-2]]) >>> wcnf.add_clauses([[-1]], weight=1) >>> wcnf.feasible([3]) >>> None
- copy()
 Makes a deep copy of the formula object and returns it. Note that these two objects do not share any information after the copy has been done.
- Return type
 - Returns
 A copy of the WCNF formula.
- add_clauses(clauses, weight=0)
 Adds a set of clauses of same weight to the WCNF formula. Extends variables if necessary.
- Parameters
 clause – The clause to be added to the formula.
weight (
int) – If a weight is provided, the clause is considered as a soft clause. Notice that weights are always positive. If no weight is provided orweight = WCNF.INF_WEIGHT, the clause is considered as a hard clause.
>>> wcnf = WCNF() >>> wcnf.add_clauses([[-1],[-2],[-3]], 1) >>> wcnf.add_clauses([[1,2],[2,3]]) >>> print(wcnf) p wcnf 3 5 4 c ===== Hard Clauses ===== 4 1 2 0 4 2 3 0 c ===== Soft Clauses (Sum weights: 3) ===== 1 -1 0 1 -2 0 1 -3 0
- add_clause(clause, weight=0)
 Adds a new clause to the WCNF formula. Extends variables if necessary.
- Parameters
 clause (
List[int]) – The clause to be added to the formula.weight (
int) – If a weight is provided, the clause is considered as a soft clause. Notice that weights are always positive. If no weight is provided orweight = WCNF.INF_WEIGHT, the clause is considered as a hard clause.
>>> wcnf = WCNF() >>> wcnf.add_clause([1,2,3]) >>> wcnf.add_clause([1], 1) >>> wcnf.add_clause([2], 1) >>> wcnf.add_clause([3], 1) >>> print(wcnf) p wcnf 3 4 4 c ===== Hard Clauses ===== 4 1 2 3 0 c ===== Soft Clauses (Sum weights: 3) ===== 1 1 0 1 2 0 1 3 0
- cost(assignment, inverse=False)
 - Parameters
 assignment (
List[int]) – A (possibly partial) assignment for the WCNF formula.inverse (
bool) – Inverse parameter.
- Return type
 Union[int,float]- Returns
 Returns the aggregated weight of soft clauses violated or undefined by the assignment. If
inverseparameter is True, returns the aggregated weight of the soft clauses satisfied by the assignment.
>>> wcnf = WCNF() >>> wcnf.add_clause([1,2,3]) >>> wcnf.add_clauses([[-1],[-2],[-3]], 1) >>> wcnf.cost([1,2]) 3 >>> wcnf.cost([1,2], inverse=True) 0 >>> wcnf.cost([1,-2]) 2 >>> wcnf.cost([1,-2], inverse=True) 1
- write_dimacs(stream=<_io.TextIOWrapper name='<stdout>' mode='w' encoding='utf-8'>, format='classic')
 Prints to the given stream the formula into DIMACS format.
- Parameters
 stream (
IO) – The stream where to print the formula.format – The wcnf format to output. Options are “classic” or “simplified”
- write_dimacs_file(file_path, format='classic')
 Writes to the given file path the formula into DIMACS format.
- Parameters
 file_path (
str) – The file path where to write the formula.format – The wcnf format to output. Options are “classic” or “simplified”
- Return type
 None
>>> cnf.write_dimacs_file('example')
- shuffle(vars=True, soft_clauses=True, hard_clauses=True, literals=True, polarity=True, seed=None)
 Shuffles the variables, clauses, literals and polarity of the formula. This may be used to test the performance of encodings on a formula.
- Parameters
 vars (
bool) – Whether to shuffle the variables of the formula.soft_clauses (
bool) – Whether to shuffle the order of the soft_clauses of the formula.hard_clauses (
bool) – Whether to shuffle the order of the hard_clauses of the formula.literals (
bool) – Whether to shuffle the order of the literals of the clauses.polarity (
bool) – Whether to shuffle the order of the polarity of the variables.seed (
Optional[int]) – Optional seed for the shuffle
- Return type
 None
>>> w = WCNF() >>> w.add_clause([4,2,5]) >>> w.add_clause([4,5]) >>> w.add_clause([4,-2,3], weight=3) >>> w.add_clause([4,-2,5], weight=5) >>> w.hard_clauses [[4, 2, 5], [4, 5]] >>> w.soft_clauses [(3, [4, -2, 3]), (5, [4, -2, 5])] >>> w.shuffle() >>> w.hard_clauses [[1, 4, 5], [1, 5]] >>> w.soft_clauses [(5, [1, -4, 5]), (3, [1, -4, 2])]
- add_comment(comment)
 Adds a comment to the header of the formula. These comments will be displayed in the DIMACS format with the character
cprepended, hence the DIMACS parser will ignore them.- Parameters
 comment (
Union[str,List[str]]) – Comment to append to the header.- Return type
 None
>>> form.add_comment('a simple test formula')
- extend_vars(how_many)
 Creates a set of variables at once.
- Parameters
 how_many (
int) – The number of variables to be created.- Return type
 None
- header()
 - Return type
 List[str]- Returns
 A list of strings representing comments on the formula.
- max_var()
 - Return type
 int- Returns
 The maximum DIMACS variable id in the formula.
- new_var()
 Creates a new variable and returns its DIMACS id. The returned value will be
max_var() + 1.- Return type
 int- Returns
 The newly created variable.
- set_minimum_vars(minimum)
 Creates a set of variables at once if the passed minimum number is bigger than the existing one.
- Parameters
 minimum – The minimum number of variables this formula should have.
- var_manager: VarManager
 This attribute allows formulas to share the same pool of variables. This can be used to represent a single problem with multiple partial formulas. See the reference documentation on the VarManager section for more information.
- class optilog.formulas.WCNFException
 Invalid WCNF operation.
An instance of VarManager can be provided though the parameter var_manager. This allows formulas to share the same pool of variables.
 1>>> from optilog.formulas import WCNF
 2>>> wcnf = WCNF()
 3>>> wcnf.extend_vars(2)
 4>>> wcnf.max_var()
 52
 6>>> wcnf.new_var()
 73
 8>>> wcnf.max_var()
 93
10>>> wcnf.add_clause([1,2,3])
11>>> wcnf.add_clauses([[1],[2],[3]], 1)
12>>> wcnf.num_clauses()
134
14>>> wcnf.soft_clauses
15[(1, [1]), (1, [2]), (1, [3])]
16>>> wcnf.hard_clauses
17[1,2,3]
18>>> wcnf.sum_soft_weights()
193
20>>> wcnf.top_weight()
214
22>>> wcnf.add_comment('a simple WCNF test formula')
23>>> wcnf.header()
24['a simple WCNF test formula']
25>>> wcnf2 = wcnf.copy()
26>>> wcnf2.soft_clauses, wcnf.hard_clauses
27([(1, [1]), (1, [2]), (1, [3])], [[1, 2, 3]])
28>>> wcnf2 = WCNF()
29>>> wcnf2.max_var()
300
31>>> wcnf2.soft_clauses, wcnf2.hard_clauses
32([], [])
Methods sumary
Return type  | 
Methods  | 
|---|---|
int  | 
|
int  | 
|
list(str)  | 
|
int  | 
|
int or float  | 
|
None  | 
|
None  | 
|
None  | 
|
None  | 
|
bool or None  | 
|
int or float  | 
|
None  | 
|
None  | 
|
None  | 
|
None  | 
|
WCNF  | 
|
str  | 
  | 
str  | 
  |