summaryrefslogtreecommitdiff
path: root/omegalib/omega/src/pres_print.cc
diff options
context:
space:
mode:
authorTuowen Zhao <ztuowen@gmail.com>2016-09-18 15:45:13 +0000
committerTuowen Zhao <ztuowen@gmail.com>2016-09-18 15:45:13 +0000
commit2fce43d484e4148ae858f410d51dcd9951d34374 (patch)
tree80c204799cd38349b3bb209d4d37962b11aa6222 /omegalib/omega/src/pres_print.cc
parentf433eae7a1408cca20f3b72fb4c136d9b62de3b8 (diff)
downloadchill-2fce43d484e4148ae858f410d51dcd9951d34374.tar.gz
chill-2fce43d484e4148ae858f410d51dcd9951d34374.tar.bz2
chill-2fce43d484e4148ae858f410d51dcd9951d34374.zip
remove include & rename
Diffstat (limited to 'omegalib/omega/src/pres_print.cc')
-rw-r--r--omegalib/omega/src/pres_print.cc908
1 files changed, 908 insertions, 0 deletions
diff --git a/omegalib/omega/src/pres_print.cc b/omegalib/omega/src/pres_print.cc
new file mode 100644
index 0000000..4f2cd0d
--- /dev/null
+++ b/omegalib/omega/src/pres_print.cc
@@ -0,0 +1,908 @@
+#include <omega/pres_gen.h>
+#include <omega/pres_var.h>
+#include <omega/pres_tree.h>
+#include <omega/pres_conj.h>
+#include <omega/Relation.h>
+#include <basic/Bag.h>
+#include <omega/omega_i.h>
+#include <omega/omega_core/oc.h>
+
+namespace omega {
+
+////////////////////////////////////////
+// //
+// Print functions. //
+// //
+////////////////////////////////////////
+
+void Conjunct::reorder_for_print(bool reverseOrder, int first_pass_input, int first_pass_output, bool sort) {
+ Conjunct *C2 = copy_conj_same_relation();
+ Variable_ID_Tuple newpos(0),wcvars(0),gvars(0);
+
+// We reorder the original Variable_ID's into the newpos list; later, we
+// copy from their original column (using find_column) to the new one.
+ int n = mappedVars.size();
+ int i;
+ // there may be more inp/outp vars than maxVars; must do dynamically
+ // skip_set_checks++;
+ Tuple<bool> input_used(myRelation->n_inp());
+ Tuple<bool> output_used(myRelation->n_out());
+ for(i=1; i<=myRelation->n_inp();i++) input_used[i] = false;
+ for(i=1; i<=myRelation->n_out();i++) output_used[i] = false;
+ for(i=1; i<=n;i++) {
+ if (mappedVars[i]->kind() == Input_Var)
+ input_used[mappedVars[i]->get_position()] = true;
+ else if (mappedVars[i]->kind() == Output_Var)
+ output_used[mappedVars[i]->get_position()] = true;
+ else if(mappedVars[i]->kind() == Global_Var)
+ gvars.append(mappedVars[i]);
+ }
+
+
+ if(sort)
+ for(i=1; i<=gvars.size();i++)
+ for(int j=1; j <= gvars.size(); j++)
+ if(gvars[j]->get_global_var()->base_name()
+ < gvars[j+1]->get_global_var()->base_name()) {
+ Variable_ID t = gvars[j]; gvars[j] = gvars[j+1]; gvars[j+1] = t;
+ }
+
+ newpos.join(gvars);
+
+ if(!reverseOrder) {
+ for(i=1; i<=min(myRelation->n_inp(),first_pass_input);i++)
+ if (input_used[i]) newpos.append(input_vars[i]);
+ for(i=1; i<=min(myRelation->n_out(),first_pass_output);i++)
+ if (output_used[i]) newpos.append(output_vars[i]);
+ for(i=max(1,first_pass_input+1); i<=myRelation->n_inp();i++)
+ if (input_used[i]) newpos.append(input_vars[i]);
+ for(i=max(1,first_pass_output+1); i<=myRelation->n_out();i++)
+ if (output_used[i]) newpos.append(output_vars[i]);
+ }
+ else {
+ for(i=1; i<=min(myRelation->n_out(),first_pass_output);i++)
+ if (output_used[i]) newpos.append(output_vars[i]);
+ for(i=1; i<=min(myRelation->n_inp(),first_pass_input);i++)
+ if (input_used[i]) newpos.append(input_vars[i]);
+ for(i=max(1,first_pass_output+1); i<=myRelation->n_out();i++)
+ if (output_used[i]) newpos.append(output_vars[i]);
+ for(i=max(1,first_pass_input+1); i<=myRelation->n_inp();i++)
+ if (input_used[i]) newpos.append(input_vars[i]);
+ }
+
+
+ for(i=1; i<=n;i++)
+ if (mappedVars[i]->kind() == Wildcard_Var)
+ wcvars.append(mappedVars[i]);
+
+ if(sort)
+ for(i=1; i<=gvars.size();i++)
+ for(int j=1; j <= gvars.size(); j++)
+ if(gvars[j]->name() < gvars[j+1]->name()) {
+ Variable_ID t = gvars[j]; gvars[j] = gvars[j+1]; gvars[j+1] = t;
+ }
+
+ newpos.join(wcvars);
+
+ assert(problem->nVars == newpos.size()); // i.e. no other variable types
+
+ // Copy coef columns into new order. Constant column is unchanged.
+ for(int e=0; e<problem->nGEQs; e++) problem->GEQs[e].touched = 1;
+
+ for(i=1; i<=problem->nVars; i++) {
+ int col = find_column(newpos[i]); // Find column in original conj.
+ assert(col != 0);
+ copy_column(problem, i, // Copy it from orig. column in the copy.
+ C2->problem, col, 0, 0);
+ problem->var[i] = i;
+ }
+ for(i=1; i<=problem->nVars; i++)
+ problem->forwardingAddress[i] = i;
+
+ mappedVars = newpos;
+ delete C2;
+ // skip_set_checks--;
+}
+
+void Rel_Body::print_with_subs(FILE *output_file, bool printSym, bool newline) {
+ std::string s = this->print_with_subs_to_string(printSym, newline);
+ fprintf(output_file, "%s", s.c_str());
+}
+
+void Rel_Body::print_with_subs() {
+ this->print_with_subs(stdout, 0, 1);
+}
+
+static std::string tryToPrintVarToStringWithDiv(Conjunct *C, Variable_ID v) {
+ std::string s;
+ bool seen = false;
+// This assumes that there is one EQ involving v, that v cannot be
+// substituted and hence has a non-unit coefficient.
+ for(EQ_Iterator e(C); e; e++) {
+ if ((*e).get_coef(v) != 0) {
+ assert(!seen); // This asserts just one EQ with v
+ coef_t v_coef = (*e).get_coef(v);
+ int v_sign = v_coef > 0 ? 1 : -1;
+ v_coef *= v_sign;
+ int sign_adj = -v_sign;
+
+ s += "intDiv(";
+ bool first=true;
+ for(Constr_Vars_Iter i(*e,false); i; i++) {
+ if ((*i).var != v && (*i).coef != 0) {
+ coef_t this_coef = sign_adj*(*i).coef;
+ if(!first && this_coef > 0)
+ s+= "+";
+ if (this_coef == 1)
+ s += (*i).var->name();
+ else if (this_coef == -1) {
+ s += "-"; s += (*i).var->name();
+ }
+ else {
+ s += to_string(this_coef) + "*" + (*i).var->name();
+ }
+ first = false;
+ }
+ }
+ coef_t the_const = (*e).get_const()* sign_adj;
+ if (the_const > 0 && !first)
+ s+= "+";
+ if (the_const != 0)
+ s += to_string(the_const);
+ s += "," + to_string(v_coef) + ")";
+ seen = true;
+ }
+ }
+ return s;
+}
+
+
+// This function prints the output tuple of a relation with each one as a
+// function of the input variables.
+// This will fail or look goofy if the outputs are not affine functions of
+// the inputs.
+// BIG WARNING: Call this only from the codegen stuff, since it assumes things
+// about coefficients
+std::string Rel_Body::print_outputs_with_subs_to_string() {
+ // Rel_Body S(this),Q(this);
+ Rel_Body *S = this->clone();
+ Rel_Body *Q = this->clone();
+ S->setup_names();
+ Conjunct *C = S->single_conjunct();
+ Conjunct *D = Q->single_conjunct(); // ordered_elimination futzes with conj
+ std::string s; // = "[";
+ C->reorder_for_print();
+ C->ordered_elimination(S->global_decls()->length());
+ // Print output names with substitutions in them
+ for(int i=1; i<=S->n_out(); i++) {
+ std::string t;
+ int col = C->find_column(output_vars[i]);
+ if (col != 0)
+ t = C->print_sub_to_string(col);
+ if (col == 0 || t == output_vars[i]->name()) // no sub found
+ // Assume you can't get a unit coefficient on v, must use div
+ t = tryToPrintVarToStringWithDiv(D, output_vars[i]);
+ s += t;
+ if (i < S->n_out()) s += ",";
+ }
+ // s += "] ";
+ delete S;
+ delete Q;
+ return s;
+}
+
+std::string Rel_Body::print_outputs_with_subs_to_string(int i) {
+ // Rel_Body S(this),Q(this);
+ Rel_Body *S = this->clone();
+ Rel_Body *Q = this->clone();
+ S->setup_names();
+ Conjunct *C = S->single_conjunct();
+ Conjunct *D = Q->single_conjunct(); // ordered_elimination futzes with conj
+ std::string s;
+ C->reorder_for_print();
+ C->ordered_elimination(S->global_decls()->length());
+ // Print output names with substitutions in them
+ {
+ std::string t;
+ int col = C->find_column(output_vars[i]);
+ if (col != 0)
+ t = C->print_sub_to_string(col);
+ if (col == 0 || t == output_vars[i]->name()) // no sub found?
+ t = tryToPrintVarToStringWithDiv(D, output_vars[i]);
+ // should check for failure
+ s += t;
+ }
+ delete S;
+ delete Q;
+ return s;
+}
+
+std::string Rel_Body::print_with_subs_to_string(bool printSym, bool newline) {
+ std::string s="";
+
+ if (pres_debug) {
+ fprintf(DebugFile,"print_with_subs_to_string:\n");
+ prefix_print(DebugFile);
+ }
+
+ int anythingPrinted = 0;
+
+ if (this->is_null()) {
+ s = "NULL Rel_Body\n";
+ return s;
+ }
+
+ // Rel_Body R(this);
+ Rel_Body *R = this->clone();
+ bool firstRelation = true;
+
+ for(DNF_Iterator DI(R->query_DNF()); DI.live(); DI.next()) {
+ Rel_Body S(R, DI.curr());
+ Conjunct *C = S.single_conjunct();
+ if(!simplify_conj(C, true, 4, EQ_BLACK)) continue;
+
+ S.setup_names();
+
+ if(! firstRelation) {
+ s += " union";
+ if (newline) s += "\n ";
+ }
+ else
+ firstRelation = false;
+
+ anythingPrinted = 1;
+
+ C->reorder_for_print(false,C->max_ufs_arity_of_in(),
+ C->max_ufs_arity_of_out());
+ C->ordered_elimination(S.Symbolic.length()
+ +C->max_ufs_arity_of_in()
+ +C->max_ufs_arity_of_out());
+// assert(C->problem->variablesInitialized);
+
+ if (pres_debug) S.prefix_print(DebugFile);
+
+ /* Do actual printing of Conjunct C as a relation */
+ s += "{";
+
+ if (!Symbolic.empty()) {
+ if (printSym) s += "Sym=[";
+ for (Variable_ID_Iterator Sym_I = S.Symbolic; Sym_I;)
+ {
+ if (printSym)
+ s += (*Sym_I)->name();
+ Sym_I++;
+ if (printSym && Sym_I) s+= ",";
+ }
+ if (printSym) s += "] ";
+ }
+
+ int i, col;
+
+ if (S.number_input != 0) {
+ s += "[";
+ // Print input names with substitutions in them
+ for(i=1; i<=S.number_input; i++) {
+ col = C->find_column(input_vars[i]);
+ if (col != 0)
+ s += C->problem->print_sub_to_string(col);
+ else
+ s += input_vars[i]->name();
+ if (i<S.number_input) s += ",";
+ }
+ s += "]";
+ }
+
+ if (! S.is_set())
+ s += " -> ";
+
+ if (S.number_output != 0) {
+ s += "[";
+
+ // Print output names with substitutions in them
+ for(i=1; i<=S.number_output; i++) {
+ col = C->find_column(output_vars[i]);
+ if (col != 0)
+ s += C->problem->print_sub_to_string(col);
+ else
+ s += output_vars[i]->name();
+ if (i < S.number_output) s += ",";
+ }
+ s += "] ";
+ }
+
+ if (C->is_unknown()) {
+ if (S.number_input != 0 || S.number_output != 0)
+ s += ":";
+ s += " UNKNOWN";
+ }
+ else {
+ // Empty conj means TRUE, so don't print colon
+ if (C->problem->nEQs != 0 || C->problem->nGEQs != 0) {
+ C->problem->clearSubs();
+ if (S.number_input != 0 || S.number_output != 0)
+ s += ":";
+ s += " ";
+ s += C->print_to_string(false);
+ }
+ else {
+ if (S.number_input == 0 && S.number_output == 0)
+ s += " TRUE ";
+ }
+ }
+
+ s += "}";
+ }
+
+ if (!anythingPrinted) {
+ R->setup_names();
+ s = "{";
+ s += R->print_variables_to_string(printSym);
+ if (R->number_input != 0 || R->number_output != 0)
+ s += " :";
+ s += " FALSE }";
+ if (newline) s += "\n";
+
+ delete R;
+ return s;
+ }
+
+ if (newline) s += "\n";
+
+ delete R;
+ return s;
+}
+
+
+void print_var_addrs(std::string &s, Variable_ID v) {
+ if(pres_debug>=2) {
+ char ss[20];
+ sprintf(ss, "(%p,%p)", v, v->remap);
+ s += ss;
+ }
+}
+
+std::string Rel_Body::print_variables_to_string(bool printSym) {
+ std::string s="";
+
+ if (! Symbolic.empty()) {
+ if (printSym) s += " Sym=[";
+ for (Variable_ID_Iterator Sym_I(Symbolic); Sym_I; ) {
+ if (printSym) s += (*Sym_I)->name();
+ print_var_addrs(s, *Sym_I);
+ Sym_I++;
+ if (printSym && Sym_I) s += ",";
+ }
+ if (printSym) s += "] ";
+ }
+ int i;
+
+ if (number_input) {
+ s += "[";
+ for (i=1;i<=number_input;i++) {
+ s += input_vars[i]->name();
+ print_var_addrs(s, input_vars[i]);
+ if(i < number_input) s += ",";
+ }
+ s += "] ";
+ }
+
+ if (number_output) {
+ s += "-> [";
+ for (i=1;i<=number_output;i++) {
+ s += output_vars[i]->name();
+ print_var_addrs(s, output_vars[i]);
+ if(i < number_output) s += ",";
+ }
+ s += "] ";
+ }
+
+ return s;
+}
+
+
+int F_Declaration::priority() {
+ return 3;
+}
+
+int Formula::priority () {
+ return 0;
+}
+
+int F_Or::priority() {
+ return 0;
+}
+
+int F_And::priority() {
+ return 1;
+}
+
+int Conjunct::priority() {
+ return 1;
+}
+
+int F_Not::priority() {
+ return 2;
+}
+
+
+//
+// print() functions
+//
+void Formula::print(FILE *output_file) {
+ if(myChildren.empty()) {
+ if(node_type()==Op_Relation || node_type()==Op_Or)
+ fprintf(output_file, "FALSE");
+ else if(node_type()==Op_And)
+ fprintf(output_file, "TRUE");
+ else {
+ assert(0);
+ }
+ }
+
+ for(List_Iterator<Formula*> c(myChildren); c;) {
+ if (node_type() == Op_Exists || node_type() == Op_Forall
+ || (*c)->priority() < priority())
+ fprintf(output_file, "( ");
+ (*c)->print(output_file);
+ if (node_type() == Op_Exists || node_type() == Op_Forall
+ || (*c)->priority() < priority())
+ fprintf(output_file, " )");
+ c++;
+ if(c.live())
+ print_separator(output_file);
+ }
+}
+
+std::string Rel_Body::print_formula_to_string() {
+ std::string s;
+ setup_names();
+ for(DNF_Iterator DI(query_DNF()); DI.live();) {
+
+ s += (*DI)->print_to_string(1);
+ DI.next();
+ if (DI.live()) s += " && ";
+ if (pres_debug) fprintf(DebugFile,"Partial print to string: %s\n",
+ s.c_str());
+ }
+ return s;
+}
+
+void Rel_Body::print(FILE *output_file, bool printSym) {
+ if (this->is_null()) {
+ fprintf(output_file, "NULL Rel_Body\n");
+ return;
+ }
+
+ setup_names();
+
+ fprintf(output_file, "{");
+
+ std::string s = print_variables_to_string(printSym);
+ fprintf(output_file, "%s", s.c_str());
+
+ fprintf(output_file, ": ");
+
+ if(simplified_DNF==NULL) {
+ Formula::print(output_file);
+ }
+ else {
+ assert(children().empty());
+ simplified_DNF->print(output_file);
+ }
+
+ fprintf(output_file, " }\n");
+}
+
+void Rel_Body::print() {
+ this->print(stdout);
+}
+
+void F_Not::print(FILE *output_file) {
+ fprintf(output_file, " not ");
+ Formula::print(output_file);
+}
+
+void F_And::print_separator(FILE *output_file) {
+ fprintf(output_file, " and ");
+}
+
+void Conjunct::print(FILE *output_file) {
+ std::string s = print_to_string(true);
+ fprintf(output_file, "%s", s.c_str());
+}
+
+std::string Conjunct::print_to_string(int true_printed) {
+ std::string s="";
+
+ int num = myLocals.size();
+ if(num) {
+ s += "exists ( ";
+ int i;
+ for (i = 1; i <= num; i++) {
+ Variable_ID v = myLocals[i];
+ s += v->char_name();
+ if(i < num) s += ",";
+ }
+ if (true_printed || !(is_true())) s += " : ";
+ }
+
+ if(is_true()) {
+ s += true_printed ? "TRUE" : "";
+ }
+ else {
+ if (is_unknown())
+ s += "UNKNOWN";
+ else {
+ s += problem->prettyPrintProblemToString();
+ if (!exact)
+ s += " && UNKNOWN";
+ }
+ }
+
+
+ if (num) s += ")";
+ return s;
+}
+
+void F_Or::print_separator(FILE *output_file) {
+ fprintf(output_file, " or ");
+}
+
+void F_Declaration::print(FILE *output_file) {
+ std::string s="";
+ for(Variable_ID_Iterator VI(myLocals); VI; ) {
+ s += (*VI)->name();
+ VI++;
+ if(VI) s += ",";
+ }
+ fprintf(output_file, "( %s : ", s.c_str());
+ Formula::print(output_file);
+ fprintf(output_file, ")");
+}
+
+void F_Forall::print(FILE *output_file) {
+ fprintf(output_file, "forall ");
+ F_Declaration::print(output_file);
+}
+
+void F_Exists::print(FILE *output_file) {
+ fprintf(output_file, "exists ");
+ F_Declaration::print(output_file);
+}
+
+void Formula::print_separator(FILE *) {
+ assert(0); // should never be called, it's only for derived classes
+}
+
+//
+// Setup names in formula.
+//
+
+typedef Set<Global_Var_ID> g_set;
+void Rel_Body::setup_names() {
+ int i;
+
+
+ if (use_ugly_names) return;
+
+ if (pres_debug>=2)
+ fprintf(DebugFile,"Setting up names for 0x%p\n", this);
+
+ for(i=1; i<=number_input; i++) {
+ input_vars[i]->base_name = In_Names[i];
+ }
+ for(i=1; i<=number_output; i++) {
+ output_vars[i]->base_name = Out_Names[i];
+ }
+
+ g_set gbls;
+
+ wildCardInstanceNumber = 0;
+
+ for(i=1; i<= Symbolic.size(); i++) {
+ gbls.insert(Symbolic[i]->get_global_var());
+ }
+
+ foreach(g,Global_Var_ID,gbls,
+ g->instance = g->base_name()++);
+
+ for(i=1; i<=number_input; i++) {
+ if (!input_vars[i]->base_name.null())
+ input_vars[i]->instance = input_vars[i]->base_name++;
+ }
+ for(i=1; i<=number_output; i++) {
+ if (!output_vars[i]->base_name.null())
+ output_vars[i]->instance = output_vars[i]->base_name++;
+ }
+
+ if (simplified_DNF != NULL) // It is simplified
+ simplified_DNF->setup_names();
+ else // not simplified
+ Formula::setup_names();
+
+ for(i=1; i<=number_output; i++) {
+ if (!output_vars[i]->base_name.null())
+ output_vars[i]->base_name--;
+ }
+ for(i=1; i<=number_input; i++) {
+ if (!input_vars[i]->base_name.null())
+ input_vars[i]->base_name--;
+ }
+ foreach(g,Global_Var_ID,gbls, g->base_name()--);
+}
+
+void Formula::setup_names() {
+ if (pres_debug>=2)
+ fprintf(DebugFile,"Setting up names for formula 0x%p\n", this);
+
+ for(List_Iterator<Formula*> c(myChildren); c; c++)
+ (*c)->setup_names();
+}
+
+void DNF::setup_names() {
+ if (pres_debug>=2)
+ fprintf(DebugFile,"Setting up names for DNF 0x%p\n", this);
+
+ for(DNF_Iterator DI(this); DI.live(); DI.next())
+ DI.curr()->setup_names();
+}
+
+
+void F_Declaration::setup_names() {
+ if (pres_debug>=2)
+ fprintf(DebugFile,"Setting up names for Declaration 0x%p\n", this);
+
+ // Allow re-use of wc names in other scopes
+ int savedWildCardInstanceNumber = wildCardInstanceNumber;
+
+ for(Tuple_Iterator<Variable_ID> VI(myLocals); VI; VI++) {
+ Variable_ID v = *VI;
+ if (!v->base_name.null()) v->instance = v->base_name++;
+ else v->instance = wildCardInstanceNumber++;
+ }
+
+ for(List_Iterator<Formula*> c(children()); c; c++)
+ (*c)->setup_names();
+
+ for(Tuple_Iterator<Variable_ID> VI2(myLocals); VI2; VI2++) {
+ Variable_ID v = *VI2;
+ if (!v->base_name.null()) v->base_name--;
+ }
+ wildCardInstanceNumber = savedWildCardInstanceNumber;
+}
+
+
+//
+// Prefix_print functions.
+// Print Formula Tree, used in debugging.
+//
+static int level = 0;
+
+void Formula::prefix_print(FILE *output_file, int debug) {
+ for(List_Iterator<Formula*> c(children()); c; c++)
+ (*c)->prefix_print(output_file, debug);
+ level--;
+}
+
+
+void Rel_Body::prefix_print() {
+ this->prefix_print(stdout, 1);
+}
+
+void Rel_Body::prefix_print(FILE *output_file, int debug) {
+ int old_use_ugly_names = use_ugly_names;
+ use_ugly_names = 0;
+
+ setup_names();
+
+ level = 0;
+ if(pres_debug>=2) fprintf(output_file, "(@%p)", this);
+ fprintf(output_file, is_set() ? "SET: " : "RELATION: ");
+ std::string s = print_variables_to_string(true);
+ fprintf(output_file, "%s\n", s.c_str());
+
+ if(simplified_DNF==NULL) {
+ Formula::prefix_print(output_file, debug);
+ } else {
+ assert(children().empty());
+ simplified_DNF->prefix_print(output_file, debug, true);
+ }
+ fprintf(output_file, "\n");
+ use_ugly_names = old_use_ugly_names;
+}
+
+
+void F_Forall::prefix_print(FILE *output_file, int debug) {
+ Formula::print_head(output_file);
+ fprintf(output_file, "forall [");
+ F_Declaration::prefix_print(output_file, debug);
+ for (Variable_ID_Iterator VI(myLocals); VI; VI++)
+ assert((*VI)->kind() == Forall_Var);
+
+}
+
+void F_Exists::prefix_print(FILE *output_file, int debug) {
+ Formula::print_head(output_file);
+ if(pres_debug>=2) fprintf(output_file, "(@%p)", this);
+ fprintf(output_file, "exists [");
+ F_Declaration::prefix_print(output_file, debug);
+ for (Variable_ID_Iterator VI(myLocals); VI; VI++)
+ assert((*VI)->kind() == Exists_Var);
+}
+
+void F_Declaration::prefix_print(FILE *output_file, int debug) {
+ std::string s = "";
+ for (Variable_ID_Iterator VI(myLocals); VI; ) {
+ s += (*VI)->name();
+ print_var_addrs(s, *VI);
+ VI++;
+ if(VI) s += ",";
+ }
+ s += "]\n";
+ fprintf(output_file, "%s", s.c_str());
+ Formula::prefix_print(output_file, debug);
+}
+
+void F_Or::prefix_print(FILE *output_file, int debug) {
+ Formula::print_head(output_file);
+ fprintf(output_file, "or\n");
+ Formula::prefix_print(output_file, debug);
+}
+
+void F_And::prefix_print(FILE *output_file, int debug) {
+ Formula::print_head(output_file);
+ fprintf(output_file, "and\n");
+ Formula::prefix_print(output_file, debug);
+}
+
+void F_Not::prefix_print(FILE *output_file, int debug) {
+ Formula::print_head(output_file);
+ fprintf(output_file, "not\n");
+ Formula::prefix_print(output_file, debug);
+}
+
+void Conjunct::prefix_print(FILE *output_file, int debug) {
+ static char dir_glyphs[] = { '-', '?', '+' };
+
+ if (debug) {
+ Formula::print_head(output_file);
+ if(pres_debug>=2) fprintf(output_file, "(@%p)", this);
+ fprintf(output_file, "%s CONJUNCT, ", exact ? "EXACT" : "INEXACT");
+ if (simplified) fprintf(output_file, "simplified, ");
+ if (verified) fprintf(output_file, "verified, ");
+ if (possible_leading_0s != -1 && guaranteed_leading_0s != -1)
+ assert (guaranteed_leading_0s <= possible_leading_0s);
+ if (guaranteed_leading_0s != -1 && guaranteed_leading_0s == possible_leading_0s)
+ fprintf(output_file,"# leading 0's = %d,", possible_leading_0s);
+ else if (possible_leading_0s != -1 || guaranteed_leading_0s != -1) {
+ if (guaranteed_leading_0s != -1)
+ fprintf(output_file,"%d <= ",guaranteed_leading_0s);
+ fprintf(output_file,"#O's");
+ if (possible_leading_0s != -1)
+ fprintf(output_file," <= %d",possible_leading_0s);
+ fprintf(output_file,", ");
+ }
+ if (dir_glyphs[leading_dir+1] != '?')
+ fprintf(output_file," first = %c, ", dir_glyphs[leading_dir+1]);
+ fprintf(output_file,"myLocals=[");
+ std::string s="";
+ for (Variable_ID_Iterator VI(myLocals); VI; ) {
+ assert( (*VI)->kind() == Wildcard_Var);
+ s += (*VI)->name();
+ print_var_addrs(s, *VI);
+ VI++;
+ if(VI) s += ",";
+ }
+ s += "] mappedVars=[";
+ for(Variable_ID_Iterator MVI(mappedVars); MVI; ) {
+ s += (*MVI)->name();
+ print_var_addrs(s, *MVI);
+ MVI++;
+ if(MVI) s += ",";
+ }
+ fprintf(output_file, "%s]\n", s.c_str());
+ }
+ else
+ level++;
+
+ setOutputFile(output_file);
+ setPrintLevel(level+1);
+ problem->printProblem(debug);
+ setPrintLevel(0);
+ Formula::prefix_print(output_file, debug);
+}
+
+void Formula::print_head(FILE *output_file) {
+ level++;
+ int i;
+ for(i=0; i<level; i++) {
+ fprintf(output_file, ". ");
+ }
+}
+
+//
+// Print DNF.
+//
+void DNF::print(FILE *out_file) {
+ DNF_Iterator p(this);
+ if (!p.live())
+ fprintf(out_file, "FALSE");
+ else
+ for(; p.live(); ) {
+ p.curr()->print(out_file);
+ p.next();
+ if(p.live())
+ fprintf(out_file, " or ");
+ }
+}
+
+void DNF::prefix_print(FILE *out_file, int debug, bool parent_names_setup) {
+ wildCardInstanceNumber = 0;
+ Variable_ID_Tuple all_vars;
+ if(!use_ugly_names && !parent_names_setup) {
+ // We need to manually set up all of the input,output, and symbolic
+ // variables, since during simplification, a dnf's conjuncts may not
+ // be listed as part of a relation, or perhaps as part of different
+ // relations (?) (grr).
+ for(DNF_Iterator p0(this); p0.live(); p0.next()) {
+ for(Variable_Iterator vi((*p0)->mappedVars); vi; vi++)
+ if((*vi)->kind() != Wildcard_Var && all_vars.index(*vi) == 0)
+ all_vars.append(*vi);
+ (*p0)->setup_names();
+ }
+ foreach(v,Variable_ID,all_vars,
+ if (!v->base_name.null()) v->instance = v->base_name++;
+ else v->instance = wildCardInstanceNumber++;
+ );
+ }
+
+ int i = 1;
+ level = 0;
+ for(DNF_Iterator p(this); p.live(); p.next(), i++) {
+ fprintf(out_file, "#%d ", i);
+ if(*p == NULL)
+ fprintf(out_file, "(NULL)\n");
+ else
+ (*p)->prefix_print(out_file, debug);
+ }
+
+ foreach(v,Variable_ID,all_vars,if (!v->base_name.null()) v->base_name--);
+
+ fprintf(out_file, "\n");
+}
+
+std::string Constraint_Handle::print_to_string() const {
+ assert(0);
+ return "FOO";
+}
+
+std::string EQ_Handle::print_to_string() const {
+ relation()->setup_names();
+ std::string s = c->print_EQ_to_string(e);
+ return s;
+}
+
+std::string GEQ_Handle::print_to_string() const {
+ relation()->setup_names();
+ std::string s = c->print_GEQ_to_string(e);
+ return s;
+}
+
+std::string Constraint_Handle::print_term_to_string() const {
+ assert(0);
+ return "FOO";
+}
+
+std::string EQ_Handle::print_term_to_string() const {
+ relation()->setup_names();
+ std::string s = c->print_EQ_term_to_string(e);
+ return s;
+}
+
+std::string GEQ_Handle::print_term_to_string() const {
+ relation()->setup_names();
+ std::string s = c->print_GEQ_term_to_string(e);
+ return s;
+}
+
+}