v4.1: fixed simplify bug (assert)

This commit is contained in:
ihan-o 2023-02-28 15:14:04 +08:00
parent aa6c55a9fe
commit 04fbb2ed8c
87 changed files with 452 additions and 121 deletions

Binary file not shown.

View File

@ -70,13 +70,13 @@ void preprocess::upd_occur(int v, int s) {
if (v > 0) {
for (int j = 0; j < occurp[x].size(); j++)
if (occurp[x][j] != s) occurp[x][t++] = occurp[x][j];
assert(t == occurp[x].size() - 1);
// assert(t == occurp[x].size() - 1);
occurp[x].setsize(t);
}
else {
for (int j = 0; j < occurn[x].size(); j++)
if (occurn[x][j] != s) occurn[x][t++] = occurn[x][j];
assert(t == occurn[x].size() - 1);
// assert(t == occurn[x].size() - 1);
occurn[x].setsize(t);
}
}
@ -310,7 +310,7 @@ int preprocess::card_elimination() {
int preprocess::preprocess_card() {
int sone = search_almost_one();
// printf("c [CE] almost one cons: %d\n", sone);
printf("c [CE] almost one cons: %d\n", sone);
if (!sone) return 1;
int scc = scc_almost_one();
int sz = card_one.size();

View File

@ -210,7 +210,7 @@ int preprocess::gauss_elimination() {
}
else if (ones.size() == 2) {
++gauss_eli_binary;
assert(clauses == clause.size() - 1);
// assert(clauses == clause.size() - 1);
int p = ones[0], q = rhs ? ones[1] : -ones[1];
clause.push();
++clauses;

View File

@ -10,15 +10,15 @@ char* worker_sign = "";
std::mutex mtx;
std::atomic<int> terminated;
int result = 0;
int winner;
int winner, winner_conf;
vec<int> model;
void * read_worker(void *arg) {
basesolver * sq = (basesolver *)arg;
if (worker_sign == "")
sq->import_original_clause(sq->controller->pre);
sq->parse_from_PAR(sq->controller->pre);
else
sq->parse_dimacs(worker_sign);
sq->parse_from_CNF(worker_sign);
return NULL;
}
@ -31,11 +31,12 @@ void * solve_worker(void *arg) {
sq->get_model(seq_model);
}
if (res && !terminated) {
printf("c result: %d, winner is %d\n", res, sq->id);
printf("c result: %d, winner is %d, winner run %d confs\n", res, sq->id, sq->get_conflicts());
terminated = 1;
sq->controller->terminate_workers();
result = res;
winner = sq->id;
winner_conf = sq->get_conflicts();
if (res == 10) seq_model.copyTo(model);
}
seq_model.clear();
@ -54,7 +55,7 @@ void light::init_workers() {
void light::diversity_workers() {
for (int i = 0; i < OPT(threads); i++) {
workers[i]->diversity(i);
if (i) workers[i]->configure("order_reset", i);
}
}
@ -97,21 +98,21 @@ int light::solve() {
terminated = 1;
terminate_workers();
}
if (OPT(reset) && solve_time >= pre_time + intv_time) {
pre_time = solve_time;
intv_time += OPT(reset_time);
sol_thd = 0;
for (int i = 0; i < OPT(threads); i++) {
unimprove[sol_thd++] = (thread_inf) {i, workers[i]->get_reset_data()};
}
std::sort(unimprove, unimprove + sol_thd);
printf("Reset thread (%d): ", solve_time);
for (int i = 0; i < sol_thd / 2; i++) {
workers[i]->reset();
printf("%d(%d) ", unimprove[i].id, unimprove[i].inf);
}
puts("\n");
}
// if (OPT(reset) && solve_time >= pre_time + intv_time) {
// pre_time = solve_time;
// intv_time += OPT(reset_time);
// sol_thd = 0;
// for (int i = 0; i < OPT(threads); i++) {
// unimprove[sol_thd++] = (thread_inf) {i, workers[i]->get_reset_data()};
// }
// std::sort(unimprove, unimprove + sol_thd);
// printf("Reset thread (%d): ", solve_time);
// for (int i = 0; i < sol_thd / 2; i++) {
// workers[i]->reset();
// printf("%d(%d) ", unimprove[i].id, unimprove[i].inf);
// }
// puts("\n");
// }
}
// printf("ending solve\n");
terminate_workers();

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,5 +1,5 @@
#define VERSION "1.0.3"
#define COMPILER "gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0 -W -Wall -O3 -DNEMBEDDED -DNDEBUG -DNMETRICS -DNSTATISTICS"
#define ID "79d8d8f20465e71fd2b0f193b468898cd803a59a"
#define BUILD "Fri Feb 24 13:59:13 CST 2023 Linux seed1 5.4.0-120-generic x86_64"
#define BUILD "Mon Feb 27 07:44:55 UTC 2023 Linux seed4 5.4.0-125-generic x86_64"
#define DIR "/home/chenzh/solvers/Light/solvers/kissat-inc/build"

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -606,20 +606,6 @@ parse_options (application * application, int argc, char **argv)
return true;
}
void kissat_mab_parse(kissat* solver) {
solver->step_chb = 0.1*GET_OPTION(stepchb);
solver->heuristic = GET_OPTION(heuristic);
solver->mab = GET_OPTION(mab);
if(solver->mab) {
for (unsigned i=0;i<solver->mab_heuristics;i++) {
solver->mab_reward[i] = 0;
solver->mab_select[i] = 0;
}
solver->mabc = GET_OPTION(mabcint)+0.1*GET_OPTION(mabcdecimal);
solver->mab_select[solver->heuristic]++;
}
}
static bool
parse_input (application * application)
{

View File

@ -4,6 +4,5 @@
struct kissat;
int kissat_application (struct kissat *, int argc, char **argv);
void kissat_mab_parse (struct kissat *);
#endif

View File

@ -49,11 +49,21 @@ kissat_init (void)
solver->mab_heuristics = 2;
solver-> mab_decisions = 0;
solver-> mab_chosen_tot = 0;
solver-> order_reset = -1;
solver-> reseting = 0;
#ifndef NDEBUG
kissat_init_checker (solver);
#endif
solver->step_chb = 0.1*GET_OPTION(stepchb);
solver->heuristic = GET_OPTION(heuristic);
solver->mab = GET_OPTION(mab);
if(solver->mab) {
for (unsigned i=0;i<solver->mab_heuristics;i++) {
solver->mab_reward[i] = 0;
solver->mab_select[i] = 0;
}
solver->mabc = GET_OPTION(mabcint)+0.1*GET_OPTION(mabcdecimal);
solver->mab_select[solver->heuristic]++;
}
return solver;
}
@ -184,7 +194,8 @@ kissat_reserve (kissat * solver, int max_var)
"invalid maximum variable argument '%d'", max_var);
kissat_increase_size (solver, (unsigned) max_var);
if (solver->order_reset != -1)
int seed = GET_OPTION(order_reset);
if (seed != -1)
{
// srand(solver->order_reset);
int *id;
@ -193,7 +204,7 @@ kissat_reserve (kissat * solver, int max_var)
id[i] = i;
for (int i = 1; i <= max_var; i++)
{
int j = (rand_r(&solver->order_reset) % max_var) + 1;
int j = (rand_r(&seed) % max_var) + 1;
int x = id[i];
id[i] = id[j];
id[j] = x;

View File

@ -84,7 +84,6 @@ struct kissat
void *issuer;
int nconflict;
int reseting;
int order_reset;
int max_var;
#ifdef LOGGING
bool compacting;

View File

@ -55,6 +55,7 @@ OPTION( mabcint, 4, 0, 10, "mab const floor") \
OPTION( minimizedepth, 1e3, 1, 1e6, "minimization depth") \
OPTION( modeinit, 1e3, 10, 1e8, "initial mode change interval") \
OPTION( modeint, 1e3, 10, 1e8, "base mode change interval") \
OPTION( order_reset, -1, -1, 1e5, "order seed") \
OPTION( otfs, 1, 0, 1, "on-the-fly strengthening") \
OPTION( phase, 1, 0, 1, "initial decision phase") \
OPTION( phasesaving, 1, 0, 1, "enable phase saving") \

View File

@ -268,10 +268,9 @@ if __name__ == "__main__":
solvers = []
solvers.append(solver_SAT_standard_gnomon("/home/chenzh/res/testLight/v1","v1"))
solvers.append(solver_SAT_standard_gnomon("/home/chenzh/res/testLight/v2","v2"))
solvers.append(solver_SAT_standard_gnomon("/home/chenzh/res/testLight/v3","v3"))
solvers.append(solver_SAT_standard_gnomon("/pub/data/chenzh/res/light/v3--1-preprocess","preprocess"))
solvers.append(solver_SAT_standard_gnomon("/pub/data/chenzh/res/light/v4-nps","sharing-nps"))
solvers.append(solver_SAT_standard_gnomon("/pub/data/chenzh/res/light/v4-dps","sharing-dps"))
# append_all_solvers_in_dir(solvers, "/pub/data/chenzh/res/light/")
samples = []

Binary file not shown.

153
testLight/run7_1.sh Executable file
View File

@ -0,0 +1,153 @@
#!/bin/bash
SEND_THREAD_NUM=4
tmp_fifofile="/tmp/$$.fifo" # 脚本运行的当前进程ID号作为文件名
mkfifo "$tmp_fifofile" # 新建一个随机fifo管道文件
exec 6<>"$tmp_fifofile" # 定义文件描述符6指向这个fifo管道文件
rm $tmp_fifofile
for i in $(seq 1 $SEND_THREAD_NUM)
do
echo # for循环 往 fifo管道文件中写入 $SEND_THREAD_NUM 个空行
done >&6
# CUTOFF_TIME=3600
instance_20="/pub/data/chenzh/data/sat2020"
instance_21="/pub/data/chenzh/data/sat2021"
instance_22="/pub/data/chenzh/data/sat2022"
res1="/pub/data/chenzh/res/light/v1-origin"
res2="/pub/data/chenzh/res/light/v1-preprocess-2"
res3="/pub/data/chenzh/res/light/v1-1-origin"
res4="/pub/data/chenzh/res/light/v2-preprocess"
res5="/pub/data/chenzh/res/light/v3--1-preprocess"
res6="/pub/data/chenzh/res/light/v4-nps"
res7="/pub/data/chenzh/res/light/v4-dps"
res8="/pub/data/chenzh/res/light/v4-dps-2w"
res_no="/pub/data/chenzh/res/unused"
#####################################################
all_datas=($instance_21 $instance_20)
for((i=0;i<${#all_datas[*]};i++))
do
instance=${all_datas[$i]}
res_solver_ins=$res8
if [ ! -d "$res_solver_ins" ]; then
mkdir -p $res_solver_ins
fi
for dir_file in `cat $instance/vbs.txt`
do
file=$dir_file
echo $file
touch $res_solver_ins/$file
read -u 6
{
cd /home/chenzh/solvers/Light
time ./light-v4 $instance/$file --share=1 --DPS=1 --DPS_period=20000
echo >&6
} >$res_solver_ins/$file 2>>$res_solver_ins/$file &
done
# res_solver_ins=$res5
# if [ ! -d "$res_solver_ins" ]; then
# mkdir -p $res_solver_ins
# fi
# for dir_file in `cat $instance/vbs.txt`
# do
# file=$dir_file
# echo $file
# touch $res_solver_ins/$file
# read -u 6
# {
# cd /home/chenzh/solvers/Light
# time ./light-v3--1 $instance/$file --share=1 --threads=31
# echo >&6
# } >$res_solver_ins/$file 2>>$res_solver_ins/$file &
# done
# res_solver_ins=$res4
# if [ ! -d "$res_solver_ins" ]; then
# mkdir -p $res_solver_ins
# fi
# for dir_file in `cat $instance/vbs.txt`
# do
# file=$dir_file
# echo $file
# touch $res_solver_ins/$file
# read -u 6
# {
# cd /home/chenzh/solvers/Light
# time ./light-v2 $instance/$file --share=1 --threads=31
# echo >&6
# } >$res_solver_ins/$file 2>>$res_solver_ins/$file &
# done
# res_solver_ins=$res3
# if [ ! -d "$res_solver_ins" ]; then
# mkdir -p $res_solver_ins
# fi
# for dir_file in `cat $instance/vbs.txt`
# do
# file=$dir_file
# echo $file
# touch $res_solver_ins/$file
# read -u 6
# {
# cd /home/chenzh/solvers/Light
# time ./light-v1-1 $instance/$file --simplify=0 --reset=1
# echo >&6
# } >$res_solver_ins/$file 2>>$res_solver_ins/$file &
# done
# res_solver_ins=$res2
# if [ ! -d "$res_solver_ins" ]; then
# mkdir -p $res_solver_ins
# fi
# for dir_file in `cat $instance/vbs.txt`
# do
# file=$dir_file
# echo $file
# touch $res_solver_ins/$file
# read -u 6
# {
# cd /home/chenzh/solvers/Light
# time ./light $instance/$file --simplify=1
# echo >&6
# } >$res_solver_ins/$file 2>>$res_solver_ins/$file &
# done
# res_solver_ins=$res1
# if [ ! -d "$res_solver_ins" ]; then
# mkdir -p $res_solver_ins
# fi
# for dir_file in `cat $instance/vbs.txt`
# do
# file=$dir_file
# echo $file
# touch $res_solver_ins/$file
# read -u 6
# {
# cd /home/chenzh/solvers/Light
# time ./light-v1 $instance/$file --simplify=0
# echo >&6
# } >$res_solver_ins/$file 2>>$res_solver_ins/$file &
# done
done
res_solver_ins=$res_no
if [ ! -d "$res_solver_ins" ]; then
mkdir -p $res_solver_ins
fi
for((i=0;i<4;i++))
do
read -u 6
{
cd /home/chenzh/solvers/Light
time ./light-v1 /home/chenzh/data/hard_cnfs/49.cnf
echo >&6
} >$res_solver_ins/$i 2>>$res_solver_ins/$i &
done
exit 0

153
testLight/run7_2.sh Executable file
View File

@ -0,0 +1,153 @@
#!/bin/bash
SEND_THREAD_NUM=4
tmp_fifofile="/tmp/$$.fifo" # 脚本运行的当前进程ID号作为文件名
mkfifo "$tmp_fifofile" # 新建一个随机fifo管道文件
exec 6<>"$tmp_fifofile" # 定义文件描述符6指向这个fifo管道文件
rm $tmp_fifofile
for i in $(seq 1 $SEND_THREAD_NUM)
do
echo # for循环 往 fifo管道文件中写入 $SEND_THREAD_NUM 个空行
done >&6
# CUTOFF_TIME=3600
instance_20="/pub/data/chenzh/data/sat2020"
instance_21="/pub/data/chenzh/data/sat2021"
instance_22="/pub/data/chenzh/data/sat2022"
res1="/pub/data/chenzh/res/light/v1-origin"
res2="/pub/data/chenzh/res/light/v1-preprocess-2"
res3="/pub/data/chenzh/res/light/v1-1-origin"
res4="/pub/data/chenzh/res/light/v2-preprocess"
res5="/pub/data/chenzh/res/light/v3--1-preprocess"
res6="/pub/data/chenzh/res/light/v4-nps"
res7="/pub/data/chenzh/res/light/v4-dps"
res8="/pub/data/chenzh/res/light/v4-dps-2w"
res_no="/pub/data/chenzh/res/unused"
#####################################################
all_datas=($instance_22)
for((i=0;i<${#all_datas[*]};i++))
do
instance=${all_datas[$i]}
res_solver_ins=$res8
if [ ! -d "$res_solver_ins" ]; then
mkdir -p $res_solver_ins
fi
for dir_file in `cat $instance/vbs.txt`
do
file=$dir_file
echo $file
touch $res_solver_ins/$file
read -u 6
{
cd /home/chenzh/solvers/Light
time ./light-v4 $instance/$file --share=1 --DPS=1 --DPS_period=20000
echo >&6
} >$res_solver_ins/$file 2>>$res_solver_ins/$file &
done
# res_solver_ins=$res5
# if [ ! -d "$res_solver_ins" ]; then
# mkdir -p $res_solver_ins
# fi
# for dir_file in `cat $instance/vbs.txt`
# do
# file=$dir_file
# echo $file
# touch $res_solver_ins/$file
# read -u 6
# {
# cd /home/chenzh/solvers/Light
# time ./light-v3--1 $instance/$file --share=1 --threads=31
# echo >&6
# } >$res_solver_ins/$file 2>>$res_solver_ins/$file &
# done
# res_solver_ins=$res4
# if [ ! -d "$res_solver_ins" ]; then
# mkdir -p $res_solver_ins
# fi
# for dir_file in `cat $instance/vbs.txt`
# do
# file=$dir_file
# echo $file
# touch $res_solver_ins/$file
# read -u 6
# {
# cd /home/chenzh/solvers/Light
# time ./light-v2 $instance/$file --share=1 --threads=31
# echo >&6
# } >$res_solver_ins/$file 2>>$res_solver_ins/$file &
# done
# res_solver_ins=$res3
# if [ ! -d "$res_solver_ins" ]; then
# mkdir -p $res_solver_ins
# fi
# for dir_file in `cat $instance/vbs.txt`
# do
# file=$dir_file
# echo $file
# touch $res_solver_ins/$file
# read -u 6
# {
# cd /home/chenzh/solvers/Light
# time ./light-v1-1 $instance/$file --simplify=0 --reset=1
# echo >&6
# } >$res_solver_ins/$file 2>>$res_solver_ins/$file &
# done
# res_solver_ins=$res2
# if [ ! -d "$res_solver_ins" ]; then
# mkdir -p $res_solver_ins
# fi
# for dir_file in `cat $instance/vbs.txt`
# do
# file=$dir_file
# echo $file
# touch $res_solver_ins/$file
# read -u 6
# {
# cd /home/chenzh/solvers/Light
# time ./light $instance/$file --simplify=1
# echo >&6
# } >$res_solver_ins/$file 2>>$res_solver_ins/$file &
# done
# res_solver_ins=$res1
# if [ ! -d "$res_solver_ins" ]; then
# mkdir -p $res_solver_ins
# fi
# for dir_file in `cat $instance/vbs.txt`
# do
# file=$dir_file
# echo $file
# touch $res_solver_ins/$file
# read -u 6
# {
# cd /home/chenzh/solvers/Light
# time ./light-v1 $instance/$file --simplify=0
# echo >&6
# } >$res_solver_ins/$file 2>>$res_solver_ins/$file &
# done
done
res_solver_ins=$res_no
if [ ! -d "$res_solver_ins" ]; then
mkdir -p $res_solver_ins
fi
for((i=0;i<4;i++))
do
read -u 6
{
cd /home/chenzh/solvers/Light
time ./light-v1 /home/chenzh/data/hard_cnfs/49.cnf
echo >&6
} >$res_solver_ins/$i 2>>$res_solver_ins/$i &
done
exit 0

View File

@ -11,45 +11,78 @@ extern "C" {
#include "src/import.h"
}
void kissat_export_clause(void *solver, int lbd, cvec* c) {
basekissat* S = (basekissat *) solver;
++S->x1;
if (S->solver->nconflict != S->x1 - 1) printf("%d %d\n", S->solver->nconflict, S->x1);
if (lbd > S->good_clause_lbd) return;
void basekissat::add(int l) {
kissat_add(solver, l);
}
void basekissat::configure(char* name, int id) {
kissat_set_option(solver, name, id);
}
int basekissat::solve() {
return kissat_solve(solver);
}
void basekissat::terminate() {
kissat_terminate(solver);
}
int basekissat::val(int l) {
int v = abs(l);
int tmp = kissat_value(solver, v);
if (!tmp) tmp = v;
if (l < 0) tmp = -tmp;
return tmp;
}
void basekissat::exp_clause(void* cl, int lbd) {
cvec *c = (cvec *) cl;
clause_store* cls = new clause_store(c->sz);
for (int i = 0; i < c->sz; i++) {
int v = cvec_data(c, i);
int eidx = PEEK_STACK(S->solver->exportk, (v >> 1));
int eidx = PEEK_STACK(solver->exportk, (v >> 1));
cls->data[i] = v & 1 ? -eidx : eidx;
}
++S->x2;
// ++S->x2;
// if (S->id == 0) puts("");
cls->lbd = lbd;
S->export_clause.push(cls);
export_clause.push(cls);
}
int kissat_import_clause(void *solver, int *lbd, cvec* c) {
basekissat* S = (basekissat *) solver;
clause_store* cls = NULL;
if (S->import_clause.pop(cls) == false) return -1;
bool eliminated = false;
void call_back_out(void *solver, int lbd, cvec *c) {
basekissat* S = (basekissat *) solver;
// ++S->x1;
// if (S->solver->nconflict != S->x1 - 1) printf("%d %d\n", S->solver->nconflict, S->x1);
if (lbd <= S->good_clause_lbd) {
S->exp_clause(c, lbd);
}
}
bool basekissat::imp_clause(clause_store *cls, void *cl) {
cvec *c = (cvec *) cl;
for (int i = 0; i < cls->size; i++) {
// S->outimport << cls->data[i] << std::endl;
int eidx = abs(cls->data[i]);
import *import = &PEEK_STACK (S->solver->import, eidx);
if (import->eliminated) {
eliminated = true;
}
import *import = &PEEK_STACK (solver->import, eidx);
if (import->eliminated) return false;
else {
int ilit = import->lit;
if (cls->data[i] < 0) ilit = ilit ^ 1;
cvec_push(c, ilit);
}
}
return true;
}
int call_back_in(void *solver, int *lbd, cvec *c) {
basekissat* S = (basekissat *) solver;
clause_store* cls = NULL;
if (S->import_clause.pop(cls) == false) return -1;
*lbd = cls->lbd;
bool res = S->imp_clause(cls, c);
cls->free_clause();
if (eliminated) return -10;
if (!res) return -10;
return 1;
}
@ -90,8 +123,8 @@ basekissat::basekissat(int id, light* light) : basesolver(id, light) {
solver -> cbkExportClause = NULL;
solver -> cbkWaitSharing = NULL;
if (light->opt->share) {
solver -> cbkImportClause = kissat_import_clause;
solver -> cbkExportClause = kissat_export_clause;
solver -> cbkImportClause = call_back_in;
solver -> cbkExportClause = call_back_out;
solver -> cbkWaitSharing = kissat_wait_sharing;
solver -> share_dps = light->opt->DPS;
solver -> share_dps_period= light->opt->DPS_period;
@ -102,8 +135,7 @@ basekissat::~basekissat(){
delete solver;
}
void basekissat::parse_dimacs(char* filename) {
kissat_mab_parse(solver);
void basekissat::parse_from_CNF(char* filename) {
strictness strict = NORMAL_PARSING;
file in;
uint64_t lineno;
@ -112,47 +144,17 @@ void basekissat::parse_dimacs(char* filename) {
kissat_close_file(&in);
}
void basekissat::import_original_clause(preprocess* pre) {
void basekissat::parse_from_PAR(preprocess* pre) {
solver->max_var = pre->vars;
kissat_mab_parse(solver);
kissat_reserve(solver, pre->vars);
for (int i = 1; i <= pre->clauses; i++) {
int l = pre->clause[i].size();
for (int j = 0; j < l; j++)
kissat_add(solver, pre->clause[i][j]);
kissat_add(solver, 0);
add(pre->clause[i][j]);
add(0);
}
}
void basekissat::diversity(int id) {
if (id) solver->order_reset = id;
}
int basekissat::solve() {
return kissat_solve(solver);
}
void basekissat::terminate() {
kissat_terminate(solver);
}
void basekissat::get_model(vec<int> &model) {
model.clear();
for (int i = 1; i <= solver->max_var; i++) {
int tmp = kissat_value(solver, i);
if (!tmp) tmp = i;
model.push(tmp);
}
}
int basekissat::get_reset_data() {
return solver->best_assigned;
}
void basekissat::reset() {
solver->reseting = 1;
}
void basekissat::export_clauses_to(vec<clause_store *> &clauses) {
clause_store *cls;
while (export_clause.pop(cls)) {
@ -174,11 +176,30 @@ void basekissat::import_clauses_from(vec<clause_store *> &clauses) {
}
}
void basekissat::get_model(vec<int> &model) {
model.clear();
for (int i = 1; i <= solver->max_var; i++) {
model.push(val(i));
}
}
void basekissat::broaden_export_limit() {
// ++good_clause_lbd;
++good_clause_lbd;
}
void basekissat::restrict_export_limit() {
if (good_clause_lbd > 2)
--good_clause_lbd;
}
}
int basekissat::get_conflicts() {
return solver->nconflict;
}
// int basekissat::get_reset_data() {
// return solver->best_assigned;
// }
// void basekissat::reset() {
// solver->reseting = 1;
// }

View File

@ -1,21 +1,23 @@
#include "basesolver.hpp"
#include "clause.hpp"
#include <boost/thread/thread.hpp>
#include <boost/lockfree/spsc_queue.hpp>
struct kissat;
struct cvec;
class basekissat : public basesolver {
public:
void parse_dimacs(char* filename);
void import_original_clause(preprocess *pre);
void diversity(int id);
void terminate();
void add(int l);
int solve();
int val(int l);
void configure(char* name, int id);
// int get_reset_data();
// void reset();
int get_conflicts();
void parse_from_CNF(char* filename);
void parse_from_PAR(preprocess *pre);
void get_model(vec<int> &model);
int get_reset_data();
void reset();
void exp_clause(void *cl, int lbd);
bool imp_clause(clause_store *cls, void *cl);
void export_clauses_to(vec<clause_store *> &clauses);
void import_clauses_from(vec<clause_store *> &clauses);
void broaden_export_limit();
@ -27,8 +29,6 @@ public:
kissat* solver;
int good_clause_lbd = 0;
boost::lockfree::spsc_queue<clause_store*, boost::lockfree::capacity<1024000>> import_clause;
boost::lockfree::spsc_queue<clause_store*, boost::lockfree::capacity<1024000>> export_clause;
friend int cbkImportClause(void *, int *, cvec *);
friend int cbkExportClause(void *, int *, cvec *);
friend void cbkWaitSharing(void *);

View File

@ -6,17 +6,23 @@
#include "clause.hpp"
#include <fstream>
#include <iostream>
#include <boost/thread/thread.hpp>
#include <boost/lockfree/spsc_queue.hpp>
class sharer;
class basesolver {
public:
virtual void parse_dimacs(char* filename) = 0;
virtual void import_original_clause(preprocess* pre) = 0;
virtual void diversity(int id) = 0;
virtual void add(int l) = 0;
virtual int solve() = 0;
virtual int val(int l) = 0;
virtual void terminate() = 0;
virtual void configure(char* name, int id) = 0;
virtual int get_conflicts() = 0;
virtual void parse_from_CNF(char* filename) = 0;
virtual void parse_from_PAR(preprocess* pre) = 0;
virtual void get_model(vec<int> &model) = 0;
virtual int get_reset_data() = 0;
virtual void reset() = 0;
virtual void exp_clause(void *cl, int lbd) = 0;
virtual bool imp_clause(clause_store *cls, void *cl) = 0;
virtual void export_clauses_to(vec<clause_store *> &clauses) = 0;
virtual void import_clauses_from(vec<clause_store *> &clauses) = 0;
virtual void broaden_export_limit() = 0;
@ -25,9 +31,11 @@ public:
int id;
sharer* in_sharer;
boost::lockfree::spsc_queue<clause_store*, boost::lockfree::capacity<1024000>> import_clause;
boost::lockfree::spsc_queue<clause_store*, boost::lockfree::capacity<1024000>> export_clause;
basesolver(int sid, light* light) : id(sid), controller(light) {}
~basesolver() {
printf("destru %dbase\n", id);
if (controller) {
controller = NULL;
}