--- ./pico_ml_wrapper/src/camlpico.c.orig 2008-07-08 22:38:01.000000000 -0600
+++ ./pico_ml_wrapper/src/camlpico.c 2013-07-31 16:11:40.000000000 -0600
@@ -26,6 +26,8 @@
#include <caml/memory.h>
#include <picosat.h>
+static PicoSAT *my_picosat;
+
/* the methods comment were directly taken from 'picosat.h' */
CAMLprim value unknown(){ return Val_int(PICOSAT_UNKNOWN);}
@@ -35,13 +37,14 @@ CAMLprim value unsatisfiable(){ return V
CAMLprim value init(value unit)
{
- picosat_init();
+ my_picosat = picosat_init();
return Val_unit;
}
CAMLprim value reset(value unit)
{
- picosat_reset();
+ picosat_reset(my_picosat);
+ my_picosat = NULL;
return Val_unit;
}
@@ -55,7 +58,7 @@ CAMLprim value reset(value unit)
*/
CAMLprim value set_seed(value seed)
{
- picosat_set_seed(Unsigned_int_val(seed));
+ picosat_set_seed(my_picosat, Unsigned_int_val(seed));
return Val_unit;
}
@@ -65,7 +68,7 @@ CAMLprim value set_seed(value seed)
*/
CAMLprim value enable_trace(value unit)
{
- picosat_enable_trace_generation();
+ picosat_enable_trace_generation(my_picosat);
return Val_unit;
}
@@ -76,7 +79,7 @@ CAMLprim value enable_trace(value unit)
*/
CAMLprim value adjust(value n)
{
- picosat_adjust(Int_val(n));
+ picosat_adjust(my_picosat, Int_val(n));
return Val_unit;
}
@@ -85,7 +88,7 @@ CAMLprim value adjust(value n)
*/
CAMLprim value second(value unit)
{
- return caml_copy_double(picosat_seconds());
+ return caml_copy_double(picosat_seconds(my_picosat));
}
/*------------------------------------------------------------------------*/
@@ -95,7 +98,7 @@ CAMLprim value second(value unit)
*/
CAMLprim value add(value i)
{
- picosat_add(Int_val(i));
+ picosat_add(my_picosat, Int_val(i));
return Val_unit;
}
@@ -106,7 +109,7 @@ CAMLprim value add(value i)
*/
CAMLprim value assume(value i)
{
- picosat_assume(Int_val(i));
+ picosat_assume(my_picosat, Int_val(i));
return Val_unit;
}
@@ -117,7 +120,7 @@ CAMLprim value assume(value i)
*/
CAMLprim value sat(value limit)
{
- return Val_int(picosat_sat(Int_val(limit)));
+ return Val_int(picosat_sat(my_picosat, Int_val(limit)));
}
/* After 'picosat_sat' was called and returned 'PICOSAT_SATISFIABLE', then
@@ -127,7 +130,7 @@ CAMLprim value sat(value limit)
*/
CAMLprim value deref(value lit)
{
- return Val_int(picosat_deref(Int_val(lit)));
+ return Val_int(picosat_deref(my_picosat, Int_val(lit)));
}
/* A cheap way of determining an over-approximation of a variable core is to
@@ -138,7 +141,7 @@ CAMLprim value deref(value lit)
*/
CAMLprim value usedlit(value lit)
{
- return Val_int(picosat_usedlit(Int_val(lit)));
+ return Val_int(picosat_usedlit(my_picosat, Int_val(lit)));
}
/*------------------------------------------------------------------------*/
@@ -155,7 +158,7 @@ CAMLprim value usedlit(value lit)
*/
CAMLprim value corelit(value lit)
{
- return Val_int(picosat_corelit(Int_val(lit)));
+ return Val_int(picosat_corelit(my_picosat, Int_val(lit)));
}
//#include <stdio.h>
@@ -165,7 +168,7 @@ value get_proof(value unit)
{
CAMLparam0();
CAMLlocal1 (array);
- int* proof = picosat_get_proof();
+ int* proof = picosat_get_proof(my_picosat);
int size = 0;
while(proof[size] != EOP){
size++;