diff -dur picosat-913.ORIG/picosat.c picosat-913/picosat.c
--- picosat-913.ORIG/picosat.c 2009-07-13 07:04:44.000000000 -0600
+++ picosat-913/picosat.c 2009-09-02 12:24:48.428654095 -0600
@@ -6112,6 +6112,160 @@
#endif
}
+/**
+ * method to access the zhains without printing to a file
+ */
+
+static int* proof = NULL;
+static int cursor = 0;
+#define PROOF_BLOCK 10000
+static int current_size;
+static void add_int_to_proof(int i)
+{
+ if(cursor >= current_size){
+ current_size += PROOF_BLOCK;
+ proof = realloc(proof, current_size);
+ }
+ proof[cursor] = i;
+ cursor++;
+}
+
+static int
+my_write_idx (unsigned idx)
+{
+ return EXPORTIDX (idx);
+}
+static void
+my_trace_lits (Cls * cls)
+{
+ Lit **p, **eol = end_of_lits (cls);
+
+ assert (cls);
+ assert (cls->core);
+
+ for (p = cls->lits; p < eol; p++)
+ {
+ int lit = LIT2INT (*p);
+ add_int_to_proof(lit);
+ }
+
+ add_int_to_proof(0);
+}
+static void
+my_trace_zhain (unsigned idx, Zhn * zhain)
+{
+ unsigned prev, this, delta, i;
+ Znt *p, byte;
+ Cls * cls;
+
+ assert (zhain);
+ assert (zhain->core);
+
+ int id = my_write_idx (idx);
+ add_int_to_proof(id);
+
+ cls = IDX2CLS (idx);
+ assert (cls);
+ my_trace_lits (cls);
+
+ i = 0;
+ delta = 0;
+ prev = 0;
+
+ for (p = zhain->znt; (byte = *p); p++, i += 7)
+ {
+ delta |= (byte & 0x7f) << i;
+ if (byte & 0x80)
+ continue;
+
+ this = prev + delta;
+
+ int id = my_write_idx (this);
+ add_int_to_proof(id);
+
+ prev = this;
+ delta = 0;
+ i = -7;
+ }
+
+ add_int_to_proof(0);
+
+}
+static void
+my_trace_clause (unsigned idx, Cls * cls)
+{
+ assert (cls);
+ assert (cls->core);
+ assert (!cls->learned);
+ assert (CLS2IDX (cls) == idx);
+
+ int id = my_write_idx (idx);
+ add_int_to_proof(id);
+
+ my_trace_lits (cls);
+
+ add_int_to_proof(0);
+
+}
+static int*
+get_proof()
+{
+#ifdef TRACE
+ if (proof != NULL){
+ free(proof);
+ }
+ proof = malloc(PROOF_BLOCK * (sizeof(int)));
+ current_size = PROOF_BLOCK;
+ cursor = 0;
+
+
+ Cls *cls, ** p;
+ Zhn *zhain;
+ unsigned i;
+
+ core ();
+
+ for (p = SOC; p != EOC; p = NXC (p))
+ {
+ cls = *p;
+
+ if (oclauses <= p && p < eoo)
+ {
+ i = OIDX2IDX (p - oclauses);
+ assert (!cls || CLS2IDX (cls) == i);
+ }
+ else
+ {
+ assert (lclauses <= p && p < eol);
+ i = LIDX2IDX (p - lclauses);
+ }
+
+ zhain = IDX2ZHN (i);
+
+ if (zhain)
+ {
+ if (zhain->core)
+ {
+ my_trace_zhain (i, zhain);
+ }
+ }
+ else if (cls)
+ {
+ if (cls->core)
+ my_trace_clause (i, cls);
+ }
+ }
+ add_int_to_proof(EOP);
+ return proof;
+#endif
+}
+int *
+picosat_get_proof(){
+ return get_proof();
+}
+////
+
+
static void
write_core_wrapper (FILE * file, int fmt)
{
diff -dur picosat-913.ORIG/picosat.h picosat-913/picosat.h
--- picosat-913.ORIG/picosat.h 2009-07-13 07:04:44.000000000 -0600
+++ picosat-913/picosat.h 2009-09-02 12:24:27.959725988 -0600
@@ -178,6 +178,12 @@
*/
void picosat_adjust (int max_idx);
+/* Return an array of int where every cell is the next value of the proof in
+ * EXTENDED_TRACECHECK_TRACE_FMT format.
+ * The proof finishes by EOP.
+ */
+#define EOP ((int)(1 << 31)) /* 2^31 -1, max caml int32*/
+int* picosat_get_proof();
/*------------------------------------------------------------------------*/
/* Statistics.
*/