ccnr.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. #ifndef CCNR_H
  2. #define CCNR_H
  3. //heads
  4. #include <vector>
  5. #include <iostream>
  6. #include <fstream>
  7. #include <sstream>
  8. #include <cmath>
  9. #include <cstdlib>
  10. #include <string.h>
  11. #include <stdio.h>
  12. #include <ctime>
  13. #include <vector>
  14. //these two h files are for timing under linux
  15. #include <sys/times.h>
  16. #include <unistd.h>
  17. //---------------------
  18. using namespace std;
  19. //--------------------------
  20. //functions in basis.h & basis.cpp
  21. struct lit {
  22. unsigned char sense:1; //is 1 for true literals, 0 for false literals.
  23. int clause_num:31; //clause num, begin with 0
  24. int var_num; //variable num, begin with 1
  25. lit(int the_lit, int the_clause) {
  26. var_num = abs(the_lit);
  27. clause_num = the_clause;
  28. sense = the_lit>0 ? 1: 0;
  29. }
  30. struct lit& operator^=(const struct lit &l) {
  31. sense ^= l.sense;
  32. clause_num ^= l.clause_num;
  33. var_num ^= l.var_num;
  34. return *this;
  35. }
  36. void reset(void) {
  37. sense = 0;
  38. clause_num = 0;
  39. var_num = 0;
  40. }
  41. bool operator==(const struct lit &l) const {
  42. return sense == l.sense && clause_num == l.clause_num && var_num == l.var_num;
  43. }
  44. bool operator!=(const struct lit &l) const {
  45. return !(*this == l);
  46. }
  47. };
  48. struct variable {
  49. vector<lit> literals;
  50. vector<int> neighbor_var_nums;
  51. long long score;
  52. long long last_flip_step;
  53. int unsat_appear;
  54. bool cc_value;
  55. bool is_in_ccd_vars;
  56. };
  57. struct clause {
  58. vector<lit> literals;
  59. int sat_count;
  60. int sat_var;
  61. long long weight;
  62. };
  63. //timing
  64. static struct tms _start_time;
  65. static double get_runtime() {
  66. struct tms stop;
  67. times(&stop);
  68. return (double) (stop.tms_utime - _start_time.tms_utime +stop.tms_stime - _start_time.tms_stime) / sysconf(_SC_CLK_TCK);
  69. }
  70. static void start_timing() { times(&_start_time);}
  71. //;;;;;;;
  72. //---------------------------
  73. //functions in mersenne.h & mersenne.cpp
  74. class Mersenne {
  75. static const int N = 624;
  76. unsigned int mt[N];
  77. int mti;
  78. public:
  79. Mersenne(); // seed with time-dependent value
  80. Mersenne(int seed); // seed with int value; see comments for the seed() method
  81. Mersenne(unsigned int *array, int count); // seed with array
  82. Mersenne(const Mersenne &copy);
  83. Mersenne &operator=(const Mersenne &copy);
  84. void seed(int s);
  85. void seed(unsigned int *array, int len);
  86. unsigned int next32(); // generates random integer in [0..2^32-1]
  87. int next31(); // generates random integer in [0..2^31-1]
  88. double nextClosed(); // generates random float in [0..1], 2^53 possible values
  89. double nextHalfOpen(); // generates random float in [0..1), 2^53 possible values
  90. double nextOpen(); // generates random float in (0..1), 2^53 possible values
  91. int next(int bound); // generates random integer in [0..bound), bound < 2^31
  92. };
  93. class ls_solver {
  94. public:
  95. ls_solver();
  96. bool parse_arguments(int argc, char ** argv);
  97. bool build_instance(string inst);
  98. bool local_search( const vector<bool>* init_solution = 0);
  99. void print_solution(bool need_verify=0);
  100. void simple_print();
  101. int get_best_cost() {return _best_found_cost;}
  102. void run(int argc, char ** argv);
  103. //private:
  104. //formula
  105. string _inst_file;
  106. vector<variable> _vars;
  107. vector<clause> _clauses;
  108. int _num_vars;
  109. int _num_clauses;
  110. int _additional_len;
  111. //data structure used
  112. vector<int> _unsat_clauses;
  113. vector<int> _index_in_unsat_clauses;
  114. vector<int> _unsat_vars;
  115. vector<int> _index_in_unsat_vars;
  116. vector<int> _ccd_vars;
  117. //solution information
  118. vector<bool> _solution;
  119. int _best_found_cost;
  120. double _best_cost_time;
  121. long long _step;
  122. long long _max_steps;
  123. int _max_tries;
  124. int _time_limit;
  125. //aiding data structure
  126. Mersenne _random_gen; //random generator
  127. int _random_seed;
  128. //algorithmic parameters
  129. ///////////////////////////
  130. bool _aspiration_active;
  131. int _aspiration_score;
  132. //clause weighting
  133. int _swt_threshold;
  134. float _swt_p;//w=w*p+ave_w*q
  135. float _swt_q;
  136. int _avg_clause_weight;
  137. //-------------------
  138. bool aspiration;
  139. //=================
  140. long long _delta_total_clause_weight;
  141. //main functions
  142. void initialize(const vector<bool>* init_solution = 0);
  143. void initialize_variable_datas();
  144. void clear_prev_data();
  145. int pick_var();
  146. void flip(int flipv);
  147. void update_cc_after_flip(int flipv);
  148. void update_clause_weights();
  149. void smooth_clause_weights();
  150. //funcitons for basic operations
  151. void sat_a_clause(int the_clause);
  152. void unsat_a_clause(int the_clause);
  153. //functions for buiding data structure
  154. bool make_space();
  155. void build_neighborhood();
  156. int get_cost() {return _unsat_clauses.size();}
  157. };
  158. #endif