diff options
author | Tuowen Zhao <ztuowen@gmail.com> | 2016-09-19 21:14:58 +0000 |
---|---|---|
committer | Tuowen Zhao <ztuowen@gmail.com> | 2016-09-19 21:14:58 +0000 |
commit | 210f77d2c32f14d2e99577fd3c9842bb19d47e50 (patch) | |
tree | 5edb327c919b8309e301c3440fb6668a0075c8ef /omegalib/omega/src/Relation.cc | |
parent | a66ce5cd670c4d3c0dc449720f5bc45dd4c281b8 (diff) | |
download | chill-210f77d2c32f14d2e99577fd3c9842bb19d47e50.tar.gz chill-210f77d2c32f14d2e99577fd3c9842bb19d47e50.tar.bz2 chill-210f77d2c32f14d2e99577fd3c9842bb19d47e50.zip |
Moved most modules into lib
Diffstat (limited to 'omegalib/omega/src/Relation.cc')
-rw-r--r-- | omegalib/omega/src/Relation.cc | 279 |
1 files changed, 0 insertions, 279 deletions
diff --git a/omegalib/omega/src/Relation.cc b/omegalib/omega/src/Relation.cc deleted file mode 100644 index 1cca43a..0000000 --- a/omegalib/omega/src/Relation.cc +++ /dev/null @@ -1,279 +0,0 @@ -/***************************************************************************** - Copyright (C) 1994-2000 the Omega Project Team - Copyright (C) 2005-2011 Chun Chen - All Rights Reserved. - - Purpose: - class Relation - - Notes: - - History: -*****************************************************************************/ - -#include <omega/Relation.h> -#include <omega/Relations.h> -#include <omega/pres_dnf.h> -#include <omega/pres_conj.h> -#include <omega/Rel_map.h> -#include <omega/omega_i.h> -#include <omega/omega_core/debugging.h> - -namespace omega { - -// copy function for Relation, will be removed in the future -// in favor of correct C++ copy constructor and const paramater passing -Relation copy(const Relation &t) { - Relation r = t; - return r; -} - -// -// Create null relation. -// -Relation::Relation() : rel_body(&null_rel) { - rel_body->ref_count = 1; -} - -Relation Relation::Null() { - return Relation(); -} - -bool Relation::is_null() const { - return(rel_body == &null_rel); -} - - -// -// Create a relation. Its will be built later. -// -Relation::Relation(int n_input, int n_output) { - rel_body = new Rel_Body(n_input,n_output); - rel_body->ref_count = 1; -} - -Relation::Relation(Rel_Body &r, int) { - rel_body = &r; - r.ref_count++; -} - -Relation Relation::Empty(const Relation &R) { - if (R.is_set()) return Relation(R.n_set()); - else return Relation(R.n_inp(),R.n_out()); -} - -// -// Create relation which is FALSE or TRUE. -// - -Relation Relation::True(const Relation &R) { - if (R.is_set()) return True(R.n_set()); - else return True(R.n_inp(),R.n_out()); -} - -Relation Relation::False(const Relation &R) { - if (R.is_set()) return False(R.n_set()); - else return False(R.n_inp(),R.n_out()); -} - -Relation Relation::Unknown(const Relation &R) { - if (R.is_set()) return Unknown(R.n_set()); - else return Unknown(R.n_inp(), R.n_out()); -} - - -Relation Relation::True(int setvars) { - Relation R(setvars); - R.add_and(); - R.finalize(); - return R; -} - -Relation Relation::True (int in, int out) { - Relation R(in,out); - R.add_and(); - R.finalize(); - return R; -} - -Relation Relation::False (int setvars) { - Relation R(setvars); - R.add_or(); - R.finalize(); - return R; -} - -Relation Relation::False (int in, int out) { - Relation R(in,out); - R.add_or(); - R.finalize(); - return R; -} - - -Relation Relation::Unknown (int setvars) { - Relation R(setvars); - R.add_and(); - R.finalize(); - R.simplify(); - Conjunct * c= R.single_conjunct(); - c->make_inexact(); - return R; -} - -Relation Relation::Unknown (int in, int out) { - Relation R(in,out); - R.add_and(); - R.finalize(); - R.simplify(); - Conjunct * c= R.single_conjunct(); - c->make_inexact(); - return R; -} - - -// -// Copy a relation. -// -Relation::Relation(const Relation &r) { -#if defined(INCLUDE_COMPRESSION) - assert(!r.is_compressed()); -#endif - if (r.is_finalized()) { - rel_body = r.rel_body; - rel_body->ref_count++; - } else { - assert(! r.rel_body->is_shared()); - // rel_body = new Rel_Body(r.rel_body); - rel_body = r.rel_body->clone(); - rel_body->ref_count = 1; - } -} - -// -// Copy relation r and replace formula in it with conjunct c. -// Wayne (TM) function. -// -Relation::Relation(const Relation &r, Conjunct *c) { - rel_body = new Rel_Body(r.rel_body, c); - rel_body->ref_count = 1; -} - - -// -// Assign a relation r to this relation. -// -Relation &Relation::operator=(const Relation &r) { -#if defined(INCLUDE_COMPRESSION) - assert (!r.is_compressed()); -#endif - - /* === Destroy this === */ - assert(rel_body->ref_count >= 1); - if(rel_body!=&null_rel && --(rel_body->ref_count)==0) { - delete rel_body; - } - - /* === Copy r to this === */ - if (r.is_finalized()) { - rel_body = r.rel_body; - rel_body->ref_count++; - } else { - assert(! r.rel_body->is_shared()); - // rel_body = new Rel_Body(r.rel_body); - rel_body = r.rel_body->clone(); - rel_body->ref_count = 1; - } - return *this; -} - -void Relation::copy_names(Rel_Body &r) { - int t; - for(t = 1; t <= r.n_inp(); t++) - name_input_var(t,r.input_var(t)->base_name); - for(t = 1; t <= r.n_out(); t++) - name_output_var(t,r.output_var(t)->base_name); -} - - -// Like makeSet (see Relations.c), but won't invert the relation -- -// fails if it has output instead of input variables. Called in Relation -// functions just after a MapRel, so that we know there are no outputs anyway. - -void Relation::markAsSet() { - assert(!is_null()); - assert(is_set() || (n_inp() >= 0 && n_out() == 0)); - if (!is_set()) split(); // split if we'll modify this - rel_body->_is_set = true; - invalidate_leading_info(); -} - -void Relation::markAsRelation() { - assert(!is_null()); - if (is_set()) split(); // split if we'll modify this - rel_body->_is_set = false; -} - - -Relation::~Relation() { - assert(rel_body->ref_count >= 1); - assert(this->is_null() == (rel_body == &null_rel)); - if(rel_body!=&null_rel && --(rel_body->ref_count)==0) { - if (rel_body == &null_rel) abort(); - delete rel_body; - } -} - - - -// -// One of the representatives using the body wants to be changed. -// Create a separate body for this rep not to damage other reps. -// Return address of the body. Old rep point to new body. -// -Rel_Body *Relation::split() { - assert(rel_body != &null_rel && "Error: Attempt to modify a null relation"); - assert (rel_body->ref_count >= 1); - if(!(rel_body==&null_rel || rel_body->ref_count==1)) { - if(pres_debug) { - fprintf(DebugFile, "+++ SPLIT relation +++\n"); - } - // Rel_Body *new_body = new Rel_Body(rel_body); - Rel_Body *new_body = rel_body->clone(); - new_body->ref_count = 1; - rel_body->ref_count--; - rel_body = new_body; - if(pres_debug>=2) { - fprintf(DebugFile, " copying 0x%p to give 0x%p\n", this, rel_body); - } - } - return (rel_body); -} - - -void Relation::dimensions(int & ndim_all, int &ndim_domain) { - ndim_all = ndim_domain = 0; - int a,d; - simplify(2,2); - for (DNF_Iterator s(query_DNF()); s.live(); s.next()) { - s.curr()->calculate_dimensions(*this, a, d); - if (a > ndim_all) ndim_all = a; - if (d > ndim_domain) ndim_domain = d; - } -} - -// Make a set: assert that it had only input or output variables, make it -// it have only input, set a flag. Called from domain, range, and difference, -// as well as functions that require a set as input. -void Relation::makeSet() { - assert(!is_null()); - // Assert that it is a set... - assert((n_inp() == 0 && n_out() >= 0) || (n_inp() >= 0 && n_out() == 0)); - - if ((n_inp() == 0 && n_out() != 0) || !is_set()) split(); // split if we'll modify this - if (n_inp() == 0 && n_out() != 0) //Inverse the relation - Inverse(*this); // Modifies "this"; also returns this but we ignore it - rel_body->_is_set = true; -} - -} // namespace |