Probability backdoors search example for SGEN150

An example of probabilistic backdoors searching to solve a difficult variant of the Boolean satisfiability problem, using the example of unsatisfiable SGEN150 encoding.

 1from os import cpu_count
 2from typing import List
 3
 4# algorithm module imports
 5from algorithm.impl import Elitism
 6from algorithm.module.mutation import Doer
 7from algorithm.module.crossover import TwoPoint
 8from algorithm.module.selection import Roulette
 9
10# function module imports
11from function.impl import RhoFunction
12from function.module.measure import Propagations
13
14# satprob lib imports
15from lib_satprob.encoding import CNF
16from lib_satprob.variables import Range
17from lib_satprob.solver import PySatSolver
18from lib_satprob.problem import SatProblem
19
20# space module imports
21from space.impl import BackdoorSet
22
23# core module imports
24from core.impl import Optimize
25from core.model.point import Point
26from core.module.sampling import Const
27from core.module.limitation import WallTime
28from core.module.comparator import MinValueMaxSize
29
30# other imports
31from util.work_path import WorkPath
32from output.impl import OptimizeLogger
33from executor.impl import ProcessExecutor
34
35
36def run_sgen_150_search() -> List[Point]:
37    algorithm = Elitism(
38        elites_count=2,
39        population_size=6,
40        mutation=Doer(),
41        crossover=TwoPoint(),
42        selection=Roulette(),
43        min_update_size=6
44    )
45    limitation = WallTime(
46        from_string='04:00:00'
47    )
48
49    function = RhoFunction(
50        penalty_power=2 ** 10,
51        measure=Propagations(),
52    )
53    sampling = Const(
54        size=1024, split_into=256
55    )
56
57    root_path = WorkPath('examples')
58    data_path = root_path.to_path('data')
59    cnf_file = data_path.to_file('sgen_150.cnf')
60
61    problem = SatProblem(
62        encoding=CNF(from_file=cnf_file),
63        solver=PySatSolver(sat_name='g3'),
64    )  # read from file './examples/data/sgen_150.cnf
65
66    space = BackdoorSet(
67        by_vector=[],
68        variables=Range(length=150)
69    )  # for search space of 150 “off” vars
70
71    workers = min(cpu_count(), 16)
72    executor = ProcessExecutor(
73        max_workers=workers
74    )
75    print(f'Running on {workers} threads')
76
77    # log process to dir './examples/logs/<date_date>
78    logs_path = root_path.to_path('logs', 'sgen150')
79    return Optimize(
80        space=space,
81        problem=problem,
82        executor=executor,
83        sampling=sampling,
84        function=function,
85        algorithm=algorithm,
86        limitation=limitation,
87        comparator=MinValueMaxSize(),
88        logger=OptimizeLogger(logs_path),
89    ).launch()
90
91
92__all__ = [
93    'run_sgen_150_search'
94]
Other examples: