ccnr.cc 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731
  1. #include "ccnr.h"
  2. //-------------------
  3. //in mersenne.cc
  4. const int M = 397;
  5. const unsigned int MATRIX_A = 0x9908b0dfUL;
  6. const unsigned int UPPER_MASK = 0x80000000UL;
  7. const unsigned int LOWER_MASK = 0x7fffffffUL;
  8. //---------------------------
  9. //functions in mersenne.h & mersenne.cpp
  10. /*
  11. Notes on seeding
  12. 1. Seeding with an integer
  13. To avoid different seeds mapping to the same sequence, follow one of
  14. the following two conventions:
  15. a) Only use seeds in 0..2^31-1 (preferred)
  16. b) Only use seeds in -2^30..2^30-1 (2-complement machines only)
  17. 2. Seeding with an array (die-hard seed method)
  18. The length of the array, len, can be arbitrarily high, but for lengths greater
  19. than N, collisions are common. If the seed is of high quality, using more than
  20. N values does not make sense.
  21. */
  22. Mersenne::Mersenne() {
  23. seed((int) std::time(0));
  24. }
  25. Mersenne::Mersenne(int s) {
  26. seed(s);
  27. }
  28. Mersenne::Mersenne(unsigned int *init_key, int key_length) {
  29. seed(init_key, key_length);
  30. }
  31. Mersenne::Mersenne(const Mersenne &copy) {
  32. *this = copy;
  33. }
  34. Mersenne &Mersenne::operator=(const Mersenne &copy) {
  35. for(int i = 0; i < N; i++)
  36. mt[i] = copy.mt[i];
  37. mti = copy.mti;
  38. return *this;
  39. }
  40. void Mersenne::seed(int se) {
  41. unsigned int s = ((unsigned int) (se << 1)) + 1;
  42. // Seeds should not be zero. Other possible solutions (such as s |= 1)
  43. // lead to more confusion, because often-used low seeds like 2 and 3 would
  44. // be identical. This leads to collisions only for rarely used seeds (see
  45. // note in header file).
  46. mt[0] = s & 0xffffffffUL;
  47. for(mti = 1; mti < N; mti++) {
  48. mt[mti] = (1812433253UL * (mt[mti - 1] ^ (mt[mti - 1] >> 30)) + mti);
  49. mt[mti] &= 0xffffffffUL;
  50. }
  51. }
  52. void Mersenne::seed(unsigned int *init_key, int key_length) {
  53. int i = 1, j = 0, k = (N > key_length ? N : key_length);
  54. seed(19650218UL);
  55. for(; k; k--) {
  56. mt[i] = (mt[i] ^ ((mt[i - 1] ^ (mt[i - 1] >> 30)) * 1664525UL)) + init_key[j] + j;
  57. mt[i] &= 0xffffffffUL;
  58. i++;
  59. j++;
  60. if(i >= N) {
  61. mt[0] = mt[N-1];
  62. i = 1;
  63. }
  64. if(j >= key_length)
  65. j = 0;
  66. }
  67. for (k = N - 1; k; k--) {
  68. mt[i] = (mt[i] ^ ((mt[i - 1] ^ (mt[i - 1] >> 30)) * 1566083941UL)) - i;
  69. mt[i] &= 0xffffffffUL;
  70. i++;
  71. if(i >= N) {
  72. mt[0] = mt[N - 1];
  73. i = 1;
  74. }
  75. }
  76. mt[0] = 0x80000000UL;
  77. }
  78. unsigned int Mersenne::next32() {
  79. unsigned int y;
  80. static unsigned int mag01[2] = {0x0UL, MATRIX_A};
  81. if(mti >= N) {
  82. int kk;
  83. for(kk = 0; kk < N - M; kk++) {
  84. y = (mt[kk] & UPPER_MASK) | (mt[kk + 1] & LOWER_MASK);
  85. mt[kk] = mt[kk + M] ^ (y >> 1) ^ mag01[y & 0x1UL];
  86. }
  87. for(; kk < N - 1; kk++) {
  88. y = (mt[kk] & UPPER_MASK) | (mt[kk + 1] & LOWER_MASK);
  89. mt[kk] = mt[kk + (M - N)] ^ (y >> 1) ^ mag01[y & 0x1UL];
  90. }
  91. y = (mt[N - 1] & UPPER_MASK) | (mt[0] & LOWER_MASK);
  92. mt[N - 1] = mt[M - 1] ^ (y >> 1) ^ mag01[y & 0x1UL];
  93. mti = 0;
  94. }
  95. y = mt[mti++];
  96. y ^= (y >> 11);
  97. y ^= (y << 7) & 0x9d2c5680UL;
  98. y ^= (y << 15) & 0xefc60000UL;
  99. y ^= (y >> 18);
  100. return y;
  101. }
  102. int Mersenne::next31() {
  103. return (int) (next32() >> 1);
  104. }
  105. double Mersenne::nextClosed() {
  106. unsigned int a = next32() >> 5, b = next32() >> 6;
  107. return (a * 67108864.0 + b) * (1.0/9007199254740991.0);
  108. }
  109. double Mersenne::nextHalfOpen() {
  110. unsigned int a = next32() >> 5, b = next32() >> 6;
  111. return (a * 67108864.0 + b) * (1.0/9007199254740992.0);
  112. }
  113. double Mersenne::nextOpen() {
  114. unsigned int a = next32() >> 5, b = next32() >> 6;
  115. return (0.5 + a * 67108864.0 + b) * (1.0/9007199254740991.0);
  116. }
  117. int Mersenne::next(int bound) {
  118. unsigned int value;
  119. do {
  120. value = next31();
  121. } while(value + (unsigned int) bound >= 0x80000000UL);
  122. // Just using modulo doesn't lead to uniform distribution. This does.
  123. return (int) (value % bound);
  124. }
  125. //functions in ls.cpp & ls.h
  126. //-----------------------
  127. //constructor with default setting.
  128. ls_solver::ls_solver()
  129. {
  130. _additional_len = 10;
  131. _max_tries = 1;//100
  132. _max_steps = 20000000; //2 0000 0000
  133. _random_seed = 1;
  134. _time_limit = 3000;
  135. _swt_threshold = 50;
  136. _swt_p = 0.3;
  137. _swt_q = 0.7;
  138. }
  139. /******************************the top function******************************/
  140. /**********************************build instance*******************************/
  141. bool ls_solver::make_space()
  142. {
  143. if(0==_num_vars || 0==_num_clauses) {cout<<"The formula size is zero. You may forgot to read the formula."<<endl; return false;}
  144. // _vars.reserve(_num_vars+_additional_len);
  145. // _clauses.reserve(_num_clauses+_additional_len);
  146. // _solution.reserve(_num_vars+_additional_len);
  147. // _index_in_unsat_clauses.reserve(_num_clauses+_additional_len);
  148. // _index_in_unsat_vars.reserve(_num_vars+_additional_len);
  149. _vars.resize(_num_vars+_additional_len);
  150. _clauses.resize(_num_clauses+_additional_len);
  151. _solution.resize(_num_vars+_additional_len);
  152. _index_in_unsat_clauses.resize(_num_clauses+_additional_len);
  153. _index_in_unsat_vars.resize(_num_vars+_additional_len);
  154. return true;
  155. }
  156. void ls_solver::build_neighborhood()
  157. {
  158. int i, j, count;
  159. int v, c;
  160. vector<bool> neighbor_flag(_num_vars+_additional_len);
  161. for (j=0; j<neighbor_flag.size(); ++j ) {neighbor_flag[j] = 0;}
  162. for (v=1; v <= _num_vars; ++v)
  163. {
  164. variable * vp = &(_vars[v]);
  165. //vector<lit>& vp2=_vars[v].literals;
  166. for (lit lv : vp->literals)
  167. {
  168. c = lv.clause_num;
  169. for (lit lc : _clauses[c].literals)
  170. {
  171. if (!neighbor_flag[lc.var_num] && lc.var_num!=v)
  172. {
  173. neighbor_flag[lc.var_num] = 1;
  174. vp->neighbor_var_nums.push_back(lc.var_num);
  175. }
  176. }
  177. }
  178. for (j=0; j<vp->neighbor_var_nums.size(); ++j) {neighbor_flag[vp->neighbor_var_nums[j]] = 0;}
  179. }
  180. }
  181. bool ls_solver::build_instance(string inst)
  182. {
  183. string line;
  184. istringstream iss;
  185. int c, v, i;
  186. int cur_lit;
  187. bool lit_redundent, clause_tautology;
  188. string tempstr1, tempstr2;
  189. vector<int> temp_clause;
  190. ifstream fin(inst.c_str());
  191. if(!fin.is_open()) return false;
  192. while(getline(fin, line))
  193. {
  194. if(line.substr(0, 1) == "c") continue;
  195. else if(line.substr(0, 1) == "p")
  196. {
  197. //reassign_istringstream(iss, line);
  198. iss.clear();
  199. iss.str(line);
  200. iss.seekg(0, ios::beg);
  201. iss >> tempstr1 >> tempstr2 >> _num_vars >> _num_clauses;
  202. break;
  203. }
  204. }
  205. if(!make_space()) return false;
  206. //read clauses, each at a time
  207. for(c=0; c < _num_clauses; )
  208. {
  209. clause_tautology = false;
  210. temp_clause.clear();
  211. vector<int>().swap(temp_clause);
  212. fin>>cur_lit;
  213. while(cur_lit!=0)
  214. {
  215. if(!clause_tautology)
  216. {
  217. lit_redundent = false;
  218. for(int item : temp_clause)
  219. {
  220. if(cur_lit == item) {lit_redundent = true; break;}
  221. else if(cur_lit == -item) {clause_tautology = true; break;}
  222. }
  223. if(!lit_redundent)
  224. {
  225. temp_clause.push_back(cur_lit);
  226. }
  227. }
  228. fin>>cur_lit;
  229. }
  230. if(!clause_tautology)
  231. {
  232. for(int item : temp_clause)
  233. {
  234. _clauses[c].literals.push_back( lit(item,c) );
  235. }
  236. c++;
  237. }
  238. else
  239. {
  240. _num_clauses--;
  241. temp_clause.clear();
  242. vector<int>().swap(temp_clause);
  243. }
  244. }
  245. fin.close();
  246. /********finish reading the input file****************/
  247. //build variables data structure
  248. for (c=0; c < _num_clauses; c++)
  249. {
  250. for(lit item: _clauses[c].literals)
  251. {
  252. v = item.var_num;
  253. _vars[v].literals.push_back(item);
  254. }
  255. }
  256. build_neighborhood();
  257. return true;
  258. }
  259. /****************local search**********************************/
  260. //bool *return value modified
  261. bool ls_solver::local_search( const vector<bool>* init_solution)
  262. {
  263. bool result = false;
  264. int flipv;
  265. _random_gen.seed(_random_seed);
  266. _best_found_cost = _num_clauses;
  267. _best_cost_time = 0;
  268. for(int t=0; t < _max_tries; t++)
  269. {
  270. initialize(init_solution);
  271. if (0 == _unsat_clauses.size()) {result = true;break;} //1
  272. for (_step=0; _step < _max_steps; _step++)
  273. {
  274. flipv = pick_var();
  275. flip(flipv);
  276. if (_unsat_clauses.size() < _best_found_cost) {_best_found_cost = _unsat_clauses.size(); _best_cost_time = get_runtime();}
  277. if (0 == _unsat_clauses.size()) {result = true;break;} //1
  278. if (get_runtime() > _time_limit) {result = false;break;} //0
  279. }
  280. if (0 == _unsat_clauses.size()) {result = true;break;}//1
  281. if (get_runtime() > _time_limit) {result = false;break;}//0
  282. }
  283. return result;
  284. }
  285. /**********************************initialize*******************************/
  286. void ls_solver::clear_prev_data()
  287. {
  288. _unsat_clauses.clear();
  289. vector<int>().swap(_unsat_clauses);
  290. _ccd_vars.clear();
  291. vector<int>().swap(_ccd_vars);
  292. _unsat_vars.clear();
  293. vector<int>().swap(_unsat_vars);
  294. for (int &item : _index_in_unsat_clauses) item = 0;
  295. for (int &item : _index_in_unsat_vars) item = 0;
  296. }
  297. void ls_solver::initialize(const vector<bool>* init_solution)
  298. {
  299. int v, c;
  300. clear_prev_data();
  301. if (!init_solution)
  302. {
  303. //default random generation
  304. //cout<<"c using random initial solution"<<endl;
  305. for(v=1; v <= _num_vars; v++)
  306. {
  307. _solution[v] = (_random_gen.next(2)==0 ? 0 :1);
  308. }
  309. }
  310. else
  311. {
  312. //cout<<"ok\n";
  313. if (init_solution->size()!=_num_vars) {cout<<"c Error: the init solution's size is not equal to the number of variables."<<endl; exit(0);}
  314. for(v=1; v <= _num_vars; v++)
  315. {
  316. _solution[v] = init_solution->at(v-1);
  317. }
  318. //cout<<"ok1\n";
  319. }
  320. //unsat_appears, will be updated when calling unsat_a_clause function.
  321. for(v=1; v <= _num_vars; v++) { _vars[v].unsat_appear = 0;}
  322. //initialize data structure of clauses according to init solution
  323. for(c=0; c < _num_clauses; c++)
  324. {
  325. _clauses[c].sat_count = 0;
  326. _clauses[c].sat_var = -1;
  327. _clauses[c].weight = 1;
  328. for (lit l : _clauses[c].literals)
  329. {
  330. if ( _solution[l.var_num] == l.sense)
  331. {
  332. _clauses[c].sat_count++;
  333. _clauses[c].sat_var = l.var_num;
  334. }
  335. }
  336. if (0 == _clauses[c].sat_count) {unsat_a_clause(c);}
  337. }
  338. _avg_clause_weight = 1;
  339. _delta_total_clause_weight = 0;
  340. initialize_variable_datas();
  341. }
  342. void ls_solver::initialize_variable_datas()
  343. {
  344. int v, c, i;
  345. variable * vp;
  346. //scores
  347. for(v=1; v <= _num_vars; v++)
  348. {
  349. vp = &(_vars[v]);
  350. vp->score = 0;
  351. for( lit l : vp->literals)
  352. {
  353. c = l.clause_num;
  354. if(0 == _clauses[c].sat_count) {vp->score += _clauses[c].weight;}
  355. else if(1 == _clauses[c].sat_count && l.sense == _solution[l.var_num]) {vp->score -= _clauses[c].weight;}
  356. }
  357. }
  358. //last flip step
  359. for(v=1; v <= _num_vars; v++) { _vars[v].last_flip_step = 0;}
  360. //cc datas
  361. for(v=1; v <= _num_vars; v++)
  362. {
  363. vp = &(_vars[v]);
  364. vp->cc_value = 1;
  365. if (vp->score>0) //&&_vars[v].cc_value==1
  366. {
  367. _ccd_vars.push_back(v);
  368. vp->is_in_ccd_vars = 1;
  369. }
  370. else {vp->is_in_ccd_vars = 0;}
  371. }
  372. //the virtual var 0
  373. vp = &(_vars[0]);
  374. vp->score = vp->cc_value = vp->is_in_ccd_vars = vp->last_flip_step = 0;
  375. }
  376. /*********************end initialize functions*********************************/
  377. /**********************pick variable*******************************************/
  378. int ls_solver::pick_var()
  379. {
  380. int i,k,c,v;
  381. int best_var=0, best_score;
  382. lit* clause_c;
  383. if (_ccd_vars.size()>0)
  384. {
  385. best_var = _ccd_vars[0];
  386. for (int v : _ccd_vars)
  387. {
  388. if (_vars[v].score > _vars[best_var].score) {best_var = v;}
  389. else if(_vars[v].score == _vars[best_var].score && _vars[v].last_flip_step < _vars[best_var].last_flip_step) {best_var = v;}
  390. }
  391. return best_var;
  392. }
  393. //Aspriation Mode
  394. _aspiration_score=_avg_clause_weight;
  395. for(i=0;i<_unsat_vars.size();++i)
  396. {
  397. v=_unsat_vars[i];
  398. if(_vars[v].score>_aspiration_score)
  399. {
  400. best_var=v;
  401. break;
  402. }
  403. }
  404. for(++i;i<_unsat_vars.size();++i)
  405. {
  406. v=_unsat_vars[i];
  407. if(_vars[v].score>_vars[best_var].score) best_var=v;
  408. else if(_vars[v].score==_vars[best_var].score && _vars[v].last_flip_step<_vars[best_var].last_flip_step) best_var=v;
  409. }
  410. if(best_var!=0) return best_var;
  411. /**Diversification Mode**/
  412. update_clause_weights();
  413. /*focused random walk*/
  414. c = _unsat_clauses[_random_gen.next(_unsat_clauses.size())];
  415. clause * cp = &(_clauses[c]);
  416. best_var = cp->literals[0].var_num;
  417. for (k=1; k < cp->literals.size(); k++)
  418. {
  419. v = cp->literals[k].var_num;
  420. if (_vars[v].score > _vars[best_var].score) {best_var = v;}
  421. else if(_vars[v].score == _vars[best_var].score && _vars[v].last_flip_step < _vars[best_var].last_flip_step) {best_var = v;}
  422. }
  423. return best_var;
  424. }
  425. /************************flip and update functions*****************************/
  426. void ls_solver::flip(int flipv)
  427. {
  428. int c, v;
  429. lit* clause_c;
  430. lit* p;
  431. lit* q;
  432. _solution[flipv] = 1-_solution[flipv];
  433. int org_flipv_score = _vars[flipv].score;
  434. for (lit l : _vars[flipv].literals)
  435. {
  436. clause * cp = &(_clauses[l.clause_num]);
  437. if (_solution[flipv] == l.sense)
  438. {
  439. cp->sat_count++;
  440. if (1 == cp->sat_count)
  441. {
  442. sat_a_clause(l.clause_num);
  443. cp->sat_var = flipv;
  444. for (lit lc : cp->literals) {_vars[lc.var_num].score -= cp->weight;}
  445. }
  446. else if (2 == cp->sat_count) {_vars[cp->sat_var].score += cp->weight;}
  447. }
  448. else
  449. {
  450. cp->sat_count--;
  451. if (0 == cp->sat_count)
  452. {
  453. unsat_a_clause(l.clause_num);
  454. for (lit lc : cp->literals) {_vars[lc.var_num].score += cp->weight;}
  455. }
  456. else if (1 == cp->sat_count)
  457. {
  458. for (lit lc : cp->literals)
  459. {
  460. if (_solution[lc.var_num]==lc.sense)
  461. {
  462. _vars[lc.var_num].score-= cp->weight;
  463. cp->sat_var = lc.var_num;
  464. break;
  465. }
  466. }
  467. }
  468. }
  469. }
  470. _vars[flipv].score = -org_flipv_score;
  471. _vars[flipv].last_flip_step = _step;
  472. //update cc_values
  473. update_cc_after_flip(flipv);
  474. }
  475. void ls_solver::update_cc_after_flip(int flipv)
  476. {
  477. int index, v, last_item;
  478. variable * vp = &(_vars[flipv]);
  479. vp->cc_value = 0;
  480. for (index=_ccd_vars.size()-1; index>=0; index--)
  481. {
  482. v = _ccd_vars[index];
  483. if (_vars[v].score<=0)
  484. {
  485. last_item = _ccd_vars.back();
  486. _ccd_vars.pop_back();
  487. _ccd_vars[index]=last_item;
  488. _vars[v].is_in_ccd_vars = 0;
  489. }
  490. }
  491. //update all flipv's neighbor's cc to be 1
  492. for (int v : vp->neighbor_var_nums)
  493. {
  494. _vars[v].cc_value = 1;
  495. if (_vars[v].score>0 && !(_vars[v].is_in_ccd_vars))
  496. {
  497. _ccd_vars.push_back(v);
  498. _vars[v].is_in_ccd_vars = 1;
  499. }
  500. }
  501. }
  502. /**********************end flip and update functions***************************/
  503. /*********************functions for basic operations***************************/
  504. void ls_solver::sat_a_clause(int the_clause)
  505. {
  506. int index,last_item;
  507. //use the position of the clause to store the last unsat clause in stack
  508. last_item = _unsat_clauses.back();
  509. _unsat_clauses.pop_back();
  510. index = _index_in_unsat_clauses[the_clause];
  511. _unsat_clauses[index] = last_item;
  512. _index_in_unsat_clauses[last_item] = index;
  513. //update unsat_appear and unsat_vars
  514. for (lit l : _clauses[the_clause].literals)
  515. {
  516. _vars[l.var_num].unsat_appear--;
  517. if (0 == _vars[l.var_num].unsat_appear)
  518. {
  519. last_item = _unsat_vars.back();
  520. _unsat_vars.pop_back();
  521. index = _index_in_unsat_vars[l.var_num];
  522. _unsat_vars[index] = last_item;
  523. _index_in_unsat_vars[last_item] = index;
  524. }
  525. }
  526. }
  527. void ls_solver::unsat_a_clause(int the_clause)
  528. {
  529. _index_in_unsat_clauses[the_clause] = _unsat_clauses.size();
  530. _unsat_clauses.push_back(the_clause);
  531. //update unsat_appear and unsat_vars
  532. for (lit l : _clauses[the_clause].literals)
  533. {
  534. _vars[l.var_num].unsat_appear++;
  535. if (1 == _vars[l.var_num].unsat_appear)
  536. {
  537. _index_in_unsat_vars[l.var_num] = _unsat_vars.size();
  538. _unsat_vars.push_back(l.var_num);
  539. }
  540. }
  541. }
  542. /************************clause weighting********************************/
  543. void ls_solver::update_clause_weights()
  544. {
  545. for (int c : _unsat_clauses) {_clauses[c].weight++;}
  546. for (int v : _unsat_vars)
  547. {
  548. _vars[v].score += _vars[v].unsat_appear;
  549. if (_vars[v].score>0 && 1==_vars[v].cc_value && !(_vars[v].is_in_ccd_vars))
  550. {
  551. _ccd_vars.push_back(v);
  552. _vars[v].is_in_ccd_vars = 1;
  553. }
  554. }
  555. _delta_total_clause_weight += _unsat_clauses.size();
  556. if (_delta_total_clause_weight >= _num_clauses)
  557. {
  558. _avg_clause_weight += 1;
  559. _delta_total_clause_weight -= _num_clauses;
  560. if (_avg_clause_weight > _swt_threshold) {smooth_clause_weights();}
  561. }
  562. }
  563. void ls_solver::smooth_clause_weights()
  564. {
  565. int v,c;
  566. for(v=1; v <= _num_vars; v++) { _vars[v].score=0;}
  567. int scale_avg = _avg_clause_weight * _swt_q;
  568. _avg_clause_weight = 0;
  569. _delta_total_clause_weight=0;
  570. clause * cp;
  571. for (c=0; c < _num_clauses; ++c)
  572. {
  573. cp = &(_clauses[c]);
  574. cp->weight = cp->weight * _swt_p + scale_avg;
  575. if (cp->weight<1) cp->weight=1;
  576. _delta_total_clause_weight += cp->weight;
  577. if (_delta_total_clause_weight >= _num_clauses)
  578. {
  579. _avg_clause_weight += 1;
  580. _delta_total_clause_weight -= _num_clauses;
  581. }
  582. if (0==cp->sat_count)
  583. {
  584. for (lit l : cp->literals) {_vars[l.var_num].score += cp->weight;}
  585. }
  586. else if (1==cp->sat_count) {_vars[cp->sat_var].score -= cp->weight;}
  587. }
  588. //reset ccd_vars
  589. _ccd_vars.clear();
  590. vector<int>().swap(_ccd_vars);
  591. variable * vp;
  592. for(v=1; v <= _num_vars; v++)
  593. {
  594. vp = &(_vars[v]);
  595. if (vp->score>0 && 1==vp->cc_value)
  596. {
  597. _ccd_vars.push_back(v);
  598. vp->is_in_ccd_vars = 1;
  599. }
  600. else {vp->is_in_ccd_vars = 0;}
  601. }
  602. }
  603. /***parse parameters*****************/
  604. bool ls_solver::parse_arguments(int argc, char ** argv)
  605. {
  606. bool flag_inst = false;
  607. for (int i=1; i<argc; i++)
  608. {
  609. if(strcmp(argv[i],"-inst")==0)
  610. {
  611. i++;
  612. if(i>=argc) return false;
  613. _inst_file = argv[i];
  614. flag_inst = true;
  615. continue;
  616. }
  617. else if(strcmp(argv[i],"-seed")==0)
  618. {
  619. i++;
  620. if(i>=argc) return false;
  621. sscanf(argv[i], "%d", &_random_seed);
  622. continue;
  623. }
  624. }
  625. if (flag_inst) return true;
  626. else return false;
  627. }
  628. /*****print solutions*****************/
  629. void ls_solver::print_solution(bool need_verify)
  630. {
  631. if (0==get_cost()) cout<<"s SATISFIABLE"<<endl;
  632. else cout<<"s UNKNOWN"<<endl;
  633. bool sat_flag = false;
  634. if (need_verify)
  635. {
  636. for (int c=0; c < _num_clauses; c++)
  637. {
  638. sat_flag = false;
  639. for (lit l : _clauses[c].literals)
  640. {
  641. if (_solution[l.var_num] == l.sense) {sat_flag = true; break; }
  642. }
  643. if (!sat_flag) {cout<<"c Error: verify error in clause "<<c<<endl; return;}
  644. }
  645. cout<<"c Verified."<<endl;
  646. }
  647. cout<<"v";
  648. for (int v=1; v <= _num_vars; v++)
  649. {
  650. cout<<' ';
  651. if (_solution[v]==0) cout<<'-';
  652. cout<<v;
  653. }
  654. cout<<endl;
  655. }
  656. void ls_solver::simple_print()
  657. {
  658. cout<<'\t'<<_best_found_cost<<'\t'<<_best_cost_time<<endl;
  659. }
  660. //=========================
  661. // bool callUnCom(string inst){
  662. // class ls_solver ccnr;
  663. // start_timing();
  664. // //string inst = argv[1];
  665. // int ret = ccnr.build_instance(inst);
  666. // if (!ret) { cout << "Invalid filename: " << inst << endl; return 1;}
  667. // vector<bool> * vp = 0; //can set initial solution vector here.
  668. // cout<<inst;
  669. // //初始解在这里处理
  670. // if(ccnr.local_search(vp)){
  671. // ccnr.print_solution();
  672. // }else{
  673. // cout<<"unknown\n";
  674. // }
  675. // return 0;
  676. // }
  677. /*
  678. //main function
  679. int main(int argc, char* argv[]) {
  680. ls_solver ccnr;
  681. start_timing();
  682. string inst = argv[1];
  683. int ret = ccnr.build_instance(inst);
  684. if (!ret) { cout << "Invalid filename: " << argv[1] << endl; return 1;}
  685. vector<bool> * vp = 0; //can set initial solution vector here.
  686. cout<<inst;
  687. //初始解在这里处理
  688. if(ccnr.local_search(vp)){
  689. ccnr.print_solution();
  690. }else{
  691. cout<<"unknown\n";
  692. }
  693. //bool need_verify = true;
  694. //ccnr.print_solution(need_verify);
  695. return 0;
  696. }
  697. //=========================
  698. */