Orbiter 2022
Combinatorial Objects
solvers.h
Go to the documentation of this file.
1// solvers.h
2//
3// Anton Betten
4//
5// moved here from galois.h: July 27, 2018
6// started as orbiter: October 23, 2002
7// 2nd version started: December 7, 2003
8// galois started: August 12, 2005
9
10
11#ifndef ORBITER_SRC_LIB_FOUNDATIONS_SOLVERS_SOLVERS_H_
12#define ORBITER_SRC_LIB_FOUNDATIONS_SOLVERS_SOLVERS_H_
13
14
15namespace orbiter {
16namespace layer1_foundations {
17namespace solvers {
18
19
20// #############################################################################
21// diophant_activity_description.cpp
22// #############################################################################
23
24
26
28public:
29
31 std::string input_file;
36
39 int bit_depth; // 8 or 24
40 int f_draw;
42
46
52
55
56
57
61 int argc, std::string *argv,
62 int verbose_level);
63 void print();
64
65
66
67};
68
69
70// #############################################################################
71// diophant_activity.cpp
72// #############################################################################
73
74
76
78public:
79
81
85 int verbose_level);
87 int verbose_level);
88
89
90};
91
92
93
94// #############################################################################
95// diophant_create.cpp
96// #############################################################################
97
98
100
102public:
103
105
107
110 void init(
112 int verbose_level);
113
114};
115
116
117
118// #############################################################################
119// diophant_description.cpp
120// #############################################################################
121
122
124
126public:
127 int f_q;
131
137
139 std::string label;
140
145
149
152
153
154 int f_RHS;
155 std::string RHS_text;
156
158 std::string RHS_csv_text;
159
161 std::string RHS_constant_text;
162
165
168
170 std::string x_bounds_text;
171
173 std::string x_bounds_csv;
174
177
178
181 int read_arguments(
182 int argc, std::string *argv,
183 int verbose_level);
184 void print();
185
186};
187
188
189// #############################################################################
190// diophant.cpp
191// #############################################################################
192
193
195
206
207
208
209class diophant {
210public:
211 std::string label;
212 int m; // number of equations or inequalities
213 int n; // number of variables
215 int sum; // constraint: sum(i=0..(n-1); x[i]) = sum
216 int sum1;
217 //int f_x_max;
218 // with constraints: x[i] <= x_max[i] for i=0..(n-1)
219
220 int *A; // [m * n] the coefficient matrix
221 int *G; // [m * n] matrix of gcd values
222 int *x_max; // [n] upper bounds for x
223 int *x_min; // [n] lower bounds for x
224 int *x; // [n] current value of x
225 int *RHS; // [m] the right hand sides
226 int *RHS_low; // [m] the minimum for the right hand side
227 // this is used only in the McKay solver
228 int *RHS1;
229 // [m] he current values of the RHS
230 // (=RHS - what is chosen on the left
232 char **eqn_label; // [m] a label for each equation / inequality
233
235 int *var_labels; // [n]
236
237
238 // the following vectors are used by diophant::test_solution
239 int *X; // [n]
240 int *Y; // [m]
241
242 std::deque<std::vector<int> > _results;
251 int t0;
252
253
254 diophant();
255 ~diophant();
256 void null();
257 void freeself();
258
259 void open(int m, int n);
260 void init_var_labels(long int *labels, int verbose_level);
261 void join_problems(diophant *D1, diophant *D2, int verbose_level);
263 int *weights, int nb_weights, int target_value,
264 int verbose_level);
266 int *weights, int *bounds, int nb_weights, int target_value,
267 int verbose_level);
269 int nb_cols, int *Inc, int nb_to_select,
270 int *Rhs, int verbose_level);
271 void init_problem_of_Steiner_type(int nb_rows, int nb_cols,
272 int *Inc, int nb_to_select, int verbose_level);
273 void init_RHS(int RHS_value, int verbose_level);
274 void init_clique_finding_problem(int *Adj, int nb_pts,
275 int nb_to_select, int verbose_level);
277 void set_x_min_constant(int a);
278 void set_x_max_constant(int a);
279 int &Aij(int i, int j);
280 int &Gij(int i, int j);
281 int &RHSi(int i);
282 int &RHS_low_i(int i);
283 void init_eqn_label(int i, char *label);
284 void print();
285 void print_tight();
286 void print_dense();
287 void print2(int f_with_gcd);
288 void print_compressed();
289 void print_eqn(int i, int f_with_gcd);
290 void print_eqn_compressed(int i);
291 void print_eqn_dense(int i);
292 void print_x_long();
293 void print_x(int header);
294 int RHS_ge_zero();
295 int solve_first(int verbose_level);
296 int solve_next();
297 int solve_first_mckay(int f_once, int verbose_level);
298 void write_solutions(std::string &fname, int verbose_level);
299 void read_solutions_from_file(std::string &fname_sol,
300 int verbose_level);
301 void get_solutions(long int *&Sol, int &nb_sol, int verbose_level);
302 void get_solutions_full_length(int *&Sol, int &nb_sol,
303 int verbose_level);
304 void test_solution_full_length(int *sol, int verbose_level);
305 int solve_all_DLX(int verbose_level);
306 int solve_all_DLX_with_RHS(int f_write_tree, const char *fname_tree,
307 int verbose_level);
308 int solve_all_DLX_with_RHS_and_callback(int f_write_tree,
309 const char *fname_tree,
310 void (*user_callback_solution_found)(int *sol, int len,
311 int nb_sol, void *data),
312 int verbose_level);
313 int solve_all_mckay(long int &nb_backtrack_nodes, int maxresults, int verbose_level);
314 int solve_once_mckay(int verbose_level);
315 int solve_all_betten(int verbose_level);
316 int solve_all_betten_with_conditions(int verbose_level,
317 int f_max_sol, int max_sol,
318 int f_max_time, int max_time_in_seconds);
319 int solve_first_betten(int verbose_level);
320 int solve_next_mckay(int verbose_level);
321 int solve_next_betten(int verbose_level);
322 int j_fst(int j, int verbose_level);
323 int j_nxt(int j, int verbose_level);
324 void solve_mckay(const char *label, int maxresults,
325 long int &nb_backtrack_nodes, int &nb_sol, int verbose_level);
327 int maxresults, long int &nb_backtrack_nodes,
328 int minrhs, int &nb_sol, int verbose_level);
329 void latex_it();
330 void latex_it(std::ostream &ost);
331 void trivial_row_reductions(int &f_no_solution, int verbose_level);
332 diophant *trivial_column_reductions(int verbose_level);
334 void coefficient_values_in_row(int i, int &nb_values,
335 int *&values, int *&multiplicities, int verbose_level);
337 void get_coefficient_matrix(int *&M, int &nb_rows, int &nb_cols,
338 int verbose_level);
339 void save_in_general_format(std::string &fname, int verbose_level);
340 void read_general_format(std::string &fname, int verbose_level);
341 void eliminate_zero_rows_quick(int verbose_level);
342 void eliminate_zero_rows(int *&eqn_number, int verbose_level);
343 int is_zero_outside(int first, int len, int i);
344 void project(diophant *D, int first, int len, int *&eqn_number,
345 int &nb_eqns_replaced, int *&eqns_replaced,
346 int verbose_level);
347 void split_by_equation(int eqn_idx, int f_solve_case, int solve_case_idx, int verbose_level);
348 void split_by_two_equations(int eqn1_idx, int eqn2_idx,
349 int f_solve_case, int solve_case_idx_r, int solve_case_idx_m,
350 int verbose_level);
352 int max_number_of_coefficients,
353 int verbose_level);
354 void project_to_single_equation(diophant *D, int eqn_idx,
355 int verbose_level);
356 void project_to_two_equations(diophant *D, int eqn1_idx, int eqn2_idx,
357 int verbose_level);
359 void write_xml(std::ostream &ost, const char *label);
360 void read_xml(std::ifstream &f, char *label, int verbose_level);
361 // label will be set to the label that is in the file
362 // therefore, label must point to sufficient memory
363 void append_equation();
364 void delete_equation(int I);
365 void write_gurobi_binary_variables(const char *fname);
366 void draw_as_bitmap(std::string &fname,
367 int f_box_width, int box_width, int bit_depth, int verbose_level);
368 void draw_it(
369 std::string &fname_base,
371 int verbose_level);
372 void draw_partitioned(
373 std::string &fname_base,
375 int f_solution, int *solution, int solution_sz,
376 int verbose_level);
377 int test_solution(int *sol, int len, int verbose_level);
378 void get_columns(int *col, int nb_col, data_structures::set_of_sets *&S,
379 int verbose_level);
380 void test_solution_file(std::string &solution_file,
381 int verbose_level);
382 void analyze(int verbose_level);
383 int is_of_Steiner_type();
385 int verbose_level);
386 void make_clique_graph(graph_theory::colored_graph *&CG, int verbose_level);
387 void make_clique_graph_and_save(std::string &clique_graph_fname,
388 int verbose_level);
390
391
392 int solve_first_mckay_once_option(int f_once, int verbose_level);
393
394
395};
396
397
398// #############################################################################
399// dlx_problem_description.cpp
400// #############################################################################
401
402
404
405
407public:
408
410 std::string label_txt;
412 std::string label_tex;
413
415 std::string data_label;
416
421
424
427
428
431 int read_arguments(
432 int argc, std::string *argv,
433 int verbose_level);
434 void print();
435
436};
437
438
439
440// #############################################################################
441// dlx_solver.cpp
442// #############################################################################
443
444
446
447
448
450public:
451
453
457
458 std::string solutions_fname;
459 std::ofstream *fp_sol;
460
461 std::string tree_fname;
463
464 std::ofstream *fp_tree;
465
466
467 int nRow;
468 int nCol;
469
470 int f_has_RHS; // [nCol]
471 int *target_RHS; // [nCol]
472 int *current_RHS; // [nCol]
473 int *current_row; // [nCol]
474 int *current_row_save; // [sum_rhs]
475
476
477 // we allow three types of conditions:
478 // equations t_EQ
479 // inequalities t_LE
480 // zero or a fixed value t_ZOR
481
484 int *changed_type_columns; // [nCol]
485 int *nb_changed_type_columns; // [sum_rhs]
487
488 int *Result; // [nRow]
489 int *Nb_choices; // [nRow]
490 int *Cur_choice; // [nRow]
491 int *Cur_col; // [nRow]
492 int *Nb_col_nodes; // [nCol]
495 dlx_node *Matrix; // [nRow * nCol]
497
500 int *solution, int len, int nb_sol, void *data);
502
503
504
505 dlx_solver();
506 ~dlx_solver();
507 void init(
509 int verbose_level);
510 int dataLeft(int i);
511 int dataRight(int i);
512 int dataUp(int i);
513 int dataDown(int i);
516 int *solution, int len, int nb_sol, void *data),
519 void Test();
520 void TransposeAppendAndSolve(int *Data, int nb_rows, int nb_cols,
521 int verbose_level);
522 void TransposeAndSolveRHS(int *Data, int nb_rows, int nb_cols,
523 int *RHS, int f_has_type, diophant_equation_type *type,
524 int verbose_level);
525 void AppendRowAndSolve(int *Data, int nb_rows, int nb_cols,
526 int verbose_level);
527 void AppendRowAndSolveRHS(int *Data, int nb_rows, int nb_cols,
528 int *RHS, int f_has_type, diophant_equation_type *type,
529 int verbose_level);
530 void Solve(int verbose_level);
531 void Solve_with_RHS(int *RHS, int f_has_type,
533 int verbose_level);
534 void open_solution_file(int verbose_level);
535 void close_solution_file();
536 void open_tree_file(int verbose_level);
537 void close_tree_file();
538 void Create_RHS(int nb_cols, int *RHS, int f_has_type,
539 diophant_equation_type *type, int verbose_level);
540 void Delete_RHS();
541 void CreateMatrix(int *Data,
542 int nb_rows, int nb_cols, int verbose_level);
543 void DeleteMatrix();
549 void write_tree(int k);
550 void print_if_necessary(int k);
551 void process_solution(int k);
552 void count_nb_choices(int k, dlx_node *Column);
553 int IsDone();
554 int IsColumnDone(int c);
555 int IsColumnNotDone(int c);
556 void Search(int k);
557 void SearchRHS(int k, int verbose_level);
558 void Cover(dlx_node *ColNode);
559 void UnCover(dlx_node *ColNode);
560
561
562
563};
564
566
567struct dlx_node {
568
570
575
576 int row; // row index
577 int col; // col index
578};
579
580
581
582
583
584
585
586
587
588// #############################################################################
589// mckay.cpp
590// #############################################################################
591
592
593#define MCKAY_DEBUG
594
595
597
598
599namespace mckay {
600
601
602 #include <stdio.h>
603 #include <math.h>
604
605
606 //#undef MCKAY_DEBUG
607 #define INTERVAL_IN_SECONDS 1
608
610
611 typedef struct {int var,coeff;} term;
612 typedef std::vector<term> equation;
613
615
616 class tMCKAY {
617 public:
618 tMCKAY();
619 void Init(diophant *lgs, const char *label,
620 int aEqnAnz, int aVarAnz);
621 void possolve(std::vector<int> &lo, std::vector<int> &hi,
622 std::vector<equation> &eqn,
623 std::vector<int> &lorhs, std::vector<int> &hirhs,
624 std::vector<int> &neqn, int numeqn, int numvar,
625 int verbose_level);
626
630 const char *problem_label;
631
632 protected:
633 bool subtract(int eqn1, equation &e1, int l1, int lors1,
634 int hirs1, int eqn2, equation &e2, int *pl2,
635 int *plors2, int *phirs2, int verbose_level);
636 void pruneqn(std::vector<int> &lo, std::vector<int> &hi,
637 int numvar,
638 std::vector<int> &lorhs, std::vector<int> &hirhs,
639 std::vector<equation> &eqn, std::vector<int> &neqn,
640 int numeqn, int verbose_level);
641 void varprune(std::vector<int> &lo, std::vector<int> &hi,
642 std::vector<int> &lorhs, std::vector<int> &hirhs,
643 std::vector<equation> &eqn, std::vector<int> &neqn,
644 int numeqn, int verbose_level);
645 void puteqns(std::vector<int> &lo, std::vector<int> &hi,
646 int numvar,
647 std::vector<int> &lorhs, std::vector<int> &hirhs,
648 std::vector<equation> &eqn, std::vector<int> &neqn,
649 int numeqn);
650 int divideeqns(std::vector<int> &lorhs, std::vector<int> &hirhs,
651 std::vector<equation> &eqn, std::vector<int> &neqn,
652 int numeqn);
653 int gcd(int n1,int n2);
654 void solve(int level,
655 std::vector<int> &alo, std::vector<int> &ahi,
656 std::vector<bool> &aactive, int numvar,
657 std::vector<int> &lorhs, std::vector<int> &hirhs,
658 std::vector<equation> &eqn, std::vector<int> &neqn,
659 int numeqn, int verbose_level);
660 int restrict_variables(int level,
661 std::vector<int> &lo, std::vector<int> &hi,
662 std::vector<bool> &active, int numvar,
663 std::vector<int> &lorhs, std::vector<int> &hirhs,
664 std::vector<equation> &eqn, std::vector<int> &neqn,
665 int numeqn, int &f_restriction_made,
666 int verbose_level);
667 void log_12l(long int current_node, int level);
668
671 std::vector<bool> unitcoeffs;
672 std::vector<bool> active;
674 bool _break;
675
677
678 #ifdef MCKAY_DEBUG
679 std::vector<int> range,split,branch;
681 #endif
682
683 };
684}
685
686
687}}}
688
689
690
691#endif /* ORBITER_SRC_LIB_FOUNDATIONS_SOLVERS_SOLVERS_H_ */
692
693
694
695
696
compact storage of 0/1-data as bitvectors
options for drawing an object of type layered_graph
Definition: graphics.h:457
to describe an activity for a diophantine system from command line arguments
Definition: solvers.h:27
to perform an activity for a diophantine system using diophant_activity_description
Definition: solvers.h:77
void perform_activity(diophant_activity_description *Descr, diophant *Dio, int verbose_level)
void init_from_file(diophant_activity_description *Descr, int verbose_level)
to create a diophantine system from diophant_description
Definition: solvers.h:101
void init(diophant_description *Descr, int verbose_level)
to describe a diophantine system from command line arguments
Definition: solvers.h:125
int read_arguments(int argc, std::string *argv, int verbose_level)
diophantine systems of equations (i.e., linear systems over the integers)
Definition: solvers.h:209
void make_clique_graph_adjacency_matrix(data_structures::bitvector *&Adj, int verbose_level)
Definition: diophant.cpp:4430
void get_solutions(long int *&Sol, int &nb_sol, int verbose_level)
Definition: diophant.cpp:1062
void trivial_row_reductions(int &f_no_solution, int verbose_level)
Definition: diophant.cpp:2427
void make_clique_graph(graph_theory::colored_graph *&CG, int verbose_level)
Definition: diophant.cpp:4478
void init_problem_of_Steiner_type_with_RHS(int nb_rows, int nb_cols, int *Inc, int nb_to_select, int *Rhs, int verbose_level)
Definition: diophant.cpp:375
int solve_all_DLX_with_RHS_and_callback(int f_write_tree, const char *fname_tree, void(*user_callback_solution_found)(int *sol, int len, int nb_sol, void *data), int verbose_level)
Definition: diophant.cpp:1353
void read_xml(std::ifstream &f, char *label, int verbose_level)
Definition: diophant.cpp:3722
void init_RHS(int RHS_value, int verbose_level)
Definition: diophant.cpp:435
void coefficient_values_in_row(int i, int &nb_values, int *&values, int *&multiplicities, int verbose_level)
Definition: diophant.cpp:2571
void project_to_two_equations(diophant *D, int eqn1_idx, int eqn2_idx, int verbose_level)
Definition: diophant.cpp:3629
int solve_first_mckay(int f_once, int verbose_level)
Definition: diophant.cpp:866
int test_solution(int *sol, int len, int verbose_level)
Definition: diophant.cpp:4213
int is_zero_outside(int first, int len, int i)
Definition: diophant.cpp:3334
void project_to_single_equation(diophant *D, int eqn_idx, int verbose_level)
Definition: diophant.cpp:3593
void print_eqn(int i, int f_with_gcd)
Definition: diophant.cpp:711
int solve_all_betten_with_conditions(int verbose_level, int f_max_sol, int max_sol, int f_max_time, int max_time_in_seconds)
Definition: diophant.cpp:1508
int j_fst(int j, int verbose_level)
Definition: diophant.cpp:1852
void draw_partitioned(std::string &fname_base, graphics::layered_graph_draw_options *Draw_options, int f_solution, int *solution, int solution_sz, int verbose_level)
Definition: diophant.cpp:4068
void read_solutions_from_file(std::string &fname_sol, int verbose_level)
Definition: diophant.cpp:1010
int solve_all_mckay(long int &nb_backtrack_nodes, int maxresults, int verbose_level)
Definition: diophant.cpp:1435
int solve_first_mckay_once_option(int f_once, int verbose_level)
Definition: diophant.cpp:4551
void init_clique_finding_problem(int *Adj, int nb_pts, int nb_to_select, int verbose_level)
Definition: diophant.cpp:451
void solve_mckay(const char *label, int maxresults, long int &nb_backtrack_nodes, int &nb_sol, int verbose_level)
Definition: diophant.cpp:2155
int solve_all_DLX_with_RHS(int f_write_tree, const char *fname_tree, int verbose_level)
Definition: diophant.cpp:1279
void init_problem_of_Steiner_type(int nb_rows, int nb_cols, int *Inc, int nb_to_select, int verbose_level)
Definition: diophant.cpp:405
void write_solutions(std::string &fname, int verbose_level)
Definition: diophant.cpp:958
void project(diophant *D, int first, int len, int *&eqn_number, int &nb_eqns_replaced, int *&eqns_replaced, int verbose_level)
Definition: diophant.cpp:3349
void get_solutions_full_length(int *&Sol, int &nb_sol, int verbose_level)
Definition: diophant.cpp:1100
void make_clique_graph_and_save(std::string &clique_graph_fname, int verbose_level)
Definition: diophant.cpp:4504
void draw_as_bitmap(std::string &fname, int f_box_width, int box_width, int bit_depth, int verbose_level)
Definition: diophant.cpp:3974
void write_xml(std::ostream &ost, const char *label)
Definition: diophant.cpp:3682
void init_partition_problem_with_bounds(int *weights, int *bounds, int nb_weights, int target_value, int verbose_level)
Definition: diophant.cpp:345
void split_by_two_equations(int eqn1_idx, int eqn2_idx, int f_solve_case, int solve_case_idx_r, int solve_case_idx_m, int verbose_level)
Definition: diophant.cpp:3456
void project_to_single_equation_and_solve(int max_number_of_coefficients, int verbose_level)
Definition: diophant.cpp:3529
int j_nxt(int j, int verbose_level)
Definition: diophant.cpp:2074
void solve_mckay_override_minrhs_in_inequalities(const char *label, int maxresults, long int &nb_backtrack_nodes, int minrhs, int &nb_sol, int verbose_level)
Definition: diophant.cpp:2171
void eliminate_zero_rows_quick(int verbose_level)
Definition: diophant.cpp:3277
void get_coefficient_matrix(int *&M, int &nb_rows, int &nb_cols, int verbose_level)
Definition: diophant.cpp:2615
void eliminate_zero_rows(int *&eqn_number, int verbose_level)
Definition: diophant.cpp:3284
void join_problems(diophant *D1, diophant *D2, int verbose_level)
Definition: diophant.cpp:239
void draw_it(std::string &fname_base, graphics::layered_graph_draw_options *Draw_options, int verbose_level)
Definition: diophant.cpp:4043
void test_solution_full_length(int *sol, int verbose_level)
Definition: diophant.cpp:1132
std::deque< std::vector< int > > _results
Definition: solvers.h:242
void init_partition_problem(int *weights, int nb_weights, int target_value, int verbose_level)
Definition: diophant.cpp:317
void read_general_format(std::string &fname, int verbose_level)
Definition: diophant.cpp:3049
void get_columns(int *col, int nb_col, data_structures::set_of_sets *&S, int verbose_level)
Definition: diophant.cpp:4300
void write_gurobi_binary_variables(const char *fname)
Definition: diophant.cpp:3939
void test_solution_file(std::string &solution_file, int verbose_level)
Definition: diophant.cpp:4332
void split_by_equation(int eqn_idx, int f_solve_case, int solve_case_idx, int verbose_level)
Definition: diophant.cpp:3388
diophant * trivial_column_reductions(int verbose_level)
Definition: diophant.cpp:2467
void init_var_labels(long int *labels, int verbose_level)
Definition: diophant.cpp:224
void save_in_general_format(std::string &fname, int verbose_level)
Definition: diophant.cpp:2879
description of a problem instance for dancing links solver
Definition: solvers.h:406
int read_arguments(int argc, std::string *argv, int verbose_level)
An implementation of Donald Knuth's dancing links algorithm to solve exact cover problems.
Definition: solvers.h:449
void TransposeAndSolveRHS(int *Data, int nb_rows, int nb_cols, int *RHS, int f_has_type, diophant_equation_type *type, int verbose_level)
void SearchRHS(int k, int verbose_level)
Definition: dlx_solver.cpp:988
void init(dlx_problem_description *Descr, int verbose_level)
Definition: dlx_solver.cpp:98
void TransposeAppendAndSolve(int *Data, int nb_rows, int nb_cols, int verbose_level)
void count_nb_choices(int k, dlx_node *Column)
Definition: dlx_solver.cpp:844
void AppendRowAndSolveRHS(int *Data, int nb_rows, int nb_cols, int *RHS, int f_has_type, diophant_equation_type *type, int verbose_level)
void install_callback_solution_found(void(*callback_solution_found)(int *solution, int len, int nb_sol, void *data), void *callback_solution_found_data)
Definition: dlx_solver.cpp:154
void Create_RHS(int nb_cols, int *RHS, int f_has_type, diophant_equation_type *type, int verbose_level)
Definition: dlx_solver.cpp:450
void AppendRowAndSolve(int *Data, int nb_rows, int nb_cols, int verbose_level)
void Solve_with_RHS(int *RHS, int f_has_type, diophant_equation_type *type, int verbose_level)
Definition: dlx_solver.cpp:348
void(* callback_solution_found)(int *solution, int len, int nb_sol, void *data)
Definition: solvers.h:499
void CreateMatrix(int *Data, int nb_rows, int nb_cols, int verbose_level)
Definition: dlx_solver.cpp:532
solves diophantine systems according to McKay
Definition: solvers.h:616
void possolve(std::vector< int > &lo, std::vector< int > &hi, std::vector< equation > &eqn, std::vector< int > &lorhs, std::vector< int > &hirhs, std::vector< int > &neqn, int numeqn, int numvar, int verbose_level)
Definition: mckay.cpp:66
void Init(diophant *lgs, const char *label, int aEqnAnz, int aVarAnz)
Definition: mckay.cpp:41
void varprune(std::vector< int > &lo, std::vector< int > &hi, std::vector< int > &lorhs, std::vector< int > &hirhs, std::vector< equation > &eqn, std::vector< int > &neqn, int numeqn, int verbose_level)
Definition: mckay.cpp:235
void pruneqn(std::vector< int > &lo, std::vector< int > &hi, int numvar, std::vector< int > &lorhs, std::vector< int > &hirhs, std::vector< equation > &eqn, std::vector< int > &neqn, int numeqn, int verbose_level)
Definition: mckay.cpp:185
void puteqns(std::vector< int > &lo, std::vector< int > &hi, int numvar, std::vector< int > &lorhs, std::vector< int > &hirhs, std::vector< equation > &eqn, std::vector< int > &neqn, int numeqn)
Definition: mckay.cpp:275
int restrict_variables(int level, std::vector< int > &lo, std::vector< int > &hi, std::vector< bool > &active, int numvar, std::vector< int > &lorhs, std::vector< int > &hirhs, std::vector< equation > &eqn, std::vector< int > &neqn, int numeqn, int &f_restriction_made, int verbose_level)
Definition: mckay.cpp:699
int divideeqns(std::vector< int > &lorhs, std::vector< int > &hirhs, std::vector< equation > &eqn, std::vector< int > &neqn, int numeqn)
Definition: mckay.cpp:319
bool subtract(int eqn1, equation &e1, int l1, int lors1, int hirs1, int eqn2, equation &e2, int *pl2, int *plors2, int *phirs2, int verbose_level)
Definition: mckay.cpp:131
void log_12l(long int current_node, int level)
Definition: mckay.cpp:1056
void solve(int level, std::vector< int > &alo, std::vector< int > &ahi, std::vector< bool > &aactive, int numvar, std::vector< int > &lorhs, std::vector< int > &hirhs, std::vector< equation > &eqn, std::vector< int > &neqn, int numeqn, int verbose_level)
Definition: mckay.cpp:378
the orbiter library for the classification of combinatorial objects
internal class for the dancing links exact cover algorithm
Definition: solvers.h:567
a term in a diophantine system of type tMCKAY
Definition: solvers.h:611