NUCS 2.2.0__tar.gz → 2.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {nucs-2.2.0 → nucs-2.3.0/NUCS.egg-info}/PKG-INFO +16 -16
- {nucs-2.2.0 → nucs-2.3.0}/NUCS.egg-info/SOURCES.txt +0 -1
- {nucs-2.2.0/NUCS.egg-info → nucs-2.3.0}/PKG-INFO +16 -16
- {nucs-2.2.0 → nucs-2.3.0}/README.md +15 -15
- {nucs-2.2.0 → nucs-2.3.0}/docs/source/conf.py +2 -2
- {nucs-2.2.0 → nucs-2.3.0}/nucs/constants.py +31 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/examples/alpha/__main__.py +2 -3
- {nucs-2.2.0 → nucs-2.3.0}/nucs/examples/bibd/__main__.py +2 -3
- {nucs-2.2.0 → nucs-2.3.0}/nucs/examples/donald/__main__.py +2 -3
- {nucs-2.2.0 → nucs-2.3.0}/nucs/examples/golomb/__main__.py +2 -3
- {nucs-2.2.0 → nucs-2.3.0}/nucs/examples/knapsack/__main__.py +2 -3
- {nucs-2.2.0 → nucs-2.3.0}/nucs/examples/magic_sequence/__main__.py +2 -3
- {nucs-2.2.0 → nucs-2.3.0}/nucs/examples/magic_square/__main__.py +2 -3
- {nucs-2.2.0 → nucs-2.3.0}/nucs/examples/quasigroup/__main__.py +2 -3
- {nucs-2.2.0 → nucs-2.3.0}/nucs/examples/queens/__main__.py +2 -3
- {nucs-2.2.0 → nucs-2.3.0}/nucs/examples/schur_lemma/__main__.py +2 -3
- {nucs-2.2.0 → nucs-2.3.0}/nucs/examples/sports_tournament_scheduling/__main__.py +2 -3
- {nucs-2.2.0 → nucs-2.3.0}/nucs/solvers/backtrack_solver.py +64 -29
- {nucs-2.2.0 → nucs-2.3.0}/nucs/solvers/bound_consistency_algorithm.py +6 -8
- {nucs-2.2.0 → nucs-2.3.0}/nucs/solvers/choice_points.py +1 -1
- {nucs-2.2.0 → nucs-2.3.0}/nucs/solvers/multiprocessing_solver.py +59 -4
- {nucs-2.2.0 → nucs-2.3.0}/nucs/solvers/shaving_consistency_algorithm.py +14 -9
- {nucs-2.2.0 → nucs-2.3.0}/nucs/solvers/solver.py +9 -1
- {nucs-2.2.0 → nucs-2.3.0}/pyproject.toml +1 -1
- {nucs-2.2.0 → nucs-2.3.0}/tests/examples/test_alpha.py +1 -1
- {nucs-2.2.0 → nucs-2.3.0}/tests/examples/test_bibd.py +1 -1
- {nucs-2.2.0 → nucs-2.3.0}/tests/examples/test_donald.py +1 -1
- {nucs-2.2.0 → nucs-2.3.0}/tests/examples/test_latin_square.py +1 -1
- {nucs-2.2.0 → nucs-2.3.0}/tests/examples/test_magic_sequence.py +1 -1
- {nucs-2.2.0 → nucs-2.3.0}/tests/examples/test_magic_square.py +1 -1
- {nucs-2.2.0 → nucs-2.3.0}/tests/examples/test_quasigroup.py +1 -1
- {nucs-2.2.0 → nucs-2.3.0}/tests/examples/test_queens.py +1 -1
- {nucs-2.2.0 → nucs-2.3.0}/tests/examples/test_schur_lemma.py +1 -1
- {nucs-2.2.0 → nucs-2.3.0}/tests/examples/test_sudokus.py +1 -1
- {nucs-2.2.0 → nucs-2.3.0}/tests/propagators/test_lexicographic_leq.py +1 -2
- {nucs-2.2.0 → nucs-2.3.0}/tests/solvers/test_backtrack_solver.py +11 -12
- {nucs-2.2.0 → nucs-2.3.0}/tests/solvers/test_multiprocessing_solver.py +9 -5
- nucs-2.2.0/nucs/statistics.py +0 -104
- {nucs-2.2.0 → nucs-2.3.0}/LICENSE.md +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/NUCS.egg-info/dependency_links.txt +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/NUCS.egg-info/requires.txt +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/NUCS.egg-info/top_level.txt +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/__init__.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/examples/__init__.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/examples/alpha/__init__.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/examples/alpha/alpha_problem.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/examples/bibd/__init__.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/examples/bibd/bibd_problem.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/examples/donald/__init__.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/examples/donald/donald_problem.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/examples/golomb/__init__.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/examples/golomb/golomb_problem.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/examples/knapsack/__init__.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/examples/knapsack/knapsack_problem.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/examples/magic_sequence/__init__.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/examples/magic_sequence/magic_sequence_problem.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/examples/magic_square/__init__.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/examples/magic_square/magic_square_problem.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/examples/quasigroup/__init__.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/examples/quasigroup/quasigroup_problem.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/examples/queens/__init__.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/examples/queens/queens_problem.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/examples/schur_lemma/__init__.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/examples/schur_lemma/schur_lemma_problem.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/examples/sports_tournament_scheduling/__init__.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/examples/sports_tournament_scheduling/sports_tournament_scheduling_problem.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/examples/sudoku/__init__.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/examples/sudoku/sudoku_problem.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/numba_helper.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/numpy_helper.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/problems/__init__.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/problems/latin_square_problem.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/problems/problem.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/propagators/__init__.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/propagators/affine_eq_propagator.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/propagators/affine_geq_propagator.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/propagators/affine_leq_propagator.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/propagators/alldifferent_propagator.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/propagators/and_propagator.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/propagators/count_eq_propagator.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/propagators/dummy_propagator.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/propagators/element_lic_propagator.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/propagators/element_liv_propagator.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/propagators/exactly_eq_propagator.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/propagators/exactly_true_propagator.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/propagators/gcc_propagator.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/propagators/lexicographic_leq_propagator.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/propagators/max_eq_propagator.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/propagators/max_leq_propagator.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/propagators/min_eq_propagator.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/propagators/min_geq_propagator.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/propagators/propagators.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/propagators/relation_propagator.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/solvers/__init__.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/solvers/consistency_algorithms.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/nucs/solvers/heuristics.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/setup.cfg +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/tests/__init__.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/tests/examples/test_golomb.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/tests/examples/test_knapsack.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/tests/examples/test_sports_tournament_scheduling.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/tests/problems/__init__.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/tests/problems/test_problem.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/tests/propagators/__init__.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/tests/propagators/test_affine_eq.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/tests/propagators/test_affine_geq.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/tests/propagators/test_affine_leq.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/tests/propagators/test_alldifferent.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/tests/propagators/test_count_eq.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/tests/propagators/test_element_lic.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/tests/propagators/test_element_liv.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/tests/propagators/test_exactly_eq.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/tests/propagators/test_gcc.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/tests/propagators/test_max_eq.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/tests/propagators/test_max_leq.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/tests/propagators/test_min_eq.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/tests/propagators/test_min_geq.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/tests/propagators/test_relation.py +0 -0
- {nucs-2.2.0 → nucs-2.3.0}/tests/solvers/__init__.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: NUCS
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.3.0
|
|
4
4
|
Summary: A Numpy and Numba based Python library for solving Constraint Satisfaction Problems over finite domains
|
|
5
5
|
Author-email: Yan Georget <yan.georget@gmail.com>
|
|
6
6
|
Project-URL: Homepage, https://github.com/yangeorget/nucs
|
|
@@ -60,11 +60,11 @@ NUMBA_CACHE_DIR=.numba/cache python -m nucs.examples.queens -n 12 --log_level=IN
|
|
|
60
60
|
2024-11-12 17:24:49,061 - INFO - nucs.solvers.backtrack_solver - Choice points stack has a maximal height of 128
|
|
61
61
|
2024-11-12 17:24:49,200 - INFO - nucs.solvers.multiprocessing_solver - MultiprocessingSolver has 1 processors
|
|
62
62
|
{
|
|
63
|
-
'
|
|
64
|
-
'
|
|
65
|
-
'
|
|
66
|
-
'
|
|
67
|
-
'
|
|
63
|
+
'ALG_BC_NB': 262011,
|
|
64
|
+
'ALG_BC_WITH_SHAVING_NB': 0,
|
|
65
|
+
'ALG_SHAVING_NB': 0,
|
|
66
|
+
'ALG_SHAVING_CHANGE_NB': 0,
|
|
67
|
+
'ALG_SHAVING_NO_CHANGE_NB': 0,
|
|
68
68
|
'PROPAGATOR_ENTAILMENT_NB': 0,
|
|
69
69
|
'PROPAGATOR_FILTER_NB': 2269980,
|
|
70
70
|
'PROPAGATOR_FILTER_NO_CHANGE_NB': 990450,
|
|
@@ -88,11 +88,11 @@ NUMBA_CACHE_DIR=.numba/cache python -m nucs.examples.bibd -v 8 -b 14 -r 7 -k 4 -
|
|
|
88
88
|
2024-11-12 17:26:39,734 - INFO - nucs.solvers.backtrack_solver - BacktrackSolver uses consistency algorithm 0
|
|
89
89
|
2024-11-12 17:26:39,734 - INFO - nucs.solvers.backtrack_solver - Choice points stack has a maximal height of 128
|
|
90
90
|
{
|
|
91
|
-
'
|
|
92
|
-
'
|
|
93
|
-
'
|
|
94
|
-
'
|
|
95
|
-
'
|
|
91
|
+
'ALG_BC_NB': 1425,
|
|
92
|
+
'ALG_BC_WITH_SHAVING_NB': 0,
|
|
93
|
+
'ALG_SHAVING_NB': 0,
|
|
94
|
+
'ALG_SHAVING_CHANGE_NB': 0,
|
|
95
|
+
'ALG_SHAVING_NO_CHANGE_NB': 0,
|
|
96
96
|
'PROPAGATOR_ENTAILMENT_NB': 4711,
|
|
97
97
|
'PROPAGATOR_FILTER_NB': 104392,
|
|
98
98
|
'PROPAGATOR_FILTER_NO_CHANGE_NB': 73792,
|
|
@@ -127,11 +127,11 @@ NUMBA_CACHE_DIR=.numba/cache python -m nucs.examples.golomb -n 10 --symmetry_bre
|
|
|
127
127
|
2024-11-12 17:27:45,717 - INFO - nucs.solvers.backtrack_solver - Found a (new) solution: 60
|
|
128
128
|
2024-11-12 17:27:45,977 - INFO - nucs.solvers.backtrack_solver - Found a (new) solution: 55
|
|
129
129
|
{
|
|
130
|
-
'
|
|
131
|
-
'
|
|
132
|
-
'
|
|
133
|
-
'
|
|
134
|
-
'
|
|
130
|
+
'ALG_BC_NB': 22652,
|
|
131
|
+
'ALG_BC_WITH_SHAVING_NB': 0,
|
|
132
|
+
'ALG_SHAVING_NB': 0,
|
|
133
|
+
'ALG_SHAVING_CHANGE_NB': 0,
|
|
134
|
+
'ALG_SHAVING_NO_CHANGE_NB': 0,
|
|
135
135
|
'PROPAGATOR_ENTAILMENT_NB': 107911,
|
|
136
136
|
'PROPAGATOR_FILTER_NB': 2813035,
|
|
137
137
|
'PROPAGATOR_FILTER_NO_CHANGE_NB': 1745836,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: NUCS
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.3.0
|
|
4
4
|
Summary: A Numpy and Numba based Python library for solving Constraint Satisfaction Problems over finite domains
|
|
5
5
|
Author-email: Yan Georget <yan.georget@gmail.com>
|
|
6
6
|
Project-URL: Homepage, https://github.com/yangeorget/nucs
|
|
@@ -60,11 +60,11 @@ NUMBA_CACHE_DIR=.numba/cache python -m nucs.examples.queens -n 12 --log_level=IN
|
|
|
60
60
|
2024-11-12 17:24:49,061 - INFO - nucs.solvers.backtrack_solver - Choice points stack has a maximal height of 128
|
|
61
61
|
2024-11-12 17:24:49,200 - INFO - nucs.solvers.multiprocessing_solver - MultiprocessingSolver has 1 processors
|
|
62
62
|
{
|
|
63
|
-
'
|
|
64
|
-
'
|
|
65
|
-
'
|
|
66
|
-
'
|
|
67
|
-
'
|
|
63
|
+
'ALG_BC_NB': 262011,
|
|
64
|
+
'ALG_BC_WITH_SHAVING_NB': 0,
|
|
65
|
+
'ALG_SHAVING_NB': 0,
|
|
66
|
+
'ALG_SHAVING_CHANGE_NB': 0,
|
|
67
|
+
'ALG_SHAVING_NO_CHANGE_NB': 0,
|
|
68
68
|
'PROPAGATOR_ENTAILMENT_NB': 0,
|
|
69
69
|
'PROPAGATOR_FILTER_NB': 2269980,
|
|
70
70
|
'PROPAGATOR_FILTER_NO_CHANGE_NB': 990450,
|
|
@@ -88,11 +88,11 @@ NUMBA_CACHE_DIR=.numba/cache python -m nucs.examples.bibd -v 8 -b 14 -r 7 -k 4 -
|
|
|
88
88
|
2024-11-12 17:26:39,734 - INFO - nucs.solvers.backtrack_solver - BacktrackSolver uses consistency algorithm 0
|
|
89
89
|
2024-11-12 17:26:39,734 - INFO - nucs.solvers.backtrack_solver - Choice points stack has a maximal height of 128
|
|
90
90
|
{
|
|
91
|
-
'
|
|
92
|
-
'
|
|
93
|
-
'
|
|
94
|
-
'
|
|
95
|
-
'
|
|
91
|
+
'ALG_BC_NB': 1425,
|
|
92
|
+
'ALG_BC_WITH_SHAVING_NB': 0,
|
|
93
|
+
'ALG_SHAVING_NB': 0,
|
|
94
|
+
'ALG_SHAVING_CHANGE_NB': 0,
|
|
95
|
+
'ALG_SHAVING_NO_CHANGE_NB': 0,
|
|
96
96
|
'PROPAGATOR_ENTAILMENT_NB': 4711,
|
|
97
97
|
'PROPAGATOR_FILTER_NB': 104392,
|
|
98
98
|
'PROPAGATOR_FILTER_NO_CHANGE_NB': 73792,
|
|
@@ -127,11 +127,11 @@ NUMBA_CACHE_DIR=.numba/cache python -m nucs.examples.golomb -n 10 --symmetry_bre
|
|
|
127
127
|
2024-11-12 17:27:45,717 - INFO - nucs.solvers.backtrack_solver - Found a (new) solution: 60
|
|
128
128
|
2024-11-12 17:27:45,977 - INFO - nucs.solvers.backtrack_solver - Found a (new) solution: 55
|
|
129
129
|
{
|
|
130
|
-
'
|
|
131
|
-
'
|
|
132
|
-
'
|
|
133
|
-
'
|
|
134
|
-
'
|
|
130
|
+
'ALG_BC_NB': 22652,
|
|
131
|
+
'ALG_BC_WITH_SHAVING_NB': 0,
|
|
132
|
+
'ALG_SHAVING_NB': 0,
|
|
133
|
+
'ALG_SHAVING_CHANGE_NB': 0,
|
|
134
|
+
'ALG_SHAVING_NO_CHANGE_NB': 0,
|
|
135
135
|
'PROPAGATOR_ENTAILMENT_NB': 107911,
|
|
136
136
|
'PROPAGATOR_FILTER_NB': 2813035,
|
|
137
137
|
'PROPAGATOR_FILTER_NO_CHANGE_NB': 1745836,
|
|
@@ -38,11 +38,11 @@ NUMBA_CACHE_DIR=.numba/cache python -m nucs.examples.queens -n 12 --log_level=IN
|
|
|
38
38
|
2024-11-12 17:24:49,061 - INFO - nucs.solvers.backtrack_solver - Choice points stack has a maximal height of 128
|
|
39
39
|
2024-11-12 17:24:49,200 - INFO - nucs.solvers.multiprocessing_solver - MultiprocessingSolver has 1 processors
|
|
40
40
|
{
|
|
41
|
-
'
|
|
42
|
-
'
|
|
43
|
-
'
|
|
44
|
-
'
|
|
45
|
-
'
|
|
41
|
+
'ALG_BC_NB': 262011,
|
|
42
|
+
'ALG_BC_WITH_SHAVING_NB': 0,
|
|
43
|
+
'ALG_SHAVING_NB': 0,
|
|
44
|
+
'ALG_SHAVING_CHANGE_NB': 0,
|
|
45
|
+
'ALG_SHAVING_NO_CHANGE_NB': 0,
|
|
46
46
|
'PROPAGATOR_ENTAILMENT_NB': 0,
|
|
47
47
|
'PROPAGATOR_FILTER_NB': 2269980,
|
|
48
48
|
'PROPAGATOR_FILTER_NO_CHANGE_NB': 990450,
|
|
@@ -66,11 +66,11 @@ NUMBA_CACHE_DIR=.numba/cache python -m nucs.examples.bibd -v 8 -b 14 -r 7 -k 4 -
|
|
|
66
66
|
2024-11-12 17:26:39,734 - INFO - nucs.solvers.backtrack_solver - BacktrackSolver uses consistency algorithm 0
|
|
67
67
|
2024-11-12 17:26:39,734 - INFO - nucs.solvers.backtrack_solver - Choice points stack has a maximal height of 128
|
|
68
68
|
{
|
|
69
|
-
'
|
|
70
|
-
'
|
|
71
|
-
'
|
|
72
|
-
'
|
|
73
|
-
'
|
|
69
|
+
'ALG_BC_NB': 1425,
|
|
70
|
+
'ALG_BC_WITH_SHAVING_NB': 0,
|
|
71
|
+
'ALG_SHAVING_NB': 0,
|
|
72
|
+
'ALG_SHAVING_CHANGE_NB': 0,
|
|
73
|
+
'ALG_SHAVING_NO_CHANGE_NB': 0,
|
|
74
74
|
'PROPAGATOR_ENTAILMENT_NB': 4711,
|
|
75
75
|
'PROPAGATOR_FILTER_NB': 104392,
|
|
76
76
|
'PROPAGATOR_FILTER_NO_CHANGE_NB': 73792,
|
|
@@ -105,11 +105,11 @@ NUMBA_CACHE_DIR=.numba/cache python -m nucs.examples.golomb -n 10 --symmetry_bre
|
|
|
105
105
|
2024-11-12 17:27:45,717 - INFO - nucs.solvers.backtrack_solver - Found a (new) solution: 60
|
|
106
106
|
2024-11-12 17:27:45,977 - INFO - nucs.solvers.backtrack_solver - Found a (new) solution: 55
|
|
107
107
|
{
|
|
108
|
-
'
|
|
109
|
-
'
|
|
110
|
-
'
|
|
111
|
-
'
|
|
112
|
-
'
|
|
108
|
+
'ALG_BC_NB': 22652,
|
|
109
|
+
'ALG_BC_WITH_SHAVING_NB': 0,
|
|
110
|
+
'ALG_SHAVING_NB': 0,
|
|
111
|
+
'ALG_SHAVING_CHANGE_NB': 0,
|
|
112
|
+
'ALG_SHAVING_NO_CHANGE_NB': 0,
|
|
113
113
|
'PROPAGATOR_ENTAILMENT_NB': 107911,
|
|
114
114
|
'PROPAGATOR_FILTER_NB': 2813035,
|
|
115
115
|
'PROPAGATOR_FILTER_NO_CHANGE_NB': 1745836,
|
|
@@ -64,3 +64,34 @@ LOG_LEVEL_WARNING = "WARNING"
|
|
|
64
64
|
LOG_LEVEL_ERROR = "ERROR"
|
|
65
65
|
LOG_LEVEL_CRITICAL = "CRITICAL"
|
|
66
66
|
LOG_LEVELS = [LOG_LEVEL_DEBUG, LOG_LEVEL_INFO, LOG_LEVEL_WARNING, LOG_LEVEL_ERROR, LOG_LEVEL_CRITICAL]
|
|
67
|
+
|
|
68
|
+
STATS_MAX = 13
|
|
69
|
+
(
|
|
70
|
+
STATS_IDX_ALG_BC_NB,
|
|
71
|
+
STATS_IDX_ALG_BC_WITH_SHAVING_NB,
|
|
72
|
+
STATS_IDX_ALG_SHAVING_NB,
|
|
73
|
+
STATS_IDX_ALG_SHAVING_CHANGE_NB,
|
|
74
|
+
STATS_IDX_ALG_SHAVING_NO_CHANGE_NB,
|
|
75
|
+
STATS_IDX_PROPAGATOR_ENTAILMENT_NB,
|
|
76
|
+
STATS_IDX_PROPAGATOR_FILTER_NB,
|
|
77
|
+
STATS_IDX_PROPAGATOR_FILTER_NO_CHANGE_NB,
|
|
78
|
+
STATS_IDX_PROPAGATOR_INCONSISTENCY_NB,
|
|
79
|
+
STATS_IDX_SOLVER_BACKTRACK_NB,
|
|
80
|
+
STATS_IDX_SOLVER_CHOICE_NB,
|
|
81
|
+
STATS_IDX_SOLVER_CHOICE_DEPTH,
|
|
82
|
+
STATS_IDX_SOLVER_SOLUTION_NB,
|
|
83
|
+
) = tuple(range(STATS_MAX))
|
|
84
|
+
|
|
85
|
+
STATS_LBL_ALG_BC_NB = "ALG_BC_NB"
|
|
86
|
+
STATS_LBL_ALG_BC_WITH_SHAVING_NB = "ALG_BC_WITH_SHAVING_NB"
|
|
87
|
+
STATS_LBL_ALG_SHAVING_NB = "ALG_SHAVING_NB"
|
|
88
|
+
STATS_LBL_ALG_SHAVING_CHANGE_NB = "ALG_SHAVING_CHANGE_NB"
|
|
89
|
+
STATS_LBL_ALG_SHAVING_NO_CHANGE_NB = "ALG_SHAVING_NO_CHANGE_NB"
|
|
90
|
+
STATS_LBL_PROPAGATOR_ENTAILMENT_NB = "PROPAGATOR_ENTAILMENT_NB"
|
|
91
|
+
STATS_LBL_PROPAGATOR_FILTER_NB = "PROPAGATOR_FILTER_NB"
|
|
92
|
+
STATS_LBL_PROPAGATOR_FILTER_NO_CHANGE_NB = "PROPAGATOR_FILTER_NO_CHANGE_NB"
|
|
93
|
+
STATS_LBL_PROPAGATOR_INCONSISTENCY_NB = "PROPAGATOR_INCONSISTENCY_NB"
|
|
94
|
+
STATS_LBL_SOLVER_BACKTRACK_NB = "SOLVER_BACKTRACK_NB"
|
|
95
|
+
STATS_LBL_SOLVER_CHOICE_NB = "SOLVER_CHOICE_NB"
|
|
96
|
+
STATS_LBL_SOLVER_CHOICE_DEPTH = "SOLVER_CHOICE_DEPTH"
|
|
97
|
+
STATS_LBL_SOLVER_SOLUTION_NB = "SOLVER_SOLUTION_NB"
|
|
@@ -18,10 +18,9 @@ from nucs.constants import LOG_LEVEL_INFO, LOG_LEVELS
|
|
|
18
18
|
from nucs.examples.alpha.alpha_problem import AlphaProblem
|
|
19
19
|
from nucs.solvers.backtrack_solver import BacktrackSolver
|
|
20
20
|
from nucs.solvers.heuristics import DOM_HEURISTIC_MIN_VALUE, VAR_HEURISTIC_SMALLEST_DOMAIN
|
|
21
|
-
from nucs.statistics import get_statistics
|
|
22
21
|
|
|
23
22
|
# Run with the following command (the second run is much faster because the code has been compiled):
|
|
24
|
-
# NUMBA_CACHE_DIR=.numba/cache
|
|
23
|
+
# NUMBA_CACHE_DIR=.numba/cache python -m nucs.examples.alpha
|
|
25
24
|
if __name__ == "__main__":
|
|
26
25
|
parser = argparse.ArgumentParser()
|
|
27
26
|
parser.add_argument("--log_level", choices=LOG_LEVELS, default=LOG_LEVEL_INFO)
|
|
@@ -34,5 +33,5 @@ if __name__ == "__main__":
|
|
|
34
33
|
log_level=args.log_level,
|
|
35
34
|
)
|
|
36
35
|
solutions = solver.find_all()
|
|
37
|
-
print(get_statistics(
|
|
36
|
+
print(solver.get_statistics())
|
|
38
37
|
print(problem.solution_as_dict(solutions[0]))
|
|
@@ -18,10 +18,9 @@ from nucs.constants import LOG_LEVEL_INFO, LOG_LEVELS
|
|
|
18
18
|
from nucs.examples.bibd.bibd_problem import BIBDProblem
|
|
19
19
|
from nucs.solvers.backtrack_solver import BacktrackSolver
|
|
20
20
|
from nucs.solvers.heuristics import DOM_HEURISTIC_MAX_VALUE
|
|
21
|
-
from nucs.statistics import get_statistics
|
|
22
21
|
|
|
23
22
|
# Run with the following command (the second run is much faster because the code has been compiled):
|
|
24
|
-
# NUMBA_CACHE_DIR=.numba/cache
|
|
23
|
+
# NUMBA_CACHE_DIR=.numba/cache python -m nucs.examples.bibd -v 8 -b 14 -r 7 -k 4 -l 3 --symmetry_breaking
|
|
25
24
|
if __name__ == "__main__":
|
|
26
25
|
parser = argparse.ArgumentParser()
|
|
27
26
|
parser.add_argument("-v", type=int)
|
|
@@ -35,4 +34,4 @@ if __name__ == "__main__":
|
|
|
35
34
|
problem = BIBDProblem(args.v, args.b, args.r, args.k, args.l, args.symmetry_breaking)
|
|
36
35
|
solver = BacktrackSolver(problem, dom_heuristic_idx=DOM_HEURISTIC_MAX_VALUE, log_level=args.log_level)
|
|
37
36
|
solver.solve_all()
|
|
38
|
-
print(get_statistics(
|
|
37
|
+
print(solver.get_statistics())
|
|
@@ -18,10 +18,9 @@ from nucs.constants import LOG_LEVEL_INFO, LOG_LEVELS
|
|
|
18
18
|
from nucs.examples.donald.donald_problem import DonaldProblem
|
|
19
19
|
from nucs.solvers.backtrack_solver import BacktrackSolver
|
|
20
20
|
from nucs.solvers.heuristics import DOM_HEURISTIC_MIN_VALUE, VAR_HEURISTIC_SMALLEST_DOMAIN
|
|
21
|
-
from nucs.statistics import get_statistics
|
|
22
21
|
|
|
23
22
|
# Run with the following command (the second run is much faster because the code has been compiled):
|
|
24
|
-
# NUMBA_CACHE_DIR=.numba/cache
|
|
23
|
+
# NUMBA_CACHE_DIR=.numba/cache python -m nucs.examples.donald
|
|
25
24
|
if __name__ == "__main__":
|
|
26
25
|
parser = argparse.ArgumentParser()
|
|
27
26
|
parser.add_argument("--log_level", choices=LOG_LEVELS, default=LOG_LEVEL_INFO)
|
|
@@ -33,6 +32,6 @@ if __name__ == "__main__":
|
|
|
33
32
|
dom_heuristic_idx=DOM_HEURISTIC_MIN_VALUE,
|
|
34
33
|
log_level=args.log_level,
|
|
35
34
|
)
|
|
36
|
-
print(get_statistics(
|
|
35
|
+
print(solver.get_statistics())
|
|
37
36
|
for solution in solver.solve():
|
|
38
37
|
print(problem.solution_as_dict(solution))
|
|
@@ -18,10 +18,9 @@ from nucs.constants import LOG_LEVEL_INFO, LOG_LEVELS
|
|
|
18
18
|
from nucs.examples.golomb.golomb_problem import GolombProblem, golomb_consistency_algorithm
|
|
19
19
|
from nucs.solvers.backtrack_solver import BacktrackSolver
|
|
20
20
|
from nucs.solvers.consistency_algorithms import register_consistency_algorithm
|
|
21
|
-
from nucs.statistics import get_statistics
|
|
22
21
|
|
|
23
22
|
# Run with the following command (the second run is much faster because the code has been compiled):
|
|
24
|
-
# NUMBA_CACHE_DIR=.numba/cache
|
|
23
|
+
# NUMBA_CACHE_DIR=.numba/cache python -m nucs.examples.golomb -n 10 --symmetry_breaking
|
|
25
24
|
if __name__ == "__main__":
|
|
26
25
|
parser = argparse.ArgumentParser()
|
|
27
26
|
parser.add_argument("-n", type=int, default=10)
|
|
@@ -32,6 +31,6 @@ if __name__ == "__main__":
|
|
|
32
31
|
consistency_alg_golomb = register_consistency_algorithm(golomb_consistency_algorithm)
|
|
33
32
|
solver = BacktrackSolver(problem, consistency_alg_idx=consistency_alg_golomb, log_level=args.log_level)
|
|
34
33
|
solution = solver.minimize(problem.length_idx)
|
|
35
|
-
print(get_statistics(
|
|
34
|
+
print(solver.get_statistics())
|
|
36
35
|
if solution is not None:
|
|
37
36
|
print(solution[: (args.n - 1)])
|
|
@@ -18,10 +18,9 @@ from nucs.constants import LOG_LEVEL_INFO, LOG_LEVELS
|
|
|
18
18
|
from nucs.examples.knapsack.knapsack_problem import KnapsackProblem
|
|
19
19
|
from nucs.solvers.backtrack_solver import BacktrackSolver
|
|
20
20
|
from nucs.solvers.heuristics import DOM_HEURISTIC_MAX_VALUE, VAR_HEURISTIC_FIRST_NOT_INSTANTIATED
|
|
21
|
-
from nucs.statistics import get_statistics
|
|
22
21
|
|
|
23
22
|
# Run with the following command (the second run is much faster because the code has been compiled):
|
|
24
|
-
# NUMBA_CACHE_DIR=.numba/cache
|
|
23
|
+
# NUMBA_CACHE_DIR=.numba/cache python -m nucs.examples.knapsack
|
|
25
24
|
if __name__ == "__main__":
|
|
26
25
|
parser = argparse.ArgumentParser()
|
|
27
26
|
parser.add_argument("--log_level", choices=LOG_LEVELS, default=LOG_LEVEL_INFO)
|
|
@@ -38,5 +37,5 @@ if __name__ == "__main__":
|
|
|
38
37
|
log_level=args.log_level,
|
|
39
38
|
)
|
|
40
39
|
solution = solver.maximize(problem.weight)
|
|
41
|
-
print(get_statistics(
|
|
40
|
+
print(solver.get_statistics())
|
|
42
41
|
print(solution)
|
|
@@ -18,10 +18,9 @@ from nucs.constants import LOG_LEVEL_INFO, LOG_LEVELS
|
|
|
18
18
|
from nucs.examples.magic_sequence.magic_sequence_problem import MagicSequenceProblem
|
|
19
19
|
from nucs.solvers.backtrack_solver import BacktrackSolver
|
|
20
20
|
from nucs.solvers.heuristics import DOM_HEURISTIC_MIN_VALUE, VAR_HEURISTIC_LAST_NOT_INSTANTIATED
|
|
21
|
-
from nucs.statistics import get_statistics
|
|
22
21
|
|
|
23
22
|
# Run with the following command (the second run is much faster because the code has been compiled):
|
|
24
|
-
# NUMBA_CACHE_DIR=.numba/cache
|
|
23
|
+
# NUMBA_CACHE_DIR=.numba/cache python -m nucs.examples.magic_sequence -n 100
|
|
25
24
|
if __name__ == "__main__":
|
|
26
25
|
parser = argparse.ArgumentParser()
|
|
27
26
|
parser.add_argument("-n", type=int, default=100)
|
|
@@ -35,4 +34,4 @@ if __name__ == "__main__":
|
|
|
35
34
|
log_level=args.log_level,
|
|
36
35
|
)
|
|
37
36
|
solver.solve_all()
|
|
38
|
-
print(get_statistics(
|
|
37
|
+
print(solver.get_statistics())
|
|
@@ -18,10 +18,9 @@ from nucs.constants import LOG_LEVEL_INFO, LOG_LEVELS
|
|
|
18
18
|
from nucs.examples.magic_square.magic_square_problem import MagicSquareProblem
|
|
19
19
|
from nucs.solvers.backtrack_solver import BacktrackSolver
|
|
20
20
|
from nucs.solvers.heuristics import DOM_HEURISTIC_MAX_VALUE, VAR_HEURISTIC_SMALLEST_DOMAIN
|
|
21
|
-
from nucs.statistics import get_statistics
|
|
22
21
|
|
|
23
22
|
# Run with the following command (the second run is much faster because the code has been compiled):
|
|
24
|
-
# NUMBA_CACHE_DIR=.numba/cache
|
|
23
|
+
# NUMBA_CACHE_DIR=.numba/cache python -m nucs.examples.magic_square -n 4 --symmetry_breaking
|
|
25
24
|
if __name__ == "__main__":
|
|
26
25
|
parser = argparse.ArgumentParser()
|
|
27
26
|
parser.add_argument("-n", type=int)
|
|
@@ -36,4 +35,4 @@ if __name__ == "__main__":
|
|
|
36
35
|
log_level=args.log_level,
|
|
37
36
|
)
|
|
38
37
|
solver.solve_all()
|
|
39
|
-
print(get_statistics(
|
|
38
|
+
print(solver.get_statistics())
|
|
@@ -18,10 +18,9 @@ from nucs.constants import LOG_LEVEL_INFO, LOG_LEVELS
|
|
|
18
18
|
from nucs.examples.quasigroup.quasigroup_problem import Quasigroup5Problem
|
|
19
19
|
from nucs.solvers.backtrack_solver import BacktrackSolver
|
|
20
20
|
from nucs.solvers.heuristics import DOM_HEURISTIC_MIN_VALUE, VAR_HEURISTIC_SMALLEST_DOMAIN
|
|
21
|
-
from nucs.statistics import get_statistics
|
|
22
21
|
|
|
23
22
|
# Run with the following command (the second run is much faster because the code has been compiled):
|
|
24
|
-
# NUMBA_CACHE_DIR=.numba/cache
|
|
23
|
+
# NUMBA_CACHE_DIR=.numba/cache python -m nucs.examples.quasigroup -n 10 --symmetry_breaking
|
|
25
24
|
if __name__ == "__main__":
|
|
26
25
|
parser = argparse.ArgumentParser()
|
|
27
26
|
parser.add_argument("-n", type=int, default=10)
|
|
@@ -36,4 +35,4 @@ if __name__ == "__main__":
|
|
|
36
35
|
log_level=args.log_level,
|
|
37
36
|
)
|
|
38
37
|
solver.solve_all()
|
|
39
|
-
print(get_statistics(
|
|
38
|
+
print(solver.get_statistics())
|
|
@@ -20,10 +20,9 @@ from nucs.solvers.backtrack_solver import BacktrackSolver
|
|
|
20
20
|
from nucs.solvers.consistency_algorithms import CONSISTENCY_ALG_BC, CONSISTENCY_ALG_SHAVING
|
|
21
21
|
from nucs.solvers.heuristics import VAR_HEURISTIC_FIRST_NOT_INSTANTIATED, VAR_HEURISTIC_SMALLEST_DOMAIN
|
|
22
22
|
from nucs.solvers.multiprocessing_solver import MultiprocessingSolver
|
|
23
|
-
from nucs.statistics import get_statistics
|
|
24
23
|
|
|
25
24
|
# Run with the following command (the second run is much faster because the code has been compiled):
|
|
26
|
-
# NUMBA_CACHE_DIR=.numba/cache
|
|
25
|
+
# NUMBA_CACHE_DIR=.numba/cache python -m nucs.examples.queens -n 10
|
|
27
26
|
if __name__ == "__main__":
|
|
28
27
|
parser = argparse.ArgumentParser()
|
|
29
28
|
parser.add_argument("-n", type=int, default=10)
|
|
@@ -46,4 +45,4 @@ if __name__ == "__main__":
|
|
|
46
45
|
]
|
|
47
46
|
)
|
|
48
47
|
solver.solve_all()
|
|
49
|
-
print(get_statistics(
|
|
48
|
+
print(solver.get_statistics())
|
|
@@ -17,10 +17,9 @@ from rich import print
|
|
|
17
17
|
from nucs.constants import LOG_LEVEL_INFO, LOG_LEVELS
|
|
18
18
|
from nucs.examples.schur_lemma.schur_lemma_problem import SchurLemmaProblem
|
|
19
19
|
from nucs.solvers.backtrack_solver import BacktrackSolver
|
|
20
|
-
from nucs.statistics import get_statistics
|
|
21
20
|
|
|
22
21
|
# Run with the following command (the second run is much faster because the code has been compiled):
|
|
23
|
-
# NUMBA_CACHE_DIR=.numba/cache
|
|
22
|
+
# NUMBA_CACHE_DIR=.numba/cache python -m nucs.examples.schur_lemma -n 20 --symmetry_breaking
|
|
24
23
|
if __name__ == "__main__":
|
|
25
24
|
parser = argparse.ArgumentParser()
|
|
26
25
|
parser.add_argument("-n", type=int, default=20)
|
|
@@ -30,4 +29,4 @@ if __name__ == "__main__":
|
|
|
30
29
|
problem = SchurLemmaProblem(args.n, args.symmetry_breaking)
|
|
31
30
|
solver = BacktrackSolver(problem, log_level=args.log_level)
|
|
32
31
|
solver.solve_all()
|
|
33
|
-
print(get_statistics(
|
|
32
|
+
print(solver.get_statistics())
|
|
@@ -20,10 +20,9 @@ from nucs.examples.sports_tournament_scheduling.sports_tournament_scheduling_pro
|
|
|
20
20
|
)
|
|
21
21
|
from nucs.solvers.backtrack_solver import BacktrackSolver
|
|
22
22
|
from nucs.solvers.heuristics import DOM_HEURISTIC_MIN_VALUE, VAR_HEURISTIC_SMALLEST_DOMAIN
|
|
23
|
-
from nucs.statistics import get_statistics
|
|
24
23
|
|
|
25
24
|
# Run with the following command (the second run is much faster because the code has been compiled):
|
|
26
|
-
# NUMBA_CACHE_DIR=.numba/cache
|
|
25
|
+
# NUMBA_CACHE_DIR=.numba/cache python -m nucs.examples.sports_tournament_scheduling -n 8
|
|
27
26
|
if __name__ == "__main__":
|
|
28
27
|
parser = argparse.ArgumentParser()
|
|
29
28
|
parser.add_argument("-n", type=int, default=8)
|
|
@@ -38,6 +37,6 @@ if __name__ == "__main__":
|
|
|
38
37
|
log_level=args.log_level,
|
|
39
38
|
)
|
|
40
39
|
solution = next(solver.solve())
|
|
41
|
-
print(get_statistics(
|
|
40
|
+
print(solver.get_statistics())
|
|
42
41
|
if solution is not None:
|
|
43
42
|
print(problem.solution_as_matrix(solution))
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
###############################################################################
|
|
13
13
|
import logging
|
|
14
14
|
from multiprocessing import Queue
|
|
15
|
-
from typing import Callable, Iterator, Optional, Tuple
|
|
15
|
+
from typing import Callable, Dict, Iterator, Optional, Tuple
|
|
16
16
|
|
|
17
17
|
import numpy as np
|
|
18
18
|
from numba import njit # type: ignore
|
|
@@ -28,6 +28,33 @@ from nucs.constants import (
|
|
|
28
28
|
SIGNATURE_CONSISTENCY_ALG,
|
|
29
29
|
SIGNATURE_DOM_HEURISTIC,
|
|
30
30
|
SIGNATURE_VAR_HEURISTIC,
|
|
31
|
+
STATS_IDX_ALG_BC_NB,
|
|
32
|
+
STATS_IDX_ALG_BC_WITH_SHAVING_NB,
|
|
33
|
+
STATS_IDX_ALG_SHAVING_CHANGE_NB,
|
|
34
|
+
STATS_IDX_ALG_SHAVING_NB,
|
|
35
|
+
STATS_IDX_ALG_SHAVING_NO_CHANGE_NB,
|
|
36
|
+
STATS_IDX_PROPAGATOR_ENTAILMENT_NB,
|
|
37
|
+
STATS_IDX_PROPAGATOR_FILTER_NB,
|
|
38
|
+
STATS_IDX_PROPAGATOR_FILTER_NO_CHANGE_NB,
|
|
39
|
+
STATS_IDX_PROPAGATOR_INCONSISTENCY_NB,
|
|
40
|
+
STATS_IDX_SOLVER_BACKTRACK_NB,
|
|
41
|
+
STATS_IDX_SOLVER_CHOICE_DEPTH,
|
|
42
|
+
STATS_IDX_SOLVER_CHOICE_NB,
|
|
43
|
+
STATS_IDX_SOLVER_SOLUTION_NB,
|
|
44
|
+
STATS_LBL_ALG_BC_NB,
|
|
45
|
+
STATS_LBL_ALG_BC_WITH_SHAVING_NB,
|
|
46
|
+
STATS_LBL_ALG_SHAVING_CHANGE_NB,
|
|
47
|
+
STATS_LBL_ALG_SHAVING_NB,
|
|
48
|
+
STATS_LBL_ALG_SHAVING_NO_CHANGE_NB,
|
|
49
|
+
STATS_LBL_PROPAGATOR_ENTAILMENT_NB,
|
|
50
|
+
STATS_LBL_PROPAGATOR_FILTER_NB,
|
|
51
|
+
STATS_LBL_PROPAGATOR_FILTER_NO_CHANGE_NB,
|
|
52
|
+
STATS_LBL_PROPAGATOR_INCONSISTENCY_NB,
|
|
53
|
+
STATS_LBL_SOLVER_BACKTRACK_NB,
|
|
54
|
+
STATS_LBL_SOLVER_CHOICE_DEPTH,
|
|
55
|
+
STATS_LBL_SOLVER_CHOICE_NB,
|
|
56
|
+
STATS_LBL_SOLVER_SOLUTION_NB,
|
|
57
|
+
STATS_MAX,
|
|
31
58
|
TYPE_CONSISTENCY_ALG,
|
|
32
59
|
TYPE_DOM_HEURISTIC,
|
|
33
60
|
TYPE_VAR_HEURISTIC,
|
|
@@ -44,33 +71,10 @@ from nucs.solvers.heuristics import (
|
|
|
44
71
|
VAR_HEURISTIC_FIRST_NOT_INSTANTIATED,
|
|
45
72
|
)
|
|
46
73
|
from nucs.solvers.solver import Solver, decrease_max, get_solution, increase_min
|
|
47
|
-
from nucs.statistics import (
|
|
48
|
-
STATS_IDX_OPTIMIZER_SOLUTION_NB,
|
|
49
|
-
STATS_IDX_SOLVER_CHOICE_DEPTH,
|
|
50
|
-
STATS_IDX_SOLVER_CHOICE_NB,
|
|
51
|
-
STATS_IDX_SOLVER_SOLUTION_NB,
|
|
52
|
-
init_statistics,
|
|
53
|
-
)
|
|
54
74
|
|
|
55
75
|
logger = logging.getLogger(__name__)
|
|
56
76
|
|
|
57
77
|
|
|
58
|
-
def get_function_addresses() -> Tuple[NDArray, NDArray, NDArray, NDArray]:
|
|
59
|
-
"""
|
|
60
|
-
Returns the addresses of the
|
|
61
|
-
compute_domains, variable heuristics, domain heuristics and consistency algorithms functions.
|
|
62
|
-
:return: a tuple of NDArrays
|
|
63
|
-
"""
|
|
64
|
-
if NUMBA_DISABLE_JIT:
|
|
65
|
-
return np.empty(0), np.empty(0), np.empty(0), np.empty(0)
|
|
66
|
-
return (
|
|
67
|
-
np.array(build_function_address_list(COMPUTE_DOMAINS_FCTS, SIGNATURE_COMPUTE_DOMAINS)),
|
|
68
|
-
np.array(build_function_address_list(VAR_HEURISTIC_FCTS, SIGNATURE_VAR_HEURISTIC)),
|
|
69
|
-
np.array(build_function_address_list(DOM_HEURISTIC_FCTS, SIGNATURE_DOM_HEURISTIC)),
|
|
70
|
-
np.array(build_function_address_list(CONSISTENCY_ALG_FCTS, SIGNATURE_CONSISTENCY_ALG)),
|
|
71
|
-
)
|
|
72
|
-
|
|
73
|
-
|
|
74
78
|
class BacktrackSolver(Solver):
|
|
75
79
|
"""
|
|
76
80
|
A solver relying on a backtracking mechanism.
|
|
@@ -118,10 +122,27 @@ class BacktrackSolver(Solver):
|
|
|
118
122
|
)
|
|
119
123
|
logger.debug("Choice points initialized")
|
|
120
124
|
logger.debug("Initializing statistics")
|
|
121
|
-
self.statistics =
|
|
125
|
+
self.statistics = np.array([0] * STATS_MAX, dtype=np.int64)
|
|
122
126
|
logger.debug("Statistics initialized")
|
|
123
127
|
logger.debug("BacktrackSolver initialized")
|
|
124
128
|
|
|
129
|
+
def get_statistics(self) -> Dict[str, int]:
|
|
130
|
+
return {
|
|
131
|
+
STATS_LBL_ALG_BC_NB: int(self.statistics[STATS_IDX_ALG_BC_NB]),
|
|
132
|
+
STATS_LBL_ALG_BC_WITH_SHAVING_NB: int(self.statistics[STATS_IDX_ALG_BC_WITH_SHAVING_NB]),
|
|
133
|
+
STATS_LBL_ALG_SHAVING_NB: int(self.statistics[STATS_IDX_ALG_SHAVING_NB]),
|
|
134
|
+
STATS_LBL_ALG_SHAVING_CHANGE_NB: int(self.statistics[STATS_IDX_ALG_SHAVING_CHANGE_NB]),
|
|
135
|
+
STATS_LBL_ALG_SHAVING_NO_CHANGE_NB: int(self.statistics[STATS_IDX_ALG_SHAVING_NO_CHANGE_NB]),
|
|
136
|
+
STATS_LBL_PROPAGATOR_ENTAILMENT_NB: int(self.statistics[STATS_IDX_PROPAGATOR_ENTAILMENT_NB]),
|
|
137
|
+
STATS_LBL_PROPAGATOR_FILTER_NB: int(self.statistics[STATS_IDX_PROPAGATOR_FILTER_NB]),
|
|
138
|
+
STATS_LBL_PROPAGATOR_FILTER_NO_CHANGE_NB: int(self.statistics[STATS_IDX_PROPAGATOR_FILTER_NO_CHANGE_NB]),
|
|
139
|
+
STATS_LBL_PROPAGATOR_INCONSISTENCY_NB: int(self.statistics[STATS_IDX_PROPAGATOR_INCONSISTENCY_NB]),
|
|
140
|
+
STATS_LBL_SOLVER_BACKTRACK_NB: int(self.statistics[STATS_IDX_SOLVER_BACKTRACK_NB]),
|
|
141
|
+
STATS_LBL_SOLVER_CHOICE_NB: int(self.statistics[STATS_IDX_SOLVER_CHOICE_NB]),
|
|
142
|
+
STATS_LBL_SOLVER_CHOICE_DEPTH: int(self.statistics[STATS_IDX_SOLVER_CHOICE_DEPTH]),
|
|
143
|
+
STATS_LBL_SOLVER_SOLUTION_NB: int(self.statistics[STATS_IDX_SOLVER_SOLUTION_NB]),
|
|
144
|
+
}
|
|
145
|
+
|
|
125
146
|
def minimize(self, variable_idx: int) -> Optional[NDArray]:
|
|
126
147
|
"""
|
|
127
148
|
Return the solution that minimizes a variable.
|
|
@@ -177,9 +198,8 @@ class BacktrackSolver(Solver):
|
|
|
177
198
|
dom_heuristic_addrs,
|
|
178
199
|
)
|
|
179
200
|
) is not None:
|
|
180
|
-
logger.info(f"Found a
|
|
201
|
+
logger.info(f"Found a local optimum: {solution[variable_idx]}")
|
|
181
202
|
best_solution = solution
|
|
182
|
-
self.statistics[STATS_IDX_OPTIMIZER_SOLUTION_NB] += 1
|
|
183
203
|
reset(
|
|
184
204
|
self.problem,
|
|
185
205
|
self.shr_domains_stack,
|
|
@@ -303,8 +323,7 @@ class BacktrackSolver(Solver):
|
|
|
303
323
|
)
|
|
304
324
|
if solution is None:
|
|
305
325
|
break
|
|
306
|
-
logger.info(f"Found a
|
|
307
|
-
self.statistics[STATS_IDX_OPTIMIZER_SOLUTION_NB] += 1
|
|
326
|
+
logger.info(f"Found a local optimum: {solution[variable_idx]}")
|
|
308
327
|
solution_queue.put((processor_idx, solution, self.statistics))
|
|
309
328
|
reset(
|
|
310
329
|
self.problem,
|
|
@@ -509,3 +528,19 @@ def solve_one(
|
|
|
509
528
|
shr_domains_propagators,
|
|
510
529
|
):
|
|
511
530
|
return None
|
|
531
|
+
|
|
532
|
+
|
|
533
|
+
def get_function_addresses() -> Tuple[NDArray, NDArray, NDArray, NDArray]:
|
|
534
|
+
"""
|
|
535
|
+
Returns the addresses of the
|
|
536
|
+
compute_domains, variable heuristics, domain heuristics and consistency algorithms functions.
|
|
537
|
+
:return: a tuple of NDArrays
|
|
538
|
+
"""
|
|
539
|
+
if NUMBA_DISABLE_JIT:
|
|
540
|
+
return np.empty(0), np.empty(0), np.empty(0), np.empty(0)
|
|
541
|
+
return (
|
|
542
|
+
np.array(build_function_address_list(COMPUTE_DOMAINS_FCTS, SIGNATURE_COMPUTE_DOMAINS)),
|
|
543
|
+
np.array(build_function_address_list(VAR_HEURISTIC_FCTS, SIGNATURE_VAR_HEURISTIC)),
|
|
544
|
+
np.array(build_function_address_list(DOM_HEURISTIC_FCTS, SIGNATURE_DOM_HEURISTIC)),
|
|
545
|
+
np.array(build_function_address_list(CONSISTENCY_ALG_FCTS, SIGNATURE_CONSISTENCY_ALG)),
|
|
546
|
+
)
|
|
@@ -25,18 +25,16 @@ from nucs.constants import (
|
|
|
25
25
|
PROP_ENTAILMENT,
|
|
26
26
|
PROP_INCONSISTENCY,
|
|
27
27
|
START,
|
|
28
|
-
|
|
29
|
-
)
|
|
30
|
-
from nucs.numba_helper import function_from_address
|
|
31
|
-
from nucs.propagators.propagators import COMPUTE_DOMAINS_FCTS, add_propagators, pop_propagator
|
|
32
|
-
from nucs.solvers.solver import is_solved
|
|
33
|
-
from nucs.statistics import (
|
|
34
|
-
STATS_IDX_PROBLEM_FILTER_NB,
|
|
28
|
+
STATS_IDX_ALG_BC_NB,
|
|
35
29
|
STATS_IDX_PROPAGATOR_ENTAILMENT_NB,
|
|
36
30
|
STATS_IDX_PROPAGATOR_FILTER_NB,
|
|
37
31
|
STATS_IDX_PROPAGATOR_FILTER_NO_CHANGE_NB,
|
|
38
32
|
STATS_IDX_PROPAGATOR_INCONSISTENCY_NB,
|
|
33
|
+
TYPE_COMPUTE_DOMAINS,
|
|
39
34
|
)
|
|
35
|
+
from nucs.numba_helper import function_from_address
|
|
36
|
+
from nucs.propagators.propagators import COMPUTE_DOMAINS_FCTS, add_propagators, pop_propagator
|
|
37
|
+
from nucs.solvers.solver import is_solved
|
|
40
38
|
|
|
41
39
|
|
|
42
40
|
@njit(cache=True)
|
|
@@ -81,7 +79,7 @@ def bound_consistency_algorithm(
|
|
|
81
79
|
:param compute_domains_addrs: the addresses of the compute_domains functions
|
|
82
80
|
:return: a status (consistency, inconsistency or entailment) as an integer
|
|
83
81
|
"""
|
|
84
|
-
statistics[
|
|
82
|
+
statistics[STATS_IDX_ALG_BC_NB] += 1
|
|
85
83
|
prop_idx = -1
|
|
86
84
|
while True:
|
|
87
85
|
prop_idx = pop_propagator(triggered_propagators, prop_idx)
|
|
@@ -3,8 +3,8 @@ from typing import Optional
|
|
|
3
3
|
from numba import njit # type: ignore
|
|
4
4
|
from numpy.typing import NDArray
|
|
5
5
|
|
|
6
|
+
from nucs.constants import STATS_IDX_SOLVER_BACKTRACK_NB
|
|
6
7
|
from nucs.propagators.propagators import add_propagators
|
|
7
|
-
from nucs.statistics import STATS_IDX_SOLVER_BACKTRACK_NB
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
@njit(cache=True)
|