diff options
author | Tuowen Zhao <ztuowen@gmail.com> | 2016-09-17 03:22:53 +0000 |
---|---|---|
committer | Tuowen Zhao <ztuowen@gmail.com> | 2016-09-17 03:22:53 +0000 |
commit | 75ff98e4d65862ff5b36b533b4f6e3ea71ede1d5 (patch) | |
tree | 498ac06b4cf78568b807fafd2619856afff69c28 /omegalib/omega_lib/src/pres_subs.cc | |
parent | 29efa7b1a0d089e02a70f73f348f11878955287c (diff) | |
download | chill-75ff98e4d65862ff5b36b533b4f6e3ea71ede1d5.tar.gz chill-75ff98e4d65862ff5b36b533b4f6e3ea71ede1d5.tar.bz2 chill-75ff98e4d65862ff5b36b533b4f6e3ea71ede1d5.zip |
cmake build
Diffstat (limited to 'omegalib/omega_lib/src/pres_subs.cc')
-rw-r--r-- | omegalib/omega_lib/src/pres_subs.cc | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/omegalib/omega_lib/src/pres_subs.cc b/omegalib/omega_lib/src/pres_subs.cc new file mode 100644 index 0000000..9854b09 --- /dev/null +++ b/omegalib/omega_lib/src/pres_subs.cc @@ -0,0 +1,131 @@ +#include <omega/pres_subs.h> + +namespace omega { + +Substitutions::Substitutions(Relation &input_R, Conjunct *input_c) { + int i; + r = new Relation(input_R,input_c); + c = r->single_conjunct(); + c->reorder_for_print(); + c->ordered_elimination(r->global_decls()->length()); + int num_subs = c->problem->nSUBs; + subs = new eqn[num_subs]; + for(i = 0; i < num_subs; i++) + subs[i] = SUBs[i]; + subbed_vars.reallocate(num_subs); + /* Go through and categorize variables as: + 1) substituted, 2) not substituted, 3) wildcard + Safevars number of variables were not able to be substituted. + nVars number of total variables, including wildcards. + nSUBs is the number of substitutions. + nSUBs + nVars == the number of variables that went in. + Then reset var and forwardingAddress arrays in the problem, + so that they will correctly refer to the reconstructed + mappedVars. */ + Variable_ID_Tuple unsubbed_vars(c->problem->safeVars); + for(i = 1; i <= c->mappedVars.size(); i++) + if(c->mappedVars[i]->kind() != Wildcard_Var) { + int addr = c->problem->forwardingAddress[i]; + assert(addr == c->find_column(c->mappedVars[i]) && addr != 0); + if(addr < 0) { + assert(-addr <= subbed_vars.size()); + subbed_vars[-addr] = c->mappedVars[i]; + } + else { + assert(addr <= unsubbed_vars.size()); + unsubbed_vars[addr] = c->mappedVars[i]; + } + } + else { + // Here we don't redeclare wildcards, just re-use them. + unsubbed_vars.append(c->mappedVars[i]); + } + assert(unsubbed_vars.size() + subbed_vars.size() == c->mappedVars.size()); + c->mappedVars = unsubbed_vars; /* These are the variables that remain */ + + for(int col = 1; col <= c->problem->nVars; col++) { + c->problem->var[col] = col; + c->problem->forwardingAddress[col] = col; + } +} + +Substitutions::~Substitutions() { + delete [] subs; + delete r; +} + +bool Substitutions::substituted(Variable_ID v) { + return (subbed_vars.index(v) > 0); +} + +Sub_Handle Substitutions::get_sub(Variable_ID v) { + assert(substituted(v) && "No substitution for variable"); + return Sub_Handle(this,subbed_vars.index(v)-1,v); +} + +bool Substitutions::sub_involves(Variable_ID v, Var_Kind kind) { + assert(substituted(v)); + for(Constr_Vars_Iter i = get_sub(v); i; i++) + if ((*i).var->kind() == kind) + return true; + return false; +} + + +//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + + +int Sub_Iterator::live() const { + return current <= last; +} + +void Sub_Iterator::operator++() { this->operator++(0); } + +void Sub_Iterator::operator++(int) { + current++; +} + +Sub_Handle Sub_Iterator::operator*() { + assert(s && current <= last && "Sub_Iterator::operator*: bad call"); + return Sub_Handle(s,current,s->subbed_vars[current+1]); +} + +Sub_Handle Sub_Iterator::operator*() const { + assert(s && current <= last && "Sub_Iterator::operator*: bad call"); + return Sub_Handle(s,current,s->subbed_vars[current+1]); +} + + +//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + + + +Sub_Handle::Sub_Handle(Substitutions *_s, int _e, Variable_ID _v) : +Constraint_Handle(_s->c,&(_s->subs),_e), v(_v) {} + +std::string Sub_Handle::print_to_string() const { + relation()->setup_names(); + return v->name() + " = " + this->print_term_to_string(); +} + +std::string Sub_Handle::print_term_to_string() const { + /* The horrible truth is that print_term_to_string is a member + function of Conjunct, (and then Problem below it) but uses + nothing from there but the names, so you can pass it a pointer to + an equation that isn't even part of the conjunct. */ + relation()->setup_names(); + return c->print_term_to_string(&((*eqns)[e])); +} + + +/* + String Sub_Handle::print_to_string() const { + return c->problem->print_EQ_to_string(&((*eqns)[e])); + } + + String Sub_Handle::print_term_to_string() const { + return c->print_term_to_string(&(*eqns[e])); + } +*/ + +} // namespace |