2008-11-17 18:29:00 -05:00
|
|
|
// ----------------------------------------------------------------------------
|
2008-03-05 09:52:00 -05:00
|
|
|
//
|
|
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
|
|
//
|
2008-11-17 18:29:00 -05:00
|
|
|
// ----------------------------------------------------------------------------
|
2008-03-05 09:52:00 -05:00
|
|
|
|
|
|
|
using System;
|
|
|
|
using System.Collections;
|
|
|
|
using System.Diagnostics;
|
|
|
|
//using Microsoft.Zap;
|
|
|
|
namespace SharpSAT
|
|
|
|
{
|
|
|
|
public class SATCommon
|
|
|
|
{
|
|
|
|
private static void print_stack ()
|
|
|
|
{
|
2008-11-17 18:29:00 -05:00
|
|
|
// HACKHACK: unavailable on Singularity
|
|
|
|
//Console.WriteLine("Stack Trace:");
|
|
|
|
//StackTrace st = new StackTrace(true);
|
|
|
|
//for (int i = 0; i < st.FrameCount; i++) {
|
|
|
|
// StackFrame sf = st.GetFrame(i);
|
|
|
|
// Console.WriteLine("\t{0} at File: {1} Line: {2} ",
|
|
|
|
// sf.GetMethod() ,
|
|
|
|
// sf.GetFileName(),
|
|
|
|
// sf.GetFileLineNumber());
|
|
|
|
//}
|
|
|
|
//
|
2008-03-05 09:52:00 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
public static void sharp_assert (bool is_true)
|
|
|
|
{
|
2008-11-17 18:29:00 -05:00
|
|
|
if (!is_true) {
|
2008-03-05 09:52:00 -05:00
|
|
|
Console.WriteLine("\nAssertion Failed" );
|
|
|
|
print_stack();
|
|
|
|
System.Environment.Exit(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void warning (string msg)
|
|
|
|
{
|
|
|
|
Console.Write("\nWarning:" );
|
|
|
|
Console.WriteLine(msg);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void fatal ()
|
|
|
|
{
|
|
|
|
Console.WriteLine("\nFatal Error" );
|
|
|
|
print_stack();
|
|
|
|
System.Environment.Exit(2);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void fatal (string msg)
|
|
|
|
{
|
|
|
|
Console.WriteLine ("Fatal Error: {0}", msg);
|
|
|
|
print_stack();
|
|
|
|
System.Environment.Exit(2);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static string StatusToString(SATStatus status)
|
|
|
|
{
|
|
|
|
switch (status) {
|
|
|
|
case SATStatus.UNDETERMINED: return "UNDETERMINED";
|
|
|
|
case SATStatus.UNSATISFIABLE: return "UNSATISFIABLE";
|
|
|
|
case SATStatus.SATISFIABLE: return "SATISFIABLE";
|
|
|
|
case SATStatus.TIME_OUT: return "TIME";
|
|
|
|
case SATStatus.MEM_OUT: return "MEM";
|
|
|
|
case SATStatus.ABORTED: return "ABORTED";
|
|
|
|
}
|
|
|
|
|
|
|
|
return "UNKNOWN_RESULT";
|
|
|
|
}
|
|
|
|
|
|
|
|
public static int NEGATE (int s) { return s^1; }
|
|
|
|
public static int NON_NEGATED (int s) { return s&(~1);}
|
|
|
|
public static int SIGN (int s) { return s & 1; }
|
|
|
|
public static int NODE_ID (int s) { return s >> 1; }
|
|
|
|
public static int VID (int s) { return s >> 1; }
|
|
|
|
public static bool IS_NEGATED(int s) { return (s&1) == 1; }
|
|
|
|
|
|
|
|
public const int INVALID = -1;
|
|
|
|
public const int UNKNOWN = 2;
|
|
|
|
public const int WORD_WIDTH = 16;
|
|
|
|
public const int UIDSHIFT = 27;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
public enum ImpType : sbyte
|
|
|
|
{
|
|
|
|
NONE,
|
|
|
|
CLAUSE,
|
|
|
|
NODE,
|
|
|
|
PB,
|
|
|
|
}
|
|
|
|
|
|
|
|
public enum ClType : sbyte
|
|
|
|
{
|
|
|
|
UNKNOWN,
|
|
|
|
ORIGINAL,
|
|
|
|
CONFLICT,
|
|
|
|
BLOCKING,
|
|
|
|
TEMP,
|
|
|
|
DELETED
|
|
|
|
}
|
|
|
|
|
|
|
|
public enum NodeType : sbyte
|
|
|
|
{
|
|
|
|
UNKNOWN,
|
|
|
|
VARIABLE,
|
|
|
|
CONSTANT,
|
|
|
|
PI,
|
|
|
|
AND,
|
|
|
|
XOR,
|
|
|
|
FREE,
|
|
|
|
}
|
|
|
|
|
|
|
|
public enum SATStatus
|
|
|
|
{
|
|
|
|
UNDETERMINED,
|
|
|
|
UNSATISFIABLE,
|
|
|
|
SATISFIABLE,
|
|
|
|
TIME_OUT,
|
|
|
|
MEM_OUT,
|
|
|
|
ABORTED
|
|
|
|
}
|
|
|
|
|
|
|
|
public struct SolverStats
|
|
|
|
{
|
|
|
|
public bool been_reset ;
|
|
|
|
public bool active_area_changed ;
|
|
|
|
public int constraint_zero ;
|
|
|
|
public bool is_solving ;
|
|
|
|
public SATStatus outcome ;
|
|
|
|
public bool is_mem_out ;
|
|
|
|
public double start_cpu_time ;
|
|
|
|
public double finish_cpu_time ;
|
|
|
|
|
|
|
|
public double total_cpu_time ;
|
|
|
|
public int num_rounds ;
|
|
|
|
public int num_free_variables ;
|
|
|
|
public int num_free_branch_vars ;
|
|
|
|
public int num_decisions ;
|
|
|
|
public int num_conflicts ;
|
|
|
|
public int num_backtracks ;
|
|
|
|
public int max_dlevel ;
|
|
|
|
public long num_implications ;
|
|
|
|
|
|
|
|
public int num_cls_vars ;
|
|
|
|
public int num_orig_clauses ;
|
|
|
|
public int num_orig_literals ;
|
|
|
|
public int num_learned_clauses ;
|
|
|
|
public long num_learned_literals ;
|
|
|
|
public int num_deleted_clauses ;
|
|
|
|
public long num_deleted_literals ;
|
|
|
|
|
|
|
|
public int next_restart;
|
|
|
|
public int next_gc;
|
|
|
|
public int next_decay;
|
|
|
|
|
|
|
|
public int num_restarts;
|
|
|
|
public int num_garbage_collections;
|
|
|
|
|
|
|
|
public int marked_current_dl;
|
|
|
|
|
|
|
|
public SolverStats (bool do_init)
|
|
|
|
{
|
|
|
|
//regardless of the input, we have to init
|
|
|
|
been_reset = true;
|
|
|
|
active_area_changed = true;
|
|
|
|
constraint_zero = 0;
|
|
|
|
is_solving = false;
|
|
|
|
outcome = SATStatus.UNDETERMINED;
|
|
|
|
is_mem_out = false;
|
|
|
|
start_cpu_time = 0;
|
|
|
|
finish_cpu_time = 0;
|
|
|
|
|
|
|
|
total_cpu_time = 0;
|
|
|
|
num_rounds = 0;
|
|
|
|
num_free_variables = 0;
|
|
|
|
num_free_branch_vars = 0;
|
|
|
|
num_decisions = 0;
|
|
|
|
num_conflicts = 0;
|
|
|
|
num_backtracks = 0;
|
|
|
|
max_dlevel = 0;
|
|
|
|
num_implications = 0;
|
|
|
|
|
|
|
|
num_cls_vars = 0;
|
|
|
|
num_orig_clauses = 0;
|
|
|
|
num_orig_literals = 0;
|
|
|
|
num_learned_clauses = 0;
|
|
|
|
num_learned_literals = 0;
|
|
|
|
num_deleted_clauses = 0;
|
|
|
|
num_deleted_literals = 0;
|
|
|
|
|
|
|
|
next_restart = 0;
|
|
|
|
next_gc = 0;
|
|
|
|
next_decay = 0;
|
|
|
|
|
|
|
|
num_restarts = 0;
|
|
|
|
num_garbage_collections = 0;
|
|
|
|
|
|
|
|
marked_current_dl = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public struct SolverParams
|
|
|
|
{
|
|
|
|
public double time_limit;
|
|
|
|
public long mem_limit;
|
|
|
|
|
|
|
|
public bool enable_restart;
|
|
|
|
public int first_restart;
|
|
|
|
public int restart_period;
|
|
|
|
|
|
|
|
public bool enable_gc;
|
|
|
|
public int gc_period;
|
|
|
|
public int gc_head_threshold;
|
|
|
|
public int gc_tail_threshold;
|
|
|
|
public int gc_head_length;
|
|
|
|
public int gc_tail_length;
|
|
|
|
public int gc_head_tail_ratio;
|
|
|
|
|
|
|
|
public int decay_period;
|
|
|
|
|
|
|
|
//public bool reason_on_trans_fanin_only;
|
|
|
|
|
|
|
|
public SolverParams (bool init)
|
|
|
|
{
|
|
|
|
time_limit = 24 * 3600;
|
|
|
|
mem_limit = 1024 * 1024 * 512;
|
|
|
|
|
|
|
|
enable_restart = true;
|
|
|
|
first_restart = 7000;
|
|
|
|
restart_period = 700;
|
|
|
|
|
|
|
|
enable_gc = true;
|
|
|
|
gc_period = 600;
|
|
|
|
gc_head_threshold = 500;
|
|
|
|
gc_tail_threshold = 10;
|
|
|
|
gc_head_length = 6;
|
|
|
|
gc_tail_length = 45;
|
|
|
|
gc_head_tail_ratio = 16;
|
|
|
|
|
|
|
|
decay_period = 40;
|
|
|
|
//reason_on_trans_fanin_only = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|