ccnr.cc 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738
  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. aspiration = true;
  139. }
  140. /******************************the top function******************************/
  141. /**********************************build instance*******************************/
  142. bool ls_solver::make_space()
  143. {
  144. if(0==_num_vars || 0==_num_clauses) {cout<<"The formula size is zero. You may forgot to read the formula."<<endl; return false;}
  145. // _vars.reserve(_num_vars+_additional_len);
  146. // _clauses.reserve(_num_clauses+_additional_len);
  147. // _solution.reserve(_num_vars+_additional_len);
  148. // _index_in_unsat_clauses.reserve(_num_clauses+_additional_len);
  149. // _index_in_unsat_vars.reserve(_num_vars+_additional_len);
  150. _vars.resize(_num_vars+_additional_len);
  151. _clauses.resize(_num_clauses+_additional_len);
  152. _solution.resize(_num_vars+_additional_len);
  153. _index_in_unsat_clauses.resize(_num_clauses+_additional_len);
  154. _index_in_unsat_vars.resize(_num_vars+_additional_len);
  155. return true;
  156. }
  157. void ls_solver::build_neighborhood()
  158. {
  159. int i, j, count;
  160. int v, c;
  161. vector<bool> neighbor_flag(_num_vars+_additional_len);
  162. for (j=0; j<neighbor_flag.size(); ++j ) {neighbor_flag[j] = 0;}
  163. for (v=1; v <= _num_vars; ++v)
  164. {
  165. variable * vp = &(_vars[v]);
  166. //vector<lit>& vp2=_vars[v].literals;
  167. for (lit lv : vp->literals)
  168. {
  169. c = lv.clause_num;
  170. for (lit lc : _clauses[c].literals)
  171. {
  172. if (!neighbor_flag[lc.var_num] && lc.var_num!=v)
  173. {
  174. neighbor_flag[lc.var_num] = 1;
  175. vp->neighbor_var_nums.push_back(lc.var_num);
  176. }
  177. }
  178. }
  179. for (j=0; j<vp->neighbor_var_nums.size(); ++j) {neighbor_flag[vp->neighbor_var_nums[j]] = 0;}
  180. }
  181. }
  182. bool ls_solver::build_instance(string inst)
  183. {
  184. string line;
  185. istringstream iss;
  186. int c, v, i;
  187. int cur_lit;
  188. bool lit_redundent, clause_tautology;
  189. string tempstr1, tempstr2;
  190. vector<int> temp_clause;
  191. ifstream fin(inst.c_str());
  192. if(!fin.is_open()) return false;
  193. while(getline(fin, line))
  194. {
  195. if(line.substr(0, 1) == "c") continue;
  196. else if(line.substr(0, 1) == "p")
  197. {
  198. //reassign_istringstream(iss, line);
  199. iss.clear();
  200. iss.str(line);
  201. iss.seekg(0, ios::beg);
  202. iss >> tempstr1 >> tempstr2 >> _num_vars >> _num_clauses;
  203. break;
  204. }
  205. }
  206. if(!make_space()) return false;
  207. //read clauses, each at a time
  208. for(c=0; c < _num_clauses; )
  209. {
  210. clause_tautology = false;
  211. temp_clause.clear();
  212. vector<int>().swap(temp_clause);
  213. fin>>cur_lit;
  214. while(cur_lit!=0)
  215. {
  216. if(!clause_tautology)
  217. {
  218. lit_redundent = false;
  219. for(int item : temp_clause)
  220. {
  221. if(cur_lit == item) {lit_redundent = true; break;}
  222. else if(cur_lit == -item) {clause_tautology = true; break;}
  223. }
  224. if(!lit_redundent)
  225. {
  226. temp_clause.push_back(cur_lit);
  227. }
  228. }
  229. fin>>cur_lit;
  230. }
  231. if(!clause_tautology)
  232. {
  233. for(int item : temp_clause)
  234. {
  235. _clauses[c].literals.push_back( lit(item,c) );
  236. }
  237. c++;
  238. }
  239. else
  240. {
  241. _num_clauses--;
  242. temp_clause.clear();
  243. vector<int>().swap(temp_clause);
  244. }
  245. }
  246. fin.close();
  247. /********finish reading the input file****************/
  248. //build variables data structure
  249. for (c=0; c < _num_clauses; c++)
  250. {
  251. for(lit item: _clauses[c].literals)
  252. {
  253. v = item.var_num;
  254. _vars[v].literals.push_back(item);
  255. }
  256. }
  257. build_neighborhood();
  258. return true;
  259. }
  260. /****************local search**********************************/
  261. //bool *return value modified
  262. bool ls_solver::local_search( const vector<bool>* init_solution)
  263. {
  264. bool result = false;
  265. int flipv;
  266. _random_gen.seed(_random_seed);
  267. _best_found_cost = _num_clauses;
  268. _best_cost_time = 0;
  269. for(int t=0; t < _max_tries; t++)
  270. {
  271. initialize(init_solution);
  272. if (0 == _unsat_clauses.size()) {result = true;break;} //1
  273. for (_step=0; _step < _max_steps; _step++)
  274. {
  275. flipv = pick_var();
  276. flip(flipv);
  277. if (_unsat_clauses.size() < _best_found_cost) {_best_found_cost = _unsat_clauses.size(); _best_cost_time = get_runtime();}
  278. if (0 == _unsat_clauses.size()) {result = true;break;} //1
  279. if (get_runtime() > _time_limit) {result = false;break;} //0
  280. }
  281. if (0 == _unsat_clauses.size()) {result = true;break;}//1
  282. if (get_runtime() > _time_limit) {result = false;break;}//0
  283. }
  284. return result;
  285. }
  286. /**********************************initialize*******************************/
  287. void ls_solver::clear_prev_data()
  288. {
  289. _unsat_clauses.clear();
  290. vector<int>().swap(_unsat_clauses);
  291. _ccd_vars.clear();
  292. vector<int>().swap(_ccd_vars);
  293. _unsat_vars.clear();
  294. vector<int>().swap(_unsat_vars);
  295. for (int &item : _index_in_unsat_clauses) item = 0;
  296. for (int &item : _index_in_unsat_vars) item = 0;
  297. }
  298. void ls_solver::initialize(const vector<bool>* init_solution)
  299. {
  300. int v, c;
  301. clear_prev_data();
  302. if (!init_solution)
  303. {
  304. //default random generation
  305. //cout<<"c using random initial solution"<<endl;
  306. for(v=1; v <= _num_vars; v++)
  307. {
  308. _solution[v] = (_random_gen.next(2)==0 ? 0 :1);
  309. }
  310. }
  311. else
  312. {
  313. //cout<<"ok\n";
  314. 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);}
  315. for(v=1; v <= _num_vars; v++)
  316. {
  317. _solution[v] = init_solution->at(v-1);
  318. }
  319. //cout<<"ok1\n";
  320. }
  321. //unsat_appears, will be updated when calling unsat_a_clause function.
  322. for(v=1; v <= _num_vars; v++) { _vars[v].unsat_appear = 0;}
  323. //initialize data structure of clauses according to init solution
  324. for(c=0; c < _num_clauses; c++)
  325. {
  326. _clauses[c].sat_count = 0;
  327. _clauses[c].sat_var = -1;
  328. _clauses[c].weight = 1;
  329. for (lit l : _clauses[c].literals)
  330. {
  331. if ( _solution[l.var_num] == l.sense)
  332. {
  333. _clauses[c].sat_count++;
  334. _clauses[c].sat_var = l.var_num;
  335. }
  336. }
  337. if (0 == _clauses[c].sat_count) {unsat_a_clause(c);}
  338. }
  339. _avg_clause_weight = 1;
  340. _delta_total_clause_weight = 0;
  341. initialize_variable_datas();
  342. }
  343. void ls_solver::initialize_variable_datas()
  344. {
  345. int v, c, i;
  346. variable * vp;
  347. //scores
  348. for(v=1; v <= _num_vars; v++)
  349. {
  350. vp = &(_vars[v]);
  351. vp->score = 0;
  352. for( lit l : vp->literals)
  353. {
  354. c = l.clause_num;
  355. if(0 == _clauses[c].sat_count) {vp->score += _clauses[c].weight;}
  356. else if(1 == _clauses[c].sat_count && l.sense == _solution[l.var_num]) {vp->score -= _clauses[c].weight;}
  357. }
  358. }
  359. //last flip step
  360. for(v=1; v <= _num_vars; v++) { _vars[v].last_flip_step = 0;}
  361. //cc datas
  362. for(v=1; v <= _num_vars; v++)
  363. {
  364. vp = &(_vars[v]);
  365. vp->cc_value = 1;
  366. if (vp->score>0) //&&_vars[v].cc_value==1
  367. {
  368. _ccd_vars.push_back(v);
  369. vp->is_in_ccd_vars = 1;
  370. }
  371. else {vp->is_in_ccd_vars = 0;}
  372. }
  373. //the virtual var 0
  374. vp = &(_vars[0]);
  375. vp->score = vp->cc_value = vp->is_in_ccd_vars = vp->last_flip_step = 0;
  376. }
  377. /*********************end initialize functions*********************************/
  378. /**********************pick variable*******************************************/
  379. int ls_solver::pick_var()
  380. {
  381. int i,k,c,v;
  382. int best_var=0, best_score;
  383. lit* clause_c;
  384. if (_ccd_vars.size()>0)
  385. {
  386. best_var = _ccd_vars[0];
  387. for (int v : _ccd_vars)
  388. {
  389. if (_vars[v].score > _vars[best_var].score) {best_var = v;}
  390. else if(_vars[v].score == _vars[best_var].score && _vars[v].last_flip_step < _vars[best_var].last_flip_step) {best_var = v;}
  391. }
  392. return best_var;
  393. }
  394. //Aspriation Mode
  395. //----------------------------------------
  396. if(aspiration){
  397. _aspiration_score=_avg_clause_weight;
  398. for(i=0;i<_unsat_vars.size();++i)
  399. {
  400. v=_unsat_vars[i];
  401. if(_vars[v].score>_aspiration_score)
  402. {
  403. best_var=v;
  404. break;
  405. }
  406. }
  407. for(++i;i<_unsat_vars.size();++i)
  408. {
  409. v=_unsat_vars[i];
  410. if(_vars[v].score>_vars[best_var].score) best_var=v;
  411. else if(_vars[v].score==_vars[best_var].score && _vars[v].last_flip_step<_vars[best_var].last_flip_step) best_var=v;
  412. }
  413. if(best_var!=0) return best_var;
  414. }
  415. //=========================================
  416. /**Diversification Mode**/
  417. update_clause_weights();
  418. /*focused random walk*/
  419. c = _unsat_clauses[_random_gen.next(_unsat_clauses.size())];
  420. clause * cp = &(_clauses[c]);
  421. best_var = cp->literals[0].var_num;
  422. for (k=1; k < cp->literals.size(); k++)
  423. {
  424. v = cp->literals[k].var_num;
  425. if (_vars[v].score > _vars[best_var].score) {best_var = v;}
  426. else if(_vars[v].score == _vars[best_var].score && _vars[v].last_flip_step < _vars[best_var].last_flip_step) {best_var = v;}
  427. }
  428. return best_var;
  429. }
  430. /************************flip and update functions*****************************/
  431. void ls_solver::flip(int flipv)
  432. {
  433. int c, v;
  434. lit* clause_c;
  435. lit* p;
  436. lit* q;
  437. _solution[flipv] = 1-_solution[flipv];
  438. int org_flipv_score = _vars[flipv].score;
  439. for (lit l : _vars[flipv].literals)
  440. {
  441. clause * cp = &(_clauses[l.clause_num]);
  442. if (_solution[flipv] == l.sense)
  443. {
  444. cp->sat_count++;
  445. if (1 == cp->sat_count)
  446. {
  447. sat_a_clause(l.clause_num);
  448. cp->sat_var = flipv;
  449. for (lit lc : cp->literals) {_vars[lc.var_num].score -= cp->weight;}
  450. }
  451. else if (2 == cp->sat_count) {_vars[cp->sat_var].score += cp->weight;}
  452. }
  453. else
  454. {
  455. cp->sat_count--;
  456. if (0 == cp->sat_count)
  457. {
  458. unsat_a_clause(l.clause_num);
  459. for (lit lc : cp->literals) {_vars[lc.var_num].score += cp->weight;}
  460. }
  461. else if (1 == cp->sat_count)
  462. {
  463. for (lit lc : cp->literals)
  464. {
  465. if (_solution[lc.var_num]==lc.sense)
  466. {
  467. _vars[lc.var_num].score-= cp->weight;
  468. cp->sat_var = lc.var_num;
  469. break;
  470. }
  471. }
  472. }
  473. }
  474. }
  475. _vars[flipv].score = -org_flipv_score;
  476. _vars[flipv].last_flip_step = _step;
  477. //update cc_values
  478. update_cc_after_flip(flipv);
  479. }
  480. void ls_solver::update_cc_after_flip(int flipv)
  481. {
  482. int index, v, last_item;
  483. variable * vp = &(_vars[flipv]);
  484. vp->cc_value = 0;
  485. for (index=_ccd_vars.size()-1; index>=0; index--)
  486. {
  487. v = _ccd_vars[index];
  488. if (_vars[v].score<=0)
  489. {
  490. last_item = _ccd_vars.back();
  491. _ccd_vars.pop_back();
  492. _ccd_vars[index]=last_item;
  493. _vars[v].is_in_ccd_vars = 0;
  494. }
  495. }
  496. //update all flipv's neighbor's cc to be 1
  497. for (int v : vp->neighbor_var_nums)
  498. {
  499. _vars[v].cc_value = 1;
  500. if (_vars[v].score>0 && !(_vars[v].is_in_ccd_vars))
  501. {
  502. _ccd_vars.push_back(v);
  503. _vars[v].is_in_ccd_vars = 1;
  504. }
  505. }
  506. }
  507. /**********************end flip and update functions***************************/
  508. /*********************functions for basic operations***************************/
  509. void ls_solver::sat_a_clause(int the_clause)
  510. {
  511. int index,last_item;
  512. //use the position of the clause to store the last unsat clause in stack
  513. last_item = _unsat_clauses.back();
  514. _unsat_clauses.pop_back();
  515. index = _index_in_unsat_clauses[the_clause];
  516. _unsat_clauses[index] = last_item;
  517. _index_in_unsat_clauses[last_item] = index;
  518. //update unsat_appear and unsat_vars
  519. for (lit l : _clauses[the_clause].literals)
  520. {
  521. _vars[l.var_num].unsat_appear--;
  522. if (0 == _vars[l.var_num].unsat_appear)
  523. {
  524. last_item = _unsat_vars.back();
  525. _unsat_vars.pop_back();
  526. index = _index_in_unsat_vars[l.var_num];
  527. _unsat_vars[index] = last_item;
  528. _index_in_unsat_vars[last_item] = index;
  529. }
  530. }
  531. }
  532. void ls_solver::unsat_a_clause(int the_clause)
  533. {
  534. _index_in_unsat_clauses[the_clause] = _unsat_clauses.size();
  535. _unsat_clauses.push_back(the_clause);
  536. //update unsat_appear and unsat_vars
  537. for (lit l : _clauses[the_clause].literals)
  538. {
  539. _vars[l.var_num].unsat_appear++;
  540. if (1 == _vars[l.var_num].unsat_appear)
  541. {
  542. _index_in_unsat_vars[l.var_num] = _unsat_vars.size();
  543. _unsat_vars.push_back(l.var_num);
  544. }
  545. }
  546. }
  547. /************************clause weighting********************************/
  548. void ls_solver::update_clause_weights()
  549. {
  550. for (int c : _unsat_clauses) {_clauses[c].weight++;}
  551. for (int v : _unsat_vars)
  552. {
  553. _vars[v].score += _vars[v].unsat_appear;
  554. if (_vars[v].score>0 && 1==_vars[v].cc_value && !(_vars[v].is_in_ccd_vars))
  555. {
  556. _ccd_vars.push_back(v);
  557. _vars[v].is_in_ccd_vars = 1;
  558. }
  559. }
  560. _delta_total_clause_weight += _unsat_clauses.size();
  561. if (_delta_total_clause_weight >= _num_clauses)
  562. {
  563. _avg_clause_weight += 1;
  564. _delta_total_clause_weight -= _num_clauses;
  565. if (_avg_clause_weight > _swt_threshold) {smooth_clause_weights();}
  566. }
  567. }
  568. void ls_solver::smooth_clause_weights()
  569. {
  570. int v,c;
  571. for(v=1; v <= _num_vars; v++) { _vars[v].score=0;}
  572. int scale_avg = _avg_clause_weight * _swt_q;
  573. _avg_clause_weight = 0;
  574. _delta_total_clause_weight=0;
  575. clause * cp;
  576. for (c=0; c < _num_clauses; ++c)
  577. {
  578. cp = &(_clauses[c]);
  579. cp->weight = cp->weight * _swt_p + scale_avg;
  580. if (cp->weight<1) cp->weight=1;
  581. _delta_total_clause_weight += cp->weight;
  582. if (_delta_total_clause_weight >= _num_clauses)
  583. {
  584. _avg_clause_weight += 1;
  585. _delta_total_clause_weight -= _num_clauses;
  586. }
  587. if (0==cp->sat_count)
  588. {
  589. for (lit l : cp->literals) {_vars[l.var_num].score += cp->weight;}
  590. }
  591. else if (1==cp->sat_count) {_vars[cp->sat_var].score -= cp->weight;}
  592. }
  593. //reset ccd_vars
  594. _ccd_vars.clear();
  595. vector<int>().swap(_ccd_vars);
  596. variable * vp;
  597. for(v=1; v <= _num_vars; v++)
  598. {
  599. vp = &(_vars[v]);
  600. if (vp->score>0 && 1==vp->cc_value)
  601. {
  602. _ccd_vars.push_back(v);
  603. vp->is_in_ccd_vars = 1;
  604. }
  605. else {vp->is_in_ccd_vars = 0;}
  606. }
  607. }
  608. /***parse parameters*****************/
  609. bool ls_solver::parse_arguments(int argc, char ** argv)
  610. {
  611. bool flag_inst = false;
  612. for (int i=1; i<argc; i++)
  613. {
  614. if(strcmp(argv[i],"-inst")==0)
  615. {
  616. i++;
  617. if(i>=argc) return false;
  618. _inst_file = argv[i];
  619. flag_inst = true;
  620. continue;
  621. }
  622. else if(strcmp(argv[i],"-seed")==0)
  623. {
  624. i++;
  625. if(i>=argc) return false;
  626. sscanf(argv[i], "%d", &_random_seed);
  627. continue;
  628. }
  629. }
  630. if (flag_inst) return true;
  631. else return false;
  632. }
  633. /*****print solutions*****************/
  634. void ls_solver::print_solution(bool need_verify)
  635. {
  636. if (0==get_cost()) cout<<"s SATISFIABLE"<<endl;
  637. else cout<<"s UNKNOWN"<<endl;
  638. bool sat_flag = false;
  639. if (need_verify)
  640. {
  641. for (int c=0; c < _num_clauses; c++)
  642. {
  643. sat_flag = false;
  644. for (lit l : _clauses[c].literals)
  645. {
  646. if (_solution[l.var_num] == l.sense) {sat_flag = true; break; }
  647. }
  648. if (!sat_flag) {cout<<"c Error: verify error in clause "<<c<<endl; return;}
  649. }
  650. cout<<"c Verified."<<endl;
  651. }
  652. cout<<"v";
  653. for (int v=1; v <= _num_vars; v++)
  654. {
  655. cout<<' ';
  656. if (_solution[v]==0) cout<<'-';
  657. cout<<v;
  658. }
  659. cout<<endl;
  660. }
  661. void ls_solver::simple_print()
  662. {
  663. cout<<'\t'<<_best_found_cost<<'\t'<<_best_cost_time<<endl;
  664. }
  665. //=========================
  666. // bool callUnCom(string inst){
  667. // class ls_solver ccnr;
  668. // start_timing();
  669. // //string inst = argv[1];
  670. // int ret = ccnr.build_instance(inst);
  671. // if (!ret) { cout << "Invalid filename: " << inst << endl; return 1;}
  672. // vector<bool> * vp = 0; //can set initial solution vector here.
  673. // cout<<inst;
  674. // //初始解在这里处理
  675. // if(ccnr.local_search(vp)){
  676. // ccnr.print_solution();
  677. // }else{
  678. // cout<<"unknown\n";
  679. // }
  680. // return 0;
  681. // }
  682. /*
  683. //main function
  684. int main(int argc, char* argv[]) {
  685. ls_solver ccnr;
  686. start_timing();
  687. string inst = argv[1];
  688. int ret = ccnr.build_instance(inst);
  689. if (!ret) { cout << "Invalid filename: " << argv[1] << endl; return 1;}
  690. vector<bool> * vp = 0; //can set initial solution vector here.
  691. cout<<inst;
  692. //初始解在这里处理
  693. if(ccnr.local_search(vp)){
  694. ccnr.print_solution();
  695. }else{
  696. cout<<"unknown\n";
  697. }
  698. //bool need_verify = true;
  699. //ccnr.print_solution(need_verify);
  700. return 0;
  701. }
  702. //=========================
  703. */