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 /omega/omega_lib | |
| parent | 29efa7b1a0d089e02a70f73f348f11878955287c (diff) | |
| download | chill-75ff98e4d65862ff5b36b533b4f6e3ea71ede1d5.tar.gz chill-75ff98e4d65862ff5b36b533b4f6e3ea71ede1d5.tar.bz2 chill-75ff98e4d65862ff5b36b533b4f6e3ea71ede1d5.zip  | |
cmake build
Diffstat (limited to 'omega/omega_lib')
65 files changed, 0 insertions, 28322 deletions
diff --git a/omega/omega_lib/doc/interface.pdf b/omega/omega_lib/doc/interface.pdf Binary files differdeleted file mode 100644 index 7f918ae..0000000 --- a/omega/omega_lib/doc/interface.pdf +++ /dev/null diff --git a/omega/omega_lib/include/omega.h b/omega/omega_lib/include/omega.h deleted file mode 100644 index 8aa2c08..0000000 --- a/omega/omega_lib/include/omega.h +++ /dev/null @@ -1,71 +0,0 @@ -/********************************************************************* - Old license information from the Omega Project, updated one can be - found in LICENSE file.  - -    Copyright (C) 1994-1996 by the Omega Project -    All rights reserved. - -    NOTICE:  This software is provided ``as is'', without any -    warranty, including any implied warranty for merchantability or -    fitness for a particular purpose.  Under no circumstances shall -    the Omega Project or its agents be liable for any use of, misuse -    of, or inability to use this software, including incidental and -    consequential damages. - -    License is hereby given to use, modify, and redistribute this -    software, in whole or in part, for any purpose, commercial or -    non-commercial, provided that the user agrees to the terms of this -    copyright notice, including disclaimer of warranty, and provided -    that this copyright notice, including disclaimer of warranty, is -    preserved in the source code and documentation of anything derived -    from this software.  Any redistributor of this software or -    anything derived from this software assumes responsibility for -    ensuring that any parties to whom such a redistribution is made -    are fully aware of the terms of this license and disclaimer. - -    The Omega project can be contacted at omega@cs.umd.edu -    or http://www.cs.umd.edu/projects/omega -*********************************************************************/ - -#ifndef Already_Included_Omega -#define Already_Included_Omega - -/* - * The presburger interface is divided into the following parts. - * These parts are all included together, but are in separate - * files to keep things organized a bit. - * - * In many files, you can include just some of the following, - * specifically: if you are building a presburger tree, just - * include "pres_tree.h"; if you are querying it, include - * "pres_dnf.d" and "pres_conj.h"; if you are doing relational - * operations, include "Relation.h" - * - * Most of the function definitions are in the .c files with - * the same name as the .h that declares them, except: - *   the remap and push_exists functions are in pres_var.c - *   the DNFize functions are in pres_dnf.c - *   the functions involving printing are in pres_print.c - *   the beautify functions are in pres_beaut.c - *   the rearrange functions are in pres_rear.c - *   the compression functions are in pres_cmpr.c - */ - -#include <omega/omega_core/debugging.h> -#include <omega/pres_var.h> -#include <omega/pres_cnstr.h> -#include <omega/pres_subs.h> -#include <omega/pres_form.h> -#include <omega/pres_logic.h> -#include <omega/pres_decl.h> -#include <omega/pres_quant.h> -#include <omega/pres_conj.h> -#include <omega/pres_cmpr.h> -#include <omega/Relation.h> - -#include <omega/Rel_map.h> -#include <omega/farkas.h> -#include <omega/hull.h> -#include <omega/closure.h> - -#endif diff --git a/omega/omega_lib/include/omega/RelBody.h b/omega/omega_lib/include/omega/RelBody.h deleted file mode 100644 index 3c11702..0000000 --- a/omega/omega_lib/include/omega/RelBody.h +++ /dev/null @@ -1,165 +0,0 @@ -#if ! defined _RelBody_h -#define _RelBody_h 1 - -#include <omega/pres_form.h> -#include <omega/pres_dnf.h> - -namespace omega { - -typedef enum {under_construction, compressed, uncompressed} Rel_Body_Status; -typedef unsigned char Rel_Unknown_Uses; -const Rel_Unknown_Uses no_u = 1; -const Rel_Unknown_Uses and_u = 2; -const Rel_Unknown_Uses or_u = 4; - -// -// Relation body. -// Body and representative are separated to do reference counting. -// - -class Rel_Body : public Formula { -public: -  bool is_null() const; - -  inline Node_Type node_type() { return Op_Relation; } - -  inline bool is_set() const { return number_output == 0; } -  int n_inp() const; -  int n_out() const; -  int n_set() const; - -  inline Variable_ID_Tuple *global_decls() { return  &Symbolic; } -  int max_ufs_arity(); -  int max_shared_ufs_arity(); -  int max_ufs_arity_of_set(); -  int max_ufs_arity_of_in(); -  int max_ufs_arity_of_out(); - -  Variable_ID input_var(int nth); -  Variable_ID output_var(int nth); -  Variable_ID set_var(int nth); -  Variable_ID get_local(const Variable_ID v); -  Variable_ID get_local(const Global_Var_ID G); -  Variable_ID get_local(const Global_Var_ID G, Argument_Tuple of); -  bool        has_local(const Global_Var_ID G); -  bool        has_local(const Global_Var_ID G, Argument_Tuple of); -  void        name_input_var(int, Const_String); -  void        name_output_var(int, Const_String); -  void        name_set_var(int, Const_String); - -  F_And      *and_with_and(); -  EQ_Handle   and_with_EQ(); -  EQ_Handle   and_with_EQ(const Constraint_Handle &c); -  GEQ_Handle  and_with_GEQ(); -  GEQ_Handle  and_with_GEQ(const Constraint_Handle &c); - -  void   print(); -  void   print(FILE *output_file) { print(output_file, true); } -  void   print(FILE *output_file, bool printSym); -  std::string print_variables_to_string(bool printSym); -  void   print_with_subs(FILE *output_file, bool printSym, bool newline); -  void   print_with_subs(); -  std::string print_with_subs_to_string(bool printSym, bool newline); -  std::string print_outputs_with_subs_to_string(); -  std::string print_outputs_with_subs_to_string(int i); -  std::string print_formula_to_string(); -  void   prefix_print(); -  void   prefix_print(FILE *output_file, int debug = 1); - -  bool is_satisfiable(); -  bool is_lower_bound_satisfiable(); -  bool is_upper_bound_satisfiable(); -  bool is_obvious_tautology(); -  bool is_definite_tautology(); -  bool is_unknown(); -  DNF*    query_DNF(); -  DNF*    query_DNF(int rdt_conjs, int rdt_constrs); -  void    simplify(int rdt_conjs = 0, int rdt_constrs = 0);   -  void    finalize(); -  inline bool is_finalized() { return finalized; } -  inline bool is_shared()    { return ref_count > 1; } - -  void query_difference(Variable_ID v1, Variable_ID v2, -                        coef_t &lowerBound, coef_t &upperBound, -                        bool &quaranteed); -  void query_variable_bounds(Variable_ID, coef_t &lowerBound, coef_t &upperBound); -  coef_t query_variable_mod(Variable_ID v, coef_t factor); - -  Relation extract_dnf_by_carried_level(int level, int direction); -  void make_level_carried_to(int level); - -  // these are only public to allow the creation of "null_rel" -  Rel_Body(); -  ~Rel_Body(); -  void setup_names(); - -private: - -  // These are manipulated primarily as parts of Relations -  friend class Relation; -  friend_rel_ops; - -  friend void remap_DNF_vars(Rel_Body *new_rel, Rel_Body *old_rel); - -  Rel_Unknown_Uses unknown_uses(); - -  inline bool is_simplified() const { return (simplified_DNF!=NULL && get_children().empty()); } -  bool is_compressed(); -  Conjunct *rm_first_conjunct(); -  Conjunct *single_conjunct(); -  bool has_single_conjunct(); - -  void beautify(); -  void rearrange(); - -  friend class EQ_Handle;  // these set up names for printing -  friend class GEQ_Handle; // and check if simplified -  friend class Constraint_Handle;  // and update coefficients - -  void compress(); -  void uncompress(); - -  void interpret_unknown_as_true(); -  void interpret_unknown_as_false(); -  -  Rel_Body(int n_input, int n_output); -  /* Rel_Body(Rel_Body *r); */ -  Rel_Body(Rel_Body *r, Conjunct *c); -  Rel_Body &operator=(Rel_Body &r); -  Rel_Body *clone(); - -  inline Formula *formula()    { return children().front(); } -  inline Formula *rm_formula() { return children().remove_front(); } -  bool can_add_child(); -     -  void reverse_leading_dir_info(); -  void invalidate_leading_info(int changed = -1) { Formula::invalidate_leading_info(changed); } -  void enforce_leading_info(int guaranteed, int possible, int dir) { Formula::enforce_leading_info(guaranteed, possible, dir); } -  // re-declare this so that Relation (a friend) can call it - -  DNF* DNFize(); -  void DNF_to_formula(); -     -  Conjunct *find_available_conjunct(); -  F_And *find_available_And(); - - -/* === data === */ -private: - -  int ref_count; -  Rel_Body_Status status; - -  int number_input, number_output; -  Tuple<Const_String> In_Names, Out_Names; -  Variable_ID_Tuple Symbolic; - -  DNF* simplified_DNF; -  short r_conjs;  // are redundant conjuncts eliminated? -  bool finalized; -  bool _is_set; -}; - -} // namespace - -#endif diff --git a/omega/omega_lib/include/omega/Rel_map.h b/omega/omega_lib/include/omega/Rel_map.h deleted file mode 100644 index 5641cb3..0000000 --- a/omega/omega_lib/include/omega/Rel_map.h +++ /dev/null @@ -1,161 +0,0 @@ -#if ! defined _Rel_map_h -#define _Rel_map_h 1 - -#include <omega/pres_gen.h> -#include <omega/pres_var.h> - -namespace omega { - -// -// Mapping for relations -// When a relation operation needs to re-arrange the variables, -//  it describes the re-arragement with a mapping, and then calls -//  align to re-arrange them. -// -// In a mapping, map_in (map_out/map_set) gives the new type and -//  position of each of the old input (output/set) variables. -// For variables being mapped to Input, Output, or Set variables, -//  the position is the new position in the tuple. -// For variables being mapped to Exists_Var, Forall_Var, or -//  Wildcard_Var, the positions can be used to map multiple -//  variables to the same quantified variable, by providing -//  the same position.  Each variable with a negative position -//  is given a unique quantified variable that is NOT listed -//  in the seen_exists_ids list. -// I'm not sure what the positions mean for Global_Vars - perhaps -//  they are ignored? -// -// Currently, align seems to support only mapping to Set, Input, -//  Output, and Exists vars. -// - -class Mapping { -public: -  inline  Mapping(int no_in, int no_out): n_input(no_in), n_output(no_out) {} -  inline  Mapping(int no_set): n_input(no_set), n_output(0){} -  inline  Mapping(const Mapping &m): n_input(m.n_input), n_output(m.n_output) { -    int i; -    for(i=1; i<=n_input; i++) map_in_kind[i] = m.map_in_kind[i]; -    for(i=1; i<=n_input; i++) map_in_pos[i]  = m.map_in_pos[i]; -    for(i=1; i<=n_output;i++) map_out_kind[i] = m.map_out_kind[i]; -    for(i=1; i<=n_output;i++) map_out_pos[i] = m.map_out_pos[i]; -  } - -  inline void set_map (Var_Kind in_kind, int pos, Var_Kind type, int map) { -    if(in_kind==Input_Var) -      set_map_in(pos,type,map); -    else if(in_kind==Set_Var) -      set_map_in(pos,type,map); -    else if(in_kind==Output_Var) -      set_map_out(pos,type,map); -    else -      assert(0); -  } - -  inline void set_map_in (int pos, Var_Kind type, int map) { -    assert(pos>=1 && pos<=n_input); -    map_in_kind[pos] = type; -    map_in_pos[pos] = map; -  } -  inline void set_map_set (int pos, Var_Kind type, int map) { -    assert(pos>=1 && pos<=n_input); -    map_in_kind[pos] = type; -    map_in_pos[pos] = map; -  } - -  inline void set_map_out(int pos, Var_Kind type, int map) { -    assert(pos>=1 && pos<=n_output); -    map_out_kind[pos] = type; -    map_out_pos[pos] = map; -  } - -  inline Var_Kind get_map_in_kind(int pos)  const { -    assert(pos>=1 && pos<=n_input); -    return map_in_kind[pos]; -  } - -  inline int get_map_in_pos(int pos)  const { -    assert(pos>=1 && pos<=n_input); -    return map_in_pos[pos]; -  } - -  inline Var_Kind get_map_out_kind(int pos)  const { -    assert(pos>=1 && pos<=n_output); -    return map_out_kind[pos]; -  } - -  inline int get_map_out_pos(int pos)  const { -    assert(pos>=1 && pos<=n_output); -    return map_out_pos[pos]; -  } - -  inline int n_in()  const { return n_input;  } -  inline int n_out() const { return n_output; } - -  // If a tuple as a whole becomes the new Input or Output tuple, -  //  return the Tuple of they will become (Input, Output) -  // Return Unknown_Tuple otherwise - -  inline Argument_Tuple get_tuple_fate(Argument_Tuple t, int prefix = -1) const { -    return   t== Input_Tuple ?  get_input_fate(prefix) : -      (t==Output_Tuple ? get_output_fate(prefix) : Unknown_Tuple); } - -  inline Argument_Tuple get_set_fate(int prefix = -1) const { -    return get_input_fate(prefix); } - -  inline Argument_Tuple get_input_fate(int prefix = -1) const { -    if (prefix < 0) prefix = n_input; -    assert(n_input >= prefix); -    if (n_input < prefix) -      return Unknown_Tuple; -    Var_Kind vf = map_in_kind[1]; -    for (int i = 1; i<=prefix; i++) -      if (map_in_pos[i]!=i || map_in_kind[i]!=vf) -        return Unknown_Tuple; - -    return vf == Input_Var  ? Input_Tuple -      : vf == Set_Var    ? Set_Tuple -      : vf == Output_Var ? Output_Tuple -      : Unknown_Tuple; -  } -   -  inline Argument_Tuple get_output_fate(int prefix = -1) const { -    if (prefix < 0) prefix = n_output; -    assert(n_output >= prefix); -    if (n_output < 1) -      return Unknown_Tuple; -    Var_Kind vf = map_out_kind[1]; -    for (int i = 1; i<=prefix; i++) -      if (map_out_pos[i]!=i || map_out_kind[i]!=vf) -        return Unknown_Tuple; -    return vf == Input_Var  ? Input_Tuple -      : vf == Set_Var    ? Set_Tuple -      : vf == Output_Var ? Output_Tuple -      : Unknown_Tuple; -  } - -  inline static Mapping Identity(int inp, int outp) { -    Mapping m(inp, outp); int i; -    for(i=1; i<=m.n_input; i++) m.set_map(Input_Var, i, Input_Var, i); -    for(i=1; i<=m.n_output;i++) m.set_map(Output_Var, i, Output_Var, i); -    return m; -  } - -  inline static Mapping Identity(int setvars) { -    Mapping m(setvars); int i; -    for(i=1; i<=setvars; i++) m.set_map(Set_Var, i, Set_Var, i); -    return m; -  } - -private: -  int  n_input; -  int  n_output; -  Var_Kind map_in_kind[maxVars]; -  int      map_in_pos[maxVars]; -  Var_Kind map_out_kind[maxVars]; -  int      map_out_pos[maxVars]; -}; - -} // namespace - -#endif diff --git a/omega/omega_lib/include/omega/Relation.h b/omega/omega_lib/include/omega/Relation.h deleted file mode 100644 index b41bef5..0000000 --- a/omega/omega_lib/include/omega/Relation.h +++ /dev/null @@ -1,299 +0,0 @@ -#if ! defined _Relation_h -#define _Relation_h 1 - -#include <omega/RelBody.h> -#include <omega/pres_cnstr.h> -#include <iostream> -#include <limits.h> - -namespace omega { - -// -// Relation representative. -// Body and representative are separated to do reference counting. -// -class Relation { -public: -  Relation(); - -  Relation(int n_input, int n_output = 0); -  Relation(const Relation &r); -  Relation(const Relation &r, Conjunct *c); -  Relation &operator=(const Relation &r); -  Relation(Rel_Body &r, int foo); - -  static Relation Null(); -  static Relation Empty(const Relation &R); -  static Relation True(const Relation &R); -  static Relation True(int setvars); -  static Relation True(int in, int out); -  static Relation False(const Relation &R); -  static Relation False(int setvars); -  static Relation False(int in, int out); -  static Relation Unknown(const Relation &R); -  static Relation Unknown(int setvars); -  static Relation Unknown(int in, int out); - - -  bool is_null() const; - -  ~Relation(); - -  inline F_Forall *add_forall() -  { return rel_body->add_forall(); } -  inline F_Exists *add_exists() -  { return rel_body->add_exists(); } -  inline F_And    *add_and() -  { return rel_body->add_and(); } -  inline F_And    *and_with() -  { return rel_body->and_with(); } -  inline F_Or     *add_or() -  { return rel_body->add_or(); } -  inline F_Not    *add_not() -  { return rel_body->add_not(); } -  inline void finalize() -  { rel_body->finalize(); } -  inline bool is_finalized() const -  { return rel_body->finalized; } -  inline bool is_set() const -  { return rel_body->is_set();   }   -  inline int n_inp() const -  { return rel_body->n_inp(); } -  inline int n_out() const -  { return rel_body->n_out(); } -  inline int n_set() const -  { return rel_body->n_set(); } - -  inline const Variable_ID_Tuple *global_decls() const -  { return rel_body->global_decls(); } -  inline int max_ufs_arity() const -  { return rel_body->max_ufs_arity(); } -  inline int max_ufs_arity_of_in() const -  { return rel_body->max_ufs_arity_of_in(); } -  inline int max_ufs_arity_of_set() const -  { return rel_body->max_ufs_arity_of_set(); } -  inline int max_ufs_arity_of_out() const -  { return rel_body->max_ufs_arity_of_out(); } -  inline int max_shared_ufs_arity() const -  { return rel_body->max_shared_ufs_arity(); } - -  inline Variable_ID input_var(int nth) -  { return rel_body->input_var(nth); } -  inline Variable_ID output_var(int nth) -  { return rel_body->output_var(nth); } -  inline Variable_ID set_var(int nth) -  { return rel_body->set_var(nth); } -  inline bool has_local(const Global_Var_ID G) -  { return  rel_body->has_local(G); }  -  inline bool has_local(const Global_Var_ID G, Argument_Tuple of) -  { return  rel_body->has_local(G, of); }  -  inline Variable_ID get_local(const Variable_ID v) -  { return split()->get_local(v); } -  inline Variable_ID get_local(const Global_Var_ID G) -  { return split()->get_local(G); } -  inline Variable_ID get_local(const Global_Var_ID G, Argument_Tuple of) -  { return split()->get_local(G, of); } - -  inline void        name_input_var(int nth, Const_String S) -  { split()->name_input_var(nth, S); } -  inline void        name_output_var(int nth, Const_String S) -  { split()->name_output_var(nth, S); } -  inline void        name_set_var(int nth, Const_String S) -  { split()->name_set_var(nth, S); } - - -  inline F_And      *and_with_and() -  { return split()->and_with_and(); } -  inline EQ_Handle   and_with_EQ() -  { return split()->and_with_EQ(); } -  inline EQ_Handle   and_with_EQ(const Constraint_Handle &c) -  { return split()->and_with_EQ(c); } -  inline GEQ_Handle  and_with_GEQ() -  { return split()->and_with_GEQ(); } -  inline GEQ_Handle  and_with_GEQ(const Constraint_Handle &c) -  { return split()->and_with_GEQ(c); } - -  inline void print() -  { rel_body->print(); } -  inline void print(FILE *output_file) -  { rel_body->print(output_file); } -  inline void print_with_subs() -  { rel_body->print_with_subs(); } -  inline void print_with_subs(FILE *output_file, bool printSym=false,  -                              bool newline=true) -  { rel_body->print_with_subs(output_file, printSym, newline); } -  inline std::string print_with_subs_to_string(bool printSym=false,  -                                          bool newline=true) -  { return rel_body->print_with_subs_to_string(printSym, newline); } -  inline std::string print_outputs_with_subs_to_string() -  { return rel_body->print_outputs_with_subs_to_string(); } -  inline std::string print_outputs_with_subs_to_string(int i) -  { return rel_body->print_outputs_with_subs_to_string(i); } -  inline void prefix_print() -  { rel_body->prefix_print(); } -  inline void prefix_print(FILE *output_file, int debug = 1) -  { rel_body->prefix_print(output_file, debug); } -  inline std::string print_formula_to_string() { -    return rel_body->print_formula_to_string(); -  } -  void dimensions(int & ndim_all, int &ndim_domain); - -  inline bool is_lower_bound_satisfiable() -  { return rel_body->is_lower_bound_satisfiable(); } -  inline bool is_upper_bound_satisfiable() -  { return rel_body->is_upper_bound_satisfiable(); } -  inline bool is_satisfiable() -  { return rel_body->is_satisfiable(); } - -  inline bool is_tautology() -  { return rel_body->is_obvious_tautology(); }  // for compatibility -  inline bool is_obvious_tautology() -  { return rel_body->is_obvious_tautology(); } -  inline bool is_definite_tautology() -  { return rel_body->is_definite_tautology(); } - -  // return x s.t. forall conjuncts c, c has >= x leading 0s -  // for set, return -1 (pass this in, in case there are no conjuncts -  inline int    number_of_conjuncts() -  { return rel_body->query_DNF()->length(); } - -  // return x s.t. forall conjuncts c, c has >= x leading 0s -  // for set, return -1 (pass this in, in case there are no conjuncts -  inline int    query_guaranteed_leading_0s() -  { return rel_body->query_DNF()->query_guaranteed_leading_0s(this->is_set() ? -1 : 0); } - -  // return x s.t. forall conjuncts c, c has <= x leading 0s -  // if no conjuncts return min of input and output tuple sizes, or -1 if relation is a set -  inline int    query_possible_leading_0s() -  { return rel_body->query_DNF()->query_possible_leading_0s( -      this->is_set()? -1 : min(n_inp(),n_out())); } - -  // return +-1 according to sign of leading dir, or 0 if we don't know -  inline int    query_leading_dir() -  { return rel_body->query_DNF()->query_leading_dir(); } - -  inline DNF*    query_DNF() -  { return rel_body->query_DNF(); } -  inline DNF*    query_DNF(int rdt_conjs, int rdt_constrs) -  { return rel_body->query_DNF(rdt_conjs, rdt_constrs); } -  inline void    simplify(int rdt_conjs = 0, int rdt_constrs = 0) -  { rel_body->simplify(rdt_conjs, rdt_constrs); } -  inline bool is_simplified() -  { return rel_body->is_simplified(); } -  inline bool is_compressed() const -  { return rel_body->is_compressed(); } -  inline Conjunct *rm_first_conjunct() -  { return rel_body->rm_first_conjunct(); } -  inline Conjunct *single_conjunct() -  { return rel_body->single_conjunct(); } -  inline bool has_single_conjunct() -  { return rel_body->has_single_conjunct(); } - - -  void query_difference(Variable_ID v1, Variable_ID v2, coef_t &lowerBound, coef_t &upperBound, bool &guaranteed) { -    rel_body->query_difference(v1, v2, lowerBound, upperBound, guaranteed); -  } -  void query_variable_bounds(Variable_ID v, coef_t &lowerBound, coef_t &upperBound) { -    rel_body->query_variable_bounds(v,lowerBound,upperBound); -  } -  coef_t query_variable_mod(Variable_ID v, coef_t factor) { -    assert(factor > 0); -    return rel_body->query_variable_mod(v, factor); -  } -  int query_variable_mod(Variable_ID v, int factor) { -    assert(sizeof(int) <= sizeof(coef_t)); -    coef_t result = rel_body->query_variable_mod(v, static_cast<coef_t>(factor)); -    if (result == posInfinity) -      return INT_MAX; -    else -      return static_cast<int>(result); -  } -   - -  inline void make_level_carried_to(int level) -  { -    split()->make_level_carried_to(level); -  } - -  inline Relation extract_dnf_by_carried_level(int level, int direction) -  { -    return split()->extract_dnf_by_carried_level(level, direction); -  } - -  inline void compress() -  { -#if defined(INCLUDE_COMPRESSION) -    split()->compress();  -#endif -  } -  void uncompress() -  { rel_body->uncompress(); } - -  inline bool is_exact() const -  { return !(rel_body->unknown_uses() & (and_u | or_u)) ; } -  inline bool is_inexact() const -  { return !is_exact(); } -  inline bool is_unknown() const -  { return rel_body->is_unknown(); } -  inline Rel_Unknown_Uses unknown_uses() const -  { return rel_body->unknown_uses(); } - -  void setup_names() {rel_body->setup_names();} -  void copy_names(const Relation &r) { -    copy_names(*r.rel_body); -  }; -  void copy_names(Rel_Body &r); - -private: -  // Functions that have to create sets from relations: -  friend class Rel_Body; -  friend_rel_ops; - -   -  Rel_Body *split(); - -  DNF* simplified_DNF() { -    simplify(); -    return rel_body->simplified_DNF; -  }; - -  inline void invalidate_leading_info(int changed = -1) -  { split()->invalidate_leading_info(changed); } -  inline void enforce_leading_info(int guaranteed, int possible, int dir) -  { -    split()->enforce_leading_info(guaranteed, possible, dir); -  } - - -  void    makeSet(); -  void    markAsSet(); -  void    markAsRelation(); - -  friend bool operator==(const Relation &, const Relation &); - -  void reverse_leading_dir_info() -  { split()->reverse_leading_dir_info(); } -  void interpret_unknown_as_true() -  { split()->interpret_unknown_as_true(); } -  void interpret_unknown_as_false() -  { split()->interpret_unknown_as_false(); } - - -  Rel_Body *rel_body; - - -  friend Relation merge_rels(Tuple<Relation> &R, const Tuple<std::map<Variable_ID, std::pair<Var_Kind, int> > > &mapping, const Tuple<bool> &inverse, Combine_Type ctype, int number_input, int number_output); -}; - -inline std::ostream & operator<<(std::ostream &o, Relation &R) -{ -  return o << R.print_with_subs_to_string(); -} - -Relation copy(const Relation &r); - -} // namespace - -#include <omega/Relations.h> - -#endif diff --git a/omega/omega_lib/include/omega/Relations.h b/omega/omega_lib/include/omega/Relations.h deleted file mode 100644 index 4fd81e6..0000000 --- a/omega/omega_lib/include/omega/Relations.h +++ /dev/null @@ -1,88 +0,0 @@ -#if ! defined _Relations_h -#define _Relations_h 1 - -#include <map> -#include <omega/Relation.h> - -namespace omega { - -// UPDATE friend_rel_ops IN pres_gen.h WHEN ADDING TO THIS LIST -// REMEMBER TO TAKE OUT DEFAULT ARGUMENTS IN THAT FILE - -/* The following allows us to avoid warnings about passing  -   temporaries as non-const references.  This is useful but  -   has suddenly become illegal.  */ -Relation consume_and_regurgitate(NOT_CONST Relation &R); - -// -// Operations over relations -// -Relation  Union(NOT_CONST Relation &r1, NOT_CONST Relation &r2); -Relation  Intersection(NOT_CONST Relation &r1, NOT_CONST Relation &r2); -Relation  Extend_Domain(NOT_CONST Relation &R); -Relation  Extend_Domain(NOT_CONST Relation &R, int more); -Relation  Extend_Range(NOT_CONST Relation &R); -Relation  Extend_Range(NOT_CONST Relation &R, int more); -Relation  Extend_Set(NOT_CONST Relation &R); -Relation  Extend_Set(NOT_CONST Relation &R, int more); -Relation  Restrict_Domain(NOT_CONST Relation &r1, NOT_CONST Relation &r2); // Takes set as 2nd -Relation  Restrict_Range(NOT_CONST Relation &r1, NOT_CONST Relation &r2);  // Takes set as 2nd -Relation  Domain(NOT_CONST Relation &r);      // Returns set -Relation  Range(NOT_CONST Relation &r);       // Returns set -Relation  Cross_Product(NOT_CONST Relation &A, NOT_CONST Relation &B);  // Takes two sets -Relation  Inverse(NOT_CONST Relation &r); -Relation  After(NOT_CONST Relation &r, int carried_by, int new_output,int dir=1); -Relation  Deltas(NOT_CONST Relation &R);            // Returns set -Relation  Deltas(NOT_CONST Relation &R, int eq_no); // Returns set -Relation  DeltasToRelation(NOT_CONST Relation &R, int n_input, int n_output); -Relation  Complement(NOT_CONST Relation &r); -Relation  Project(NOT_CONST Relation &R, Global_Var_ID v); -Relation  Project(NOT_CONST Relation &r, int pos, Var_Kind vkind); -Relation  Project(NOT_CONST Relation &S, Variable_ID v); -Relation  Project(NOT_CONST Relation &S, Sequence<Variable_ID> &s); -Relation  Project_Sym(NOT_CONST Relation &R); -Relation  Project_On_Sym(NOT_CONST Relation &R, -                         NOT_CONST Relation &context = Relation::Null()); -Relation  GistSingleConjunct(NOT_CONST Relation &R, NOT_CONST Relation &R2, int effort=0); -Relation  Gist(NOT_CONST Relation &R1, NOT_CONST Relation &R2, int effort=0); -Relation  Difference(NOT_CONST Relation &r1, NOT_CONST Relation &r2); -Relation  Approximate(NOT_CONST Relation &R, bool strides_allowed = false); -Relation  Identity(int n_inp); -Relation  Identity(NOT_CONST Relation &r); -bool      Must_Be_Subset(NOT_CONST Relation &r1, NOT_CONST Relation &r2); -bool      Might_Be_Subset(NOT_CONST Relation &r1, NOT_CONST Relation &r2); -// May is the same as might, just another name -bool      May_Be_Subset(NOT_CONST Relation &r1, NOT_CONST Relation &r2); -bool      Is_Obvious_Subset(NOT_CONST Relation &r1, NOT_CONST Relation &r2); -Relation  Composition(NOT_CONST Relation &F, NOT_CONST Relation &G); -bool      prepare_relations_for_composition(Relation &F, Relation &G); -Relation  Join(NOT_CONST Relation &G, NOT_CONST Relation &F); -Relation  EQs_to_GEQs(NOT_CONST Relation &, bool excludeStrides=false); -Relation  Symbolic_Solution(NOT_CONST Relation &S);  -Relation  Symbolic_Solution(NOT_CONST Relation &S, Sequence<Variable_ID> &T); -Relation  Sample_Solution(NOT_CONST Relation &S); -Relation  Solution(NOT_CONST Relation &S, Sequence<Variable_ID> &T); -Relation  Upper_Bound(NOT_CONST Relation &r); -Relation  Lower_Bound(NOT_CONST Relation &r); - -Relation merge_rels(Tuple<Relation> &R, const Tuple<std::map<Variable_ID, std::pair<Var_Kind, int> > > &mapping, const Tuple<bool> &inverse, Combine_Type ctype, int number_input = -1, int number_output = -1); - -// The followings might retire in the futrue!!! -void MapRel1(Relation &inputRel, -             const Mapping &map, -             Combine_Type ctype, -             int number_input=-1, int number_output=-1, -             bool invalidate_resulting_leading_info = true, -             bool finalize = true); -Relation MapAndCombineRel2(Relation &R1, Relation &R2,  -                           const Mapping &mapping1, const Mapping &mapping2, -                           Combine_Type ctype, -                           int number_input=-1, int number_output=-1); -void align(Rel_Body *originalr, Rel_Body *newr, F_Exists *fe, -           Formula *f, const Mapping &mapping, bool &newrIsSet, -           List<int> &seen_exists, -           Variable_ID_Tuple &seen_exists_ids); - -} // namespace - -#endif diff --git a/omega/omega_lib/include/omega/closure.h b/omega/omega_lib/include/omega/closure.h deleted file mode 100644 index 67088dd..0000000 --- a/omega/omega_lib/include/omega/closure.h +++ /dev/null @@ -1,31 +0,0 @@ -#if ! defined _closure_h -#define _closure_h - -#include <omega/Relation.h> - -namespace omega { - -Relation VennDiagramForm( -                Tuple<Relation> &Rs, -                NOT_CONST Relation &Context_In); -Relation VennDiagramForm( -                NOT_CONST Relation &R_In, -                NOT_CONST Relation &Context_In = Relation::Null()); - -// Given a Relation R, returns a relation deltas -// that correspond to the ConicHull of the detlas of R -Relation ConicClosure (NOT_CONST Relation &R); - -Relation  TransitiveClosure (NOT_CONST Relation &r,  -                             int maxExpansion = 1, -                             NOT_CONST Relation &IterationSpace=Relation::Null()); - -/* Tomasz Klimek */ -Relation calculateTransitiveClosure(NOT_CONST Relation &r); - -/* Tomasz Klimek */ -Relation ApproxClosure(NOT_CONST Relation &r); - -} // namespace -  -#endif diff --git a/omega/omega_lib/include/omega/evac.h b/omega/omega_lib/include/omega/evac.h deleted file mode 100644 index a561f8c..0000000 --- a/omega/omega_lib/include/omega/evac.h +++ /dev/null @@ -1,15 +0,0 @@ -#if defined STUDY_EVACUATIONS - -namespace omega { - -// study the evacuation from one side of C to the other for UFS's of -// arity up to max_arity -extern void study_evacuation(Conjunct *C, which_way dir, int max_arity); - -// study the evacuation from the joined C2's output and C1's input to -// either of the other possible tuples -extern void study_evacuation(Conjunct *C1, Conjunct *C2, int max_arity); - -} // namespace - -#endif diff --git a/omega/omega_lib/include/omega/farkas.h b/omega/omega_lib/include/omega/farkas.h deleted file mode 100644 index e77ed66..0000000 --- a/omega/omega_lib/include/omega/farkas.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef Already_Included_Affine_Closure -#define Already_Included_Affine_Closure - -#include <omega/Relation.h> - -namespace omega { - -enum Farkas_Type {Basic_Farkas, Decoupled_Farkas, -                  Linear_Combination_Farkas, Positive_Combination_Farkas, -                  Affine_Combination_Farkas, Convex_Combination_Farkas }; - -Relation Farkas(NOT_CONST Relation &R, Farkas_Type op, bool early_bailout = false); - -extern coef_t farkasDifficulty; -extern Global_Var_ID coefficient_of_constant_term; - -} // namespace - -#endif diff --git a/omega/omega_lib/include/omega/hull.h b/omega/omega_lib/include/omega/hull.h deleted file mode 100644 index 928d0c6..0000000 --- a/omega/omega_lib/include/omega/hull.h +++ /dev/null @@ -1,89 +0,0 @@ -#ifndef Already_Included_Hull -#define Already_Included_Hull - -#include <omega/farkas.h> - -namespace omega { - -Relation SimpleHull(const Relation &R, bool allow_stride_constraint = false, bool allow_irregular_constraint = false); -Relation SimpleHull(const std::vector<Relation> &Rs, bool allow_stride_constraint = false, bool allow_irregular_constraint = false); - - -// All of the following first call approximate on R to -// eliminate any wildcards and strides. - -// x in Convex Hull of R -// iff -// exist a_i, y_i s.t.  -//    x = Sum_i  a_i y_i s.t. -//    forall i, y_i in R -//    forall i, a_i >=0 -//    sum_i  a_i = 1 -Relation ConvexHull(NOT_CONST Relation &R); - -// DecoupledConvexHull is the same as ConvexHull,  -// except that it only finds constraints that involve -// both variables x&y if there is a constraint  -// that involves both x&y in one of the conjuncts  -// of R. -Relation DecoupledConvexHull(NOT_CONST Relation &R); - -// The affine hull just consists of equality constraints -// but is otherwise the tightest hull on R. -// x in Affine Hull of R -// iff -// exist a_i, y_i s.t.  -//    x = Sum_i  a_i y_i s.t. -//    forall i, y_i in R -//    sum_i  a_i = 1 -Relation AffineHull(NOT_CONST Relation &R); - -// x in Linear Hull of R -// iff -// exist a_i, y_i s.t.  -//    x = Sum_i  a_i y_i s.t. -//    forall i, y_i in R -Relation LinearHull(NOT_CONST Relation &R); - -// The conic hull is the tighest cone that contains R -// x in Conic Hull of R. -// iff -// exist a_i, y_i s.t.  -//    x = Sum_i  a_i y_i s.t. -//    forall i, y_i in R -//    forall i, a_i >=0 -Relation ConicHull(NOT_CONST Relation &R); - -// RectHull includes readily-available constraints from relation -// that can be part of hull, plus rectangular bounds calculated -// from input/output/set variables' range. -Relation RectHull(NOT_CONST Relation &Rel); - -// A constraint is in the result of QuickHull only if it appears in one of -// the relations and is directly implied by a single constraint in each of -// the other relations. -Relation QuickHull(Relation &R); // deprecated -Relation QuickHull(Tuple<Relation> &Rs); // deprecated - -Relation FastTightHull(NOT_CONST Relation &input_R, -                        NOT_CONST Relation &input_H); -Relation  Hull(NOT_CONST Relation &R,  -			bool stridesAllowed = false, -			int effort=1, -			NOT_CONST Relation &knownHull = Relation::Null() -			); -Relation Hull(Tuple<Relation> &Rs,  -              const std::vector<bool> &validMask,  -              int effort = 1,  -              bool stridesAllowed = false, -              NOT_CONST Relation &knownHull = Relation::Null()); - -// If a union of several conjuncts is a convex, their union -// representaition can be simplified by their convex hull. -Relation ConvexRepresentation(NOT_CONST Relation &R); -Relation CheckForConvexPairs(NOT_CONST Relation &S); // deprecated -Relation CheckForConvexRepresentation(NOT_CONST Relation &R_In); // deprecated - -} - -#endif diff --git a/omega/omega_lib/include/omega/omega_core/debugging.h b/omega/omega_lib/include/omega/omega_core/debugging.h deleted file mode 100644 index e217ae9..0000000 --- a/omega/omega_lib/include/omega/omega_core/debugging.h +++ /dev/null @@ -1,30 +0,0 @@ -#if !defined(Already_included_debugging) -#define Already_included_debugging - -// Debugging flags.  Can set any of these. - -#include <stdio.h> -#include <ctype.h> - -namespace omega { - - - -extern int omega_core_debug; -extern int pres_debug; -extern int relation_debug; -extern int closure_presburger_debug; -extern int hull_debug; -extern int farkas_debug; -extern int code_gen_debug; - -enum negation_control { any_negation, one_geq_or_eq, one_geq_or_stride }; -extern negation_control pres_legal_negations; - -#if defined STUDY_EVACUATIONS -extern int evac_debug; -#endif - -} // namespace - -#endif diff --git a/omega/omega_lib/include/omega/omega_core/oc.h b/omega/omega_lib/include/omega/omega_core/oc.h deleted file mode 100644 index e4f5444..0000000 --- a/omega/omega_lib/include/omega/omega_core/oc.h +++ /dev/null @@ -1,350 +0,0 @@ -#ifndef Already_Included_OC -#define Already_Included_OC 1 - -#include <stdio.h> -#include <string> -#include <basic/util.h> -#include <omega/omega_core/debugging.h> -#include <basic/Tuple.h> - -namespace omega { - -// Manu:: commented the line below  -- fortran bug workaround -//#define maxVars 256 /* original 56, increased by chun */ -#define maxVars 100  - -extern int maxGEQs; -extern int maxEQs; - -// Manu:: commented the lines below  -- fortran bug workaround -//const int maxmaxGEQs = 2048; // original 512, increaded by chun -//const int maxmaxEQs = 512;   // original 256, increased by chun -const int maxmaxGEQs = 512; -const int maxmaxEQs = 256; - -/* #if ! defined maxmaxGEQs */ -/* #define maxmaxGEQs 2048  /\* original 512, increaded by chun *\/ */ -/* #endif */ -/* #if ! defined maxmaxEQs */ -/* #define maxmaxEQs  512  /\* original 256, increased by chun *\/ */ -/* #endif */ - - -#if 0 -#if ! defined Already_Included_Portable -typedef unsigned char bool;  /* what a gross thing to do */ -#endif -#endif - -typedef int EqnKey; - -enum {EQ_BLACK = 0, EQ_RED = 1}; -enum {OC_SOLVE_UNKNOWN = 2, OC_SOLVE_SIMPLIFY = 3}; - -struct eqn { -  EqnKey  key; -  coef_t  touched;  // see oc_simple.c -  int     color; -  int     essential; -  int     varCount; -  coef_t  coef[maxVars + 1]; -}; - -// typedef eqn * Eqn; -enum redType {notRed=0, redEQ, redGEQ, redLEQ, redStride}; -enum redCheck {noRed=0, redFalse, redConstraints}; -enum normalizeReturnType {normalize_false, normalize_uncoupled, -                          normalize_coupled}; - -extern char wildName[200][20]; - -extern FILE *outputFile; /* printProblem writes its output to this file */ -#define doTrace (trace && TRACE) -#define isRed(e) (desiredResult == OC_SOLVE_SIMPLIFY && (e)->color) -// #define eqnncpy(e1,e2,s) {int *p00,*q00,*r00; p00 = (int *)(e1); q00 = (int *)(e2); r00 = &p00[headerWords+1+s]; while(p00 < r00) *p00++ = *q00++; } -// #define eqncpy(e1,e2) eqnncpy(e1,e2,nVars) -// #define eqnnzero(e,s) {int *p00,*r00; p00 = (int *)(e); r00 = &p00[headerWords+1+(s)]; while(p00 < r00) *p00++ = 0;} -// #define eqnzero(e) eqnnzero(e,nVars) - -//void eqnncpy(eqn *dest, eqn *src, int); -//void eqnnzero(eqn *e, int); - -inline void eqnncpy(eqn *dest, eqn *src, int nVars) { -  dest->key = src->key; -  dest->touched = src->touched; -  dest->color = src->color; -  dest->essential = src->essential; -  dest->varCount = src->varCount; -  for (int i = 0; i <= nVars; i++) -    dest->coef[i] = src->coef[i]; -} - - -inline void eqnnzero(eqn *e, int nVars) { -  e->key = 0; -  e->touched = 0; -  e->color = EQ_BLACK; -  e->essential = 0; -  e->varCount = 0; -  for (int i = 0; i <= nVars; i++) -    e->coef[i] = 0; -} - -extern int mayBeRed; - -#ifdef SPEED -#define TRACE 0 -#define DBUG 0 -#define DEBUG 0 -#else -#define TRACE (omega_core_debug) -#define DBUG  (omega_core_debug > 1) -#define DEBUG (omega_core_debug > 2) -#endif - - -class Memory { -public: -  int     length; -  coef_t  stride; -  redType kind; -  coef_t  constantTerm; -  coef_t  coef[maxVars + 1]; -  int     var[maxVars + 1]; -}; - -/* #define headerWords ((4*sizeof(int) + sizeof(coef_t))/sizeof(int)) */ - -void check_number_EQs(int); -void check_number_GEQs(int); -extern eqn SUBs[]; -extern Memory redMemory[]; - -class Problem { -public: -  short     nVars, safeVars; -  short     nEQs, nGEQs,nSUBs,nMemories,allocEQs,allocGEQs; -  short varsOfInterest; -  bool variablesInitialized; -  bool variablesFreed; -  short     var[maxVars+2]; -  short     forwardingAddress[maxVars+2]; -  // int     variableColor[maxVars+2]; -  int  hashVersion; -  const char *(*get_var_name)(unsigned int var, void *args); -  void *getVarNameArgs; -  eqn *GEQs; -  eqn *EQs; -  bool isTemporary; - -  Problem(int in_eqs=0, int in_geqs=0); -  Problem(const Problem &); -  ~Problem(); -  Problem & operator=(const Problem &); - -/* Allocation parameters and functions */ - -  static const int min_alloc,first_alloc_pad; -  int padEQs(int oldalloc, int newreq) { -    check_number_EQs(newreq); -    return min((newreq < 2*oldalloc ? 2*oldalloc : 2*newreq),maxmaxEQs); -  } -  int padGEQs(int oldalloc, int newreq) { -    check_number_GEQs(newreq); -    return min((newreq < 2*oldalloc ? 2*oldalloc : 2*newreq),maxmaxGEQs); -  } -  int padEQs(int newreq) { -    check_number_EQs(newreq); -    return min(max(newreq+first_alloc_pad,min_alloc), maxmaxEQs); -  } -  int padGEQs(int newreq) { -    check_number_GEQs(newreq); -    return min(max(newreq+first_alloc_pad,min_alloc), maxmaxGEQs); -  } - - -  void zeroVariable(int i); - -  void putVariablesInStandardOrder(); -  void noteEssential(int onlyWildcards); -  int findDifference(int e, int &v1, int &v2); -  int chainKill(int color,int onlyWildcards); - -  int newGEQ(); -  int newEQ(); -  int newSUB(){ -    return nSUBs++; -  } - - -  void initializeProblem(); -  void initializeVariables() const; -  void printProblem(int debug = 1) const; -  void printSub(int v) const; -  std::string print_sub_to_string(int v) const; -  void clearSubs(); -  void printRedEquations() const; -  int  countRedEquations() const; -  int  countRedGEQs() const; -  int  countRedEQs() const; -  int  countRedSUBs() const; -  void difficulty(int &numberNZs, coef_t &maxMinAbsCoef, coef_t &sumMinAbsCoef) const; -  int  prettyPrintProblem() const; -  std::string  prettyPrintProblemToString() const; -  int  prettyPrintRedEquations() const; -  int  simplifyProblem(int verify, int subs, int redundantElimination); -  int  simplifyProblem(); -  int  simplifyAndVerifyProblem(); -  int  simplifyApproximate(bool strides_allowed); -  void coalesce(); -  void partialElimination(); -  void unprotectVariable(int var); -  void negateGEQ(int); -  void convertEQstoGEQs(bool excludeStrides); -  void convertEQtoGEQs(int eq); -  void nameWildcard(int i); -  void useWildNames(); -  void ordered_elimination(int symbolic); -  int eliminateRedundant (bool expensive); -  void eliminateRed(bool expensive); -  void constrainVariableSign(int color, int var, int sign);  -  void  constrainVariableValue(int color, int var, int value); -  void query_difference(int v1, int v2, coef_t &lowerBound, coef_t &upperBound, bool &guaranteed); -  int solve(int desiredResult); -  std::string print_term_to_string(const eqn *e, int c) const; -  void printTerm(const eqn * e, int c) const; -  std::string printEqnToString(const eqn * e, int test, int extra) const; -  void sprintEqn(char *str, const eqn * e, int is_geq,int extra) const; -  void printEqn(const eqn * e, int is_geq, int extra) const; -  void printEQ(const eqn *e) const {printEqn(e,0,0); } -  std::string print_EQ_to_string(const eqn *e) const {return printEqnToString(e,0,0);} -  std::string print_GEQ_to_string(const eqn *e) const {return printEqnToString(e,1,0);} -  void printGEQ(const eqn *e) const {printEqn(e,1,0); } -  void printGEQextra(const eqn *e) const {printEqn(e,1,1); } -  void printSubstitution(int s) const; -  void printVars(int debug = 1) const; -  void swapVars(int i, int j); -  void reverseProtectedVariables(); -  redCheck redSimplifyProblem(int effort, int computeGist); -   -  // calculate value of variable mod integer from set of equations -- by chun 12/14/2006 -  coef_t query_variable_mod(int v, coef_t factor, int color=EQ_BLACK, int nModularEQs=0, int nModularVars=0) const; -  coef_t query_variable_mod(int v, coef_t factor, int color, int nModularEQs, int nModularVars, Tuple<bool> &working_on) const; // helper function - -  int queryVariable(int i, coef_t *lowerBound, coef_t *upperBound); -  int query_variable_bounds(int i, coef_t *l, coef_t *u); -  void queryCoupledVariable(int i, coef_t *l, coef_t *u, int *couldBeZero, coef_t lowerBound, coef_t upperBound); -  int queryVariableSigns(int i, int dd_lt, int dd_eq, int dd_gt, coef_t lowerBound, coef_t upperBound, bool *distKnown, coef_t *dist); -  void addingEqualityConstraint(int e); -  normalizeReturnType normalize(); -  void normalize_ext(); -  void cleanoutWildcards(); -  void substitute(eqn *sub, int i, coef_t c); -  void deleteVariable( int i); -  void deleteBlack(); -  int addNewProtectedWildcard(); -  int addNewUnprotectedWildcard(); -  int protectWildcard( int i); -  void doMod( coef_t factor, int e, int j); -  void freeEliminations( int fv); -  int verifyProblem(); -  void resurrectSubs(); -  int solveEQ(); -  int combineToTighten() ; -  int quickKill(int onlyWildcards, bool desperate = false); -  int expensiveEqualityCheck(); -  int expensiveRedKill(); -  int expensiveKill(); -  int smoothWeirdEquations(); -  void quickRedKill(int computeGist); -  void chainUnprotect(); -  void freeRedEliminations(); -  void doElimination( int e, int i); -  void analyzeElimination( -    int &v, -    int &darkConstraints, -    int &darkShadowFeasible, -    int &unit, -    coef_t ¶llelSplinters, -    coef_t &disjointSplinters, -    coef_t &lbSplinters, -    coef_t &ubSplinters, -    int ¶llelLB); -  int parallelSplinter(int e, int diff, int desiredResult); -  int solveGEQ( int desiredResult); -  void setInternals(); -  void setExternals(); -  int reduceProblem(); -  void problem_merge(Problem &); -  void deleteRed(); -  void turnRedBlack(); -  void checkGistInvariant() const; -  void check() const; -  coef_t checkSum() const; -  void rememberRedConstraint(eqn *e, redType type, coef_t stride); -  void recallRedMemories(); -  void simplifyStrideConstraints(); -  const char * orgVariable(int i) const {  -    return ((i == 0) ?   //  cfront likes this form better -            "1" : -            ((i < 0) ? -             wildName[-i] : -             (*get_var_name)(i,getVarNameArgs))); -  }; -  const char * variable(int i) const {  -    return orgVariable(var[i]) ; -  }; - -  void deleteGEQ(int e) { -    if (DEBUG) { -      fprintf(outputFile,"Deleting %d (last:%d): ",e,nGEQs-1);  -      printGEQ(&GEQs[e]); -      fprintf(outputFile,"\n"); -    };  -    if (e < nGEQs-1)  -      eqnncpy (&GEQs[e], &GEQs[nGEQs - 1],(nVars));  -    nGEQs--; -  }; -  void deleteEQ(int e) { -    if (DEBUG) { -      fprintf(outputFile,"Deleting %d (last:%d): ",e,nEQs-1);  -      printGEQ(&EQs[e]); -      fprintf(outputFile,"\n"); -    };  -    if (e < nEQs-1)  -      eqnncpy (&EQs[e], &EQs[nEQs - 1],(nVars));  -    nEQs--; -  }; - -}; - - - -/* #define UNKNOWN 2 */ -/* #define SIMPLIFY 3 */ -/* #define _red 1 */ -/* #define black 0 */ - - -extern int print_in_code_gen_style; - - -void  initializeOmega(void); - - -/* set extra to 0 for normal use */ -int singleVarGEQ(eqn *e); - -void setPrintLevel(int level); - -void printHeader(); - -void setOutputFile(FILE *file); - -extern void check_number_EQs(int nEQs); -extern void check_number_GEQs(int nGEQs); -extern void checkVars(int nVars); - -} // namespace - -#endif diff --git a/omega/omega_lib/include/omega/omega_core/oc_i.h b/omega/omega_lib/include/omega/omega_core/oc_i.h deleted file mode 100644 index 9533a40..0000000 --- a/omega/omega_lib/include/omega/omega_core/oc_i.h +++ /dev/null @@ -1,79 +0,0 @@ -#if !defined(Already_included_oc_i) -#define Already_included_oc_i - -#include <basic/util.h> -#include <omega/omega_core/oc.h> -#include <stdlib.h> -#include <assert.h> -#include <string> -#include <vector> - -namespace omega { - -#define maxWildcards 18 - -extern int findingImplicitEqualities; -extern int firstCheckForRedundantEquations; -extern int use_ugly_names; -extern int doItAgain; -extern int newVar; -extern int conservative; -extern FILE *outputFile; /* printProblem writes its output to this file */ -extern int nextWildcard; -extern int trace; -extern int depth; -extern int packing[maxVars]; -extern int headerLevel; -extern int inApproximateMode; -extern int inStridesAllowedMode; -extern int addingOuterEqualities; -extern int outerColor; - -const int keyMult = 31; -const int hashTableSize =5*maxmaxGEQs; -const int maxKeys = 8*maxmaxGEQs; -extern int hashVersion; -extern eqn hashMaster[hashTableSize]; -extern int fastLookup[maxKeys*2]; -extern int nextKey; - -extern int reduceWithSubs; -extern int pleaseNoEqualitiesInSimplifiedProblems; - -#define noProblem ((Problem *) 0) - -extern Problem *originalProblem; -int checkIfSingleVar(eqn *e, int i); -/* Solve e = factor alpha for x_j and substitute */ - -void negateCoefficients(eqn * eqn, int nV); - -extern int omegaInitialized; -extern Problem full_answer, context,redProblem; - -#if defined BRAIN_DAMAGED_FREE -static inline void free(const Problem *p) -{ -  free((char *)p); -} -#endif - -#if defined NDEBUG  -#define CHECK_FOR_DUPLICATE_VARIABLE_NAMES  -#else -#define CHECK_FOR_DUPLICATE_VARIABLE_NAMES                              \ -  {                                                                     \ -    std::vector<std::string> name(nVars);                               \ -    for(int i=1; i<=nVars; i++) {                                       \ -      name[i-1] = variable(i);                                          \ -      assert(!name[i-1].empty());                                       \ -      for(int j=1; j<i; j++)                                            \ -        assert(!(name[i-1] == name[j-1]));                              \ -    }                                                                   \ -  } -#endif - - -} // namespace - -#endif diff --git a/omega/omega_lib/include/omega/omega_i.h b/omega/omega_lib/include/omega/omega_i.h deleted file mode 100644 index e5d9230..0000000 --- a/omega/omega_lib/include/omega/omega_i.h +++ /dev/null @@ -1,30 +0,0 @@ -#if ! defined _omega_i_h -#define _omega_i_h 1 - -#include <omega/pres_var.h> - -namespace omega { - -/* #define Assert(c,t) if(!(c)) PresErrAssert(t) */ -/* void PresErrAssert(const char *t); */ - -extern Rel_Body null_rel; - -extern int     skip_finalization_check; -// extern int     skip_set_checks; - -// Global input and output variable tuples. - -extern Global_Input_Output_Tuple input_vars; -extern Global_Input_Output_Tuple output_vars; -extern Global_Input_Output_Tuple &set_vars; - -} // namespace - -#if ! defined DONT_INCLUDE_TEMPLATE_CODE -// with g++258, everything will need to make Tuple<Relation>, as a -// function taking it as an argument is a friend of lots of classes -#include <omega/Relation.h> -#endif - -#endif diff --git a/omega/omega_lib/include/omega/pres_cmpr.h b/omega/omega_lib/include/omega/pres_cmpr.h deleted file mode 100644 index fb3e6f0..0000000 --- a/omega/omega_lib/include/omega/pres_cmpr.h +++ /dev/null @@ -1,49 +0,0 @@ -#if ! defined _pres_cmpr_h -#define _pres_cmpr_h 1 - -#include <omega/omega_core/oc.h> - -namespace omega { - -// -// Compressed problem: rectangular non-0 cut from the big problem. -// -class Comp_Constraints { -public: -  Comp_Constraints(eqn *constrs, int no_constrs, int no_vars); -  void UncompressConstr(eqn *constrs, short &pn_constrs); -  ~Comp_Constraints(); -  bool no_constraints() const -  { return n_constrs == 0; } -  int n_constraints() const -  { return n_constrs; } - -protected: -  inline int coef_index(int e, int v) -  {return e*(n_vars+1) + v;} - -private: -  int n_constrs; -  int n_vars; -  coef_t *coefs; -}; - -class Comp_Problem { -public: -  Comp_Problem(Problem *problem); -  Problem *UncompressProblem(); -  bool no_constraints() const -  { return eqs.no_constraints() && geqs.no_constraints(); } - -private: -/* === data === */ -  int             _nVars, _safeVars; -  const char   *(*_get_var_name)(unsigned int var, void *args); -  void           *_getVarNameArgs; -  Comp_Constraints eqs; -  Comp_Constraints geqs; -}; - -} // namespace - -#endif diff --git a/omega/omega_lib/include/omega/pres_cnstr.h b/omega/omega_lib/include/omega/pres_cnstr.h deleted file mode 100644 index 7b2d98d..0000000 --- a/omega/omega_lib/include/omega/pres_cnstr.h +++ /dev/null @@ -1,192 +0,0 @@ -#if ! defined _pres_cnstr_h -#define _pres_cnstr_h 1 - -#include <omega/pres_var.h> -#include <vector> - -namespace omega { - -// -// Constraint handles -// - - - -void copy_constraint(Constraint_Handle H, const Constraint_Handle initial); - -class Constraint_Handle { -public: -  Constraint_Handle() {} -  virtual ~Constraint_Handle() {} -   -  void   update_coef(Variable_ID, coef_t delta); -  void   update_const(coef_t delta); -  coef_t get_coef(Variable_ID v) const; -  coef_t get_const() const; -  bool   has_wildcards() const; -  int    max_tuple_pos() const; -  int    min_tuple_pos() const; -  bool is_const(Variable_ID v); -  bool is_const_except_for_global(Variable_ID v); - -  virtual std::string print_to_string() const; -  virtual std::string print_term_to_string() const; -   -  Variable_ID get_local(const Global_Var_ID G); -  Variable_ID get_local(const Global_Var_ID G, Argument_Tuple of); -  // not sure that the second one can be used in a meaningful -  // way if the conjunct is in multiple relations - -  void   finalize(); -  void   multiply(int multiplier); -  Rel_Body *relation() const; - - -protected: -  Conjunct *c; -  eqn      **eqns; -  int      e; - -  friend class Constr_Vars_Iter; -  friend class Constraint_Iterator;  - -  Constraint_Handle(Conjunct *, eqn **, int); - -#if defined PROTECTED_DOESNT_WORK -  friend class EQ_Handle; -  friend class GEQ_Handle; -#endif - -  void   update_coef_during_simplify(Variable_ID, coef_t delta); -  void   update_const_during_simplify(coef_t delta); -  coef_t    get_const_during_simplify() const; -  coef_t    get_coef_during_simplify(Variable_ID v) const; - -   -public: -  friend class Conjunct;  // assert_leading_info updates coef's -  // as does move_UFS_to_input -  friend class DNF;       // and DNF::make_level_carried_to - -  friend void copy_constraint(Constraint_Handle H, -                              const Constraint_Handle initial); -  // copy_constraint does updates and gets at c and e - -}; - -class GEQ_Handle : public Constraint_Handle { -public: -  inline GEQ_Handle() {} - -  virtual std::string print_to_string() const; -  virtual std::string print_term_to_string() const; -  bool operator==(const Constraint_Handle &that); - -  void   negate(); - -private: -  friend class Conjunct; -  friend class GEQ_Iterator; - -  GEQ_Handle(Conjunct *, int); -}; - - -class EQ_Handle : public Constraint_Handle { -public: -  inline EQ_Handle() {} - -  virtual std::string print_to_string() const; -  virtual std::string print_term_to_string() const; -  bool operator==(const Constraint_Handle &that); - -private: -  friend class Conjunct; -  friend class EQ_Iterator; -   -  EQ_Handle(Conjunct *, int); -}; - - -// -// Conjuct iterators -- for querying resulting DNF. -// -class Constraint_Iterator : public Generator<Constraint_Handle> { -public: -  Constraint_Iterator(Conjunct *); -  int  live() const; -  void operator++(int); -  void operator++(); -  Constraint_Handle operator* (); -  Constraint_Handle operator* () const; - -private: -  Conjunct *c; -  int current,last; -  eqn **eqns; -}; - - -class EQ_Iterator : public Generator<EQ_Handle> { -public: -  EQ_Iterator(Conjunct *); -  int  live() const; -  void operator++(int); -  void operator++(); -  EQ_Handle operator* (); -  EQ_Handle operator* () const; - -private: -  Conjunct *c; -  int current, last; -}; - - -class GEQ_Iterator : public Generator<GEQ_Handle> { -public: -  GEQ_Iterator(Conjunct *); -  int  live() const; -  void operator++(int); -  void operator++(); -  GEQ_Handle operator* (); -  GEQ_Handle operator* () const; - -private: -  Conjunct *c; -  int current, last; -}; - - -// -// Variables of constraint iterator. -// -struct Variable_Info { -  Variable_ID var; -  coef_t      coef; -  Variable_Info(Variable_ID _var, coef_t _coef) -    { var = _var; coef = _coef; } -}; - -class Constr_Vars_Iter : public Generator<Variable_Info> { -public: -  Constr_Vars_Iter(const Constraint_Handle &ch, bool _wild_only = false); -  int         live() const; -  void        operator++(int); -  void        operator++(); -  Variable_Info operator*() const; - -  Variable_ID curr_var() const; -  coef_t      curr_coef() const; - -private: -  eqn               **eqns; -  int               e; -  Problem           *prob; -  Variable_ID_Tuple &vars; -  bool              wild_only; -  int               current; -}; - -} // namespace - -#endif diff --git a/omega/omega_lib/include/omega/pres_conj.h b/omega/omega_lib/include/omega/pres_conj.h deleted file mode 100644 index ea10a2c..0000000 --- a/omega/omega_lib/include/omega/pres_conj.h +++ /dev/null @@ -1,299 +0,0 @@ -#if ! defined _pres_conj_h -#define _pres_conj_h 1 - -#include <limits.h> -#include <omega/pres_decl.h> -#include <omega/pres_logic.h> -#include <omega/pres_cnstr.h> - -namespace omega { - -// -// Conjunct -// -// About variables in Conjunct: -// All varaibles appear in exactly one declaration. -// All variables used in Conjunct are referenced in mappedVars. -// Wildcard variables are referenced both in mappedVars and in myLocals,  -//   since they are declared in the conjunct. -// All other variables are declared at the levels above. -// Column number is:  -//   in forwardingAddress in Problem if variablesInitialized is set,  -//   equal to position of Variable_ID in mappedVars list otherwise. -// - -class Conjunct : public F_Declaration { -public: -  Constraint_Iterator constraints(); -  Variable_ID_Tuple  *variables(); -  EQ_Iterator         EQs(); -  GEQ_Iterator        GEQs(); -  inline int          n_EQs() { return problem->nEQs; } -  inline int          n_GEQs() { return problem->nGEQs; } - -  void promise_that_ub_solutions_exist(Relation &R); - -  inline Node_Type node_type() {return Op_Conjunct;} - -  inline int is_true() {return problem->nEQs==0 && problem->nGEQs==0  -      && exact;} - -  void query_difference(Variable_ID v1, Variable_ID v2, -                        coef_t &lowerBound, coef_t &upperBound, bool &guaranteed); -  void query_variable_bounds(Variable_ID v, coef_t &lowerBound, coef_t &upperBound); -  coef_t query_variable_mod(Variable_ID v, coef_t factor); -  bool query_variable_used(Variable_ID v); - -  int countNonzeros() const { -    int numberNZs; -    coef_t maxCoef, SumAbsCoef; -    problem->difficulty(numberNZs,maxCoef,SumAbsCoef); -    return numberNZs; -  } - -  void difficulty(int &numberNZs, coef_t &maxCoef, coef_t &SumAbsCoef) const { -    problem->difficulty(numberNZs,maxCoef,SumAbsCoef); -  } - -  int query_guaranteed_leading_0s() { -    count_leading_0s(); -    return guaranteed_leading_0s; -  } - -  int query_possible_leading_0s() { -    count_leading_0s(); -    return possible_leading_0s; -  } - -  int query_leading_dir() { -    count_leading_0s(); -    return leading_dir; -  } - -  void calculate_dimensions(Relation &R, int &ndim_all, int &ndim_domain); -  int max_ufs_arity_of_set(); -  int max_ufs_arity_of_in(); -  int max_ufs_arity_of_out(); - -  int rank(); - -  ~Conjunct(); - -  bool is_unknown() const; -  inline bool is_exact() const { return exact;} -  inline bool is_inexact() const { return !exact;} -  inline void make_inexact()   { exact=false;} -    - -#if ! defined NDEBUG -  void     assert_leading_info(); -#else -  void     assert_leading_info() {} -#endif - - -  // PRINTING FUNCTIONS -  void print(FILE *output_file); -  void prefix_print(FILE *output_file, int debug = 1); -  std::string print_to_string(int true_printed); -  std::string print_EQ_to_string(eqn *e) { return problem->print_EQ_to_string(e); } -  std::string print_GEQ_to_string(eqn *e) { return problem->print_GEQ_to_string(e); } -  std::string print_EQ_to_string(int e)  -  { return problem->print_EQ_to_string(&(problem->EQs[e])); } -  std::string print_GEQ_to_string(int e)  -  { return problem->print_GEQ_to_string(&(problem->GEQs[e])); } -  std::string print_term_to_string(eqn *e) { return problem->print_term_to_string(e,1); } -  std::string print_EQ_term_to_string(int e)  -  { return problem->print_term_to_string(&(problem->EQs[e]),1); } -  std::string print_GEQ_term_to_string(int e)  -  { return problem->print_term_to_string(&(problem->GEQs[e]),1); } -  std::string print_sub_to_string(int col) { return problem->print_sub_to_string(col); } - -private: - -  inline void interpret_unknown_as_true()   { exact=true;} - -  friend Relation approx_closure(NOT_CONST Relation &r, int n); - -  virtual Conjunct *really_conjunct(); - - -  // create new constraints with all co-efficients 0 -  // These are public in F_And, use them from there. -  EQ_Handle   add_stride(int step, int preserves_level = 0); -  EQ_Handle   add_EQ(int preserves_level = 0); -  GEQ_Handle  add_GEQ(int preserves_level = 0); -  EQ_Handle   add_EQ(const Constraint_Handle &c, int preserves_level = 0); -  GEQ_Handle  add_GEQ(const Constraint_Handle &c, int preserves_level = 0); - -  friend class GEQ_Handle; -  friend class  EQ_Handle; -  friend class Sub_Handle; -  friend class Constraint_Handle; -  friend class Constraint_Iterator; -  friend class GEQ_Iterator; -  friend class  EQ_Iterator; -  friend class Sub_Iterator; -  friend class Constr_Vars_Iter; - - -  // FUNCTIONS HAVING TO DO WITH BUILDING FORMULAS/DNFs  -  bool     can_add_child(); -  void remap(); -  void beautify(); -  DNF* DNFize(); -  int priority(); -  virtual Conjunct *find_available_conjunct(); -  void finalize(); - -  friend class DNF; - - - -  // CREATING CONJUNCTS -  Conjunct(); -  Conjunct(Conjunct &); -  Conjunct(Formula *, Rel_Body *); - -  friend class Formula; // add_conjunct (a private function) creates Conjuncts -  friend class F_Not; -  friend class F_Or; -  //   class F_And; is a friend below -   - -  // VARIOUS FUNCTIONS TO CREATE / WORK WITH VARIABLES -  Variable_ID declare(Const_String s); -  Variable_ID declare(); -  Variable_ID declare(Variable_ID v);   -   -  friend const char *get_var_name(unsigned int, void *); -  void push_exists(Variable_ID_Tuple &S); -  int  get_column(Variable_ID); -  int  find_column(Variable_ID); -  int  map_to_column(Variable_ID); -  void combine_columns(); -  void reorder(); -  void reorder_for_print(bool reverseOrder=false, -                         int first_pass_input=0, -                         int first_pass_output=0, -                         bool sort=false); - -  friend void      remap_DNF_vars(Rel_Body *new_rel, Rel_Body *old_rel); - -  void localize_var(Variable_ID D); - - -  // this creates variables in conjuncts for us: -  friend int       new_WC(Conjunct *nc, Problem *np); - - -  // UFS/LEADING ZEROS STUFF - -  void move_UFS_to_input(); - -  void count_leading_0s(); -  void invalidate_leading_info(int changed = -1); -  void enforce_leading_info(int guaranteed, int possible, int dir); - -  void reverse_leading_dir_info(); - -  - -  // CONJUNCT SPECIFIC STUFF - -  void      rm_color_constrs(); -  inline int N_protected() { return problem->safeVars; } - - -  void ordered_elimination(int symLen) { problem->ordered_elimination(symLen);} -  void convertEQstoGEQs(bool excludeStrides); - -  int cost(); -   -  inline Formula*  copy(Formula *parent, Rel_Body *reln) -  { return copy_conj_diff_relation(parent,reln); } -  Conjunct* copy_conj_diff_relation(Formula *parent, Rel_Body *reln); -  inline Conjunct* copy_conj_same_relation() -  { return copy_conj_diff_relation(&(parent()), relation()); } -  friend void internal_copy_conjunct(Conjunct* to, Conjunct* fr); -  friend void copy_constraint(Constraint_Handle H, -                              const Constraint_Handle initial); - -#if defined STUDY_EVACUATIONS -  // The core function of "evac.c" does lots of work with conjuncts: -  friend bool check_subseq_n(Conjunct *c, Sequence<Variable_ID> &evac_from, Sequence<Variable_ID> &evac_to, int n_from, int n_to, int max_arity, int n, bool allow_offset); -  friend void assert_subbed_syms(Conjunct *c); -  friend bool check_affine(Conjunct *d, Sequence<Variable_ID> &evac_from, Sequence<Variable_ID> &evac_to, int n_from, int n_to, int max_arity); -  friend evac study(Conjunct *C, Sequence<Variable_ID> &evac_from, Sequence<Variable_ID> &evac_to, int n_from, int n_to, int max_arity); -#endif - -  // The relational ops tend to do lots of demented things to Conjuncts: -  friend class Rel_Body; -  friend_rel_ops; - -  // F_And sometimes absorbs conjuncts -  friend class F_And; - -  // Various DNFize functions also get a the problem: - -  friend DNF* conj_and_not_dnf(Conjunct *pos_conj, DNF *neg_conjs, bool weak); -  friend class F_Exists; - -  // Substitutions are a wrapper around a low-level Problem operation -  friend class Substitutions; - -  // private functions to call problem functions  -  int simplifyProblem(); -  int simplifyProblem(int verify, int subs, int redundantElimination); -  int redSimplifyProblem(int effort, int computeGist); - -  friend int       simplify_conj(Conjunct* conj, int ver_sim, int elim_red, int color); -  friend DNF*      negate_conj(Conjunct* conj); -  friend Conjunct* merge_conjs(Conjunct* conj1, Conjunct* conj2, -                               Merge_Action action, Rel_Body *body = 0); -  friend void      copy_conj_header(Conjunct* to, Conjunct* fr); - - -  // === at last, the data === - -  Variable_ID_Tuple mappedVars; - -  int              n_open_constraints; -  bool             cols_ordered; -  bool             simplified; -  bool             verified; - -  int     guaranteed_leading_0s;  // -1 if unknown -  int     possible_leading_0s;  // -1 if unknown -  int     leading_dir; // 0 if unknown, else +/- 1 -  int     leading_dir_valid_and_known(); - -  bool             exact; - -  short     r_constrs; // are redundant constraints eliminated? -  Problem         *problem; - -  bool is_compressed(); -  void compress(); -  void uncompress(); - -  friend class Comp_Problem; -  Comp_Problem    *comp_problem; -}; - - -/* === Misc. problem manipulation utilities === */ - -const int CantBeNegated = INT_MAX-10; -const int AvoidNegating = INT_MAX-11; - -void copy_column(Problem *tp,  int to_col, -                 Problem *fp,  int fr_col, -                 int start_EQ, int start_GEQ); -void zero_column(Problem *tp,  int to_col, -                 int start_EQ, int start_GEQ, -                 int no_EQs,   int no_GEQs); - -} // namespace - -#endif diff --git a/omega/omega_lib/include/omega/pres_decl.h b/omega/omega_lib/include/omega/pres_decl.h deleted file mode 100644 index 7fec0bc..0000000 --- a/omega/omega_lib/include/omega/pres_decl.h +++ /dev/null @@ -1,55 +0,0 @@ -#if ! defined _pres_decl_h -#define _pres_decl_h 1 - -#include <omega/pres_var.h> -#include <omega/pres_form.h> -#include <basic/Section.h> - -namespace omega { - -// -// Base class for presburger formula nodes with variables -// - -class F_Declaration : public Formula { -public: -  virtual Variable_ID declare(Const_String s)=0; -  virtual Variable_ID declare()=0; -  virtual Variable_ID declare(Variable_ID)=0; -  virtual Section<Variable_ID> declare_tuple(int size); - -  void finalize(); - -  inline Variable_ID_Tuple &locals() {return myLocals;} - -protected: -  F_Declaration(Formula *, Rel_Body *); -  F_Declaration(Formula *, Rel_Body *, Variable_ID_Tuple &); -  ~F_Declaration(); - -  Variable_ID do_declare(Const_String s, Var_Kind var_kind); - -  void prefix_print(FILE *output_file, int debug = 1); -  void print(FILE *output_file); - -  void setup_names(); -  void setup_anonymous_wildcard_names(); - -  Variable_ID_Tuple myLocals; -  friend class F_Forall; // rearrange needs to access myLocals -  friend class F_Or;     // push_exists - -private: -  virtual bool can_add_child(); - -  int priority(); - -  friend void align(Rel_Body *originalr, Rel_Body *newr, F_Exists *fe, -                    Formula *f, const Mapping &mapping, bool &newrIsSet, -                    List<int> &seen_exists,  -                    Variable_ID_Tuple &seen_exists_ids); -}; - -} // namespace - -#endif diff --git a/omega/omega_lib/include/omega/pres_dnf.h b/omega/omega_lib/include/omega/pres_dnf.h deleted file mode 100644 index 93d5942..0000000 --- a/omega/omega_lib/include/omega/pres_dnf.h +++ /dev/null @@ -1,87 +0,0 @@ -#if ! defined _pres_dnf_h -#define _pres_dnf_h 1 - -#include <omega/pres_gen.h> - -namespace omega { - -// -// Disjunctive Normal Form -- list of Conjuncts -// -class DNF { -public: -  void print(FILE *out_file); -  void prefix_print(FILE *out_file, int debug = 1, bool parent_names_setup=false); - -  bool is_definitely_false() const; -  bool is_definitely_true() const; -  int  length() const; - -  Conjunct *single_conjunct() const; -  bool      has_single_conjunct() const; -  Conjunct *rm_first_conjunct(); -  void clear(); -  int query_guaranteed_leading_0s(int what_to_return_for_empty_dnf); -  int query_possible_leading_0s(int what_to_return_for_empty_dnf); -  int query_leading_dir(); - -private: -    // all DNFize functions need to access the dnf builders: -  friend class F_And; -  friend class F_Or; -  friend class Conjunct; -  friend DNF * negate_conj(Conjunct *); - -  friend class Rel_Body; -  friend_rel_ops; - -  DNF(); -  ~DNF(); - -  DNF* copy(Rel_Body *); - -  void simplify(); -  void make_level_carried_to(int level); -  void count_leading_0s(); - -  void add_conjunct(Conjunct*); -  void join_DNF(DNF*); -  void rm_conjunct(Conjunct *c); - -  void rm_redundant_conjs(int effort); -  void rm_redundant_inexact_conjs(); -  void DNF_to_formula(Formula* root); - - -  friend void  remap_DNF_vars(Rel_Body *new_rel, Rel_Body *old_rel); -  void remap(); - -  void setup_names(); - -  void remove_inexact_conj(); - -    // These may need to get at the conjList itself: -  friend DNF*  DNF_and_DNF(DNF*, DNF*); -  friend DNF*  DNF_and_conj(DNF*, Conjunct*); -  friend DNF*  conj_and_not_dnf(Conjunct *pos_conj, DNF *neg_conjs, bool weak); - -  friend class DNF_Iterator; - -  List<Conjunct*> conjList; -}; - -DNF* conj_and_not_dnf(Conjunct *pos_conj, DNF *neg_conjs, bool weak=false); - -// -// DNF iterator -// -class DNF_Iterator : public List_Iterator<Conjunct*> { -public: -    DNF_Iterator(DNF*dnf) : List_Iterator<Conjunct*>(dnf->conjList) {} -    DNF_Iterator() {} -    void curr_set(Conjunct *c) { *(*this) = c; } -}; - -} // namespace - -#endif diff --git a/omega/omega_lib/include/omega/pres_form.h b/omega/omega_lib/include/omega/pres_form.h deleted file mode 100644 index ed3258e..0000000 --- a/omega/omega_lib/include/omega/pres_form.h +++ /dev/null @@ -1,112 +0,0 @@ -#if ! defined _pres_form_h -#define _pres_form_h 1 - -#include <omega/pres_gen.h> - -namespace omega { - -typedef enum {Op_Relation, Op_Not, Op_And, Op_Or, -              Op_Conjunct, Op_Forall, Op_Exists}  Node_Type; - - -// -// Presburger Formula base class -// - -class Formula { -public: -  virtual Node_Type node_type()=0; - -  F_Forall *add_forall(); -  F_Exists *add_exists(); -  virtual F_And  *and_with(); -  F_And  *add_and(); -  F_Or *add_or(); -  F_Not *add_not(); -  void add_unknown(); - -  virtual void finalize(); -  virtual void print(FILE *output_file); - -  Rel_Body *relation() { return myRelation; } - -protected: -  virtual ~Formula(); -private: -  Formula(Formula *, Rel_Body *); - -  // The relational operations need to work with formula trees -  friend class Relation; -  friend_rel_ops; -  // as do the functions that build DNF's -  friend  class DNF; -  // or other parts of the tree -  friend class Conjunct; -  friend class F_Declaration; -  friend class F_Exists; -  friend class F_Forall; -  friend class F_Or; -  friend class F_And; -  friend class F_Not; -  friend class Rel_Body; - - -  // Operations needed for manipulation of formula trees: - -  void remove_child(Formula *); -  void replace_child(Formula *child, Formula *new_child); -  virtual bool can_add_child(); -  void add_child(Formula *); - -  Conjunct *add_conjunct(); -  virtual Conjunct *find_available_conjunct() = 0; - -  virtual Formula *copy(Formula *parent, Rel_Body *reln); -  F_Exists *add_exists(Variable_ID_Tuple &S);  -  virtual     void push_exists(Variable_ID_Tuple &S); - -  // Accessor functions for tree building - -  List<Formula*> &children() {return myChildren;} -  int n_children() const {return myChildren.length();} -  const List<Formula*> &get_children() const {return myChildren;} -  Formula &parent() {return *myParent;} -  void set_parent(Formula *p) {myParent = p;} - - -  virtual int priority(); - -  void verify_tree();  // should be const, but iterators are used - -  virtual void reverse_leading_dir_info(); -  virtual void invalidate_leading_info(int changed = -1); -  virtual void enforce_leading_info(int guaranteed, int possible, int dir); - -  virtual void remap();    -  virtual DNF* DNFize() = 0; -  virtual void beautify(); -  virtual void rearrange(); -  virtual void setup_names(); - -  virtual void print_separator(FILE *output_file); -  virtual void combine_columns(); -  virtual void prefix_print(FILE *output_file, int debug = 1); -  void print_head(FILE *output_file); - -  void set_relation(Rel_Body *r); -  void set_parent(Formula *parent, Rel_Body *reln); - -  void assert_not_finalized(); - -  virtual Conjunct *really_conjunct();  // until we get RTTI - -private: -  List<Formula*>     myChildren; -  Formula           *myParent; -  Rel_Body          *myRelation; - -}; - -} // namespace - -#endif diff --git a/omega/omega_lib/include/omega/pres_gen.h b/omega/omega_lib/include/omega/pres_gen.h deleted file mode 100644 index ba6a793..0000000 --- a/omega/omega_lib/include/omega/pres_gen.h +++ /dev/null @@ -1,192 +0,0 @@ -#if ! defined _pres_gen_h -#define _pres_gen_h 1 - -#include <omega/omega_core/oc.h> -#include <basic/ConstString.h> -#include <basic/Iterator.h> -#include <basic/List.h> -#include <basic/Tuple.h> -#include <assert.h> -#include <stdlib.h> - -namespace omega { - -// -// general presburger stuff thats needed everywhere -// - -/* The following allows us to avoid warnings about passing  -   temporaries as non-const references.  This is useful but  -   has suddenly become illegal.  */ - -#if !defined(LIE_ABOUT_CONST_TO_MAKE_ANSI_COMMITTEE_HAPPY) -#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)) -#define LIE_ABOUT_CONST_TO_MAKE_ANSI_COMMITTEE_HAPPY 1 -#else -#define LIE_ABOUT_CONST_TO_MAKE_ANSI_COMMITTEE_HAPPY 0 -#endif -#endif - -#if LIE_ABOUT_CONST_TO_MAKE_ANSI_COMMITTEE_HAPPY -#define NOT_CONST const -#else -#define NOT_CONST  -#endif - -// -// I/O and error processing and control flags (also in omega_core/debugging.h) -// - -extern FILE *DebugFile; -extern int   pres_debug; - -extern int mega_total; -extern int use_ugly_names; - -extern negation_control pres_legal_negations; - - -// -// Lots of things refer to each other, -//  so we forward declare these classes: -// - -class Var_Decl; -typedef enum {Input_Var, Set_Var = Input_Var, Output_Var, -              Global_Var, Forall_Var, Exists_Var, Wildcard_Var} Var_Kind; -class Global_Var_Decl; -typedef enum {Unknown_Tuple = 0, Input_Tuple = 1, Output_Tuple = 2, -				 Set_Tuple = Input_Tuple } Argument_Tuple; - -class Constraint_Handle; -class EQ_Handle; -class GEQ_Handle; -typedef EQ_Handle Stride_Handle; - -class Formula; -class F_Declaration; -class F_Forall; -class F_Exists; -class F_And; -class F_Or; -class F_Not; -class Conjunct; -class Relation; -class Rel_Body; -class DNF; -class Mapping; -class Omega_Var; -class Coef_Var_Decl; - -typedef Var_Decl *Variable_ID; -typedef Global_Var_Decl *Global_Var_ID; - -typedef Tuple<Variable_ID>       Variable_ID_Tuple; -typedef Sequence<Variable_ID>    Variable_ID_Sequence;  // use only for rvalues -typedef Tuple_Iterator<Variable_ID>   Variable_ID_Tuple_Iterator; -typedef Tuple_Iterator<Variable_ID>   Variable_ID_Iterator; - -typedef Variable_ID_Iterator Variable_Iterator; - -typedef enum {Comb_Id, Comb_And, Comb_Or, Comb_AndNot} Combine_Type; - - -// things that are (hopefully) used only privately -class Comp_Problem; -class Comp_Constraints; - -// this has to be here rather than in pres_conj.h because -// MergeConj has to be a friend of Constraint_Handle -typedef enum {MERGE_REGULAR, MERGE_COMPOSE, MERGE_GIST} Merge_Action; - - -// Conjunct can be exact or lower or upper bound. -// For lower bound conjunct, the upper bound is assumed to be true; -// For upper bound conjunct, the lower bound is assumed to be false - -typedef enum {EXACT_BOUND, UPPER_BOUND, LOWER_BOUND, UNSET_BOUND} Bound_Type; - - -#if defined STUDY_EVACUATIONS -typedef enum { in_to_out = 0, out_to_in = 1} which_way; - -enum evac { evac_trivial = 0, -	    evac_offset = 1, -	    evac_subseq = 2, -	    evac_offset_subseq = 3, -//	    evac_permutation = , -	    evac_affine = 4, -	    evac_nasty = 5 }; - -extern char *evac_names[]; - -#endif - -// the following list should be updated in sync with Relations.h - -#define  friend_rel_ops \ -friend Relation  Union(NOT_CONST Relation &r1, NOT_CONST Relation &r2);		\ -friend Relation  Intersection(NOT_CONST Relation &r1, NOT_CONST Relation &r2);	\ -friend Relation  After(NOT_CONST Relation &R, int carried_by, int new_output, int dir);\ -friend Relation  Extend_Domain(NOT_CONST Relation &R);			\ -friend Relation  Extend_Domain(NOT_CONST Relation &R, int more);		\ -friend Relation  Extend_Range(NOT_CONST Relation &R);			\ -friend Relation  Extend_Range(NOT_CONST Relation &R, int more);		\ -friend Relation  Extend_Set(NOT_CONST Relation &R);			\ -friend Relation  Extend_Set(NOT_CONST Relation &R, int more);		\ -friend Relation  Restrict_Domain(NOT_CONST Relation &r1, NOT_CONST Relation &r2);	\ -friend Relation  Restrict_Range(NOT_CONST Relation &r1, NOT_CONST Relation &r2);	\ -friend Relation  Domain(NOT_CONST Relation &r);				\ -friend Relation  Range(NOT_CONST Relation &r);				\ -friend Relation  Cross_Product(NOT_CONST Relation &A, NOT_CONST Relation &B);	\ -friend Relation  Inverse(NOT_CONST Relation &r);				\ -friend Relation  Deltas(NOT_CONST Relation &R);				\ -friend Relation  Deltas(NOT_CONST Relation &R, int eq_no);		\ -friend Relation  DeltasToRelation(NOT_CONST Relation &R, int n_input, int n_output); \ -friend Relation  Complement(NOT_CONST Relation &r);			\ -friend Relation  Project(NOT_CONST Relation &R, Global_Var_ID v);		\ -friend Relation  Project(NOT_CONST Relation &r, int pos, Var_Kind vkind);	\ -friend Relation  Project(NOT_CONST Relation &S, Sequence<Variable_ID> &s); \ -friend Relation  Project_Sym(NOT_CONST Relation &R);			\ -friend Relation  Project_On_Sym(NOT_CONST Relation &R, NOT_CONST Relation &context); \ -friend Relation  GistSingleConjunct(NOT_CONST Relation &R1, NOT_CONST Relation &R2, int effort); \ -friend Relation  Gist(NOT_CONST Relation &R1, NOT_CONST Relation &R2, int effort);	\ -friend Relation  Difference(NOT_CONST Relation &r1, NOT_CONST Relation &r2);	\ -friend Relation  Approximate(NOT_CONST Relation &R, bool strides_allowed);	\ -friend Relation  Identity(int n_inp);				\ -friend Relation  Identity(NOT_CONST Relation &r);				\ -friend bool do_subset_check(NOT_CONST Relation &r1, NOT_CONST Relation &r2); \ -friend bool Must_Be_Subset(NOT_CONST Relation &r1, NOT_CONST Relation &r2); \ -friend bool Might_Be_Subset(NOT_CONST Relation &r1, NOT_CONST Relation &r2); \ -friend bool May_Be_Subset(NOT_CONST Relation &r1, NOT_CONST Relation &r2); \ -friend bool      Is_Obvious_Subset(NOT_CONST Relation &r1, NOT_CONST Relation &r2);	\ -friend Relation  Join(NOT_CONST Relation &G, NOT_CONST Relation &F);		\ -friend Relation  Composition(NOT_CONST Relation &F, NOT_CONST Relation &G);		\ -friend bool      can_do_exact_composition(NOT_CONST Relation &F, NOT_CONST Relation &G); \ -friend Relation  EQs_to_GEQs(NOT_CONST Relation &, bool excludeStrides);	\ -friend Relation  Symbolic_Solution(NOT_CONST Relation &S);                \ -friend Relation  Symbolic_Solution(NOT_CONST Relation &S, Sequence<Variable_ID> &T); \ -friend Relation  Sample_Solution(NOT_CONST Relation &S);                  \ -friend Relation  Solution(NOT_CONST Relation &S, Sequence<Variable_ID> &T); \ -friend void MapRel1(Relation &inputRel, const Mapping &map,	\ -		    Combine_Type ctype, int number_input, 	\ -		    int number_output, bool, bool);		\ -friend Relation MapAndCombineRel2(Relation &R1, Relation &R2, 	\ -				  const Mapping &mapping1,	\ -				  const Mapping &mapping2,	\ -				  Combine_Type ctype,		\ -				  int number_input,		\ -				  int number_output);		\ -friend void align(Rel_Body *, Rel_Body *, F_Exists *,		\ -		  Formula *, const Mapping &, bool &,		\ -		  List<int> &, Variable_ID_Tuple &);            \ -friend Relation  Lower_Bound(NOT_CONST Relation &r);	\ -friend Relation  Upper_Bound(NOT_CONST Relation &r) - - -// REMEMBER - THE LAST LINE OF THE MACRO SHOULD NOT HAVE A ; -/* TransitiveClosure doesn't need to be in friend_rel_ops */ - -} // namespace - -#endif diff --git a/omega/omega_lib/include/omega/pres_logic.h b/omega/omega_lib/include/omega/pres_logic.h deleted file mode 100644 index 27c4553..0000000 --- a/omega/omega_lib/include/omega/pres_logic.h +++ /dev/null @@ -1,90 +0,0 @@ -#if ! defined _pres_logic_h -#define _pres_logic_h 1 - -#include <omega/pres_form.h> - -namespace omega { -// -// Presburger formula classes for logical operations: and, or not -// - -class F_And    : public Formula { -public: -    inline Node_Type node_type() {return Op_And;} - -    // "preserves level" should be 0 unless we know this will not -    // change the "level" of the constraints - ie the number of -    // leading corresponding in,out variables known to be equal -    GEQ_Handle     add_GEQ(int preserves_level = 0); -    EQ_Handle      add_EQ(int preserves_level = 0); -    Stride_Handle  add_stride(int step, int preserves_level = 0); -    EQ_Handle   add_EQ(const Constraint_Handle &c, int preserves_level = 0); -    GEQ_Handle  add_GEQ(const Constraint_Handle &c, int preserves_level = 0); - -    F_And    *and_with(); -    void add_unknown(); - -private: -    friend class Formula;  // add_and() -    F_And(Formula *p, Rel_Body *r); - -private: -    Formula *copy(Formula *parent, Rel_Body *reln); -    virtual Conjunct *find_available_conjunct(); -    int priority(); -    void print_separator(FILE *output_file); -    void prefix_print(FILE *output_file, int debug = 1); -    void beautify(); -    DNF* DNFize(); -  -    Conjunct *pos_conj; -}; - - -class F_Or     : public Formula { -public: -    inline Node_Type node_type() {return Op_Or;} - -private: -    friend class Formula; // add_or -    F_Or(Formula *, Rel_Body *); - -private: -    Formula *copy(Formula *parent, Rel_Body *reln); - -    virtual Conjunct *find_available_conjunct(); -    void print_separator(FILE *output_file); -    void prefix_print(FILE *output_file, int debug = 1); -    void beautify(); -    int priority(); -    DNF* DNFize(); -    void push_exists(Variable_ID_Tuple &S); -}; - - -class F_Not    : public Formula { -public: -    inline Node_Type node_type() {return Op_Not;} -    void finalize(); - -private: -    friend class Formula; -    F_Not(Formula *, Rel_Body *); - -private: -    Formula *copy(Formula *parent, Rel_Body *reln); - -    virtual Conjunct *find_available_conjunct(); -    friend class F_Forall; -    bool can_add_child(); -    void beautify(); -    void rearrange(); -    int priority(); -    DNF* DNFize(); -    void print(FILE *output_file); -    void prefix_print(FILE *output_file, int debug = 1); -}; - -} // namespace - -#endif diff --git a/omega/omega_lib/include/omega/pres_quant.h b/omega/omega_lib/include/omega/pres_quant.h deleted file mode 100644 index 98c30df..0000000 --- a/omega/omega_lib/include/omega/pres_quant.h +++ /dev/null @@ -1,63 +0,0 @@ -#if ! defined _pres_quant_h -#define _pres_quant_h 1 - -#include <omega/pres_decl.h> - -namespace omega { - -// -// Presburger formula nodes for quantifiers -// - -class F_Exists : public F_Declaration { -public: -    inline Node_Type node_type() {return Op_Exists;} -    Variable_ID declare(Const_String s); -    Variable_ID declare(); -    Variable_ID declare(Variable_ID v); -    virtual     void push_exists(Variable_ID_Tuple &S); - -protected: -    friend class Formula; - -    F_Exists(Formula *, Rel_Body *); -    F_Exists(Formula *, Rel_Body *, Variable_ID_Tuple &); - -private: -    Formula *copy(Formula *parent, Rel_Body *reln); - -    virtual Conjunct *find_available_conjunct(); -    void print(FILE *output_file); -    void prefix_print(FILE *output_file, int debug = 1); -    void beautify(); -    void rearrange(); -    DNF* DNFize(); -}; - - -class F_Forall : public F_Declaration { -public: -    inline Node_Type node_type() {return Op_Forall;} -    Variable_ID declare(Const_String s); -    Variable_ID declare(); -    Variable_ID declare(Variable_ID v); - -protected: -    friend class Formula; - -    F_Forall(Formula *, Rel_Body *); - -private: -    Formula *copy(Formula *parent, Rel_Body *reln); - -    virtual Conjunct *find_available_conjunct(); -    void print(FILE *output_file); -    void prefix_print(FILE *output_file, int debug = 1); -    void beautify(); -    void rearrange(); -    DNF* DNFize(); -}; - -} // namespace - -#endif diff --git a/omega/omega_lib/include/omega/pres_subs.h b/omega/omega_lib/include/omega/pres_subs.h deleted file mode 100644 index 8a9ee92..0000000 --- a/omega/omega_lib/include/omega/pres_subs.h +++ /dev/null @@ -1,88 +0,0 @@ -#if !defined(pres_subs_h) -#define pres_subs_h - -/* Interface to omega core's substitutions. - -   Creating an object of class Substitutions causes ordered elimination,  -   i.e. variables in the input and output tuples are substituted for by -   functions of earlier variables.  Could conceivablely create a more  -   flexible interface to orderedElimination if we developed a way to  -   specify the desired variable order.   - -   This is not an entirely consistent interface, since Sub_Handles -   shouldn't really permit update_coef on SUBs.  It is not a real -   problem since subs are now no longer part of a conjunct, but it is -   a slightly odd situation. - -   Don't try to simplify r after performing orderedElimination. -*/ - -    -#include <omega/pres_gen.h> -#include <omega/Relation.h> -#include <omega/pres_conj.h> -#include <omega/pres_cnstr.h> - -namespace omega { - -class Sub_Handle; -class Sub_Iterator; - -class Substitutions  { -public:  -    Substitutions(Relation &input_R, Conjunct *input_c); -    ~Substitutions(); -    Sub_Handle get_sub(Variable_ID v); -    bool substituted(Variable_ID v); -    bool sub_involves(Variable_ID v, Var_Kind kind); -private: -    friend class Sub_Iterator; -    friend class Sub_Handle; -    Relation *r; -    Conjunct *c; -    eqn *subs; -    Variable_ID_Tuple subbed_vars; -}; - - -//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - - -class Sub_Handle: public Constraint_Handle { -public: -    inline Sub_Handle() {} - -    virtual std::string print_to_string() const; -    virtual std::string print_term_to_string() const; -    Variable_ID variable() {return v;} - -private: -    friend class Substitutions; -    friend class Sub_Iterator; -    Sub_Handle(Substitutions *, int, Variable_ID); -//    Sub_Handle(Substitutions *, int); - -    Variable_ID v; -}; - -//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - - -class Sub_Iterator : public Generator<Sub_Handle> { -public: -    Sub_Iterator(Substitutions *input_s): s(input_s), current(0), -                                          last(s->c->problem->nSUBs-1) {} -    int  live() const; -    void operator++(int); -    void operator++(); -    Sub_Handle operator* (); -    Sub_Handle operator* () const; - -private: -    Substitutions *s; -    int current, last; -}; - -} // namespace - -#endif diff --git a/omega/omega_lib/include/omega/pres_tree.h b/omega/omega_lib/include/omega/pres_tree.h deleted file mode 100644 index ad78ad0..0000000 --- a/omega/omega_lib/include/omega/pres_tree.h +++ /dev/null @@ -1,15 +0,0 @@ -#if ! defined _pres_tree_h -#define _pres_tree_h 1 - -// -// Header to include if you need all the classes to build -// a Presburger formula: -// variables, constraints, nodes for logical operations & quantifiers -// - -#include <omega/pres_var.h> -#include <omega/pres_cnstr.h> -#include <omega/pres_logic.h> -#include <omega/pres_quant.h> - -#endif diff --git a/omega/omega_lib/include/omega/pres_var.h b/omega/omega_lib/include/omega/pres_var.h deleted file mode 100644 index bf60dcb..0000000 --- a/omega/omega_lib/include/omega/pres_var.h +++ /dev/null @@ -1,230 +0,0 @@ -#if ! defined _pres_var_h -#define _pres_var_h 1 - -#include <omega/pres_gen.h> -#include <map> - -namespace omega { - -// -// Variable declaration. -// Variables are free or quantified. -// Free variables are classified as input, output and global. -// Quantified variables are classified as forall, exists and wildcard. -// All global variables are functions symbols of (possibly 0) arguments -// Local variables that correspond to >0-ary functions are identified -//   as functions of a prefix of the input, output, or both tuples -// -//  -// typedef enum {Input_Var, Output_Var, Set_Var, -//               Global_Var, Forall_Var, Exists_Var, Wildcard_Var} Var_Kind; - -typedef enum {Free_Var, Coef_Var, Bomega_Var} Global_Kind; - -// NOW IN PRES_GEN.H, as its used as an argument and can't -// be forward declared: -// typedef enum {Unknown_Tuple = 0, Input_Tuple = 1, Output_Tuple = 2, -//     Set_Tuple = Input_Tuple } Argument_Tuple; -// Only Input, Output, and Set can be passed to get_local, -// but the values 0 and 3 are also used internally. - - -class Var_Decl { -public: -  inline Var_Kind    kind() { return var_kind; } -  int         get_position(); -  Global_Var_ID      get_global_var(); -  Argument_Tuple     function_of();  // valid iff kind() == Global_var - -  Const_String base_name; -  void name_variable(char *newname); - -  // The following should be used with care, as they are only valid -  // after setup_names has been used on the relation containing this -  // variable. -  std::string name(); -  const char* char_name(); -  void set_kind(Var_Kind v) { var_kind = v; } - -  // Operation to allow the remap field to be used for -  // union-find operations on variables. -  // Be sure to reset the remap fields afterward -  void         UF_union(Variable_ID v); -  Variable_ID  UF_owner(); - -private: -  Var_Decl(Const_String name, Var_Kind vkind, int pos); -  Var_Decl(Var_Kind vkind, int pos); -  Var_Decl(Variable_ID v); -  Var_Decl(Const_String name, Global_Var_ID v); -  Var_Decl(Const_String name, Global_Var_ID v, Argument_Tuple function_of); - -  friend class F_Declaration;    // creates local variables -  friend class Global_Var_Decl;  // its constructors create Var_Decls. - -  friend class Global_Input_Output_Tuple; -  friend void copy_var_decls(Variable_ID_Tuple &new_vl, Variable_ID_Tuple &vl); - -private: -  int  instance; -  void setup_name(); - -  // these set up the names -  friend class Rel_Body; -//  friend class F_Declaration; already a friend - -private: -  Variable_ID   remap;          // pointer to new copy of this node - -  // lots of things need to get at "remap" - lots of relation ops, -  // and functions that move UFS's around: -  //     dnf::make_level_carried_to and Conjunct::move_UFS_to_input() -  // Also of course Conjunct::remap and push_exists -  friend_rel_ops; -  friend class DNF; -  friend class Conjunct; - -  // this prints remap to the debugging output -  friend void print_var_addrs(std::string &s, Variable_ID v); - -  friend void reset_remap_field(Variable_ID v); -  friend void reset_remap_field(Sequence<Variable_ID> &S); -  friend void reset_remap_field(Sequence<Variable_ID> &S, int var_no); -  friend void reset_remap_field(Variable_ID_Tuple &S); -  friend void reset_remap_field(Variable_ID_Tuple &S, int var_no); - -private: - -  Var_Kind      var_kind; -  int           position; // only for Input_Var, Output_Var -  Global_Var_ID global_var;     // only for Global_Var -  Argument_Tuple of;  // only for Global_Var -}; - -bool rm_variable(Variable_ID_Tuple &vl, Variable_ID v); -void reset_remap_field(Sequence<Variable_ID> &S); -void reset_remap_field(Sequence<Variable_ID> &S, int var_no); -void reset_remap_field(Variable_ID v); -void reset_remap_field(Variable_ID_Tuple &S); -void reset_remap_field(Variable_ID_Tuple &S, int var_no); - -class Global_Input_Output_Tuple: public Tuple<Variable_ID> { -public: -  Global_Input_Output_Tuple(Var_Kind in_my_kind, int init=-1); -  ~Global_Input_Output_Tuple(); -  virtual Variable_ID &operator[](int index); -  virtual const Variable_ID &operator[](int index) const; -private: -  Var_Kind my_kind; -  static const int initial_allocation; -}; - -extern Global_Input_Output_Tuple input_vars; -extern Global_Input_Output_Tuple output_vars; -// This allows the user to refer to set_vars to query sets, w/o knowing -// they are really inputs. -extern Global_Input_Output_Tuple &set_vars; - -Variable_ID input_var(int nth); -Variable_ID output_var(int nth); -Variable_ID set_var(int nth); - - - -// -// Global_Var_ID uniquely identifies global var-s through the whole program. -// Global_Var_Decl is an ADT with the following operations: -// - create global variable, -// - find the arity of the variable, (default = 0, for symbolic consts) -// - get the name of global variable,  -// - tell if two variables are the same (if they are the same object) -// - -class Global_Var_Decl { -public: -  Global_Var_Decl(Const_String baseName); - -  virtual Const_String base_name() const -  { -    return loc_rep1.base_name; -  } - -  virtual void set_base_name(Const_String newName) -  { -    loc_rep1.base_name = newName; -    loc_rep2.base_name = newName; -  } - -  virtual int arity() const -  { -    return 0;   // default compatible with old symbolic constant stuff -  } - -  virtual Omega_Var *really_omega_var();  // until we get RTTI in C++ -  virtual Coef_Var_Decl *really_coef_var();  // until we get RTTI in C++ -  virtual Global_Kind kind() const; - -private: - -  friend class Rel_Body;  // Rel_Body::get_local calls this get_local - -  Variable_ID get_local() -  { -    assert(arity() == 0); -    return &loc_rep1; -  } -  Variable_ID get_local(Argument_Tuple of) -  { -    assert(arity() == 0 || of == Input_Tuple || of == Output_Tuple); -    return ((arity() == 0 || of == Input_Tuple) ? &loc_rep1 : &loc_rep2); -  } - -  // local representative, there is just 1 for every 0-ary global variable -  Var_Decl loc_rep1; // arity == 0, or arity > 0 and of == In -  Var_Decl loc_rep2; // arity > 0 and of == Out - -public: -//    friend class Rel_Body;  // Rel_Body::setup_names sets instance -  friend class Var_Decl; -  int instance; -}; - - -class Coef_Var_Decl : public Global_Var_Decl { -public: -  Coef_Var_Decl(int id, int var); -  int stmt() const; -  int var() const; -  virtual Global_Kind kind() const; -  virtual Coef_Var_Decl *really_coef_var();  // until we get RTTI in C++ - -private: -  int i, v; -}; - - - -// -// Test subclass for Global_Var: named global variable -// -class Free_Var_Decl : public Global_Var_Decl { -public: -  Free_Var_Decl(Const_String name); -  Free_Var_Decl(Const_String name, int arity); -  int arity() const; -  virtual Global_Kind kind() const; - -private: -  int _arity; -}; - - -/* === implementation functions === */ -void copy_var_decls(Variable_ID_Tuple &new_vl, Variable_ID_Tuple &vl); -void free_var_decls(Variable_ID_Tuple &vl); - -extern int wildCardInstanceNumber; - -} // namespace - -#endif diff --git a/omega/omega_lib/include/omega/reach.h b/omega/omega_lib/include/omega/reach.h deleted file mode 100644 index ff4bf79..0000000 --- a/omega/omega_lib/include/omega/reach.h +++ /dev/null @@ -1,23 +0,0 @@ -#if ! defined _reach_h -#define _reach_h 1 - -namespace omega { - -class reachable_information { -public: -	Tuple<std::string> node_names; -	Tuple<int> node_arity; -	Dynamic_Array1<Relation> start_nodes; -	Dynamic_Array2<Relation> transitions; -}; - - -Dynamic_Array1<Relation> * -Reachable_Nodes(reachable_information * reachable_info); - -Dynamic_Array1<Relation> * -I_Reachable_Nodes(reachable_information * reachable_info); - -} // namespace - -#endif diff --git a/omega/omega_lib/obj/Makefile.am b/omega/omega_lib/obj/Makefile.am deleted file mode 100644 index 455fc58..0000000 --- a/omega/omega_lib/obj/Makefile.am +++ /dev/null @@ -1,47 +0,0 @@ -noinst_LIBRARIES   = libomega.a - -basic_src   =../../basic/src/ConstString.cc -basic_src  +=../../basic/src/Link.cc - -oc_src   =../src/omega_core/oc.cc -oc_src  +=../src/omega_core/oc_eq.cc -oc_src  +=../src/omega_core/oc_exp_kill.cc -oc_src  +=../src/omega_core/oc_global.cc -oc_src  +=../src/omega_core/oc_print.cc -oc_src  +=../src/omega_core/oc_problems.cc -oc_src  +=../src/omega_core/oc_simple.cc -oc_src  +=../src/omega_core/oc_solve.cc -oc_src  +=../src/omega_core/oc_query.cc -oc_src  +=../src/omega_core/oc_quick_kill.cc -oc_src  +=../src/omega_core/oc_util.cc - -pres_src   =../src/pres_beaut.cc -pres_src  +=../src/pres_cnstr.cc -pres_src  +=../src/pres_col.cc -pres_src  +=../src/pres_conj.cc -pres_src  +=../src/pres_decl.cc -pres_src  +=../src/pres_dnf.cc -pres_src  +=../src/pres_form.cc -pres_src  +=../src/pres_gen.cc -pres_src  +=../src/pres_logic.cc -pres_src  +=../src/pres_print.cc -pres_src  +=../src/pres_rear.cc -pres_src  +=../src/pres_quant.cc -pres_src  +=../src/pres_subs.cc -pres_src  +=../src/pres_var.cc - -rel_src   =../src/evac.cc -rel_src  +=../src/farkas.cc -rel_src  +=../src/hull_legacy.cc -rel_src  +=../src/hull_simple.cc -rel_src  +=../src/Relation.cc -rel_src  +=../src/Relations.cc -rel_src  +=../src/RelBody.cc -rel_src  +=../src/RelVar.cc - -fancy_src   =../src/closure.cc -fancy_src  +=../src/reach.cc - - -libomega_a_SOURCES  =$(basic_src) $(oc_src) $(pres_src) $(rel_src) $(fancy_src) -libomega_a_CPPFLAGS =-I../include -I../../basic/include diff --git a/omega/omega_lib/obj/Makefile.in b/omega/omega_lib/obj/Makefile.in deleted file mode 100644 index 0bc1d1f..0000000 --- a/omega/omega_lib/obj/Makefile.in +++ /dev/null @@ -1,1257 +0,0 @@ -# Makefile.in generated by automake 1.14.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994-2013 Free Software Foundation, Inc. - -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -VPATH = @srcdir@ -am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' -am__make_running_with_option = \ -  case $${target_option-} in \ -      ?) ;; \ -      *) echo "am__make_running_with_option: internal error: invalid" \ -              "target option '$${target_option-}' specified" >&2; \ -         exit 1;; \ -  esac; \ -  has_opt=no; \ -  sane_makeflags=$$MAKEFLAGS; \ -  if $(am__is_gnu_make); then \ -    sane_makeflags=$$MFLAGS; \ -  else \ -    case $$MAKEFLAGS in \ -      *\\[\ \	]*) \ -        bs=\\; \ -        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ -          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \ -    esac; \ -  fi; \ -  skip_next=no; \ -  strip_trailopt () \ -  { \ -    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ -  }; \ -  for flg in $$sane_makeflags; do \ -    test $$skip_next = yes && { skip_next=no; continue; }; \ -    case $$flg in \ -      *=*|--*) continue;; \ -        -*I) strip_trailopt 'I'; skip_next=yes;; \ -      -*I?*) strip_trailopt 'I';; \ -        -*O) strip_trailopt 'O'; skip_next=yes;; \ -      -*O?*) strip_trailopt 'O';; \ -        -*l) strip_trailopt 'l'; skip_next=yes;; \ -      -*l?*) strip_trailopt 'l';; \ -      -[dEDm]) skip_next=yes;; \ -      -[JT]) skip_next=yes;; \ -    esac; \ -    case $$flg in \ -      *$$target_option*) has_opt=yes; break;; \ -    esac; \ -  done; \ -  test $$has_opt = yes -am__make_dryrun = (target_option=n; $(am__make_running_with_option)) -am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -subdir = omega_lib/obj -DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ -	$(top_srcdir)/depcomp -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ -	$(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/include/config.h -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -LIBRARIES = $(noinst_LIBRARIES) -ARFLAGS = cru -AM_V_AR = $(am__v_AR_@AM_V@) -am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) -am__v_AR_0 = @echo "  AR      " $@; -am__v_AR_1 =  -libomega_a_AR = $(AR) $(ARFLAGS) -libomega_a_LIBADD = -am__dirstamp = $(am__leading_dot)dirstamp -am__objects_1 = ../../basic/src/libomega_a-ConstString.$(OBJEXT) \ -	../../basic/src/libomega_a-Link.$(OBJEXT) -am__objects_2 = ../src/omega_core/libomega_a-oc.$(OBJEXT) \ -	../src/omega_core/libomega_a-oc_eq.$(OBJEXT) \ -	../src/omega_core/libomega_a-oc_exp_kill.$(OBJEXT) \ -	../src/omega_core/libomega_a-oc_global.$(OBJEXT) \ -	../src/omega_core/libomega_a-oc_print.$(OBJEXT) \ -	../src/omega_core/libomega_a-oc_problems.$(OBJEXT) \ -	../src/omega_core/libomega_a-oc_simple.$(OBJEXT) \ -	../src/omega_core/libomega_a-oc_solve.$(OBJEXT) \ -	../src/omega_core/libomega_a-oc_query.$(OBJEXT) \ -	../src/omega_core/libomega_a-oc_quick_kill.$(OBJEXT) \ -	../src/omega_core/libomega_a-oc_util.$(OBJEXT) -am__objects_3 = ../src/libomega_a-pres_beaut.$(OBJEXT) \ -	../src/libomega_a-pres_cnstr.$(OBJEXT) \ -	../src/libomega_a-pres_col.$(OBJEXT) \ -	../src/libomega_a-pres_conj.$(OBJEXT) \ -	../src/libomega_a-pres_decl.$(OBJEXT) \ -	../src/libomega_a-pres_dnf.$(OBJEXT) \ -	../src/libomega_a-pres_form.$(OBJEXT) \ -	../src/libomega_a-pres_gen.$(OBJEXT) \ -	../src/libomega_a-pres_logic.$(OBJEXT) \ -	../src/libomega_a-pres_print.$(OBJEXT) \ -	../src/libomega_a-pres_rear.$(OBJEXT) \ -	../src/libomega_a-pres_quant.$(OBJEXT) \ -	../src/libomega_a-pres_subs.$(OBJEXT) \ -	../src/libomega_a-pres_var.$(OBJEXT) -am__objects_4 = ../src/libomega_a-evac.$(OBJEXT) \ -	../src/libomega_a-farkas.$(OBJEXT) \ -	../src/libomega_a-hull_legacy.$(OBJEXT) \ -	../src/libomega_a-hull_simple.$(OBJEXT) \ -	../src/libomega_a-Relation.$(OBJEXT) \ -	../src/libomega_a-Relations.$(OBJEXT) \ -	../src/libomega_a-RelBody.$(OBJEXT) \ -	../src/libomega_a-RelVar.$(OBJEXT) -am__objects_5 = ../src/libomega_a-closure.$(OBJEXT) \ -	../src/libomega_a-reach.$(OBJEXT) -am_libomega_a_OBJECTS = $(am__objects_1) $(am__objects_2) \ -	$(am__objects_3) $(am__objects_4) $(am__objects_5) -libomega_a_OBJECTS = $(am_libomega_a_OBJECTS) -AM_V_P = $(am__v_P_@AM_V@) -am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_@AM_V@) -am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) -am__v_GEN_0 = @echo "  GEN     " $@; -am__v_GEN_1 =  -AM_V_at = $(am__v_at_@AM_V@) -am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) -am__v_at_0 = @ -am__v_at_1 =  -DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles -am__mv = mv -f -AM_V_lt = $(am__v_lt_@AM_V@) -am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) -am__v_lt_0 = --silent -am__v_lt_1 =  -CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ -	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -AM_V_CXX = $(am__v_CXX_@AM_V@) -am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) -am__v_CXX_0 = @echo "  CXX     " $@; -am__v_CXX_1 =  -CXXLD = $(CXX) -CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -	-o $@ -AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) -am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) -am__v_CXXLD_0 = @echo "  CXXLD   " $@; -am__v_CXXLD_1 =  -SOURCES = $(libomega_a_SOURCES) -DIST_SOURCES = $(libomega_a_SOURCES) -am__can_run_installinfo = \ -  case $$AM_UPDATE_INFO_DIR in \ -    n|no|NO) false;; \ -    *) (install-info --version) >/dev/null 2>&1;; \ -  esac -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) -# Read a list of newline-separated strings from the standard input, -# and print each of them once, without duplicates.  Input order is -# *not* preserved. -am__uniquify_input = $(AWK) '\ -  BEGIN { nonempty = 0; } \ -  { items[$$0] = 1; nonempty = 1; } \ -  END { if (nonempty) { for (i in items) print i; }; } \ -' -# Make sure the list of sources is unique.  This is necessary because, -# e.g., the same source file might be shared among _SOURCES variables -# for different programs/libraries. -am__define_uniq_tagged_files = \ -  list='$(am__tagged_files)'; \ -  unique=`for i in $$list; do \ -    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ -  done | $(am__uniquify_input)` -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -BOOSTHOME = @BOOSTHOME@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CCLD = @CCLD@ -CFLAGS = @CFLAGS@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EXEEXT = @EXEEXT@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LDFLAGS = @LDFLAGS@ -LEX = @LEX@ -LEXLIB = @LEXLIB@ -LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -ROSEHOME = @ROSEHOME@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -YACC = @YACC@ -YFLAGS = @YFLAGS@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build_alias = @build_alias@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host_alias = @host_alias@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -noinst_LIBRARIES = libomega.a -basic_src = ../../basic/src/ConstString.cc ../../basic/src/Link.cc -oc_src = ../src/omega_core/oc.cc ../src/omega_core/oc_eq.cc \ -	../src/omega_core/oc_exp_kill.cc \ -	../src/omega_core/oc_global.cc ../src/omega_core/oc_print.cc \ -	../src/omega_core/oc_problems.cc \ -	../src/omega_core/oc_simple.cc ../src/omega_core/oc_solve.cc \ -	../src/omega_core/oc_query.cc \ -	../src/omega_core/oc_quick_kill.cc \ -	../src/omega_core/oc_util.cc -pres_src = ../src/pres_beaut.cc ../src/pres_cnstr.cc \ -	../src/pres_col.cc ../src/pres_conj.cc ../src/pres_decl.cc \ -	../src/pres_dnf.cc ../src/pres_form.cc ../src/pres_gen.cc \ -	../src/pres_logic.cc ../src/pres_print.cc ../src/pres_rear.cc \ -	../src/pres_quant.cc ../src/pres_subs.cc ../src/pres_var.cc -rel_src = ../src/evac.cc ../src/farkas.cc ../src/hull_legacy.cc \ -	../src/hull_simple.cc ../src/Relation.cc ../src/Relations.cc \ -	../src/RelBody.cc ../src/RelVar.cc -fancy_src = ../src/closure.cc ../src/reach.cc -libomega_a_SOURCES = $(basic_src) $(oc_src) $(pres_src) $(rel_src) $(fancy_src) -libomega_a_CPPFLAGS = -I../include -I../../basic/include -all: all-am - -.SUFFIXES: -.SUFFIXES: .cc .o .obj -$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps) -	@for dep in $?; do \ -	  case '$(am__configure_deps)' in \ -	    *$$dep*) \ -	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ -	        && { if test -f $@; then exit 0; else break; fi; }; \ -	      exit 1;; \ -	  esac; \ -	done; \ -	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign omega_lib/obj/Makefile'; \ -	$(am__cd) $(top_srcdir) && \ -	  $(AUTOMAKE) --foreign omega_lib/obj/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status -	@case '$?' in \ -	  *config.status*) \ -	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ -	  *) \ -	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ -	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ -	esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) -	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure:  $(am__configure_deps) -	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4):  $(am__aclocal_m4_deps) -	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): - -clean-noinstLIBRARIES: -	-test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) -../../basic/src/$(am__dirstamp): -	@$(MKDIR_P) ../../basic/src -	@: > ../../basic/src/$(am__dirstamp) -../../basic/src/$(DEPDIR)/$(am__dirstamp): -	@$(MKDIR_P) ../../basic/src/$(DEPDIR) -	@: > ../../basic/src/$(DEPDIR)/$(am__dirstamp) -../../basic/src/libomega_a-ConstString.$(OBJEXT):  \ -	../../basic/src/$(am__dirstamp) \ -	../../basic/src/$(DEPDIR)/$(am__dirstamp) -../../basic/src/libomega_a-Link.$(OBJEXT):  \ -	../../basic/src/$(am__dirstamp) \ -	../../basic/src/$(DEPDIR)/$(am__dirstamp) -../src/omega_core/$(am__dirstamp): -	@$(MKDIR_P) ../src/omega_core -	@: > ../src/omega_core/$(am__dirstamp) -../src/omega_core/$(DEPDIR)/$(am__dirstamp): -	@$(MKDIR_P) ../src/omega_core/$(DEPDIR) -	@: > ../src/omega_core/$(DEPDIR)/$(am__dirstamp) -../src/omega_core/libomega_a-oc.$(OBJEXT):  \ -	../src/omega_core/$(am__dirstamp) \ -	../src/omega_core/$(DEPDIR)/$(am__dirstamp) -../src/omega_core/libomega_a-oc_eq.$(OBJEXT):  \ -	../src/omega_core/$(am__dirstamp) \ -	../src/omega_core/$(DEPDIR)/$(am__dirstamp) -../src/omega_core/libomega_a-oc_exp_kill.$(OBJEXT):  \ -	../src/omega_core/$(am__dirstamp) \ -	../src/omega_core/$(DEPDIR)/$(am__dirstamp) -../src/omega_core/libomega_a-oc_global.$(OBJEXT):  \ -	../src/omega_core/$(am__dirstamp) \ -	../src/omega_core/$(DEPDIR)/$(am__dirstamp) -../src/omega_core/libomega_a-oc_print.$(OBJEXT):  \ -	../src/omega_core/$(am__dirstamp) \ -	../src/omega_core/$(DEPDIR)/$(am__dirstamp) -../src/omega_core/libomega_a-oc_problems.$(OBJEXT):  \ -	../src/omega_core/$(am__dirstamp) \ -	../src/omega_core/$(DEPDIR)/$(am__dirstamp) -../src/omega_core/libomega_a-oc_simple.$(OBJEXT):  \ -	../src/omega_core/$(am__dirstamp) \ -	../src/omega_core/$(DEPDIR)/$(am__dirstamp) -../src/omega_core/libomega_a-oc_solve.$(OBJEXT):  \ -	../src/omega_core/$(am__dirstamp) \ -	../src/omega_core/$(DEPDIR)/$(am__dirstamp) -../src/omega_core/libomega_a-oc_query.$(OBJEXT):  \ -	../src/omega_core/$(am__dirstamp) \ -	../src/omega_core/$(DEPDIR)/$(am__dirstamp) -../src/omega_core/libomega_a-oc_quick_kill.$(OBJEXT):  \ -	../src/omega_core/$(am__dirstamp) \ -	../src/omega_core/$(DEPDIR)/$(am__dirstamp) -../src/omega_core/libomega_a-oc_util.$(OBJEXT):  \ -	../src/omega_core/$(am__dirstamp) \ -	../src/omega_core/$(DEPDIR)/$(am__dirstamp) -../src/$(am__dirstamp): -	@$(MKDIR_P) ../src -	@: > ../src/$(am__dirstamp) -../src/$(DEPDIR)/$(am__dirstamp): -	@$(MKDIR_P) ../src/$(DEPDIR) -	@: > ../src/$(DEPDIR)/$(am__dirstamp) -../src/libomega_a-pres_beaut.$(OBJEXT): ../src/$(am__dirstamp) \ -	../src/$(DEPDIR)/$(am__dirstamp) -../src/libomega_a-pres_cnstr.$(OBJEXT): ../src/$(am__dirstamp) \ -	../src/$(DEPDIR)/$(am__dirstamp) -../src/libomega_a-pres_col.$(OBJEXT): ../src/$(am__dirstamp) \ -	../src/$(DEPDIR)/$(am__dirstamp) -../src/libomega_a-pres_conj.$(OBJEXT): ../src/$(am__dirstamp) \ -	../src/$(DEPDIR)/$(am__dirstamp) -../src/libomega_a-pres_decl.$(OBJEXT): ../src/$(am__dirstamp) \ -	../src/$(DEPDIR)/$(am__dirstamp) -../src/libomega_a-pres_dnf.$(OBJEXT): ../src/$(am__dirstamp) \ -	../src/$(DEPDIR)/$(am__dirstamp) -../src/libomega_a-pres_form.$(OBJEXT): ../src/$(am__dirstamp) \ -	../src/$(DEPDIR)/$(am__dirstamp) -../src/libomega_a-pres_gen.$(OBJEXT): ../src/$(am__dirstamp) \ -	../src/$(DEPDIR)/$(am__dirstamp) -../src/libomega_a-pres_logic.$(OBJEXT): ../src/$(am__dirstamp) \ -	../src/$(DEPDIR)/$(am__dirstamp) -../src/libomega_a-pres_print.$(OBJEXT): ../src/$(am__dirstamp) \ -	../src/$(DEPDIR)/$(am__dirstamp) -../src/libomega_a-pres_rear.$(OBJEXT): ../src/$(am__dirstamp) \ -	../src/$(DEPDIR)/$(am__dirstamp) -../src/libomega_a-pres_quant.$(OBJEXT): ../src/$(am__dirstamp) \ -	../src/$(DEPDIR)/$(am__dirstamp) -../src/libomega_a-pres_subs.$(OBJEXT): ../src/$(am__dirstamp) \ -	../src/$(DEPDIR)/$(am__dirstamp) -../src/libomega_a-pres_var.$(OBJEXT): ../src/$(am__dirstamp) \ -	../src/$(DEPDIR)/$(am__dirstamp) -../src/libomega_a-evac.$(OBJEXT): ../src/$(am__dirstamp) \ -	../src/$(DEPDIR)/$(am__dirstamp) -../src/libomega_a-farkas.$(OBJEXT): ../src/$(am__dirstamp) \ -	../src/$(DEPDIR)/$(am__dirstamp) -../src/libomega_a-hull_legacy.$(OBJEXT): ../src/$(am__dirstamp) \ -	../src/$(DEPDIR)/$(am__dirstamp) -../src/libomega_a-hull_simple.$(OBJEXT): ../src/$(am__dirstamp) \ -	../src/$(DEPDIR)/$(am__dirstamp) -../src/libomega_a-Relation.$(OBJEXT): ../src/$(am__dirstamp) \ -	../src/$(DEPDIR)/$(am__dirstamp) -../src/libomega_a-Relations.$(OBJEXT): ../src/$(am__dirstamp) \ -	../src/$(DEPDIR)/$(am__dirstamp) -../src/libomega_a-RelBody.$(OBJEXT): ../src/$(am__dirstamp) \ -	../src/$(DEPDIR)/$(am__dirstamp) -../src/libomega_a-RelVar.$(OBJEXT): ../src/$(am__dirstamp) \ -	../src/$(DEPDIR)/$(am__dirstamp) -../src/libomega_a-closure.$(OBJEXT): ../src/$(am__dirstamp) \ -	../src/$(DEPDIR)/$(am__dirstamp) -../src/libomega_a-reach.$(OBJEXT): ../src/$(am__dirstamp) \ -	../src/$(DEPDIR)/$(am__dirstamp) - -libomega.a: $(libomega_a_OBJECTS) $(libomega_a_DEPENDENCIES) $(EXTRA_libomega_a_DEPENDENCIES)  -	$(AM_V_at)-rm -f libomega.a -	$(AM_V_AR)$(libomega_a_AR) libomega.a $(libomega_a_OBJECTS) $(libomega_a_LIBADD) -	$(AM_V_at)$(RANLIB) libomega.a - -mostlyclean-compile: -	-rm -f *.$(OBJEXT) -	-rm -f ../../basic/src/*.$(OBJEXT) -	-rm -f ../src/*.$(OBJEXT) -	-rm -f ../src/omega_core/*.$(OBJEXT) - -distclean-compile: -	-rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@../../basic/src/$(DEPDIR)/libomega_a-ConstString.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@../../basic/src/$(DEPDIR)/libomega_a-Link.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@../src/$(DEPDIR)/libomega_a-RelBody.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@../src/$(DEPDIR)/libomega_a-RelVar.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@../src/$(DEPDIR)/libomega_a-Relation.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@../src/$(DEPDIR)/libomega_a-Relations.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@../src/$(DEPDIR)/libomega_a-closure.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@../src/$(DEPDIR)/libomega_a-evac.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@../src/$(DEPDIR)/libomega_a-farkas.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@../src/$(DEPDIR)/libomega_a-hull_legacy.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@../src/$(DEPDIR)/libomega_a-hull_simple.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@../src/$(DEPDIR)/libomega_a-pres_beaut.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@../src/$(DEPDIR)/libomega_a-pres_cnstr.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@../src/$(DEPDIR)/libomega_a-pres_col.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@../src/$(DEPDIR)/libomega_a-pres_conj.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@../src/$(DEPDIR)/libomega_a-pres_decl.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@../src/$(DEPDIR)/libomega_a-pres_dnf.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@../src/$(DEPDIR)/libomega_a-pres_form.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@../src/$(DEPDIR)/libomega_a-pres_gen.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@../src/$(DEPDIR)/libomega_a-pres_logic.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@../src/$(DEPDIR)/libomega_a-pres_print.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@../src/$(DEPDIR)/libomega_a-pres_quant.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@../src/$(DEPDIR)/libomega_a-pres_rear.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@../src/$(DEPDIR)/libomega_a-pres_subs.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@../src/$(DEPDIR)/libomega_a-pres_var.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@../src/$(DEPDIR)/libomega_a-reach.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@../src/omega_core/$(DEPDIR)/libomega_a-oc.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@../src/omega_core/$(DEPDIR)/libomega_a-oc_eq.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@../src/omega_core/$(DEPDIR)/libomega_a-oc_exp_kill.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@../src/omega_core/$(DEPDIR)/libomega_a-oc_global.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@../src/omega_core/$(DEPDIR)/libomega_a-oc_print.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@../src/omega_core/$(DEPDIR)/libomega_a-oc_problems.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@../src/omega_core/$(DEPDIR)/libomega_a-oc_query.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@../src/omega_core/$(DEPDIR)/libomega_a-oc_quick_kill.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@../src/omega_core/$(DEPDIR)/libomega_a-oc_simple.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@../src/omega_core/$(DEPDIR)/libomega_a-oc_solve.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@../src/omega_core/$(DEPDIR)/libomega_a-oc_util.Po@am__quote@ - -.cc.o: -@am__fastdepCXX_TRUE@	$(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ -@am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ -@am__fastdepCXX_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< - -.cc.obj: -@am__fastdepCXX_TRUE@	$(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ -@am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ -@am__fastdepCXX_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` - -../../basic/src/libomega_a-ConstString.o: ../../basic/src/ConstString.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../../basic/src/libomega_a-ConstString.o -MD -MP -MF ../../basic/src/$(DEPDIR)/libomega_a-ConstString.Tpo -c -o ../../basic/src/libomega_a-ConstString.o `test -f '../../basic/src/ConstString.cc' || echo '$(srcdir)/'`../../basic/src/ConstString.cc -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../../basic/src/$(DEPDIR)/libomega_a-ConstString.Tpo ../../basic/src/$(DEPDIR)/libomega_a-ConstString.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../../basic/src/ConstString.cc' object='../../basic/src/libomega_a-ConstString.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../../basic/src/libomega_a-ConstString.o `test -f '../../basic/src/ConstString.cc' || echo '$(srcdir)/'`../../basic/src/ConstString.cc - -../../basic/src/libomega_a-ConstString.obj: ../../basic/src/ConstString.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../../basic/src/libomega_a-ConstString.obj -MD -MP -MF ../../basic/src/$(DEPDIR)/libomega_a-ConstString.Tpo -c -o ../../basic/src/libomega_a-ConstString.obj `if test -f '../../basic/src/ConstString.cc'; then $(CYGPATH_W) '../../basic/src/ConstString.cc'; else $(CYGPATH_W) '$(srcdir)/../../basic/src/ConstString.cc'; fi` -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../../basic/src/$(DEPDIR)/libomega_a-ConstString.Tpo ../../basic/src/$(DEPDIR)/libomega_a-ConstString.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../../basic/src/ConstString.cc' object='../../basic/src/libomega_a-ConstString.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../../basic/src/libomega_a-ConstString.obj `if test -f '../../basic/src/ConstString.cc'; then $(CYGPATH_W) '../../basic/src/ConstString.cc'; else $(CYGPATH_W) '$(srcdir)/../../basic/src/ConstString.cc'; fi` - -../../basic/src/libomega_a-Link.o: ../../basic/src/Link.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../../basic/src/libomega_a-Link.o -MD -MP -MF ../../basic/src/$(DEPDIR)/libomega_a-Link.Tpo -c -o ../../basic/src/libomega_a-Link.o `test -f '../../basic/src/Link.cc' || echo '$(srcdir)/'`../../basic/src/Link.cc -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../../basic/src/$(DEPDIR)/libomega_a-Link.Tpo ../../basic/src/$(DEPDIR)/libomega_a-Link.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../../basic/src/Link.cc' object='../../basic/src/libomega_a-Link.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../../basic/src/libomega_a-Link.o `test -f '../../basic/src/Link.cc' || echo '$(srcdir)/'`../../basic/src/Link.cc - -../../basic/src/libomega_a-Link.obj: ../../basic/src/Link.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../../basic/src/libomega_a-Link.obj -MD -MP -MF ../../basic/src/$(DEPDIR)/libomega_a-Link.Tpo -c -o ../../basic/src/libomega_a-Link.obj `if test -f '../../basic/src/Link.cc'; then $(CYGPATH_W) '../../basic/src/Link.cc'; else $(CYGPATH_W) '$(srcdir)/../../basic/src/Link.cc'; fi` -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../../basic/src/$(DEPDIR)/libomega_a-Link.Tpo ../../basic/src/$(DEPDIR)/libomega_a-Link.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../../basic/src/Link.cc' object='../../basic/src/libomega_a-Link.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../../basic/src/libomega_a-Link.obj `if test -f '../../basic/src/Link.cc'; then $(CYGPATH_W) '../../basic/src/Link.cc'; else $(CYGPATH_W) '$(srcdir)/../../basic/src/Link.cc'; fi` - -../src/omega_core/libomega_a-oc.o: ../src/omega_core/oc.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/omega_core/libomega_a-oc.o -MD -MP -MF ../src/omega_core/$(DEPDIR)/libomega_a-oc.Tpo -c -o ../src/omega_core/libomega_a-oc.o `test -f '../src/omega_core/oc.cc' || echo '$(srcdir)/'`../src/omega_core/oc.cc -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/omega_core/$(DEPDIR)/libomega_a-oc.Tpo ../src/omega_core/$(DEPDIR)/libomega_a-oc.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/omega_core/oc.cc' object='../src/omega_core/libomega_a-oc.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/omega_core/libomega_a-oc.o `test -f '../src/omega_core/oc.cc' || echo '$(srcdir)/'`../src/omega_core/oc.cc - -../src/omega_core/libomega_a-oc.obj: ../src/omega_core/oc.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/omega_core/libomega_a-oc.obj -MD -MP -MF ../src/omega_core/$(DEPDIR)/libomega_a-oc.Tpo -c -o ../src/omega_core/libomega_a-oc.obj `if test -f '../src/omega_core/oc.cc'; then $(CYGPATH_W) '../src/omega_core/oc.cc'; else $(CYGPATH_W) '$(srcdir)/../src/omega_core/oc.cc'; fi` -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/omega_core/$(DEPDIR)/libomega_a-oc.Tpo ../src/omega_core/$(DEPDIR)/libomega_a-oc.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/omega_core/oc.cc' object='../src/omega_core/libomega_a-oc.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/omega_core/libomega_a-oc.obj `if test -f '../src/omega_core/oc.cc'; then $(CYGPATH_W) '../src/omega_core/oc.cc'; else $(CYGPATH_W) '$(srcdir)/../src/omega_core/oc.cc'; fi` - -../src/omega_core/libomega_a-oc_eq.o: ../src/omega_core/oc_eq.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/omega_core/libomega_a-oc_eq.o -MD -MP -MF ../src/omega_core/$(DEPDIR)/libomega_a-oc_eq.Tpo -c -o ../src/omega_core/libomega_a-oc_eq.o `test -f '../src/omega_core/oc_eq.cc' || echo '$(srcdir)/'`../src/omega_core/oc_eq.cc -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/omega_core/$(DEPDIR)/libomega_a-oc_eq.Tpo ../src/omega_core/$(DEPDIR)/libomega_a-oc_eq.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/omega_core/oc_eq.cc' object='../src/omega_core/libomega_a-oc_eq.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/omega_core/libomega_a-oc_eq.o `test -f '../src/omega_core/oc_eq.cc' || echo '$(srcdir)/'`../src/omega_core/oc_eq.cc - -../src/omega_core/libomega_a-oc_eq.obj: ../src/omega_core/oc_eq.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/omega_core/libomega_a-oc_eq.obj -MD -MP -MF ../src/omega_core/$(DEPDIR)/libomega_a-oc_eq.Tpo -c -o ../src/omega_core/libomega_a-oc_eq.obj `if test -f '../src/omega_core/oc_eq.cc'; then $(CYGPATH_W) '../src/omega_core/oc_eq.cc'; else $(CYGPATH_W) '$(srcdir)/../src/omega_core/oc_eq.cc'; fi` -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/omega_core/$(DEPDIR)/libomega_a-oc_eq.Tpo ../src/omega_core/$(DEPDIR)/libomega_a-oc_eq.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/omega_core/oc_eq.cc' object='../src/omega_core/libomega_a-oc_eq.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/omega_core/libomega_a-oc_eq.obj `if test -f '../src/omega_core/oc_eq.cc'; then $(CYGPATH_W) '../src/omega_core/oc_eq.cc'; else $(CYGPATH_W) '$(srcdir)/../src/omega_core/oc_eq.cc'; fi` - -../src/omega_core/libomega_a-oc_exp_kill.o: ../src/omega_core/oc_exp_kill.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/omega_core/libomega_a-oc_exp_kill.o -MD -MP -MF ../src/omega_core/$(DEPDIR)/libomega_a-oc_exp_kill.Tpo -c -o ../src/omega_core/libomega_a-oc_exp_kill.o `test -f '../src/omega_core/oc_exp_kill.cc' || echo '$(srcdir)/'`../src/omega_core/oc_exp_kill.cc -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/omega_core/$(DEPDIR)/libomega_a-oc_exp_kill.Tpo ../src/omega_core/$(DEPDIR)/libomega_a-oc_exp_kill.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/omega_core/oc_exp_kill.cc' object='../src/omega_core/libomega_a-oc_exp_kill.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/omega_core/libomega_a-oc_exp_kill.o `test -f '../src/omega_core/oc_exp_kill.cc' || echo '$(srcdir)/'`../src/omega_core/oc_exp_kill.cc - -../src/omega_core/libomega_a-oc_exp_kill.obj: ../src/omega_core/oc_exp_kill.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/omega_core/libomega_a-oc_exp_kill.obj -MD -MP -MF ../src/omega_core/$(DEPDIR)/libomega_a-oc_exp_kill.Tpo -c -o ../src/omega_core/libomega_a-oc_exp_kill.obj `if test -f '../src/omega_core/oc_exp_kill.cc'; then $(CYGPATH_W) '../src/omega_core/oc_exp_kill.cc'; else $(CYGPATH_W) '$(srcdir)/../src/omega_core/oc_exp_kill.cc'; fi` -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/omega_core/$(DEPDIR)/libomega_a-oc_exp_kill.Tpo ../src/omega_core/$(DEPDIR)/libomega_a-oc_exp_kill.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/omega_core/oc_exp_kill.cc' object='../src/omega_core/libomega_a-oc_exp_kill.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/omega_core/libomega_a-oc_exp_kill.obj `if test -f '../src/omega_core/oc_exp_kill.cc'; then $(CYGPATH_W) '../src/omega_core/oc_exp_kill.cc'; else $(CYGPATH_W) '$(srcdir)/../src/omega_core/oc_exp_kill.cc'; fi` - -../src/omega_core/libomega_a-oc_global.o: ../src/omega_core/oc_global.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/omega_core/libomega_a-oc_global.o -MD -MP -MF ../src/omega_core/$(DEPDIR)/libomega_a-oc_global.Tpo -c -o ../src/omega_core/libomega_a-oc_global.o `test -f '../src/omega_core/oc_global.cc' || echo '$(srcdir)/'`../src/omega_core/oc_global.cc -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/omega_core/$(DEPDIR)/libomega_a-oc_global.Tpo ../src/omega_core/$(DEPDIR)/libomega_a-oc_global.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/omega_core/oc_global.cc' object='../src/omega_core/libomega_a-oc_global.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/omega_core/libomega_a-oc_global.o `test -f '../src/omega_core/oc_global.cc' || echo '$(srcdir)/'`../src/omega_core/oc_global.cc - -../src/omega_core/libomega_a-oc_global.obj: ../src/omega_core/oc_global.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/omega_core/libomega_a-oc_global.obj -MD -MP -MF ../src/omega_core/$(DEPDIR)/libomega_a-oc_global.Tpo -c -o ../src/omega_core/libomega_a-oc_global.obj `if test -f '../src/omega_core/oc_global.cc'; then $(CYGPATH_W) '../src/omega_core/oc_global.cc'; else $(CYGPATH_W) '$(srcdir)/../src/omega_core/oc_global.cc'; fi` -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/omega_core/$(DEPDIR)/libomega_a-oc_global.Tpo ../src/omega_core/$(DEPDIR)/libomega_a-oc_global.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/omega_core/oc_global.cc' object='../src/omega_core/libomega_a-oc_global.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/omega_core/libomega_a-oc_global.obj `if test -f '../src/omega_core/oc_global.cc'; then $(CYGPATH_W) '../src/omega_core/oc_global.cc'; else $(CYGPATH_W) '$(srcdir)/../src/omega_core/oc_global.cc'; fi` - -../src/omega_core/libomega_a-oc_print.o: ../src/omega_core/oc_print.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/omega_core/libomega_a-oc_print.o -MD -MP -MF ../src/omega_core/$(DEPDIR)/libomega_a-oc_print.Tpo -c -o ../src/omega_core/libomega_a-oc_print.o `test -f '../src/omega_core/oc_print.cc' || echo '$(srcdir)/'`../src/omega_core/oc_print.cc -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/omega_core/$(DEPDIR)/libomega_a-oc_print.Tpo ../src/omega_core/$(DEPDIR)/libomega_a-oc_print.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/omega_core/oc_print.cc' object='../src/omega_core/libomega_a-oc_print.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/omega_core/libomega_a-oc_print.o `test -f '../src/omega_core/oc_print.cc' || echo '$(srcdir)/'`../src/omega_core/oc_print.cc - -../src/omega_core/libomega_a-oc_print.obj: ../src/omega_core/oc_print.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/omega_core/libomega_a-oc_print.obj -MD -MP -MF ../src/omega_core/$(DEPDIR)/libomega_a-oc_print.Tpo -c -o ../src/omega_core/libomega_a-oc_print.obj `if test -f '../src/omega_core/oc_print.cc'; then $(CYGPATH_W) '../src/omega_core/oc_print.cc'; else $(CYGPATH_W) '$(srcdir)/../src/omega_core/oc_print.cc'; fi` -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/omega_core/$(DEPDIR)/libomega_a-oc_print.Tpo ../src/omega_core/$(DEPDIR)/libomega_a-oc_print.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/omega_core/oc_print.cc' object='../src/omega_core/libomega_a-oc_print.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/omega_core/libomega_a-oc_print.obj `if test -f '../src/omega_core/oc_print.cc'; then $(CYGPATH_W) '../src/omega_core/oc_print.cc'; else $(CYGPATH_W) '$(srcdir)/../src/omega_core/oc_print.cc'; fi` - -../src/omega_core/libomega_a-oc_problems.o: ../src/omega_core/oc_problems.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/omega_core/libomega_a-oc_problems.o -MD -MP -MF ../src/omega_core/$(DEPDIR)/libomega_a-oc_problems.Tpo -c -o ../src/omega_core/libomega_a-oc_problems.o `test -f '../src/omega_core/oc_problems.cc' || echo '$(srcdir)/'`../src/omega_core/oc_problems.cc -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/omega_core/$(DEPDIR)/libomega_a-oc_problems.Tpo ../src/omega_core/$(DEPDIR)/libomega_a-oc_problems.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/omega_core/oc_problems.cc' object='../src/omega_core/libomega_a-oc_problems.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/omega_core/libomega_a-oc_problems.o `test -f '../src/omega_core/oc_problems.cc' || echo '$(srcdir)/'`../src/omega_core/oc_problems.cc - -../src/omega_core/libomega_a-oc_problems.obj: ../src/omega_core/oc_problems.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/omega_core/libomega_a-oc_problems.obj -MD -MP -MF ../src/omega_core/$(DEPDIR)/libomega_a-oc_problems.Tpo -c -o ../src/omega_core/libomega_a-oc_problems.obj `if test -f '../src/omega_core/oc_problems.cc'; then $(CYGPATH_W) '../src/omega_core/oc_problems.cc'; else $(CYGPATH_W) '$(srcdir)/../src/omega_core/oc_problems.cc'; fi` -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/omega_core/$(DEPDIR)/libomega_a-oc_problems.Tpo ../src/omega_core/$(DEPDIR)/libomega_a-oc_problems.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/omega_core/oc_problems.cc' object='../src/omega_core/libomega_a-oc_problems.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/omega_core/libomega_a-oc_problems.obj `if test -f '../src/omega_core/oc_problems.cc'; then $(CYGPATH_W) '../src/omega_core/oc_problems.cc'; else $(CYGPATH_W) '$(srcdir)/../src/omega_core/oc_problems.cc'; fi` - -../src/omega_core/libomega_a-oc_simple.o: ../src/omega_core/oc_simple.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/omega_core/libomega_a-oc_simple.o -MD -MP -MF ../src/omega_core/$(DEPDIR)/libomega_a-oc_simple.Tpo -c -o ../src/omega_core/libomega_a-oc_simple.o `test -f '../src/omega_core/oc_simple.cc' || echo '$(srcdir)/'`../src/omega_core/oc_simple.cc -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/omega_core/$(DEPDIR)/libomega_a-oc_simple.Tpo ../src/omega_core/$(DEPDIR)/libomega_a-oc_simple.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/omega_core/oc_simple.cc' object='../src/omega_core/libomega_a-oc_simple.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/omega_core/libomega_a-oc_simple.o `test -f '../src/omega_core/oc_simple.cc' || echo '$(srcdir)/'`../src/omega_core/oc_simple.cc - -../src/omega_core/libomega_a-oc_simple.obj: ../src/omega_core/oc_simple.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/omega_core/libomega_a-oc_simple.obj -MD -MP -MF ../src/omega_core/$(DEPDIR)/libomega_a-oc_simple.Tpo -c -o ../src/omega_core/libomega_a-oc_simple.obj `if test -f '../src/omega_core/oc_simple.cc'; then $(CYGPATH_W) '../src/omega_core/oc_simple.cc'; else $(CYGPATH_W) '$(srcdir)/../src/omega_core/oc_simple.cc'; fi` -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/omega_core/$(DEPDIR)/libomega_a-oc_simple.Tpo ../src/omega_core/$(DEPDIR)/libomega_a-oc_simple.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/omega_core/oc_simple.cc' object='../src/omega_core/libomega_a-oc_simple.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/omega_core/libomega_a-oc_simple.obj `if test -f '../src/omega_core/oc_simple.cc'; then $(CYGPATH_W) '../src/omega_core/oc_simple.cc'; else $(CYGPATH_W) '$(srcdir)/../src/omega_core/oc_simple.cc'; fi` - -../src/omega_core/libomega_a-oc_solve.o: ../src/omega_core/oc_solve.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/omega_core/libomega_a-oc_solve.o -MD -MP -MF ../src/omega_core/$(DEPDIR)/libomega_a-oc_solve.Tpo -c -o ../src/omega_core/libomega_a-oc_solve.o `test -f '../src/omega_core/oc_solve.cc' || echo '$(srcdir)/'`../src/omega_core/oc_solve.cc -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/omega_core/$(DEPDIR)/libomega_a-oc_solve.Tpo ../src/omega_core/$(DEPDIR)/libomega_a-oc_solve.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/omega_core/oc_solve.cc' object='../src/omega_core/libomega_a-oc_solve.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/omega_core/libomega_a-oc_solve.o `test -f '../src/omega_core/oc_solve.cc' || echo '$(srcdir)/'`../src/omega_core/oc_solve.cc - -../src/omega_core/libomega_a-oc_solve.obj: ../src/omega_core/oc_solve.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/omega_core/libomega_a-oc_solve.obj -MD -MP -MF ../src/omega_core/$(DEPDIR)/libomega_a-oc_solve.Tpo -c -o ../src/omega_core/libomega_a-oc_solve.obj `if test -f '../src/omega_core/oc_solve.cc'; then $(CYGPATH_W) '../src/omega_core/oc_solve.cc'; else $(CYGPATH_W) '$(srcdir)/../src/omega_core/oc_solve.cc'; fi` -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/omega_core/$(DEPDIR)/libomega_a-oc_solve.Tpo ../src/omega_core/$(DEPDIR)/libomega_a-oc_solve.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/omega_core/oc_solve.cc' object='../src/omega_core/libomega_a-oc_solve.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/omega_core/libomega_a-oc_solve.obj `if test -f '../src/omega_core/oc_solve.cc'; then $(CYGPATH_W) '../src/omega_core/oc_solve.cc'; else $(CYGPATH_W) '$(srcdir)/../src/omega_core/oc_solve.cc'; fi` - -../src/omega_core/libomega_a-oc_query.o: ../src/omega_core/oc_query.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/omega_core/libomega_a-oc_query.o -MD -MP -MF ../src/omega_core/$(DEPDIR)/libomega_a-oc_query.Tpo -c -o ../src/omega_core/libomega_a-oc_query.o `test -f '../src/omega_core/oc_query.cc' || echo '$(srcdir)/'`../src/omega_core/oc_query.cc -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/omega_core/$(DEPDIR)/libomega_a-oc_query.Tpo ../src/omega_core/$(DEPDIR)/libomega_a-oc_query.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/omega_core/oc_query.cc' object='../src/omega_core/libomega_a-oc_query.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/omega_core/libomega_a-oc_query.o `test -f '../src/omega_core/oc_query.cc' || echo '$(srcdir)/'`../src/omega_core/oc_query.cc - -../src/omega_core/libomega_a-oc_query.obj: ../src/omega_core/oc_query.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/omega_core/libomega_a-oc_query.obj -MD -MP -MF ../src/omega_core/$(DEPDIR)/libomega_a-oc_query.Tpo -c -o ../src/omega_core/libomega_a-oc_query.obj `if test -f '../src/omega_core/oc_query.cc'; then $(CYGPATH_W) '../src/omega_core/oc_query.cc'; else $(CYGPATH_W) '$(srcdir)/../src/omega_core/oc_query.cc'; fi` -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/omega_core/$(DEPDIR)/libomega_a-oc_query.Tpo ../src/omega_core/$(DEPDIR)/libomega_a-oc_query.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/omega_core/oc_query.cc' object='../src/omega_core/libomega_a-oc_query.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/omega_core/libomega_a-oc_query.obj `if test -f '../src/omega_core/oc_query.cc'; then $(CYGPATH_W) '../src/omega_core/oc_query.cc'; else $(CYGPATH_W) '$(srcdir)/../src/omega_core/oc_query.cc'; fi` - -../src/omega_core/libomega_a-oc_quick_kill.o: ../src/omega_core/oc_quick_kill.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/omega_core/libomega_a-oc_quick_kill.o -MD -MP -MF ../src/omega_core/$(DEPDIR)/libomega_a-oc_quick_kill.Tpo -c -o ../src/omega_core/libomega_a-oc_quick_kill.o `test -f '../src/omega_core/oc_quick_kill.cc' || echo '$(srcdir)/'`../src/omega_core/oc_quick_kill.cc -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/omega_core/$(DEPDIR)/libomega_a-oc_quick_kill.Tpo ../src/omega_core/$(DEPDIR)/libomega_a-oc_quick_kill.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/omega_core/oc_quick_kill.cc' object='../src/omega_core/libomega_a-oc_quick_kill.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/omega_core/libomega_a-oc_quick_kill.o `test -f '../src/omega_core/oc_quick_kill.cc' || echo '$(srcdir)/'`../src/omega_core/oc_quick_kill.cc - -../src/omega_core/libomega_a-oc_quick_kill.obj: ../src/omega_core/oc_quick_kill.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/omega_core/libomega_a-oc_quick_kill.obj -MD -MP -MF ../src/omega_core/$(DEPDIR)/libomega_a-oc_quick_kill.Tpo -c -o ../src/omega_core/libomega_a-oc_quick_kill.obj `if test -f '../src/omega_core/oc_quick_kill.cc'; then $(CYGPATH_W) '../src/omega_core/oc_quick_kill.cc'; else $(CYGPATH_W) '$(srcdir)/../src/omega_core/oc_quick_kill.cc'; fi` -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/omega_core/$(DEPDIR)/libomega_a-oc_quick_kill.Tpo ../src/omega_core/$(DEPDIR)/libomega_a-oc_quick_kill.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/omega_core/oc_quick_kill.cc' object='../src/omega_core/libomega_a-oc_quick_kill.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/omega_core/libomega_a-oc_quick_kill.obj `if test -f '../src/omega_core/oc_quick_kill.cc'; then $(CYGPATH_W) '../src/omega_core/oc_quick_kill.cc'; else $(CYGPATH_W) '$(srcdir)/../src/omega_core/oc_quick_kill.cc'; fi` - -../src/omega_core/libomega_a-oc_util.o: ../src/omega_core/oc_util.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/omega_core/libomega_a-oc_util.o -MD -MP -MF ../src/omega_core/$(DEPDIR)/libomega_a-oc_util.Tpo -c -o ../src/omega_core/libomega_a-oc_util.o `test -f '../src/omega_core/oc_util.cc' || echo '$(srcdir)/'`../src/omega_core/oc_util.cc -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/omega_core/$(DEPDIR)/libomega_a-oc_util.Tpo ../src/omega_core/$(DEPDIR)/libomega_a-oc_util.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/omega_core/oc_util.cc' object='../src/omega_core/libomega_a-oc_util.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/omega_core/libomega_a-oc_util.o `test -f '../src/omega_core/oc_util.cc' || echo '$(srcdir)/'`../src/omega_core/oc_util.cc - -../src/omega_core/libomega_a-oc_util.obj: ../src/omega_core/oc_util.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/omega_core/libomega_a-oc_util.obj -MD -MP -MF ../src/omega_core/$(DEPDIR)/libomega_a-oc_util.Tpo -c -o ../src/omega_core/libomega_a-oc_util.obj `if test -f '../src/omega_core/oc_util.cc'; then $(CYGPATH_W) '../src/omega_core/oc_util.cc'; else $(CYGPATH_W) '$(srcdir)/../src/omega_core/oc_util.cc'; fi` -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/omega_core/$(DEPDIR)/libomega_a-oc_util.Tpo ../src/omega_core/$(DEPDIR)/libomega_a-oc_util.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/omega_core/oc_util.cc' object='../src/omega_core/libomega_a-oc_util.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/omega_core/libomega_a-oc_util.obj `if test -f '../src/omega_core/oc_util.cc'; then $(CYGPATH_W) '../src/omega_core/oc_util.cc'; else $(CYGPATH_W) '$(srcdir)/../src/omega_core/oc_util.cc'; fi` - -../src/libomega_a-pres_beaut.o: ../src/pres_beaut.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-pres_beaut.o -MD -MP -MF ../src/$(DEPDIR)/libomega_a-pres_beaut.Tpo -c -o ../src/libomega_a-pres_beaut.o `test -f '../src/pres_beaut.cc' || echo '$(srcdir)/'`../src/pres_beaut.cc -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-pres_beaut.Tpo ../src/$(DEPDIR)/libomega_a-pres_beaut.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/pres_beaut.cc' object='../src/libomega_a-pres_beaut.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-pres_beaut.o `test -f '../src/pres_beaut.cc' || echo '$(srcdir)/'`../src/pres_beaut.cc - -../src/libomega_a-pres_beaut.obj: ../src/pres_beaut.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-pres_beaut.obj -MD -MP -MF ../src/$(DEPDIR)/libomega_a-pres_beaut.Tpo -c -o ../src/libomega_a-pres_beaut.obj `if test -f '../src/pres_beaut.cc'; then $(CYGPATH_W) '../src/pres_beaut.cc'; else $(CYGPATH_W) '$(srcdir)/../src/pres_beaut.cc'; fi` -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-pres_beaut.Tpo ../src/$(DEPDIR)/libomega_a-pres_beaut.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/pres_beaut.cc' object='../src/libomega_a-pres_beaut.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-pres_beaut.obj `if test -f '../src/pres_beaut.cc'; then $(CYGPATH_W) '../src/pres_beaut.cc'; else $(CYGPATH_W) '$(srcdir)/../src/pres_beaut.cc'; fi` - -../src/libomega_a-pres_cnstr.o: ../src/pres_cnstr.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-pres_cnstr.o -MD -MP -MF ../src/$(DEPDIR)/libomega_a-pres_cnstr.Tpo -c -o ../src/libomega_a-pres_cnstr.o `test -f '../src/pres_cnstr.cc' || echo '$(srcdir)/'`../src/pres_cnstr.cc -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-pres_cnstr.Tpo ../src/$(DEPDIR)/libomega_a-pres_cnstr.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/pres_cnstr.cc' object='../src/libomega_a-pres_cnstr.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-pres_cnstr.o `test -f '../src/pres_cnstr.cc' || echo '$(srcdir)/'`../src/pres_cnstr.cc - -../src/libomega_a-pres_cnstr.obj: ../src/pres_cnstr.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-pres_cnstr.obj -MD -MP -MF ../src/$(DEPDIR)/libomega_a-pres_cnstr.Tpo -c -o ../src/libomega_a-pres_cnstr.obj `if test -f '../src/pres_cnstr.cc'; then $(CYGPATH_W) '../src/pres_cnstr.cc'; else $(CYGPATH_W) '$(srcdir)/../src/pres_cnstr.cc'; fi` -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-pres_cnstr.Tpo ../src/$(DEPDIR)/libomega_a-pres_cnstr.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/pres_cnstr.cc' object='../src/libomega_a-pres_cnstr.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-pres_cnstr.obj `if test -f '../src/pres_cnstr.cc'; then $(CYGPATH_W) '../src/pres_cnstr.cc'; else $(CYGPATH_W) '$(srcdir)/../src/pres_cnstr.cc'; fi` - -../src/libomega_a-pres_col.o: ../src/pres_col.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-pres_col.o -MD -MP -MF ../src/$(DEPDIR)/libomega_a-pres_col.Tpo -c -o ../src/libomega_a-pres_col.o `test -f '../src/pres_col.cc' || echo '$(srcdir)/'`../src/pres_col.cc -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-pres_col.Tpo ../src/$(DEPDIR)/libomega_a-pres_col.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/pres_col.cc' object='../src/libomega_a-pres_col.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-pres_col.o `test -f '../src/pres_col.cc' || echo '$(srcdir)/'`../src/pres_col.cc - -../src/libomega_a-pres_col.obj: ../src/pres_col.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-pres_col.obj -MD -MP -MF ../src/$(DEPDIR)/libomega_a-pres_col.Tpo -c -o ../src/libomega_a-pres_col.obj `if test -f '../src/pres_col.cc'; then $(CYGPATH_W) '../src/pres_col.cc'; else $(CYGPATH_W) '$(srcdir)/../src/pres_col.cc'; fi` -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-pres_col.Tpo ../src/$(DEPDIR)/libomega_a-pres_col.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/pres_col.cc' object='../src/libomega_a-pres_col.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-pres_col.obj `if test -f '../src/pres_col.cc'; then $(CYGPATH_W) '../src/pres_col.cc'; else $(CYGPATH_W) '$(srcdir)/../src/pres_col.cc'; fi` - -../src/libomega_a-pres_conj.o: ../src/pres_conj.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-pres_conj.o -MD -MP -MF ../src/$(DEPDIR)/libomega_a-pres_conj.Tpo -c -o ../src/libomega_a-pres_conj.o `test -f '../src/pres_conj.cc' || echo '$(srcdir)/'`../src/pres_conj.cc -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-pres_conj.Tpo ../src/$(DEPDIR)/libomega_a-pres_conj.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/pres_conj.cc' object='../src/libomega_a-pres_conj.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-pres_conj.o `test -f '../src/pres_conj.cc' || echo '$(srcdir)/'`../src/pres_conj.cc - -../src/libomega_a-pres_conj.obj: ../src/pres_conj.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-pres_conj.obj -MD -MP -MF ../src/$(DEPDIR)/libomega_a-pres_conj.Tpo -c -o ../src/libomega_a-pres_conj.obj `if test -f '../src/pres_conj.cc'; then $(CYGPATH_W) '../src/pres_conj.cc'; else $(CYGPATH_W) '$(srcdir)/../src/pres_conj.cc'; fi` -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-pres_conj.Tpo ../src/$(DEPDIR)/libomega_a-pres_conj.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/pres_conj.cc' object='../src/libomega_a-pres_conj.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-pres_conj.obj `if test -f '../src/pres_conj.cc'; then $(CYGPATH_W) '../src/pres_conj.cc'; else $(CYGPATH_W) '$(srcdir)/../src/pres_conj.cc'; fi` - -../src/libomega_a-pres_decl.o: ../src/pres_decl.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-pres_decl.o -MD -MP -MF ../src/$(DEPDIR)/libomega_a-pres_decl.Tpo -c -o ../src/libomega_a-pres_decl.o `test -f '../src/pres_decl.cc' || echo '$(srcdir)/'`../src/pres_decl.cc -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-pres_decl.Tpo ../src/$(DEPDIR)/libomega_a-pres_decl.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/pres_decl.cc' object='../src/libomega_a-pres_decl.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-pres_decl.o `test -f '../src/pres_decl.cc' || echo '$(srcdir)/'`../src/pres_decl.cc - -../src/libomega_a-pres_decl.obj: ../src/pres_decl.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-pres_decl.obj -MD -MP -MF ../src/$(DEPDIR)/libomega_a-pres_decl.Tpo -c -o ../src/libomega_a-pres_decl.obj `if test -f '../src/pres_decl.cc'; then $(CYGPATH_W) '../src/pres_decl.cc'; else $(CYGPATH_W) '$(srcdir)/../src/pres_decl.cc'; fi` -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-pres_decl.Tpo ../src/$(DEPDIR)/libomega_a-pres_decl.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/pres_decl.cc' object='../src/libomega_a-pres_decl.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-pres_decl.obj `if test -f '../src/pres_decl.cc'; then $(CYGPATH_W) '../src/pres_decl.cc'; else $(CYGPATH_W) '$(srcdir)/../src/pres_decl.cc'; fi` - -../src/libomega_a-pres_dnf.o: ../src/pres_dnf.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-pres_dnf.o -MD -MP -MF ../src/$(DEPDIR)/libomega_a-pres_dnf.Tpo -c -o ../src/libomega_a-pres_dnf.o `test -f '../src/pres_dnf.cc' || echo '$(srcdir)/'`../src/pres_dnf.cc -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-pres_dnf.Tpo ../src/$(DEPDIR)/libomega_a-pres_dnf.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/pres_dnf.cc' object='../src/libomega_a-pres_dnf.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-pres_dnf.o `test -f '../src/pres_dnf.cc' || echo '$(srcdir)/'`../src/pres_dnf.cc - -../src/libomega_a-pres_dnf.obj: ../src/pres_dnf.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-pres_dnf.obj -MD -MP -MF ../src/$(DEPDIR)/libomega_a-pres_dnf.Tpo -c -o ../src/libomega_a-pres_dnf.obj `if test -f '../src/pres_dnf.cc'; then $(CYGPATH_W) '../src/pres_dnf.cc'; else $(CYGPATH_W) '$(srcdir)/../src/pres_dnf.cc'; fi` -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-pres_dnf.Tpo ../src/$(DEPDIR)/libomega_a-pres_dnf.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/pres_dnf.cc' object='../src/libomega_a-pres_dnf.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-pres_dnf.obj `if test -f '../src/pres_dnf.cc'; then $(CYGPATH_W) '../src/pres_dnf.cc'; else $(CYGPATH_W) '$(srcdir)/../src/pres_dnf.cc'; fi` - -../src/libomega_a-pres_form.o: ../src/pres_form.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-pres_form.o -MD -MP -MF ../src/$(DEPDIR)/libomega_a-pres_form.Tpo -c -o ../src/libomega_a-pres_form.o `test -f '../src/pres_form.cc' || echo '$(srcdir)/'`../src/pres_form.cc -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-pres_form.Tpo ../src/$(DEPDIR)/libomega_a-pres_form.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/pres_form.cc' object='../src/libomega_a-pres_form.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-pres_form.o `test -f '../src/pres_form.cc' || echo '$(srcdir)/'`../src/pres_form.cc - -../src/libomega_a-pres_form.obj: ../src/pres_form.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-pres_form.obj -MD -MP -MF ../src/$(DEPDIR)/libomega_a-pres_form.Tpo -c -o ../src/libomega_a-pres_form.obj `if test -f '../src/pres_form.cc'; then $(CYGPATH_W) '../src/pres_form.cc'; else $(CYGPATH_W) '$(srcdir)/../src/pres_form.cc'; fi` -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-pres_form.Tpo ../src/$(DEPDIR)/libomega_a-pres_form.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/pres_form.cc' object='../src/libomega_a-pres_form.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-pres_form.obj `if test -f '../src/pres_form.cc'; then $(CYGPATH_W) '../src/pres_form.cc'; else $(CYGPATH_W) '$(srcdir)/../src/pres_form.cc'; fi` - -../src/libomega_a-pres_gen.o: ../src/pres_gen.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-pres_gen.o -MD -MP -MF ../src/$(DEPDIR)/libomega_a-pres_gen.Tpo -c -o ../src/libomega_a-pres_gen.o `test -f '../src/pres_gen.cc' || echo '$(srcdir)/'`../src/pres_gen.cc -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-pres_gen.Tpo ../src/$(DEPDIR)/libomega_a-pres_gen.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/pres_gen.cc' object='../src/libomega_a-pres_gen.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-pres_gen.o `test -f '../src/pres_gen.cc' || echo '$(srcdir)/'`../src/pres_gen.cc - -../src/libomega_a-pres_gen.obj: ../src/pres_gen.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-pres_gen.obj -MD -MP -MF ../src/$(DEPDIR)/libomega_a-pres_gen.Tpo -c -o ../src/libomega_a-pres_gen.obj `if test -f '../src/pres_gen.cc'; then $(CYGPATH_W) '../src/pres_gen.cc'; else $(CYGPATH_W) '$(srcdir)/../src/pres_gen.cc'; fi` -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-pres_gen.Tpo ../src/$(DEPDIR)/libomega_a-pres_gen.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/pres_gen.cc' object='../src/libomega_a-pres_gen.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-pres_gen.obj `if test -f '../src/pres_gen.cc'; then $(CYGPATH_W) '../src/pres_gen.cc'; else $(CYGPATH_W) '$(srcdir)/../src/pres_gen.cc'; fi` - -../src/libomega_a-pres_logic.o: ../src/pres_logic.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-pres_logic.o -MD -MP -MF ../src/$(DEPDIR)/libomega_a-pres_logic.Tpo -c -o ../src/libomega_a-pres_logic.o `test -f '../src/pres_logic.cc' || echo '$(srcdir)/'`../src/pres_logic.cc -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-pres_logic.Tpo ../src/$(DEPDIR)/libomega_a-pres_logic.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/pres_logic.cc' object='../src/libomega_a-pres_logic.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-pres_logic.o `test -f '../src/pres_logic.cc' || echo '$(srcdir)/'`../src/pres_logic.cc - -../src/libomega_a-pres_logic.obj: ../src/pres_logic.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-pres_logic.obj -MD -MP -MF ../src/$(DEPDIR)/libomega_a-pres_logic.Tpo -c -o ../src/libomega_a-pres_logic.obj `if test -f '../src/pres_logic.cc'; then $(CYGPATH_W) '../src/pres_logic.cc'; else $(CYGPATH_W) '$(srcdir)/../src/pres_logic.cc'; fi` -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-pres_logic.Tpo ../src/$(DEPDIR)/libomega_a-pres_logic.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/pres_logic.cc' object='../src/libomega_a-pres_logic.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-pres_logic.obj `if test -f '../src/pres_logic.cc'; then $(CYGPATH_W) '../src/pres_logic.cc'; else $(CYGPATH_W) '$(srcdir)/../src/pres_logic.cc'; fi` - -../src/libomega_a-pres_print.o: ../src/pres_print.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-pres_print.o -MD -MP -MF ../src/$(DEPDIR)/libomega_a-pres_print.Tpo -c -o ../src/libomega_a-pres_print.o `test -f '../src/pres_print.cc' || echo '$(srcdir)/'`../src/pres_print.cc -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-pres_print.Tpo ../src/$(DEPDIR)/libomega_a-pres_print.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/pres_print.cc' object='../src/libomega_a-pres_print.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-pres_print.o `test -f '../src/pres_print.cc' || echo '$(srcdir)/'`../src/pres_print.cc - -../src/libomega_a-pres_print.obj: ../src/pres_print.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-pres_print.obj -MD -MP -MF ../src/$(DEPDIR)/libomega_a-pres_print.Tpo -c -o ../src/libomega_a-pres_print.obj `if test -f '../src/pres_print.cc'; then $(CYGPATH_W) '../src/pres_print.cc'; else $(CYGPATH_W) '$(srcdir)/../src/pres_print.cc'; fi` -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-pres_print.Tpo ../src/$(DEPDIR)/libomega_a-pres_print.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/pres_print.cc' object='../src/libomega_a-pres_print.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-pres_print.obj `if test -f '../src/pres_print.cc'; then $(CYGPATH_W) '../src/pres_print.cc'; else $(CYGPATH_W) '$(srcdir)/../src/pres_print.cc'; fi` - -../src/libomega_a-pres_rear.o: ../src/pres_rear.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-pres_rear.o -MD -MP -MF ../src/$(DEPDIR)/libomega_a-pres_rear.Tpo -c -o ../src/libomega_a-pres_rear.o `test -f '../src/pres_rear.cc' || echo '$(srcdir)/'`../src/pres_rear.cc -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-pres_rear.Tpo ../src/$(DEPDIR)/libomega_a-pres_rear.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/pres_rear.cc' object='../src/libomega_a-pres_rear.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-pres_rear.o `test -f '../src/pres_rear.cc' || echo '$(srcdir)/'`../src/pres_rear.cc - -../src/libomega_a-pres_rear.obj: ../src/pres_rear.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-pres_rear.obj -MD -MP -MF ../src/$(DEPDIR)/libomega_a-pres_rear.Tpo -c -o ../src/libomega_a-pres_rear.obj `if test -f '../src/pres_rear.cc'; then $(CYGPATH_W) '../src/pres_rear.cc'; else $(CYGPATH_W) '$(srcdir)/../src/pres_rear.cc'; fi` -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-pres_rear.Tpo ../src/$(DEPDIR)/libomega_a-pres_rear.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/pres_rear.cc' object='../src/libomega_a-pres_rear.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-pres_rear.obj `if test -f '../src/pres_rear.cc'; then $(CYGPATH_W) '../src/pres_rear.cc'; else $(CYGPATH_W) '$(srcdir)/../src/pres_rear.cc'; fi` - -../src/libomega_a-pres_quant.o: ../src/pres_quant.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-pres_quant.o -MD -MP -MF ../src/$(DEPDIR)/libomega_a-pres_quant.Tpo -c -o ../src/libomega_a-pres_quant.o `test -f '../src/pres_quant.cc' || echo '$(srcdir)/'`../src/pres_quant.cc -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-pres_quant.Tpo ../src/$(DEPDIR)/libomega_a-pres_quant.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/pres_quant.cc' object='../src/libomega_a-pres_quant.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-pres_quant.o `test -f '../src/pres_quant.cc' || echo '$(srcdir)/'`../src/pres_quant.cc - -../src/libomega_a-pres_quant.obj: ../src/pres_quant.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-pres_quant.obj -MD -MP -MF ../src/$(DEPDIR)/libomega_a-pres_quant.Tpo -c -o ../src/libomega_a-pres_quant.obj `if test -f '../src/pres_quant.cc'; then $(CYGPATH_W) '../src/pres_quant.cc'; else $(CYGPATH_W) '$(srcdir)/../src/pres_quant.cc'; fi` -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-pres_quant.Tpo ../src/$(DEPDIR)/libomega_a-pres_quant.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/pres_quant.cc' object='../src/libomega_a-pres_quant.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-pres_quant.obj `if test -f '../src/pres_quant.cc'; then $(CYGPATH_W) '../src/pres_quant.cc'; else $(CYGPATH_W) '$(srcdir)/../src/pres_quant.cc'; fi` - -../src/libomega_a-pres_subs.o: ../src/pres_subs.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-pres_subs.o -MD -MP -MF ../src/$(DEPDIR)/libomega_a-pres_subs.Tpo -c -o ../src/libomega_a-pres_subs.o `test -f '../src/pres_subs.cc' || echo '$(srcdir)/'`../src/pres_subs.cc -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-pres_subs.Tpo ../src/$(DEPDIR)/libomega_a-pres_subs.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/pres_subs.cc' object='../src/libomega_a-pres_subs.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-pres_subs.o `test -f '../src/pres_subs.cc' || echo '$(srcdir)/'`../src/pres_subs.cc - -../src/libomega_a-pres_subs.obj: ../src/pres_subs.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-pres_subs.obj -MD -MP -MF ../src/$(DEPDIR)/libomega_a-pres_subs.Tpo -c -o ../src/libomega_a-pres_subs.obj `if test -f '../src/pres_subs.cc'; then $(CYGPATH_W) '../src/pres_subs.cc'; else $(CYGPATH_W) '$(srcdir)/../src/pres_subs.cc'; fi` -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-pres_subs.Tpo ../src/$(DEPDIR)/libomega_a-pres_subs.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/pres_subs.cc' object='../src/libomega_a-pres_subs.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-pres_subs.obj `if test -f '../src/pres_subs.cc'; then $(CYGPATH_W) '../src/pres_subs.cc'; else $(CYGPATH_W) '$(srcdir)/../src/pres_subs.cc'; fi` - -../src/libomega_a-pres_var.o: ../src/pres_var.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-pres_var.o -MD -MP -MF ../src/$(DEPDIR)/libomega_a-pres_var.Tpo -c -o ../src/libomega_a-pres_var.o `test -f '../src/pres_var.cc' || echo '$(srcdir)/'`../src/pres_var.cc -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-pres_var.Tpo ../src/$(DEPDIR)/libomega_a-pres_var.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/pres_var.cc' object='../src/libomega_a-pres_var.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-pres_var.o `test -f '../src/pres_var.cc' || echo '$(srcdir)/'`../src/pres_var.cc - -../src/libomega_a-pres_var.obj: ../src/pres_var.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-pres_var.obj -MD -MP -MF ../src/$(DEPDIR)/libomega_a-pres_var.Tpo -c -o ../src/libomega_a-pres_var.obj `if test -f '../src/pres_var.cc'; then $(CYGPATH_W) '../src/pres_var.cc'; else $(CYGPATH_W) '$(srcdir)/../src/pres_var.cc'; fi` -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-pres_var.Tpo ../src/$(DEPDIR)/libomega_a-pres_var.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/pres_var.cc' object='../src/libomega_a-pres_var.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-pres_var.obj `if test -f '../src/pres_var.cc'; then $(CYGPATH_W) '../src/pres_var.cc'; else $(CYGPATH_W) '$(srcdir)/../src/pres_var.cc'; fi` - -../src/libomega_a-evac.o: ../src/evac.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-evac.o -MD -MP -MF ../src/$(DEPDIR)/libomega_a-evac.Tpo -c -o ../src/libomega_a-evac.o `test -f '../src/evac.cc' || echo '$(srcdir)/'`../src/evac.cc -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-evac.Tpo ../src/$(DEPDIR)/libomega_a-evac.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/evac.cc' object='../src/libomega_a-evac.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-evac.o `test -f '../src/evac.cc' || echo '$(srcdir)/'`../src/evac.cc - -../src/libomega_a-evac.obj: ../src/evac.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-evac.obj -MD -MP -MF ../src/$(DEPDIR)/libomega_a-evac.Tpo -c -o ../src/libomega_a-evac.obj `if test -f '../src/evac.cc'; then $(CYGPATH_W) '../src/evac.cc'; else $(CYGPATH_W) '$(srcdir)/../src/evac.cc'; fi` -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-evac.Tpo ../src/$(DEPDIR)/libomega_a-evac.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/evac.cc' object='../src/libomega_a-evac.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-evac.obj `if test -f '../src/evac.cc'; then $(CYGPATH_W) '../src/evac.cc'; else $(CYGPATH_W) '$(srcdir)/../src/evac.cc'; fi` - -../src/libomega_a-farkas.o: ../src/farkas.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-farkas.o -MD -MP -MF ../src/$(DEPDIR)/libomega_a-farkas.Tpo -c -o ../src/libomega_a-farkas.o `test -f '../src/farkas.cc' || echo '$(srcdir)/'`../src/farkas.cc -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-farkas.Tpo ../src/$(DEPDIR)/libomega_a-farkas.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/farkas.cc' object='../src/libomega_a-farkas.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-farkas.o `test -f '../src/farkas.cc' || echo '$(srcdir)/'`../src/farkas.cc - -../src/libomega_a-farkas.obj: ../src/farkas.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-farkas.obj -MD -MP -MF ../src/$(DEPDIR)/libomega_a-farkas.Tpo -c -o ../src/libomega_a-farkas.obj `if test -f '../src/farkas.cc'; then $(CYGPATH_W) '../src/farkas.cc'; else $(CYGPATH_W) '$(srcdir)/../src/farkas.cc'; fi` -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-farkas.Tpo ../src/$(DEPDIR)/libomega_a-farkas.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/farkas.cc' object='../src/libomega_a-farkas.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-farkas.obj `if test -f '../src/farkas.cc'; then $(CYGPATH_W) '../src/farkas.cc'; else $(CYGPATH_W) '$(srcdir)/../src/farkas.cc'; fi` - -../src/libomega_a-hull_legacy.o: ../src/hull_legacy.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-hull_legacy.o -MD -MP -MF ../src/$(DEPDIR)/libomega_a-hull_legacy.Tpo -c -o ../src/libomega_a-hull_legacy.o `test -f '../src/hull_legacy.cc' || echo '$(srcdir)/'`../src/hull_legacy.cc -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-hull_legacy.Tpo ../src/$(DEPDIR)/libomega_a-hull_legacy.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/hull_legacy.cc' object='../src/libomega_a-hull_legacy.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-hull_legacy.o `test -f '../src/hull_legacy.cc' || echo '$(srcdir)/'`../src/hull_legacy.cc - -../src/libomega_a-hull_legacy.obj: ../src/hull_legacy.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-hull_legacy.obj -MD -MP -MF ../src/$(DEPDIR)/libomega_a-hull_legacy.Tpo -c -o ../src/libomega_a-hull_legacy.obj `if test -f '../src/hull_legacy.cc'; then $(CYGPATH_W) '../src/hull_legacy.cc'; else $(CYGPATH_W) '$(srcdir)/../src/hull_legacy.cc'; fi` -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-hull_legacy.Tpo ../src/$(DEPDIR)/libomega_a-hull_legacy.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/hull_legacy.cc' object='../src/libomega_a-hull_legacy.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-hull_legacy.obj `if test -f '../src/hull_legacy.cc'; then $(CYGPATH_W) '../src/hull_legacy.cc'; else $(CYGPATH_W) '$(srcdir)/../src/hull_legacy.cc'; fi` - -../src/libomega_a-hull_simple.o: ../src/hull_simple.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-hull_simple.o -MD -MP -MF ../src/$(DEPDIR)/libomega_a-hull_simple.Tpo -c -o ../src/libomega_a-hull_simple.o `test -f '../src/hull_simple.cc' || echo '$(srcdir)/'`../src/hull_simple.cc -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-hull_simple.Tpo ../src/$(DEPDIR)/libomega_a-hull_simple.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/hull_simple.cc' object='../src/libomega_a-hull_simple.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-hull_simple.o `test -f '../src/hull_simple.cc' || echo '$(srcdir)/'`../src/hull_simple.cc - -../src/libomega_a-hull_simple.obj: ../src/hull_simple.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-hull_simple.obj -MD -MP -MF ../src/$(DEPDIR)/libomega_a-hull_simple.Tpo -c -o ../src/libomega_a-hull_simple.obj `if test -f '../src/hull_simple.cc'; then $(CYGPATH_W) '../src/hull_simple.cc'; else $(CYGPATH_W) '$(srcdir)/../src/hull_simple.cc'; fi` -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-hull_simple.Tpo ../src/$(DEPDIR)/libomega_a-hull_simple.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/hull_simple.cc' object='../src/libomega_a-hull_simple.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-hull_simple.obj `if test -f '../src/hull_simple.cc'; then $(CYGPATH_W) '../src/hull_simple.cc'; else $(CYGPATH_W) '$(srcdir)/../src/hull_simple.cc'; fi` - -../src/libomega_a-Relation.o: ../src/Relation.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-Relation.o -MD -MP -MF ../src/$(DEPDIR)/libomega_a-Relation.Tpo -c -o ../src/libomega_a-Relation.o `test -f '../src/Relation.cc' || echo '$(srcdir)/'`../src/Relation.cc -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-Relation.Tpo ../src/$(DEPDIR)/libomega_a-Relation.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/Relation.cc' object='../src/libomega_a-Relation.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-Relation.o `test -f '../src/Relation.cc' || echo '$(srcdir)/'`../src/Relation.cc - -../src/libomega_a-Relation.obj: ../src/Relation.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-Relation.obj -MD -MP -MF ../src/$(DEPDIR)/libomega_a-Relation.Tpo -c -o ../src/libomega_a-Relation.obj `if test -f '../src/Relation.cc'; then $(CYGPATH_W) '../src/Relation.cc'; else $(CYGPATH_W) '$(srcdir)/../src/Relation.cc'; fi` -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-Relation.Tpo ../src/$(DEPDIR)/libomega_a-Relation.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/Relation.cc' object='../src/libomega_a-Relation.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-Relation.obj `if test -f '../src/Relation.cc'; then $(CYGPATH_W) '../src/Relation.cc'; else $(CYGPATH_W) '$(srcdir)/../src/Relation.cc'; fi` - -../src/libomega_a-Relations.o: ../src/Relations.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-Relations.o -MD -MP -MF ../src/$(DEPDIR)/libomega_a-Relations.Tpo -c -o ../src/libomega_a-Relations.o `test -f '../src/Relations.cc' || echo '$(srcdir)/'`../src/Relations.cc -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-Relations.Tpo ../src/$(DEPDIR)/libomega_a-Relations.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/Relations.cc' object='../src/libomega_a-Relations.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-Relations.o `test -f '../src/Relations.cc' || echo '$(srcdir)/'`../src/Relations.cc - -../src/libomega_a-Relations.obj: ../src/Relations.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-Relations.obj -MD -MP -MF ../src/$(DEPDIR)/libomega_a-Relations.Tpo -c -o ../src/libomega_a-Relations.obj `if test -f '../src/Relations.cc'; then $(CYGPATH_W) '../src/Relations.cc'; else $(CYGPATH_W) '$(srcdir)/../src/Relations.cc'; fi` -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-Relations.Tpo ../src/$(DEPDIR)/libomega_a-Relations.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/Relations.cc' object='../src/libomega_a-Relations.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-Relations.obj `if test -f '../src/Relations.cc'; then $(CYGPATH_W) '../src/Relations.cc'; else $(CYGPATH_W) '$(srcdir)/../src/Relations.cc'; fi` - -../src/libomega_a-RelBody.o: ../src/RelBody.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-RelBody.o -MD -MP -MF ../src/$(DEPDIR)/libomega_a-RelBody.Tpo -c -o ../src/libomega_a-RelBody.o `test -f '../src/RelBody.cc' || echo '$(srcdir)/'`../src/RelBody.cc -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-RelBody.Tpo ../src/$(DEPDIR)/libomega_a-RelBody.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/RelBody.cc' object='../src/libomega_a-RelBody.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-RelBody.o `test -f '../src/RelBody.cc' || echo '$(srcdir)/'`../src/RelBody.cc - -../src/libomega_a-RelBody.obj: ../src/RelBody.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-RelBody.obj -MD -MP -MF ../src/$(DEPDIR)/libomega_a-RelBody.Tpo -c -o ../src/libomega_a-RelBody.obj `if test -f '../src/RelBody.cc'; then $(CYGPATH_W) '../src/RelBody.cc'; else $(CYGPATH_W) '$(srcdir)/../src/RelBody.cc'; fi` -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-RelBody.Tpo ../src/$(DEPDIR)/libomega_a-RelBody.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/RelBody.cc' object='../src/libomega_a-RelBody.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-RelBody.obj `if test -f '../src/RelBody.cc'; then $(CYGPATH_W) '../src/RelBody.cc'; else $(CYGPATH_W) '$(srcdir)/../src/RelBody.cc'; fi` - -../src/libomega_a-RelVar.o: ../src/RelVar.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-RelVar.o -MD -MP -MF ../src/$(DEPDIR)/libomega_a-RelVar.Tpo -c -o ../src/libomega_a-RelVar.o `test -f '../src/RelVar.cc' || echo '$(srcdir)/'`../src/RelVar.cc -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-RelVar.Tpo ../src/$(DEPDIR)/libomega_a-RelVar.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/RelVar.cc' object='../src/libomega_a-RelVar.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-RelVar.o `test -f '../src/RelVar.cc' || echo '$(srcdir)/'`../src/RelVar.cc - -../src/libomega_a-RelVar.obj: ../src/RelVar.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-RelVar.obj -MD -MP -MF ../src/$(DEPDIR)/libomega_a-RelVar.Tpo -c -o ../src/libomega_a-RelVar.obj `if test -f '../src/RelVar.cc'; then $(CYGPATH_W) '../src/RelVar.cc'; else $(CYGPATH_W) '$(srcdir)/../src/RelVar.cc'; fi` -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-RelVar.Tpo ../src/$(DEPDIR)/libomega_a-RelVar.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/RelVar.cc' object='../src/libomega_a-RelVar.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-RelVar.obj `if test -f '../src/RelVar.cc'; then $(CYGPATH_W) '../src/RelVar.cc'; else $(CYGPATH_W) '$(srcdir)/../src/RelVar.cc'; fi` - -../src/libomega_a-closure.o: ../src/closure.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-closure.o -MD -MP -MF ../src/$(DEPDIR)/libomega_a-closure.Tpo -c -o ../src/libomega_a-closure.o `test -f '../src/closure.cc' || echo '$(srcdir)/'`../src/closure.cc -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-closure.Tpo ../src/$(DEPDIR)/libomega_a-closure.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/closure.cc' object='../src/libomega_a-closure.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-closure.o `test -f '../src/closure.cc' || echo '$(srcdir)/'`../src/closure.cc - -../src/libomega_a-closure.obj: ../src/closure.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-closure.obj -MD -MP -MF ../src/$(DEPDIR)/libomega_a-closure.Tpo -c -o ../src/libomega_a-closure.obj `if test -f '../src/closure.cc'; then $(CYGPATH_W) '../src/closure.cc'; else $(CYGPATH_W) '$(srcdir)/../src/closure.cc'; fi` -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-closure.Tpo ../src/$(DEPDIR)/libomega_a-closure.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/closure.cc' object='../src/libomega_a-closure.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-closure.obj `if test -f '../src/closure.cc'; then $(CYGPATH_W) '../src/closure.cc'; else $(CYGPATH_W) '$(srcdir)/../src/closure.cc'; fi` - -../src/libomega_a-reach.o: ../src/reach.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-reach.o -MD -MP -MF ../src/$(DEPDIR)/libomega_a-reach.Tpo -c -o ../src/libomega_a-reach.o `test -f '../src/reach.cc' || echo '$(srcdir)/'`../src/reach.cc -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-reach.Tpo ../src/$(DEPDIR)/libomega_a-reach.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/reach.cc' object='../src/libomega_a-reach.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-reach.o `test -f '../src/reach.cc' || echo '$(srcdir)/'`../src/reach.cc - -../src/libomega_a-reach.obj: ../src/reach.cc -@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ../src/libomega_a-reach.obj -MD -MP -MF ../src/$(DEPDIR)/libomega_a-reach.Tpo -c -o ../src/libomega_a-reach.obj `if test -f '../src/reach.cc'; then $(CYGPATH_W) '../src/reach.cc'; else $(CYGPATH_W) '$(srcdir)/../src/reach.cc'; fi` -@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ../src/$(DEPDIR)/libomega_a-reach.Tpo ../src/$(DEPDIR)/libomega_a-reach.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../src/reach.cc' object='../src/libomega_a-reach.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libomega_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ../src/libomega_a-reach.obj `if test -f '../src/reach.cc'; then $(CYGPATH_W) '../src/reach.cc'; else $(CYGPATH_W) '$(srcdir)/../src/reach.cc'; fi` - -ID: $(am__tagged_files) -	$(am__define_uniq_tagged_files); mkid -fID $$unique -tags: tags-am -TAGS: tags - -tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) -	set x; \ -	here=`pwd`; \ -	$(am__define_uniq_tagged_files); \ -	shift; \ -	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ -	  test -n "$$unique" || unique=$$empty_fix; \ -	  if test $$# -gt 0; then \ -	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ -	      "$$@" $$unique; \ -	  else \ -	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ -	      $$unique; \ -	  fi; \ -	fi -ctags: ctags-am - -CTAGS: ctags -ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) -	$(am__define_uniq_tagged_files); \ -	test -z "$(CTAGS_ARGS)$$unique" \ -	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ -	     $$unique - -GTAGS: -	here=`$(am__cd) $(top_builddir) && pwd` \ -	  && $(am__cd) $(top_srcdir) \ -	  && gtags -i $(GTAGS_ARGS) "$$here" -cscopelist: cscopelist-am - -cscopelist-am: $(am__tagged_files) -	list='$(am__tagged_files)'; \ -	case "$(srcdir)" in \ -	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ -	  *) sdir=$(subdir)/$(srcdir) ;; \ -	esac; \ -	for i in $$list; do \ -	  if test -f "$$i"; then \ -	    echo "$(subdir)/$$i"; \ -	  else \ -	    echo "$$sdir/$$i"; \ -	  fi; \ -	done >> $(top_builddir)/cscope.files - -distclean-tags: -	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) -	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ -	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ -	list='$(DISTFILES)'; \ -	  dist_files=`for file in $$list; do echo $$file; done | \ -	  sed -e "s|^$$srcdirstrip/||;t" \ -	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ -	case $$dist_files in \ -	  */*) $(MKDIR_P) `echo "$$dist_files" | \ -			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ -			   sort -u` ;; \ -	esac; \ -	for file in $$dist_files; do \ -	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ -	  if test -d $$d/$$file; then \ -	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ -	    if test -d "$(distdir)/$$file"; then \ -	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ -	    fi; \ -	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ -	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ -	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ -	    fi; \ -	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ -	  else \ -	    test -f "$(distdir)/$$file" \ -	    || cp -p $$d/$$file "$(distdir)/$$file" \ -	    || exit 1; \ -	  fi; \ -	done -check-am: all-am -check: check-am -all-am: Makefile $(LIBRARIES) -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am -	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: -	if test -z '$(STRIP)'; then \ -	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ -	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ -	      install; \ -	else \ -	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ -	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ -	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ -	fi -mostlyclean-generic: - -clean-generic: - -distclean-generic: -	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -	-rm -f ../../basic/src/$(DEPDIR)/$(am__dirstamp) -	-rm -f ../../basic/src/$(am__dirstamp) -	-rm -f ../src/$(DEPDIR)/$(am__dirstamp) -	-rm -f ../src/$(am__dirstamp) -	-rm -f ../src/omega_core/$(DEPDIR)/$(am__dirstamp) -	-rm -f ../src/omega_core/$(am__dirstamp) - -maintainer-clean-generic: -	@echo "This command is intended for maintainers to use" -	@echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am - -distclean: distclean-am -	-rm -rf ../../basic/src/$(DEPDIR) ../src/$(DEPDIR) ../src/omega_core/$(DEPDIR) -	-rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ -	distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -html-am: - -info: info-am - -info-am: - -install-data-am: - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-am -	-rm -rf ../../basic/src/$(DEPDIR) ../src/$(DEPDIR) ../src/omega_core/$(DEPDIR) -	-rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: - -.MAKE: install-am install-strip - -.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ -	clean-noinstLIBRARIES cscopelist-am ctags ctags-am distclean \ -	distclean-compile distclean-generic distclean-tags distdir dvi \ -	dvi-am html html-am info info-am install install-am \ -	install-data install-data-am install-dvi install-dvi-am \ -	install-exec install-exec-am install-html install-html-am \ -	install-info install-info-am install-man install-pdf \ -	install-pdf-am install-ps install-ps-am install-strip \ -	installcheck installcheck-am installdirs maintainer-clean \ -	maintainer-clean-generic mostlyclean mostlyclean-compile \ -	mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ -	uninstall-am - - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/omega/omega_lib/src/RelBody.cc b/omega/omega_lib/src/RelBody.cc deleted file mode 100644 index 825b153..0000000 --- a/omega/omega_lib/src/RelBody.cc +++ /dev/null @@ -1,906 +0,0 @@ -/***************************************************************************** - Copyright (C) 1994-2000 the Omega Project Team - Copyright (C) 2005-2011 Chun Chen - All Rights Reserved. - - Purpose: -   class Rel_Body, internal Relation representation - - Notes: - - History: -   11/26/09  Remove unecessary mandatary checking for set or relation, -             treat them uniformly for easy coding, by Chun Chen -*****************************************************************************/ - -#include <basic/util.h> -#include <omega/RelBody.h> -#include <omega/Relation.h> -#include <omega/pres_tree.h> -#include <omega/pres_conj.h> -#include <omega/omega_i.h> -#include <assert.h> - -namespace omega { - -Rel_Body null_rel; -bool Rel_Body::is_null() const { -  return(this == &null_rel); -} - - -int Rel_Body::max_ufs_arity() { -  int ma = 0, a; -  for (Variable_ID_Iterator v(*global_decls()); v; v++) { -    a = (*v)->get_global_var()->arity(); -    if (a > ma) -      ma = a; -  } -  return ma; -} - -int Rel_Body::max_ufs_arity_of_set() { -  int ma = 0, a; -  for (Variable_ID_Iterator v(*global_decls()); v; v++) -    if ((*v)->function_of() == Set_Tuple) { -      a = (*v)->get_global_var()->arity(); -      if (a > ma) -        ma = a; -    } -  return ma; -} - -int Rel_Body::max_ufs_arity_of_in() { -  int ma = 0, a; -  for (Variable_ID_Iterator v(*global_decls()); v; v++) -    if ((*v)->function_of() == Input_Tuple) { -      a = (*v)->get_global_var()->arity(); -      if (a > ma) -        ma = a; -    } -  return ma; -} - -int Rel_Body::max_ufs_arity_of_out() { -  int ma = 0, a; -  for (Variable_ID_Iterator v(*global_decls()); v; v++) -    if ((*v)->function_of() == Output_Tuple) { -      a = (*v)->get_global_var()->arity(); -      if (a > ma) -        ma = a; -    } -  return ma; -} - -int Rel_Body::max_shared_ufs_arity() { -  int ma = 0, a; -  for (Variable_ID_Iterator v(*global_decls()); v; v++) -    for (Variable_ID_Iterator v2(*global_decls()); v2; v2++) -      if (*v != *v2  -          && (*v)->get_global_var() == (*v2)->get_global_var() -          && (*v)->function_of() != (*v2)->function_of()) { -        a = (*v)->get_global_var()->arity(); -        if (a > ma) -          ma = a; -      } -  return ma; -} - -// -// Input and output variables. -// -void Rel_Body::name_input_var(int nth, Const_String S) { -  // assert(1 <= nth && nth <= number_input && (!is_set() || skip_set_checks > 0)); -  if (is_null()) -    throw std::invalid_argument("empty relation"); -  if (nth < 1 || nth > number_input) -    throw std::invalid_argument("invalid input var number"); -  In_Names[nth] = S; -} - -void Rel_Body::name_output_var(int nth, Const_String S) { -  // assert(1<= nth && nth <= number_output && (!is_set() || skip_set_checks > 0)); -  if (is_null()) -    throw std::invalid_argument("empty relation"); -  if (nth < 1 || nth > number_output) -    throw std::invalid_argument("invalid output var number"); -  Out_Names[nth] = S; -} - -void Rel_Body::name_set_var(int nth, Const_String S) { -  if (number_output != 0) -    throw std::runtime_error("relation is not a set"); -  name_input_var(nth, S); -} - -int Rel_Body::n_inp() const { -  // assert(!is_null() && (!is_set()||skip_set_checks>0)); -  if (is_null()) -    return 0; -  else -    return number_input; -} - -int Rel_Body::n_out() const { -  // assert(!is_null() && (!is_set()||skip_set_checks>0)); -  if (is_null()) -    return 0; -  else -    return number_output; -} - -int Rel_Body::n_set() const { -  if (number_output != 0) -    throw std::runtime_error("relation is not a set"); -  return n_inp(); -} - -Variable_ID Rel_Body::input_var(int nth) { -  // assert(!is_null()); -  // assert(!is_set() || skip_set_checks>0); -  // assert(1 <= nth && nth <= number_input); -  if (is_null()) -    throw std::invalid_argument("empty relation"); -  if (nth < 1 || nth > number_input) -    throw std::invalid_argument("invalid input var number"); -  input_vars[nth]->base_name = In_Names[nth]; -  return input_vars[nth]; -} - -Variable_ID Rel_Body::output_var(int nth) { -  // assert(!is_null()); -  // assert(!is_set() || skip_set_checks>0); -  // assert(1<= nth && nth <= number_output); -  if (is_null()) -    throw std::invalid_argument("empty relation"); -  if (nth < 1 || nth > number_output) -    throw std::invalid_argument("invalid output var number"); -  output_vars[nth]->base_name = Out_Names[nth]; -  return output_vars[nth]; -} - -Variable_ID Rel_Body::set_var(int nth) { -  if (number_output != 0) -    throw std::runtime_error("relation is not a set"); -  return input_var(nth); -} - -// -// Add the AND node to the relation. -// Useful for adding restraints. -// -F_And *Rel_Body::and_with_and() { -  assert(!is_null()); -  if (is_simplified()) -    DNF_to_formula(); -  relation()->finalized = false; -  Formula *f = rm_formula(); -  F_And *a = add_and(); -  a->add_child(f); -  return a; -} - -// -// Add constraint to relation at the upper level. -// -EQ_Handle Rel_Body::and_with_EQ() { -  assert(!is_null()); -  if (is_simplified()) -    DNF_to_formula(); -  assert(! is_shared());  // The relation has been split. -  relation()->finalized = false; -  return find_available_conjunct()->add_EQ(); -} - -EQ_Handle Rel_Body::and_with_EQ(const Constraint_Handle &initial) { -  assert(!is_null()); -  assert(initial.relation()->is_simplified()); -  EQ_Handle H = and_with_EQ(); -  copy_constraint(H, initial); -  return H; -} - -GEQ_Handle Rel_Body::and_with_GEQ() { -  assert(!is_null()); -  if (is_simplified()) -    DNF_to_formula(); -  assert(! is_shared());  // The relation has been split. -  relation()->finalized = false;  // We are giving out a handle. -  // We should evantually implement finalization -  // of subtrees, so the existing formula cannot -  // be modified. -  return find_available_conjunct()->add_GEQ(); -} - -GEQ_Handle Rel_Body::and_with_GEQ(const Constraint_Handle &initial) { -  assert(!is_null()); -  assert(initial.relation()->is_simplified()); -  GEQ_Handle H = and_with_GEQ(); -  copy_constraint(H, initial); -  return H; -} - - - -Conjunct *Rel_Body::find_available_conjunct() { -  Conjunct *c; -  assert(!is_null()); - -  if (children().empty()) { -    c = add_conjunct(); -  } -  else { -    assert(children().length() == 1); -    Formula *kid = children().front();  // RelBodies have only one child -    c = kid->find_available_conjunct(); -    if (c==NULL) { -      remove_child(kid); -      F_And *a = add_and(); -      a->add_child(kid); -      c = a->add_conjunct(); -    } -  }  -  return c; -} - -void Rel_Body::finalize() { -  assert(!is_null()); -  if (!is_finalized()) -    assert(! is_shared());  // no other pointers into here -  finalized = true; -  if (! children().empty()) -    children().front()->finalize();  // Can have at most one child -} - -// Null Rel_Body -// This is the only rel_body constructor that has ref_count initialized to 1; -// That's because it's used to construct the global Rel_Body "null_rel".  -// Unfortunately because we don't know in what order global constructors will -// be called, we could create a global relation with the default relation -// constructor (which would set the null_rel ref count to 1), and *then*  -// call Rel_Body::Rel_Body(), which would set it back to 0, leaving a relation -// that points to a rel_body with it's ref_count set to 0!  So this is done as -// a special case, in which the ref_count is always 1. -Rel_Body::Rel_Body(): -  Formula(0, this),  -  ref_count(1), -  status(under_construction), -  number_input(0), number_output(0), -  In_Names(0), Out_Names(0), -  simplified_DNF(NULL), -  r_conjs(0),  -  finalized(true), -  _is_set(false) { -} - - -Rel_Body::Rel_Body(int n_input, int n_output): -  Formula(0, this), -  ref_count(0), -  status(under_construction), -  number_input(n_input), number_output(n_output),  -  In_Names(n_input), Out_Names(n_output), -  simplified_DNF(NULL), -  r_conjs(0),  -  finalized(false) { -  if (n_output == 0) -    _is_set = true; -  else -    _is_set = false; -  if(pres_debug) { -    fprintf(DebugFile, "+++ Create Rel_Body::Rel_Body(%d, %d) = 0x%p +++\n", -            n_input, n_output, this); -  } -  int i;  -  for(i=1; i<=number_input; i++) { -    In_Names[i] = Const_String(); -  } -  for(i=1; i<=number_output; i++) { -    Out_Names[i] = Const_String(); -  } -} - -// Rel_Body::Rel_Body(Rel_Body *r): -//   Formula(0, this), -//   ref_count(0), -//   status(r->status), -//   number_input(r->number_input), number_output(r->number_output), -//   In_Names(r->number_input), Out_Names(r->number_output), -//   simplified_DNF(NULL), -//   r_conjs(r->r_conjs),  -//   finalized(r->finalized), -//   _is_set(r->_is_set) { -//   if(pres_debug) { -//     fprintf(DebugFile, "+++ Copy Rel_Body::Rel_Body(Rel_Body * 0x%p) = 0x%p +++\n", r, this); -//     prefix_print(DebugFile); -//   } - -//   int i; -//   for(i=1;i<=r->number_input;i++) In_Names[i] = r->In_Names[i]; -//   for(i=1;i<=r->number_output;i++) Out_Names[i] = r->Out_Names[i]; -//   copy_var_decls(Symbolic,r->Symbolic); - -//   if(!r->children().empty() && r->simplified_DNF==NULL) { -//     Formula *f = r->formula()->copy(this,this); -//     f->remap(); -//     children().append(f); -//   } -//   else if(r->children().empty() && r->simplified_DNF!=NULL) { -//     simplified_DNF = r->simplified_DNF->copy(this); -//     simplified_DNF->remap(); -//   } -//   else {   // copy NULL relation -//   } - -//   reset_remap_field(r->Symbolic); -// } - -Rel_Body *Rel_Body::clone() { -  Rel_Body *b = new Rel_Body(); - -  b->ref_count = 0; -  b->status = status; -  b->number_input = number_input; -  b->number_output = number_output; -  b->r_conjs = r_conjs; -  b->finalized = finalized; -  b->_is_set = _is_set; -   -  b->In_Names = Tuple<Const_String>(number_input); -  b->Out_Names = Tuple<Const_String>(number_output); -  for(int i = 1; i <= number_input; i++) -    b->In_Names[i] = In_Names[i]; -  for(int i = 1; i <= number_output; i++) -    b->Out_Names[i] = Out_Names[i]; -   -  copy_var_decls(b->Symbolic, Symbolic); - -  if(!children().empty() && simplified_DNF==NULL) { -    Formula *f = formula()->copy(b, b); -    f->remap(); -    b->children().append(f); -  } -  else if(children().empty() && simplified_DNF!=NULL) { -    b->simplified_DNF = simplified_DNF->copy(b); -    b->simplified_DNF->remap(); -  } -  else {   // copy NULL relation -  } - -  reset_remap_field(Symbolic); -  return b; -} - - -Rel_Body::Rel_Body(Rel_Body *r, Conjunct *c): -  Formula(0, this), -  ref_count(0), -  status(uncompressed), -  number_input(r->number_input), number_output(r->number_output), -  In_Names(r->number_input), Out_Names(r->number_output), -  r_conjs(0),  -  finalized(r->finalized), -  _is_set(r->_is_set) { -  if(pres_debug) { -    fprintf(DebugFile, "+++ Copy Rel_Body::Rel_Body(Rel_Body * 0x%p, Conjunct * 0x%p) = 0x%p +++\n",r,c,this); -  } - -  int i; -  for(i=1;i<=r->number_input;i++) In_Names[i] = r->In_Names[i]; -  for(i=1;i<=r->number_output;i++) Out_Names[i] = r->Out_Names[i]; -  copy_var_decls(Symbolic,r->Symbolic); - -  // assert that r has as many variables as c requires, or that c is from r -  assert(r == c->relation()); -  assert(r->simplified_DNF != NULL); -  simplified_DNF = new DNF; -  simplified_DNF->add_conjunct(c->copy_conj_diff_relation(this,this)); -  single_conjunct()->remap(); - -  reset_remap_field(r->Symbolic); -} - -Rel_Body::~Rel_Body() { -  if(pres_debug) { -    fprintf(DebugFile, "+++ Destroy Rel_Body::~Rel_Body() 0x%p +++\n", this); -  } -  free_var_decls(Symbolic); -  if(simplified_DNF != NULL) { -    delete simplified_DNF; -  } -} - -// -// Take a relation that has been simplified and convert it  -// back to formula form.   -// -void Rel_Body::DNF_to_formula() { -  assert(!is_null()); -  if (simplified_DNF != NULL) { -    simplified_DNF->DNF_to_formula(this); -    simplified_DNF = NULL; -    status = under_construction; -  } -} - -bool Rel_Body::can_add_child() { -  assert(this != &null_rel); -  return n_children() < 1; -} - - - -// ******************** -//  Simplify functions -// ******************** - - -extern int s_rdt_constrs; - - -// -// Simplify a given relation. -// Store the resulting DNF in the relation, clean out the formula. -// -void Rel_Body::simplify(int rdt_conjs, int rdt_constrs) { -  if(simplified_DNF == NULL) { -    finalized = true; -    if(children().empty()) { -      simplified_DNF = new DNF; -    } -    else { -      if(pres_debug) { -        if(DebugFile==NULL) { -          DebugFile = fopen("test.out", "w"); -          if(DebugFile==NULL) -            fprintf(stderr, "Can not open file test.out\n"); -        } -      } - -      assert(children().length()==1); -      if(pres_debug) { -        fprintf(DebugFile, "=== %p Rel_Body::simplify(%d, %d) Input tree (%d) ===\n", this,rdt_conjs,rdt_constrs,r_conjs); -        prefix_print(DebugFile); -      } -      verify_tree(); - -      beautify(); -      verify_tree(); - -      rearrange(); -      verify_tree(); - -      beautify(); -      verify_tree(); - -      s_rdt_constrs = rdt_constrs; -      if(pres_debug) { -        fprintf(DebugFile, "\n=== In simplify, before DNFize ===\n"); -        prefix_print(DebugFile); -      } -      DNFize(); -      if(pres_debug) { -        fprintf(DebugFile, "\n=== In simplify, after DNFize ===\n"); -        prefix_print(DebugFile); -      } -      verify_tree(); - - -      simplified_DNF->rm_redundant_inexact_conjs(); -      verify_tree(); - -      if (rdt_conjs > 0 && !simplified_DNF->is_definitely_false() && simplified_DNF->length() > 1) { -        simplified_DNF->rm_redundant_conjs(rdt_conjs-1); -        verify_tree(); -      } -       -      if(pres_debug) { -        fprintf(DebugFile, "\n=== Resulting Relation ===\n"); -        prefix_print(DebugFile); -      } -    } -  } -  else { -    /* Reprocess DNF to get rid of redundant stuff */ - -    if (rdt_constrs < 0) return; -    simplified_DNF->rm_redundant_inexact_conjs(); - -    if (rdt_conjs > r_conjs) { -      if(pres_debug)  -        fprintf(DebugFile,"=== Rel_Body::simplify() redundant CONJUNCTS ===\n"); -      simplified_DNF->rm_redundant_conjs(rdt_conjs-1); -    } -    if (rdt_constrs > 0 ) { -      if(pres_debug)  -        fprintf(DebugFile,"=== Rel_Body::simplify() redundant CONSTR-S ===\n"); -      s_rdt_constrs = rdt_constrs; -      simplified_DNF->simplify(); -    } -  } - -  r_conjs = rdt_conjs; - -  for(DNF_Iterator D(simplified_DNF); D.live(); D.next()) { -    D.curr()->set_relation(this); -    D.curr()->set_parent(this); -  } -} - - -// ****************** -//  Query functions -// ****************** - - -// -// Check if relation has a single conjunct formula and return this conjunct. -// -Conjunct *Rel_Body::single_conjunct() { -  simplify(); -  return simplified_DNF->single_conjunct(); -} - -bool Rel_Body::has_single_conjunct() { -  simplify(); -  return simplified_DNF->has_single_conjunct(); -} - -// -// Remove and return first conjunct -// -Conjunct *Rel_Body::rm_first_conjunct() { -  simplify(); -  return simplified_DNF->rm_first_conjunct(); -} - - -void Rel_Body::query_difference(Variable_ID v1, Variable_ID v2, coef_t &lowerBound, coef_t &upperBound, bool &guaranteed) { -  simplify(); - -  coef_t _lb, _ub; -  int first = 1; -  bool _g; -  lowerBound = negInfinity;  // default values if no DNF's -  upperBound = posInfinity; -  guaranteed = 0; - -  for (DNF_Iterator D(simplified_DNF); D.live(); D.next()) { -    (*D)->query_difference(v1, v2, _lb, _ub, _g); -    if (first) { -      lowerBound = _lb; -      upperBound = _ub; -      guaranteed = _g; -      first = 0; -    } -    else { -      guaranteed = guaranteed && _g; -      lowerBound = min(lowerBound, _lb); -      upperBound = max(upperBound, _ub); -    } -  } -} - - -void Rel_Body::query_variable_bounds(Variable_ID v, coef_t &lowerBound, coef_t &upperBound) { -  simplify(); - -  coef_t _lb, _ub; -  int first = 1; -  lowerBound = negInfinity;  // default values if no DNF's -  upperBound = posInfinity; - -  for (DNF_Iterator D(simplified_DNF); D.live(); D.next()) { -    (*D)->query_variable_bounds(v, _lb, _ub); -    if (first) { -      lowerBound = _lb; -      upperBound = _ub; -      first = 0; -    } -    else { -      lowerBound = min(lowerBound, _lb); -      upperBound = max(upperBound, _ub); -    } -  } -} - -coef_t Rel_Body::query_variable_mod(Variable_ID v, coef_t factor) { -  simplify(); - -  bool first = true; -  coef_t result; - -  for (DNF_Iterator D(simplified_DNF); D.live(); D.next()) { -    coef_t t = (*D)->query_variable_mod(v, factor); -    if (t == posInfinity) -      return posInfinity; - -    if (first) { -      result = t; -      first = false; -    } -    else { -      if (result != t) -        return posInfinity; -    } -  } - -  return result; -} - - - -// -// Simplify formula if needed and return the resulting DNF. -// -DNF* Rel_Body::query_DNF() { -  return(query_DNF(false,false)); -} - -DNF* Rel_Body::query_DNF(int rdt_conjs, int rdt_constrs) { -  simplify(rdt_conjs, rdt_constrs); -  return(simplified_DNF); -} - -// -// Other formula queries. -// - -// Interpret UNKNOWN as true, then check satisfiability -// i.e., check if the formula simplifies to FALSE, since the library -// will never say that if the *known* constraints are unsatisfiable by  -// themselves. -bool Rel_Body::is_upper_bound_satisfiable() { -  int tmp = s_rdt_constrs; -  s_rdt_constrs = -1; -  simplify(); -  s_rdt_constrs = tmp; -  return(!simplified_DNF->is_definitely_false()); -} - -// Interpret UNKNOWN as false, then check satisfiability -// i.e., check if there exist any exact conjuncts in the solution -bool Rel_Body::is_lower_bound_satisfiable() { -  int tmp = s_rdt_constrs; -  s_rdt_constrs = -1; -  simplify(); -  s_rdt_constrs = tmp; -  for(DNF_Iterator d(simplified_DNF); d; d++) -    if((*d)->is_exact()) return true; -  return false; -} - -bool Rel_Body::is_satisfiable() { -  assert(is_lower_bound_satisfiable() == is_upper_bound_satisfiable()); -  return is_upper_bound_satisfiable(); -} - -// Check if we can easily determine if the formula evaluates to true. -bool Rel_Body::is_obvious_tautology() { -  int tmp = s_rdt_constrs; -  s_rdt_constrs = 0; -  simplify(); -  s_rdt_constrs = tmp; -  return(simplified_DNF->is_definitely_true()); -} - -// Expensive check to determine if the formula evaluates to true. -bool Rel_Body::is_definite_tautology() { -  if(is_obvious_tautology()) return true; -  Relation l =  Lower_Bound(Relation(*this,1)); -  return !(Complement(l).is_upper_bound_satisfiable()); -} - -bool Rel_Body::is_unknown() { -  simplify(); -  return(has_single_conjunct() && single_conjunct()->is_unknown()); -} - -// -// Get accuracy status of the relation -// - -Rel_Unknown_Uses Rel_Body::unknown_uses() { -  if (!is_simplified()) -    simplify(); -     -  Rel_Unknown_Uses local_status=0;  -  int n_conj=0; - -  for (DNF_Iterator c(simplified_DNF); c; c++) { -    n_conj++; -    if ((*c)->is_exact()) -      local_status |= no_u; -    else if ((*c)->is_unknown()) -      local_status |= or_u; -    else -      local_status |= and_u; -  } - -  if (n_conj == 0) { -    assert(local_status == 0); -    local_status = no_u; -  } -  assert(local_status); -#if ! defined NDEBUG -  Rel_Unknown_Uses impossible = (and_u | or_u); -  assert( (local_status & impossible) != impossible); -#endif - -  return local_status; -} - -void Rel_Body::interpret_unknown_as_false() { -  simplify(); -  simplified_DNF->remove_inexact_conj();   -} -        -void Rel_Body::interpret_unknown_as_true() { -  simplify(); -  for(DNF_Iterator d(simplified_DNF); d; d++) -    (*d)->interpret_unknown_as_true(); -} -        - -void Rel_Body::reverse_leading_dir_info() { -  if (is_simplified()) { -    for (DNF_Iterator c(simplified_DNF); c; c++) -      (*c)->reverse_leading_dir_info(); -  } -  else { -    assert(!simplified_DNF); -    assert(children().size() == 1); -    children().front()->reverse_leading_dir_info(); -  } -} - -// -// Rel_Body::DNFize just DNF-izes its child node and calls verify -// - -DNF* Rel_Body::DNFize() { -#if defined(INCLUDE_COMPRESSION) -  assert(!this->is_compressed()); -#endif -  if (! simplified_DNF) { -    simplified_DNF = children().remove_front()->DNFize(); - -    int mua = max_shared_ufs_arity(); -    if (mua > 0) { -      if (pres_debug) { -        fprintf(DebugFile, "\n=== In DNFize, before LCDNF ===\n"); -        prefix_print(DebugFile); -      } - -      simplified_DNF->make_level_carried_to(mua); -    } - -    if(pres_debug) { -      fprintf(DebugFile, "\n=== In DNFize, before verify ===\n"); -      prefix_print(DebugFile); -    } - -    simplified_DNF->simplify(); -  } - -  assert(children().length() == 0); - -  return simplified_DNF; -} - -void Rel_Body::make_level_carried_to(int level) { -  if (!simplified_DNF) { -    DNFize(); -  } - -  assert(simplified_DNF && children().empty()); - -  simplified_DNF->make_level_carried_to(level); -} - -// -// if direction==0, move all conjuncts with >= level leading 0's to return -//            else  move all conjuncts with level-1 0's followed by -//      the appropriate signed difference to returned Relation -// - -Relation Rel_Body::extract_dnf_by_carried_level(int level, int direction) { -  if (!simplified_DNF) { -    DNFize(); -  } - -  assert(simplified_DNF && children().empty()); - -  simplified_DNF->make_level_carried_to(level); - -  Relation extracted(n_inp(), n_out()); -  extracted.copy_names(*this); -  assert(extracted.rel_body->children().empty()); -  assert(extracted.rel_body->simplified_DNF == NULL); -  extracted.rel_body->simplified_DNF = new DNF; -  extracted.rel_body->Symbolic = Symbolic; - -  DNF *remaining = new DNF; -  Conjunct *curr; - -  for (curr = simplified_DNF->rm_first_conjunct(); -       curr; -       curr = simplified_DNF->rm_first_conjunct()) { -    assert(curr->guaranteed_leading_0s >= level || curr->guaranteed_leading_0s == curr->possible_leading_0s); -    assert(curr->possible_leading_0s >= 0); - -    curr->assert_leading_info(); - -    if ((direction == 0 && curr->guaranteed_leading_0s >= level) || -        (curr->guaranteed_leading_0s == level-1 && -         curr->leading_dir_valid_and_known() && -         curr->leading_dir * direction > 0)) { -      extracted.rel_body->simplified_DNF->add_conjunct(curr); -    } -    else { -      remaining->add_conjunct(curr); -    } -  } -  delete simplified_DNF; -  simplified_DNF = remaining; - -#if ! defined NDEBUG -  for (DNF_Iterator rc(simplified_DNF); rc; rc++) -    (*rc)->assert_leading_info(); - -  for (DNF_Iterator ec(extracted.rel_body->simplified_DNF); ec; ec++) -    (*ec)->assert_leading_info(); -#endif - -  finalize(); -  extracted.finalize(); -  return extracted; -} - -//Compress/uncompress functions - -bool Rel_Body::is_compressed() { -#if defined(INCLUDE_COMPRESSION) -  if(is_simplified()) { -    for(DNF_Iterator p(simplified_DNF); p.live(); p.next()) { -      if(p.curr()->is_compressed()) -        return true; -    } -  } -  return false; -#else -  return true; // This allows is_compressed assertions to work -#endif -} - -void Rel_Body::compress() { -#if !defined(INCLUDE_COMPRESSION) -  return; -#else -  if (status == compressed) -    return; -  if (pres_debug) -    fprintf(DebugFile,">>> Compressing relation %p\n",this); -  simplify(); -  for(DNF_Iterator p(simplified_DNF); p.live(); p.next()) { -    p.curr()->compress(); -    status = compressed; -  } -#endif -} - -void Rel_Body::uncompress() { -#if !defined(INCLUDE_COMPRESSION) -  return; -#else -  if (pres_debug) -    fprintf(DebugFile,"<<< Uncompressing relation %p\n",this); -  assert(is_simplified()); -  for(DNF_Iterator p(simplified_DNF); p.live(); p.next()) { -    p.curr()->uncompress(); -    status = uncompressed; -  } -#endif -} - -} diff --git a/omega/omega_lib/src/RelVar.cc b/omega/omega_lib/src/RelVar.cc deleted file mode 100644 index d9b977c..0000000 --- a/omega/omega_lib/src/RelVar.cc +++ /dev/null @@ -1,71 +0,0 @@ -#include <omega/RelBody.h> -#include <omega/omega_i.h> - -namespace omega { - -Variable_ID Rel_Body::get_local(const Variable_ID v) { -  Global_Var_ID g; -  if (v->kind() == Global_Var) { -    g = v->get_global_var(); -    if (g->arity()) return get_local(g,v->function_of()); -    return get_local(g); -  } -  if (is_set()) return set_var(v->get_position()); -  if (v->kind() == Input_Var) return input_var(v->get_position()); -  if (v->kind() == Output_Var) return output_var(v->get_position()); -  assert(0 && "Can only get local for variable with global scope"); -  exit(1); -  return 0; -} - -// -// Find or declare global variable. -// If the VarID does not exist, it is created. Otherwise it's returned. -// Note that this version now works only for 0-ary functions. -// -Variable_ID Rel_Body::get_local(const Global_Var_ID G) { -  assert(G->arity() == 0); -  for(Variable_Iterator i(Symbolic); i; i++) -    if ((*i)->get_global_var() == G) -      return (*i); - -  Variable_ID v = G->get_local(); -  Symbolic.append(v); -  return v; -} - - -Variable_ID Rel_Body::get_local(const Global_Var_ID G, Argument_Tuple of) { -  assert(G->arity() == 0 || of == Input_Tuple || of == Output_Tuple); - -  for(Variable_Iterator i = Symbolic; i; i++) -    if ((*i)->get_global_var() == G && (G->arity() == 0 || -                                        of == (*i)->function_of())) -      return (*i); - -  Variable_ID V = G->get_local(of); -  Symbolic.append(V); -  return V; -} - - -bool Rel_Body::has_local(const Global_Var_ID G) { -  assert(G->arity() == 0); -  for(Variable_Iterator i = Symbolic; i; i++) -    if ((*i)->get_global_var() == G) -      return true; -  return false; -} - - -bool Rel_Body::has_local(const Global_Var_ID G, Argument_Tuple of) { -  assert(G->arity() == 0 || of == Input_Tuple || of == Output_Tuple); - -  for(Variable_Iterator i = Symbolic; i; i++) -    if ((*i)->get_global_var() == G && (G->arity() == 0 || -                                        of == (*i)->function_of())) -      return true; -  return false; -} - -} // namespace diff --git a/omega/omega_lib/src/Relation.cc b/omega/omega_lib/src/Relation.cc deleted file mode 100644 index 1cca43a..0000000 --- a/omega/omega_lib/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 diff --git a/omega/omega_lib/src/Relations.cc b/omega/omega_lib/src/Relations.cc deleted file mode 100644 index d7dbe86..0000000 --- a/omega/omega_lib/src/Relations.cc +++ /dev/null @@ -1,2882 +0,0 @@ -/***************************************************************************** - Copyright (C) 1994-2000 the Omega Project Team - Copyright (C) 2005-2011 Chun Chen - All Rights Reserved. - - Purpose: -   Integer set and relation operations. - - Notes: - - History: -   04/22/09 merge_rels, Chun Chen -*****************************************************************************/ - -#include <omega/Relation.h> -#include <omega/Rel_map.h> -#include <omega/pres_tree.h> -#include <omega/pres_dnf.h> -#include <omega/pres_conj.h> -#include <omega/hull.h> -#include <basic/Tuple.h> -#include <basic/Map.h> -#include <basic/util.h> -#include <omega/omega_i.h> -#if defined STUDY_EVACUATIONS -#include <omega/evac.h> -#endif -#include <assert.h> - -namespace omega { - -#define CHECK_MAYBE_SUBSET 1 - -int relation_debug=0; - -namespace { -  int leave_pufs_untouched = 0; -  Variable_ID_Tuple exists_ids;  -  List<int> exists_numbers; -  F_And * and_below_exists; -} - -/* The following allows us to avoid warnings about passing  -   temporaries as non-const references.  This is useful but  -   has suddenly become illegal.  */ - -Relation consume_and_regurgitate(NOT_CONST Relation &R) { -  if(!R.is_null()) -    ((Relation &) R).finalize(); -  Relation S = (Relation &) R; -  (Relation &) R = Relation::Null(); -  return S; -} - - -// -//      r1 Union r2. -//   align the input tuples (if any) for F and G -//   align the output tuples (if any) for F and G -//   match named variables in F and G -//   formula is f | g -// -Relation Union(NOT_CONST Relation &input_r1,  -               NOT_CONST Relation &input_r2) { -  Relation r1 = consume_and_regurgitate(input_r1); -  Relation r2 = consume_and_regurgitate(input_r2); -  if (r1.is_null()) -    return r2; -  else if (r2.is_null()) -    return r1; -  if (r1.n_inp() != r2.n_inp() || r1.n_out() != r2.n_out()) -    throw std::invalid_argument("relation arity does not match"); -   -  // skip_set_checks++; -  // assert(r1.n_inp() == r2.n_inp()); -  // assert(r1.n_out() == r2.n_out()); -  // assert(!r1.is_null() && !r2.is_null()); -  int in = r1.n_inp(), out = r1.n_out(); -  // skip_set_checks--; - -  return MapAndCombineRel2(r1, r2, Mapping::Identity(in, out), -                           Mapping::Identity(in,out), Comb_Or); -} - - -// -//  F intersection G -//   align the input tuples (if any) for F and G -//   align the output tuples (if any) for F and G -//   match named variables in F and G -//   formula is f & g -// -Relation Intersection(NOT_CONST Relation &input_r1, -                      NOT_CONST Relation &input_r2) { -  Relation r1 = consume_and_regurgitate(input_r1); -  Relation r2 = consume_and_regurgitate(input_r2); -  if (r1.is_null()) -    return r2; -  else if (r2.is_null()) -    return r1; -  if (r1.n_inp() != r2.n_inp() || r1.n_out() != r2.n_out()) -    throw std::invalid_argument("relation arity does not match"); - -  // skip_set_checks++; -  // assert(r1.n_inp() == r2.n_inp()); -  // assert(r1.n_out() == r2.n_out()); -  // assert(!r1.is_null() && !r2.is_null()); -  int in = r1.n_inp(), out = r1.n_out(); -  // skip_set_checks--; - -  return MapAndCombineRel2(r1, r2, Mapping::Identity(in,out), -                           Mapping::Identity(in,out), Comb_And); -} - - -// -//  F \ G (the relation F restricted to domain G) -//   align the input tuples for F and G -//   match named variables in F and G -//   formula is f & g -// -Relation Restrict_Domain(NOT_CONST Relation &input_r1, -                         NOT_CONST Relation &input_r2) { -  Relation r1 = consume_and_regurgitate(input_r1); -  Relation r2 = consume_and_regurgitate(input_r2); -  if (r1.is_null()) -    return r1; -  else if (r2.is_null()) -    return r1; -  if (r1.n_inp() != r2.n_set()) -    throw std::invalid_argument("relation arity does not match"); - -  // assert(!r1.is_null() && !r2.is_null()); -  // skip_set_checks++; -  // assert(r1.n_inp() == r2.n_set()); -  // assert(r2.is_set()); -  int in = r1.n_inp(), out = r1.n_out(); -  // skip_set_checks--; - -  int i; -  Mapping m2(r2.n_set()); -  for(i=1; i<=r2.n_set(); i++) m2.set_map_set(i, Input_Var,i); - -  // skip_set_checks++; -  assert(r2.query_guaranteed_leading_0s() == -1 && -         r2.query_possible_leading_0s() == -1); -  // skip_set_checks--; - -  Relation result = MapAndCombineRel2(r1, r2, Mapping::Identity(in,out), -                                      m2, Comb_And); -  // FERD -- update leading 0's - the may close up? -  //result.invalidate_leading_info();  // could do better -  return result; -} - -//  -//   -//  F / G (the relation F restricted to range G) -//   align the output tuples for F and G -//   match named variables in F and G -//   formula is f & g -// -Relation Restrict_Range(NOT_CONST Relation &input_r1, -                        NOT_CONST Relation &input_r2) { -  Relation r1 = consume_and_regurgitate(input_r1); -  Relation r2 = consume_and_regurgitate(input_r2); -  if (r1.is_null()) -    return r1; -  else if (r2.is_null()) -    return r1; -  if (r1.n_out() != r2.n_set()) -    throw std::invalid_argument("relation arity does not match"); -    -  // skip_set_checks++; -  // assert(r1.n_out() == r2.n_set()); -  // assert(r2.is_set()); -  // assert(!r1.is_null() && !r2.is_null()); -  int in = r1.n_inp(), out = r1.n_out(); -  // skip_set_checks--; - -  int i; -  Mapping m2(r2.n_set()); -  for(i=1; i<=r2.n_set(); i++) m2.set_map_set(i, Output_Var,i); - -  // skip_set_checks++; -  assert(r2.query_guaranteed_leading_0s() == -1 && -         r2.query_possible_leading_0s() == -1); -  // skip_set_checks--; - -  Relation result = MapAndCombineRel2(r1, r2, Mapping::Identity(in, out), -                                      m2, Comb_And); -  // FERD -- update leading 0's - the may close up? -  // result.invalidate_leading_info();  // could do better -  return result; -} - - -// -// Add input variable to relation. -// -Relation Extend_Domain(NOT_CONST Relation &S) { -  Relation R = consume_and_regurgitate(S); -  if (R.is_null()) -    throw std::invalid_argument("cannot extend domain on null relation"); -   -  // assert(!R.is_null() && (skip_set_checks || !R.is_set())); -  // assert(!R.is_null()); -  Rel_Body *r = R.split(); -  r->In_Names.append(Const_String()); -  r->number_input++; -  assert(!r->is_null()); - -  if (r->number_input <= r->number_output) -    R.invalidate_leading_info(r->number_input); - -  return R; -} - -// -// Add more input variables to relation. -// -Relation Extend_Domain(NOT_CONST Relation &S, int more) { -  Relation R = consume_and_regurgitate(S); -  if (R.is_null()) -    throw std::invalid_argument("cannot extend domain on null relation"); -   -  // assert(!R.is_null()); -  R.split(); -  for (int i=1; i<=more; i++) R = Extend_Domain(R); -  return R; -} - - -// -// Add output variable to relation. -// -Relation Extend_Range(NOT_CONST Relation &S) { -  Relation R = consume_and_regurgitate(S); -  if (R.is_null()) -    throw std::invalid_argument("cannot extend range on null relation"); - -  // assert(!R.is_null() && !R.is_set()); -  // assert(!R.is_null()); -  Rel_Body *r = R.split(); -  r->Out_Names.append(Const_String()); -  r->number_output++; -  assert(!r->is_null()); - -  if (r->number_output <= r->number_input) -    R.invalidate_leading_info(r->number_output); - -  return R; -} - -// -// Add more output variables to relation. -// -Relation Extend_Range(NOT_CONST Relation &S, int more) { -  Relation R = consume_and_regurgitate(S); - -  // assert(!R.is_null()); -  R.split(); -  for (int i=1; i<=more; i++) R = Extend_Range(R); -  return R; -} - - -// -// Add set variable to set. -// -Relation Extend_Set(NOT_CONST Relation &S) { -  Relation R = consume_and_regurgitate(S); -  if (R.is_null()) -    throw std::invalid_argument("cannot extend set on null relation"); -  if (R.n_out() > 0) -    throw std::invalid_argument("relation must be a set"); -     -  // assert(!R.is_null() && R.is_set()); -  Rel_Body *r = R.split(); -  r->In_Names.append(Const_String()); -  r->number_input++; -  assert(!r->is_null()); -  return R; -} - -// -// Add more variables to set -// -Relation Extend_Set(NOT_CONST Relation &S, int more) { -  Relation R = consume_and_regurgitate(S); -  R.split(); -  for (int i=1; i<=more; i++) R = Extend_Set(R); -  return R; -} - - - -// -// Domain and Range. -// Make output (input) variables wildcards and simplify. -// Move all UFS's to have have the remaining tuple as an argument, -//   and maprel will move them to the set tuple -// RESET all leading 0's -// -Relation Domain(NOT_CONST Relation &S) { -  Relation r = consume_and_regurgitate(S); -  if (r.is_null()) -    return r; -   -  // assert(!S.is_null()); -  // assert(!r.is_set()); -  // skip_set_checks++; -  int i; -  Mapping m1(r.n_inp(), r.n_out()); -  for(i=1; i<=r.n_inp(); i++) m1.set_map_in (i, Set_Var,i); -  for(i=1; i<=r.n_out(); i++) m1.set_map_out(i, Exists_Var,i); -  // skip_set_checks--; - -  int a = r.max_ufs_arity_of_out(); -  if (a > 0) { -    // UFS's must evacuate from the output tuple -    Variable_ID_Tuple remapped; - -    r.simplify(); -    DNF *d = r.split()->DNFize(); -    d->count_leading_0s(); -    // Any conjucts with leading_0s == -1 must have >= "a" leading 0s -    // What a gross way to do this. Ferd - -    for (DNF_Iterator conj(d); conj; conj++) { -#if defined STUDY_EVACUATIONS -      study_evacuation(*conj, out_to_in, a); -#endif - -      int cL0 = (*conj)->guaranteed_leading_0s; - -      for (Variable_ID_Iterator func((*conj)->mappedVars); func; func++) -        if ((*func)->kind() == Global_Var) { -          Global_Var_ID f = (*func)->get_global_var(); -          if (f->arity() > 0 && (*func)->function_of()==Output_Tuple) { -            if (cL0 >= f->arity()) { -              (*func)->remap = r.get_local(f, Input_Tuple); -            } -            else { -              (*func)->remap = (*conj)->declare(); -              (*conj)->make_inexact(); -            } -            remapped.append(*func); -          } -        } -      (*conj)->remap(); -      reset_remap_field(remapped); -      remapped.clear(); -      -      (*conj)->guaranteed_leading_0s =  (*conj)->possible_leading_0s = -1; -      (*conj)->leading_dir = 0; -    } -  } - -  MapRel1(r, m1, Comb_Id); //  this invalidates leading0s -  assert(r.is_set() || m1.n_in() == 0);  // MapRel can't tell to make a set -  r.markAsSet();                         // if there were no inputs.       - -  // skip_set_checks++; -  assert(r.query_guaranteed_leading_0s() == -1 && r.query_possible_leading_0s() == -1); -  // skip_set_checks--; - -  return r; -} - - -Relation Range(NOT_CONST Relation &S) { -  Relation r = consume_and_regurgitate(S); -  if (r.is_null()) -    return r; -   -  //assert(!r.is_null()); -  // skip_set_checks++; - -  int i; -  Mapping m1(r.n_inp(), r.n_out()); -  for(i=1; i<=r.n_inp(); i++) m1.set_map_in (i, Exists_Var,i); -  for(i=1; i<=r.n_out(); i++) m1.set_map_out(i, Set_Var,i); -  // skip_set_checks--; - -  int a = r.max_ufs_arity_of_in(); -  if (a > 0) { -    // UFS's must evacuate from the input tuple -    Variable_ID_Tuple remapped; - -    r.simplify(); -    DNF *d = r.split()->DNFize(); -    d->count_leading_0s(); -    // Any conjucts with leading_0s == -1 must have >= "a" leading 0s -    // What a gross way to do this. Ferd - -    for (DNF_Iterator conj(d); conj; conj++) { -#if defined STUDY_EVACUATIONS -      study_evacuation(*conj, in_to_out, a); -#endif - -      int cL0 = (*conj)->guaranteed_leading_0s; -      for (Variable_ID_Iterator func((*conj)->mappedVars); func; func++) -        if ((*func)->kind() == Global_Var) { -          Global_Var_ID f = (*func)->get_global_var(); -          if (f->arity() > 0 && (*func)->function_of()==Input_Tuple) { -            if (cL0 >= f->arity()) { -              (*func)->remap = r.get_local(f, Output_Tuple); -            } -            else { -              (*func)->remap = (*conj)->declare(); -              (*conj)->make_inexact(); -            } -            remapped.append(*func); -          } -        } -      (*conj)->remap(); -      reset_remap_field(remapped); -      remapped.clear(); - -      (*conj)->guaranteed_leading_0s =  (*conj)->possible_leading_0s = -1; -      (*conj)->leading_dir = 0; -    } -  } - -  MapRel1(r, m1, Comb_Id); // this invalidates leading0s -  assert(r.is_set() || m1.n_out() == 0); // MapRel can't tell to make a set -  r.markAsSet();                        // if there were no outputs. - -  // skip_set_checks++; -  assert(r.query_guaranteed_leading_0s() == -1 && r.query_possible_leading_0s() == -1); -  // skip_set_checks--; - -  return r; -} - - -// -// Cross Product.  Give two sets, A and B, create a relation whose -// domain is A and whose range is B. -// -Relation Cross_Product(NOT_CONST Relation &input_A, -                       NOT_CONST Relation &input_B) { -  Relation A = consume_and_regurgitate(input_A); -  Relation B = consume_and_regurgitate(input_B); -  if (A.is_null() || B.is_null()) -    throw std::invalid_argument("null relation"); -  if (!A.is_set() || !B.is_set()) -    throw std::invalid_argument("cross product must be on two set"); -   -  // assert(A.is_set()); -  // assert(B.is_set()); - -  // skip_set_checks++; -  assert(A.query_guaranteed_leading_0s() == -1 && -         A.query_possible_leading_0s() == -1); -  assert(B.query_guaranteed_leading_0s() == -1 && -         B.query_possible_leading_0s() == -1); -  // skip_set_checks--; - -  Mapping mA(A.n_set()); -  Mapping mB(B.n_set());  -  int i; -  for(i = 1; i <= B.n_set(); i++) mB.set_map_set(i, Output_Var,i); -  for(i = 1; i <= A.n_set(); i++) mA.set_map_set(i, Input_Var,i); -  return MapAndCombineRel2(A, B, mA, mB, Comb_And); -} - - -// -//  inverse F -//   reverse the input and output tuples -// -Relation Inverse(NOT_CONST Relation &S) { -  Relation r = consume_and_regurgitate(S); -  if (r.is_null()) -    return r; -     -  // assert(!r.is_null()); -  // assert(!r.is_set()); -  int i; - -  Mapping m1(r.n_inp(), r.n_out()); -  for(i=1; i<=r.n_inp(); i++) m1.set_map_in (i, Output_Var,i); -  for(i=1; i<=r.n_out(); i++) m1.set_map_out(i, Input_Var,i); - -  MapRel1(r, m1, Comb_Id, -1, -1, false); - -  r.reverse_leading_dir_info(); - -  return r; -} - -Relation After(NOT_CONST Relation &input_S, -               int carried_by, int new_output,int dir) { -  Relation S = consume_and_regurgitate(input_S); -  assert(!S.is_null()); -  assert(!S.is_set()); -  int i; -  Relation r(*S.split(),42); - -  int a = r.max_ufs_arity_of_out(); -  int preserved_positions = min(carried_by-1,new_output); -  if (a >= preserved_positions) { -    // UFS's must evacuate from the output tuple -    Variable_ID_Tuple remapped; - -    r.simplify(); -    DNF *d = r.split()->DNFize(); -    d->count_leading_0s(); -    // Any conjucts with leading_0s == -1 must have >= "a" leading 0s -    // What a gross way to do this. Ferd - -    for (DNF_Iterator conj(d); conj; conj++) { -      int cL0 = (*conj)->guaranteed_leading_0s; - -      for (Variable_ID_Iterator func((*conj)->mappedVars); func; func++) -        if ((*func)->kind() == Global_Var) { -          Global_Var_ID f = (*func)->get_global_var(); -          if (f->arity() > preserved_positions  -              && (*func)->function_of()==Output_Tuple) { -            if (cL0 >= f->arity()) { -              (*func)->remap = r.get_local(f, Input_Tuple); -            } -            else { -              (*func)->remap = (*conj)->declare(); -              (*conj)->make_inexact(); -            } -            remapped.append(*func); -          } -        } -      (*conj)->remap(); -      reset_remap_field(remapped); -      remapped.clear(); -      -      (*conj)->guaranteed_leading_0s =   -        (*conj)->possible_leading_0s = -1; -      (*conj)->leading_dir = 0; -    } -  } - -  Mapping m1(r.n_inp(), r.n_out()); -  for(i=1; i<=r.n_inp(); i++) m1.set_map_in (i, Input_Var,i); -  if (carried_by > new_output) { -    int preserve = min(new_output,r.n_out()); -    for(i=1; i<=preserve; i++) m1.set_map_out(i, Output_Var,i); -    for(i=preserve+1; i<=r.n_out(); i++) m1.set_map_out(i, Exists_Var,-1); -    MapRel1(r, m1, Comb_Id, -1, -1, true); -    if (new_output > preserve) -      r = Extend_Range(r,new_output-r.n_out()); -    return r; -  } - -  for(i=1; i<carried_by; i++) m1.set_map_out(i, Output_Var,i); -  m1.set_map_out(carried_by, Exists_Var,1); -  for(i=carried_by+1; i<=r.n_out(); i++) m1.set_map_out(i, Exists_Var,-1); - -  MapRel1(r, m1, Comb_Id, -1, -1, true,false); - -  Rel_Body *body = r.split(); -  body->Out_Names.append(Const_String()); -  body->number_output++; -  assert(body->n_out() <= input_vars.size()); - - -  GEQ_Handle h = and_below_exists->add_GEQ(0); -  assert(carried_by < 128); -  h.update_coef(exists_ids[1],-dir); -  h.update_coef(r.output_var(carried_by),dir); -  h.update_const(-1); -  h.finalize(); -  r.finalize(); -  if (new_output > r.n_out()) -    r = Extend_Range(r,new_output-r.n_out()); -  return r; -} - -// -// Identity. -// -Relation Identity(int n_inp) { -  Relation rr(n_inp, n_inp); -  F_And *f = rr.add_and(); -  for(int i=1; i<=n_inp; i++) { -    EQ_Handle e = f->add_EQ(); -    e.update_coef(rr.input_var(i), -1); -    e.update_coef(rr.output_var(i), 1); -    e.finalize(); -  } -  rr.finalize(); -  assert(!rr.is_null()); -  return rr; -} - -Relation Identity(NOT_CONST Relation &input_r) { -  Relation   r = consume_and_regurgitate(input_r); -  return Restrict_Domain(Identity(r.n_set()),r); -} - -// -// Deltas(F) -//   Return a set such that the ith variable is old Out_i - In_i -//   Delta variables are created as input variables. -//   Then input and output variables are projected out. -// -Relation Deltas(NOT_CONST Relation &S) { -  Relation R = consume_and_regurgitate(S); -  assert(!R.is_null()); -  // skip_set_checks++; -  assert(R.n_inp()==R.n_out()); -  int in = R.n_inp(); -  // skip_set_checks--; -  return Deltas(R,in); -} - -Relation Deltas(NOT_CONST Relation &S, int eq_no) { -  Relation R = consume_and_regurgitate(S); -  // skip_set_checks++; -  assert(!R.is_null()); -  assert(eq_no<=R.n_inp()); -  assert(eq_no<=R.n_out()); -  // R.split(); - -  int no_inp = R.n_inp(); -  int no_out = R.n_out(); - -  if(relation_debug) { -    fprintf(DebugFile,"Computing Deltas:\n"); -    R.prefix_print(DebugFile); -  } -  int a = R.max_ufs_arity(); -  if (a > 0) { -    Variable_ID_Tuple remapped; -       -    // UFS's must evacuate from all tuples - we need to go to DNF -    // to enumerate the variables, I think... -    R.simplify(); -    if(relation_debug) { -      fprintf(DebugFile,"Relation simplified:\n"); -      R.prefix_print(DebugFile); -    } -    DNF *d = R.split()->DNFize(); - -    for (DNF_Iterator conj(d); conj; conj++) { -      for (Variable_ID_Iterator func((*conj)->mappedVars); func; func++) -        if ((*func)->kind() == Global_Var) { -          Global_Var_ID f = (*func)->get_global_var(); -          if (f->arity() > 0) { -            (*func)->remap = (*conj)->declare(); -            (*conj)->make_inexact(); -            remapped.append(*func); -          } -        } -      (*conj)->remap(); -      reset_remap_field(remapped); -      remapped.clear(); -    } -  } - -  R = Extend_Domain(R, eq_no);                // add eq_no Delta vars -  Mapping M(no_inp+eq_no, no_out); -  int i; -  for(i=1; i<=eq_no; i++) {          // Set up Deltas equalities -    EQ_Handle E = R.and_with_EQ(); -    /* delta_i - w_i + r_i = 0 */ -    E.update_coef(R.input_var(i), 1); -    E.update_coef(R.output_var(i), -1); -    E.update_coef(R.input_var(no_inp+i), 1); -    E.finalize(); -    M.set_map(Input_Var, no_inp+i, Set_Var, i);  // Result will be a set -  } -  for(i=1; i<=no_inp; i++) {          // project out input variables -    M.set_map(Input_Var, i, Exists_Var, i); -  } -  for(i=1; i<=no_out; i++) {          // project out output variables -    M.set_map(Output_Var, i, Exists_Var, no_inp+i); -  } -  MapRel1(R, M, Comb_Id, eq_no, 0); - -  if(relation_debug) { -    fprintf(DebugFile,"Computing deltas:\n"); -    R.prefix_print(DebugFile); -  }; -  R.finalize(); -  assert(R.is_set());  // Should be since we map things to Set_Var -  assert(R.n_set() == eq_no); -  // skip_set_checks--; -  return R; -} - - - - -Relation DeltasToRelation(NOT_CONST Relation &D, int n_inputs, int n_outputs) { -  Relation R = consume_and_regurgitate(D); - -  // skip_set_checks++; -  assert(!R.is_null()); -  R.markAsRelation(); -  int common = R.n_inp(); -  assert(common <= n_inputs); -  assert(common <= n_outputs); -  R.split(); - -  if (R.max_ufs_arity() > 0) { -    assert(R.max_ufs_arity() == 0 && -           "'Deltas' not ready for UFS yet"); // FERD -    fprintf(stderr, "'Deltas' not ready for UFS yet"); -    exit(1); -  } - -  R = Extend_Domain(R, n_inputs); -  R = Extend_Range(R, n_outputs); -  Mapping M(common+n_inputs, n_outputs); -  int i; -  for(i=1; i<=common; i++) {          // Set up Deltas equalities -    EQ_Handle E = R.and_with_EQ(); -    /* delta_i - w_i + r_i = 0 */ -    E.update_coef(R.input_var(i), 1); -    E.update_coef(R.output_var(i), -1); -    E.update_coef(R.input_var(common+i), 1); -    E.finalize(); -    M.set_map(Input_Var, i, Exists_Var, i);  // Result will be a set -  } -  for(i=1; i<=n_inputs; i++) {           // project out input variables -    M.set_map(Input_Var, common+i, Input_Var, i); -  } -  for(i=1; i<=n_outputs; i++) {          // project out output variables -    M.set_map(Output_Var, i, Output_Var, i); -  } -  MapRel1(R, M, Comb_Id, n_inputs, n_outputs); - -  if(relation_debug) { -    fprintf(DebugFile,"Computed DeltasToRelation:\n"); -    R.prefix_print(DebugFile); -  } -  R.finalize(); -  assert(!R.is_set()); -  // skip_set_checks--; -  return R; -} - - - -Relation Join(NOT_CONST Relation &G, NOT_CONST Relation &F) { -  return Composition(F, G); -} - -bool prepare_relations_for_composition(Relation &r1,Relation &r2) { -  assert(!r2.is_null() && !r1.is_null()); - -  if(r2.is_set()) { -    int a1 = r1.max_ufs_arity_of_in(), a2 = r2.max_ufs_arity_of_set(); - -    if (a1 == 0 && a2 == 0) -      return true; -    else { -      assert(0 && "Can't compose relation and set with function symbols"); -      fprintf(stderr, "Can't compose relation and set with function symbols"); -      exit(1); -      return false;  // make compiler shut up -    } -  } - -  assert(r2.n_out() == r1.n_inp()); - -  int zeros = max(r1.query_guaranteed_leading_0s(), -                  r2.query_guaranteed_leading_0s()); -  return (zeros >= r1.max_ufs_arity_of_in() -          && zeros >= r2.max_ufs_arity_of_out()); -} - -// -// Composition(F, G) = F o G, where F o G (x) = F(G(x)) -//   That is, if F = { [i] -> [j] : ... } -//    and G = { [x] -> [y] : ... } -//          then Composition(F, G) = { [x] -> [j] : ... } -// -//  align the output tuple for G and the input tuple for F, -//   these become existensially quantified variables -//  use the output tuple from F and the input tuple from G for the result -//  match named variables in G and F -//  formula is g & f -// -// If there are function symbols of arity > 0, we call special case -// code to handle them.  This is not set up for the r2.is_set case yet. -// - -Relation Composition(NOT_CONST Relation &input_r1, NOT_CONST Relation &input_r2) { -  Relation r1 = consume_and_regurgitate(input_r1); -  Relation r2 = consume_and_regurgitate(input_r2); -  assert(!r2.is_null() && !r1.is_null()); - -  if(r2.is_set()) { -    int a1 = r1.max_ufs_arity_of_in(), a2 = r2.max_ufs_arity_of_set(); -    if (r2.n_set() != r1.n_inp()) { -      fprintf(stderr,"Illegal composition/application, arities don't match\n"); -      fprintf(stderr,"Trying to compute r1(r2)\n"); -      fprintf(stderr,"arity of r2 must match input arity of r1\n"); -      fprintf(stderr,"r1: "); -      r1.print_with_subs(stderr); -      fprintf(stderr,"r2: "); -      r2.print_with_subs(stderr); -      fprintf(stderr,"\n"); -      assert(r2.n_set() == r1.n_inp()); -      exit(1); -    } -    // skip_set_checks++; -    int i; -    if (a1 == 0 && a2 == 0) { -      int x = r1.n_out(); -      Mapping m1(r1.n_inp(), r1.n_out()); -      for(i=1; i<=r1.n_out(); i++) m1.set_map_out(i, Set_Var,i); -      for(i=1; i<=r1.n_inp(); i++) m1.set_map_in (i, Exists_Var,i); -      Mapping m2(r2.n_set()); -      for(i=1; i<=r2.n_set(); i++) m2.set_map_set(i, Exists_Var,i); -      Relation R3 = MapAndCombineRel2(r2, r1, m2, m1, Comb_And); -      // skip_set_checks--; -      if (x == 0) -        R3.markAsSet(); -      return R3; -    } -    else { -      assert(0 && -             "Can't compose relation and set with function symbols"); -      fprintf(stderr, -              "Can't compose relation and set with function symbols"); -      exit(1); -      return Identity(0);  // make compiler shut up -    } -  } - -  if (r2.n_out() != r1.n_inp()) { -    fprintf(stderr,"Illegal composition, arities don't match\n"); -    fprintf(stderr,"Trying to compute r1 compose r2\n"); -    fprintf(stderr,"Output arity of r2 must match input arity of r1\n"); -    fprintf(stderr,"r1: "); -    r1.print_with_subs(stderr); -    fprintf(stderr,"r2: "); -    r2.print_with_subs(stderr); -    fprintf(stderr,"\n"); -    assert(r2.n_out() == r1.n_inp()); -    exit(1); -  } - -  int a1 = r1.max_ufs_arity_of_in(), a2 = r2.max_ufs_arity_of_out(); - -  if (a1 == 0 && a2 == 0 && 0 /* FERD - leading 0's go wrong here */ ) { -    // If no real UFS's, we can just use the general code: -    int i; -    Mapping m1(r1.n_inp(), r1.n_out()); -    for(i=1; i<=r1.n_inp(); i++) m1.set_map_in (i, Exists_Var,i); -    for(i=1; i<=r1.n_out(); i++) m1.set_map_out(i, Output_Var,i); -    Mapping m2(r2.n_inp(), r2.n_out()); -    for(i=1; i<=r2.n_inp(); i++) m2.set_map_in (i, Input_Var,i); -    for(i=1; i<=r2.n_out(); i++) m2.set_map_out(i, Exists_Var,i); - -    return MapAndCombineRel2(r2, r1, m2, m1, Comb_And); -  } -  else { -    Relation result(r2.n_inp(), r1.n_out()); -    int mid_size = r2.n_out(); -    int i; -    for(i =1; i<=r2.n_inp(); i++) -      result.name_input_var(i,r2.input_var(i)->base_name); -    for(i =1; i<=r1.n_out(); i++) -      result.name_output_var(i,r1.output_var(i)->base_name); - -    r1.simplify(); -    r2.simplify(); - -    Rel_Body *b1 = r1.split(), *b2 = r2.split(); - -    if (b1 == b2) { -      assert(0 && "Compose: not ready to handle b1 == b2 yet."); -      fprintf(stderr, "Compose: not ready to handle b1 == b2 yet.\n"); -      exit(1); -    } - -    DNF *d1 = b1->DNFize(); -    DNF *d2 = b2->DNFize(); -       -    d1->count_leading_0s(); -    d2->count_leading_0s(); -    // Any conjucts with leading_0s == -1 must have >= max_arity leading 0s -    // What a gross way to do this.  Ferd - -    F_Exists *exists = result.add_exists(); -    Section<Variable_ID> middle_tuple = exists->declare_tuple(mid_size); -    Map<Global_Var_ID, Variable_ID> lost_functions((Variable_ID)0); - -    F_Or *result_conjs = exists->add_or(); - -    for (DNF_Iterator conj1(d1); conj1; conj1++) -      for (DNF_Iterator conj2(d2); conj2; conj2++) { -        // combine conj1 and conj2: -        //   conj2's in becomes result's in; conj1's out becomes out -        //   conj2's out and conj1's in get merged and exist. quant. -        //   conj2's f(in) and conj1's f(out) become f(in) and f(out) -        //   conj2's f(out) and conj1's f(in) get merged, evacuate: -        //     if conj1 has f.arity leading 0s, they become f(out), -        //     if conj2 has f.arity leading 0s, they become f(in) -        //     if neither has enough 0s, they become a wildcard -        //                               and the result is inexact -        //   old wildcards stay wildcards - -#if defined STUDY_EVACUATIONS -        study_evacuation(*conj1, *conj2, max(a1, a2)); -#endif - -        Conjunct *copy1, *copy2; -        copy2 = (*conj2)->copy_conj_same_relation(); -        copy1 = (*conj1)->copy_conj_same_relation(); - -        Variable_ID_Tuple remapped; - -        int c1L0 = copy1->guaranteed_leading_0s; -        int c2L0 = copy2->guaranteed_leading_0s; - -        int inexact = 0; - -        // get rid of conj2's f(out) -        { -          for (Variable_ID_Iterator func(copy2->mappedVars); func; func++) -            if ((*func)->kind() == Global_Var) { -              Global_Var_ID f = (*func)->get_global_var(); -              if (f->arity() > 0 && (*func)->function_of()==Output_Tuple) { -                if (c2L0 >= f->arity()) { -                  (*func)->remap = r2.get_local(f, Input_Tuple); -                  remapped.append(*func); -                } -                else if (c1L0 >= f->arity()) { -                  // f->remap = copy1->get_local(f, Output_Tuple); -                  // this should work with the current impl. -                  // SHOULD BE A NO-OP? -                  assert((*func)==r1.get_local(f,Output_Tuple)); -                } -                else { -                  Variable_ID f_quantified = lost_functions[f]; -                  if (!f_quantified) { -                    f_quantified = exists->declare(); -                    lost_functions[f] = f_quantified; -                  } -                  inexact = 1; -                  (*func)->remap = f_quantified; -                  remapped.append(*func); -                } -              } -            }      -        } - -        // remap copy2's out -        for (i=1; i<=mid_size; i++) { -          r2.output_var(i)->remap = middle_tuple[i]; -        } - -        // do remapping for conj2, then reset everything so -        // we can go on with conj1 - -        copy2->remap(); -        reset_remap_field(remapped); -        reset_remap_field(output_vars,mid_size); - - -        remapped.clear(); - -        // get rid of conj1's f(in) -        { -          for (Variable_ID_Iterator func(copy1->mappedVars); func; func++) -            if ((*func)->kind() == Global_Var) { -              Global_Var_ID f = (*func)->get_global_var(); -              if (f->arity() > 0 && (*func)->function_of()==Input_Tuple) { -                if (c1L0 >= f->arity()) { -                  (*func)->remap = r1.get_local(f,Output_Tuple); -                  remapped.append(*func); -                } -                else if (c2L0 >= f->arity()) { -                  // f->remap = copy2->get_local(f, Input_Tuple); -                  // this should work with the current impl. -                  // SHOULD BE A NO-OP? -                  assert((*func)==r2.get_local(f,Input_Tuple)); -                } -                else { -                  Variable_ID f_quantified = lost_functions[f]; -                  if (!f_quantified) { -                    f_quantified = exists->declare(); -                    lost_functions[f] = f_quantified; -                  } -                  inexact = 1; -                  (*func)->remap = f_quantified; -                  remapped.append(*func); -                } -              } -            }       -        } - -        // merge copy1's in with the already remapped copy2's out -        for (i=1; i<=mid_size; i++) { -          r1.input_var(i)->remap = middle_tuple[i]; -        } - -        copy1->remap(); -        reset_remap_field(remapped); -        reset_remap_field(input_vars,mid_size); - -        Conjunct *conj3 = merge_conjs(copy1, copy2, MERGE_COMPOSE, exists->relation()); -        result_conjs->add_child(conj3); -        delete copy1; -        delete copy2; - -        // make sure all variables used in the conjunct -        // are listed in the "result" relation - -        for (Variable_ID_Iterator func(conj3->mappedVars); func; func++) -          if ((*func)->kind() == Global_Var) { -            Global_Var_ID f = (*func)->get_global_var(); -            if (f->arity() > 0) -              result.get_local(f, (*func)->function_of()); -            else -              result.get_local(f); -          } - -        if (inexact) -          conj3->make_inexact(); -      } - -    // result.simplify(2, 4);  // can't really do that now, will cause failure in chill -    result.finalize(); -    r1 = r2 = Relation(); -    return result; -  } -} - - - -bool Is_Obvious_Subset(NOT_CONST Relation &input_r1, NOT_CONST Relation &input_r2) { -  Relation r1 = consume_and_regurgitate(input_r1); -  Relation r2 = consume_and_regurgitate(input_r2); - -  assert(!r1.is_null() && !r2.is_null()); -  Rel_Body *rr1 = r1.split(); -  Rel_Body *rr2 = r2.split(); -  rr1->simplify(); -  rr2->simplify(); -  use_ugly_names++; - -  remap_DNF_vars(rr2, rr1); - -  for(DNF_Iterator pd1(rr1->query_DNF()); pd1.live(); pd1.next()) { -    Conjunct *conj1 = pd1.curr(); -    int found = false; -    for(DNF_Iterator pd2(rr2->query_DNF()); pd2.live(); pd2.next()) { -      Conjunct *conj2 = pd2.curr(); -      if (!conj2->is_exact()) continue; -     -      Conjunct *cgist = merge_conjs(conj1, conj2, MERGE_GIST, conj2->relation()); -#ifndef NDEBUG -      cgist->setup_names(); -#endif -      if (cgist->redSimplifyProblem(2, 0) == noRed) { -        delete cgist; -        found = true; -        break; -      } -      delete cgist; -    } -    if (! found)  { -      use_ugly_names--; -      r1 = r2 = Relation(); -      return false; -    } -  } -  use_ugly_names--; -  r1 = r2 = Relation(); -  return true; -} /* Is_Obvious_Subset */ - - -bool do_subset_check(NOT_CONST Relation &input_r1, -                     NOT_CONST Relation &input_r2); - -// do_subset_check really implements Must_Be_Subset anyway (due to  -// correct handling of inexactness in the negation code), but -// still take upper and lower bounds here -bool Must_Be_Subset(NOT_CONST Relation &r1, NOT_CONST Relation &r2) { -  Relation s1 = Upper_Bound(consume_and_regurgitate(r1)); -  Relation s2 = Lower_Bound(consume_and_regurgitate(r2)); -  return do_subset_check(s1,s2); -} - -bool Might_Be_Subset(NOT_CONST Relation &r1, NOT_CONST Relation &r2) { -  Relation s1 = Lower_Bound(consume_and_regurgitate(r1)); -  Relation s2 = Upper_Bound(consume_and_regurgitate(r2)); -  return do_subset_check(s1,s2); -} - -bool May_Be_Subset(NOT_CONST Relation &r1, NOT_CONST Relation &r2){ -  return Might_Be_Subset(r1,r2); -} - - - - -// -// F Must_Be_Subset G -// Test that (f => g) === (~f | g) is a Tautology -// or that (f & ~g) is unsatisfiable: -//  align the input tuples (if any) for F and G -//  align the output tuples (if any) for F and G -// Special case: if r2 has a single conjunct then use HasRedQeuations. -//  - -bool do_subset_check(NOT_CONST Relation &input_r1, -                     NOT_CONST Relation &input_r2) { -  Relation r1 = consume_and_regurgitate(input_r1); -  Relation r2 = consume_and_regurgitate(input_r2); -  if (r1.is_null() || r2.is_null()) -    throw std::invalid_argument("null relation"); -  if (r1.n_inp() != r2.n_inp() || r1.n_out() != r2.n_out()) -    throw std::invalid_argument("relation arity does not match"); -   -  // assert(!r1.is_null() && !r2.is_null()); -  // skip_set_checks++; -  // assert(r1.n_inp() == r2.n_inp()); -  // assert(r1.n_out() == r2.n_out()); -  // skip_set_checks--; -  r1.simplify(1,0); -  r2.simplify(2,2); -  Rel_Body *rr1 = r1.split(); - -  if(relation_debug) { -    fprintf(DebugFile, "\n$$$ Must_Be_Subset IN $$$\n"); -  } - -  bool c = true; - -  // Check each conjunct separately -  for(DNF_Iterator pd(rr1->query_DNF()); c &&  pd.live(); ) { -    Relation tmp(r1,pd.curr()); -    pd.next(); -#ifndef CHECK_MAYBE_SUBSET -    if (pd.live()) -      c = !Difference(tmp,copy(r2)).is_upper_bound_satisfiable(); -    else  -      c = !Difference(tmp,r2).is_upper_bound_satisfiable(); -#else -    Relation d=Difference(copy(tmp), copy(r2)); -    c=!d.is_upper_bound_satisfiable(); -    if (!c && !d.is_exact()) { // negation-induced inexactness -      static int OMEGA_WHINGE = -1; -      if (OMEGA_WHINGE < 0) { -        OMEGA_WHINGE = getenv("OMEGA_WHINGE") ? atoi(getenv("OMEGA_WHINGE")) : 0; -      } -      if (OMEGA_WHINGE) { -        fprintf(DebugFile,"\n===== r1 is maybe a Must_Be_Subset of r2 ========\n"); -        fprintf(DebugFile,"-------> r1:\n"); -        tmp.print_with_subs(DebugFile); -        fprintf(DebugFile,"-------> r2:\n"); -        r2.print_with_subs(DebugFile); -        fprintf(DebugFile,"-------> r1-r2:\n"); -        d.print_with_subs(DebugFile); -      } -    } -#endif          -  } - -  if(relation_debug) { -    fprintf(DebugFile, "$$$ Must_Be_Subset OUT $$$\n"); -  } -  r1 = r2 = Relation(); -  return c; -} - - -// -//  F minus G -// -Relation Difference(NOT_CONST Relation &input_r1, -                    NOT_CONST Relation &input_r2) { -  Relation r1 = consume_and_regurgitate(input_r1); -  Relation r2 = consume_and_regurgitate(input_r2); -  if (r1.is_null() || r2.is_null()) -    return r1; -  if (r1.n_inp() != r2.n_inp() || r1.n_out() != r2.n_out()) -    throw std::invalid_argument("relation arity does not match"); -   -  //assert(!r1.is_null() && !r2.is_null()); -  // skip_set_checks++; -  // assert(r1.n_inp() == r2.n_inp()); -  // assert(r1.n_out() == r2.n_out()); - -  int i; -  Mapping m1(r1.n_inp(), r1.n_out()); -  for(i=1; i<=r1.n_inp(); i++) m1.set_map_in (i, Input_Var,i); -  for(i=1; i<=r1.n_out(); i++) m1.set_map_out(i, Output_Var,i); -  Mapping m2(r2.n_inp(), r2.n_out()); -  for(i=1; i<=r2.n_inp(); i++) m2.set_map_in (i, Input_Var,i); -  for(i=1; i<=r2.n_out(); i++) m2.set_map_out(i, Output_Var,i); -  // skip_set_checks--; - -  return MapAndCombineRel2(r1, r2, m1, m2, Comb_AndNot); -} - -// -//  complement F -//   not F -// -Relation Complement(NOT_CONST Relation &S) { -  Relation r = consume_and_regurgitate(S); -  if (r.is_null()) -    return r; -   -  // assert(!r.is_null()); -  // skip_set_checks++;   -  int i; -  Mapping m(r.n_inp(), r.n_out()); -  for(i=1; i<=r.n_inp(); i++) m.set_map_in (i, Input_Var,i); -  for(i=1; i<=r.n_out(); i++) m.set_map_out(i, Output_Var,i); -  // skip_set_checks--; - -  MapRel1(r, m, Comb_AndNot, -1, -1, false); -  return r; -} - - -// -// Compute (gist r1 given r2). -// Currently we assume that r2 has only one conjunct. -// r2 may have zero input and output OR may have # in/out vars equal to r1. -// -Relation GistSingleConjunct(NOT_CONST Relation &input_R1, -                            NOT_CONST Relation &input_R2, int effort) { -  Relation R1 = consume_and_regurgitate(input_R1); -  Relation R2 = consume_and_regurgitate(input_R2); - -  // skip_set_checks++; -  assert(!R1.is_null() && !R2.is_null()); -  assert((R1.n_inp() == R2.n_inp() && R1.n_out() == R2.n_out()) || -         (R2.n_inp() == 0 && R2.n_out() == 0)); -  R1.simplify(); -  R2.simplify(); -  Rel_Body *r1 = R1.split(); -  Rel_Body *r2 = R2.split(); - -  if(relation_debug) { -    fprintf(DebugFile, "\n### GIST computation start ### [\n"); -    R1.prefix_print(DebugFile); -    R2.prefix_print(DebugFile); -    fprintf(DebugFile, "### ###\n"); -  } - - -//  The merged conjunct has to have the variables of either r1 or r2, but -//  not both. Use r1's, since it'll be cheaper to remap r2's single conj. -  remap_DNF_vars(r2, r1); -  assert(r2->is_upper_bound_satisfiable() && "Gist: second operand is FALSE"); -  // skip_set_checks--; - -  Conjunct *known = r2->single_conjunct(); -  assert(known != NULL && "Gist: second operand has more than 1 conjunct"); - -  DNF *new_dnf = new DNF(); -  for(DNF_Iterator pd(r1->simplified_DNF); pd.live(); pd.next()) { -    Conjunct *conj = pd.curr(); -    Conjunct *cgist = merge_conjs(known, conj, MERGE_GIST, conj->relation()); // Uses r1's vars -    cgist->set_relation(r1);   // Thinks it's part of r1 now, for var. purposes -    if(simplify_conj(cgist, true, effort+1, EQ_RED)) { -      /* Throw out black constraints, turn red constraints into black */ -      cgist->rm_color_constrs(); -      if(cgist->is_true()) { -        delete new_dnf; -        delete cgist; -        // skip_set_checks++; -        Relation retval = Relation::True(r1->n_inp(), r2->n_out()); -        // retval.finalize(); -        retval.simplify(); -        if(R1.is_set() && R2.is_set()) retval.markAsSet(); -        // skip_set_checks--; -        return retval; -      } -      else { -        // since modular equations might be changed, simplify again! -        simplify_conj(cgist, true, effort+1, EQ_BLACK); -         -        new_dnf->add_conjunct(cgist); -      } -    } -  } -  delete r1->simplified_DNF; -  r1->simplified_DNF = new_dnf; -  assert(!r1->is_null()); -  R1.finalize(); -  if(relation_debug) { -    fprintf(DebugFile, "] ### GIST computation end ###\n"); -    R1.prefix_print(DebugFile); -    fprintf(DebugFile, "### ###\n"); -  } -  return(R1); -} - - -// -// Compute gist r1 given r2. r2 can have multiple conjuncts, -// return result is always simplified. -// -Relation Gist(NOT_CONST Relation &input_R1, -              NOT_CONST Relation &input_R2, int effort) { -  Relation R1 = consume_and_regurgitate(input_R1); -  Relation R2 = consume_and_regurgitate(input_R2); -  if (R1.is_null()) -    return R1; -  // change the Gist semantics to allow r2 be null -- by chun 07/30/2007 -  if (R2.is_null()) { -    R1.simplify(); -    return R1; -  } -  if (!(R1.n_inp() == 0 && R2.n_out() == 0) && -      (R1.n_inp() != R2.n_inp() || R1.n_out() != R2.n_out())) -    throw std::invalid_argument("relation arity does not match"); - -  // skip_set_checks++; -  // assert(!R1.is_null()); -  // assert(R2.is_null() || -  //       (R1.n_inp() == R2.n_inp() && R1.n_out() == R2.n_out()) || -  //       (R2.n_inp() == 0 && R2.n_out() == 0)); -  // skip_set_checks--; -  R2.simplify(); - -  if(relation_debug) { -    fprintf(DebugFile, "\n### multi-GIST computation start ### [\n"); -    R1.prefix_print(DebugFile); -    R2.prefix_print(DebugFile); -    fprintf(DebugFile, "### ###\n"); -  } - -  if (!R2.is_upper_bound_satisfiable()) -    return Relation::True(R1); -  if (R2.is_obvious_tautology()) { -    R1.simplify(); -    return R1; -  } -  R1.simplify(); - -  if (!Intersection(copy(R1), copy(R2)).is_upper_bound_satisfiable()) -    return Relation::False(R1); - -  int nconj1=0; -  for (DNF_Iterator di(R1.simplified_DNF()); di.live(); di.next())  -    nconj1++; -  int nconj2=0; -  for (DNF_Iterator di2(R2.simplified_DNF()); di2.live(); di2.next())  -    nconj2++; - -  {   -    static int OMEGA_WHINGE = -1; -    if (OMEGA_WHINGE < 0) { -      OMEGA_WHINGE = getenv("OMEGA_WHINGE") ? atoi(getenv("OMEGA_WHINGE")) : 0; -    } -    if (OMEGA_WHINGE && (nconj1 + nconj2 > 50)) { -      fprintf(DebugFile,"WOW!!!! - Gist (%d conjuncts, %d conjuncts)!!!\n", -              nconj1,nconj2); -      fprintf(DebugFile,"Base:\n"); -      R1.prefix_print(DebugFile); -      fprintf(DebugFile,"Context:\n"); -      R2.prefix_print(DebugFile); -    } -  } - -  if (nconj2==1) -    return GistSingleConjunct(R1,R2, effort); -  else {  -    R1.simplify(0,1); -    R2.simplify(0,1); -    Relation G = Relation::True(R1);  -    for (DNF_Iterator di2(R2.simplified_DNF()); di2.live(); di2.next()) { -      Conjunct * c2 = di2.curr(); -      Relation G2 = Relation::False(R1);  -      for (DNF_Iterator di1(R1.simplified_DNF()); di1.live(); di1.next()) { -        Conjunct * c1 = di1.curr(); -        Relation G1=GistSingleConjunct(Relation(R1,c1), Relation(R2,c2),effort); -  -        if (G1.is_obvious_tautology()) { -          G2 = G1; -          break; -        } -        else if (!G1.is_upper_bound_satisfiable() || !G1.is_exact()) { -          if(relation_debug) { -            fprintf(DebugFile, "gist A given B is unsatisfiable\n"); -            fprintf(DebugFile, "A:\n"); -            Relation(R1,c1).prefix_print(DebugFile); -            fprintf(DebugFile, "B:\n"); -            Relation(R2,c2).prefix_print(DebugFile); -            fprintf(DebugFile, "\n"); -          } -          //G1 = Relation(R1,c1); -          return R1; -        } -        else if(0 && G1.is_exact() && !Must_Be_Subset(Relation(R1,c1),copy(G1))) { -          fprintf(DebugFile,"Unexpected non-Must_Be_Subset gist result!\n"); -          fprintf(DebugFile,"base: \n"); -          Relation(R1,c1).prefix_print(DebugFile); -          fprintf(DebugFile,"context: \n"); -          Relation(R2,c2).prefix_print(DebugFile); -          fprintf(DebugFile,"result: \n"); -          G1.prefix_print(DebugFile); -          fprintf(DebugFile,"base not subseteq result: \n"); -          assert(!G1.is_exact() || Must_Be_Subset(Relation(R1,c1),copy(G1))); -        } -        G2=Union(G2,G1);  -      } -      G2.simplify(0,1); -      G = Intersection(G,G2); -      G.simplify(0,1); -      if(relation_debug) { -        fprintf(DebugFile, "result so far is:\n"); -        G.prefix_print(DebugFile); -      } -    }  -         -    if(relation_debug) { -      fprintf(DebugFile, "\n### end multi-GIST computation ### ]\n"); -      fprintf(DebugFile, "G is:\n"); -      G.prefix_print(DebugFile); -      fprintf(DebugFile, "### ###\n"); -    } -#if ! defined NDEBUG -    Relation S1 = Intersection(copy(R1), copy(R2)); -    Relation S2 = Intersection(copy(G), copy(R2)); - - -    if(relation_debug) { -      fprintf(DebugFile, "\n---->[Checking validity of the GIST result\n"); -      fprintf(DebugFile, "for G=gist R1 given R2:\n"); -      fprintf(DebugFile, "R1 intersect R2 is:\n"); -      S1.print_with_subs(DebugFile); -      fprintf(DebugFile, "\nG intersect R2 is:\n"); -      S2.print_with_subs(DebugFile); -      fprintf(DebugFile, "---->]\n"); -    } -    assert (!S1.is_exact() || !S2.is_exact() || (Must_Be_Subset(copy(S1),copy(S2)) && Must_Be_Subset(copy(S2),copy(S1)))); -#endif    -    return G; -  } -}   - - -// Project away all input and output variables. -Relation Project_On_Sym(NOT_CONST Relation &S, -                        NOT_CONST Relation &input_context) { -  Relation R = consume_and_regurgitate(S); -  Relation context = consume_and_regurgitate(input_context); -  int i; - -  // skip_set_checks++; -  leave_pufs_untouched++; -  int  in_arity = R.max_ufs_arity_of_in(); -  int  out_arity = R.max_ufs_arity_of_out(); -  assert(!R.is_null()); -  R.split(); - -  int no_inp = R.n_inp(); -  int no_out = R.n_out(); -  Mapping M(no_inp, no_out); - -  for(i=1; i<=no_inp; i++) {          // project out input variables -    M.set_map(Input_Var, i, Exists_Var, i); -  } -  for(i=1; i<=no_out; i++) {          // project out output variables -    M.set_map(Output_Var, i, Exists_Var, no_inp+i); -  } -  MapRel1(R, M, Comb_Id, 0, 0); - -  R.finalize(); -  if (in_arity) R = Extend_Domain(R,in_arity); -  if (out_arity) R = Extend_Range(R,out_arity); - -  int d = min(in_arity,out_arity); -  if (d && !context.is_null()) { -    int g = min(d,context.query_guaranteed_leading_0s()); -    int p = min(d,context.query_possible_leading_0s()); -    int dir = context.query_leading_dir(); -    R.enforce_leading_info(g,p,dir); -  } - -  leave_pufs_untouched--; -  // skip_set_checks--; -  if(relation_debug) { -    fprintf(DebugFile,"\nProjecting onto symbolic (%d,%d):\n",in_arity,out_arity); -    R.prefix_print(DebugFile); -  } -  return R; -} - - -// -// Project out global variable g from relation r -// -Relation Project(NOT_CONST Relation &S, Global_Var_ID g) { -  Relation R = consume_and_regurgitate(S); -  assert(!R.is_null()); - -  skip_finalization_check++; - -  Rel_Body *r = R.split(); -  r->DNF_to_formula(); -  Formula *f = r->rm_formula(); -  F_Exists *ex = r->add_exists(); -  ex->add_child(f); -     -  if (g->arity() == 0) { -    assert(R.has_local(g) && "Project: Relation doesn't contain variable to be projected"); -    Variable_ID v = R.get_local(g); -  -    bool rmd = rm_variable(r->Symbolic,v); -    assert(rmd && "Project: Variable to be projected doesn't exist"); -  -    v->remap = ex->declare(v->base_name); -    f->remap(); -    v->remap = v; -  } -  else { -    assert((R.has_local(g, Input_Tuple) || R.has_local(g, Output_Tuple)) && "Project: Relation doesn't contain variable to be projected"); - -    if (R.has_local(g, Input_Tuple)) { -      Variable_ID v = R.get_local(g, Input_Tuple); -  -      bool rmd = rm_variable(r->Symbolic,v); -      assert(rmd && "Project: Variable to be projected doesn't exist"); -  -      v->remap = ex->declare(v->base_name); -      f->remap(); -      v->remap = v; -    } -    if (R.has_local(g, Output_Tuple)) { -      Variable_ID v = R.get_local(g, Output_Tuple); -  -      bool rmd = rm_variable(r->Symbolic,v); -      assert(rmd && "Project: Variable to be projected doesn't exist"); -  -      v->remap = ex->declare(v->base_name); -      f->remap(); -      v->remap = v; -    } -  } - -  skip_finalization_check--; -     -  R.finalize(); -  return R; -} - - -// -// Project all symbolic variables from relation r -// -Relation Project_Sym(NOT_CONST Relation &S) { -  Relation R = consume_and_regurgitate(S); -  assert(!R.is_null()); - -  Rel_Body *r = R.split(); -  r->DNF_to_formula(); - -  Formula *f = r->rm_formula(); - -  skip_finalization_check++; -  F_Exists *ex = r->add_exists(); -  for(Variable_ID_Iterator R_Sym(r->Symbolic); R_Sym; R_Sym++) { -    Variable_ID v = *R_Sym; -    v->remap = ex->declare(v->base_name); -  } -  ex->add_child(f); -  skip_finalization_check--; - -  f->remap(); - -  reset_remap_field(r->Symbolic); -  r->Symbolic.clear(); - -  R.finalize(); -  return R; -} - -// -// Project specified variables, leaving those variables with no constraints. -// -Relation Project(NOT_CONST Relation &S, Sequence<Variable_ID> &s) { -  // This is difficult to do with mappings.  This cheats, since it is -  // much easier and more straightforward. - -  Relation R = consume_and_regurgitate(S); -  assert(!R.is_null()); - -  Rel_Body *r = R.split(); -  r->DNF_to_formula(); -  Formula *f = r->rm_formula(); -  bool need_symbolic_clear = false; -     -  skip_finalization_check++; -  F_Exists *ex = r->add_exists(); -  for(int i = 1; i <= s.size(); i++) { -    if (s[i]->kind() == Global_Var) -      need_symbolic_clear = true; -    s[i]->remap = ex->declare(s[i]->base_name); -  } -  ex->add_child(f); -  skip_finalization_check--; - -  f->remap(); - -  reset_remap_field(s); -  if (need_symbolic_clear) -    r->Symbolic.clear(); - -  R.finalize(); -  return R; -} - -Relation Project(NOT_CONST Relation &S, int pos, Var_Kind vkind) { -  Variable_ID v = 0; // shut the compiler up -  switch (vkind) { -  case Input_Var: -    v = input_vars[pos]; -    break; -  case Output_Var: -    v = output_vars[pos]; -    break; -  // case Set_Var: -  //   v = set_vars[pos]; -  //   break; -  default: -    assert(0); -  } -     -  return Project(S, v); -} - -Relation Project(NOT_CONST Relation &S, Variable_ID v) { -  Tuple<Variable_ID> s; -  s.append(v); -  return Project(S, s); -} -   -// -// Variables in DNF of map_rel reference declarations of map_rel (or not). -// remap_DNF_vars makes them to reference declarations of ref_rel. -// Ref_rel can get new global variable declarations in the process. -// -void remap_DNF_vars(Rel_Body *map_rel, Rel_Body *ref_rel) { -  // skip_set_checks++; -  assert (map_rel->simplified_DNF); -  assert (ref_rel->simplified_DNF); - -  // skip_set_checks++; - -  for(DNF_Iterator pd(map_rel->simplified_DNF); pd.live(); pd.next()) { -    Conjunct *cc = pd.curr(); -    Variable_ID_Tuple &mvars = cc->mappedVars; -    for(Variable_Iterator mvarsIter=mvars; mvarsIter; mvarsIter++) { -      Variable_ID v = *mvarsIter; -      switch(v->kind()) { -      case Input_Var: -        assert(ref_rel->n_inp() >= v->get_position()); -        break; -      case Output_Var: -        assert(ref_rel->n_out() >= v->get_position()); -        break; -      case Global_Var: -        // The assignment is a noop, but tells ref_rel that the global may be -        // used inside it, which is required. -        *mvarsIter = ref_rel->get_local(v->get_global_var(),v->function_of()); -        break; -      case Wildcard_Var: -        break; -      default: -        assert(0 && "bad variable kind"); -      } -    } -  } -  // skip_set_checks--; -} - - -Relation projectOntoJust(Relation R, Variable_ID v) { -  // skip_set_checks++; -     -  int ivars = R.n_inp(), ovars = R.n_out(); -  int ex_ivars= 0, ex_ovars = 0; -     -  assert(v->kind() == Input_Var || v->kind() == Output_Var); -  if (v->kind() == Input_Var) { -    ex_ivars = 1; -    R = Extend_Domain(R,1); -  } -  else { -    ex_ovars = 1; -    R = Extend_Range(R,1); -  } - -  // Project everything except v -  Mapping m(ivars+ex_ivars,ovars+ex_ovars); -  int j; -  for(j = 1; j <=ivars+ex_ivars; j++) m.set_map_in(j, Exists_Var, j); -  for(j = 1; j <=ovars+ex_ovars; j++) m.set_map_out(j, Exists_Var, j+ivars+ex_ivars); -  m.set_map(v->kind(), v->get_position(), v->kind(), v->get_position()); - -  MapRel1(R, m, Comb_Id,-1,-1); -  R.finalize(); -  // skip_set_checks--; -  return R; -} - -//static  -//void copyEQtoGEQ(GEQ_Handle &g, const EQ_Handle &e, bool negate) { -//extern void copy_constraint(Constraint_Handle H, Constraint_Handle initial); -//    copy_constraint(g, e); -//} - - -Relation EQs_to_GEQs(NOT_CONST Relation &S, bool excludeStrides) { -  Relation R = consume_and_regurgitate(S); -  assert(R.is_simplified()); -  use_ugly_names++; -  for (DNF_Iterator s(R.query_DNF()); s.live(); s.next()) -    s.curr()->convertEQstoGEQs(excludeStrides); -  use_ugly_names--; -  return R; -} - - -// Tuple to find values for is input+output -Relation Symbolic_Solution(NOT_CONST Relation &R) { -  Relation S = consume_and_regurgitate(R); -  Tuple<Variable_ID> vee; -  // skip_set_checks++; -  int i; -  for(i = 1; i <= S.n_inp(); i++) vee.append(input_var(i)); -  for(i = 1; i <= S.n_out(); i++) vee.append(output_var(i)); -  // skip_set_checks--; - -  return Solution(S, vee); -} - - -// Tuple to find values for is given as arg, plus input and output -Relation Symbolic_Solution(NOT_CONST Relation &R, Sequence<Variable_ID> &for_these){ -  Relation S = consume_and_regurgitate(R); -  Tuple<Variable_ID> vee; -  // skip_set_checks++; -  int i; -  for(Any_Iterator<Variable_ID> it(for_these); it; it++) -    vee.append(*it); -  for(i = 1; i <= S.n_inp(); i++) vee.append(input_var(i)); -  for(i = 1; i <= S.n_out(); i++) vee.append(output_var(i)); -  // skip_set_checks--; - -  return Solution(S, vee); -} - - -// Tuple to find values for is input+output+global_decls -Relation Sample_Solution(NOT_CONST Relation &R) { -  Relation S = consume_and_regurgitate(R); - -  Tuple<Variable_ID> vee; - -  // skip_set_checks++; -  int i; -  for(i = 1; i <= S.global_decls()->size(); i++) -    vee.append((*S.global_decls())[i]); -  for(i = 1; i <= S.n_inp(); i++) vee.append(input_var(i)); -  for(i = 1; i <= S.n_out(); i++) vee.append(output_var(i)); -  // skip_set_checks--; - -  return Solution(S,vee); -} - - -// Tuple to find values is given as arg -Relation Solution(NOT_CONST Relation &S, Sequence<Variable_ID> &for_these ) { -  Relation R = consume_and_regurgitate(S); -  if (R.is_null()) -    return R; -   -  //assert(!R.is_null()); - -  if(!R.is_upper_bound_satisfiable()) { -    return Relation::False(R); -  } -     -  bool inexactAnswer=false; -  if(R.is_inexact()) { -    if(R.is_lower_bound_satisfiable()) -      R = Lower_Bound(R); // a solution to LB is a solution to the relation -    else { -      // A solution to the UB may not be a solution to the relation: -      // There may be a solution which satisfies all known constraints, but -      // we have no way of knowing if it satisifies the unknown constraints. -      inexactAnswer = true; -      R = Upper_Bound(R); -    } -  } - -  Sequence<Variable_ID> &vee = for_these; -  for (DNF_Iterator di(R.query_DNF()); di; di++) {       -    Relation current(R, *di); -    int i; -    for(i = vee.size()-1; i >= 0; i--) { -      bool some_constraints = false, one_stride = false; -  -      int current_var = vee.size()-i; -      Section<Variable_ID> s(&vee,current_var+1,i);  - -      // Query variable in vee[current_var] -      Relation projected = Project(copy(current), s); - -    retry_solution:     -      assert(projected.has_single_conjunct()); -      DNF_Iterator one = projected.query_DNF(); - -      // Look for candidate EQ's -      EQ_Handle stride; -      EQ_Iterator ei(*one); -      for(; ei; ei++) { -        if((*ei).get_coef(vee[current_var]) != 0) { -          if(!Constr_Vars_Iter(*ei,true).live()) { // no wildcards -            some_constraints = true; -            // Add this constraint to the current as an EQ -            current.and_with_EQ(*ei); -            break; -          } -          else { -            one_stride = !one_stride && !some_constraints; -            stride = *ei; -          } -        } -      } -      if(ei)  -        continue; // Found an EQ, skip to next variable -      else if (one_stride && !some_constraints) {  -        // if unconstrained except for a stride, pick stride as value -        Constr_Vars_Iter cvi(stride,true); -        assert(cvi.live()); -        cvi++; -        if(!cvi) {  // Just one existentially quantified variable -          Relation current_copy = current; -          EQ_Handle eh = current_copy.and_with_EQ(); -          for(Constr_Vars_Iter si = stride; si; si++) -            if((*si).var->kind() != Wildcard_Var){ -              // pick "0" for wildcard, don't set its coef -              eh.update_coef((*si).var, (*si).coef); -            } -          eh.update_const(stride.get_const()); -          if(current_copy.is_upper_bound_satisfiable()){ -            current = current_copy; -            continue; // skip to next var -          } -        } -        some_constraints = true; // count the stride as a constraint -      } - -      // Can we convert a GEQ? -      GEQ_Iterator gi(*one); -      for(; gi; gi++) { -        if((*gi).get_coef(vee[current_var]) != 0) { -          some_constraints = true; -          if(!Constr_Vars_Iter(*gi,true).live()) { // no wildcards -            Relation current_copy = current; -            // Add this constraint to the current as an EQ & test -            current_copy.and_with_EQ(*gi); -            if (current_copy.is_upper_bound_satisfiable()) { -              current = current_copy; -              break; -            } -          } -        } -      } -      if (gi) continue; // Turned a GEQ into EQ, skip to next - -      // Remove wildcards, try try again -      Relation approx = Approximate(copy(projected)); -      assert(approx.has_single_conjunct()); -      DNF_Iterator d2 = approx.query_DNF(); -     -      EQ_Iterator ei2(*d2); -      for(; ei2; ei2++) { -        if((*ei2).get_coef(vee[current_var]) != 0) { -          some_constraints = true; -          assert(!Constr_Vars_Iter(*ei2,true).live()); // no wildcards -          Relation current_copy = current; -          // Add this constraint to the current as an EQ & test -          current_copy.and_with_EQ(*ei2); -          if (current_copy.is_upper_bound_satisfiable()) { -            current = current_copy; -            break; -          } -        } -      } -      if(ei2) continue; // Found an EQ, skip to next variable - -      GEQ_Iterator gi2(*d2); -      for(; gi2; gi2++) { -        if((*gi2).get_coef(vee[current_var]) != 0) { -          some_constraints = true; -          assert(!Constr_Vars_Iter(*gi2,true).live()); // no wildcards -          Relation current_copy = current; -          // Add this constraint to the current as an EQ & test -          current_copy.and_with_EQ(*gi2); -          if (current_copy.is_upper_bound_satisfiable()) { -            current = current_copy; -            break; -          } -        } -      } -      if(gi2) continue; -  -      if(!some_constraints) { // No constraints on this variable were found -        EQ_Handle e = current.and_with_EQ(); -        e.update_const(-42);  // Be creative -        e.update_coef(vee[current_var], 1); -        continue; -      } -      else { // What to do? Find a wildcard to discard -        Variable_ID wild = NULL; -       -        for (GEQ_Iterator gi(*one); gi; gi++) -          if ((*gi).get_coef(vee[current_var]) != 0 && (*gi).has_wildcards()) { -            Constr_Vars_Iter cvi(*gi, true); -            wild = (*cvi).var; -            break; -          } -        if (wild == NULL) -          for (EQ_Iterator ei(*one); ei; ei++) -            if ((*ei).get_coef(vee[current_var]) != 0 && (*ei).has_wildcards()) { -              Constr_Vars_Iter cvi(*ei, true); -              wild = (*cvi).var; -              break; -            } - -        if (wild != NULL) { -          // skip_set_checks++; -           -          Relation R2; -          { -            Tuple<Relation> r(1); -            r[1] = projected; -            Tuple<std::map<Variable_ID, std::pair<Var_Kind, int> > > mapping(1); -            mapping[1][wild] = std::make_pair(vee[current_var]->kind(), vee[current_var]->get_position()); -            mapping[1][vee[current_var]] = std::make_pair(Exists_Var, 1); -            Tuple<bool> inverse(1); -            inverse[1] = false; -            R2 = merge_rels(r, mapping, inverse, Comb_And); -          } - -          Variable_ID R2_v; -          switch (vee[current_var]->kind()) { -          // case Set_Var: -          case Input_Var: { -            int pos = vee[current_var]->get_position(); -            R2_v = R2.input_var(pos); -            break; -          } -          case Output_Var: { -            int pos = vee[current_var]->get_position(); -            R2_v = R2.output_var(pos); -            break; -          } -          case Global_Var: { -            Global_Var_ID g = vee[current_var]->get_global_var(); -            if (g->arity() == 0) -              R2_v = R2.get_local(g); -            else -              R2_v = R2.get_local(g, vee[current_var]->function_of()); -          } -          default: -            assert(0); -          } - -          Relation S2; -          { -            Tuple<Variable_ID> vee; -            vee.append(R2_v); -            S2 = Solution(R2, vee); -          } - -          Variable_ID S2_v; -          switch (vee[current_var]->kind()) { -          // case Set_Var: -          case Input_Var: { -            int pos = vee[current_var]->get_position(); -            S2_v = S2.input_var(pos); -            break; -          } -          case Output_Var: { -            int pos = vee[current_var]->get_position(); -            S2_v = S2.output_var(pos); -            break; -          } -          case Global_Var: { -            Global_Var_ID g = vee[current_var]->get_global_var(); -            if (g->arity() == 0) -              S2_v = S2.get_local(g); -            else -              S2_v = S2.get_local(g, vee[current_var]->function_of()); -          } -          default: -            assert(0); -          } - -          Relation R3; -          { -            Tuple<Relation> r(2); -            r[1] = projected; -            r[2] = S2; -            Tuple<std::map<Variable_ID, std::pair<Var_Kind, int> > > mapping(2); -            mapping[1][wild] = std::make_pair(Exists_Var, 1); -            mapping[2][S2_v] = std::make_pair(Exists_Var, 1); -            Tuple<bool> inverse(2); -            inverse[1] = inverse[2] = false; -            R3 = merge_rels(r, mapping, inverse, Comb_And); -          } - -          // skip_set_checks--; -           -          if (R3.is_upper_bound_satisfiable()) { -            projected = R3; -            goto retry_solution; -          } -        } -      } - -      // If we get here, we failed to find a suitable constraint for -      // this variable at this conjunct, look for another conjunct. -      break; -    } -     -    if (i < 0) {  // solution found -      if(inexactAnswer) -        current.and_with_and()->add_unknown(); -      current.finalize(); -      return current; -    } -  } -   -  // No solution found for any conjunct, we bail out. -  fprintf(stderr,"Couldn't find suitable constraint for variable\n"); -  return Relation::Unknown(R);   -} - - -Relation Approximate(NOT_CONST Relation &input_R, bool strides_allowed) { -  Relation R = consume_and_regurgitate(input_R); -  if (R.is_null()) -    return R; -   -  // assert(!R.is_null()); -  Rel_Body *r = R.split(); - -  // approximate can be used to remove lambda variables from farkas, -  // so be careful not to invoke simplification process for integers. -  r->simplify(-1,-1); - -  if (pres_debug) { -    fprintf(DebugFile,"Computing approximation "); -    if (strides_allowed) fprintf(DebugFile,"with strides allowed "); -    fprintf(DebugFile,"[ \n"); -    r->prefix_print(DebugFile); -  } - -  use_ugly_names++;  -  for (DNF_Iterator pd(r->simplified_DNF); pd.live(); ) { -    Conjunct *C = pd.curr(); -    pd.next(); - -    for(int i = 0; i < C->problem->nGEQs; i++)  -      C->problem->GEQs[i].touched = 1; - -    C->reorder(); -    if(C->problem->simplifyApproximate(strides_allowed)==0) { -      r->simplified_DNF->rm_conjunct(C); -      delete C; -    } -    else { -      C->simplifyProblem(1,0,1); -     -      free_var_decls(C->myLocals);  C->myLocals.clear(); -    -      Problem *p = C->problem; -      Variable_ID_Tuple new_mapped(0);  // This is expanded by "append" -      for (int i = 1; i <= p->safeVars; i++) { -        // what is now in column i used to be in column p->var[i] -        Variable_ID v = C->mappedVars[p->var[i]]; -        assert (v->kind() != Wildcard_Var); -        new_mapped.append(v); -      } -      assert(strides_allowed || C->problem->nVars == C->problem->safeVars); -      C->mappedVars = new_mapped;   -      for (int i = p->safeVars+1; i <= p->nVars; i++) { -        Variable_ID v = C->declare(); -        C->mappedVars.append(v); -      } - -    -      // reset var and forwarding address if desired. -      p->variablesInitialized = 0; -      for(int i = 1; i < C->problem->nVars; i++) -        C->problem->var[i] = C->problem->forwardingAddress[i] = i; -    } -  } -  -  if (pres_debug)  -    fprintf(DebugFile,"] done Computing approximation\n"); -  use_ugly_names--;  -  return R; -} - - -Relation Lower_Bound(NOT_CONST Relation &r) { -  Relation s = consume_and_regurgitate(r); -  s.interpret_unknown_as_false(); -  return s; -} - - -Relation Upper_Bound(NOT_CONST Relation &r) { -  Relation s = consume_and_regurgitate(r); -  s.interpret_unknown_as_true(); -  return s; -} - - -bool operator==(const Relation &, const Relation &) {  -  assert(0 && "You rilly, rilly don't want to do this.\n"); -  abort(); -  return false; -} - - -namespace { // supporting stuff for MapRel1 and MapAndCombine2 -  // Determine if a mapping requires an f_exists node -  bool has_existentials(const Mapping &m) {  -    for(int i=1;i<=m.n_in();  i++)  -      if (m.get_map_in_kind(i) == Exists_Var) return true; -    for(int j=1;j<=m.n_out(); j++)  -      if (m.get_map_out_kind(j) == Exists_Var) return true; -    return false; -  } - -  void get_relation_arity_from_one_mapping(const Mapping &m1, -                                                  int &in_req, int &out_req) { -    int j, i; -    in_req = 0; out_req = 0; -    for(i = 1;  i <= m1.n_in();  i++) { -      j = m1.get_map_in_pos(i); -      switch(m1.get_map_in_kind(i)) { -      case Input_Var:  in_req = max(in_req, j);   break; -      // case Set_Var:  in_req = max(in_req, j);   break; -      case Output_Var: out_req = max(out_req, j); break; -      default: break; -      } -    } -    for(i = 1;  i <= m1.n_out();  i++) { -      j = m1.get_map_out_pos(i); -      switch(m1.get_map_out_kind(i)) { -      case Input_Var:  in_req = max(in_req, j);   break; -      // case Set_Var:  in_req = max(in_req, j);   break; -      case Output_Var: out_req = max(out_req, j); break; -      default: break; -      } -    } -  } - -  // Scan mappings to see how many input and output variables they require.  -  void get_relation_arity_from_mappings(const Mapping &m1, -                                               const Mapping &m2, -                                               int &in_req, int &out_req) { -    int inreq1, inreq2, outreq1, outreq2; -    get_relation_arity_from_one_mapping(m1, inreq1, outreq1); -    get_relation_arity_from_one_mapping(m2, inreq2, outreq2); -    in_req = max(inreq1, inreq2); -    out_req = max(outreq1, outreq2); -  } -} - - -// -// Build lists of variables that need to be replaced in the given  -// Formula.  Declare globals in new relation.  Then call -// map_vars to do the replacements. -// -// Obnoxiously many arguments here: -// Relation arguments contain declarations of symbolic and in/out vars. -// F_Exists argument is where needed existentially quant. vars can be decl. -// -// Mapping specifies how in/out vars are mapped -// Two lists are required to be able to map in/out variables from the first -// and second relations to the same existentially quantified variable. -// -void align(Rel_Body *originalr, Rel_Body *newr, F_Exists *fe, -           Formula *f, const Mapping &mapping, bool &newrIsSet, -           List<int> &seen_exists, Variable_ID_Tuple &seen_exists_ids) { -  int i, cur_ex = 0;  // initialize cur_ex to shut up the compiler - -  f->set_relation(newr);  // Might not need to do this anymore, if bugs were fixed -  int input_remapped = 0; -  int output_remapped = 0; -  int sym_remapped = 0; -  // skip_set_checks++; - -  Variable_ID new_var; -  Const_String new_name; -  int new_pos; - -  // MAP old input variables by setting their remap fields  -  for(i = 1; i <= originalr->n_inp(); i++) {  -    Variable_ID this_var = originalr->input_var(i), New_E; -    Const_String this_name = originalr->In_Names[i]; - -    switch (mapping.get_map_in_kind(i)) { -    case Input_Var: -    // case Set_Var: -      // if (mapping.get_map_in_kind(i) == Set_Var) -      //   newrIsSet = true;  // Don't mark it just yet; we still need to  -      // // refer to its "input" vars internally - -      // assert((newrIsSet && mapping.get_map_in_kind(i) == Set_Var) -      //        || ((!newrIsSet &&mapping.get_map_in_kind(i) == Input_Var))); - -      new_pos = mapping.get_map_in_pos(i); -      new_var = newr->input_var(new_pos); -      if (this_var != new_var) { -        input_remapped = 1; -        this_var->remap = new_var; -      } -      new_name = newr->In_Names[new_pos]; -      if (!this_name.null()) {                 // should we name this? -        if (!new_name.null()) {            // already named, anonymize -          if (new_name != this_name) -            newr->name_input_var(new_pos, Const_String()); -        } -        else -          newr->name_input_var(new_pos, this_name); -      } -      break; -    case Output_Var: -      assert(!newr->is_set()); -      input_remapped = 1; -      new_pos = mapping.get_map_in_pos(i); -      this_var->remap = new_var = newr->output_var(new_pos); -      new_name = newr->Out_Names[new_pos]; -      if (!this_name.null()) {  -        if (!new_name.null()) {             // already named, anonymize -          if (new_name != this_name) -            newr->name_output_var(new_pos, Const_String()); -        } -        else -          newr->name_output_var(new_pos, this_name); -      } -      break; -    case Exists_Var: -      input_remapped = 1; -      // check if we have declared it, use that if so. -      // create it if not.   -      if (mapping.get_map_in_pos(i) <= 0 || -          (cur_ex = seen_exists.index(mapping.get_map_in_pos(i))) == 0){ -        if (!this_name.null()) -          New_E = fe->declare(this_name); -        else -          New_E = fe->declare(); -        this_var->remap = New_E; -        if (mapping.get_map_in_pos(i) > 0) { -          seen_exists.append(mapping.get_map_in_pos(i)); -          seen_exists_ids.append(New_E); -        } -      } -      else { -        this_var->remap = new_var = seen_exists_ids[cur_ex]; -        if (!this_name.null()) {  // Have we already assigned a name? -          if (!new_var->base_name.null()) { -            if (new_var->base_name != this_name) -              new_var->base_name = Const_String(); -          } -          else { -            new_var->base_name = this_name; -            assert(!this_name.null()); -          } -        } -      } -      break; -    default: -      assert(0 && "Unsupported var type in MapRel2"); -      break; -    } -  } - -  //  MAP old output variables. -  for(i = 1; i <= originalr->n_out(); i++) {    -    Variable_ID this_var = originalr->output_var(i), New_E; -    Const_String this_name = originalr->Out_Names[i]; - -    switch (mapping.get_map_out_kind(i)) { -    case Input_Var: -    // case Set_Var: -      // if (mapping.get_map_out_kind(i) == Set_Var) -      //   newrIsSet = true;  // Don't mark it just yet; we still need to refer to its "input" vars internally -   -      // assert((newrIsSet && mapping.get_map_out_kind(i) == Set_Var) -      //        ||((!newrIsSet &&mapping.get_map_out_kind(i) == Input_Var))); - -      output_remapped = 1; -      new_pos = mapping.get_map_out_pos(i); -      this_var->remap = new_var = newr->input_var(new_pos); -      new_name = newr->In_Names[new_pos]; -      if (!this_name.null()) { -        if (!new_name.null()) {    // already named, anonymize -          if (new_name != this_name) -            newr->name_input_var(new_pos, Const_String()); -        } -        else -          newr->name_input_var(new_pos, this_name); -      } -      break; -    case Output_Var: -      assert(!newr->is_set()); -      new_pos = mapping.get_map_out_pos(i); -      new_var = newr->output_var(new_pos); -      if (new_var != this_var) { -        output_remapped = 1; -        this_var->remap = new_var; -      } -      new_name = newr->Out_Names[new_pos]; -      if (!this_name.null()) { -        if (!new_name.null()) {    // already named, anonymize -          if (new_name != this_name) -            newr->name_output_var(new_pos, Const_String()); -        } -        else -          newr->name_output_var(new_pos, this_name); -      } -      break; -    case Exists_Var: -      // check if we have declared it, create it if not.   -      output_remapped = 1; -      if (mapping.get_map_out_pos(i) <= 0 || -          (cur_ex = seen_exists.index(mapping.get_map_out_pos(i))) == 0) {   // Declare it. -        New_E = fe->declare(this_name); -        this_var->remap = New_E; -        if (mapping.get_map_out_pos(i) > 0) { -          seen_exists.append(mapping.get_map_out_pos(i)); -          seen_exists_ids.append(New_E); -        } -      } -      else { -        this_var->remap = new_var = seen_exists_ids[cur_ex]; -        if (!this_name.null()) { -          if (!new_var->base_name.null()) { -            if (new_var->base_name != this_name) -              new_var->base_name = Const_String();  -          } -          else { -            new_var->base_name = this_name; -          } -        } -      } -      break; -    default: -      assert(0 &&"Unsupported var type in MapRel2"); -      break; -    } -  } - -  Variable_ID_Tuple *oldSym = originalr->global_decls(); -  for(i=1; i<=(*oldSym).size(); i++) { -    Variable_ID v = (*oldSym)[i]; -    assert(v->kind()==Global_Var); -    if (v->get_global_var()->arity() > 0) { -      Argument_Tuple new_of = v->function_of(); -      if (!leave_pufs_untouched)  -        new_of = mapping.get_tuple_fate(new_of, v->get_global_var()->arity()); -      if (new_of == Unknown_Tuple) { -        // hopefully v is not really used -        // if we get here, f should have been in DNF, -        //                 now an OR node with conjuncts below -        // we just need to check that no conjunct uses v -#if ! defined NDEBUG -        if (f->node_type() == Op_Conjunct) { -          assert(f->really_conjunct()->mappedVars.index(v)==0 -                 && "v unused"); -        } -#if 0 -        else { -          // assert(f->node_type() == Op_Or); -          for (List_Iterator<Formula *> conj(f->children()); conj; conj++) { -            assert((*conj)->really_conjunct()->mappedVars.index(v)==0 -                   && "v unused"); -          } -        } -#endif -#endif -        // since its not really used, don't bother adding it to -        // the the global_vars list of the new relation -        continue; -      } -      if (v->function_of() != new_of) { -        Variable_ID new_v=newr->get_local(v->get_global_var(),new_of); -        assert(v != new_v); -        v->remap = new_v; -        sym_remapped = 1; -      } -      else { -        // add symbolic to symbolic list -#if ! defined NDEBUG -        Variable_ID new_v = -#endif -          newr->get_local(v->get_global_var(), v->function_of()); -#if ! defined NDEBUG -        assert(v == new_v); -#endif -      } -    } -    else { -      // add symbolic to symbolic list -#if ! defined NDEBUG -      Variable_ID new_v = -#endif -        newr->get_local(v->get_global_var()); -#if ! defined NDEBUG -      assert(v == new_v); -#endif -    } -  } - -  if (sym_remapped || input_remapped || output_remapped) { -    f->remap(); - -    // If 2 vars mapped to same variable, combine them -    //There's a column to combine only when there are two equal remap fields. -    Tuple<Variable_ID> vt(0); -    bool combine = false; -    Tuple_Iterator<Variable_ID> t(input_vars); -    for(i=1; !combine && i<=originalr->n_inp(); t++, i++) -      if (vt.index((*t)->remap)) -        combine = true; -      else -        vt.append((*t)->remap); -    Tuple_Iterator<Variable_ID> t2(output_vars); -    for(i=1; !combine && i <= originalr->n_out(); t2++, i++) -      if (vt.index((*t2)->remap)) -        combine = true; -      else -        vt.append((*t2)->remap); -    if (combine) f->combine_columns();  - -    if (sym_remapped)  -      reset_remap_field(originalr->Symbolic); -    if (input_remapped)  -      reset_remap_field(input_vars,originalr->n_inp()); -    if (output_remapped)  -      reset_remap_field(output_vars,originalr->n_out()); -  } - -  // skip_set_checks--; - -#ifndef NDEBUG -  if (fe) -    foreach(v,Variable_ID,fe->myLocals,assert(v == v->remap)); -#endif -} - - -// MapRel1, MapAndCombineRel2 can be replaced by merge_rels -void MapRel1(Relation &R, const Mapping &map, Combine_Type ctype, -             int number_input, int number_output, -             bool invalidate_resulting_leading_info, -             bool finalize) { -#if defined(INCLUDE_COMPRESSION) -  assert(!R.is_compressed()); -#endif -  assert(!R.is_null()); -    -  Relation inputRel = R;  -  R = Relation(); -  Rel_Body *inputRelBody = inputRel.split(); - -  int in_req=0, out_req=0; -  get_relation_arity_from_one_mapping(map, in_req, out_req); - -  R = Relation(number_input == -1 ? in_req : number_input, -               number_output == -1 ? out_req : number_output); - -  Rel_Body *outputRelBody = R.split(); - -  inputRelBody->DNF_to_formula(); -  Formula *f1 = inputRelBody->rm_formula(); - -  F_Exists *fe; -  Formula *f; -  if (has_existentials(map)) { -    f = fe = outputRelBody->add_exists(); -  } -  else { -    fe = NULL; -    f = outputRelBody; -  } -  and_below_exists = NULL; -  if (finalize) and_below_exists = NULL; -  else f = and_below_exists = f->add_and(); -  if(ctype == Comb_AndNot) { -    f = f->add_not(); -  } -  f->add_child(f1); - -  exists_ids.clear(); -  exists_numbers.clear(); - -  bool returnAsSet=false; -  align(inputRelBody, outputRelBody, fe, f1, map, returnAsSet, -        exists_numbers, exists_ids); - -  if (returnAsSet ||  -      (inputRelBody->is_set() && outputRelBody->n_out() == 0)) { -    R.markAsSet(); -    R.invalidate_leading_info(); // nonsensical for a set -  } - -  if (finalize) R.finalize(); -  inputRel = Relation(); -  if (invalidate_resulting_leading_info) -    R.invalidate_leading_info(); -} - - -Relation MapAndCombineRel2(Relation &R1, Relation &R2, const Mapping &mapping1, -                           const Mapping &mapping2, Combine_Type ctype, -                           int number_input, int number_output) { -#if defined(INCLUDE_COMPRESSION) -  assert(!R1.is_compressed()); -  assert(!R2.is_compressed()); -#endif -  assert(!R1.is_null() && !R2.is_null()); -  Rel_Body *r1 = R1.split(); -  Rel_Body *r2 = R2.split(); -     -  int in_req, out_req;      // Create the new relation -  get_relation_arity_from_mappings(mapping1, mapping2, in_req, out_req); -  Relation R3(number_input == -1 ? in_req : number_input, -              number_output == -1 ? out_req : number_output); -  Rel_Body *r3 = R3.split();  // This is just to get the pointer, it's cheap - -  /* permit the add_{exists,and} below, reset after they are done.*/ -  skip_finalization_check++; -     -  F_Exists *fe = NULL; -  Formula *f; -  if (has_existentials(mapping1) || has_existentials(mapping2)) { -    fe = r3->add_exists(); -    f = fe; -  } -  else { -    f = r3; -  }  - -  r1->DNF_to_formula(); -  Formula *f1 = r1->rm_formula(); -  r2->DNF_to_formula(); -  Formula *f2 = r2->rm_formula(); - -  // align: change r1 vars to r3 vars in formula f1 via map mapping1, -  //        declaring needed exists vars in F_Exists *fe -  // Also maps symbolic variables appropriately, sets relation ptrs in f1. -  // In order to map variables of both relations to the same variables, -  // we keep a list of new existentially quantified vars between calls. -  // returnAsSet means mark r3 as set before return.  Don't mark it yet, -  // because internally we need to refer to "input_vars" of a set, and that -  // would blow assertions. - -  bool returnAsSet=false; -  exists_ids.clear(); -  exists_numbers.clear(); -  align(r1, r3, fe, f1, mapping1, returnAsSet, exists_numbers, exists_ids); -  // align: change r2 vars to r3 vars in formula f2 via map mapping2 -  align(r2, r3, fe, f2, mapping2, returnAsSet, exists_numbers, exists_ids); - -  switch (ctype) { -  case Comb_Or: -    if(f1->node_type() == Op_Or) { -      f->add_child(f1);  -      f = f1; -    } -    else { -      f = f->add_or(); -      f->add_child(f1);  -    } -    break; -  case Comb_And: -  case Comb_AndNot: -    if(f1->node_type() == Op_And) { -      f->add_child(f1);  -      f = f1; -    } -    else { -      f = f->add_and(); -      f->add_child(f1);  -    } -    break; -  default: -    assert(0 && "Invalid combine type in MapAndCombineRel2"); -  } - -  Formula *c2; -  if (ctype==Comb_AndNot) { -    c2 = f->add_not(); -  } -  else { -    c2 = f; -  } -  c2->add_child(f2); - -  skip_finalization_check--;     /* Set this back for return */ -  R3.finalize();  - -  if (returnAsSet || -      (R1.is_set() && R2.is_set() && R3.n_inp() >= 0 && R3.n_out() == 0)){ -    R3.markAsSet(); -    R3.invalidate_leading_info(); -  } -  R1 = Relation(); -  R2 = Relation(); -  return R3; -} - - -// -// Scramble each relation's variables and merge these relations -// together. Support variable mapping to and from existentials. -// Unspecified variables in mapping are mapped to themselves by -// default. It intends to replace MapRel1 and MapAndCombineRel2 -// functions (the time saved by grafting formula tree might be -// neglegible when compared to the simplification cost). -// -Relation merge_rels(Tuple<Relation> &R, const Tuple<std::map<Variable_ID, std::pair<Var_Kind, int> > > &mapping, const Tuple<bool> &inverse, Combine_Type ctype, int number_input, int number_output) { -  const int m = R.size(); -  assert(mapping.size() == m && inverse.size() == m); -  // skip_set_checks++; -   -  // if new relation's arity is not given, calculate it on demand -  if (number_input == -1) { -    number_input = 0; -    for (int i = 1; i <= m; i++) { -      for (int j = R[i].n_inp(); j >= 1; j--) { -        Variable_ID v = R[i].input_var(j); -        std::map<Variable_ID, std::pair<Var_Kind, int> >::const_iterator p = mapping[i].find(v); -        if (p == mapping[i].end()) { -          number_input = j; -          break; -        } -      } -       -      for (std::map<Variable_ID, std::pair<Var_Kind, int> >::const_iterator j = mapping[i].begin(); j != mapping[i].end(); j++) { -        if ((*j).second.first == Input_Var || (*j).second.first == Set_Var) -          number_input = max(number_input, (*j).second.second); -      } -    } -  } - -  if (number_output == -1) { -    number_output = 0; -    for (int i = 1; i <= m; i++) { -      for (int j = R[i].n_out(); j >= 1; j--) { -        Variable_ID v = R[i].output_var(j); -        std::map<Variable_ID, std::pair<Var_Kind, int> >::const_iterator p = mapping[i].find(v); -        if (p == mapping[i].end()) { -          number_output = j; -          break; -        } -      } -      for (std::map<Variable_ID, std::pair<Var_Kind, int> >::const_iterator j = mapping[i].begin(); j != mapping[i].end(); j++) { -        if ((*j).second.first == Output_Var) -          number_output = max(number_output, (*j).second.second); -      } -    } -  } - -  Relation R2(number_input, number_output); -  F_Exists *fe = R2.add_exists(); -  Formula *f_root; -  switch (ctype) { -  case Comb_And: -    f_root = fe->add_and(); -    break; -  case Comb_Or: -    f_root = fe->add_or(); -    break; -  default: -    assert(0);  // unsupported merge type -  } -   -  std::map<int, Variable_ID> seen_exists_by_num; -  std::map<Variable_ID, Variable_ID> seen_exists_by_id; - -  for (int i = 1; i <= m; i++) { -    F_Or *fo; -    if (inverse[i]) -      fo = f_root->add_not()->add_or(); -    else -      fo = f_root->add_or(); - -    for (DNF_Iterator di(R[i].query_DNF()); di; di++) { -      F_And *f = fo->add_and(); - -      for (GEQ_Iterator gi(*di); gi; gi++) { -        GEQ_Handle h = f->add_GEQ(); -        for (Constr_Vars_Iter cvi(*gi); cvi; cvi++) { -          Variable_ID v = cvi.curr_var(); -          std::map<Variable_ID, std::pair<Var_Kind, int> >::const_iterator p = mapping[i].find(v); -          if (p == mapping[i].end()) { -            switch (v->kind()) { -            // case Set_Var: -            case Input_Var: { -              int pos = v->get_position(); -              h.update_coef(R2.input_var(pos), cvi.curr_coef()); -              break; -            } -            case Output_Var: { -              int pos = v->get_position(); -              h.update_coef(R2.output_var(pos), cvi.curr_coef()); -              break; -            } -            case Exists_Var: -            case Wildcard_Var: { -              std::map<Variable_ID, Variable_ID>::iterator p2 = seen_exists_by_id.find(cvi.curr_var()); -              Variable_ID e; -              if (p2 == seen_exists_by_id.end()) { -                e = fe->declare(); -                seen_exists_by_id[cvi.curr_var()] = e; -              } -              else -                e = (*p2).second; -              h.update_coef(e, cvi.curr_coef()); -              break; -            } -            case Global_Var: { -              Global_Var_ID g = v->get_global_var(); -              Variable_ID v2; -              if (g->arity() == 0) -                v2 = R2.get_local(g); -              else -                v2 = R2.get_local(g, v->function_of()); -              h.update_coef(v2, cvi.curr_coef()); -              break; -            } -            default: -              assert(0);  // shouldn't happen if input relations are simplified -            } -          } -          else { -            switch ((*p).second.first) { -            // case Set_Var: -            case Input_Var: { -              int pos = (*p).second.second; -              h.update_coef(R2.input_var(pos), cvi.curr_coef()); -              break; -            } -            case Output_Var: { -              int pos = (*p).second.second; -              h.update_coef(R2.output_var(pos), cvi.curr_coef()); -              break; -            }               -            case Exists_Var: -            case Wildcard_Var: { -              int pos = (*p).second.second; -              std::map<int, Variable_ID>::iterator p2 = seen_exists_by_num.find(pos); -              Variable_ID e; -              if (p2 == seen_exists_by_num.end()) {  -                e = fe->declare(); -                seen_exists_by_num[pos] = e; -              } -              else -                e = (*p2).second; -              h.update_coef(e, cvi.curr_coef()); -              break; -            }           -            default: -              assert(0);  // mapped to unsupported variable type -            } -          } -        } -        h.update_const((*gi).get_const()); -      } - -      for (EQ_Iterator ei(*di); ei; ei++) { -        EQ_Handle h = f->add_EQ(); -        for (Constr_Vars_Iter cvi(*ei); cvi; cvi++) { -          Variable_ID v = cvi.curr_var(); -          std::map<Variable_ID, std::pair<Var_Kind, int> >::const_iterator p = mapping[i].find(v); -          if (p == mapping[i].end()) { -            switch (v->kind()) { -            // case Set_Var: -            case Input_Var: { -              int pos = v->get_position(); -              h.update_coef(R2.input_var(pos), cvi.curr_coef()); -              break; -            } -            case Output_Var: { -              int pos = v->get_position(); -              h.update_coef(R2.output_var(pos), cvi.curr_coef()); -              break; -            } -            case Exists_Var: -            case Wildcard_Var: { -              std::map<Variable_ID, Variable_ID>::iterator p2 = seen_exists_by_id.find(v); -              Variable_ID e; -              if (p2 == seen_exists_by_id.end()) { -                e = fe->declare(); -                seen_exists_by_id[v] = e; -              } -              else -                e = (*p2).second; -              h.update_coef(e, cvi.curr_coef()); -              break; -            } -            case Global_Var: { -              Global_Var_ID g = v->get_global_var(); -              Variable_ID v2; -              if (g->arity() == 0) -                v2 = R2.get_local(g); -              else -                v2 = R2.get_local(g, v->function_of()); -              h.update_coef(v2, cvi.curr_coef()); -              break; -            } -            default: -              assert(0);  // shouldn't happen if input relations are simplified -            } -          } -          else { -            switch ((*p).second.first) { -            // case Set_Var: -            case Input_Var: { -              int pos = (*p).second.second; -              h.update_coef(R2.input_var(pos), cvi.curr_coef()); -              break; -            } -            case Output_Var: { -              int pos = (*p).second.second; -              h.update_coef(R2.output_var(pos), cvi.curr_coef()); -              break; -            } -            case Exists_Var: -            case Wildcard_Var: { -              int pos = (*p).second.second; -              std::map<int, Variable_ID>::iterator p2 = seen_exists_by_num.find(pos); -              Variable_ID e; -              if (p2 == seen_exists_by_num.end()) {  -                e = fe->declare(); -                seen_exists_by_num[pos] = e; -              } -              else -                e = (*p2).second; -              h.update_coef(e, cvi.curr_coef()); -              break; -            }           -            default: -              assert(0);  // mapped to unsupported variable type -            } -          } -        } -        h.update_const((*ei).get_const()); -      } -    } -  } -           -  // skip_set_checks--; - -  if (number_output == 0) { -    R2.markAsSet(); -    // R2.invalidate_leading_info(); -  } -     -  return R2;   -} - -} // namespace diff --git a/omega/omega_lib/src/closure.cc b/omega/omega_lib/src/closure.cc deleted file mode 100644 index 416a3e7..0000000 --- a/omega/omega_lib/src/closure.cc +++ /dev/null @@ -1,2100 +0,0 @@ -/***************************************************************************** - Copyright (C) 1994-2000 the Omega Project Team - Copyright (C) 2005-2011 Chun Chen - Copyright (C) 2009-2011 West Pomeranian University of Technology, Szczecin - All Rights Reserved. - - Purpose: -   All calculations of closure are now here. - - Notes: -   Related paper: - - "Transitive closure of infinite graphs and its applications", - Wayne Kelly, William Pugh, Evan Rosser and Tatiana Shpeisman, IJPP 1996. - - "Computing the Transitive Closure of a Union of Affine Integer Tuple - Relations", Anna Beletska, Denis Barthou, Wlodzimierz Bielecki and - Albert Cohen, COCOA 2009. - - "An Iterative Algorithm of Computing the Transitive Closure of a Union - of Parameterized Affine Integer Tuple Relations", Bielecki Wlodzimierz, - Klimek Tomasz, Palkowski Marek and Anna Beletska, COCOA 2010. - - History: -   12/27/09 move ConicClosure here, Chun Chen -   01/19/11 new closure algorithms, Klimek Tomzsz -   02/02/11 move VennDiagramFrom here, Chun Chen -*****************************************************************************/ - -#include <typeinfo> -#include <assert.h> -#include <omega.h> -#include <omega/hull.h> -#include <basic/Iterator.h> -#include <basic/List.h> -#include <basic/SimpleList.h> - -namespace omega { - -void InvestigateClosure(Relation r, Relation r_closure, Relation bounds); -void print_given_bounds(const Relation & R1, NOT_CONST Relation& input_Bounds); -#define printConjunctClosure   (closure_presburger_debug & 0x1)  -#define detailedClosureDebug   (closure_presburger_debug & 0x2) - - -#ifdef TC_STATS -extern int clock_diff(); -extern void start_clock(); -FILE *statsfile; -int singles, totals=0; -#endif - -int closure_presburger_debug = 0; - - -Relation VennDiagramForm(NOT_CONST Relation &Context_In, -                         Tuple<Relation> &Rs,  -                         int next, -                         bool anyPositives,  -                         int weight) { -  Relation Context = consume_and_regurgitate(Context_In); -  if (hull_debug) { -    fprintf(DebugFile,"[VennDiagramForm, next = %d, anyPositives = %d, weight = %d \n", next,anyPositives,weight); -    fprintf(DebugFile,"context:\n"); -    Context.prefix_print(DebugFile); -  } -  if (anyPositives && weight > 3) { -    Context.simplify(); -    if (!Context.is_upper_bound_satisfiable())  { -      if (hull_debug)  -        fprintf(DebugFile,"] not satisfiable\n"); -      return Context; -    } -    weight = 0; -  } -  if (next > Rs.size()) { -    if (!anyPositives) { -      if (hull_debug)  -        fprintf(DebugFile,"] no positives\n"); -      return Relation::False(Context); -    } -    Context.simplify(); -    if (hull_debug)  { -      fprintf(DebugFile,"] answer is:\n"); -      Context.prefix_print(DebugFile); -    } -    return Context; -  } -  Relation Pos = VennDiagramForm(Intersection(copy(Context),copy(Rs[next])), -                                 Rs, -                                 next+1, -                                 true, -                                 weight+2); -  Relation Neg = VennDiagramForm(Difference(Context,copy(Rs[next])), -                                 Rs, -                                 next+1, -                                 anyPositives, -                                 weight+1); -  if (hull_debug)  { -    fprintf(DebugFile,"] VennDiagramForm\n"); -    fprintf(DebugFile,"pos part:\n"); -    Pos.prefix_print(DebugFile); -    fprintf(DebugFile,"neg part:\n"); -    Neg.prefix_print(DebugFile); -  } -  return Union(Pos,Neg); -} -   - -Relation VennDiagramForm(Tuple<Relation> &Rs, NOT_CONST Relation &Context_In) { -  Relation Context = consume_and_regurgitate(Context_In); -  if (Context.is_null()) Context = Relation::True(Rs[1]); -  if (hull_debug) { -    fprintf(DebugFile,"Starting computation of VennDiagramForm\n"); -    fprintf(DebugFile,"Context:\n"); -    Context.prefix_print(DebugFile); -    for(int i = 1; i <= Rs.size(); i++) { -      fprintf(DebugFile,"#%d:\n",i); -      Rs[i].prefix_print(DebugFile); -    } -  } -  return VennDiagramForm(Context,Rs,1,false,0); -} -  -Relation VennDiagramForm(NOT_CONST Relation &R_In, NOT_CONST Relation &Context_In) { -  Relation R = consume_and_regurgitate(R_In); -  Relation Context = consume_and_regurgitate(Context_In); -  Tuple<Relation> Rs; -  for (DNF_Iterator c(R.query_DNF()); c.live(); ) { -    Rs.append(Relation(R,c.curr())); -    c.next(); -  } -  return VennDiagramForm(Rs,Context); -} - - -Relation ConicClosure (NOT_CONST Relation &R) { -  int n = R.n_inp(); -  if (n != R.n_out()) -    throw std::invalid_argument("conic closure must have the same input arity and output arity"); - -  return DeltasToRelation(ConicHull(Deltas(R)), n, n); -} - - -bool is_lex_forward(Relation R) { -  if(R.n_inp() != R.n_out()) { -    fprintf(stderr, "relation has wrong inputs/outpts\n"); -    exit(1); -  } -  Relation forw(R.n_inp(), R.n_out()); -  F_Or * o = forw.add_or(); -  for(int a = 1; a <= forw.n_inp(); a++) { -    F_And * andd = o->add_and(); -    GEQ_Handle g = andd->add_GEQ(); -    g.update_coef(input_var(a), -1); -    g.update_coef(output_var(a), 1); -    g.update_const(1); -    for(int b = 1; b < a; b++) { -      EQ_Handle e = andd->add_EQ(); -      e.update_coef(input_var(a),1); -      e.update_coef(output_var(a),-1); -    } -  } -  Relation test = Difference(R, forw); -  return !test.is_upper_bound_satisfiable(); -} - - -static Relation compose_n(NOT_CONST Relation &input_r, int n) { -  Relation r = consume_and_regurgitate(input_r); -  if (n == 1) -    return r; -  else -    return Composition(r, compose_n(copy(r), n-1)); -} /* compose_n */ - - - - -Relation approx_closure(NOT_CONST Relation &input_r, int n) { -  Relation r = consume_and_regurgitate(input_r); -  Relation r_closure;  - -  r_closure=r; -  int i; -  for(i=2; i<=n; i++) -    r_closure=Union(r_closure,compose_n(copy(r), n)); -  r_closure = Union(r_closure, Relation::Unknown(r_closure)); -     -  return r_closure; -} /* approx_closure */ - - -static bool is_closure_itself(NOT_CONST Relation &r) { -  return  Must_Be_Subset(Composition(copy(r),copy(r)),copy(r)); -} - - -/***** - * get a D form of the Relation  (single conjunct). - *  D = {[ i_1,i_2,...,i_m] -> [j_1, j_2, ..., j_m ] : - *         (forall p, 1<= p <= m) L_p <= j_p - i_p <= U_p &&  - *      j_p - i_p == M_p alpha_p}; - *  Right now only wildcards that are in stride constraints are treated. - *****/ - -Relation get_D_form (Relation & R) { -  Relation D(R.n_inp(), R.n_out()); -     -  R.make_level_carried_to(R.n_inp()); -  assert(R.has_single_conjunct()); -  int n_zero=0; -  for (DNF_Iterator d(R.query_DNF()); d.live(); d.next()) -    n_zero=d.curr()->query_guaranteed_leading_0s(); -     -  Relation Diff=Deltas(copy(R));  - -  if (detailedClosureDebug) { -    fprintf(DebugFile, "The relation projected onto differencies is:\n"); -    Diff.print_with_subs(DebugFile); -  } - - -  /* now form D */ - -  int i; -  coef_t l,u; -  F_And * N = D.add_and(); -  GEQ_Handle g; -  for (i=1; i<=Diff.n_set(); i++) { -    Diff.query_variable_bounds(Diff.set_var(i), l,u); -/*        if (i== n_zero+1 && l==negInfinity) -          l=1; */ -    if (l!=negInfinity) { -      g=N->add_GEQ(); -      g.update_coef(D.input_var(i),-1); -      g.update_coef(D.output_var(i),1); -      g.update_const(-l); -      g.finalize(); -    } -    if (u!=posInfinity) { -      g=N->add_GEQ(); -      g.update_coef(D.input_var(i),1); -      g.update_coef(D.output_var(i),-1); -      g.update_const(u); -      g.finalize(); -    } -  } - -  /* add all stride constrains if they do exist */ - -  Conjunct *c = Diff.single_conjunct(); - -  if (c->locals().size()>0) {// there are local variables -    // now go through all the equalities -    -    coef_t coef=0; -    int pos=0; -    for (EQ_Iterator eq = c->EQs(); eq.live(); eq.next()) { -      // constraint is in stride form if it has 2 vars,  -      // one of which is wildcard. Count number if vars and wildcard vars -      int nwild=0,nvar=0; -       -      for (Constr_Vars_Iter cvi(*eq, false); cvi; cvi++) { -        if ((*cvi).var->kind() == Global_Var) -          continue; -        else if ((*cvi).var->kind() == Wildcard_Var) { -          coef=(*cvi).coef; -          nwild++; -        } -        else -          pos=(*cvi).var->get_position(); -        nvar++; -      } -      if (nvar==2 && nwild==1) { //stride constraint -        EQ_Handle e=N->add_stride(coef); -        e.update_coef(D.input_var(pos),-1); -        e.update_coef(D.output_var(pos),1); -        e.finalize(); -      } -    } -  } // end search of stride constrains -  -  D.finalize(); -  D.simplify(); -  return D; -}  /* end get_D_form */ - -/**** - * get relation A x A describing a region of domain and range: - *   A=Hull(Domain(R), Range(R)) intersection IterationSpace - *   returns cross product A x A - ***/ - -Relation form_region(const Relation &R, const Relation& IterationSpace) { -  Relation H=Union(Domain(copy(R)), Range(copy(R))); -  H.simplify(1,1); -  H = EQs_to_GEQs(H); -  H=Hull(H); -  Relation A=Intersection(H, copy(IterationSpace)); -  Relation A1=A; -  return Cross_Product(A,A1); -} - -Relation form_region1(const Relation &R, const Relation& IterationSpace) { -  Relation Dom=Intersection(Domain(copy(R)), copy(IterationSpace)); -  Relation Ran=Intersection(Range(copy(R)), copy(IterationSpace)); -  return Cross_Product(Dom,Ran); -} - - -/**** - * Check if we can use D instead of R  - *  i.e.  D intersection (A cross A) is Must_Be_Subset of R - ***/ - -bool isD_OK(Relation &R, Relation &D, Relation &AxA) { -  Relation B=Intersection(copy(D), copy(AxA)); -  B.simplify(); - -  if (detailedClosureDebug) { -    fprintf(DebugFile, "Intersection of D and AxA is:\n"); -    B.print_with_subs(DebugFile); -  }   -  assert (Must_Be_Subset(copy(R),copy(B))); - -  return Must_Be_Subset(B, copy(R)); -} - - - -/**** - * check if the constraint is a stride one. Here we say that an equality - * constraint is a stride constraint if it has exatly one wildcard. - * The function returns number of the wildcards in the constraint. - * So if we know that constraint is from the relation in D form, then - * it cannot have more than 1 wildcard variables, and the result of - * this functions can be treated as bool. - ***/ - -static int is_stride(const EQ_Handle &eq) { -  int n=0; -  -  for (Constr_Vars_Iter cvi(eq,true); cvi; cvi++) -    n++; - -  return n; -} -   - - -/***** - * check if the constraint is in the form i_k' - i_k comp_op  c - * return v - the number of the var and the type of the comp_op: - *  1 - >,  -1 - <, 0  - not in the right form - * if this is equality constraint in the right form any 1 or -1 can be - * returned - ******/ - -static coef_t is_constraint_in_D_form(Relation &r, const Constraint_Handle &h,  int &v) { -  v=-1; -  coef_t c_out = 0; -  for (int i = 1; i <= r.n_inp(); i++) { -    coef_t c_in = h.get_coef(r.input_var(i)); -    if (c_in) { -      if (v!=-1) -        return 0;  -      v=i; -      c_out = h.get_coef(r.output_var(i)); -       -      // special case for modular constraint -- by chun 04/02/2009 -      if (h.has_wildcards() && typeid(h) == typeid(EQ_Handle)) { -        coef_t g = 0; -        for (Constr_Vars_Iter cvi(h, true); cvi; cvi++) -          g = gcd(g, abs(cvi.curr_coef())); -        c_in = int_mod_hat(c_in, g); -        c_out = int_mod_hat(c_out, g); - -        if (g == 2) { -          if (c_in * c_out == 1) { -              c_out = -1; -          } -          else -            return 0; -        } -        else if (c_in * c_out != -1) -          return 0; -      } -      // other cases -      else if (c_in * c_out != -1) -        return 0; -    } -  } -  return c_out; -} - - -/*** - * Check if relation is in the D form - *  D = {[ i_1,i_2,...,i_m] -> [j_1, j_2, ..., j_m ] : - *         (forall p, 1<= p <= m) L_p <= j_p - i_p <= U_p &&  - *      j_p - i_p == M_p alpha_p}; - *  Right now we do not check for multiple stride constraints for one var. - *  Probably they cannot exist in simplified conjunct - *  This function will be used in assertions - *****/ - -bool is_in_D_form(Relation & D) { -  /* check that D has one conjunct */ - -  if (! D.has_single_conjunct()) -    return false; - -  Conjunct * c=D.single_conjunct(); - -  if (D.global_decls()->size() != 0) // there are symbolic vars -    return false; - -  if (D.n_inp() != D.n_out()) -    return false; - -  int n=D.n_inp(); - -  Tuple<int> bl(n), bu(n); - -  for (int i=1; i<= n; i++) -    bl[i]=bu[i]=0; - -  int v; -  coef_t res; - -  for (EQ_Iterator eq = c->EQs(); eq.live(); eq.next()) { -    if ((res=is_constraint_in_D_form(D,*eq,v))==0) -      return false; -    int n_wild=is_stride(*eq); -    if (n_wild>=2)  -      return false; -    if (n_wild==0) { // not stride constraint -      if (bl[v]  || bu[v]) -        return false; -      bl[v]=bu[v]=1; -    } -  } - -  for (GEQ_Iterator geq = c->GEQs(); geq.live(); geq.next()) { -    if ((res=is_constraint_in_D_form(D,*geq,v))==0) -      return false; -    if ((res>0 && bl[v]) || (res<0 && bu[v])) -      return false; -    if (res>0) -      bl[v]=1; -    else -      bu[v]=1; -  } -  -  return true; -} -  -         -#define get_D_plus_form(R) (get_D_closure(R,1)) -#define  get_D_star_form(R) (get_D_closure(R,0)) - -/**** - * Get D+ or D* from the relation that is in D form - * To get D+ calculate: - *    D+= {[i1, i2 .. i_m] -> {j1, j2, ..., j_m]: - *     exists s s.t. s>=1 and  - *         (forall p, 1<= p <= m) L_p * s<= j_p - i_p <= U_p*s &&  - *      j_p - i_p == M_p alpha_p}; - * To get D* calculate almost the same relation but s>=0. - * Parameter n is 1 for getting D+ and 0 for  D* - ****/ - - -Relation get_D_closure(Relation & D, int n) { -  assert (is_in_D_form(D)); -  assert(n==0 || n==1); -  -  Conjunct *c=D.single_conjunct(); -  -  Relation R(D.n_inp(), D.n_out()); - -  F_Exists * ex = R.add_exists(); -  Variable_ID s = ex->declare("s"); -  F_And * N = ex->add_and(); - -  /* add s>=1 or s>=0 */ - -  GEQ_Handle geq= N->add_GEQ(); -  geq.update_coef(s,1); -  geq.update_const(-n); -  geq.finalize(); - -  -  /* copy and modify all the EQs */ - -  for (EQ_Iterator j= c->EQs(); j.live(); j.next()) { -    EQ_Handle eq=N->add_EQ(); -    copy_constraint(eq, *j); - -    // if it's stride constraint do not change it  -      -    if (!is_stride(*j)) { -      /* eq is j_k -i_k = c, replace c buy s*c */ -       -      eq.update_coef(s, (*j).get_const()); -      eq.update_const(-(*j).get_const()); -    } -    eq.finalize(); -  } - -  /* copy and modify all the GEQs */ - -  for (GEQ_Iterator gi= c->GEQs(); gi.live(); gi.next()) { -    geq=N->add_GEQ(); -    copy_constraint(geq, *gi); -     -    /* geq is j_k -i_k >=c or i_k-j_k >=c, replace c buy s*c */ - -    geq.update_coef(s,(*gi).get_const()); -    geq.update_const(-(*gi).get_const()); -    geq.finalize(); -  } - -  R.finalize(); - -  if (detailedClosureDebug) { -    fprintf(DebugFile, "Simplified D%c is:\n", n==1?'+':'*'); -    R.print_with_subs(DebugFile); -  } - -  return R; -} - - -/*** - * Check if we can easily calculate the D* (D* will be convex). - * We can calculate D* if all differences have both lower and upper - * bounds to be non -/+ infinity - ***/ - - -bool can_get_D_star_form(Relation &D) { -  assert(is_in_D_form(D)); -  Conjunct *c=D.single_conjunct(); -  -  int n=D.n_inp(); -  Tuple<int> bl(n), bu(n); -  int i; - -  for (i=1; i<=n; i++) -    bl[i]=bu[i]=0; - -  for (EQ_Iterator  eq = c->EQs(); eq.live(); eq.next()) { -    // do not check stride constraints -    if (!is_stride(*eq)) { -      for (i=1; i<=n; i++) { -        if ((*eq).get_coef(D.input_var(i)) !=0 ) -          bl[i]=bu[i]=1; -      } -    } -  } -     -   -  for (GEQ_Iterator geq = c->GEQs(); geq.live(); geq.next()) { -    for (i=1; i<=n; i++) { -      coef_t k; -      if ((k=(*geq).get_coef(D.input_var(i))) != 0) { -        if (k>0) -          bu[i]=1; -        else -          bl[i]=1; -      }  -    } -  } - -  for (i=1; i<=n; i++) -    if (!bl[i] || !bu[i]) -      return false; - -  return true; -} - - - -/***** - * Check whether the relation intersect with identity or not - ****/ - -bool does_intersect_with_identity(Relation &R) { -  assert (R.n_inp() == R.n_out()); - -  Relation I=Identity(R.n_inp()); -  Relation C=Intersection(I, copy(R)); -  return C.is_upper_bound_satisfiable(); -} - -bool does_include_identity(Relation &R) { -  Relation I=Identity(R.n_inp()); -  return Must_Be_Subset(I, copy(R)); -} - -/***** - * Bill's closure: check if it is possible to calculate transitive closure - * of the relation using the Bill's algorithm. - * Return the transitive closure relation if it is possible and null relation - * otherwise - ****/ - -bool Bill_closure(Relation &R, Relation& IterationSpace, Relation & R_plus, Relation & R_star) { -#ifdef TC_STATS -  fprintf(statsfile,"start bill closure\n"); -#endif - -  if (does_include_identity(R)) -    return false; - -  if (detailedClosureDebug) { -    fprintf(DebugFile, "\nApplying Bill's method to calculate transitive closure\n"); -  } -  -  // get D and AxA -  Relation D=get_D_form(R); - - -  if (detailedClosureDebug) { -    fprintf(DebugFile,"\n D form for the relation:\n"); -    D.print_with_subs(DebugFile); -  } - -  Relation AxA=form_region1(R, IterationSpace); - -  if (detailedClosureDebug) {  -    fprintf(DebugFile, "\n AxA for the relation:\n"); -    AxA.print_with_subs(DebugFile); -  } -   -  // compute R_+   -   -  R_plus=Intersection(get_D_plus_form(D), copy(AxA)); - -  if (detailedClosureDebug) { -    fprintf(DebugFile, "\nR_+= D+ intersection AxA is:\n"); -    R_plus.print_with_subs(DebugFile); -  } - -  // compute R_* -  R_star=Intersection(get_D_star_form(D), form_region(R,IterationSpace)); - -  if (detailedClosureDebug) { -    fprintf(DebugFile, "\nR_*= D* intersection AxA is:\n"); -    R_star.print_with_subs(DebugFile); -  } - -/*        Check that R_+ is acyclic.  -          Given the way we constructed R_+, R_+=(R_+)+. -          As a result it's enough to verify that R_+ intersection I = 0, -          to prove that R_+ is acyclic. -*/ - -  if (does_intersect_with_identity(R_plus)) { -    if (detailedClosureDebug) { -      fprintf(DebugFile,"R_+ is not acyclic.\n"); -    }  -    return false; -  } - -  //Check R_+ - R is Must_Be_Subset of R o R_+ - -  if (!Must_Be_Subset(Difference(copy(R_plus), copy(R)), Composition(copy(R), copy(R_plus)))) { -#if defined(TC_STATS) -    fprintf(statsfile, "R_+ -R is not a Must_Be_Subset of R o R_+\n"); -    fprintf(statsfile, "Bill Method is not applicable\n"); -#endif -    return false; -  } -  if (detailedClosureDebug) { -    fprintf(DebugFile, "R_+ -R is a Must_Be_Subset of R o R_+ - good\n"); -  } -  -// if we are here than all tests worked, and R_+ is transitive closure -// of R. - -#if defined(TC_STATS) -  fprintf(statsfile,"\nAll three tests succeeded -- exact closure found\n"); -  fprintf(statsfile, "Transitive closure is R_+\n"); -#endif -//    assert(isD_OK(R,D,AxA)); -  return true; -} - - -/********************************************************************** - * print the relation given the bounds on the iteration space - * If the bounds are unknown (Bounds is Null), then just print relation - * itself - ****/ - -void print_given_bounds( const Relation&  R1, NOT_CONST Relation& input_Bounds) { -  Relation & Bounds = (Relation &)input_Bounds; -  Relation r; -  if (Bounds.is_null()) -    r=R1; -  else  -    r = Gist(copy(R1),copy(Bounds),1); -  r.print_with_subs(DebugFile); -} - -/********************************************************************** - * Investigate closure: - * checks if the copmuted approximation on the Transitive closure - * is upper and lower bound. If it's both - it's exact. - * This function doesn't return any value. It's just prints a lot - * of debug output - * INPUT: - *    r  - relation - *    r_closure - approximation on r+. - *    F - iteration space - **********************************************************************/ - -void InvestigateClosure(Relation r, Relation r_closure, Relation F) { -  Relation r3; -  bool LB_res, UB_res; - -  if (!F.is_null()) -    F=Cross_Product(copy(F),copy(F)); - -  fprintf(DebugFile, "\n\n--->investigating the closure of the relation:\n"); -  print_given_bounds(r,F); - -  fprintf(DebugFile, "\nComputed closure is:\n"); -  print_given_bounds(r_closure,F); - -  r3=Composition(copy(r),copy(r_closure)); -  r3.simplify(1,1); - -  r3=Union(r3,Composition(copy(r_closure),copy(r))); -  r3.simplify(1,1); - -  r3=Union(r3,copy(r)); -  r3.simplify(1,1); - -  Relation remainder = Difference(copy(r3),copy(r_closure)); - -  if (!F.is_null()) { -    r3=Gist(r3,F,1); -  } -  r3.simplify(1,1); - -  if (!F.is_null()) { -    r_closure=Gist(r_closure,F,1); -  } -  r_closure.simplify(1,1); - -  LB_res= Must_Be_Subset(copy(r_closure),copy(r3)); - -  UB_res=Must_Be_Subset(copy(r3),copy(r_closure));  - -  fprintf(DebugFile,"\nThe results of checking closure (gist) are:\n"); -  fprintf(DebugFile,"LB - %s, UB - %s\n", LB_res?"YES":"NO", UB_res?"YES":"NO"); - -  if (!UB_res) { -    remainder.simplify(2,2); -    fprintf(DebugFile,"Dependences not included include:\n"); -    print_given_bounds(remainder,F); -  } -}   - - - -/**** - * Transitive closure of the relation containing single conjunct - ****/ - -bool ConjunctTransitiveClosure (NOT_CONST Relation & input_R, Relation & IterationSpace, Relation & R_plus, Relation & R_star) { -  Relation R = consume_and_regurgitate(input_R); -  assert(R.has_single_conjunct()); - -  if (printConjunctClosure) { -    fprintf(DebugFile,"\nTaking closure of the single conjunct: [\n"); -    R.print_with_subs(DebugFile); -  } -#ifdef TC_STATS  -  fprintf(statsfile,"start conjuncttransitiveclosure\n"); -  singles++; -#endif - -  if (is_closure_itself(copy(R))) {  -#ifdef TC_STATS  -    fprintf(statsfile, "Relation is closure itself\n"); -#endif -    int ndim_all, ndim_domain; -    R.dimensions(ndim_all,ndim_domain); -    if (ndim_all == ndim_domain +1) { -      Relation ispace =  Cross_Product(Domain(copy(R)),Range(copy(R))); -      Relation R_zero = Intersection(copy(ispace),Identity(R.n_inp())); -      R_star  = Hull(Union(copy(R),R_zero),true,1,ispace); -      R_plus=R; -      if (printConjunctClosure) { -        fprintf(DebugFile, "\n] For this relation R+=R\n"); -        fprintf(DebugFile,"R*:\n"); -        R_star.print_with_subs(DebugFile); -      } -      return true; -    } -    else { -      R_star=R; -      R_plus=R; -      if (printConjunctClosure) { -        fprintf(DebugFile, "\n] For this relation R+=R, not appropriate for R*\n"); -      } -      return false; -    } -  }  -  else  { -    bool done=false; -    if (!IterationSpace.is_null()) { -// Bill's closure requires the information about Iteration Space.  -// So if IterationSpace is NULL, i.e. unknown( e.g. when calling from parser, -// we do not do Bill's closure  -            -      done  = Bill_closure(R, IterationSpace, R_plus, R_star); -#ifdef TC_STATS -      fprintf(statsfile,"Bill closure is %sapplicable\n",done?"":"not "); -#endif -      if (printConjunctClosure) { -        if (!done) -          fprintf(DebugFile, "Bill's closure is not applicable\n"); -        else { -          fprintf(DebugFile, "Bill's closure is applicable\n"); -          fprintf (DebugFile, " For R:\n"); -          R.print_with_subs(DebugFile); -          fprintf(DebugFile, "R+ is:\n"); -          R_plus.print_with_subs(DebugFile); -          fprintf(DebugFile, "R* is:\n"); -          R_star.print_with_subs(DebugFile); -          fprintf(DebugFile, "\n"); -          InvestigateClosure(R, R_plus, IterationSpace); -        }  -      } -    }  -    if (done) { -      if (printConjunctClosure) { -        fprintf(DebugFile, "]\n"); -      } -      return true; -    } -    else { -      // do and check approximate closure (several compositions) -      R_plus  = approx_closure(copy(R), 2); -#ifdef TC_STATS -      fprintf(statsfile,"Approximating closure with 2 compositions\n"); -#endif -      if (printConjunctClosure) { -        fprintf(DebugFile, "Doing approximate closure\n"); -        InvestigateClosure(R, R_plus, IterationSpace); -      } -    } //end else (!done after Bill Closure or Iteration space is NULL)  -       -    if (printConjunctClosure) { -      fprintf(DebugFile, "]\n"); -    } -  } -  return false; -} - - -/********************************************************************* - * try to get conjunct transitive closure. - * it we can get it easy get it, return true. - * if not - return false - ********************************************************************/ - - -bool   TryConjunctTransitiveClosure (NOT_CONST Relation & input_R, Relation & IterationSpace, Relation & R_plus) { -  Relation R = consume_and_regurgitate(input_R); -  assert(R.has_single_conjunct()); -#ifdef TC_STATS  -  fprintf(statsfile,"start tryconjuncttransitiveclosure\n"); -  singles++; -#endif - -  if (printConjunctClosure) { -    fprintf(DebugFile,"\nTrying to take closure of the single conjunct: [\n"); -    R.print_with_subs(DebugFile); -  } - -  if (is_closure_itself(copy(R))) {  -#ifdef TC_STATS -    fprintf(statsfile, "Relation is closure itself, leave alone (try)\n"); -#endif -    if (printConjunctClosure) -      fprintf(DebugFile, "\n ]The relation is closure itself. Leave it alone\n"); -    return false; -  }  -  else  { -    bool done; -    assert(!IterationSpace.is_null()); -    Relation R_star; -    done  = Bill_closure(R, IterationSpace, R_plus, R_star); -#ifdef TC_STATS -    fprintf(statsfile, "Bill closure is %sapplicable (try)\n", done?"":"NOT "); -#endif -    if (printConjunctClosure) { -      if (!done) -        fprintf(DebugFile, "]Bill's closure is not applicable\n"); -      else { -        fprintf(DebugFile, "]Bill's closure is applicable\n"); -        fprintf (DebugFile, " For R:\n"); -        R.print_with_subs(DebugFile); -        fprintf(DebugFile, "R+ is:\n"); -        R_plus.print_with_subs(DebugFile); -        fprintf(DebugFile, "R* is:\n"); -        R_star.print_with_subs(DebugFile); -        fprintf(DebugFile, "\n"); -        InvestigateClosure(R, R_plus, IterationSpace); -      }  -    } -    return done;  -  }   -  //return false; -}  - - -bool Equal (const Relation & r1, const Relation & r2) { -  bool res=Must_Be_Subset (copy(r1), copy(r2)); -  if (!res) -    return false; -  return Must_Be_Subset (copy(r2),copy(r1)); -} - - -void appendClausesToList(Simple_List<Relation> &L, Relation &R) { -  R.make_level_carried_to(R.n_inp()); -  R.simplify(2,2); -  for(int depth = R.n_inp(); depth >= -1; depth--) -    for (DNF_Iterator d(R.query_DNF()); d.live(); d.next()) -      if (d.curr()->query_guaranteed_leading_0s() == depth) { -        L.append(Relation(R, d.curr())); -      } -} - -void printRelationList(Simple_List<Relation> &L) { -  for (Simple_List_Iterator<Relation> li(L); li.live(); li.next()) { -    li.curr().print_with_subs(DebugFile); -  } -} - -/**** - * Transitive closure of the relation containing multiple conjuncts - * New (Bill's) version - ***/ - -Relation TransitiveClosure0(NOT_CONST Relation &input_r, int maxExpansion, NOT_CONST Relation & input_IterationSpace) { -  Relation r = consume_and_regurgitate(input_r); -  Relation IterationSpace = consume_and_regurgitate(input_IterationSpace); -   -  if (closure_presburger_debug)  -    fprintf(DebugFile, "\n\n[Transitive closure\n\n"); - -  Relation result; - -#ifdef TC_STATS -#define TC_RUNS 1 -  int in_conj = copy(r).query_DNF()->length(); -  totals++; -  fprintf(statsfile,"%d closure run\n", totals); -  if(is_in_D_form(copy(r)))  -    fprintf(statsfile, "Relation initially in D form\n"); -  else -    fprintf(statsfile, "Relation initially NOT in D form\n"); -  if(is_lex_forward(copy(r))) -    fprintf(statsfile, "Relation is initially lex forw\n"); -  else -    fprintf(statsfile, "Relation is NOT initially lex forw\n"); -  start_clock(); -  for(int tc_loop = 1; tc_loop <= TC_RUNS; tc_loop++) { -    singles = 0; -#endif - -    assert(!r.is_null()); -    assert(r.n_inp() == r.n_out()); - -    if (r.max_ufs_arity() > 0) { -      assert(r.max_ufs_arity() == 0 && "Can't take transitive closure with UFS yet."); - -      fprintf(stderr, "Can't take transitive closure with UFS yet."); -      exit(1); -    } - -    r.simplify(2,2); -    if (!r.is_upper_bound_satisfiable()) { -#ifdef TC_STATS -      int totalTime = clock_diff(); -      fprintf(statsfile, "Relation is unsatisfiable\n"); -      fprintf(statsfile, "input conj: %d   output conj: %d   #singe conj closures: %d   time: %d\n", -              in_conj, copy(result).query_DNF()->length(), -              singles, -              totalTime/TC_RUNS); -#endif - - -      if (closure_presburger_debug)  -        fprintf(DebugFile, "]TC : relation is false\n"); -      return r; -    } - -    IterationSpace = Hull(Union(Domain(copy(r)),Range(copy(r))), true, 1, IterationSpace); - -    if (detailedClosureDebug) { -      fprintf(DebugFile, "r is:\n"); -      r.print_with_subs(DebugFile); -      fprintf(DebugFile, "IS is:\n"); -      IterationSpace.print_with_subs(DebugFile); -    } -    Relation dom = Domain(copy(r)); -    dom.simplify(2,1); -    Relation rng = Range(copy(r));  -    rng.simplify(2,1); -    Relation AC = ConicClosure(Restrict_Range(Restrict_Domain(copy(r),copy(rng)),copy(dom))); -    Relation UB = Union(copy(r),Join(copy(r),Join(AC,copy(r)))); -    UB.simplify(2,1); - -    if (detailedClosureDebug) { -      fprintf(DebugFile, "UB is:\n"); -      UB.print_with_subs(DebugFile); -    } -    result = Relation::False(r);  -    Simple_List<Relation> firstChoice,secondChoice; - -    r.simplify(2,2); - -    Relation test = Difference(copy(r),Composition(copy(r),copy(r))); -    test.simplify(2,2); -    if (r.number_of_conjuncts() > test.number_of_conjuncts()) { -      Relation test2 = Union(copy(test),Composition(copy(test),copy(test))); -      test2.simplify(2,2); -      if (Must_Be_Subset(copy(r),copy(test2))) r = test; -      else if (detailedClosureDebug) { -        fprintf(DebugFile, "Transitive reduction not possible:\n"); -        fprintf(DebugFile, "R is:\n"); -        r.print_with_subs(DebugFile); -        fprintf(DebugFile, "test2 is:\n"); -        test2.print_with_subs(DebugFile); -      } -    } - -    r.make_level_carried_to(r.n_inp()); -    if (detailedClosureDebug) { -      fprintf(DebugFile, "r is:\n"); -      r.print_with_subs(DebugFile); -    } -    for(int depth = r.n_inp(); depth >= -1; depth--) -      for (DNF_Iterator d(r.query_DNF()); d.live(); d.next()) -        if (d.curr()->query_guaranteed_leading_0s() == depth) { -          Relation C(r, d.curr()); -          firstChoice.append(C); -        }    - -    bool first_conj=true;  -    for (Simple_List_Iterator<Relation> sli(firstChoice); sli; sli++) { -      if (first_conj) -        first_conj=false; -      else { -        Relation C_plus; -        bool change=TryConjunctTransitiveClosure( -          copy(sli.curr()), IterationSpace, C_plus); -        if (change) -          sli.curr()=C_plus; -      } -    } -       -    //compute closure -    int maxClauses = 3+firstChoice.size()*(1+maxExpansion); - -    int resultConjuncts = 0; -    int numFails = 0; -    bool resultInexact = false; -    while (!firstChoice.empty() || !secondChoice.empty()) { -      Relation R_plus, R_star; - -      if (detailedClosureDebug) { -        fprintf(DebugFile,"Main loop of TC:\n"); -        if (!firstChoice.empty()) { -          fprintf(DebugFile,"First choice:\n"); -          printRelationList(firstChoice); -        } -        if (!secondChoice.empty()) { -          fprintf(DebugFile,"Second choice:\n"); -          printRelationList(secondChoice); -        } -      } -   -      Relation R; -      if (!firstChoice.empty())  -        R = firstChoice.remove_front(); -      else R = secondChoice.remove_front(); - -      if (detailedClosureDebug) { -        fprintf(DebugFile, "Working with conjunct:\n"); -        R.print_with_subs(DebugFile); -      } - -      bool known=ConjunctTransitiveClosure(copy(R),IterationSpace, R_plus, R_star); - -      if (!known && numFails < firstChoice.size()) { -        numFails++; -        firstChoice.append(R); -        if (detailedClosureDebug) { -          fprintf(DebugFile, "\nTry another conjunct, R is not suitable\n"); -          R.print_with_subs(DebugFile); -        } -        continue; -      } - - -      if (detailedClosureDebug) { -        fprintf(DebugFile,"\nR+ is:\n"); -        R_plus.print_with_subs(DebugFile); -        if (known) { -          fprintf(DebugFile, "Known R? is :\n"); -          R_star.print_with_subs(DebugFile); -        } -        else -          fprintf(DebugFile, "The R* for this relation is not calculated\n"); -      } -         -      Relation R_z; -      if (known) { -        R_z=Difference(copy(R_star),copy(R_plus)); -        known = R_z.is_upper_bound_satisfiable(); -        if (known) { -          int d = R.single_conjunct()->query_guaranteed_leading_0s(); -          R_z.make_level_carried_to(min(R.n_inp(),d+1)); -          if (R_z.query_DNF()->length() > 1) known = false; -          if (detailedClosureDebug) { -            fprintf(DebugFile, "\nForced R_Z to be level carried at level %d\n",min(R.n_inp(),d+1)); -          } -        } -        if (detailedClosureDebug) { -          if (known) { -            fprintf(DebugFile, "\nDifference between R? and R+ is:\n"); -            R_z.print_with_subs(DebugFile); -          } -          else -            fprintf(DebugFile, "\nR_z is unusable\n"); -        } -      } -      else R_z = Relation::False(r); - -      if (!known) -        numFails++; -      else numFails = 0; -      if (!known && numFails <= firstChoice.size()) { -        firstChoice.append(R); -        if (detailedClosureDebug) { -          fprintf(DebugFile, "\nTry another conjunct, Rz is avaiable for R:\n"); -          R.print_with_subs(DebugFile); -        } -        continue; -      } - -      //make N empty list -      Relation N = Relation::False(r); -  -      //append R+ to T -      result = Union(result, copy(R_plus)); -      resultConjuncts++; - -      int expansion = maxClauses - (resultConjuncts + 2*firstChoice.size() + secondChoice.size()); -      if (expansion < 0) expansion = 0; -      if (detailedClosureDebug) { -        fprintf(DebugFile,"Max clauses = %d\n",maxClauses); -        fprintf(DebugFile,"result conjuncts =  %d\n",resultConjuncts); -        fprintf(DebugFile,"firstChoice's =  %d\n",firstChoice.size()); -        fprintf(DebugFile,"secondChoice's =  %d\n",secondChoice.size()); -        fprintf(DebugFile,"Allowed expansion is %d\n",expansion); -      } - -      bool firstPart=true; -      if (!known && expansion == 0) { -        if (detailedClosureDebug) { -          fprintf(DebugFile,"Expansion = 0, R? unknown, skipping composition\n"); -        } -        if (!resultInexact && detailedClosureDebug) fprintf(DebugFile,"RESULT BECOMES INEXACT 1\n"); -        resultInexact = true; -      } -      else -        for (Simple_List_Iterator<Relation> s(firstChoice); -             firstPart? -               (s.live()?true: -                (s = Simple_List_Iterator<Relation>(secondChoice), -                 firstPart = false, -                 s.live())) -               :s.live(); -             s.next()) { -          assert(s.live()); -          Relation C=(s.curr()); -          if (detailedClosureDebug) { -            fprintf(DebugFile, "\nComposing chosen conjunct with C:\n"); -            C.print_with_subs(DebugFile); -          } - -          if (!known) { -            if (detailedClosureDebug) { -              fprintf(DebugFile, "\nR? is unknown! No debug info here yet\n"); -            } -            Relation C1=Composition(copy(C), copy(R_plus)); -            if (detailedClosureDebug) { -              fprintf(DebugFile, "\nGenerating \n"); -              C1.print_with_subs(DebugFile); -            } -            C1.simplify(); -            Relation newStuff = -              Difference( -                Difference(copy(C1),copy(C)), -                copy(R_plus)); -            newStuff.simplify(); -            if (detailedClosureDebug) { -              fprintf(DebugFile, "New Stuff:\n"); -              newStuff.print_with_subs(DebugFile); -            } -            bool C1_contains_new_stuff = newStuff.is_upper_bound_satisfiable(); -            if (C1_contains_new_stuff) { -              if (newStuff.has_single_conjunct()) -                C1 = newStuff; -              if (expansion) { -                N = Union(N,copy(C1)); -                expansion--; -              } -              else { -                if (!resultInexact && detailedClosureDebug) fprintf(DebugFile,"RESULT BECOMES INEXACT 2\n"); -                resultInexact = true; -                break; -              } -            } -            else C1 = Relation::False(C1); - -            Relation C2(Composition(copy(R_plus),copy(C))); -            if (detailedClosureDebug) { -              fprintf(DebugFile, "\nGenerating \n"); -              C2.print_with_subs(DebugFile); -            } -            newStuff = -              Difference( -                Difference( -                  Difference(copy(C2),copy(C)), -                  copy(C1)), -                copy(R_plus)); -            newStuff.simplify(); -            if (detailedClosureDebug) { -              fprintf(DebugFile, "New Stuff:\n"); -              newStuff.print_with_subs(DebugFile); -            } -            if (newStuff.is_upper_bound_satisfiable()) { -              if (newStuff.has_single_conjunct()) -                C2 = newStuff; -              if (expansion) { -                N = Union(N,copy(C2)); -                expansion--; -              } -              else { -                if (!resultInexact && detailedClosureDebug) fprintf(DebugFile,"RESULT BECOMES INEXACT 3\n"); -                resultInexact = true; -                break; -              } -            } -            else C2 = Relation::False(C2); -       -            if (C1_contains_new_stuff) {  -              Relation C3(Composition(copy(R_plus),copy(C1))); -              if (detailedClosureDebug) { -                fprintf(DebugFile, "\nGenerating \n"); -                C3.print_with_subs(DebugFile); -              } -              newStuff = -                Difference( -                  Difference( -                    Difference( -                      Difference(copy(C3),copy(C)), -                      copy(C1)), -                    copy(C2)), -                  copy(R_plus)); -              newStuff.simplify(); -              if (detailedClosureDebug) { -                fprintf(DebugFile, "New Stuff:\n"); -                newStuff.print_with_subs(DebugFile); -              } -              if (newStuff.is_upper_bound_satisfiable()) { -                if (newStuff.has_single_conjunct()) -                  C3 = newStuff; -                if (expansion) { -                  N = Union(N,C3); -                  expansion--; -                } -                else { -                  if (!resultInexact && detailedClosureDebug) fprintf(DebugFile,"RESULT BECOMES INEXACT 4\n"); -                  resultInexact = true; -                  break; -                } -              } -            } -    -          } -          else { -            Relation C_Rz(Composition(copy(C),copy(R_z))); -            if (detailedClosureDebug) { -              fprintf(DebugFile, "C o Rz is:\n"); -              C_Rz.print_with_subs(DebugFile); -            } - -            Relation Rz_C_Rz(Composition(copy(R_z),copy(C_Rz))); -            if (detailedClosureDebug) { -              fprintf(DebugFile, "\nRz o C o Rz is:\n"); -              Rz_C_Rz.print_with_subs(DebugFile); -            }  - -            if (Equal(C,Rz_C_Rz)) { -#if defined(TC_STATS) -              fprintf(statsfile,"weak test selects C?\n"); -#endif -              Relation tmp = Composition(C,copy(R_star)); -              tmp.simplify(); -              Relation tmp2 = Composition(copy(R_star),copy(tmp)); -              tmp2.simplify(); -              if (Must_Be_Subset(copy(tmp2),copy(tmp))) -                *s = tmp; -              else -                *s = tmp2; -              if (detailedClosureDebug) { -                fprintf(DebugFile,"\nC is equal to Rz o C o Rz so  R? o C o R? replaces C\n"); -                fprintf(DebugFile, "R? o C o R? is:\n"); -                (*s).print_with_subs(DebugFile); -              } -            } -            else { -#if defined(TC_STATS) -              fprintf(statsfile,"weak test fails\n"); -#endif -              if (Equal(C, C_Rz)) { -                *s=Composition(copy(C),copy(R_star)); -                Relation  p(Composition(copy(R_plus), copy(*s))); -                p.simplify(); -                if (detailedClosureDebug) { -                  fprintf(DebugFile, "\nC is equal to C o Rz, so C o Rz replaces C\n"); -                  fprintf (DebugFile, "C o R? is:\n"); -                  (*s).print_with_subs(DebugFile); -                  fprintf (DebugFile, "R+ o C o R? is added to list N. It's :\n"); -                  p.print_with_subs(DebugFile); -                }          -                if (!Is_Obvious_Subset(copy(p),copy(R_plus)) -                    && !Is_Obvious_Subset(copy(p),copy(C))) { -                  if (expansion)  { -                    p.simplify(2,2);  -                    expansion--; -                  } -                  else { -                    if (!resultInexact && detailedClosureDebug) fprintf(DebugFile,"RESULT BECOMES INEXACT 5\n"); -                    resultInexact = true; -                    break; -                  } -                } -              } -              else { -                Relation Rz_C(Composition(copy(R_z),copy(C))); - -                if (Equal(C,Rz_C)) { -                  *s=Composition(copy(R_star),copy(C)); -                  Relation Rstar_C_Rplus(Composition(copy(*s),copy(R_plus)));    -                  Rstar_C_Rplus.simplify(); -                  if (detailedClosureDebug) { -                    fprintf(DebugFile, "\nC is equal to Rz o C , so R? o C replaces C\n"); -                    fprintf (DebugFile, "R? o C is:\n"); -                    (*s).print_with_subs(DebugFile); -                    fprintf (DebugFile, "R+ o C is added to list N. It's :\n"); -                    Rstar_C_Rplus.print_with_subs(DebugFile); -                  }   -                  if (!Is_Obvious_Subset(copy(Rstar_C_Rplus),copy(R_plus)) -                      && !Is_Obvious_Subset(copy(Rstar_C_Rplus),copy(C))) { -                    if (expansion)  -                      N = Union(N,Rstar_C_Rplus); -                    else { -                      if (!resultInexact && detailedClosureDebug) fprintf(DebugFile,"RESULT BECOMES INEXACT 6\n"); -                      resultInexact = true; -                      break; -                    } -                  } -                } -                else { -                  if (detailedClosureDebug) { -                    fprintf(DebugFile, "\nHave to handle it the hard way\n"); -                  } -                  Relation C1=Composition(copy(C), copy(R_plus)); -                  C1.simplify(); -                  if (!Is_Obvious_Subset(copy(C1),copy(R_plus)) -                      && !Is_Obvious_Subset(copy(C1),copy(C))) { -                    if (expansion) { -                      N = Union(N,copy(C1)); -                      expansion--; -                    } -                    else { -                      if (!resultInexact && detailedClosureDebug) fprintf(DebugFile,"RESULT BECOMES INEXACT 7\n"); -                      resultInexact = true; -                      break; -                    } -                  } -    -                  Relation C2(Composition(copy(R_plus),copy(C))); -                  C2.simplify(); -                  if (!Is_Obvious_Subset(copy(C2),copy(R_plus)) -                      && !Is_Obvious_Subset(copy(C2),copy(C))) { -                    if (expansion) { -                      N = Union(N,C2); -                      expansion--; -                    } -                    else { -                      if (!resultInexact && detailedClosureDebug)  { -                        fprintf(DebugFile,"RESULT BECOMES INEXACT 8\n"); -                        fprintf(DebugFile,"Have to discard:\n"); -                        C2.print_with_subs(DebugFile); -                      } -                      resultInexact = true; -                      break; -                    } -                  } -                  Relation C3(Composition(copy(R_plus),C1)); -                  C3.simplify(); -                  if (!Is_Obvious_Subset(copy(C3),copy(R_plus)) && !Is_Obvious_Subset(copy(C3),copy(C))) { -                    if (expansion) { -                      N = Union(N,C3); -                      expansion--; -                    } -                    else { -                      if (!resultInexact && detailedClosureDebug) -                        fprintf(DebugFile,"RESULT BECOMES INEXACT 9\n"); -                      resultInexact = true; -                      break; -                    } -                  } -                } -              } -            } -          } -        } - -      //now we processed the first conjunct. -      if (detailedClosureDebug) { -        N.simplify(2,2); -        fprintf(DebugFile, "\nNew conjuncts:\n"); -        N.print_with_subs(DebugFile); -      } -         -      N.simplify(2,2); -      appendClausesToList(secondChoice,N); -    } -                 -    //Did we do all conjuncts? If not, make T be inexact -    result.copy_names(r); - -    result.simplify(2,2); - -    if (!result.is_exact()) { -      result = Lower_Bound(result); -      resultInexact = true; -    } -    if (resultInexact) { -      Relation test(Composition(copy(result),copy(result))); -      test.simplify(2,2); -      if (detailedClosureDebug) { -        fprintf(DebugFile, "\nResult is:\n"); -        result.print_with_subs(DebugFile); -        fprintf(DebugFile, "\nResult composed with itself is:\n"); -        test.print_with_subs(DebugFile); -      } -      if (!Must_Be_Subset(test,copy(result))) { -        result = Union(result,Intersection(UB, Relation::Unknown(result))); -      } -    } - -#ifdef TC_STATS -    { -      Relation rcopy = result; -      Relation test2(Composition(copy(rcopy),copy(rcopy))); -      test2.simplify(2,2); -      test2.remove_disjunction_with_unknown(); -      rcopy.remove_disjunction_with_unknown(); -      if (detailedClosureDebug) { -        fprintf(DebugFile, "\nResult is:\n"); -        rcopy.print_with_subs(DebugFile); -        fprintf(DebugFile, "\nResult composed with itself is:\n"); -        test2.print_with_subs(DebugFile); -      } -      if (!Must_Be_Subset(test2,copy(rcopy))) { -        fprintf(statsfile,"multi TC result is inexact\n"); -      } -      else  -        fprintf(statsfile,"TC result is exact%s\n", (resultInexact || !rcopy.is_exact())?" despite perceived inexactness":""); -    } -#endif - -#ifdef TC_STATS -  } -  int totalTime = clock_diff(); -  fprintf(statsfile, "input conj: %d   output conj: %d   #singe conj closures: %d   time: %d\n", -          in_conj, copy(result).query_DNF()->length(), -          singles, -          totalTime/TC_RUNS); -#endif - -  if (closure_presburger_debug || detailedClosureDebug) { -    if (detailedClosureDebug) { -      fprintf(DebugFile, "\nThe transitive closure is :\n"); -      result.print_with_subs(DebugFile); -    } -    fprintf(DebugFile, "\n\n] END Transitive closure\n\n"); -  } -  return result; -} - - -Relation TransitiveClosure(NOT_CONST Relation &input_r,  -                           int maxExpansion, -                           NOT_CONST Relation & input_IterationSpace) { -  Relation r = consume_and_regurgitate(input_r);   -  Relation IterationSpace = consume_and_regurgitate(input_IterationSpace); -  if (r.is_null()) -    return r; -  if (r.n_out() == 0) -    throw std::invalid_argument("transitive closure does not apply to set");     -  if (r.n_inp() != r.n_out()) -    throw std::invalid_argument("transitive closure must has the same input and output arity"); - -  if (closure_presburger_debug) { -    fprintf(DebugFile,"\nComputing Transitive closure of:\n"); -    r.print_with_subs(DebugFile); -    fprintf(DebugFile,"\nIteration space is:\n"); -    IterationSpace.print_with_subs(DebugFile); -  } -  if (!r.is_upper_bound_satisfiable()) { -    if (closure_presburger_debug)  -      fprintf(DebugFile, "]TC : relation is false\n"); -    return r; -  } - -  Relation UB = DeltasToRelation(ConicHull(Project_Sym(Deltas(copy(r)))), -                                 r.n_inp(),r.n_out()); -  if (closure_presburger_debug) { -    fprintf(DebugFile,"UB is:\n"); -    UB.print_with_subs(DebugFile); -  } - -  Relation conditions = Restrict_Domain(copy(UB),Domain(copy(r))); -  conditions.simplify(); -  if (closure_presburger_debug) { -    fprintf(DebugFile,"Forward reachable is:\n"); -    conditions.print_with_subs(DebugFile); -  } -  conditions = Composition(Inverse(copy(UB)),conditions); -  conditions.simplify(); -  if (closure_presburger_debug) { -    fprintf(DebugFile,"Backward/forward reachable is:\n"); -    conditions.print_with_subs(DebugFile); -  } -  conditions = Range(conditions); -  conditions.simplify(); -  // conditions = Approximate(conditions); -  // conditions.simplify();   -  conditions = VennDiagramForm(conditions); -  conditions.simplify(); -   -  if (closure_presburger_debug) { -    fprintf(DebugFile,"Condition regions are:\n"); -    conditions.print_with_subs(DebugFile); -  } - -  if (conditions.is_obvious_tautology()) { -    return TransitiveClosure0(r, maxExpansion, IterationSpace); -  } -  else { -    Relation answer = Relation::False(r); -    answer.copy_names(r); -    answer.setup_names(); - -    for (DNF_Iterator c(conditions.query_DNF()); c.live(); c.next()) { -      Relation tmp = Relation(conditions, c.curr()); -      if (closure_presburger_debug) { -        fprintf(DebugFile,"\nComputing Transitive closure:\n"); -        fprintf(DebugFile,"\nRegion:\n"); -        tmp.prefix_print(DebugFile); -      } - -      Relation tmp3 = Restrict_Domain(copy(r),tmp); -      tmp3.simplify(2,2); -      if (closure_presburger_debug) { -        fprintf(DebugFile,"\nRelation:\n"); -        tmp3.prefix_print(DebugFile); -      } - -      answer = Union(answer, TransitiveClosure0(tmp3, maxExpansion,copy(IterationSpace))); -    } -    return answer; -  } -} - - -/* ********************************* */ -/*    Function check if relation     */ -/*       belong to d-form or         */ -/*      uniform relaion class	     */ -/* ********************************* */ - -Relation is_DForm_or_Uniform(NOT_CONST Relation &r){ - -  Relation s = consume_and_regurgitate(r); -  Relation Rtmp, Rdelta, delta; - -  delta = Deltas(copy(s)); -  Rdelta = DeltasToRelation(copy(delta), s.n_inp(), s.n_out()); -  Rtmp = DeltasToRelation(Project_Sym(delta), s.n_inp(), s.n_out()); - -  Rtmp = Restrict_Domain(Rtmp, Domain(copy(Rdelta))); -  Rtmp = Restrict_Range(Rtmp, Range(Rdelta)); - -  Rdelta = copy(Rtmp); - -  Rtmp = Restrict_Domain(Rtmp, Domain(copy(s))); -  Rtmp = Restrict_Range(Rtmp, Range(copy(s))); - -  if (Must_Be_Subset( copy(Rtmp), copy(s)) && \ -	Must_Be_Subset(copy(s), copy(Rtmp))) { -	Rtmp = Relation::Null(); -  } -  else { -	Rtmp = Rdelta = Relation::Null(); -  } - -  return Rdelta; - } - - - - /* ********************************* */ - /*       Get a conjunction for       */ - /*      a given number from set      */  - /*           of relations            */ - /* ********************************* */ - -Relation getConjunctionNr(NOT_CONST Relation &r, int conjNr) { - -  Relation s = consume_and_regurgitate(r); -  int i = 1; - -  for (DNF_Iterator c(s.query_DNF()); c; c++,i++) { -	if ( i == conjNr ) { -		return  Relation(s, c.curr()); -	} -  }		  -  -  return Relation::False(s.n_inp(), s.n_out()); - - } - - -/* ********************************* */ -/*      Get a common region for      */ -/*     a given set of relations      */ -/* ********************************* */ - -Relation getCommonRegion( NOT_CONST Relation &r, const long* relTab, const long relCount) { - -  Relation s = consume_and_regurgitate(r); -  Relation commonRegion, Rcurr; -  long i = 0; - -  Rcurr = getConjunctionNr( copy(s), relTab[0]); -  commonRegion = Union(Domain(copy(Rcurr)), Range(copy(Rcurr))); - -  for( i=1; i < relCount; i++ ){ -	Rcurr = getConjunctionNr( copy(s), relTab[i]); -	commonRegion = Intersection( commonRegion, Union( Domain(copy(Rcurr)), Range(copy(Rcurr))) ); -  } - -  return commonRegion; - } - - -/* ********************************* */ -/*      Get a set of relations       */ -/* ********************************* */ - -Relation getRelationsSet( NOT_CONST Relation &r, const long* relTab, const long relCount) { -	 -  Relation s = consume_and_regurgitate(r); -  Relation R = Relation::False(s.n_inp(), s.n_out()); -  long i = 0; -	 -  for( i=0; i < relCount; i++ ){ -	R = Union( R, getConjunctionNr( copy(s), relTab[i]) ); -  } -	 -  return R; - } - - -/* ********************************* */ -/*      Get a set of relations       */ -/*       from a common region        */ -/* ********************************* */ - -Relation relationsOnCommonRegion( NOT_CONST Relation &r, NOT_CONST Relation ®ion ) { -	 -  Relation set = consume_and_regurgitate(r); -  Relation reg = consume_and_regurgitate(region); -  Relation R = Relation::True(set.n_inp(), set.n_out()); -	 -  R = Restrict_Domain(R, copy(reg)); -  R.simplify(2,1); -  R = Restrict_Range(R, reg); -  R.simplify(2,1); -	 -  R = Intersection(R, set); -		 -  return R; -	 - } - - -Relation compose_N(NOT_CONST Relation &input_r) { -  Relation r = consume_and_regurgitate(input_r); -  Relation powerR, powerR2; - -  r = Union(r, Identity(r.n_inp())); -  powerR = copy(r); - -  for(;;){ -     if (powerR.number_of_conjuncts() > 50) { -	powerR = Relation::Null(); -	return powerR; -     } - -     powerR2 = Composition(copy(powerR), copy(r)); -     powerR2.simplify(2,1); - -     if (Must_Be_Subset( copy(powerR2), copy(powerR))) { -	powerR2 = Relation::Null(); -	return powerR; -     } - -     powerR = Relation::Null(); -     powerR = copy(powerR2); -     powerR2 = Relation::Null(); -  } -}  - - -/****************************** */ -/*  Check exactness of R+       */ -/*			        */ -/*  Tomasz Klimek 05-06-2010	*/ -/****************************** */ - -bool checkExactness(NOT_CONST Relation &r, NOT_CONST Relation &rplus){ - - -Relation s1 = consume_and_regurgitate(r); -Relation s2 = consume_and_regurgitate(rplus); -Relation R; - -R = Composition(copy(s1), copy(s2)); -R = Union(s1, R); - - if( Must_Be_Subset(copy(s2), copy(R)) && \ -	    Must_Be_Subset(copy(R), copy(s2))) { -    R = Relation::Null(); -    s1 = Relation::Null(); -    return true; - } - - R = Relation::Null(); - s1 = Relation::Null(); - - return false;  - -} - -/************************************** */ -/*  Calculate approximation of R*       */ -/*				        */ -/*  Tomasz Klimek 05-06-2010		*/ -/************************************** */ - - -Relation ApproxClosure(NOT_CONST Relation &r) { - -  Relation s = consume_and_regurgitate(r); -  Relation R = Relation::False(s.n_inp(), s.n_out());  -  Relation tc = Identity(s.n_inp()); -  Relation Rtmp;  - - -  for (DNF_Iterator c(s.query_DNF()); c; c++) { -      Rtmp = Hull(Project_Sym(Deltas(Relation(s, c.curr()))), false, 1, Relation::Null()); -      R = Union(R, TransitiveClosure(DeltasToRelation(Rtmp,s.n_inp(),s.n_out()), 1, Relation::Null())); -  } - -  for (DNF_Iterator c(R.query_DNF()); c; c++) { -     Rtmp = Union(Identity(s.n_inp()), Relation(R, c.curr())); -     tc = Composition(tc, Rtmp); -     tc = Hull(tc, false, 1, Relation::Null()); -  } - -  tc = Restrict_Domain(tc,Domain(copy(s))); -  tc.simplify(2,1); -  tc = Restrict_Range(tc,Range(s)); -  tc.simplify(2,1); -  tc = Intersection(tc, Relation::Unknown(tc)); - - return tc; -} - - -/************************************** */ -/*  Calculate R* on unbounded region    */ -/*					*/ -/*  Tomasz Klimek 05-06-2010		*/ -/************************************** */ - -Relation ClosureOnUnboundedRegion(NOT_CONST Relation &r) { - -  Relation s = consume_and_regurgitate(r); -  Relation R = Relation::False(s.n_inp(), s.n_out()); -  Relation tc = Identity(s.n_inp()); -  Relation Rtmp,tcTmp; - -  for (DNF_Iterator c(s.query_DNF()); c; c++) { -	  Rtmp = is_DForm_or_Uniform(Relation(s, c.curr())); - -	  if (!(Rtmp.is_null())) { -		tcTmp = TransitiveClosure(Rtmp, 1, Relation::Null()); - -		if (!(tcTmp.is_exact())){ -		    tcTmp = R = Relation::Null(); -		    /* fprintf(DebugFile,"\nTC is inexact!"); */ -		    return tcTmp; -		} -	  } -	  else { -		R = Relation::Null(); -		/* fprintf(DebugFile,"\nR is not d-form relation!"); */ -		return Relation::Null(); -	  } - -	  R = Union(R, tcTmp); -  } - -  for (DNF_Iterator c(R.query_DNF()); c; c++) { -     Rtmp = Union(Identity(s.n_inp()), Relation(R, c.curr())); -     tc = Composition(tc, Rtmp); -     tc.simplify(2,1); -  } - -  tc = Difference(tc, Identity(s.n_inp())); - -  return tc; - -} - - - - -/******************************* */ -/* Try to select sets of domain  */ -/*         and range             */ -/*		                 */ -/*  Tomasz Klimek 05-06-2010 	 */ -/******************************* */ - -Relation SelectRegionForClosure(NOT_CONST Relation &r){ - -  Relation s = consume_and_regurgitate(r); -  Relation DR = Union(Domain(copy(s)),Range(copy(s))); -  Relation region,tc,tcTmp; - -  region = SimpleHull(copy(DR)); -  region.simplify(2,1); - -  tc = ClosureOnUnboundedRegion(copy(s)); - -  if (tc.is_null()) { -	return tc; -  } - -  tcTmp = Restrict_Domain(copy(tc),copy(region)); -  tcTmp.simplify(2,1); -  tcTmp = Restrict_Range(tcTmp,region); -  tcTmp.simplify(2,1); - -  if (checkExactness(copy(s), copy(tcTmp))) { -	s = tc = Relation::Null(); -	return tcTmp; -  } - -  tcTmp = Relation::Null(); -  region = Hull(DR,false,1,Relation::Null()); - -  tcTmp = Restrict_Domain(copy(tc),copy(region)); -  tcTmp.simplify(2,1); -  tcTmp = Restrict_Range(tcTmp,region); -  tcTmp.simplify(2,1); - -  if (checkExactness(copy(s), copy(tcTmp))) { -    s = tc = Relation::Null(); -    return tcTmp; -  } - -  tcTmp = Relation::Null(); - -  tc = Restrict_Domain(tc,Domain(copy(s))); -  tc.simplify(2,1); -  tc = Restrict_Range(tc,Domain(copy(s))); -  tc.simplify(2,1); - -  if (checkExactness(copy(s), copy(tc))) { -    s = Relation::Null(); -    return tc; -  } - -  tc = Relation::Null(); - - return ApproxClosure(s); - -} - - - - -/************************************** */ -/*  Calculate R*                        */ -/*					*/ -/*  Tomasz Klimek 05-06-2010		*/ -/************************************** */ - -Relation calculateTransitiveClosure(NOT_CONST Relation &r) { - -  Relation 	s = consume_and_regurgitate(r); -  Relation 	tc = Relation::False(s.n_inp(), s.n_out()); -  long*		relationsSet = NULL; -  Relation 	commonRegion, regionTmp; -  Relation      inputRelations; -  long		i,j=-1; -  long		N,M; -  Relation 	R; - - -  commonRegion = SelectRegionForClosure(copy(s)); - -  if (commonRegion.is_null()) { -	return ApproxClosure(s); -  } - -  if (commonRegion.is_exact()) { -	return commonRegion; -  } - -  commonRegion = Relation::Null(); -  N = M = s.number_of_conjuncts(); -  relationsSet = (long*)calloc(N,sizeof(long)); -	 -  if (relationsSet == NULL) { -	return Relation::False(s.n_inp(), s.n_out()); -  } - -  for (; N > 1;) { -   for ( i=0; i<N; i++ ) { -	if ( i < j ) { -	  continue; -	} -	else if ( j == -1 ) { -	  relationsSet[i] = 1; -	} -	else if ( i > j ) { -	  relationsSet[i] = relationsSet[i-1] + 1; -	} -	else if ( i == j ) { -	  relationsSet[i] += 1; -	} -	if ( relationsSet[i] <= M ) { -	  j = i; -	} -	else { -	  j = i - 1; -	  break; -	} -   } -				 -   if ( j+1 == N) { -    /* fprintf(DebugFile,"\n");  -    for(i=0;i<N;i++){ -      fprintf(DebugFile," %ld", relationsSet[i]);  -    } -    fprintf(DebugFile,"\n"); */ - -    commonRegion = getCommonRegion( copy(s), relationsSet, N); -    commonRegion.simplify(2,1); -    inputRelations = getRelationsSet( copy(s), relationsSet, N); -    inputRelations.simplify(2,1); -	 -    /* ******************* */ -    /*  Check on rectangle */ -    /* ******************* */ -    regionTmp = SimpleHull(copy(commonRegion)); -    regionTmp.simplify(2,1); -    R = relationsOnCommonRegion( copy(inputRelations), regionTmp); -    R.simplify(2,1); -    regionTmp = SelectRegionForClosure(R); - -    if (regionTmp.is_exact()) { -     /* fprintf(DebugFile,"\nDescribed on rectangle region\n"); */ -     tc = Union( tc, regionTmp ); -    } -    else { -     /* ******************* */ -     /*    Check on hull    */ -     /* ******************* */ -	 -     R = Relation::Null(); -     regionTmp = Relation::Null(); -     regionTmp = Hull(copy(commonRegion),false,1,Relation::Null()); -     regionTmp.simplify(2,1); -     R = relationsOnCommonRegion( copy(inputRelations), regionTmp); -     R.simplify(2,1); -     regionTmp = SelectRegionForClosure(R); -			 -     if (regionTmp.is_exact()) { -	/* fprintf(DebugFile,"\nDescribed on Hull\n"); */ -	tc = Union( tc, regionTmp); -     } -     else { -      /* ********************************** */ -      /* Check on sets of domain and range  */ -      /* ********************************** */ - -      R = Relation::Null(); -      regionTmp = Relation::Null(); -      R = relationsOnCommonRegion( copy(inputRelations), copy(commonRegion) ); -      R.simplify(2,1); -      regionTmp = SelectRegionForClosure(R); - -      if (regionTmp.is_exact()) { -	/* fprintf(DebugFile,"\nDescribed on sets of doamin and range\n"); */ -        tc = Union( tc, regionTmp ); -      } -      else { -        commonRegion = Relation::Null(); -        inputRelations = Relation::Null(); -        regionTmp = Relation::Null(); -        R = Relation::Null(); - -	return ApproxClosure(s); -      } -     } -    } -		 -    commonRegion = Relation::Null(); -    inputRelations = Relation::Null(); - -    regionTmp = Relation::Null(); -    R = Relation::Null(); -   } - -   if ( j == -1 ) N--; - - } - - R = Relation::Null(); - - for (DNF_Iterator c(s.query_DNF()); c; c++) { -   if (!Must_Be_Subset(Relation(s, c.curr()), copy(tc))) { -     /* fprintf(DebugFile,"\nIs not a subset\n"); */ -     tc = Union( tc, SelectRegionForClosure(Relation(s, c.curr()))); -   } - } - - if (!(tc.is_exact())){ -   return ApproxClosure(s); -  } - - tc = compose_N(tc); - - if (tc.is_null()) { -   return ApproxClosure(s); - } - - return tc; - -} - - - - - -} // namespace diff --git a/omega/omega_lib/src/evac.cc b/omega/omega_lib/src/evac.cc deleted file mode 100644 index ff872c9..0000000 --- a/omega/omega_lib/src/evac.cc +++ /dev/null @@ -1,339 +0,0 @@ -#if defined STUDY_EVACUATIONS - -#include <omega/Relations.h> -#include <omega/pres_conj.h> -#include <omega/evac.h> -#include <omega/omega_core/debugging.h> -#include <omega/omega_core/oc_i.h> - -namespace omega { - -int evac_debug = 0; - -char *evac_names[] = { "trivial", -                       "offset", -                       "subseq", -                       "off_sub", -//         "perm.", -                       "affine", -                       "nasty" }; -  -int single_evacs[evac_nasty+1]; -int double_evacs[evac_nasty+1][evac_nasty+1]; - -/* - * We're going to try to describe the equalities among a set of variables - * We want to perform some substitutions to ensure that we don't miss - *   v_1 = v_2 due to its expression as v_1 = v_3 && v_2 = v_3 - * We therefore try to substitute out all variables that we don't care - *   about (e.g., v_3 in the above example). - */ - -static bool try_to_sub(Problem *p, int col) { -  int e, i; - -  if (!p->variablesInitialized) { -    p->initializeVariables(); -  } - -  assert(col <= p->nVars); -  assert(!inApproximateMode); - -  for(e=0;e<p->nEQs;e++) -    if (p->EQs[e].coef[col] == 1 || p->EQs[e].coef[col] == -1) { -      int var = p->var[col]; -      p->doElimination(e, col); -      if (col != p->nVars + 1) -        p->forwardingAddress[p->var[p->nVars+1]] = col; -      assert(p->SUBs[p->nSUBs-1].key = var); -      p->forwardingAddress[var] = -p->nSUBs; -      break; -    } -  -  if (e == p->nEQs) -    return false; - -  for (int c=0;c<=p->nVars;c++) { -    assert(p->EQs[e].coef[c] == 0); -  } - -  p->nEQs--; -  if (e < p->nEQs) eqnncpy(&p->EQs[e], &p->EQs[p->nEQs], p->nVars); - -  for (i = 0; i < p->nSUBs; i++) { -    assert(p->forwardingAddress[p->SUBs[i].key] == -i - 1); -  } - -  return true; -} - - -// should be static, but must be a friend -bool check_subseq_n(Conjunct *c, Sequence<Variable_ID> &evac_from, Sequence<Variable_ID> &evac_to, int n_from, int n_to, int max_arity, int n, bool allow_offset) { -  // check each position v to see if from[v] == to[v+n] (+ offset) -     -  assert(max_arity + n <= n_to); - -  for (int v = 1; v <= max_arity; v++){ -    // first, get rid of possible interlopers: -    int col; -    Conjunct *d = c->copy_conj_same_relation(); -    for (int tv = 1; tv <= n_to; tv++) -      if (tv != v+n) -        if ((col = d->find_column(evac_to[tv])) > 0) -          try_to_sub(d->problem, col); -    for (int fv = 1; fv <= n_from; fv++) -      if (fv != v) -        if ((col = d->find_column(evac_from[fv])) > 0) -          try_to_sub(d->problem, col); - -    int c_to = d->find_column(evac_to[v+n]); -    int c_from = d->find_column(evac_from[v]); -    assert(c_to > 0); -    assert(c_from > 0); -    assert(c_to != c_from); - -    // now, just look for an equality c_to = c_from + offset - -    bool found_needed_eq = false; - -    for (int e = 0; e < d->problem->nEQs; e++) { -      if (d->problem->EQs[e].coef[c_from] != 0) { -        for (int k = allow_offset?1:0; k < d->problem->nVars; k++) -          if (k!=c_to && k!=c_from && d->problem->EQs[e].coef[k]!=0) -            break;  // this EQ is not what we need -        if (k == d->problem->nVars) { // this EQ is what we need -          found_needed_eq = true; -          break; -        } -      } -    } - -    delete d; - -    if (!found_needed_eq) -      return false;  // no EQ did what we need -  } - -  return true; -} - -void assert_subbed_syms(Conjunct *c) { -  int v, col; - -  // where possible, symbolic constants must have been subbed out -  for (v = 1; v <= c->relation()->global_decls()->length(); v++) -    if ((col = c->find_column((*c->relation()->global_decls())[v]))>0) -      assert(!try_to_sub(c->problem, col)); -} - - -static bool check_offset(Conjunct *c, Sequence<Variable_ID> &evac_from, Sequence<Variable_ID> &evac_to, int n_from, int n_to, int max_arity) { -  assert_subbed_syms(c); - -  return check_subseq_n(c,evac_from,evac_to,n_from,n_to,max_arity,0,true); -} - -static bool check_subseq(Conjunct *c, Sequence<Variable_ID> &evac_from, Sequence<Variable_ID> &evac_to, int n_from, int n_to, int max_arity) { -  assert_subbed_syms(c); - -  for (int i = 0; i <= n_to - max_arity; i++) -    if (check_subseq_n(c,evac_from,evac_to,n_from,n_to,max_arity,i,false)) -      return true; - -  return false; -} - -static bool check_offset_subseq(Conjunct *c, Sequence<Variable_ID> &evac_from, Sequence<Variable_ID> &evac_to, int n_from, int n_to, int max_arity) { -  assert_subbed_syms(c); - -  for (int i = 0; i <= n_to - max_arity; i++) -    if (check_subseq_n(c,evac_from,evac_to,n_from,n_to,max_arity,i,true)) -      return true; - -  return false; -} - -bool check_affine(Conjunct *d, Sequence<Variable_ID> &evac_from, Sequence<Variable_ID> &evac_to, int n_from, int n_to, int max_arity) { -  int v, col; -  Conjunct *c = d->copy_conj_same_relation(); -  assert_subbed_syms(c); - -  // try to find substitutions for all evac_to variables -  for (v = 1; v <= max_arity; v++) -    if ((col = c->find_column(evac_to[v])) > 0) -      try_to_sub(c->problem, col); -     -  // any that didn't have substitutions, aren't affine -  for (v = 1; v <= max_arity; v++) -    if (c->find_column(evac_to[v]) >= 0) { -      delete c; -      return false; -    } - -  // FERD - disallow symbolic constants? -  delete c; -  return true; -} - - -evac study(Conjunct *C, Sequence<Variable_ID> &evac_from, Sequence<Variable_ID> &evac_to, int n_from, int n_to, int max_arity) { -  assert(max_arity > 0); -  assert(max_arity <= C->relation()->n_inp()); -  assert(max_arity <= C->relation()->n_out()); - -  assert((&evac_from == &input_vars && &evac_to == &output_vars) || -         (&evac_from == &output_vars && &evac_to == &input_vars)); - -  evac ret = evac_nasty; - -  if (C->query_guaranteed_leading_0s() >= max_arity) -    ret = evac_trivial; -  else { -    Conjunct *c = C->copy_conj_same_relation(); -    assert(c->relation() == C->relation()); - -    if (evac_debug >= 3) { -      fprintf(DebugFile, "About to study %s evacuation for conjunct\n", -              &evac_from == &input_vars ? "In-->Out" : "Out-->In"); -      use_ugly_names++; -      C->prefix_print(DebugFile); -      use_ugly_names--; -    } - -    bool sat = simplify_conj(c, true, 4, black); -    assert(sat);  // else c is deleted - -    int v, col; - -    // Substitute out all possible symbolic constants -    assert(c->problem->nSUBs == 0); -    for (v = 1; v <= c->relation()->global_decls()->length(); v++) -      if ((col = c->find_column((*c->relation()->global_decls())[v]))>0) -        try_to_sub(c->problem, col); - -    if (check_offset(c, evac_from, evac_to, n_from, n_to, max_arity)) -      ret = evac_offset; -    else if (check_subseq(c, evac_from, evac_to, n_from, n_to, max_arity)) -      ret = evac_subseq; -    else if (check_offset_subseq(c, evac_from, evac_to, n_from, n_to, max_arity)) -      ret = evac_offset_subseq; -    else if (check_affine(c, evac_from, evac_to, n_from, n_to, max_arity)) -      ret = evac_affine; - -    delete c; -  } - -  if (evac_debug >= 2) { -    if ((evac_debug == 2 && ret != evac_trivial && ret != evac_nasty)) { -      fprintf(DebugFile, "Studied %s evacuation for conjunct\n", -              &evac_from == &input_vars ? "In-->Out" : "Out-->In"); -      use_ugly_names++; -      C->prefix_print(DebugFile); -      use_ugly_names--; -    } - -    fprintf(DebugFile, "Saw evacuation type %s\n", evac_names[ret]); -  } - -  return ret; -} - - -void study_evacuation(Conjunct *C, which_way dir, int max_arity) { -  if (evac_debug > 0) { -    assert(max_arity >= 0); - -    if (max_arity > 0) -      if (dir == in_to_out) { -        assert(max_arity <= C->relation()->n_inp()); -        if (max_arity <= C->relation()->n_out()) -          single_evacs[study(C, input_vars, output_vars, -                             C->relation()->n_inp(), -                             C->relation()->n_out(), -                             max_arity)]++; -      } -      else { -        assert(max_arity <= C->relation()->n_out()); -        if (max_arity <= C->relation()->n_inp()) -          single_evacs[study(C, output_vars, input_vars, -                             C->relation()->n_out(), -                             C->relation()->n_inp(), -                             max_arity)]++; -      } -  } -} - -void study_evacuation(Conjunct *C1, Conjunct *C2, int max_arity) { -  if (evac_debug > 0) { -    assert(max_arity >= 0); -    assert(max_arity <= C1->relation()->n_inp()); -    assert(C2->relation()->n_out() == C1->relation()->n_inp()); - -    if (max_arity > 0) -      if (max_arity <= C1->relation()->n_out() && -          max_arity <= C2->relation()->n_inp()) { -        double_evacs[study(C1, input_vars, output_vars,  -                           C1->relation()->n_inp(), -                           C1->relation()->n_out(), -                           max_arity)] -          [study(C2, output_vars, input_vars, -                 C2->relation()->n_out(), -                 C2->relation()->n_inp(), -                 max_arity)]++; -      } -      else if (max_arity <= C1->relation()->n_out()) { -        single_evacs[study(C1, input_vars, output_vars, -                           C1->relation()->n_inp(), -                           C1->relation()->n_out(), -                           max_arity)]++; -      } -      else if (max_arity <= C2->relation()->n_inp()) { -        single_evacs[study(C2, output_vars, input_vars, -                           C2->relation()->n_out(), -                           C2->relation()->n_inp(), -                           max_arity)]++; -      } -  } -} - -class Evac_info_printer { -public: -  ~Evac_info_printer(); -}; - -Evac_info_printer::~Evac_info_printer() { -  if (evac_debug > 0) { -    int i, j; - -    fprintf(DebugFile, "\n"); - -    fprintf(DebugFile, "SINGLE"); -    for (i = 0; i <= evac_nasty; i++) -      fprintf(DebugFile, "\t%s", evac_names[i]); -    fprintf(DebugFile, "\n"); -  -    for (i = 0; i <= evac_nasty; i++) -      fprintf(DebugFile, "\t%d", single_evacs[i]); -    fprintf(DebugFile, "\n\n"); -  -  -    fprintf(DebugFile, "DOUBLE"); -    for (i = 0; i <= evac_nasty; i++) -      fprintf(DebugFile, "\t%s", evac_names[i]); -    fprintf(DebugFile, "\n"); -  -    for (i = 0; i <= evac_nasty; i++) { -      fprintf(DebugFile, "%s\t", evac_names[i]); -      for (j = 0; j <= evac_nasty; j++) -        fprintf(DebugFile, "%d\t", double_evacs[i][j]); -      fprintf(DebugFile, "\n"); -    } -  } -} - -static Evac_info_printer print_stats_at_exit; - -} // namespace - -#endif diff --git a/omega/omega_lib/src/farkas.cc b/omega/omega_lib/src/farkas.cc deleted file mode 100644 index 1b3ef87..0000000 --- a/omega/omega_lib/src/farkas.cc +++ /dev/null @@ -1,480 +0,0 @@ -/***************************************************************************** - Copyright (C) 1994-2000 the Omega Project Team - Copyright (C) 2005-2011 Chun Chen - All Rights Reserved. - - Purpose: -   convert to dual cone for manipulation. - - Notes: - - History: -*****************************************************************************/ - -#include <basic/Bag.h> -#include <basic/Map.h> -#include <omega.h> -#include <omega/farkas.h> - -namespace omega { - -static Global_Var_Decl constant_term("constantTerm"); - -// class Constant_Term { -// public: -//   Global_Var_Decl *p; - -//   Constant_Term(); -//   ~Constant_Term(); -// }; - -// namespace { -//   Constant_Term constant_term; -// } - -// Constant_Term::Constant_Term() { -//   p = new Global_Var_Decl("constantTerm"); -// } - -// Constant_Term::~Constant_Term() { -//   delete p; -// } - -// Global_Var_ID coefficient_of_constant_term = constant_term.p; - -Global_Var_ID coefficient_of_constant_term = &constant_term; - -extern int inApproximateMode; - -int farkas_debug = 0; - -coef_t farkasDifficulty; - -//***************************************************************************** -// -// forall x1,..,xn s.t. a10 + a11 x1 + ... + a1n xn >= 0 and -//                                     ... -//                      am0 + am1 x1 + ... + amn xn >= 0 -// -// b0 + b1 x1 + ... + bn xn >= 0  -// -//            iff -// -// exists lambda_0,...,lambda_m >= 0 s.t. -//     forall x1,..,xn  -//       lambda_0 + -//       lambda_1 ( a10 + a11 x1 + ... + a1n xn) + -//                                ... -//       lambda_m ( am0 + am1 x1 + ... + amn xn) = -// -//                   b0 +  b1 x1 + ... +  bn xn -// -//            iff -// -// exists lambda_0,...,lambda_m >= 0 s.t. -//   lambda_0 + sum_i ( lambda_i a_i0 ) = b_0 -//   for j in 1..n -//       sum_i ( a_ij lambda_i ) = b_j -// -//            iff -// -// exists lambda0,...,lambda_m s.t. -//        lambda1,...,lambda_m >= 0  -//        lambda0 >= 0  -//   lambda_0 = b_0 - sum_i ( lambda_i a_i0 ) -//   for j in 1..n -//       sum_i ( a_ij lambda_i ) = b_j -//            iff -// -// exists lambda1,...,lambda_m s.t. -//        lambda1,...,lambda_m >= 0  -//   b_0 - sum_i ( lambda_i a_i0 ) >= 0 -//   for j in 1..n -//       sum_i ( a_ij lambda_i ) = b_j -// -// a_ij come from relation rel -// -// x_1,...,x_n are input and output variables from rel. -// -// b_0,...,b_m are input and output arrays of coef_vars -// -//***************************************************************************** - - -// Given a Relation/Set R -// Compute A,B,C such that -// Ax+By + C >= 0 is true for all x,y in R -// iff [A,B] : constantTerm=C is in AffineClosure(R) -// Note: constantTerm is a special global variable -// If constantTerm appears in the incoming relation -// then set it's coefficient to be 1 in the result - - -// # For example, given -// R := {[i,j] : 1 <= i <= 10 && 1 <= j <= n}; -// # the farkas closure of R is: -// # ac := approximate {[i,j] : exists (lambda0, lambda1,lambda2,lambda3,lambda4 : -// #       0 <= lambda1,lambda2,lambda3,lambda4 -// #       && constantTerm - (-lambda1+ 10 lambda2 - lambda3) >= 0 -// #       && i = lambda1-lambda2 -// #       && j = lambda3-lambda4 -// #       && n = lambda4)}; -// #  -// # ac; -//  -// {[i,j]: 0 <= n && 0 <= n+constantTerm+i+j  -//   && 0 <= n+constantTerm+10i+j && 0 <= n+j} -//  -// The ConvexCombination of ac is: -//#  -//# approximate {[i,j] : exists (lambda1,lambda2,lambda3,lambda4 : -//#       0 <= lambda1,lambda2,lambda3,lambda4 -//#       && 1 = lambda2+lambda3 -//#       && i = lambda2+10lambda3 -//#       && j = lambda2+lambda3+lambda4 -//#       && n = lambda1+lambda2+lambda3+lambda4 -//#       )}; -// -//{[i,j]: 1 <= i <= 10 && 1 <= j <= n} -// - -static void handleVariable(Relation &farkas, Conjunct * conj, -                           F_And* and_node,  -                           Map<GEQ_Handle, Variable_ID> &gMap, -                           Map<EQ_Handle, Variable_ID> &eMap, -                           Variable_ID v) { -  use_ugly_names++; -  if (farkas_debug > 1) { -    fprintf(DebugFile,"Building equality for %s\n", v->name().c_str()); -  } - -  EQ_Handle e = and_node->add_EQ(); - -  for (GEQ_Iterator g = conj->GEQs(); g.live(); g.next()) -    if (gMap(*g) != (Variable_ID) 0) { -      coef_t c = (*g).get_coef(v); -      if (c != 0) { -        e.update_coef(gMap(*g), c); -      } -    } -     -  for (EQ_Iterator eq = conj->EQs(); eq.live(); eq.next()) -    if (eMap(*eq) != (Variable_ID) 0) { -      coef_t c = (*eq).get_coef(v); -      if (c != 0) { -        e.update_coef(eMap(*eq), c); -      } -    } - -  if ((v)->kind() == Global_Var && -      (v)->get_global_var() == coefficient_of_constant_term) -    e.update_const(-1); -  else -    e.update_coef(farkas.get_local(v), -1); - -  e.finalize(); -  if (farkas_debug > 1) { -    fprintf(DebugFile,"Constraint is %s\n", e.print_to_string().c_str()); -  } -  use_ugly_names--; -} - - -Relation Farkas(NOT_CONST Relation &input_R, Farkas_Type op, bool early_bailout) { -  assert(!input_R.is_null()); -  int saved_use_ugly_names = use_ugly_names; -   -  use_ugly_names++; -  farkasDifficulty = 0; - -  Relation R = consume_and_regurgitate(input_R); - -  if (op == Basic_Farkas || op == Decoupled_Farkas) { -    R.simplify(2, 4); -    R = Approximate(R, false); -  } - -  Relation result = Relation::False(R); - -  if (farkas_debug) { -    fprintf(DebugFile,"Computing farka of: [\n"); -    R.prefix_print(DebugFile); -  } - -  Variable_ID_Tuple vars; -  for (Variable_ID_Iterator v(*R.global_decls()); v; v++) vars.append(*v); -  if (R.is_set())  -    for(int i=1; i <= R.n_set(); i++) vars.append(R.set_var(i)); -  else { -    int i; -    for(i=1; i <= R.n_inp(); i++) vars.append(R.input_var(i)); -    for(i=1; i <= R.n_out(); i++) vars.append(R.output_var(i)); -  } -  -  Set<Variable_ID> empty; -  Variable_ID_Tuple owners; -  Map<Variable_ID, Set<Variable_ID> > connectedVariables(empty); - -  if (op == Decoupled_Farkas) { -    for (Variable_ID_Iterator v(*R.global_decls()); v; v++)  -      if ((*v)->kind() == Global_Var) { -        Global_Var_ID g = (*v)->get_global_var(); -        if (g->arity() > 0) { -          if (R.is_set())  -            for(int i=1; i <= g->arity(); i++)  -              (*v)->UF_union(R.set_var(i)); -          else if ((*v)->function_of() == Input_Tuple) -            for(int i=1; i <= g->arity(); i++)  -              (*v)->UF_union(R.input_var(i)); -          else -            for(int i=1; i <= g->arity(); i++)  -              (*v)->UF_union(R.output_var(i)); -        } -      }  - -    for (DNF_Iterator s(R.query_DNF()); s.live(); s.next()) { -      for (Variable_ID_Iterator v1(*(*s)->variables()); v1; v1++) { -        for (EQ_Iterator eq = (*s)->EQs(); eq.live(); eq.next())  -          if ((*eq).get_coef(*v1))  -            for (Variable_ID_Iterator v2(*(*s)->variables()); v2; v2++)  -              if ((*eq).get_coef(*v2))  -                (*v1)->UF_union(*v2); -        for (GEQ_Iterator g = (*s)->GEQs(); g.live(); g.next())  -          if ((*g).get_coef(*v1))  -            for (Variable_ID_Iterator v2(*(*s)->variables()); v2; v2++)  -              if ((*g).get_coef(*v2))  -                (*v1)->UF_union(*v2); -      } -    } -    for (Variable_ID_Iterator v3(vars); v3.live(); v3.next())  -      connectedVariables[(*v3)->UF_owner()] |= *v3; - -    foreach_map(v,Variable_ID,s,Set<Variable_ID>,connectedVariables, -                owners.append(v); -                if (farkas_debug) { -                  fprintf(DebugFile,"%s:",v->char_name()); -                  foreach(v2,Variable_ID,s, -                          fprintf(DebugFile," %s",v2->char_name()); -                    ); -                  fprintf(DebugFile,"\n"); -                } -      ); -  } - -  Variable_ID_Iterator varGroup(owners); -  int lambda_cnt = 1; -     -  Relation partialResult; -  bool firstGroup = true; -  try { -    while ((op == Decoupled_Farkas && varGroup.live()) -           || (op != Decoupled_Farkas && firstGroup)) { - -      if (farkas_debug && op == Decoupled_Farkas) { -        fprintf(DebugFile,"[Computing decoupled farkas for:"); -        foreach(v2,Variable_ID,connectedVariables(varGroup.curr()), -                fprintf(DebugFile," %s",v2->char_name()); -          ); -        fprintf(DebugFile,"\n"); -      } -      firstGroup = false; -      partialResult = Relation::True(R); -      coef_t difficulty = 0; -      for (DNF_Iterator s(R.query_DNF()); s.live(); s.next()) { -        int nz; -        coef_t m,sum; -        (*s)->difficulty(nz,m,sum); -        difficulty = max((coef_t) nz,2*nz+2*m+sum); -        if (farkas_debug) { -          fprintf(DebugFile,"Computing farka of conjunct: \n"); -          (*s)->prefix_print(DebugFile); -          fprintf(DebugFile,"Difficulty is " coef_fmt "(%d," coef_fmt "," coef_fmt ")\n", difficulty,nz,m,sum); -        } -        if (early_bailout && difficulty >= 500)  { -          farkasDifficulty = difficulty; -          if (farkas_debug) { -            fprintf(DebugFile,"Too ugly, returning dull result\n"); -          } -          use_ugly_names--; -          if (op == Basic_Farkas || op == Decoupled_Farkas)  -            return Relation::False(partialResult); -          else return Relation::True(partialResult); -        } -        Relation farkas = Relation::Empty(R); -        farkas.copy_names(R); -        F_Exists* exist = farkas.add_exists(); -        F_And* and_node = exist->add_and(); -        Map<GEQ_Handle, Variable_ID> gMap((Variable_ID)0); -        Map<EQ_Handle, Variable_ID> eMap((Variable_ID)0); -        for (EQ_Iterator eq = (*s)->EQs(); eq.live(); eq.next()) { -          if (op == Decoupled_Farkas) { -            bool ShouldConsider = true; -            for (Variable_ID_Iterator v(*(*s)->variables()); v; v++) { -              if ((*eq).get_coef(*v) != 0  -                  && (*v)->UF_owner() != varGroup.curr())  { -                ShouldConsider = false; -                break; -              } -            } -            if (!ShouldConsider) continue; -          } -          char s[10]; -          sprintf(s, "lambda%d", lambda_cnt++); -          eMap[*eq] = exist->declare(s); -          assert(op == Basic_Farkas || op == Decoupled_Farkas  -                 || (*eq).get_const() == 0); -        } -        for (GEQ_Iterator g = (*s)->GEQs(); g.live(); g.next()) { -          if (op == Decoupled_Farkas) { -            bool ShouldConsider = true; -            for (Variable_ID_Iterator v(*(*s)->variables()); v; v++) { -              if ((*g).get_coef(*v) != 0  -                  && (*v)->UF_owner() != varGroup.curr())  { -                ShouldConsider = false; -                break; -              } -            } -            if (!ShouldConsider) continue; -          } -          char s[10]; -          sprintf(s, "lambda%d", lambda_cnt++); -          Variable_ID lambda = exist->declare(s); -          GEQ_Handle positive; -          switch(op) { -          case Positive_Combination_Farkas: -          case Convex_Combination_Farkas: -          case Basic_Farkas:  -          case Decoupled_Farkas:  -            positive = and_node->add_GEQ(); -            positive.update_coef(lambda, 1); -            positive.finalize(); -            break; -          case Linear_Combination_Farkas: -          case Affine_Combination_Farkas:  -            break; -          } -          gMap[*g] = lambda; -          assert(op == Basic_Farkas || op == Decoupled_Farkas || (*g).get_const() == 0); -        } - -        for (Variable_ID_Iterator v(vars); v; v++) { -          assert((*v)->kind() != Wildcard_Var); -          if ((*v)->kind() == Global_Var  -              && (*v)->get_global_var() == coefficient_of_constant_term)  { -            assert(op != Basic_Farkas && op != Decoupled_Farkas); -            if (op == Linear_Combination_Farkas) continue; -            if (op == Positive_Combination_Farkas) continue; -          } -          if (op == Decoupled_Farkas && (*v)->UF_owner() != varGroup.curr()) { -            EQ_Handle e = and_node->add_EQ(); -            e.update_coef(farkas.get_local(*v),-1); -            continue; -          } -          handleVariable(farkas, *s, and_node, gMap,eMap, *v); -        } - -        if (op == Basic_Farkas || op == Decoupled_Farkas) { -          GEQ_Handle e = and_node->add_GEQ(); -          e.update_coef(farkas.get_local(coefficient_of_constant_term),1); -          for (GEQ_Iterator g = s.curr()->GEQs(); g.live(); g.next())  -            if (gMap(*g) != (Variable_ID) 0) -              e.update_coef( gMap(*g),-(*g).get_const()); -          for (EQ_Iterator eq = s.curr()->EQs(); eq.live(); eq.next())  -            if (eMap(*eq) != (Variable_ID) 0) -              e.update_coef(eMap(*eq),-(*eq).get_const()); -          e.finalize(); -        } -         -        // lambda variables are not integers, so disable integer problem solving, -        // we just mark it as simplified. -        farkas.simplify(-1, -1); -         -        farkas.single_conjunct()->difficulty(nz,m,sum); -        difficulty = max((coef_t) nz,2*nz+2*m+sum); -        if (farkas_debug) { -          fprintf(DebugFile,"farka has difficulty " coef_fmt "(%d," coef_fmt "," coef_fmt "):\n", difficulty,nz,m,sum); -          farkas.prefix_print(DebugFile); -        } -        if (early_bailout && difficulty >= 500)  { -          farkasDifficulty = difficulty; -          if (farkas_debug) { -            fprintf(DebugFile,"Too ugly, returning dull result\n"); -          } -          use_ugly_names--; -          if (op == Basic_Farkas || op == Decoupled_Farkas)  -            return Relation::False(partialResult); -          else return Relation::True(partialResult); -        } -        farkas = Approximate(farkas); -        if (farkas_debug) { -          fprintf(DebugFile,"simplified:\n"); -          farkas.prefix_print(DebugFile); -        } -        partialResult = Approximate(Intersection(partialResult,farkas)); -        if (farkas_debug) { -          fprintf(DebugFile,"combined:\n"); -          partialResult.prefix_print(DebugFile); -        } -        if (partialResult.has_single_conjunct()) { -          partialResult.single_conjunct()->difficulty(nz,m,sum); -          difficulty = max((coef_t) nz,2*nz+2*m+sum); -        } -        else  -          difficulty = 1000; -        if (early_bailout && difficulty >= 500) { -          farkasDifficulty = difficulty; -          if (farkas_debug) { -            fprintf(DebugFile,"Too ugly, returning dull result\n"); -          } -          use_ugly_names--; -          if (op == Basic_Farkas || op == Decoupled_Farkas)  -            return Relation::False(partialResult); -          else return Relation::True(partialResult); -        } -      } -      farkasDifficulty += difficulty; - -      if (farkas_debug) { -        fprintf(DebugFile,"] done computing farkas\n"); -        partialResult.prefix_print(DebugFile); -      } - -      if (op == Decoupled_Farkas) { -        result = Union(result,partialResult); -        varGroup.next(); -      } -    } -  } -  catch (const std::overflow_error &e) { -    // clear global variables -    inApproximateMode = 0; -    use_ugly_names = saved_use_ugly_names; - -    if (early_bailout) { -      if (farkasDifficulty < 1000) -        farkasDifficulty = 1000; -      // return dull result -      if (op == Basic_Farkas || op == Decoupled_Farkas) -        return Relation::False(partialResult); -      else -        return Relation::True(partialResult); -    } -    else -      throw std::overflow_error("farkas too ugly"); -  } - -  if (1 || op == Decoupled_Farkas)  { -    foreach(v,Variable_ID,vars, reset_remap_field(v)); -  } -  use_ugly_names--; -  if (op == Decoupled_Farkas)  { -    if (farkas_debug) { -      fprintf(DebugFile,"] decoupled result:\n"); -      result.prefix_print(DebugFile); -    } -    return result; -  } -  return partialResult; -} - -} // namespace diff --git a/omega/omega_lib/src/hull.cc b/omega/omega_lib/src/hull.cc deleted file mode 100644 index f1b0601..0000000 --- a/omega/omega_lib/src/hull.cc +++ /dev/null @@ -1,1489 +0,0 @@ -/***************************************************************************** - Copyright (C) 1994-2000 University of Maryland - Copyright (C) 2008 University of Southern California - Copyright (C) 2009-2010 University of Utah - All Rights Reserved. - - Purpose: -   Various hull calculations. - - Notes: - - History: -  06/15/09  ConvexRepresentation, Chun Chen -  11/25/09  RectHull, Chun Chen -*****************************************************************************/ - -#include <omega.h> -#include <omega/farkas.h> -#include <omega/hull.h> -#include <basic/Bag.h> -#include <basic/Map.h> -#include <basic/omega_error.h> -#include <list> -#include <vector> -#include <set> - -namespace omega { - -int hull_debug = 0;  - -Relation ConvexHull(NOT_CONST Relation &R) { -  Relation S = Approximate(consume_and_regurgitate(R)); -  if (!S.is_upper_bound_satisfiable()) -    return S; -  if (S.has_single_conjunct()) -    return S; -  return Farkas(Farkas(S,Basic_Farkas), Convex_Combination_Farkas); -} - -Relation DecoupledConvexHull(NOT_CONST Relation &R) { -  Relation S = Approximate(consume_and_regurgitate(R)); -  if (!S.is_upper_bound_satisfiable()) -    return S; -  if (S.has_single_conjunct()) -    return S; -  return Farkas(Farkas(S,Decoupled_Farkas), Convex_Combination_Farkas); -} - -Relation AffineHull(NOT_CONST Relation &R) { -  Relation S = Approximate(consume_and_regurgitate(R)); -  if (!S.is_upper_bound_satisfiable()) -    return S; -  return Farkas(Farkas(S,Basic_Farkas), Affine_Combination_Farkas); -} - -Relation LinearHull(NOT_CONST Relation &R) { -  Relation S = Approximate(consume_and_regurgitate(R)); -  if (!S.is_upper_bound_satisfiable()) -    return S; -  return Farkas(Farkas(S,Basic_Farkas), Linear_Combination_Farkas); -} - -Relation ConicHull(NOT_CONST Relation &R) { -  Relation S = Approximate(consume_and_regurgitate(R)); -  if (!S.is_upper_bound_satisfiable()) -    return S;   -  return Farkas(Farkas(S,Basic_Farkas), Positive_Combination_Farkas); -} - - -Relation FastTightHull(NOT_CONST Relation &input_R, NOT_CONST Relation &input_H) { -  Relation R = Approximate(consume_and_regurgitate(input_R)); -  Relation H = Approximate(consume_and_regurgitate(input_H)); - -  if (hull_debug) { -    fprintf(DebugFile,"[ Computing FastTightHull of:\n"); -    R.prefix_print(DebugFile); -    fprintf(DebugFile,"given known hull of:\n"); -    H.prefix_print(DebugFile); -  } - -  if (!H.has_single_conjunct()) { -    if (hull_debug)  -      fprintf(DebugFile, "] bailing out of FastTightHull, known hull not convex\n"); -    return H; -  } - -  if (!H.is_obvious_tautology()) { -    R = Gist(R,copy(H)); -    R.simplify(1,0); -  } - -  if (R.has_single_conjunct()) { -    R = Intersection(R,H); -    if (hull_debug)  { -      fprintf(DebugFile, "] quick easy answer to FastTightHull\n"); -      R.prefix_print(DebugFile); -    } -    return R; -  } -  if (R.has_local(coefficient_of_constant_term)) { -    if (hull_debug) { -      fprintf(DebugFile, "] Can't handle recursive application of Farkas lemma\n"); -    } -    return H; -  } -   -  if (hull_debug) { -    fprintf(DebugFile,"Gist of R given H is:\n"); -    R.prefix_print(DebugFile); -  } - -  if (1) { -    Set<Variable_ID> vars; -    int conjuncts = 0; -    for (DNF_Iterator s(R.query_DNF()); s.live(); s.next()) { -      conjuncts++; -      for (Variable_ID_Iterator v(*((*s)->variables())); v.live(); v++) { -        bool found = false; -        for (EQ_Iterator eq = (*s)->EQs(); eq.live(); eq.next()) -          if ((*eq).get_coef(*v) != 0) { -            if (!found) vars.insert(*v); -            found = true; -            break; -          } -        if (!found) -          for (GEQ_Iterator geq = (*s)->GEQs(); geq.live(); geq.next()) -            if ((*geq).get_coef(*v) != 0) { -              if (!found) vars.insert(*v); -              found = true; -              break; -            } -      } -    } - -      -    // We now know which variables appear in R -    if (hull_debug) { -      fprintf(DebugFile,"Variables we need a better hull on are: "); -      foreach(v,Variable_ID,vars, -              fprintf(DebugFile," %s",v->char_name())); -      fprintf(DebugFile,"\n"); -    } -    Conjunct *c = H.single_conjunct(); -    int total=0; -    int copied = 0; -    for (EQ_Iterator eq = c->EQs(); eq.live(); eq.next()) { -      total++; -      foreach(v,Variable_ID,vars, -              if ((*eq).get_coef(v) != 0) { -                R.and_with_EQ(*eq); -                copied++; -                break; // out of variable loop -              } -        ); -    } -    for (GEQ_Iterator geq = c->GEQs(); geq.live(); geq.next()) { -      total++; -      foreach(v,Variable_ID,vars, -              if ((*geq).get_coef(v) != 0) { -                R.and_with_GEQ(*geq); -                copied++; -                break; // out of variable loop -              } -        ); -    } -    if (copied < total) { -      R = Approximate(R); - -      if (hull_debug) {  -        fprintf(DebugFile,"Decomposed relation, copied only %d of %d constraints\n",copied,total); -        fprintf(DebugFile,"Original R:\n"); -        R.prefix_print(DebugFile); -        fprintf(DebugFile,"Known hull:\n"); -        H.prefix_print(DebugFile); -        fprintf(DebugFile,"New R:\n"); -        R.prefix_print(DebugFile); -      } -    } -  } - -  Relation F = Farkas(copy(R), Basic_Farkas, true); -  if (hull_debug)   -    fprintf(DebugFile,"Farkas Difficulty = " coef_fmt "\n", farkasDifficulty); -  if (farkasDifficulty > 260) { -    if (hull_debug)  { -      fprintf(DebugFile, "] bailing out, farkas is way too complex\n"); -      fprintf(DebugFile,"Farkas:\n"); -      F.prefix_print(DebugFile); -    } -    return H; -  } -  else if (farkasDifficulty > 130) { -    // Bail out -    if (hull_debug)  { -      fprintf(DebugFile, coef_fmt " non-zeros in original farkas\n", farkasDifficulty); -    } -    Relation tmp = Farkas(R, Decoupled_Farkas, true); -     -    if (hull_debug)  { -      fprintf(DebugFile, coef_fmt " non-zeros in decoupled farkas\n", farkasDifficulty); -    } -    if (farkasDifficulty > 260)  { -      if (hull_debug)  { -        fprintf(DebugFile, "] bailing out, farkas is way too complex\n"); -        fprintf(DebugFile,"Farkas:\n"); -        F.prefix_print(DebugFile); -      } -      return H; -    } -    else { -      if (farkasDifficulty > 130)  -        R = Intersection(H, Farkas(tmp, Affine_Combination_Farkas, true)); -      else R = Intersection(H, -                            Intersection(Farkas(tmp, Convex_Combination_Farkas, true), -                                         Farkas(F, Affine_Combination_Farkas, true))); -      if (hull_debug)  { -        fprintf(DebugFile, "] bailing out, farkas is too complex, using affine hull\n"); -        fprintf(DebugFile,"Farkas:\n"); -        F.prefix_print(DebugFile); -        fprintf(DebugFile,"Affine hull:\n"); -        R.prefix_print(DebugFile); -      } -      return R; -    } -  } -   -  R = Intersection(H, Farkas(F, Convex_Combination_Farkas, true)); -  if (hull_debug)  { -    fprintf(DebugFile, "] Result of FastTightHull:\n"); -    R.prefix_print(DebugFile); -  } -  return R; -} - - - -namespace { -  bool parallel(const GEQ_Handle &g1, const GEQ_Handle &g2) { -    for(Constr_Vars_Iter cvi(g1, false); cvi; cvi++) { -      coef_t c1 = (*cvi).coef; -      coef_t c2 = g2.get_coef((*cvi).var); -      if (c1 != c2) return false; -    } -    { -      for(Constr_Vars_Iter cvi(g2, false); cvi; cvi++) { -        coef_t c1 = g1.get_coef((*cvi).var); -        coef_t c2 = (*cvi).coef; -        if (c1 != c2) return false; -      } -    } -    return true; -  } - - -  bool hull(const EQ_Handle &e, const GEQ_Handle &g, coef_t &hull) { -    int sign = 0; -    for(Constr_Vars_Iter cvi(e, false); cvi; cvi++) { -      coef_t c1 = (*cvi).coef; -      coef_t c2 = g.get_coef((*cvi).var); -      if (sign == 0) sign = (c1*c2>=0?1:-1); -      if (sign*c1 != c2) return false; -    } -    assert(sign != 0); -    { -      for(Constr_Vars_Iter cvi(g, false); cvi; cvi++) { -        coef_t c1 = e.get_coef((*cvi).var); -        coef_t c2 = (*cvi).coef; -        if (sign*c1 != c2) return false; -      } -    } -    hull = max(sign * e.get_const(), g.get_const()); -    if (hull_debug) { -      fprintf(DebugFile,"Hull of:\n %s\n", e.print_to_string().c_str()); -      fprintf(DebugFile," %s\n", g.print_to_string().c_str()); -      fprintf(DebugFile,"is " coef_fmt "\n\n",hull); -    } -    return true; -  } - -  bool eq(const EQ_Handle &e1, const EQ_Handle &e2) { -    int sign = 0; -    for(Constr_Vars_Iter cvi(e1, false); cvi; cvi++) { -      coef_t c1 = (*cvi).coef; -      coef_t c2 = e2.get_coef((*cvi).var); -      if (sign == 0) sign = (c1*c2>=0?1:-1); -      if (sign*c1 != c2) return false; -    } -    assert(sign != 0); -    { -      for(Constr_Vars_Iter cvi(e2, false); cvi; cvi++) { -        coef_t c1 = e1.get_coef((*cvi).var); -        coef_t c2 = (*cvi).coef; -        if (sign*c1 != c2) return false; -      } -    } -    return sign * e1.get_const() == e2.get_const(); -  } -} - - -// This function is deprecated!!! -Relation QuickHull(Relation &R) { -  Tuple<Relation> Rs(1); -  Rs[1] = R; -  return QuickHull(Rs); -} - - -// This function is deprecated!!! -Relation QuickHull(Tuple<Relation> &Rs) { -  assert(!Rs.empty()); - -  // if (Rs.size() == 1) return Rs[1]; - -  Tuple<Relation> l_Rs; -  for (int i = 1; i <= Rs.size(); i++) -    for (DNF_Iterator c(Rs[i].query_DNF()); c; c++) { -      Relation r = Relation(Rs[i], c.curr()); -      l_Rs.append(Approximate(r)); -    } -     -  if (l_Rs.size() == 1) -    return l_Rs[1]; -   -  Relation result = Relation::True(Rs[1]); -  result.copy_names(Rs[1]); - -  use_ugly_names++;  - -  if (hull_debug > 1)  -    for (int i = 1; i <= l_Rs.size(); i++) { -      fprintf(DebugFile,"#%d \n",i); -      l_Rs[i].prefix_print(DebugFile); -    } - -   -//   Relation R = copy(Rs[1]); -//   for (int i = 2; i <= Rs.size(); i++)  -//     R = Union(R,copy(Rs[i])); - -// #if 0 -//   if (!R.is_set()) { -//     if (R.n_inp() == R.n_out()) { -//       Relation AC = DeltasToRelation(Hull(Deltas(copy(R), -//                                                  min(R.n_inp(),R.n_out()))), -//                                      R.n_inp(),R.n_out()); -//       Relation dH = Hull(Domain(copy(R)),false); -//       Relation rH = Hull(Range(copy(R)),false); -//       result = Intersection(AC,Cross_Product(dH,rH));  -//     } -//     else { -//       Relation dH = Hull(Domain(copy(R)),false); -//       Relation rH = Hull(Range(copy(R)),false); -//       result = Cross_Product(dH,rH);  -//       assert(Must_Be_Subset(copy(R),copy(result))); -//     } -//   } - -// #endif -  -  Conjunct *first; -  l_Rs[1] = EQs_to_GEQs(l_Rs[1]); -  first = l_Rs[1].single_conjunct(); -  for (GEQ_Iterator candidate(first->GEQs()); candidate.live(); candidate.next()) { -    coef_t maxConstantTerm = (*candidate).get_const(); -    bool found = true;  -    if (hull_debug > 1) { -      fprintf(DebugFile,"searching for bound on:\n %s\n", (*candidate).print_to_string().c_str()); -    } -    for (int i = 2; i <= l_Rs.size(); i++) { -      Conjunct *other = l_Rs[i].single_conjunct(); -      bool found_for_i = false; -      for (GEQ_Iterator target(other->GEQs()); target.live(); target.next()) { -        if (hull_debug > 2) { -          fprintf(DebugFile,"candidate:\n %s\n", (*candidate).print_to_string().c_str()); -          fprintf(DebugFile,"target:\n %s\n", (*target).print_to_string().c_str()); -        } -        if (parallel(*candidate,*target)) { -          if (hull_debug > 1) -            fprintf(DebugFile,"Found bound:\n %s\n", (*target).print_to_string().c_str()); -          maxConstantTerm = max(maxConstantTerm,(*target).get_const()); -          found_for_i = true; -          break; -        } -      } -      if (!found_for_i) { -        for (EQ_Iterator target_e(other->EQs()); target_e.live(); target_e.next()) { -          coef_t h; -          if (hull(*target_e,*candidate,h)) { -            if (hull_debug > 1) -              fprintf(DebugFile,"Found bound of " coef_fmt ":\n %s\n", h, (*target_e).print_to_string().c_str()); -            maxConstantTerm = max(maxConstantTerm,h); -            found_for_i = true; -            break; -          } -        }; -        if (!found_for_i) { -          if (hull_debug > 1) { -            fprintf(DebugFile,"No bound found in:\n"); -            fprintf(DebugFile, "%s", l_Rs[i].print_with_subs_to_string().c_str()); -          } -          //if nothing found  -          found = false; -          break; -        } -      } -    } -    -    if (found) { -      GEQ_Handle  h = result.and_with_GEQ(); -      copy_constraint(h,*candidate); -      if (hull_debug > 1) -        fprintf(DebugFile,"Setting constant term to " coef_fmt " in\n %s\n", maxConstantTerm, h.print_to_string().c_str()); -      h.update_const(maxConstantTerm - (*candidate).get_const()); -      if (hull_debug > 1) -        fprintf(DebugFile,"Updated constraint is\n %s\n", h.print_to_string().c_str()); -    } -  } - - -  for (EQ_Iterator candidate_eq(first->EQs()); candidate_eq.live(); candidate_eq.next()) { -    bool found = true; -    for (int i = 2; i <= l_Rs.size(); i++) { -      Conjunct *C = l_Rs[i].single_conjunct(); -      bool found_for_i = false; - -      for (EQ_Iterator target(C->EQs()); target.live(); target.next()) { -        if (eq(*candidate_eq,*target)) { -          found_for_i = true; -          break; -        } -      } -      if (!found_for_i) { -        //if nothing found  -        found = false; -        break; -      } -    } -    -    if (found) { -      EQ_Handle  h = result.and_with_EQ(); -      copy_constraint(h,*candidate_eq); -      if (hull_debug > 1) -        fprintf(DebugFile,"Adding eq constraint: %s\n", h.print_to_string().c_str()); -    } -  } - -  use_ugly_names--; -  if (hull_debug > 1) { -    fprintf(DebugFile,"quick hull is of:"); -    result.print_with_subs(DebugFile); -  } -  return result; -} - - -// Relation Hull2(Tuple<Relation> &Rs, Tuple<int> &active) { -//   assert(Rs.size() == active.size() && Rs.size() > 0); - -//   Tuple<Relation> l_Rs; -//   for (int i = 1; i <= Rs.size(); i++) -//     if (active[i]) -//       l_Rs.append(copy(Rs[i])); - -//   if (l_Rs.size() == 0) -//     return Relation::False(Rs[1]); -     -//   try { -//     Relation r = l_Rs[1]; -//     for (int i = 2; i <= l_Rs.size(); i++) { -//       r = Union(r, copy(l_Rs[i])); -//       r.simplify(); -//     } - -//     // Relation F = Farkas(r, Basic_Farkas, true); -//     // if (farkasDifficulty >= 500) -//     //   throw std::overflow_error("loop convex hull too complicated."); -//     // F = Farkas(F, Convex_Combination_Farkas, true); -//     return Farkas(Farkas(r, Basic_Farkas, true), Convex_Combination_Farkas, true); -//   } -//   catch (std::overflow_error) { -//     return QuickHull(l_Rs); -//   } -// } -   - -namespace { -  void printRs(Tuple<Relation> &Rs) { -    fprintf(DebugFile,"Rs:\n"); -    for (int i = 1; i <= Rs.size(); i++) -      fprintf(DebugFile,"#%d : %s\n",i, -              Rs[i].print_with_subs_to_string().c_str()); -  } -} - -Relation BetterHull(Tuple<Relation> &Rs, bool stridesAllowed, bool checkSubsets, -                    NOT_CONST Relation &input_knownHull = Relation::Null()) { -  Relation knownHull = consume_and_regurgitate(input_knownHull); -  static int OMEGA_WHINGE = -1; -  if (OMEGA_WHINGE < 0) { -    OMEGA_WHINGE = getenv("OMEGA_WHINGE") ? atoi(getenv("OMEGA_WHINGE")) : 0; -  } -  assert(!Rs.empty()); -  if (Rs.size() == 1) { -    if (stridesAllowed) return Rs[1]; -    else return Approximate(Rs[1]); -  } - -  if (checkSubsets) { -    Tuple<bool> live(Rs.size()); -    if (hull_debug) { -      fprintf(DebugFile,"Checking subsets in hull computation:\n"); -      printRs(Rs); -    } -    int i; -    for(i=1;i <=Rs.size(); i++) live[i] = true; -    for(i=1;i <=Rs.size(); i++)  -      for(int j=1;j <=Rs.size(); j++) if (i != j && live[j]) { -          if (hull_debug) fprintf(DebugFile,"checking %d Is_Obvious_Subset %d\n",i,j); -          if (Is_Obvious_Subset(copy(Rs[i]),copy(Rs[j]))) { -            if (hull_debug) fprintf(DebugFile,"yes...\n"); -            live[i] = false; -            break; -          } -        } -    for(i=1;i <=Rs.size(); i++) if (!live[i]) { -        if (i < Rs.size()) { -          Rs[i] = Rs[Rs.size()]; -          live[i] = live[Rs.size()]; -        } -        Rs[Rs.size()] = Relation(); -        Rs.delete_last(); -        i--; -      } -  } -  Relation hull; -  if (hull_debug) { -    fprintf(DebugFile,"Better Hull:\n"); -    printRs(Rs); -    fprintf(DebugFile,"known hull: %s\n", knownHull.print_with_subs_to_string().c_str()); -  } -  if (knownHull.is_null()) hull = QuickHull(Rs); -  else hull = Intersection(QuickHull(Rs),knownHull); -  // for (int i = 1; i <= Rs.size(); i++) -  //   hull = RectHull(Union(hull, copy(Rs[i]))); -  // hull = Intersection(hull, knownHull); -  hull.simplify(); -  if (hull_debug) { -    fprintf(DebugFile,"quick hull: %s\n", hull.print_with_subs_to_string().c_str()); -  } - -  Relation orig = Relation::False(Rs[1]); -  int i; -  for (i = 1; i <= Rs.size(); i++)  -    orig = Union(orig,copy(Rs[i])); - -  orig.simplify(); - -  for (i = 1; i <= Rs.size(); i++) { -    if (!hull.is_obvious_tautology()) Rs[i] = Gist(Rs[i],copy(hull)); -    Rs[i].simplify(); -    if (Rs[i].is_obvious_tautology()) return hull; -    if (Rs[i].has_single_conjunct()) { -      Rs[i] = EQs_to_GEQs(Rs[i]); -      if (hull_debug) { -        fprintf(DebugFile,"Checking for hull constraints in:\n  %s\n", Rs[i].print_with_subs_to_string().c_str()); -      } -      Conjunct *c = Rs[i].single_conjunct(); -      for (GEQ_Iterator g(c->GEQs()); g.live(); g.next()) { -        Relation tmp = Relation::True(Rs[i]); -        tmp.and_with_GEQ(*g); -        if (!Difference(copy(orig),tmp).is_upper_bound_satisfiable())  -          hull.and_with_GEQ(*g); -      } -      for (EQ_Iterator e(c->EQs()); e.live(); e.next()) { -        Relation tmp = Relation::True(Rs[i]); -        tmp.and_with_EQ(*e); -        if (!Difference(copy(orig),tmp).is_upper_bound_satisfiable())  -          hull.and_with_EQ(*e); -      } -    } -  } - -  hull = FastTightHull(orig,hull); -  assert(hull.has_single_conjunct()); - -  if (stridesAllowed) return hull; -  else return Approximate(hull); - -} - - - -Relation  Hull(NOT_CONST Relation &S,  -               bool stridesAllowed, -               int effort, -               NOT_CONST Relation &knownHull) { -  Relation R = consume_and_regurgitate(S); -  R.simplify(1,0); -  if (!R.is_upper_bound_satisfiable()) return R; -  Tuple<Relation> Rs; -  for (DNF_Iterator c(R.query_DNF()); c.live(); ) { -    Rs.append(Relation(R,c.curr())); -    c.next(); -  } -  if (effort == 1) -    return BetterHull(Rs,stridesAllowed,false,knownHull); -  else -    return QuickHull(Rs); -} - - - -Relation Hull(Tuple<Relation> &Rs,  -              Tuple<int> &validMask,  -              int effort,  -              bool stridesAllowed, -              NOT_CONST Relation &knownHull) { -  // Use relation of index i only when validMask[i] != 0 -  Tuple<Relation> Rs2; -  for(int i = 1; i <= Rs.size(); i++) { -    if (validMask[i]) { -      Rs[i].simplify(); -      for (DNF_Iterator c(Rs[i].query_DNF()); c.live(); ) { -        Rs2.append(Relation(Rs[i],c.curr())); -        c.next(); -      } -    } -  } -  assert(effort == 0 || effort == 1); -  if (effort == 1) -    return BetterHull(Rs2,stridesAllowed,true,knownHull); -  else -    return QuickHull(Rs2); -} - - -// This function is deprecated!!! -Relation CheckForConvexRepresentation(NOT_CONST Relation &R_In) { -  Relation R = consume_and_regurgitate(R_In); -  Relation h = Hull(copy(R)); -  if (!Difference(copy(h),copy(R)).is_upper_bound_satisfiable()) -    return h; -  else -    return R; -} - -// This function is deprecated!!! -Relation CheckForConvexPairs(NOT_CONST Relation &S) { -  Relation R = consume_and_regurgitate(S); -  Relation hull = FastTightHull(copy(R),Relation::True(R)); -  R.simplify(1,0); -  if (!R.is_upper_bound_satisfiable() || R.number_of_conjuncts() < 2) return R; -  Tuple<Relation> Rs; -  for (DNF_Iterator c(R.query_DNF()); c.live(); ) { -    Rs.append(Relation(R,c.curr())); -    c.next(); -  } - -  bool *dead = new bool[Rs.size()+1]; -  int i; -  for(i = 1; i<=Rs.size();i++) dead[i] = false; - -  for(i = 1; i<=Rs.size();i++) -    if (!dead[i])  -      for(int j = i+1; j<=Rs.size();j++) if (!dead[j]) { -          if (hull_debug) { -            fprintf(DebugFile,"Comparing #%d and %d\n",i,j); -          } -          Relation U = Union(copy(Rs[i]),copy(Rs[j])); -          Relation H_ij = FastTightHull(copy(U),copy(hull)); -          if (!Difference(copy(H_ij),U).is_upper_bound_satisfiable()) { -            Rs[i] = H_ij; -            dead[j] = true; -            if (hull_debug)  { -              fprintf(DebugFile,"Combined them\n"); -            } -          } -        } -  i = 1; -  while(i<=Rs.size() && dead[i]) i++; -  assert(i<=Rs.size()); -  R = Rs[i]; -  i++; -  for(; i<=Rs.size();i++) -    if (!dead[i])  -      R = Union(R,Rs[i]); -  delete []dead; -  return R; -} - -// -// Supporting functions for ConvexRepresentation -// -namespace { -struct Interval { -  std::list<std::pair<Relation, Relation> >::iterator pos; -  coef_t lb; -  coef_t ub; -  bool change; -  coef_t modulo;     -  Interval(std::list<std::pair<Relation, Relation> >::iterator pos_, coef_t lb_, coef_t ub_): -    pos(pos_), lb(lb_), ub(ub_) {} -  friend bool operator<(const Interval &a, const Interval &b); -}; - -bool operator<(const Interval &a, const Interval &b) { -  return a.lb < b.lb; -} - -struct Modulo_Interval { -  coef_t modulo; -  coef_t start; -  coef_t size; -  Modulo_Interval(coef_t modulo_, coef_t start_, coef_t size_): -    modulo(modulo_), start(start_), size(size_) {} -  friend bool operator<(const Interval &a, const Interval &b); -}; -   -bool operator<(const Modulo_Interval &a, const Modulo_Interval &b) { -  if (a.modulo == b.modulo) { -    if (a.start == b.start) -      return a.size < b.size; -    else -      return a.start < b.start; -  } -  else -    return a.modulo < b.modulo; -} - -void merge_intervals(std::list<Interval> &intervals, coef_t modulo, std::list<std::pair<Relation, Relation> > &Rs, std::list<std::pair<Relation, Relation> >::iterator orig) { -  // normalize  intervals -  for (std::list<Interval>::iterator i = intervals.begin(); i != intervals.end(); i++) { -    (*i).modulo = modulo; -    (*i).change = false; -    if ((*i).ub - (*i).lb + 1>= modulo) { -      (*i).lb = 0; -      (*i).ub = modulo - 1; -    }  -    else if ((*i).ub < 0 || (*i).lb >= modulo) { -      coef_t range = (*i).ub - (*i).lb; -      (*i).lb = int_mod((*i).lb, modulo); -      (*i).ub = (*i).lb + range; -    } -  } - -  intervals.sort(); - -  // merge neighboring intervals -  std::list<Interval>::iterator p = intervals.begin(); -  while (p != intervals.end()) { -    std::list<Interval>::iterator q = p; -    q++; -    while (q != intervals.end()) { -      if ((*p).ub + 1 >= (*q).lb) { -        Relation hull = ConvexHull(Union(copy((*(*p).pos).first), copy((*(*q).pos).first))); -        Relation remainder = Difference(Difference(copy(hull), copy((*(*p).pos).first)), copy((*(*q).pos).first)); -        if (!remainder.is_upper_bound_satisfiable()) { -          if ((*q).pos == orig) -            std::swap((*p).pos, (*q).pos); -          (*(*p).pos).first = hull; -          (*p).ub = max((*p).ub, (*q).ub); -          (*p).change = true; -          Rs.erase((*q).pos); -          q = intervals.erase(q); -        } -        else -          break; -      } -      else -        break; -    } - -    bool p_moved = false; -    q = p; -    q++; -    while (q != intervals.end()) { -      if ((*q).ub >= modulo && int_mod((*q).ub, modulo) + 1 >= (*p).lb) { -        Relation hull = ConvexHull(Union(copy((*(*p).pos).first), copy((*(*q).pos).first))); -        Relation remainder = Difference(Difference(copy(hull), copy((*(*p).pos).first)), copy((*(*q).pos).first)); -        if (!remainder.is_upper_bound_satisfiable()) { -          if ((*p).pos == orig) -            std::swap((*p).pos, (*q).pos); -          (*(*q).pos).first = hull; -          coef_t t = (*p).ub - int_mod((*q).ub, modulo); -          if (t > 0) -            (*q).ub = (*q).ub + t;               -          (*q).change = true; -          Rs.erase((*p).pos); -          p = intervals.erase(p); -          p_moved = true; -          break; -        } -        else -          q++; -      } -      else -        q++; -    } - -    if (!p_moved) -      p++; -  } - -  // merge by reducing the strengh of modulo -  std::list<Modulo_Interval> modulo_intervals; -  coef_t max_distance = modulo/2; -  for (std::list<Interval>::iterator p = intervals.begin(); p != intervals.end(); p++) { -    if ((*p).lb >= max_distance) -      break; - -    coef_t size = (*p).ub - (*p).lb; -       -    std::list<Interval>::iterator q = p; -    q++; -    while (q != intervals.end()) { -      coef_t distance = (*q).lb - (*p).lb; -      if (distance > max_distance) -        break; - -      if ((*q).ub - (*q).lb != size || int_mod(modulo, distance) != 0) { -        q++; -        continue; -      } - -      int num_reduced = 0; -      coef_t looking_for = int_mod((*p).lb, distance); -      for (std::list<Interval>::iterator k = intervals.begin(); k != intervals.end(); k++) { -        if ((*k).lb == looking_for && (*k).ub - (*k).lb == size) {             -          num_reduced++; -          looking_for += distance; -          if (looking_for >= modulo) -            break; -        }             -        else if ((*k).lb <= looking_for && (*k).ub >= looking_for + size) { -          looking_for += distance; -          if (looking_for >= modulo) -            break; -        } -        else if ((*k).lb > looking_for) -          break; -      } - -      if (looking_for >= modulo && num_reduced > 1) -        modulo_intervals.push_back(Modulo_Interval(distance, int_mod((*p).lb, distance), size)); - -      q++; -    } -  } -           -  modulo_intervals.sort(); - -  // remove redundant reduced-strength intervals -  std::list<Modulo_Interval>::iterator p2 = modulo_intervals.begin(); -  while (p2 != modulo_intervals.end()) { -    std::list<Modulo_Interval>::iterator q2 = p2; -    q2++; -    while (q2 != modulo_intervals.end()) { -      if ((*p2).modulo == (*q2).modulo && (*p2).start == (*q2).start) -        q2 = modulo_intervals.erase(q2); -      else if (int_mod((*q2).modulo, (*p2).modulo) == 0 && -               (*p2).start == int_mod((*q2).start, (*p2).modulo) && -               (*p2).size >= (*q2).size) -        q2 = modulo_intervals.erase(q2); -      else -        q2++; -    } -    p2++; -  } -                 -  // replace original intervals with new reduced-strength ones -  for (std::list<Modulo_Interval>::iterator i = modulo_intervals.begin(); i != modulo_intervals.end(); i++) { -    std::vector<Relation *> candidates; -    int num_replaced = 0; -    for (std::list<Interval>::iterator j = intervals.begin(); j != intervals.end(); j++) -      if (int_mod((*j).modulo, (*i).modulo) == 0 && -          (*j).ub - (*j).lb >= (*i).size && -          (int_mod((*j).lb, (*i).modulo) == (*i).start || -           int_mod((*j).ub, (*i).modulo) == (*i).start + (*i).size)) { -        candidates.push_back(&((*(*j).pos).first)); -        if (int_mod((*j).lb, (*i).modulo) == (*i).start && -            (*j).ub - (*j).lb == (*i).size) -          num_replaced++; -      } -    if (num_replaced <= 1) -      continue; -       -    Relation R = copy(*candidates[0]); -    for (size_t k = 1; k < candidates.size(); k++) -      R = Union(R, copy(*candidates[k])); -    Relation hull = ConvexHull(copy(R)); -    Relation remainder = Difference(copy(hull), copy(R)); -    if (!remainder.is_upper_bound_satisfiable()) { -      std::list<Interval>::iterator replaced_one = intervals.end(); -      for (std::list<Interval>::iterator j = intervals.begin(); j != intervals.end();) -        if (int_mod((*j).modulo, (*i).modulo) == 0 && -            (*j).ub - (*j).lb >= (*i).size && -            (int_mod((*j).lb, (*i).modulo) == (*i).start || -             int_mod((*j).ub, (*i).modulo) == (*i).start + (*i).size)) { -          if (int_mod((*j).lb, (*i).modulo) == (*i).start && -              (*j).ub - (*j).lb == (*i).size) { -            if (replaced_one == intervals.end()) { -              (*(*j).pos).first = hull; -              (*j).lb = int_mod((*j).lb, (*i).modulo); -              (*j).ub = int_mod((*j).ub, (*i).modulo); -              (*j).modulo = (*i).modulo; -              (*j).change = true; -              replaced_one = j; -              j++; -            } -            else { -              if ((*j).pos == orig) { -                std::swap((*replaced_one).pos, (*j).pos); -                (*(*replaced_one).pos).first = (*(*j).pos).first; -              } -              Rs.erase((*j).pos); -              j = intervals.erase(j); -            } -          } -          else { -            if (int_mod((*j).lb, (*i).modulo) == (*i).start) -              (*j).lb = (*j).lb + (*i).size + 1; -            else -              (*j).ub = (*j).ub - (*i).size - 1; -            (*j).change = true; -            j++; -          } -        } -        else -          j++; -    } -  }                 -}     -} // namespace - - -// -// Simplify a union of sets/relations to a minimal (may not be -// optimal) number of convex regions.  It intends to replace -// CheckForConvexRepresentation and CheckForConvexPairs functions. -// -Relation ConvexRepresentation(NOT_CONST Relation &R) { -  Relation l_R = copy(R); -  if (!l_R.is_upper_bound_satisfiable() || l_R.number_of_conjuncts() < 2) -    return R; - -  // separate each conjunct into smooth convex region and holes -  std::list<std::pair<Relation, Relation> > Rs; // pair(smooth region, hole condition) -  for (DNF_Iterator c(l_R.query_DNF()); c.live(); c++) { -    Relation r1 = Relation(l_R, c.curr()); -    Relation r2 = Approximate(copy(r1)); -    r1 = Gist(r1, copy(r2)); -    Rs.push_back(std::make_pair(r2, r1)); -  } - -  try { -    bool change = true; -    while (change) { -      change = false; - -      std::list<std::pair<Relation, Relation> >::iterator i = Rs.begin(); -      while (i != Rs.end()) { -        // find regions with identical hole conditions to merge -        { -          std::list<std::pair<Relation, Relation> >::iterator j = i; -          j++; -          while (j != Rs.end()) { -            if (!Difference(copy((*i).second), copy((*j).second)).is_upper_bound_satisfiable() && -                !Difference(copy((*j).second), copy((*i).second)).is_upper_bound_satisfiable()) { -              if (Must_Be_Subset(copy((*j).first), copy((*i).first))) { -                j = Rs.erase(j); -              } -              else if (Must_Be_Subset(copy((*i).first), copy((*j).first))) { -                (*i).first = (*j).first; -                j = Rs.erase(j); -                change = true; -              } -              else { -                Relation r; -                bool already_use_recthull = false; -                try { -                  // chun's debug -                  // throw std::runtime_error("dfdf"); -                 -                  r = ConvexHull(Union(copy((*i).first), copy((*j).first))); -                } -                catch (const std::overflow_error &e) { -                  r = RectHull(Union(copy((*i).first), copy((*j).first))); -                  already_use_recthull = true; -                } -                retry_recthull: -                Relation r2 = Difference(Difference(copy(r), copy((*i).first)), copy((*j).first)); -                if (!r2.is_upper_bound_satisfiable()) { // convex hull is tight -                  (*i).first = r; -                  j = Rs.erase(j); -                  change = true; -                } -                else { -                  if (!already_use_recthull) { -                    r = RectHull(Union(copy((*i).first), copy((*j).first))); -                    already_use_recthull = true; -                    goto retry_recthull; -                  } -                  else -                    j++; -                } -              } -            } -            else -              j++; -          } -        } - -        // find identical smooth regions as candidates for hole merge -        std::list<std::list<std::pair<Relation, Relation> >::iterator> s; -        for (std::list<std::pair<Relation, Relation> >::iterator j = Rs.begin(); j != Rs.end(); j++)  -          if (j != i) { -            if (!Intersection(Difference(copy((*i).first), copy((*j).first)), copy((*j).second)).is_upper_bound_satisfiable() && -                !Intersection(Difference(copy((*j).first), copy((*i).first)), copy((*i).second)).is_upper_bound_satisfiable()) -              s.push_back(j); -          } -       -        if (s.size() != 0) { -          // convert hole condition c1*x1+c2*x2+... = c*alpha+d to a pair of inequalities -          (*i).second = EQs_to_GEQs((*i).second, false); - -          // find potential wildcards that can be used for hole conditions -          std::set<Variable_ID> nonsingle_wild; -          for (EQ_Iterator ei((*i).second.single_conjunct()); ei; ei++) -            if ((*ei).has_wildcards()) -              for (Constr_Vars_Iter cvi(*ei, true); cvi; cvi++) -                nonsingle_wild.insert(cvi.curr_var()); -          for (GEQ_Iterator gei((*i).second.single_conjunct()); gei; gei++) -            if ((*gei).has_wildcards()) { -              Constr_Vars_Iter cvi(*gei, true); -              Constr_Vars_Iter cvi2 = cvi; -              cvi2++; -              if (cvi2) { -                nonsingle_wild.insert(cvi.curr_var()); -                for (; cvi2; cvi2++) -                  nonsingle_wild.insert(cvi2.curr_var()); -              } -            } - -          // find hole condition in c*alpha+d1<=c1*x1+c2*x2+...<=c*alpha+d2 format -          for (GEQ_Iterator gei((*i).second.single_conjunct()); gei; gei++) -            if ((*gei).has_wildcards()) { -              coef_t c; -              Variable_ID v; -              { -                Constr_Vars_Iter cvi(*gei, true); -                v = cvi.curr_var(); -                c = cvi.curr_coef(); -                if (c < 0 || nonsingle_wild.find(v) != nonsingle_wild.end()) -                  continue; -              } -           -              coef_t lb = posInfinity; -              for (GEQ_Iterator gei2((*i).second.single_conjunct()); gei2; gei2++) { -                if (!(*gei2 == *gei) && (*gei2).get_coef(v) != 0) { -                  if (lb != posInfinity) { -                    nonsingle_wild.insert(v); -                    break; -                  } -                 -                  bool match = true; -                  for (Constr_Vars_Iter cvi2(*gei); cvi2; cvi2++) -                    if (cvi2.curr_coef() != -((*gei2).get_coef(cvi2.curr_var()))) { -                      match = false; -                      break; -                    } -                  if (match) -                    for (Constr_Vars_Iter cvi2(*gei2); cvi2; cvi2++) -                      if (cvi2.curr_coef() != -((*gei).get_coef(cvi2.curr_var()))) { -                        match = false; -                        break; -                      } -                  if (!match) { -                    nonsingle_wild.insert(v); -                    break; -                  } - -                  lb = -(*gei2).get_const(); -                } -              } - -              if (nonsingle_wild.find(v) != nonsingle_wild.end()) -                continue; -           -              Relation stride_cond = Relation::True((*i).second); -              F_Exists *f_exists = stride_cond.and_with_and()->add_exists(); -              Variable_ID e = f_exists->declare(); -              F_And *f_root = f_exists->add_and(); -              GEQ_Handle h1 = f_root->add_GEQ(); -              GEQ_Handle h2 = f_root->add_GEQ(); -              for (Constr_Vars_Iter cvi2(*gei); cvi2; cvi2++) { -                Variable_ID v = cvi2.curr_var(); -                switch (v->kind()) { -                case Wildcard_Var:  -                  h1.update_coef(e, cvi2.curr_coef()); -                  h2.update_coef(e, -cvi2.curr_coef()); -                  break; -                case Global_Var: { -                  Global_Var_ID g = v->get_global_var(); -                  Variable_ID v2; -                  if (g->arity() == 0) -                    v2 = stride_cond.get_local(g); -                  else -                    v2 = stride_cond.get_local(g, v->function_of()); -                  h1.update_coef(v2, cvi2.curr_coef()); -                  h2.update_coef(v2, -cvi2.curr_coef()); -                  break; -                } -                default: -                  h1.update_coef(v, cvi2.curr_coef()); -                  h2.update_coef(v, -cvi2.curr_coef()); -                } -              } -              h1.update_const((*gei).get_const()); -              h2.update_const(-lb); - -              stride_cond.simplify(); -              Relation other_cond = Gist(copy((*i).second), copy(stride_cond)); - -              // find regions with potential mergeable stride condition with this one -              std::list<Interval> intervals; -              intervals.push_back(Interval(i, lb, (*gei).get_const())); -             -              for (std::list<std::list<std::pair<Relation, Relation> >::iterator>::iterator j = s.begin(); j != s.end(); j++) -                if (Must_Be_Subset(copy((**j).second), copy(other_cond))) { -                  Relation stride_cond2 = Gist(copy((**j).second), copy(other_cond)); - -                  // interval can be removed -                  if (stride_cond2.is_obvious_tautology()) { -                    intervals.push_back(Interval(*j, 0, c-1)); -                    continue; -                  } - -                  stride_cond2 = EQs_to_GEQs(stride_cond2, false); -                  coef_t lb, ub; -                  GEQ_Iterator gei2(stride_cond2.single_conjunct()); -                  coef_t sign = 0; -                  for (Constr_Vars_Iter cvi(*gei2, true); cvi; cvi++) -                    if (sign != 0) { -                      sign = 0; -                      break; -                    } -                    else if (cvi.curr_coef() == c) -                      sign = 1; -                    else if (cvi.curr_coef() == -c) -                      sign = -1; -                    else { -                      sign = 0; -                      break; -                    }                 -                  if (sign == 0) -                    continue; - -                  bool match = true; -                  for (Constr_Vars_Iter cvi(*gei2); cvi; cvi++) { -                    Variable_ID v = cvi.curr_var(); -                    if (v->kind() == Wildcard_Var) -                      continue; -                    else if (v->kind() == Global_Var) { -                      Global_Var_ID g = v->get_global_var(); -                      if (g->arity() == 0) -                        v = (*i).second.get_local(g); -                      else -                        v = (*i).second.get_local(g, v->function_of()); -                    } -                     -                    if (cvi.curr_coef() != sign * (*gei).get_coef(v)) { -                      match = false; -                      break; -                    } -                  } -                  if (!match) -                    continue; -                 -                  for (Constr_Vars_Iter cvi(*gei); cvi; cvi++) { -                    Variable_ID v = cvi.curr_var(); -                    if (v->kind() == Wildcard_Var) -                      continue; -                    else if (v->kind() == Global_Var) { -                      Global_Var_ID g = v->get_global_var(); -                      if (g->arity() == 0) -                        v = stride_cond2.get_local(g); -                      else -                        v = stride_cond2.get_local(g, v->function_of()); -                    } -                     -                    if (cvi.curr_coef() != sign * (*gei2).get_coef(v)) { -                      match = false; -                      break; -                    } -                  } -                  if (!match) -                    continue; -                  if (sign > 0) -                    ub = (*gei2).get_const(); -                  else -                    lb = -(*gei2).get_const();                 -                 -                  gei2++; -                  if (!gei2) -                    continue; - -                  coef_t sign2 = 0; -                  for (Constr_Vars_Iter cvi(*gei2, true); cvi; cvi++) -                    if (sign2 != 0) { -                      sign2 = 0; -                      break; -                    } -                    else if (cvi.curr_coef() == c) -                      sign2 = 1; -                    else if (cvi.curr_coef() == -c) -                      sign2 = -1; -                    else { -                      sign2 = 0; -                      break; -                    } -                  if (sign2 != -sign) -                    continue; - -                  for (Constr_Vars_Iter cvi(*gei2); cvi; cvi++) { -                    Variable_ID v = cvi.curr_var(); -                    if (v->kind() == Wildcard_Var) -                      continue; -                    else if (v->kind() == Global_Var) { -                      Global_Var_ID g = v->get_global_var(); -                      if (g->arity() == 0) -                        v = (*i).second.get_local(g); -                      else -                        v = (*i).second.get_local(g, v->function_of()); -                    } -                     -                    if (cvi.curr_coef() != sign2 * (*gei).get_coef(v)) { -                      match = false; -                      break; -                    } -                  } -                  if (!match) -                    continue; -                 -                  for (Constr_Vars_Iter cvi(*gei); cvi; cvi++) { -                    Variable_ID v = cvi.curr_var(); -                    if (v->kind() == Wildcard_Var) -                      continue; -                    else if (v->kind() == Global_Var) { -                      Global_Var_ID g = v->get_global_var(); -                      if (g->arity() == 0) -                        v = stride_cond2.get_local(g); -                      else -                        v = stride_cond2.get_local(g, v->function_of()); -                    } -                     -                    if (cvi.curr_coef() != sign2 * (*gei2).get_coef(v)) { -                      match = false; -                      break; -                    } -                  } -                  if (!match) -                    continue; -                  if (sign2 > 0) -                    ub = (*gei2).get_const(); -                  else -                    lb = -(*gei2).get_const(); -                 -                  gei2++; -                  if (gei2) -                    continue; -                     -                  intervals.push_back(Interval(*j, lb, ub));                 -                } - -              merge_intervals(intervals, c, Rs, i); - -              // make current region the last one being updated -              bool invalid = false; -              for (std::list<Interval>::iterator ii = intervals.begin(); ii != intervals.end(); ii++) -                if ((*ii).change && (*ii).pos == i) { -                  invalid = true; -                  intervals.push_back(*ii); -                  intervals.erase(ii); -                  break; -                } - -              // update hole condition for each region -              for (std::list<Interval>::iterator ii = intervals.begin(); ii != intervals.end(); ii++) -                if ((*ii).change) { -                  change = true; - -                  if ((*ii).ub - (*ii).lb + 1 >= (*ii).modulo) -                    (*(*ii).pos).second = copy(other_cond); -                  else { -                    Relation stride_cond = Relation::True((*i).second); -                    F_Exists *f_exists = stride_cond.and_with_and()->add_exists(); -                    Variable_ID e = f_exists->declare(); -                    F_And *f_root = f_exists->add_and(); -                    GEQ_Handle h1 = f_root->add_GEQ(); -                    GEQ_Handle h2 = f_root->add_GEQ(); -                    for (Constr_Vars_Iter cvi2(*gei); cvi2; cvi2++) { -                      Variable_ID v = cvi2.curr_var(); -                      switch (v->kind()) { -                      case Wildcard_Var:  -                        h1.update_coef(e, (*ii).modulo); -                        h2.update_coef(e, -(*ii).modulo); -                        break; -                      case Global_Var: { -                        Global_Var_ID g = v->get_global_var(); -                        Variable_ID v2; -                        if (g->arity() == 0) -                          v2 = stride_cond.get_local(g); -                        else -                          v2 = stride_cond.get_local(g, v->function_of()); -                        h1.update_coef(v2, cvi2.curr_coef()); -                        h2.update_coef(v2, -cvi2.curr_coef()); -                        break; -                      } -                      default: -                        h1.update_coef(v, cvi2.curr_coef()); -                        h2.update_coef(v, -cvi2.curr_coef()); -                      } -                    } -                    h1.update_const((*ii).ub); -                    h2.update_const(-(*ii).lb); - -                    (*(*ii).pos).second = Intersection(copy(other_cond), stride_cond); -                    (*(*ii).pos).second.simplify(); -                  } -                } -             -              if (invalid) -                break; -            } -        }       -        i++; -      } -    } -  } -  catch (const presburger_error &e) { -    throw e; -  } - -  Relation R2 = Relation::False(l_R); -  for (std::list<std::pair<Relation, Relation> >::iterator i = Rs.begin(); i != Rs.end(); i++) -    R2 = Union(R2, Intersection((*i).first, (*i).second)); -  R2.simplify(0, 1); -   -  return R2; -} - - -// -// Use gist and value range to calculate a quick rectangular hull. It -// intends to replace all hull calculations (QuickHull, BetterHull, -// FastTightHull) beyond the method of ConvexHull (dual -// representations). In the future, it will support max(...)-like -// upper bound. So RectHull complements ConvexHull in two ways: first -// for relations that ConvexHull gets too complicated, second for -// relations where different conjuncts have different symbolic upper -// bounds. -//  -Relation RectHull(NOT_CONST Relation &Rel) { -  Relation R = Approximate(consume_and_regurgitate(Rel)); -  if (!R.is_upper_bound_satisfiable()) -    return R; -  if (R.has_single_conjunct()) -    return R; - -  std::vector<std::string> input_names(R.n_inp()); -  for (int i = 1; i <= R.n_inp(); i++) -    input_names[i-1] = R.input_var(i)->name(); -  std::vector<std::string> output_names(R.n_out()); -  for (int i = 1; i <= R.n_out(); i++) -    output_names[i-1] = R.output_var(i)->name(); -   -  DNF_Iterator c(R.query_DNF()); -  Relation r = Relation(R, c.curr()); -  c++; -  std::vector<std::pair<coef_t, coef_t> > bounds1(R.n_inp()); -  std::vector<std::pair<coef_t, coef_t> > bounds2(R.n_out()); -  { -    Relation t = Project_Sym(copy(r)); -    t.simplify(); -    for (int i = 1; i <= R.n_inp(); i++) { -      Tuple<Variable_ID> v; -      for (int j = 1; j <= R.n_inp(); j++) -        if (j != i) -          v.append(r.input_var(j)); -      for (int j = 1; j <= R.n_out(); j++) -        v.append(r.output_var(j)); -      Relation t2 = Project(copy(t), v); -      t2.query_variable_bounds(t2.input_var(i), bounds1[i-1].first, bounds1[i-1].second); -    } -    for (int i = 1; i <= R.n_out(); i++) { -      Tuple<Variable_ID> v; -      for (int j = 1; j <= R.n_out(); j++) -        if (j != i) -          v.append(r.output_var(j)); -      for (int j = 1; j <= R.n_inp(); j++) -        v.append(r.input_var(j)); -      Relation t2 = Project(copy(t), v); -      t2.query_variable_bounds(t2.output_var(i), bounds2[i-1].first, bounds2[i-1].second); -    } -  } -     -  while (c.live()) { -    Relation r2 = Relation(R, c.curr()); -    c++; -    Relation x = Gist(copy(r), Gist(copy(r), copy(r2), 1), 1); -    if (Difference(copy(r2), copy(x)).is_upper_bound_satisfiable()) -      x = Relation::True(R); -    Relation y = Gist(copy(r2), Gist(copy(r2), copy(r), 1), 1); -    if (Difference(copy(r), copy(y)).is_upper_bound_satisfiable()) -      y = Relation::True(R); -    r = Intersection(x, y); -     -    { -      Relation t = Project_Sym(copy(r2)); -      t.simplify(); -      for (int i = 1; i <= R.n_inp(); i++) { -        Tuple<Variable_ID> v; -        for (int j = 1; j <= R.n_inp(); j++) -          if (j != i) -            v.append(r2.input_var(j)); -        for (int j = 1; j <= R.n_out(); j++) -          v.append(r2.output_var(j)); -        Relation t2 = Project(copy(t), v); -        coef_t lbound, ubound; -        t2.query_variable_bounds(t2.input_var(i), lbound, ubound); -        bounds1[i-1].first = min(bounds1[i-1].first, lbound); -        bounds1[i-1].second = max(bounds1[i-1].second, ubound); -      } -      for (int i = 1; i <= R.n_out(); i++) { -        Tuple<Variable_ID> v; -        for (int j = 1; j <= R.n_out(); j++) -          if (j != i) -            v.append(r2.output_var(j)); -        for (int j = 1; j <= R.n_inp(); j++) -          v.append(r2.input_var(j)); -        Relation t2 = Project(copy(t), v); -        coef_t lbound, ubound; -        t2.query_variable_bounds(t2.output_var(i), lbound, ubound); -        bounds2[i-1].first = min(bounds2[i-1].first, lbound); -        bounds2[i-1].second = max(bounds2[i-1].second, ubound); -      } -    } - -    Relation r3(R.n_inp(), R.n_out()); -    F_And *f_root = r3.add_and(); -    for (int i = 1; i <= R.n_inp(); i++) { -      if (bounds1[i-1].first != -posInfinity) { -        GEQ_Handle h = f_root->add_GEQ(); -        h.update_coef(r3.input_var(i), 1); -        h.update_const(-bounds1[i-1].first); -      } -      if (bounds1[i-1].second != posInfinity) { -        GEQ_Handle h = f_root->add_GEQ(); -        h.update_coef(r3.input_var(i), -1); -        h.update_const(bounds1[i-1].second); -      } -    } -    for (int i = 1; i <= R.n_out(); i++) { -      if (bounds2[i-1].first != -posInfinity) { -        GEQ_Handle h = f_root->add_GEQ(); -        h.update_coef(r3.output_var(i), 1); -        h.update_const(-bounds2[i-1].first); -      } -      if (bounds2[i-1].second != posInfinity) { -        GEQ_Handle h = f_root->add_GEQ(); -        h.update_coef(r3.output_var(i), -1); -        h.update_const(bounds2[i-1].second); -      } -    } -    r = Intersection(r, r3); -    r.simplify(); -  } - -  for (int i = 1; i <= r.n_inp(); i++) -    r.name_input_var(i, input_names[i-1]); -  for (int i = 1; i <= r.n_out(); i++) -    r.name_output_var(i, output_names[i-1]); -  r.setup_names(); -  return r; -} - -} // namespace diff --git a/omega/omega_lib/src/hull_legacy.cc b/omega/omega_lib/src/hull_legacy.cc deleted file mode 100755 index a59d34f..0000000 --- a/omega/omega_lib/src/hull_legacy.cc +++ /dev/null @@ -1,1484 +0,0 @@ -/***************************************************************************** - Copyright (C) 1994-2000 the Omega Project Team - Copyright (C) 2005-2011 Chun Chen - All Rights Reserved. - - Purpose: -   Legacy hull calculations' implementation. - - Notes: - - History: -  06/15/09  ConvexRepresentation, Chun Chen -  11/25/09  RectHull, Chun Chen -*****************************************************************************/ - -#include <omega.h> -#include <omega/farkas.h> -#include <omega/hull.h> -#include <basic/Bag.h> -#include <basic/omega_error.h> -#include <list> -#include <vector> -#include <set> - -namespace omega { - -int hull_debug = 0;  - -Relation ConvexHull(NOT_CONST Relation &R) { -  Relation S = Approximate(consume_and_regurgitate(R)); -  if (!S.is_upper_bound_satisfiable()) -    return S; -  if (S.has_single_conjunct()) -    return S; -  return Farkas(Farkas(S,Basic_Farkas), Convex_Combination_Farkas); -} - -Relation DecoupledConvexHull(NOT_CONST Relation &R) { -  Relation S = Approximate(consume_and_regurgitate(R)); -  if (!S.is_upper_bound_satisfiable()) -    return S; -  if (S.has_single_conjunct()) -    return S; -  return Farkas(Farkas(S,Decoupled_Farkas), Convex_Combination_Farkas); -} - -Relation AffineHull(NOT_CONST Relation &R) { -  Relation S = Approximate(consume_and_regurgitate(R)); -  if (!S.is_upper_bound_satisfiable()) -    return S; -  return Farkas(Farkas(S,Basic_Farkas), Affine_Combination_Farkas); -} - -Relation LinearHull(NOT_CONST Relation &R) { -  Relation S = Approximate(consume_and_regurgitate(R)); -  if (!S.is_upper_bound_satisfiable()) -    return S; -  return Farkas(Farkas(S,Basic_Farkas), Linear_Combination_Farkas); -} - -Relation ConicHull(NOT_CONST Relation &R) { -  Relation S = Approximate(consume_and_regurgitate(R)); -  if (!S.is_upper_bound_satisfiable()) -    return S;   -  return Farkas(Farkas(S,Basic_Farkas), Positive_Combination_Farkas); -} - - -Relation FastTightHull(NOT_CONST Relation &input_R, NOT_CONST Relation &input_H) { -  Relation R = Approximate(consume_and_regurgitate(input_R)); -  Relation H = Approximate(consume_and_regurgitate(input_H)); - -  if (hull_debug) { -    fprintf(DebugFile,"[ Computing FastTightHull of:\n"); -    R.prefix_print(DebugFile); -    fprintf(DebugFile,"given known hull of:\n"); -    H.prefix_print(DebugFile); -  } - -  if (!H.has_single_conjunct()) { -    if (hull_debug)  -      fprintf(DebugFile, "] bailing out of FastTightHull, known hull not convex\n"); -    return H; -  } - -  if (!H.is_obvious_tautology()) { -    R = Gist(R,copy(H)); -    R.simplify(1,0); -  } - -  if (R.has_single_conjunct()) { -    R = Intersection(R,H); -    if (hull_debug)  { -      fprintf(DebugFile, "] quick easy answer to FastTightHull\n"); -      R.prefix_print(DebugFile); -    } -    return R; -  } -  if (R.has_local(coefficient_of_constant_term)) { -    if (hull_debug) { -      fprintf(DebugFile, "] Can't handle recursive application of Farkas lemma\n"); -    } -    return H; -  } -   -  if (hull_debug) { -    fprintf(DebugFile,"Gist of R given H is:\n"); -    R.prefix_print(DebugFile); -  } - -  if (1) { -    Set<Variable_ID> vars; -    int conjuncts = 0; -    for (DNF_Iterator s(R.query_DNF()); s.live(); s.next()) { -      conjuncts++; -      for (Variable_ID_Iterator v(*((*s)->variables())); v.live(); v++) { -        bool found = false; -        for (EQ_Iterator eq = (*s)->EQs(); eq.live(); eq.next()) -          if ((*eq).get_coef(*v) != 0) { -            if (!found) vars.insert(*v); -            found = true; -            break; -          } -        if (!found) -          for (GEQ_Iterator geq = (*s)->GEQs(); geq.live(); geq.next()) -            if ((*geq).get_coef(*v) != 0) { -              if (!found) vars.insert(*v); -              found = true; -              break; -            } -      } -    } - -      -    // We now know which variables appear in R -    if (hull_debug) { -      fprintf(DebugFile,"Variables we need a better hull on are: "); -      foreach(v,Variable_ID,vars, -              fprintf(DebugFile," %s",v->char_name())); -      fprintf(DebugFile,"\n"); -    } -    Conjunct *c = H.single_conjunct(); -    int total=0; -    int copied = 0; -    for (EQ_Iterator eq = c->EQs(); eq.live(); eq.next()) { -      total++; -      foreach(v,Variable_ID,vars, -              if ((*eq).get_coef(v) != 0) { -                R.and_with_EQ(*eq); -                copied++; -                break; // out of variable loop -              } -        ); -    } -    for (GEQ_Iterator geq = c->GEQs(); geq.live(); geq.next()) { -      total++; -      foreach(v,Variable_ID,vars, -              if ((*geq).get_coef(v) != 0) { -                R.and_with_GEQ(*geq); -                copied++; -                break; // out of variable loop -              } -        ); -    } -    if (copied < total) { -      R = Approximate(R); - -      if (hull_debug) {  -        fprintf(DebugFile,"Decomposed relation, copied only %d of %d constraints\n",copied,total); -        fprintf(DebugFile,"Original R:\n"); -        R.prefix_print(DebugFile); -        fprintf(DebugFile,"Known hull:\n"); -        H.prefix_print(DebugFile); -        fprintf(DebugFile,"New R:\n"); -        R.prefix_print(DebugFile); -      } -    } -  } - -  Relation F = Farkas(copy(R), Basic_Farkas, true); -  if (hull_debug)   -    fprintf(DebugFile,"Farkas Difficulty = " coef_fmt "\n", farkasDifficulty); -  if (farkasDifficulty > 260) { -    if (hull_debug)  { -      fprintf(DebugFile, "] bailing out, farkas is way too complex\n"); -      fprintf(DebugFile,"Farkas:\n"); -      F.prefix_print(DebugFile); -    } -    return H; -  } -  else if (farkasDifficulty > 130) { -    // Bail out -    if (hull_debug)  { -      fprintf(DebugFile, coef_fmt " non-zeros in original farkas\n", farkasDifficulty); -    } -    Relation tmp = Farkas(R, Decoupled_Farkas, true); -     -    if (hull_debug)  { -      fprintf(DebugFile, coef_fmt " non-zeros in decoupled farkas\n", farkasDifficulty); -    } -    if (farkasDifficulty > 260)  { -      if (hull_debug)  { -        fprintf(DebugFile, "] bailing out, farkas is way too complex\n"); -        fprintf(DebugFile,"Farkas:\n"); -        F.prefix_print(DebugFile); -      } -      return H; -    } -    else { -      if (farkasDifficulty > 130)  -        R = Intersection(H, Farkas(tmp, Affine_Combination_Farkas, true)); -      else R = Intersection(H, -                            Intersection(Farkas(tmp, Convex_Combination_Farkas, true), -                                         Farkas(F, Affine_Combination_Farkas, true))); -      if (hull_debug)  { -        fprintf(DebugFile, "] bailing out, farkas is too complex, using affine hull\n"); -        fprintf(DebugFile,"Farkas:\n"); -        F.prefix_print(DebugFile); -        fprintf(DebugFile,"Affine hull:\n"); -        R.prefix_print(DebugFile); -      } -      return R; -    } -  } -   -  R = Intersection(H, Farkas(F, Convex_Combination_Farkas, true)); -  if (hull_debug)  { -    fprintf(DebugFile, "] Result of FastTightHull:\n"); -    R.prefix_print(DebugFile); -  } -  return R; -} - - - -namespace { -  bool parallel(const GEQ_Handle &g1, const GEQ_Handle &g2) { -    for(Constr_Vars_Iter cvi(g1, false); cvi; cvi++) { -      coef_t c1 = (*cvi).coef; -      coef_t c2 = g2.get_coef((*cvi).var); -      if (c1 != c2) return false; -    } -    { -      for(Constr_Vars_Iter cvi(g2, false); cvi; cvi++) { -        coef_t c1 = g1.get_coef((*cvi).var); -        coef_t c2 = (*cvi).coef; -        if (c1 != c2) return false; -      } -    } -    return true; -  } - - -  bool hull(const EQ_Handle &e, const GEQ_Handle &g, coef_t &hull) { -    int sign = 0; -    for(Constr_Vars_Iter cvi(e, false); cvi; cvi++) { -      coef_t c1 = (*cvi).coef; -      coef_t c2 = g.get_coef((*cvi).var); -      if (sign == 0) sign = (c1*c2>=0?1:-1); -      if (sign*c1 != c2) return false; -    } -    assert(sign != 0); -    { -      for(Constr_Vars_Iter cvi(g, false); cvi; cvi++) { -        coef_t c1 = e.get_coef((*cvi).var); -        coef_t c2 = (*cvi).coef; -        if (sign*c1 != c2) return false; -      } -    } -    hull = max(sign * e.get_const(), g.get_const()); -    if (hull_debug) { -      fprintf(DebugFile,"Hull of:\n %s\n", e.print_to_string().c_str()); -      fprintf(DebugFile," %s\n", g.print_to_string().c_str()); -      fprintf(DebugFile,"is " coef_fmt "\n\n",hull); -    } -    return true; -  } - -  bool eq(const EQ_Handle &e1, const EQ_Handle &e2) { -    int sign = 0; -    for(Constr_Vars_Iter cvi(e1, false); cvi; cvi++) { -      coef_t c1 = (*cvi).coef; -      coef_t c2 = e2.get_coef((*cvi).var); -      if (sign == 0) sign = (c1*c2>=0?1:-1); -      if (sign*c1 != c2) return false; -    } -    assert(sign != 0); -    { -      for(Constr_Vars_Iter cvi(e2, false); cvi; cvi++) { -        coef_t c1 = e1.get_coef((*cvi).var); -        coef_t c2 = (*cvi).coef; -        if (sign*c1 != c2) return false; -      } -    } -    return sign * e1.get_const() == e2.get_const(); -  } -} - - -// This function is deprecated!!! -Relation QuickHull(Relation &R) { -  Tuple<Relation> Rs(1); -  Rs[1] = R; -  return QuickHull(Rs); -} - - -// This function is deprecated!!! -Relation QuickHull(Tuple<Relation> &Rs) { -  assert(!Rs.empty()); - -  // if (Rs.size() == 1) return Rs[1]; - -  Tuple<Relation> l_Rs; -  for (int i = 1; i <= Rs.size(); i++) -    for (DNF_Iterator c(Rs[i].query_DNF()); c; c++) { -      Relation r = Relation(Rs[i], c.curr()); -      l_Rs.append(Approximate(r)); -    } -     -  if (l_Rs.size() == 1) -    return l_Rs[1]; -   -  Relation result = Relation::True(Rs[1]); -  result.copy_names(Rs[1]); - -  use_ugly_names++;  - -  if (hull_debug > 1)  -    for (int i = 1; i <= l_Rs.size(); i++) { -      fprintf(DebugFile,"#%d \n",i); -      l_Rs[i].prefix_print(DebugFile); -    } - -   -//   Relation R = copy(Rs[1]); -//   for (int i = 2; i <= Rs.size(); i++)  -//     R = Union(R,copy(Rs[i])); - -// #if 0 -//   if (!R.is_set()) { -//     if (R.n_inp() == R.n_out()) { -//       Relation AC = DeltasToRelation(Hull(Deltas(copy(R), -//                                                  min(R.n_inp(),R.n_out()))), -//                                      R.n_inp(),R.n_out()); -//       Relation dH = Hull(Domain(copy(R)),false); -//       Relation rH = Hull(Range(copy(R)),false); -//       result = Intersection(AC,Cross_Product(dH,rH));  -//     } -//     else { -//       Relation dH = Hull(Domain(copy(R)),false); -//       Relation rH = Hull(Range(copy(R)),false); -//       result = Cross_Product(dH,rH);  -//       assert(Must_Be_Subset(copy(R),copy(result))); -//     } -//   } - -// #endif -  -  Conjunct *first; -  l_Rs[1] = EQs_to_GEQs(l_Rs[1]); -  first = l_Rs[1].single_conjunct(); -  for (GEQ_Iterator candidate(first->GEQs()); candidate.live(); candidate.next()) { -    coef_t maxConstantTerm = (*candidate).get_const(); -    bool found = true;  -    if (hull_debug > 1) { -      fprintf(DebugFile,"searching for bound on:\n %s\n", (*candidate).print_to_string().c_str()); -    } -    for (int i = 2; i <= l_Rs.size(); i++) { -      Conjunct *other = l_Rs[i].single_conjunct(); -      bool found_for_i = false; -      for (GEQ_Iterator target(other->GEQs()); target.live(); target.next()) { -        if (hull_debug > 2) { -          fprintf(DebugFile,"candidate:\n %s\n", (*candidate).print_to_string().c_str()); -          fprintf(DebugFile,"target:\n %s\n", (*target).print_to_string().c_str()); -        } -        if (parallel(*candidate,*target)) { -          if (hull_debug > 1) -            fprintf(DebugFile,"Found bound:\n %s\n", (*target).print_to_string().c_str()); -          maxConstantTerm = max(maxConstantTerm,(*target).get_const()); -          found_for_i = true; -          break; -        } -      } -      if (!found_for_i) { -        for (EQ_Iterator target_e(other->EQs()); target_e.live(); target_e.next()) { -          coef_t h; -          if (hull(*target_e,*candidate,h)) { -            if (hull_debug > 1) -              fprintf(DebugFile,"Found bound of " coef_fmt ":\n %s\n", h, (*target_e).print_to_string().c_str()); -            maxConstantTerm = max(maxConstantTerm,h); -            found_for_i = true; -            break; -          } -        }; -        if (!found_for_i) { -          if (hull_debug > 1) { -            fprintf(DebugFile,"No bound found in:\n"); -            fprintf(DebugFile, "%s", l_Rs[i].print_with_subs_to_string().c_str()); -          } -          //if nothing found  -          found = false; -          break; -        } -      } -    } -    -    if (found) { -      GEQ_Handle  h = result.and_with_GEQ(); -      copy_constraint(h,*candidate); -      if (hull_debug > 1) -        fprintf(DebugFile,"Setting constant term to " coef_fmt " in\n %s\n", maxConstantTerm, h.print_to_string().c_str()); -      h.update_const(maxConstantTerm - (*candidate).get_const()); -      if (hull_debug > 1) -        fprintf(DebugFile,"Updated constraint is\n %s\n", h.print_to_string().c_str()); -    } -  } - - -  for (EQ_Iterator candidate_eq(first->EQs()); candidate_eq.live(); candidate_eq.next()) { -    bool found = true; -    for (int i = 2; i <= l_Rs.size(); i++) { -      Conjunct *C = l_Rs[i].single_conjunct(); -      bool found_for_i = false; - -      for (EQ_Iterator target(C->EQs()); target.live(); target.next()) { -        if (eq(*candidate_eq,*target)) { -          found_for_i = true; -          break; -        } -      } -      if (!found_for_i) { -        //if nothing found  -        found = false; -        break; -      } -    } -    -    if (found) { -      EQ_Handle  h = result.and_with_EQ(); -      copy_constraint(h,*candidate_eq); -      if (hull_debug > 1) -        fprintf(DebugFile,"Adding eq constraint: %s\n", h.print_to_string().c_str()); -    } -  } - -  use_ugly_names--; -  if (hull_debug > 1) { -    fprintf(DebugFile,"quick hull is of:"); -    result.print_with_subs(DebugFile); -  } -  return result; -} - - -// Relation Hull2(Tuple<Relation> &Rs, Tuple<int> &active) { -//   assert(Rs.size() == active.size() && Rs.size() > 0); - -//   Tuple<Relation> l_Rs; -//   for (int i = 1; i <= Rs.size(); i++) -//     if (active[i]) -//       l_Rs.append(copy(Rs[i])); - -//   if (l_Rs.size() == 0) -//     return Relation::False(Rs[1]); -     -//   try { -//     Relation r = l_Rs[1]; -//     for (int i = 2; i <= l_Rs.size(); i++) { -//       r = Union(r, copy(l_Rs[i])); -//       r.simplify(); -//     } - -//     // Relation F = Farkas(r, Basic_Farkas, true); -//     // if (farkasDifficulty >= 500) -//     //   throw std::overflow_error("loop convex hull too complicated."); -//     // F = Farkas(F, Convex_Combination_Farkas, true); -//     return Farkas(Farkas(r, Basic_Farkas, true), Convex_Combination_Farkas, true); -//   } -//   catch (std::overflow_error) { -//     return QuickHull(l_Rs); -//   } -// } -   - -namespace { -  void printRs(Tuple<Relation> &Rs) { -    fprintf(DebugFile,"Rs:\n"); -    for (int i = 1; i <= Rs.size(); i++) -      fprintf(DebugFile,"#%d : %s\n",i, -              Rs[i].print_with_subs_to_string().c_str()); -  } -} - -Relation BetterHull(Tuple<Relation> &Rs, bool stridesAllowed, bool checkSubsets, -                    NOT_CONST Relation &input_knownHull = Relation::Null()) { -  Relation knownHull = consume_and_regurgitate(input_knownHull); -  static int OMEGA_WHINGE = -1; -  if (OMEGA_WHINGE < 0) { -    OMEGA_WHINGE = getenv("OMEGA_WHINGE") ? atoi(getenv("OMEGA_WHINGE")) : 0; -  } -  assert(!Rs.empty()); -  if (Rs.size() == 1) { -    if (stridesAllowed) return Rs[1]; -    else return Approximate(Rs[1]); -  } - -  if (checkSubsets) { -    Tuple<bool> live(Rs.size()); -    if (hull_debug) { -      fprintf(DebugFile,"Checking subsets in hull computation:\n"); -      printRs(Rs); -    } -    int i; -    for(i=1;i <=Rs.size(); i++) live[i] = true; -    for(i=1;i <=Rs.size(); i++)  -      for(int j=1;j <=Rs.size(); j++) if (i != j && live[j]) { -          if (hull_debug) fprintf(DebugFile,"checking %d Is_Obvious_Subset %d\n",i,j); -          if (Is_Obvious_Subset(copy(Rs[i]),copy(Rs[j]))) { -            if (hull_debug) fprintf(DebugFile,"yes...\n"); -            live[i] = false; -            break; -          } -        } -    for(i=1;i <=Rs.size(); i++) if (!live[i]) { -        if (i < Rs.size()) { -          Rs[i] = Rs[Rs.size()]; -          live[i] = live[Rs.size()]; -        } -        Rs[Rs.size()] = Relation(); -        Rs.delete_last(); -        i--; -      } -  } -  Relation hull; -  if (hull_debug) { -    fprintf(DebugFile,"Better Hull:\n"); -    printRs(Rs); -    fprintf(DebugFile,"known hull: %s\n", knownHull.print_with_subs_to_string().c_str()); -  } -  if (knownHull.is_null()) hull = QuickHull(Rs); -  else hull = Intersection(QuickHull(Rs),knownHull); -  // for (int i = 1; i <= Rs.size(); i++) -  //   hull = RectHull(Union(hull, copy(Rs[i]))); -  // hull = Intersection(hull, knownHull); -  hull.simplify(); -  if (hull_debug) { -    fprintf(DebugFile,"quick hull: %s\n", hull.print_with_subs_to_string().c_str()); -  } - -  Relation orig = Relation::False(Rs[1]); -  int i; -  for (i = 1; i <= Rs.size(); i++)  -    orig = Union(orig,copy(Rs[i])); - -  orig.simplify(); - -  for (i = 1; i <= Rs.size(); i++) { -    if (!hull.is_obvious_tautology()) Rs[i] = Gist(Rs[i],copy(hull)); -    Rs[i].simplify(); -    if (Rs[i].is_obvious_tautology()) return hull; -    if (Rs[i].has_single_conjunct()) { -      Rs[i] = EQs_to_GEQs(Rs[i]); -      if (hull_debug) { -        fprintf(DebugFile,"Checking for hull constraints in:\n  %s\n", Rs[i].print_with_subs_to_string().c_str()); -      } -      Conjunct *c = Rs[i].single_conjunct(); -      for (GEQ_Iterator g(c->GEQs()); g.live(); g.next()) { -        Relation tmp = Relation::True(Rs[i]); -        tmp.and_with_GEQ(*g); -        if (!Difference(copy(orig),tmp).is_upper_bound_satisfiable())  -          hull.and_with_GEQ(*g); -      } -      for (EQ_Iterator e(c->EQs()); e.live(); e.next()) { -        Relation tmp = Relation::True(Rs[i]); -        tmp.and_with_EQ(*e); -        if (!Difference(copy(orig),tmp).is_upper_bound_satisfiable())  -          hull.and_with_EQ(*e); -      } -    } -  } - -  hull = FastTightHull(orig,hull); -  assert(hull.has_single_conjunct()); - -  if (stridesAllowed) return hull; -  else return Approximate(hull); - -} - - - -Relation  Hull(NOT_CONST Relation &S,  -               bool stridesAllowed, -               int effort, -               NOT_CONST Relation &knownHull) { -  Relation R = consume_and_regurgitate(S); -  R.simplify(1,0); -  if (!R.is_upper_bound_satisfiable()) return R; -  Tuple<Relation> Rs; -  for (DNF_Iterator c(R.query_DNF()); c.live(); ) { -    Rs.append(Relation(R,c.curr())); -    c.next(); -  } -  if (effort == 1) -    return BetterHull(Rs,stridesAllowed,false,knownHull); -  else -    return QuickHull(Rs); -} - - - -Relation Hull(Tuple<Relation> &Rs,  -              const std::vector<bool> &validMask,  -              int effort,  -              bool stridesAllowed, -              NOT_CONST Relation &knownHull) { -  // Use relation of index i only when validMask[i] != 0 -  Tuple<Relation> Rs2; -  for(int i = 1; i <= Rs.size(); i++) { -    if (validMask[i-1]) { -      Rs[i].simplify(); -      for (DNF_Iterator c(Rs[i].query_DNF()); c.live(); ) { -        Rs2.append(Relation(Rs[i],c.curr())); -        c.next(); -      } -    } -  } -  assert(effort == 0 || effort == 1); -  if (effort == 1) -    return BetterHull(Rs2,stridesAllowed,true,knownHull); -  else -    return QuickHull(Rs2); -} - - -// This function is deprecated!!! -Relation CheckForConvexRepresentation(NOT_CONST Relation &R_In) { -  Relation R = consume_and_regurgitate(R_In); -  Relation h = Hull(copy(R)); -  if (!Difference(copy(h),copy(R)).is_upper_bound_satisfiable()) -    return h; -  else -    return R; -} - -// This function is deprecated!!! -Relation CheckForConvexPairs(NOT_CONST Relation &S) { -  Relation R = consume_and_regurgitate(S); -  Relation hull = FastTightHull(copy(R),Relation::True(R)); -  R.simplify(1,0); -  if (!R.is_upper_bound_satisfiable() || R.number_of_conjuncts() < 2) return R; -  Tuple<Relation> Rs; -  for (DNF_Iterator c(R.query_DNF()); c.live(); ) { -    Rs.append(Relation(R,c.curr())); -    c.next(); -  } - -  bool *dead = new bool[Rs.size()+1]; -  int i; -  for(i = 1; i<=Rs.size();i++) dead[i] = false; - -  for(i = 1; i<=Rs.size();i++) -    if (!dead[i])  -      for(int j = i+1; j<=Rs.size();j++) if (!dead[j]) { -          if (hull_debug) { -            fprintf(DebugFile,"Comparing #%d and %d\n",i,j); -          } -          Relation U = Union(copy(Rs[i]),copy(Rs[j])); -          Relation H_ij = FastTightHull(copy(U),copy(hull)); -          if (!Difference(copy(H_ij),U).is_upper_bound_satisfiable()) { -            Rs[i] = H_ij; -            dead[j] = true; -            if (hull_debug)  { -              fprintf(DebugFile,"Combined them\n"); -            } -          } -        } -  i = 1; -  while(i<=Rs.size() && dead[i]) i++; -  assert(i<=Rs.size()); -  R = Rs[i]; -  i++; -  for(; i<=Rs.size();i++) -    if (!dead[i])  -      R = Union(R,Rs[i]); -  delete []dead; -  return R; -} - -// -// Supporting functions for ConvexRepresentation -// -namespace { -struct Interval { -  std::list<std::pair<Relation, Relation> >::iterator pos; -  coef_t lb; -  coef_t ub; -  bool change; -  coef_t modulo;     -  Interval(std::list<std::pair<Relation, Relation> >::iterator pos_, coef_t lb_, coef_t ub_): -    pos(pos_), lb(lb_), ub(ub_) {} -  friend bool operator<(const Interval &a, const Interval &b); -}; - -bool operator<(const Interval &a, const Interval &b) { -  return a.lb < b.lb; -} - -struct Modulo_Interval { -  coef_t modulo; -  coef_t start; -  coef_t size; -  Modulo_Interval(coef_t modulo_, coef_t start_, coef_t size_): -    modulo(modulo_), start(start_), size(size_) {} -  friend bool operator<(const Interval &a, const Interval &b); -}; -   -bool operator<(const Modulo_Interval &a, const Modulo_Interval &b) { -  if (a.modulo == b.modulo) { -    if (a.start == b.start) -      return a.size < b.size; -    else -      return a.start < b.start; -  } -  else -    return a.modulo < b.modulo; -} - -void merge_intervals(std::list<Interval> &intervals, coef_t modulo, std::list<std::pair<Relation, Relation> > &Rs, std::list<std::pair<Relation, Relation> >::iterator orig) { -  // normalize  intervals -  for (std::list<Interval>::iterator i = intervals.begin(); i != intervals.end(); i++) { -    (*i).modulo = modulo; -    (*i).change = false; -    if ((*i).ub - (*i).lb + 1>= modulo) { -      (*i).lb = 0; -      (*i).ub = modulo - 1; -    }  -    else if ((*i).ub < 0 || (*i).lb >= modulo) { -      coef_t range = (*i).ub - (*i).lb; -      (*i).lb = int_mod((*i).lb, modulo); -      (*i).ub = (*i).lb + range; -    } -  } - -  intervals.sort(); - -  // merge neighboring intervals -  std::list<Interval>::iterator p = intervals.begin(); -  while (p != intervals.end()) { -    std::list<Interval>::iterator q = p; -    q++; -    while (q != intervals.end()) { -      if ((*p).ub + 1 >= (*q).lb) { -        Relation hull = ConvexHull(Union(copy((*(*p).pos).first), copy((*(*q).pos).first))); -        Relation remainder = Difference(Difference(copy(hull), copy((*(*p).pos).first)), copy((*(*q).pos).first)); -        if (!remainder.is_upper_bound_satisfiable()) { -          if ((*q).pos == orig) -            std::swap((*p).pos, (*q).pos); -          (*(*p).pos).first = hull; -          (*p).ub = max((*p).ub, (*q).ub); -          (*p).change = true; -          Rs.erase((*q).pos); -          q = intervals.erase(q); -        } -        else -          break; -      } -      else -        break; -    } - -    bool p_moved = false; -    q = p; -    q++; -    while (q != intervals.end()) { -      if ((*q).ub >= modulo && int_mod((*q).ub, modulo) + 1 >= (*p).lb) { -        Relation hull = ConvexHull(Union(copy((*(*p).pos).first), copy((*(*q).pos).first))); -        Relation remainder = Difference(Difference(copy(hull), copy((*(*p).pos).first)), copy((*(*q).pos).first)); -        if (!remainder.is_upper_bound_satisfiable()) { -          if ((*p).pos == orig) -            std::swap((*p).pos, (*q).pos); -          (*(*q).pos).first = hull; -          coef_t t = (*p).ub - int_mod((*q).ub, modulo); -          if (t > 0) -            (*q).ub = (*q).ub + t;               -          (*q).change = true; -          Rs.erase((*p).pos); -          p = intervals.erase(p); -          p_moved = true; -          break; -        } -        else -          q++; -      } -      else -        q++; -    } - -    if (!p_moved) -      p++; -  } - -  // merge by reducing the strengh of modulo -  std::list<Modulo_Interval> modulo_intervals; -  coef_t max_distance = modulo/2; -  for (std::list<Interval>::iterator p = intervals.begin(); p != intervals.end(); p++) { -    if ((*p).lb >= max_distance) -      break; - -    coef_t size = (*p).ub - (*p).lb; -       -    std::list<Interval>::iterator q = p; -    q++; -    while (q != intervals.end()) { -      coef_t distance = (*q).lb - (*p).lb; -      if (distance > max_distance) -        break; - -      if ((*q).ub - (*q).lb != size || int_mod(modulo, distance) != 0) { -        q++; -        continue; -      } - -      int num_reduced = 0; -      coef_t looking_for = int_mod((*p).lb, distance); -      for (std::list<Interval>::iterator k = intervals.begin(); k != intervals.end(); k++) { -        if ((*k).lb == looking_for && (*k).ub - (*k).lb == size) {             -          num_reduced++; -          looking_for += distance; -          if (looking_for >= modulo) -            break; -        }             -        else if ((*k).lb <= looking_for && (*k).ub >= looking_for + size) { -          looking_for += distance; -          if (looking_for >= modulo) -            break; -        } -        else if ((*k).lb > looking_for) -          break; -      } - -      if (looking_for >= modulo && num_reduced > 1) -        modulo_intervals.push_back(Modulo_Interval(distance, int_mod((*p).lb, distance), size)); - -      q++; -    } -  } -           -  modulo_intervals.sort(); - -  // remove redundant reduced-strength intervals -  std::list<Modulo_Interval>::iterator p2 = modulo_intervals.begin(); -  while (p2 != modulo_intervals.end()) { -    std::list<Modulo_Interval>::iterator q2 = p2; -    q2++; -    while (q2 != modulo_intervals.end()) { -      if ((*p2).modulo == (*q2).modulo && (*p2).start == (*q2).start) -        q2 = modulo_intervals.erase(q2); -      else if (int_mod((*q2).modulo, (*p2).modulo) == 0 && -               (*p2).start == int_mod((*q2).start, (*p2).modulo) && -               (*p2).size >= (*q2).size) -        q2 = modulo_intervals.erase(q2); -      else -        q2++; -    } -    p2++; -  } -                 -  // replace original intervals with new reduced-strength ones -  for (std::list<Modulo_Interval>::iterator i = modulo_intervals.begin(); i != modulo_intervals.end(); i++) { -    std::vector<Relation *> candidates; -    int num_replaced = 0; -    for (std::list<Interval>::iterator j = intervals.begin(); j != intervals.end(); j++) -      if (int_mod((*j).modulo, (*i).modulo) == 0 && -          (*j).ub - (*j).lb >= (*i).size && -          (int_mod((*j).lb, (*i).modulo) == (*i).start || -           int_mod((*j).ub, (*i).modulo) == (*i).start + (*i).size)) { -        candidates.push_back(&((*(*j).pos).first)); -        if (int_mod((*j).lb, (*i).modulo) == (*i).start && -            (*j).ub - (*j).lb == (*i).size) -          num_replaced++; -      } -    if (num_replaced <= 1) -      continue; -       -    Relation R = copy(*candidates[0]); -    for (size_t k = 1; k < candidates.size(); k++) -      R = Union(R, copy(*candidates[k])); -    Relation hull = ConvexHull(copy(R)); -    Relation remainder = Difference(copy(hull), copy(R)); -    if (!remainder.is_upper_bound_satisfiable()) { -      std::list<Interval>::iterator replaced_one = intervals.end(); -      for (std::list<Interval>::iterator j = intervals.begin(); j != intervals.end();) -        if (int_mod((*j).modulo, (*i).modulo) == 0 && -            (*j).ub - (*j).lb >= (*i).size && -            (int_mod((*j).lb, (*i).modulo) == (*i).start || -             int_mod((*j).ub, (*i).modulo) == (*i).start + (*i).size)) { -          if (int_mod((*j).lb, (*i).modulo) == (*i).start && -              (*j).ub - (*j).lb == (*i).size) { -            if (replaced_one == intervals.end()) { -              (*(*j).pos).first = hull; -              (*j).lb = int_mod((*j).lb, (*i).modulo); -              (*j).ub = int_mod((*j).ub, (*i).modulo); -              (*j).modulo = (*i).modulo; -              (*j).change = true; -              replaced_one = j; -              j++; -            } -            else { -              if ((*j).pos == orig) { -                std::swap((*replaced_one).pos, (*j).pos); -                (*(*replaced_one).pos).first = (*(*j).pos).first; -              } -              Rs.erase((*j).pos); -              j = intervals.erase(j); -            } -          } -          else { -            if (int_mod((*j).lb, (*i).modulo) == (*i).start) -              (*j).lb = (*j).lb + (*i).size + 1; -            else -              (*j).ub = (*j).ub - (*i).size - 1; -            (*j).change = true; -            j++; -          } -        } -        else -          j++; -    } -  }                 -}     -} // namespace - - -// -// Simplify a union of sets/relations to a minimal (may not be -// optimal) number of convex regions.  It intends to replace -// CheckForConvexRepresentation and CheckForConvexPairs functions. -// -Relation ConvexRepresentation(NOT_CONST Relation &R) { -  Relation l_R = copy(R); -  if (!l_R.is_upper_bound_satisfiable() || l_R.number_of_conjuncts() < 2) -    return R; - -  // separate each conjunct into smooth convex region and holes -  std::list<std::pair<Relation, Relation> > Rs; // pair(smooth region, hole condition) -  for (DNF_Iterator c(l_R.query_DNF()); c.live(); c++) { -    Relation r1 = Relation(l_R, c.curr()); -    Relation r2 = Approximate(copy(r1)); -    r1 = Gist(r1, copy(r2)); -    Rs.push_back(std::make_pair(r2, r1)); -  } - -  try { -    bool change = true; -    while (change) { -      change = false; - -      std::list<std::pair<Relation, Relation> >::iterator i = Rs.begin(); -      while (i != Rs.end()) { -        // find regions with identical hole conditions to merge -        { -          std::list<std::pair<Relation, Relation> >::iterator j = i; -          j++; -          while (j != Rs.end()) { -            if (!Difference(copy((*i).second), copy((*j).second)).is_upper_bound_satisfiable() && -                !Difference(copy((*j).second), copy((*i).second)).is_upper_bound_satisfiable()) { -              if (Must_Be_Subset(copy((*j).first), copy((*i).first))) { -                j = Rs.erase(j); -              } -              else if (Must_Be_Subset(copy((*i).first), copy((*j).first))) { -                (*i).first = (*j).first; -                j = Rs.erase(j); -                change = true; -              } -              else { -                Relation r; -                bool already_use_recthull = false; -                try { -                  r = ConvexHull(Union(copy((*i).first), copy((*j).first))); -                } -                catch (const std::overflow_error &e) { -                  r = SimpleHull(Union(copy((*i).first), copy((*j).first))); -                  already_use_recthull = true; -                } -                retry_recthull: -                Relation r2 = Difference(Difference(copy(r), copy((*i).first)), copy((*j).first)); -                if (!r2.is_upper_bound_satisfiable()) { // convex hull is tight -                  (*i).first = r; -                  j = Rs.erase(j); -                  change = true; -                } -                else { -                  if (!already_use_recthull) { -                    r = SimpleHull(Union(copy((*i).first), copy((*j).first))); -                    already_use_recthull = true; -                    goto retry_recthull; -                  } -                  else -                    j++; -                } -              } -            } -            else -              j++; -          } -        } - -        // find identical smooth regions as candidates for hole merge -        std::list<std::list<std::pair<Relation, Relation> >::iterator> s; -        for (std::list<std::pair<Relation, Relation> >::iterator j = Rs.begin(); j != Rs.end(); j++)  -          if (j != i) { -            if (!Intersection(Difference(copy((*i).first), copy((*j).first)), copy((*j).second)).is_upper_bound_satisfiable() && -                !Intersection(Difference(copy((*j).first), copy((*i).first)), copy((*i).second)).is_upper_bound_satisfiable()) -              s.push_back(j); -          } -       -        if (s.size() != 0) { -          // convert hole condition c1*x1+c2*x2+... = c*alpha+d to a pair of inequalities -          (*i).second = EQs_to_GEQs((*i).second, false); - -          // find potential wildcards that can be used for hole conditions -          std::set<Variable_ID> nonsingle_wild; -          for (EQ_Iterator ei((*i).second.single_conjunct()); ei; ei++) -            if ((*ei).has_wildcards()) -              for (Constr_Vars_Iter cvi(*ei, true); cvi; cvi++) -                nonsingle_wild.insert(cvi.curr_var()); -          for (GEQ_Iterator gei((*i).second.single_conjunct()); gei; gei++) -            if ((*gei).has_wildcards()) { -              Constr_Vars_Iter cvi(*gei, true); -              Constr_Vars_Iter cvi2 = cvi; -              cvi2++; -              if (cvi2) { -                nonsingle_wild.insert(cvi.curr_var()); -                for (; cvi2; cvi2++) -                  nonsingle_wild.insert(cvi2.curr_var()); -              } -            } - -          // find hole condition in c*alpha+d1<=c1*x1+c2*x2+...<=c*alpha+d2 format -          for (GEQ_Iterator gei((*i).second.single_conjunct()); gei; gei++) -            if ((*gei).has_wildcards()) { -              coef_t c; -              Variable_ID v; -              { -                Constr_Vars_Iter cvi(*gei, true); -                v = cvi.curr_var(); -                c = cvi.curr_coef(); -                if (c < 0 || nonsingle_wild.find(v) != nonsingle_wild.end()) -                  continue; -              } -           -              coef_t lb = posInfinity; -              for (GEQ_Iterator gei2((*i).second.single_conjunct()); gei2; gei2++) { -                if (!(*gei2 == *gei) && (*gei2).get_coef(v) != 0) { -                  if (lb != posInfinity) { -                    nonsingle_wild.insert(v); -                    break; -                  } -                 -                  bool match = true; -                  for (Constr_Vars_Iter cvi2(*gei); cvi2; cvi2++) -                    if (cvi2.curr_coef() != -((*gei2).get_coef(cvi2.curr_var()))) { -                      match = false; -                      break; -                    } -                  if (match) -                    for (Constr_Vars_Iter cvi2(*gei2); cvi2; cvi2++) -                      if (cvi2.curr_coef() != -((*gei).get_coef(cvi2.curr_var()))) { -                        match = false; -                        break; -                      } -                  if (!match) { -                    nonsingle_wild.insert(v); -                    break; -                  } - -                  lb = -(*gei2).get_const(); -                } -              } - -              if (nonsingle_wild.find(v) != nonsingle_wild.end()) -                continue; -           -              Relation stride_cond = Relation::True((*i).second); -              F_Exists *f_exists = stride_cond.and_with_and()->add_exists(); -              Variable_ID e = f_exists->declare(); -              F_And *f_root = f_exists->add_and(); -              GEQ_Handle h1 = f_root->add_GEQ(); -              GEQ_Handle h2 = f_root->add_GEQ(); -              for (Constr_Vars_Iter cvi2(*gei); cvi2; cvi2++) { -                Variable_ID v = cvi2.curr_var(); -                switch (v->kind()) { -                case Wildcard_Var:  -                  h1.update_coef(e, cvi2.curr_coef()); -                  h2.update_coef(e, -cvi2.curr_coef()); -                  break; -                case Global_Var: { -                  Global_Var_ID g = v->get_global_var(); -                  Variable_ID v2; -                  if (g->arity() == 0) -                    v2 = stride_cond.get_local(g); -                  else -                    v2 = stride_cond.get_local(g, v->function_of()); -                  h1.update_coef(v2, cvi2.curr_coef()); -                  h2.update_coef(v2, -cvi2.curr_coef()); -                  break; -                } -                default: -                  h1.update_coef(v, cvi2.curr_coef()); -                  h2.update_coef(v, -cvi2.curr_coef()); -                } -              } -              h1.update_const((*gei).get_const()); -              h2.update_const(-lb); - -              stride_cond.simplify(); -              Relation other_cond = Gist(copy((*i).second), copy(stride_cond)); - -              // find regions with potential mergeable stride condition with this one -              std::list<Interval> intervals; -              intervals.push_back(Interval(i, lb, (*gei).get_const())); -             -              for (std::list<std::list<std::pair<Relation, Relation> >::iterator>::iterator j = s.begin(); j != s.end(); j++) -                if (Must_Be_Subset(copy((**j).second), copy(other_cond))) { -                  Relation stride_cond2 = Gist(copy((**j).second), copy(other_cond)); - -                  // interval can be removed -                  if (stride_cond2.is_obvious_tautology()) { -                    intervals.push_back(Interval(*j, 0, c-1)); -                    continue; -                  } - -                  stride_cond2 = EQs_to_GEQs(stride_cond2, false); -                  coef_t lb, ub; -                  GEQ_Iterator gei2(stride_cond2.single_conjunct()); -                  coef_t sign = 0; -                  for (Constr_Vars_Iter cvi(*gei2, true); cvi; cvi++) -                    if (sign != 0) { -                      sign = 0; -                      break; -                    } -                    else if (cvi.curr_coef() == c) -                      sign = 1; -                    else if (cvi.curr_coef() == -c) -                      sign = -1; -                    else { -                      sign = 0; -                      break; -                    }                 -                  if (sign == 0) -                    continue; - -                  bool match = true; -                  for (Constr_Vars_Iter cvi(*gei2); cvi; cvi++) { -                    Variable_ID v = cvi.curr_var(); -                    if (v->kind() == Wildcard_Var) -                      continue; -                    else if (v->kind() == Global_Var) { -                      Global_Var_ID g = v->get_global_var(); -                      if (g->arity() == 0) -                        v = (*i).second.get_local(g); -                      else -                        v = (*i).second.get_local(g, v->function_of()); -                    } -                     -                    if (cvi.curr_coef() != sign * (*gei).get_coef(v)) { -                      match = false; -                      break; -                    } -                  } -                  if (!match) -                    continue; -                 -                  for (Constr_Vars_Iter cvi(*gei); cvi; cvi++) { -                    Variable_ID v = cvi.curr_var(); -                    if (v->kind() == Wildcard_Var) -                      continue; -                    else if (v->kind() == Global_Var) { -                      Global_Var_ID g = v->get_global_var(); -                      if (g->arity() == 0) -                        v = stride_cond2.get_local(g); -                      else -                        v = stride_cond2.get_local(g, v->function_of()); -                    } -                     -                    if (cvi.curr_coef() != sign * (*gei2).get_coef(v)) { -                      match = false; -                      break; -                    } -                  } -                  if (!match) -                    continue; -                  if (sign > 0) -                    ub = (*gei2).get_const(); -                  else -                    lb = -(*gei2).get_const();                 -                 -                  gei2++; -                  if (!gei2) -                    continue; - -                  coef_t sign2 = 0; -                  for (Constr_Vars_Iter cvi(*gei2, true); cvi; cvi++) -                    if (sign2 != 0) { -                      sign2 = 0; -                      break; -                    } -                    else if (cvi.curr_coef() == c) -                      sign2 = 1; -                    else if (cvi.curr_coef() == -c) -                      sign2 = -1; -                    else { -                      sign2 = 0; -                      break; -                    } -                  if (sign2 != -sign) -                    continue; - -                  for (Constr_Vars_Iter cvi(*gei2); cvi; cvi++) { -                    Variable_ID v = cvi.curr_var(); -                    if (v->kind() == Wildcard_Var) -                      continue; -                    else if (v->kind() == Global_Var) { -                      Global_Var_ID g = v->get_global_var(); -                      if (g->arity() == 0) -                        v = (*i).second.get_local(g); -                      else -                        v = (*i).second.get_local(g, v->function_of()); -                    } -                     -                    if (cvi.curr_coef() != sign2 * (*gei).get_coef(v)) { -                      match = false; -                      break; -                    } -                  } -                  if (!match) -                    continue; -                 -                  for (Constr_Vars_Iter cvi(*gei); cvi; cvi++) { -                    Variable_ID v = cvi.curr_var(); -                    if (v->kind() == Wildcard_Var) -                      continue; -                    else if (v->kind() == Global_Var) { -                      Global_Var_ID g = v->get_global_var(); -                      if (g->arity() == 0) -                        v = stride_cond2.get_local(g); -                      else -                        v = stride_cond2.get_local(g, v->function_of()); -                    } -                     -                    if (cvi.curr_coef() != sign2 * (*gei2).get_coef(v)) { -                      match = false; -                      break; -                    } -                  } -                  if (!match) -                    continue; -                  if (sign2 > 0) -                    ub = (*gei2).get_const(); -                  else -                    lb = -(*gei2).get_const(); -                 -                  gei2++; -                  if (gei2) -                    continue; -                     -                  intervals.push_back(Interval(*j, lb, ub));                 -                } - -              merge_intervals(intervals, c, Rs, i); - -              // make current region the last one being updated -              bool invalid = false; -              for (std::list<Interval>::iterator ii = intervals.begin(); ii != intervals.end(); ii++) -                if ((*ii).change && (*ii).pos == i) { -                  invalid = true; -                  intervals.push_back(*ii); -                  intervals.erase(ii); -                  break; -                } - -              // update hole condition for each region -              for (std::list<Interval>::iterator ii = intervals.begin(); ii != intervals.end(); ii++) -                if ((*ii).change) { -                  change = true; - -                  if ((*ii).ub - (*ii).lb + 1 >= (*ii).modulo) -                    (*(*ii).pos).second = copy(other_cond); -                  else { -                    Relation stride_cond = Relation::True((*i).second); -                    F_Exists *f_exists = stride_cond.and_with_and()->add_exists(); -                    Variable_ID e = f_exists->declare(); -                    F_And *f_root = f_exists->add_and(); -                    GEQ_Handle h1 = f_root->add_GEQ(); -                    GEQ_Handle h2 = f_root->add_GEQ(); -                    for (Constr_Vars_Iter cvi2(*gei); cvi2; cvi2++) { -                      Variable_ID v = cvi2.curr_var(); -                      switch (v->kind()) { -                      case Wildcard_Var:  -                        h1.update_coef(e, (*ii).modulo); -                        h2.update_coef(e, -(*ii).modulo); -                        break; -                      case Global_Var: { -                        Global_Var_ID g = v->get_global_var(); -                        Variable_ID v2; -                        if (g->arity() == 0) -                          v2 = stride_cond.get_local(g); -                        else -                          v2 = stride_cond.get_local(g, v->function_of()); -                        h1.update_coef(v2, cvi2.curr_coef()); -                        h2.update_coef(v2, -cvi2.curr_coef()); -                        break; -                      } -                      default: -                        h1.update_coef(v, cvi2.curr_coef()); -                        h2.update_coef(v, -cvi2.curr_coef()); -                      } -                    } -                    h1.update_const((*ii).ub); -                    h2.update_const(-(*ii).lb); - -                    (*(*ii).pos).second = Intersection(copy(other_cond), stride_cond); -                    (*(*ii).pos).second.simplify(); -                  } -                } -             -              if (invalid) -                break; -            } -        }       -        i++; -      } -    } -  } -  catch (const presburger_error &e) { -    throw e; -  } - -  Relation R2 = Relation::False(l_R); -  for (std::list<std::pair<Relation, Relation> >::iterator i = Rs.begin(); i != Rs.end(); i++) -    R2 = Union(R2, Intersection((*i).first, (*i).second)); -  R2.simplify(0, 1); -   -  return R2; -} - -// -// Use gist and value range to calculate a quick rectangular hull. It -// intends to replace all hull calculations (QuickHull, BetterHull, -// FastTightHull) beyond the method of ConvexHull (dual -// representations). In the future, it will support max(...)-like -// upper bound. So RectHull complements ConvexHull in two ways: first -// for relations that ConvexHull gets too complicated, second for -// relations where different conjuncts have different symbolic upper -// bounds. -//  -Relation RectHull(NOT_CONST Relation &Rel) { -  Relation R = Approximate(consume_and_regurgitate(Rel)); -  if (!R.is_upper_bound_satisfiable()) -    return R; -  if (R.has_single_conjunct()) -    return R; - -  std::vector<std::string> input_names(R.n_inp()); -  for (int i = 1; i <= R.n_inp(); i++) -    input_names[i-1] = R.input_var(i)->name(); -  std::vector<std::string> output_names(R.n_out()); -  for (int i = 1; i <= R.n_out(); i++) -    output_names[i-1] = R.output_var(i)->name(); -   -  DNF_Iterator c(R.query_DNF()); -  Relation r = Relation(R, c.curr()); -  c++; -  std::vector<std::pair<coef_t, coef_t> > bounds1(R.n_inp()); -  std::vector<std::pair<coef_t, coef_t> > bounds2(R.n_out()); -  { -    Relation t = Project_Sym(copy(r)); -    t.simplify(); -    for (int i = 1; i <= R.n_inp(); i++) { -      Tuple<Variable_ID> v; -      for (int j = 1; j <= R.n_inp(); j++) -        if (j != i) -          v.append(r.input_var(j)); -      for (int j = 1; j <= R.n_out(); j++) -        v.append(r.output_var(j)); -      Relation t2 = Project(copy(t), v); -      t2.query_variable_bounds(t2.input_var(i), bounds1[i-1].first, bounds1[i-1].second); -    } -    for (int i = 1; i <= R.n_out(); i++) { -      Tuple<Variable_ID> v; -      for (int j = 1; j <= R.n_out(); j++) -        if (j != i) -          v.append(r.output_var(j)); -      for (int j = 1; j <= R.n_inp(); j++) -        v.append(r.input_var(j)); -      Relation t2 = Project(copy(t), v); -      t2.query_variable_bounds(t2.output_var(i), bounds2[i-1].first, bounds2[i-1].second); -    } -  } -     -  while (c.live()) { -    Relation r2 = Relation(R, c.curr()); -    c++; -    Relation x = Gist(copy(r), Gist(copy(r), copy(r2), 1), 1); -    if (Difference(copy(r2), copy(x)).is_upper_bound_satisfiable()) -      x = Relation::True(R); -    Relation y = Gist(copy(r2), Gist(copy(r2), copy(r), 1), 1); -    if (Difference(copy(r), copy(y)).is_upper_bound_satisfiable()) -      y = Relation::True(R); -    r = Intersection(x, y); -     -    { -      Relation t = Project_Sym(copy(r2)); -      t.simplify(); -      for (int i = 1; i <= R.n_inp(); i++) { -        Tuple<Variable_ID> v; -        for (int j = 1; j <= R.n_inp(); j++) -          if (j != i) -            v.append(r2.input_var(j)); -        for (int j = 1; j <= R.n_out(); j++) -          v.append(r2.output_var(j)); -        Relation t2 = Project(copy(t), v); -        coef_t lbound, ubound; -        t2.query_variable_bounds(t2.input_var(i), lbound, ubound); -        bounds1[i-1].first = min(bounds1[i-1].first, lbound); -        bounds1[i-1].second = max(bounds1[i-1].second, ubound); -      } -      for (int i = 1; i <= R.n_out(); i++) { -        Tuple<Variable_ID> v; -        for (int j = 1; j <= R.n_out(); j++) -          if (j != i) -            v.append(r2.output_var(j)); -        for (int j = 1; j <= R.n_inp(); j++) -          v.append(r2.input_var(j)); -        Relation t2 = Project(copy(t), v); -        coef_t lbound, ubound; -        t2.query_variable_bounds(t2.output_var(i), lbound, ubound); -        bounds2[i-1].first = min(bounds2[i-1].first, lbound); -        bounds2[i-1].second = max(bounds2[i-1].second, ubound); -      } -    } - -    Relation r3(R.n_inp(), R.n_out()); -    F_And *f_root = r3.add_and(); -    for (int i = 1; i <= R.n_inp(); i++) { -      if (bounds1[i-1].first != -posInfinity) { -        GEQ_Handle h = f_root->add_GEQ(); -        h.update_coef(r3.input_var(i), 1); -        h.update_const(-bounds1[i-1].first); -      } -      if (bounds1[i-1].second != posInfinity) { -        GEQ_Handle h = f_root->add_GEQ(); -        h.update_coef(r3.input_var(i), -1); -        h.update_const(bounds1[i-1].second); -      } -    } -    for (int i = 1; i <= R.n_out(); i++) { -      if (bounds2[i-1].first != -posInfinity) { -        GEQ_Handle h = f_root->add_GEQ(); -        h.update_coef(r3.output_var(i), 1); -        h.update_const(-bounds2[i-1].first); -      } -      if (bounds2[i-1].second != posInfinity) { -        GEQ_Handle h = f_root->add_GEQ(); -        h.update_coef(r3.output_var(i), -1); -        h.update_const(bounds2[i-1].second); -      } -    } -    r = Intersection(r, r3); -    r.simplify(); -  } - -  for (int i = 1; i <= r.n_inp(); i++) -    r.name_input_var(i, input_names[i-1]); -  for (int i = 1; i <= r.n_out(); i++) -    r.name_output_var(i, output_names[i-1]); -  r.setup_names(); -  return r; -} - -} - diff --git a/omega/omega_lib/src/hull_simple.cc b/omega/omega_lib/src/hull_simple.cc deleted file mode 100755 index 93d8ad3..0000000 --- a/omega/omega_lib/src/hull_simple.cc +++ /dev/null @@ -1,1013 +0,0 @@ -/***************************************************************************** - Copyright (C) 2011 Chun Chen - All Rights Reserved. - - Purpose: - Hull approximation including lattice and irregular constraints that - involves wildcards. - - Notes: - - History: - 03/12/11 Created by Chun Chen - *****************************************************************************/ - -#include <assert.h> -#include <omega.h> -#include <basic/boolset.h> -#include <vector> -#include <list> -#include <set> -#include <string> -#include <algorithm> - -namespace omega { - -Relation SimpleHull(const Relation &R, bool allow_stride_constraint, -		bool allow_irregular_constraint) { -	std::vector<Relation> Rs; -	Rs.push_back(R); -	return SimpleHull(Rs, allow_stride_constraint, allow_irregular_constraint); -} - -Relation SimpleHull(const std::vector<Relation> &Rs, -		bool allow_stride_constraint, bool allow_irregular_constraint) { -	// check for sanity of parameters -	if (Rs.size() == 0) -		return Relation::False(0); -	int num_dim = -1; -	int first_non_null; -	for (int i = 0; i < Rs.size(); i++) { -		if (Rs[i].is_null()) -			continue; - -		if (num_dim == -1) { -			num_dim = Rs[i].n_inp(); -			first_non_null = i; -		} - -		if (Rs[i].n_inp() != num_dim) -			throw std::invalid_argument( -					"relations for hull must have same dimension"); -		if (Rs[i].n_out() != 0) -			throw std::invalid_argument( -					"hull calculation must be set relation"); -	} - -	// convert to a list of relations each with a single conjunct -	std::vector<Relation> l_Rs; -	for (int i = 0; i < Rs.size(); i++) { -		if (Rs[i].is_null()) -			continue; - -		Relation r = copy(Rs[i]); - -		 //r.simplify(2, 4); -	        r.simplify(); -		DNF_Iterator c(r.query_DNF()); -		int top = l_Rs.size(); -		while (c.live()) { -			Relation r2 = Relation(r, c.curr()); - -			// quick elimination of redundant conjuncts -			bool already_included = false; -			for (int j = 0; j < top; j++) -				if (Must_Be_Subset(copy(r2), copy(l_Rs[j]))) { -					already_included = true; -					break; -				} else if (Must_Be_Subset(copy(l_Rs[j]), copy(r2))) { -					l_Rs.erase(l_Rs.begin() + j); -					top--; -					break; -				} - -			if (!already_included) -				l_Rs.push_back(r2); -			c++; -		} -	} - -	// shortcut for simple case -	if (l_Rs.size() == 0) { -		if (num_dim == -1) -			return Relation::False(0); -		else { -			Relation r = Relation::False(num_dim); -			r.copy_names(Rs[first_non_null]); -			r.setup_names(); -			return r; -		} -	} else if (l_Rs.size() == 1) { -		if (allow_stride_constraint && allow_irregular_constraint) { -			l_Rs[0].copy_names(Rs[first_non_null]); -			l_Rs[0].setup_names(); -			return l_Rs[0]; -		} else if (!allow_stride_constraint && !allow_irregular_constraint) { -			l_Rs[0] = Approximate(l_Rs[0]); -			l_Rs[0].copy_names(Rs[first_non_null]); -			l_Rs[0].setup_names(); -			return l_Rs[0]; -		} -	} - -	Relation hull = Relation::True(num_dim); - -	// lattice union approximation -	if (allow_stride_constraint) { -		std::vector<std::vector<std::pair<EQ_Handle, BoolSet<> > > > strides( -				l_Rs.size()); -		for (int i = 0; i < l_Rs.size(); i++) -			for (EQ_Iterator e = l_Rs[i].single_conjunct()->EQs(); e; e++) -				if ((*e).has_wildcards()) { -					int num_wildcard = 0; -					BoolSet<> affected(num_dim); -					for (Constr_Vars_Iter cvi(*e); cvi; cvi++) { -						if (cvi.curr_var()->kind() == Wildcard_Var) -							num_wildcard++; -						else if (cvi.curr_var()->kind() == Input_Var) -							affected.set(cvi.curr_var()->get_position() - 1); -					} -					if (num_wildcard == 1) -						strides[i].push_back(std::make_pair(*e, affected)); -				} - -		for (int i = 0; i < strides[0].size(); i++) { -			coef_t c = -					abs( -							strides[0][i].first.get_coef( -									Constr_Vars_Iter(strides[0][i].first, true).curr_var())); -			coef_t old_c = c; -			bool is_stride = true; -			for (int j = 1; j < l_Rs.size(); j++) { -				std::list<coef_t> candidates; -				for (int k = 0; k < strides[j].size(); k++) -					if (!(strides[0][i].second & strides[j][k].second).empty()) { -						coef_t t = gcd(c, -								abs( -										strides[j][k].first.get_coef( -												Constr_Vars_Iter( -														strides[j][k].first, -														true).curr_var()))); -						if (t != 1) { -							std::list<coef_t>::iterator p = candidates.begin(); -							while (p != candidates.end() && *p > t) -								++p; -							if (p == candidates.end() || *p != t) -								candidates.insert(p, t); - -							t = gcd(t, abs(strides[0][i].first.get_const())); -							t = gcd(t, abs(strides[j][k].first.get_const())); -							if (t != 1) { -								std::list<coef_t>::iterator p = -										candidates.begin(); -								while (p != candidates.end() && *p > t) -									++p; -								if (p == candidates.end() || *p != t) -									candidates.insert(p, t); -							} -						} -					} - -				bool found_matched_stride = false; -				for (std::list<coef_t>::iterator k = candidates.begin(); -						k != candidates.end(); k++) { -					Relation r = Relation::True(num_dim); -					EQ_Handle h = r.and_with_EQ(strides[0][i].first); -					h.update_coef(Constr_Vars_Iter(h, true).curr_var(), -							-old_c + *k); -					r.simplify(); -					if (Must_Be_Subset(copy(l_Rs[j]), copy(r))) { -						c = *k; -						found_matched_stride = true; -						break; -					} -				} - -				if (!found_matched_stride) { -					is_stride = false; -					break; -				} -			} - -			if (is_stride) { -				Relation r = Relation::True(num_dim); -				EQ_Handle h = r.and_with_EQ(strides[0][i].first); -				h.update_coef(Constr_Vars_Iter(h, true).curr_var(), -old_c + c); -				r.simplify(); -				hull = Intersection(hull, r); -			} -		} -	} - -	// consider some special wildcard constraints -	if (allow_irregular_constraint) { -		std::vector< -				std::vector< -						std::pair<Variable_ID, std::map<Variable_ID, coef_t> > > > ranges( -				l_Rs.size()); -		for (int i = 0; i < l_Rs.size(); i++) { -			std::vector<std::pair<GEQ_Handle, std::map<Variable_ID, coef_t> > > geqs_ub; -			std::vector<std::pair<GEQ_Handle, std::map<Variable_ID, coef_t> > > geqs_lb; -			for (GEQ_Iterator e = l_Rs[i].single_conjunct()->GEQs(); e; e++) -				if ((*e).has_wildcards()) { -					int num_wildcard = 0; -					std::map<Variable_ID, coef_t> formula; -					int direction; -					for (Constr_Vars_Iter cvi(*e); cvi; cvi++) { -						Variable_ID v = cvi.curr_var(); -						switch (v->kind()) { -						case Wildcard_Var: -							num_wildcard++; -							if (cvi.curr_coef() > 0) -								direction = true; -							else -								direction = false; -							break; -						case Input_Var: -						case Global_Var: -							formula[cvi.curr_var()] = cvi.curr_coef(); -							break; -						default: -							assert(false); -						} -					} -					if (num_wildcard == 1) { -						if (direction) { -							for (std::map<Variable_ID, coef_t>::iterator j = -									formula.begin(); j != formula.end(); j++) -								j->second = -j->second; -							geqs_ub.push_back(std::make_pair(*e, formula)); -						} else -							geqs_lb.push_back(std::make_pair(*e, formula)); -					} -				} -			for (int j = 0; j < geqs_lb.size(); j++) { -				Variable_ID v = -						Constr_Vars_Iter(geqs_lb[j].first, true).curr_var(); -				for (int k = 0; k < geqs_ub.size(); k++) -					if (v == Constr_Vars_Iter(geqs_ub[k].first, true).curr_var() -							&& geqs_lb[j].second == geqs_ub[k].second) -						ranges[i].push_back( -								std::make_pair(v, geqs_lb[j].second)); -			} -		} - -		// find compatible wildcard match -		// TODO: evaluate to find the best match, also avoid mapping two wildcards -		//       in a single conjunct to one variable (incorrect) -		std::vector<std::vector<int> > all_match; -		for (int i = 0; i < ranges[0].size(); i++) { -			std::vector<int> match(l_Rs.size(), -1); -			match[0] = i; -			for (int j = 1; j < l_Rs.size(); j++) { -				for (int k = 0; k < ranges[j].size(); k++) -					if (ranges[0][i].second == ranges[j][k].second) { -						match[j] = k; -						break; -					} -				if (match[j] == -1) -					break; -			} -			if (match[l_Rs.size() - 1] != -1) -				all_match.push_back(match); -		} - -		// map compatible wildcards to input variables -		std::vector<Relation> ll_Rs(l_Rs.size()); -		for (int i = 0; i < l_Rs.size(); i++) { -			Relation r(num_dim + all_match.size()); -			F_Exists *f_exists = r.add_and()->add_exists(); -			F_And *f_root = f_exists->add_and(); -			std::map<Variable_ID, Variable_ID> wc_map; -			for (int j = 0; j < all_match.size(); j++) -				wc_map[ranges[i][all_match[j][i]].first] = r.set_var(j + 1); - -			for (EQ_Iterator e(l_Rs[i].single_conjunct()->EQs()); e; e++) -				if (!(*e).has_wildcards()) { -					EQ_Handle h = f_root->add_EQ(); -					for (Constr_Vars_Iter cvi(*e); cvi; cvi++) -						switch (cvi.curr_var()->kind()) { -						case Input_Var: { -							h.update_coef( -									r.set_var( -											cvi.curr_var()->get_position() -													+ all_match.size()), -									cvi.curr_coef()); -							break; -						} -						case Global_Var: { -							Global_Var_ID g = cvi.curr_var()->get_global_var(); -							Variable_ID v; -							if (g->arity() == 0) -								v = r.get_local(g); -							else -								v = r.get_local(g, -										cvi.curr_var()->function_of()); -							h.update_coef(v, cvi.curr_coef()); -							break; -						} -						default: -							assert(false); -						} -					h.update_const((*e).get_const()); -				} - -			for (GEQ_Iterator e(l_Rs[i].single_conjunct()->GEQs()); e; e++) { -				GEQ_Handle h = f_root->add_GEQ(); -				for (Constr_Vars_Iter cvi(*e); cvi; cvi++) -					switch (cvi.curr_var()->kind()) { -					case Input_Var: { -						h.update_coef( -								r.set_var( -										cvi.curr_var()->get_position() -												+ all_match.size()), -								cvi.curr_coef()); -						break; -					} -					case Global_Var: { -						Global_Var_ID g = cvi.curr_var()->get_global_var(); -						Variable_ID v; -						if (g->arity() == 0) -							v = r.get_local(g); -						else -							v = r.get_local(g, cvi.curr_var()->function_of()); -						h.update_coef(v, cvi.curr_coef()); -						break; -					} -					case Wildcard_Var: { -						std::map<Variable_ID, Variable_ID>::iterator p = -								wc_map.find(cvi.curr_var()); -						Variable_ID v; -						if (p == wc_map.end()) { -							v = f_exists->declare(); -							wc_map[cvi.curr_var()] = v; -						} else -							v = p->second; -						h.update_coef(v, cvi.curr_coef()); -						break; -					} -					default: -						assert(false); -					} -				h.update_const((*e).get_const()); -			} - -			r.simplify(); -			ll_Rs[i] = r; -		} - -		// now use SimpleHull on regular bounds only -		Relation result = SimpleHull(ll_Rs, false, false); - -		// convert imaginary input variables back to wildcards -		Relation mapping(num_dim + all_match.size(), num_dim); -		F_And *f_root = mapping.add_and(); -		for (int i = 0; i < num_dim; i++) { -			EQ_Handle h = f_root->add_EQ(); -			h.update_coef(mapping.input_var(all_match.size() + i + 1), 1); -			h.update_coef(mapping.output_var(i + 1), -1); -		} -		result = Range(Restrict_Domain(mapping, result)); - -		hull = Intersection(hull, result); -		hull.simplify(); -		hull.copy_names(Rs[first_non_null]); -		hull.setup_names(); -		return hull; -	} - -	// check regular bounds -	if (l_Rs.size() == 1) { -		hull = Intersection(hull, Approximate(copy(l_Rs[0]))); -	} else { -		for (int i = 0; i < l_Rs.size(); i++) { -			l_Rs[i] = Approximate(l_Rs[i]); -			l_Rs[i].simplify(2, 4); -		} - -		// check global variables -		// TODO: global variable function_of() is not considered for now -		std::map<Global_Var_ID, int> globals; -		for (int i = 0; i < l_Rs.size(); i++) -			for (Constraint_Iterator e( -					l_Rs[i].single_conjunct()->constraints()); e; e++) -				for (Constr_Vars_Iter cvi(*e); cvi; cvi++) -					if (cvi.curr_var()->kind() == Global_Var) -						globals[cvi.curr_var()->get_global_var()] = -1; - -		if (globals.size() > 0) { -			int count = 1; -			for (std::map<Global_Var_ID, int>::iterator i = globals.begin(); -					i != globals.end(); i++) -				i->second = count++; - -			std::vector<Relation> ll_Rs(l_Rs.size()); -			for (int i = 0; i < l_Rs.size(); i++) { -				Relation r(num_dim + globals.size()); -				F_And *f_root = r.add_and(); -				for (EQ_Iterator e(l_Rs[i].single_conjunct()->EQs()); e; e++) { -					EQ_Handle h = f_root->add_EQ(); -					for (Constr_Vars_Iter cvi(*e); cvi; cvi++) -						switch (cvi.curr_var()->kind()) { -						case Input_Var: { -							h.update_coef( -									r.set_var( -											cvi.curr_var()->get_position() -													+ globals.size()), -									cvi.curr_coef()); -							break; -						} -						case Global_Var: { -							h.update_coef( -									r.set_var( -											globals[cvi.curr_var()->get_global_var()]), -									cvi.curr_coef()); -							break; -						} -						default: -							assert(false); -						} -					h.update_const((*e).get_const()); -				} -				for (GEQ_Iterator e(l_Rs[i].single_conjunct()->GEQs()); e; -						e++) { -					GEQ_Handle h = f_root->add_GEQ(); -					for (Constr_Vars_Iter cvi(*e); cvi; cvi++) -						switch (cvi.curr_var()->kind()) { -						case Input_Var: { -							h.update_coef( -									r.set_var( -											cvi.curr_var()->get_position() -													+ globals.size()), -									cvi.curr_coef()); -							break; -						} -						case Global_Var: { -							h.update_coef( -									r.set_var( -											globals[cvi.curr_var()->get_global_var()]), -									cvi.curr_coef()); -							break; -						} -						default: -							assert(false); -						} -					h.update_const((*e).get_const()); -				} - -				ll_Rs[i] = r; -			} - -			Relation result = SimpleHull(ll_Rs, false, false); - -			std::map<int, Global_Var_ID> globals_reverse; -			for (std::map<Global_Var_ID, int>::iterator i = globals.begin(); -					i != globals.end(); i++) -				globals_reverse[i->second] = i->first; - -			Relation r(num_dim); -			F_And *f_root = r.add_and(); -			for (EQ_Iterator e(result.single_conjunct()->EQs()); e; e++) { -				EQ_Handle h = f_root->add_EQ(); -				for (Constr_Vars_Iter cvi(*e); cvi; cvi++) -					switch (cvi.curr_var()->kind()) { -					case Input_Var: { -						int pos = cvi.curr_var()->get_position(); -						if (pos > globals_reverse.size()) -							h.update_coef( -									r.set_var(pos - globals_reverse.size()), -									cvi.curr_coef()); -						else { -							Global_Var_ID g = globals_reverse[pos]; -							h.update_coef(r.get_local(g), cvi.curr_coef()); -						} -						break; -					} -					default: -						assert(false); -					} -				h.update_const((*e).get_const()); -			} -			for (GEQ_Iterator e(result.single_conjunct()->GEQs()); e; e++) { -				GEQ_Handle h = f_root->add_GEQ(); -				for (Constr_Vars_Iter cvi(*e); cvi; cvi++) -					switch (cvi.curr_var()->kind()) { -					case Input_Var: { -						int pos = cvi.curr_var()->get_position(); -						if (pos > globals_reverse.size()) -							h.update_coef( -									r.set_var(pos - globals_reverse.size()), -									cvi.curr_coef()); -						else { -							Global_Var_ID g = globals_reverse[pos]; -							h.update_coef(r.get_local(g), cvi.curr_coef()); -						} -						break; -					} -					default: -						assert(false); -					} -				h.update_const((*e).get_const()); -			} - -			hull = Intersection(hull, r); -			hull.simplify(); -			hull.copy_names(Rs[first_non_null]); -			hull.setup_names(); -			return hull; -		} else { -			std::vector<std::vector<Relation> > projected(num_dim + 1, -					std::vector<Relation>(l_Rs.size())); -			for (int i = 0; i < l_Rs.size(); i++) { -				projected[num_dim][i] = copy(l_Rs[i]); -				for (int j = num_dim - 1; j >= 0; j--) { -					projected[j][i] = Project(copy(projected[j + 1][i]), -							projected[j + 1][i].input_var(j + 1)); -					projected[j][i].simplify(2, 4); -				} -			} - -			std::vector<bool> has_lb(num_dim, false); -			std::vector<bool> has_ub(num_dim, false); -			for (int i = 0; i < num_dim; i++) { -				bool skip_lb = false; -				bool skip_ub = false; -				std::vector<Relation> bound(l_Rs.size()); -				for (int j = 0; j < l_Rs.size(); j++) { -					bound[j] = Gist(copy(projected[i + 1][j]), -							copy(projected[i][j]), 1); -					bound[j] = Approximate(bound[j]); -					bound[j] = EQs_to_GEQs(bound[j]); - -					bool has_lb_not_in_hull = false; -					bool has_ub_not_in_hull = false; -					for (GEQ_Iterator e = bound[j].single_conjunct()->GEQs(); e; -							e++) { -						coef_t coef = (*e).get_coef(bound[j].input_var(i + 1)); -						if (!skip_lb && coef > 0) { -							Relation r = Relation::True(bound[j].n_inp()); -							r.and_with_GEQ(*e); -							r.simplify(); - -							if (j != 0 && l_Rs.size() > 2 -									&& Must_Be_Subset(copy(hull), copy(r))) -								continue; - -							bool belong_to_hull = true; -							for (int k = 0; k < l_Rs.size(); k++) -								if (k != j -										&& !Must_Be_Subset(copy(l_Rs[k]), -												copy(r))) { -									belong_to_hull = false; -									break; -								} -							if (belong_to_hull) { -								hull.and_with_GEQ(*e); -								has_lb[i] = true; -							} else -								has_lb_not_in_hull = true; -						} else if (!skip_ub && coef < 0) { -							Relation r = Relation::True(bound[j].n_inp()); -							r.and_with_GEQ(*e); -							r.simplify(); - -							if (j != 0 && l_Rs.size() > 2 -									&& Must_Be_Subset(copy(hull), copy(r))) -								continue; - -							bool belong_to_hull = true; -							for (int k = 0; k < l_Rs.size(); k++) -								if (k != j -										&& !Must_Be_Subset(copy(l_Rs[k]), -												copy(r))) { -									belong_to_hull = false; -									break; -								} -							if (belong_to_hull) { -								hull.and_with_GEQ(*e); -								has_ub[i] = true; -							} else -								has_ub_not_in_hull = true; -						} -					} - -					if (!has_lb_not_in_hull) -						skip_lb = true; -					if (!has_ub_not_in_hull) -						skip_ub = true; -					if (skip_lb && skip_ub) -						break; -				} - -				// no ready lower bound, approximate it -				bool got_rect_lb = false; -				if (!skip_lb) { -					for (int j = 0; j < l_Rs.size(); j++) { -						std::set<BoolSet<> > S; -						for (GEQ_Iterator e = -								bound[j].single_conjunct()->GEQs(); e; e++) { -							coef_t coef = (*e).get_coef( -									bound[j].input_var(i + 1)); -							if (coef > 0) { -								BoolSet<> s(i); -								for (Constr_Vars_Iter cvi(*e); cvi; cvi++) -									if ((*cvi).var->kind() == Input_Var -											&& (*cvi).var->get_position() - 1 -													!= i) { -										if (((*cvi).coef > 0 -												&& has_ub[(*cvi).var->get_position() -														- 1]) -												|| ((*cvi).coef < 0 -														&& has_lb[(*cvi).var->get_position() -																- 1])) -											s.set( -													(*cvi).var->get_position() -															- 1); -										else { -											for (GEQ_Iterator e2 = -													bound[j].single_conjunct()->GEQs(); -													e2; e2++) -												if (e2 != e -														&& (((*cvi).coef > 0 -																&& (*e2).get_coef( -																		(*cvi).var) -																		< 0) -																|| ((*cvi).coef -																		< 0 -																		&& (*e2).get_coef( -																				(*cvi).var) -																				> 0))) { -													s.set( -															(*cvi).var->get_position() -																	- 1); -													break; -												} -										} -									} - -								if (s.num_elem() > 0) -									S.insert(s); -							} -						} - -						if (S.size() > 0) { -							BoolSet<> s(i); -							for (std::set<BoolSet<> >::iterator k = S.begin(); -									k != S.end(); k++) -								s |= *k; -							for (int k = 0; k < i; k++) -								if (s.get(k)) { -									BoolSet<> t(i); -									t.set(k); -									S.insert(t); -								} - -							for (std::set<BoolSet<> >::iterator k = S.begin(); -									k != S.end(); k++) { - -								bool do_again = false; -								std::set<int> vars; -								int round_trip = 0; -								do { -									Relation r = copy(projected[i + 1][j]); - -									if (!do_again) { -										for (int kk = 0; kk < i; kk++) -											if ((*k).get(kk)) { -												r = Project(r, -														r.input_var(kk + 1)); -												vars.insert(kk + 1); -											} -									} else { -										for (std::set<int>::iterator vars_it = -												vars.begin(); -												vars_it != vars.end(); -												vars_it++) -											if (*vars_it < i + 1) -												r = Project(r, -														r.input_var(*vars_it)); -									} - -									r.simplify(2, 4); -									Relation r2 = Project(copy(r), -											r.input_var(i + 1)); -									Relation b = Gist(copy(r), copy(r2), 1); -									// Relation c = Project(copy(r),r.input_var(4) ); - -									// c.simplify(2,4); -									// Relation d = Project(copy(c), r.input_var(i+1)); -									// Relation e = Gist(copy(c), copy(d), 1); - -									b = Approximate(b); -									b = EQs_to_GEQs(b); - -									for (GEQ_Iterator e = -											b.single_conjunct()->GEQs(); e; -											e++) { -										coef_t coef = (*e).get_coef( -												b.input_var(i + 1)); -										if (coef > 0) { -											Relation r = Relation::True( -													b.n_inp()); -											r.and_with_GEQ(*e); -											r.simplify(); - -											if (Must_Be_Subset(copy(hull), -													copy(r))) -												continue; - -											bool belong_to_hull = true; -											for (int k = 0; k < l_Rs.size(); -													k++) -												if (k != j -														&& !Must_Be_Subset( -																copy(l_Rs[k]), -																copy(r))) { -													belong_to_hull = false; -													break; -												} -											if (belong_to_hull) { -												hull.and_with_GEQ(*e); -												got_rect_lb = true; -											} -										} -									} -									do_again = false; -									if (!got_rect_lb) { -										bool found = false; -										for (GEQ_Iterator e = -												b.single_conjunct()->GEQs(); e; -												e++) { -											coef_t coef = (*e).get_coef( -													b.input_var(i + 1)); - -											if (coef > 0) { -												for (Constr_Vars_Iter cvi(*e); -														cvi; cvi++) -													if ((*cvi).var->kind() -															== Input_Var -															&& (*cvi).var->get_position() -																	- 1 != i) { - -														if (((*cvi).coef > 0 -																&& has_ub[(*cvi).var->get_position() -																		- 1]) -																|| ((*cvi).coef -																		< 0 -																		&& has_lb[(*cvi).var->get_position() -																				- 1])) { -															vars.insert( -																	(*cvi).var->get_position()); -															found = true; -														} else { -															for (GEQ_Iterator e2 = -																	b.single_conjunct()->GEQs(); -																	e2; e2++) -																if (e2 != e -																		&& (((*cvi).coef -																				> 0 -																				&& (*e2).get_coef( -																						(*cvi).var) -																						< 0) -																				|| ((*cvi).coef -																						< 0 -																						&& (*e2).get_coef( -																								(*cvi).var) -																								> 0))) { -																	vars.insert( -																			(*cvi).var->get_position()); -																	found = -																			true; -																	break; -																} -														} - -													} - -											} -											if (found) -												break; - -										} -										if (found && (round_trip < i)) -											do_again = true; - -									} -									round_trip++; -								} while (do_again); -							} - -							if (got_rect_lb) -								break; -						} -					} -				} - -				// no ready upper bound, approximate it -				bool got_rect_ub = false; -				if (!skip_ub) { -					for (int j = 0; j < l_Rs.size(); j++) { -						std::set<BoolSet<> > S; -						for (GEQ_Iterator e = -								bound[j].single_conjunct()->GEQs(); e; e++) { -							coef_t coef = (*e).get_coef( -									bound[j].input_var(i + 1)); -							if (coef < 0) { -								BoolSet<> s(i); -								for (Constr_Vars_Iter cvi(*e); cvi; cvi++) -									if ((*cvi).var->kind() == Input_Var -											&& (*cvi).var->get_position() - 1 -													!= i) { -										if (((*cvi).coef > 0 -												&& has_ub[(*cvi).var->get_position() -														- 1]) -												|| ((*cvi).coef < 0 -														&& has_lb[(*cvi).var->get_position() -																- 1])) -											s.set( -													(*cvi).var->get_position() -															- 1); -										else { -											for (GEQ_Iterator e2 = -													bound[j].single_conjunct()->GEQs(); -													e2; e2++) -												if (e2 != e -														&& (((*cvi).coef > 0 -																&& (*e2).get_coef( -																		(*cvi).var) -																		< 0) -																|| ((*cvi).coef -																		< 0 -																		&& (*e2).get_coef( -																				(*cvi).var) -																				> 0))) { -													s.set( -															(*cvi).var->get_position() -																	- 1); -													break; -												} -										} -									} - -								if (s.num_elem() > 0) -									S.insert(s); -							} -						} - -						if (S.size() > 0) { -							BoolSet<> s(i); -							for (std::set<BoolSet<> >::iterator k = S.begin(); -									k != S.end(); k++) -								s |= *k; -							for (int k = 0; k < i; k++) -								if (s.get(k)) { -									BoolSet<> t(i); -									t.set(k); -									S.insert(t); -								} - -							for (std::set<BoolSet<> >::iterator k = S.begin(); -									k != S.end(); k++) { - -								bool do_again = false; -								std::set<int> vars; -								int round_trip = 0; -								do { - -									Relation r = copy(projected[i + 1][j]); - -									if (!do_again) { -										for (int kk = 0; kk < i; kk++) -											if ((*k).get(kk)) { -												r = Project(r, -														r.input_var(kk + 1)); -												vars.insert(kk + 1); -											} -									} else { -										for (std::set<int>::iterator vars_it = -												vars.begin(); -												vars_it != vars.end(); -												vars_it++) -											if (*vars_it < i + 1) -												r = Project(r, -														r.input_var(*vars_it)); -									} - -									r.simplify(2, 4); -									Relation r2 = Project(copy(r), -											r.input_var(i + 1)); -									// r2.simplify(2,4); -									Relation b = Gist(r, r2, 1); -									b = Approximate(b); -									b = EQs_to_GEQs(b); - -									for (GEQ_Iterator e = -											b.single_conjunct()->GEQs(); e; -											e++) { -										coef_t coef = (*e).get_coef( -												b.input_var(i + 1)); -										if (coef < 0) { -											Relation r = Relation::True( -													b.n_inp()); -											r.and_with_GEQ(*e); -											r.simplify(); - -											if (Must_Be_Subset(copy(hull), -													copy(r))) -												continue; - -											bool belong_to_hull = true; -											for (int k = 0; k < l_Rs.size(); -													k++) -												if (k != j -														&& !Must_Be_Subset( -																copy(l_Rs[k]), -																copy(r))) { -													belong_to_hull = false; -													break; -												} -											if (belong_to_hull) { -												hull.and_with_GEQ(*e); -												got_rect_ub = true; -											} -										} -									} -                                    do_again = false; -									if (!got_rect_ub) { -										bool found = false; -										for (GEQ_Iterator e = -												b.single_conjunct()->GEQs(); e; -												e++) { -											coef_t coef = (*e).get_coef( -													b.input_var(i + 1)); -											if (coef < 0) { -												for (Constr_Vars_Iter cvi(*e); -														cvi; cvi++) -													if ((*cvi).var->kind() -															== Input_Var -															&& (*cvi).var->get_position() -																	- 1 != i) { - -														if (((*cvi).coef > 0 -																&& has_ub[(*cvi).var->get_position() -																		- 1]) -																|| ((*cvi).coef -																		< 0 -																		&& has_lb[(*cvi).var->get_position() -																				- 1])) { -															vars.insert( -																	(*cvi).var->get_position()); -															found = true; -														} else { -															for (GEQ_Iterator e2 = -																	b.single_conjunct()->GEQs(); -																	e2; e2++) -																if (e2 != e -																		&& (((*cvi).coef -																				> 0 -																				&& (*e2).get_coef( -																						(*cvi).var) -																						< 0) -																				|| ((*cvi).coef -																						< 0 -																						&& (*e2).get_coef( -																								(*cvi).var) -																								> 0))) { -																	vars.insert( -																			(*cvi).var->get_position()); -																	found = -																			true; -																	break; -																} -														} - -													} -											} -											if (found) -												break; -										} -										if (found && (round_trip < i)) -											do_again = true; - -									} -									round_trip++; -								} while (do_again); -							} - -							if (got_rect_ub) -								break; -						} -					} -				} -			} -		} -	} - -	hull.simplify(); -	hull.copy_names(Rs[first_non_null]); -	hull.setup_names(); -	return hull; -} - -} - diff --git a/omega/omega_lib/src/omega_core/oc.cc b/omega/omega_lib/src/omega_core/oc.cc deleted file mode 100644 index 0dc9b49..0000000 --- a/omega/omega_lib/src/omega_core/oc.cc +++ /dev/null @@ -1,754 +0,0 @@ -/***************************************************************************** - Copyright (C) 1994-2000 the Omega Project Team - Copyright (C) 2005-2011 Chun Chen - All Rights Reserved. - - Purpose: -  Simplify a problem. - - Notes: - - History: -   12/10/06 Improved gist function, by Chun Chen. -*****************************************************************************/ - -#include <omega/omega_core/oc_i.h> - -namespace omega { - -eqn SUBs[maxVars+1]; -Memory redMemory[maxVars+1]; - -int Problem::reduceProblem() { -  int result; -  checkVars(nVars+1); -  assert(omegaInitialized); -  if (nVars > nEQs + 3 * safeVars) -    freeEliminations(safeVars); - -  check(); -  if (!mayBeRed && nSUBs == 0 && safeVars == 0) { -    result = solve(OC_SOLVE_UNKNOWN); -    nGEQs = 0; -    nEQs = 0; -    nSUBs = 0; -    nMemories = 0; -    if (!result) { -      int e = newEQ(); -      assert(e == 0); -      eqnnzero(&EQs[0], nVars); -      EQs[0].color = EQ_BLACK; -      EQs[0].coef[0] = 1; -    } -    check(); -    return result; -  } -  return solve(OC_SOLVE_SIMPLIFY); -} - - -int Problem::simplifyProblem(int verify, int subs, int redundantElimination) { -  checkVars(nVars+1); -  assert(omegaInitialized); -  setInternals(); -  check(); -  if (!reduceProblem())  goto returnFalse; -  if (verify) { -    addingOuterEqualities++; -    int r = verifyProblem(); -    addingOuterEqualities--; -    if (!r) goto returnFalse; -    if (nEQs) { // found some equality constraints during verification -      int numRed = 0; -      if (mayBeRed)  -        for (int e = nGEQs - 1; e >= 0; e--) if (GEQs[e].color == EQ_RED) numRed++; -      if (mayBeRed && nVars == safeVars && numRed == 1) -        nEQs = 0; // discard them -      else if (!reduceProblem()) { -        assert(0 && "Added equality constraint to verified problem generates false"); -      } -    } -  } -  if (redundantElimination) { -    if (redundantElimination > 1) { -      if (!expensiveEqualityCheck()) goto returnFalse; -    } -    if (!quickKill(0)) goto returnFalse; -    if (redundantElimination > 1) { -      if (!expensiveKill()) goto returnFalse; -    } -  } -  resurrectSubs(); -  if (redundantElimination)  -    simplifyStrideConstraints(); -  if (redundantElimination > 2 && safeVars < nVars) { -    if (!quickKill(0)) goto returnFalse; -    return simplifyProblem(verify, subs, redundantElimination-2); -  } -  setExternals(); -  assert(nMemories == 0); -  return (1); -   -returnFalse: -  nGEQs = 0; -  nEQs = 0; -  resurrectSubs(); -  nGEQs = 0; -  nEQs = 0; -  int neweq = newEQ(); -  assert(neweq == 0); -  eqnnzero(&EQs[neweq], nVars); -  EQs[neweq].color = EQ_BLACK; -  EQs[neweq].coef[0] = 1; -  nMemories = 0; -  return 0; -} - -int Problem::simplifyApproximate(bool strides_allowed) { -  int result; -  checkVars(nVars+1); -  assert(inApproximateMode  == 0); - -  inApproximateMode = 1; -  inStridesAllowedMode = strides_allowed; -  if (TRACE) -    fprintf(outputFile, "Entering Approximate Mode [\n"); - -  assert(omegaInitialized); -  result = simplifyProblem(0,0,0); - -  while (result && !strides_allowed && nVars > safeVars) { -    int e; -    for (e = nGEQs - 1; e >= 0; e--)  -      if (GEQs[e].coef[nVars]) deleteGEQ(e); -    for (e = nEQs - 1; e >= 0; e--)  -      if (EQs[e].coef[nVars]) deleteEQ(e); -    nVars--; -    result = simplifyProblem(0,0,0); -  } - -  if (TRACE) -    fprintf(outputFile, "] Leaving Approximate Mode\n"); -     -  assert(inApproximateMode  == 1); -  inApproximateMode=0; -  inStridesAllowedMode = 0; - -  assert(nMemories == 0); -  return (result); -} - - - - -/* - * Return 1 if red equations constrain the set of possible - * solutions. We assume that there are solutions to the black - * equations by themselves, so if there is no solution to the combined - * problem, we return 1. - */ - -#ifdef GIST_CHECK -Problem full_answer, context; -Problem redProblem; -#endif - -redCheck Problem::redSimplifyProblem(int effort, int computeGist) { -  int result; -  int e; - -  checkVars(nVars+1); -  assert(mayBeRed >= 0); -  mayBeRed++; - -  assert(omegaInitialized); -  if (TRACE) { -    fprintf(outputFile, "Checking for red equations:\n"); -    printProblem(); -  } -  setInternals(); - -#ifdef GIST_CHECK -  int r1,r2; -  if (TRACE)  -    fprintf(outputFile,"Set-up for gist invariant checking[\n"); -  redProblem = *this; -  redProblem.check(); -  full_answer = *this; -  full_answer.check(); -  full_answer.turnRedBlack(); -  full_answer.check(); -  r1 = full_answer.simplifyProblem(1,0,1); -  full_answer.check(); -  if (DBUG) fprintf(outputFile,"Simplifying context [\n"); -  context = *this;  -  context.check(); -  context.deleteRed(); -  context.check(); -  r2 = context.simplifyProblem(1,0,1); -  context.check(); -  if (DBUG) fprintf(outputFile,"] Simplifying context\n"); - -  if (!r2 && TRACE) fprintf(outputFile, "WARNING: Gist context is false!\n"); -  if (TRACE)  -    fprintf(outputFile,"] Set-up for gist invariant checking done\n"); -#endif - -  // Save known integer modular equations, -- by chun 12/10/2006 -  eqn ModularEQs[nEQs]; -  int nModularEQs = 0; -  int old_nVars = nVars; -  for (int e = 0; e < nEQs; e++) -    if (EQs[e].color != EQ_RED) -      for (int i = safeVars+1; i <= nVars; i++) -        if (EQs[e].coef[i] != 0) { -          eqnncpy(&(ModularEQs[nModularEQs++]), &(EQs[e]), nVars); -          break; -        } -   -   -  if (solveEQ() == false) { -    if (TRACE) -      fprintf(outputFile, "Gist is FALSE\n"); -    if (computeGist) { -      nMemories = 0; -      nGEQs = 0; -      nEQs = 0; -      resurrectSubs(); -      nGEQs = 0; -      nEQs = 0; -      int neweq = newEQ(); -      assert(neweq == 0); -      eqnnzero(&EQs[neweq], nVars); -      EQs[neweq].color = EQ_RED; -      EQs[neweq].coef[0] = 1; -    } -    mayBeRed--; -    return redFalse; -  } - -  if (!computeGist && nMemories)  -    return redConstraints; -  if (normalize() == normalize_false) { -    if (TRACE) -      fprintf(outputFile, "Gist is FALSE\n"); -    if (computeGist) { -      nGEQs = 0; -      nEQs = 0; -      resurrectSubs(); -      nMemories = 0; -      nGEQs = 0; -      nEQs = 0; -      int neweq = newEQ(); -      assert(neweq == 0); -      eqnnzero(&EQs[neweq], nVars); -      EQs[neweq].color = EQ_RED; -      EQs[neweq].coef[0] = 1; -    } -    mayBeRed--; -    return redFalse; -  } - -  result = 0; -  for (e = nGEQs - 1; e >= 0; e--) if (GEQs[e].color == EQ_RED) result = 1; -  for (e = nEQs - 1; e >= 0; e--) if (EQs[e].color == EQ_RED) result = 1; -  if (nMemories) result = 1; -  if (!result) { -    if (computeGist) { -      nGEQs = 0; -      nEQs = 0; -      resurrectSubs(); -      nGEQs = 0; -      nMemories = 0; -      nEQs = 0; -    } -    mayBeRed--; -    return noRed; -  } - -  result = simplifyProblem(effort?1:0,1,0); -#ifdef GIST_CHECK -  if (!r1 && TRACE && result)  -    fprintf(outputFile, "Gist is False but not detected\n"); -#endif -  if (!result) { -    if (TRACE) -      fprintf(outputFile, "Gist is FALSE\n"); -    if (computeGist) { -      nGEQs = 0; -      nEQs = 0; -      resurrectSubs(); -      nGEQs = 0; -      nEQs = 0; -      int neweq = newEQ(); -      assert(neweq == 0); -      nMemories = 0; -      eqnnzero(&EQs[neweq], nVars); -      EQs[neweq].color = EQ_RED; -      EQs[neweq].coef[0] = 1; -    } -    mayBeRed--; -    return redFalse; -  } - -  freeRedEliminations(); - -  result = 0; -  for (e = nGEQs - 1; e >= 0; e--) if (GEQs[e].color == EQ_RED) result = 1; -  for (e = nEQs - 1; e >= 0; e--) if (EQs[e].color == EQ_RED) result = 1; -  if (nMemories) result = 1; -  if (!result) { -    if (computeGist) { -      nGEQs = 0; -      nEQs = 0; -      resurrectSubs(); -      nGEQs = 0; -      nMemories = 0; -      nEQs = 0; -    } -    mayBeRed--; -    return noRed; -  } - -  if (effort && (computeGist || !nMemories)) { -    if (TRACE) -      fprintf(outputFile, "*** Doing potentially expensive elimination tests for red equations [\n"); -    quickRedKill(computeGist); -    checkGistInvariant(); -    result = nMemories; -    for (e = nGEQs - 1; e >= 0; e--) if (GEQs[e].color == EQ_RED) result++; -    for (e = nEQs - 1; e >= 0; e--) if (EQs[e].color == EQ_RED) result++; -    if (result && effort > 1 && (computeGist || !nMemories))  { -      expensiveRedKill(); -      result = nMemories; -      for (e = nGEQs-1; e >= 0; e--) if (GEQs[e].color == EQ_RED) result++; -      for (e = nEQs-1; e >= 0; e--) if (EQs[e].color == EQ_RED) result++; -    } -  -    if (!result)  { -      if (TRACE) -        fprintf(outputFile, "]******************** Redudant Red Equations eliminated!!\n"); -      if (computeGist) { -        nGEQs = 0; -        nEQs = 0; -        resurrectSubs(); -        nGEQs = 0; -        nMemories = 0; -        nEQs = 0; -      } -      mayBeRed--; -      return noRed; -    } -      -    if (TRACE) fprintf(outputFile, "]******************** Red Equations remain\n"); -    if (DEBUG) printProblem(); -  } -   -  if (computeGist) { -    resurrectSubs();  -    cleanoutWildcards(); - - -    // Restore saved modular equations into EQs without affecting the problem -    if (nEQs+nModularEQs > allocEQs) { -      allocEQs = padEQs(allocEQs, nEQs+nModularEQs); -      eqn *new_eqs = new eqn[allocEQs]; -      for (int e = 0; e < nEQs; e++) -        eqnncpy(&(new_eqs[e]), &(EQs[e]), nVars); -      delete[] EQs; -      EQs= new_eqs; -    } -    -    for (int e = 0; e < nModularEQs; e++) { -      eqnncpy(&(EQs[nEQs+e]), &(ModularEQs[e]), old_nVars); -      EQs[nEQs+e].color = EQ_RED; -      Tuple<coef_t> t(safeVars); -      for (int i = 1; i <= safeVars; i++) -        t[i] = ModularEQs[e].coef[var[i]]; -      for (int i = 1; i <= safeVars; i++) -        EQs[nEQs+e].coef[i] = t[i]; -    } -       - -    // Now simplify modular equations using Chinese remainder theorem -- by chun 12/10/2006 -    for (int e = 0; e < nEQs; e++) -      if (EQs[e].color == EQ_RED) { -        int wild_pos = -1; -        for (int i = safeVars+1; i <= nVars; i++) -          if (EQs[e].coef[i] != 0) { -            wild_pos = i; -            break; -          } - -        if (wild_pos == -1) -          continue; - -        for (int e2 = e+1; e2 < nEQs+nModularEQs; e2++) -          if (EQs[e2].color == EQ_RED) { -            int wild_pos2 = -1; -            for (int i = safeVars+1; i <= ((e2<nEQs)?nVars:old_nVars); i++) -              if (EQs[e2].coef[i] != 0) { -                wild_pos2 = i; -                break; -              } - -            if (wild_pos2 == -1) -              continue; - -            coef_t g = gcd(abs(EQs[e].coef[wild_pos]), abs(EQs[e2].coef[wild_pos2])); -            coef_t g2 = 1; -            coef_t g3; -            EQs[e].color = EQs[e2].color = EQ_BLACK; -            while ((g3 = factor(g)) != 1) { -              coef_t gg = g2 * g3; -              g = g/g3; -               -              bool match = true; -              coef_t c = EQs[e].coef[0]; -              coef_t c2 = EQs[e2].coef[0]; -              bool change_sign = false; -              for (int i = 1; i <= safeVars; i++) { -                coef_t coef = int_mod_hat(EQs[e].coef[i], gg); -                coef_t coef2 = int_mod_hat(EQs[e2].coef[i], gg); - -                if (coef == 0 && coef2 == 0) -                  continue; -               -                if (change_sign && coef == -coef2) -                  continue; - -                if (!change_sign) { -                  if (coef == coef2) -                    continue; -                  else if (coef == -coef2) { -                    change_sign = true; -                    continue; -                  } -                } -                 -                if (coef != 0) { -                  coef_t t = query_variable_mod(i, gg/gcd(abs(coef), gg), EQ_RED, nModularEQs, old_nVars); -                  if (t == posInfinity) { -                    match = false; -                    break; -                  } -                 -                  c += coef * t; -                } -                if (coef2 != 0) { -                  coef_t t = query_variable_mod(i, gg/gcd(abs(coef2), gg), EQ_RED, nModularEQs, old_nVars); -                  if (t == posInfinity) { -                    match = false; -                    break; -                  } - -                  c2 += coef2 * t; -                } -              } -              if ((change_sign && int_mod_hat(c, gg) != -int_mod_hat(c2, gg)) || -                  (!change_sign && int_mod_hat(c, gg) != int_mod_hat(c2, gg))) -                match = false; - -              if (match) -                g2 = gg; -            } -            EQs[e].color = EQs[e2].color = EQ_RED; - -            if (g2 == 1) -              continue; -             -            if (g2 == abs(EQs[e].coef[wild_pos])) { -              EQs[e].color = EQ_BLACK; -              break; -            } -            else if (e2 < nEQs && g2 == abs(EQs[e2].coef[wild_pos2])) -              EQs[e2].color = EQ_BLACK; -            else { -              coef_t g4 = abs(EQs[e].coef[wild_pos])/g2; -              while (lcm(g2, g4) != abs(EQs[e].coef[wild_pos])) { -                assert(lcm(g2, g4) < abs(EQs[e].coef[wild_pos])); -                g4 *= abs(EQs[e].coef[wild_pos])/lcm(g2, g4); -              } -               -              for (int i = 0; i <= safeVars; i++) -                EQs[e].coef[i] = int_mod_hat(EQs[e].coef[i], g4); -              EQs[e].coef[wild_pos] = (EQs[e].coef[wild_pos]>0?1:-1)*g4; -            } -          } -      } -     -    deleteBlack(); -  } -   -  setExternals(); -  mayBeRed--; -  assert(nMemories == 0); -  return redConstraints; -} - - -void Problem::convertEQstoGEQs(bool excludeStrides) { -  int i; -  int e; -  if (DBUG) -    fprintf(outputFile, "Converting all EQs to GEQs\n"); -  simplifyProblem(0,0,0); -  for(e=0;e<nEQs;e++) { -    bool isStride = 0; -    int e2 = newGEQ(); -    if (excludeStrides) -      for(i = safeVars+1; i <= nVars; i++) -        isStride = isStride || (EQs[e].coef[i] != 0); -    if (isStride) continue; -    eqnncpy(&GEQs[e2], &EQs[e], nVars); -    GEQs[e2].touched = 1; -    e2 = newGEQ(); -    eqnncpy(&GEQs[e2], &EQs[e], nVars); -    GEQs[e2].touched = 1; -    for (i = 0; i <= nVars; i++) -      GEQs[e2].coef[i] = -GEQs[e2].coef[i]; -  } -  // If we have eliminated all EQs, can set nEQs to 0 -  // If some strides are left, we don't know the position of them in the EQs -  // array, so decreasing nEQs might remove wrong EQs -- we just leave them -  // all in. (could sort the EQs to move strides to the front, but too hard.) -  if (!excludeStrides) nEQs=0;  -  if (DBUG) -    printProblem(); -} - - -void Problem::convertEQtoGEQs(int eq) { -  int i; -  if (DBUG) -    fprintf(outputFile, "Converting EQ %d to GEQs\n",eq); -  int e2 = newGEQ(); -  eqnncpy(&GEQs[e2], &EQs[eq], nVars); -  GEQs[e2].touched = 1; -  e2 = newGEQ(); -  eqnncpy(&GEQs[e2], &EQs[eq], nVars); -  GEQs[e2].touched = 1; -  for (i = 0; i <= nVars; i++) -    GEQs[e2].coef[i] = -GEQs[e2].coef[i]; -  if (DBUG) -    printProblem(); -} - - -/* - * Calculate value of variable modulo integer from problem's equation - * set plus additional saved modular equations embedded in the same - * EQs array (hinted by nModularEQs) if available. If there is no - * solution, return posInfinity. - */ -coef_t Problem::query_variable_mod(int v, coef_t factor, int color, int nModularEQs, int nModularVars) const { -  if (safeVars < v) -    return posInfinity; -   -  Tuple<bool> working_on(safeVars); -  for (int i = 1; i <= safeVars; i++) -    working_on[i] = false; - -  return query_variable_mod(v, factor, color, nModularEQs, nModularVars, working_on); -} - -coef_t Problem::query_variable_mod(int v, coef_t factor, int color, int nModularEQs, int nModularVars, Tuple<bool> &working_on) const { -  working_on[v] = true; - -  for (int e = 0; e < nEQs+nModularEQs; e++) -    if (EQs[e].color == color) { -      coef_t coef = int_mod_hat(EQs[e].coef[v], factor); -      if (abs(coef) != 1) -        continue; - -      bool wild_factored = true; -      for (int i = safeVars+1; i <= ((e<nEQs)?nVars:nModularVars); i++) -        if (int_mod_hat(EQs[e].coef[i], factor) != 0) { -          wild_factored = false; -          break; -        } -      if (!wild_factored) -        continue; -       -      coef_t result = 0; -      for (int i = 1; i <= safeVars; i++) -        if (i != v) { -          coef_t p = int_mod_hat(EQs[e].coef[i], factor); - -          if (p == 0) -            continue; - -          if (working_on[i] == true) { -            result = posInfinity; -            break; -          } - -          coef_t q = query_variable_mod(i, factor, color, nModularEQs, nModularVars, working_on); -          if (q == posInfinity) { -            result = posInfinity; -            break; -          } -          result += p*q; -        } - -      if (result != posInfinity) { -        result += EQs[e].coef[0]; -        if (coef == 1) -          result = -result; -        working_on[v] = false; - -        return int_mod_hat(result, factor); -      } -    } - -  working_on[v] = false; -  return posInfinity; -}           - - - -#ifdef GIST_CHECK -enum compareAnswer {apparentlyEqual, mightNotBeEqual, NotEqual}; - -static compareAnswer checkEquiv(Problem *p1, Problem *p2) { -  int r1,r2; - -  p1->check(); -  p2->check(); -  p1->resurrectSubs();  -  p2->resurrectSubs();  -  p1->check(); -  p2->check(); -  p1->putVariablesInStandardOrder();  -  p2->putVariablesInStandardOrder();  -  p1->check(); -  p2->check(); -  p1->ordered_elimination(0);  -  p2->ordered_elimination(0);  -  p1->check(); -  p2->check(); -  r1 = p1->simplifyProblem(1,1,0); -  r2 = p2->simplifyProblem(1,1,0); -  p1->check(); -  p2->check(); - -  if (!r1 || !r2) { -    if (r1 == r2) return apparentlyEqual; -    return NotEqual; -  } -  if (p1->nVars != p2->nVars  -      || p1->nGEQs != p2->nGEQs  -      || p1->nSUBs != p2->nSUBs -      || p1->checkSum()  != p2->checkSum()) { -    r1 = p1->simplifyProblem(0,1,1); -    r2 = p2->simplifyProblem(0,1,1); -    assert(r1 && r2); -    p1->check(); -    p2->check(); -    if (p1->nVars != p2->nVars  -        || p1->nGEQs != p2->nGEQs  -        || p1->nSUBs != p2->nSUBs -        || p1->checkSum()  != p2->checkSum()) { -      r1 = p1->simplifyProblem(0,1,2); -      r2 = p2->simplifyProblem(0,1,2); -      p1->check(); -      p2->check(); -      assert(r1 && r2); -      if (p1->nVars != p2->nVars  -          || p1->nGEQs != p2->nGEQs  -          || p1->nSUBs != p2->nSUBs -          || p1->checkSum()  != p2->checkSum()) { -        p1->check(); -        p2->check(); -        p1->resurrectSubs();  -        p2->resurrectSubs();  -        p1->check(); -        p2->check(); -        p1->putVariablesInStandardOrder();  -        p2->putVariablesInStandardOrder();  -        p1->check(); -        p2->check(); -        p1->ordered_elimination(0);  -        p2->ordered_elimination(0);  -        p1->check(); -        p2->check(); -        r1 = p1->simplifyProblem(1,1,0); -        r2 = p2->simplifyProblem(1,1,0); -        p1->check(); -        p2->check(); -      } -    } -  } -   -  if (p1->nVars != p2->nVars  -      || p1->nSUBs != p2->nSUBs -      || p1->nGEQs != p2->nGEQs  -      || p1->nSUBs != p2->nSUBs) return NotEqual; -  if (p1->checkSum()  != p2->checkSum()) return mightNotBeEqual; -  return apparentlyEqual; -} -#endif - -void Problem::checkGistInvariant() const { -#ifdef GIST_CHECK -  Problem new_answer; -  int r; - -  check(); -  fullAnswer.check(); -  context.check(); - -  if (safeVars < nVars) { -    if (DBUG) { -      fprintf(outputFile,"Can't check gist invariant due to wildcards\n"); -      printProblem(); -    } -    return; -  } -  if (DBUG) { -    fprintf(outputFile,"Checking gist invariant on: [\n"); -    printProblem(); -  } - -  new_answer = *this; -  new_answer->resurrectSubs(); -  new_answer->cleanoutWildcards(); -  if (DEBUG) { -    fprintf(outputFile,"which is: \n"); -    printProblem(); -  } -  deleteBlack(&new_answer); -  turnRedBlack(&new_answer); -  if (DEBUG) { -    fprintf(outputFile,"Black version of answer: \n"); -    printProblem(&new_answer); -  } -  problem_merge(&new_answer,&context); - -  r = checkEquiv(&full_answer,&new_answer); -  if (r != apparentlyEqual) { -    fprintf(outputFile,"GIST INVARIANT REQUIRES MANUAL CHECK:[\n"); -    fprintf(outputFile,"Original problem:\n"); -    printProblem(&redProblem); - -    fprintf(outputFile,"Context:\n"); -    printProblem(&context); - -    fprintf(outputFile,"Computed gist:\n"); -    printProblem(); - -    fprintf(outputFile,"Combined answer:\n"); -    printProblem(&full_answer); - -    fprintf(outputFile,"Context && red constraints:\n"); -    printProblem(&new_answer); -    fprintf(outputFile,"]\n"); -  } -   -  if (DBUG) { -    fprintf(outputFile,"] Done checking gist invariant on\n"); -  } -#endif -} - -} // namespace diff --git a/omega/omega_lib/src/omega_core/oc_eq.cc b/omega/omega_lib/src/omega_core/oc_eq.cc deleted file mode 100644 index dc595ea..0000000 --- a/omega/omega_lib/src/omega_core/oc_eq.cc +++ /dev/null @@ -1,653 +0,0 @@ -/***************************************************************************** - Copyright (C) 1994-2000 the Omega Project Team - Copyright (C) 2005-2011 Chun Chen - All Rights Reserved. - - Purpose: - Solve equalities. - - Notes: - - History: - *****************************************************************************/ - -#include <omega/omega_core/oc_i.h> - -namespace omega { - -void Problem::simplifyStrideConstraints() { -	int e, e2, i; -	if (DBUG) -		fprintf(outputFile, "Checking for stride constraints\n"); -	for (i = safeVars + 1; i <= nVars; i++) { -		if (DBUG) -			fprintf(outputFile, "checking %s\n", variable(i)); -		for (e = 0; e < nGEQs; e++) -			if (GEQs[e].coef[i]) -				break; -		if (e >= nGEQs) { -			if (DBUG) -				fprintf(outputFile, "%s passed GEQ test\n", variable(i)); -			e2 = -1; -			for (e = 0; e < nEQs; e++) -				if (EQs[e].coef[i]) { -					if (e2 == -1) -						e2 = e; -					else { -						e2 = -1; -						break; -					} -				} -			if (e2 >= 0) { -				if (DBUG) { -					fprintf(outputFile, "Found stride constraint: "); -					printEQ(&EQs[e2]); -					fprintf(outputFile, "\n"); -				} -				/* Is a stride constraint */ -				coef_t g = abs(EQs[e2].coef[i]); -				assert(g>0); -				int j; -				for (j = 0; j <= nVars; j++) -					if (i != j) -						EQs[e2].coef[j] = int_mod_hat(EQs[e2].coef[j], g); -			} -		} -	} -} - -void Problem::doMod(coef_t factor, int e, int j) { -	/* Solve e = factor alpha for x_j and substitute */ -	int k; -	eqn eq; -	coef_t nFactor; - -	int alpha; - -	// if (j > safeVars) alpha = j; -	// else -	if (EQs[e].color) { -		rememberRedConstraint(&EQs[e], redEQ, 0); -		EQs[e].color = EQ_BLACK; -	} -	alpha = addNewUnprotectedWildcard(); -	eqnncpy(&eq, &EQs[e], nVars); -	newVar = alpha; - -	if (DEBUG) { -		fprintf(outputFile, "doing moding: "); -		fprintf(outputFile, "Solve "); -		printTerm(&eq, 1); -		fprintf(outputFile, " = " coef_fmt " %s for %s and substitute\n", -				factor, variable(alpha), variable(j)); -	} -	for (k = nVars; k >= 0; k--) -		eq.coef[k] = int_mod_hat(eq.coef[k], factor); -	nFactor = eq.coef[j]; -	assert(nFactor == 1 || nFactor == -1); -	eq.coef[alpha] = factor / nFactor; -	if (DEBUG) { -		fprintf(outputFile, "adjusted: "); -		fprintf(outputFile, "Solve "); -		printTerm(&eq, 1); -		fprintf(outputFile, " = 0 for %s and substitute\n", variable(j)); -	} - -	eq.coef[j] = 0; -	substitute(&eq, j, nFactor); -	newVar = -1; -	deleteVariable(j); -	for (k = nVars; k >= 0; k--) { -		assert(EQs[e].coef[k] % factor == 0); -		EQs[e].coef[k] = EQs[e].coef[k] / factor; -	} -	if (DEBUG) { -		fprintf(outputFile, "Mod-ing and normalizing produces:\n"); -		printProblem(); -	} -} - -void Problem::substitute(eqn *sub, int i, coef_t c) { -	int e, j; -	coef_t k; -	int recordSubstitution = (i <= safeVars && var[i] >= 0); - -	redType clr; -	if (sub->color) -		clr = redEQ; -	else -		clr = notRed; - -	assert(c == 1 || c == -1); - -	if (DBUG || doTrace) { -		if (sub->color) -			fprintf(outputFile, "RED SUBSTITUTION\n"); -		fprintf(outputFile, "substituting using %s := ", variable(i)); -		printTerm(sub, -c); -		fprintf(outputFile, "\n"); -		printVars(); -	} -#ifndef NDEBUG -	if (i > safeVars && clr) { -		bool unsafeSub = false; -		for (e = nEQs - 1; e >= 0; e--) -			if (!(EQs[e].color || !EQs[e].coef[i])) -				unsafeSub = true; -		for (e = nGEQs - 1; e >= 0; e--) -			if (!(GEQs[e].color || !GEQs[e].coef[i])) -				unsafeSub = true; -		for (e = nSUBs - 1; e >= 0; e--) -			if (SUBs[e].coef[i]) -				unsafeSub = true; -		if (unsafeSub) { -			fprintf(outputFile, "UNSAFE RED SUBSTITUTION\n"); -			fprintf(outputFile, "substituting using %s := ", variable(i)); -			printTerm(sub, -c); -			fprintf(outputFile, "\n"); -			printProblem(); -			assert(0 && "UNSAFE RED SUBSTITUTION"); -		} -	} -#endif - -	for (e = nEQs - 1; e >= 0; e--) { -		eqn *eq; -		eq = &(EQs[e]); -		k = eq->coef[i]; -		if (k != 0) { -			k = check_mul(k, c); // Should be k = k/c, but same effect since abs(c) == 1 -			eq->coef[i] = 0; -			for (j = nVars; j >= 0; j--) { -				eq->coef[j] -= check_mul(sub->coef[j], k); -			} -		} -		if (DEBUG) { -			printEQ(eq); -			fprintf(outputFile, "\n"); -		} -	} -	for (e = nGEQs - 1; e >= 0; e--) { -		int zero; -		eqn *eq; -		eq = &(GEQs[e]); -		k = eq->coef[i]; -		if (k != 0) { -			k = check_mul(k, c); // Should be k = k/c, but same effect since abs(c) == 1 -			eq->touched = true; -			eq->coef[i] = 0; -			zero = 1; -			for (j = nVars; j >= 0; j--) { -				eq->coef[j] -= check_mul(sub->coef[j], k); -				if (j > 0 && eq->coef[j]) -					zero = 0; -			} -			if (zero && clr != notRed && !eq->color) { -				coef_t z = int_div(eq->coef[0], abs(k)); -				if (DBUG || doTrace) { -					fprintf(outputFile, -							"Black inequality matches red substitution\n"); -					if (z < 0) -						fprintf(outputFile, "System is infeasible\n"); -					else if (z > 0) -						fprintf(outputFile, "Black inequality is redundant\n"); -					else { -						fprintf(outputFile, -								"Black constraint partially implies red equality\n"); -						if (k < 0) { -							fprintf(outputFile, "Black constraints tell us "); -							assert(sub->coef[i] == 0); -							sub->coef[i] = c; -							printTerm(sub, 1); -							sub->coef[i] = 0; -							fprintf(outputFile, "<= 0\n"); -						} else { -							fprintf(outputFile, "Black constraints tell us "); -							assert(sub->coef[i] == 0); -							sub->coef[i] = c; -							printTerm(sub, 1); -							sub->coef[i] = 0; -							fprintf(outputFile, " >= 0\n"); -						} -					} -				} -				if (z == 0) { -					if (k < 0) { -						if (clr == redEQ) -							clr = redGEQ; -						else if (clr == redLEQ) -							clr = notRed; -					} else { -						if (clr == redEQ) -							clr = redLEQ; -						else if (clr == redGEQ) -							clr = notRed; -					} -				} - -			} -		} -		if (DEBUG) { -			printGEQ(eq); -			fprintf(outputFile, "\n"); -		} -	} -	if (i <= safeVars && clr) { -		assert(sub->coef[i] == 0); -		sub->coef[i] = c; -		rememberRedConstraint(sub, clr, 0); -		sub->coef[i] = 0; -	} - -	if (recordSubstitution) { -		int s = nSUBs++; -		int kk; -		eqn *eq = &(SUBs[s]); -		for (kk = nVars; kk >= 0; kk--) -			eq->coef[kk] = check_mul(-c, (sub->coef[kk])); -		eq->key = var[i]; -		if (DEBUG) { -			fprintf(outputFile, "Recording substition as: "); -			printSubstitution(s); -			fprintf(outputFile, "\n"); -		} -	} -	if (DEBUG) { -		fprintf(outputFile, "Ready to update subs\n"); -		if (sub->color) -			fprintf(outputFile, "RED SUBSTITUTION\n"); -		fprintf(outputFile, "substituting using %s := ", variable(i)); -		printTerm(sub, -c); -		fprintf(outputFile, "\n"); -		printVars(); -	} - -	for (e = nSUBs - 1; e >= 0; e--) { -		eqn *eq = &(SUBs[e]); -		k = eq->coef[i]; -		if (k != 0) { -			k = check_mul(k, c); // Should be k = k/c, but same effect since abs(c) == 1 -			eq->coef[i] = 0; -			for (j = nVars; j >= 0; j--) { -				eq->coef[j] -= check_mul(sub->coef[j], k); -			} -		} -		if (DEBUG) { -			fprintf(outputFile, "updated sub (" coef_fmt "): ", c); -			printSubstitution(e); -			fprintf(outputFile, "\n"); -		} -	} - -	if (DEBUG) { -		fprintf(outputFile, "---\n\n"); -		printProblem(); -		fprintf(outputFile, "===\n\n"); -	} -} - - -void Problem::doElimination(int e, int i) { -	if (DBUG || doTrace) -		fprintf(outputFile, "eliminating variable %s\n", variable(i)); - -	eqn sub; -	eqnncpy(&sub, &EQs[e], nVars); -	coef_t c = sub.coef[i]; -	sub.coef[i] = 0; - -	if (c == 1 || c == -1) { -		substitute(&sub, i, c); -	} else { -		coef_t a = abs(c); -		if (TRACE) -			fprintf(outputFile, -					"performing non-exact elimination, c = " coef_fmt "\n", c); -		if (DBUG) -			printProblem(); -		assert(inApproximateMode); - -		for (int e2 = nEQs - 1; e2 >= 0; e2--) { -			eqn *eq = &(EQs[e2]); -			coef_t k = eq->coef[i]; -			if (k != 0) { -				coef_t l = lcm(abs(k), a); -				coef_t scale1 = l / abs(k); -				for (int j = nVars; j >= 0; j--) -					eq->coef[j] = check_mul(eq->coef[j], scale1); -				eq->coef[i] = 0; -				coef_t scale2 = l / c; -				if (k < 0) -					scale2 = -scale2; -				for (int j = nVars; j >= 0; j--) -					eq->coef[j] -= check_mul(sub.coef[j], scale2); -				eq->color |= sub.color; -			} -		} -		for (int e2 = nGEQs - 1; e2 >= 0; e2--) { -			eqn *eq = &(GEQs[e2]); -			coef_t k = eq->coef[i]; -			if (k != 0) { -				coef_t l = lcm(abs(k), a); -				coef_t scale1 = l / abs(k); -				for (int j = nVars; j >= 0; j--) -					eq->coef[j] = check_mul(eq->coef[j], scale1); -				eq->coef[i] = 0; -				coef_t scale2 = l / c; -				if (k < 0) -					scale2 = -scale2; -				for (int j = nVars; j >= 0; j--) -					eq->coef[j] -= check_mul(sub.coef[j], scale2); -				eq->color |= sub.color; -				eq->touched = 1; -			} -		} -		for (int e2 = nSUBs - 1; e2 >= 0; e2--) -			if (SUBs[e2].coef[i]) { -				eqn *eq = &(EQs[e2]); -				assert(0); -				// We can't handle this since we can't multiply -				// the coefficient of the left-hand side -				assert(!sub.color); -				for (int j = nVars; j >= 0; j--) -					eq->coef[j] = check_mul(eq->coef[j], a); -				coef_t k = eq->coef[i]; -				eq->coef[i] = 0; -				for (int j = nVars; j >= 0; j--) -					eq->coef[j] -= check_mul(sub.coef[j], k / c); -			} -	} -	deleteVariable(i); -} - -int Problem::solveEQ() { -	check(); - -	// Reorder equations according to complexity. -	{ -		int delay[nEQs]; - -		for (int e = 0; e < nEQs; e++) { -			delay[e] = 0; -			if (EQs[e].color) -				delay[e] += 8; -			int nonunitWildCards = 0; -			int unitWildCards = 0; -			for (int i = nVars; i > safeVars; i--) -				if (EQs[e].coef[i]) { -					if (EQs[e].coef[i] == 1 || EQs[e].coef[i] == -1) -						unitWildCards++; -					else -						nonunitWildCards++; -				} -			int unit = 0; -			int nonUnit = 0; -			for (int i = safeVars; i > 0; i--) -				if (EQs[e].coef[i]) { -					if (EQs[e].coef[i] == 1 || EQs[e].coef[i] == -1) -						unit++; -					else -						nonUnit++; -				} -			if (unitWildCards == 1 && nonunitWildCards == 0) -				delay[e] += 0; -			else if (unitWildCards >= 1 && nonunitWildCards == 0) -				delay[e] += 1; -			else if (inApproximateMode && nonunitWildCards > 0) -				delay[e] += 2; -			else if (unit == 1 && nonUnit == 0 && nonunitWildCards == 0) -				delay[e] += 3; -			else if (unit > 1 && nonUnit == 0 && nonunitWildCards == 0) -				delay[e] += 4; -			else if (unit >= 1 && nonunitWildCards <= 1) -				delay[e] += 5; -			else -				delay[e] += 6; -		} - -		for (int e = 0; e < nEQs; e++) { -			int e2, slowest; -			slowest = e; -			for (e2 = e + 1; e2 < nEQs; e2++) -				if (delay[e2] > delay[slowest]) -					slowest = e2; -			if (slowest != e) { -				int tmp = delay[slowest]; -				delay[slowest] = delay[e]; -				delay[e] = tmp; -				eqn eq; -				eqnncpy(&eq, &EQs[slowest], nVars); -				eqnncpy(&EQs[slowest], &EQs[e], nVars); -				eqnncpy(&EQs[e], &eq, nVars); -			} -		} -	} - -	// Eliminate all equations. -	while (nEQs != 0) { -		int e = nEQs - 1; -		eqn *eq = &(EQs[e]); -		coef_t g, g2; - -		assert(mayBeRed || !eq->color); - -		check(); - -		// get gcd of coefficients of all unprotected variables -		g2 = 0; -		for (int i = nVars; i > safeVars; i--) -			if (eq->coef[i] != 0) { -				g2 = gcd(abs(eq->coef[i]), g2); -				if (g2 == 1) -					break; -			} - -		// get gcd of coefficients of all variables -		g = g2; -		if (g != 1) -			for (int i = safeVars; i >= 1; i--) -				if (eq->coef[i] != 0) { -					g = gcd(abs(eq->coef[i]), g); -					if (g == 1) -						break; -				} - -		// approximate mode bypass integer modular test; in Farkas(), -		// existential variable lambda's are rational numbers. -		if (inApproximateMode && g2 != 0) -			g = gcd(abs(eq->coef[0]), g); - -		// simple test to see if the equation is satisfiable -		if (g == 0) { -			if (eq->coef[0] != 0) { -				return (false); -			} else { -				nEQs--; -				continue; -			} -		} else if (abs(eq->coef[0]) % g != 0) { -			return (false); -		} - -		// set gcd of all coefficients to 1 -		if (g != 1) { -			for (int i = nVars; i >= 0; i--) -				eq->coef[i] /= g; -			g2 = g2 / g; -		} - -		// exact elimination of unit coefficient variable -		if (g2 != 0) { // for constraint with unprotected variable -			int i; -			for (i = nVars; i > safeVars; i--) -				if (abs(eq->coef[i]) == 1) -					break; -			if (i > safeVars) { -				nEQs--; -				doElimination(e, i); -				continue; -			} -		} else { // for constraint without unprotected variable - -			// pick the unit coefficient variable with complex inequalites -			// to eliminate, this will make inequalities tighter. e.g. -			// {[t4,t6,t10]:exists (alpha: 0<=t6<=3 && t10=4alpha+t6 && -			//                             64t4<=t10<=64t4+15)} -			int unit_var; -			int cost = -1; - -			for (int i = safeVars; i > 0; i--) - -				if (abs(eq->coef[i]) == 1) { -					int cur_cost = 0; -					for (int j = 0; j < nGEQs; j++) -						if (GEQs[j].coef[i] != 0) { -							for (int k = safeVars; k > 0; k--) -								if (GEQs[j].coef[k] != 0) { -									if (abs(GEQs[j].coef[k]) != 1){ - -										cur_cost += 3; -  -                                                                          } -									  else -									        cur_cost += 1; -								} -						} -                                      -					if (cur_cost > cost) { -						cost = cur_cost; -						unit_var = i; -                    		      } - -				} - -			if (cost != -1) { -				nEQs--; -				doElimination(e, unit_var); -				continue; -			} - - -		} - -		// check if there is an unprotected variable as wildcard -		if (g2 > 0) { -			int pos = 0; -			coef_t g3; -			for (int k = nVars; k > safeVars; k--) -				if (eq->coef[k] != 0) { -					int e2; -					for (e2 = e - 1; e2 >= 0; e2--) -						if (EQs[e2].coef[k]) -							break; -					if (e2 >= 0) -						continue; -					for (e2 = nGEQs - 1; e2 >= 0; e2--) -						if (GEQs[e2].coef[k]) -							break; -					if (e2 >= 0) -						continue; -					for (e2 = nSUBs - 1; e2 >= 0; e2--) -						if (SUBs[e2].coef[k]) -							break; -					if (e2 >= 0) -						continue; - -					if (pos == 0) { -						g3 = abs(eq->coef[k]); -						pos = k; -					} else { -						if (abs(eq->coef[k]) < g3) { -							g3 = abs(eq->coef[k]); -							pos = k; -						} -					} -				} - -			if (pos != 0) { -				bool change = false; -				for (int k2 = nVars; k2 >= 0; k2--) -					if (k2 != pos && eq->coef[k2] != 0) { -						coef_t t = int_mod_hat(eq->coef[k2], g3); -						if (t != eq->coef[k2]) { -							eq->coef[k2] = t; -							change = true; -						} -					} - -				// strength reduced, try this equation again -				if (change) { -					// nameWildcard(pos); -					continue; -				} -			} -		} - -		// insert new stride constraint -		if (g2 > 1 && !(inApproximateMode && !inStridesAllowedMode)) { -			int newvar = addNewProtectedWildcard(); -			int neweq = newEQ(); -			assert(neweq == e+1); -			// we were working on highest-numbered EQ -			eqnnzero(&EQs[neweq], nVars); -			eqnncpy(&EQs[neweq], eq, safeVars); - -			for (int k = nVars; k >= 0; k--) { -				EQs[neweq].coef[k] = int_mod_hat(EQs[neweq].coef[k], g2); -			} -			if (EQs[e].color) -				rememberRedConstraint(&EQs[neweq], redStride, g2); -			EQs[neweq].coef[newvar] = g2; -			EQs[neweq].color = EQ_BLACK; -			continue; -		} - -		// inexact elimination of unprotected variable -		if (g2 > 0 && inApproximateMode) { -			int pos = 0; -			for (int k = nVars; k > safeVars; k--) -				if (eq->coef[k] != 0) { -					pos = k; -					break; -				} -			assert(pos > safeVars); - -			// special handling for wildcard used in breaking down -			// diophantine equation -			if (abs(eq->coef[pos]) > 1) { -				int e2; -				for (e2 = nSUBs - 1; e2 >= 0; e2--) -					if (SUBs[e2].coef[pos]) -						break; -				if (e2 >= 0) { -					protectWildcard(pos); -					continue; -				} -			} - -			nEQs--; -			doElimination(e, pos); -			continue; -		} - -		// now solve linear diophantine equation using least remainder -		// algorithm -		{ -			coef_t factor = (posInfinity);  // was MAXINT -			int pos = 0; -			for (int k = nVars; k > (g2 > 0 ? safeVars : 0); k--) -				if (eq->coef[k] != 0 && factor > abs(eq->coef[k]) + 1) { -					factor = abs(eq->coef[k]) + 1; -					pos = k; -				} -			assert(pos > (g2>0?safeVars:0)); -			doMod(factor, e, pos); -			continue; -		} -	} - -	assert(nEQs == 0); -	return (OC_SOLVE_UNKNOWN); -} - -} // namespace diff --git a/omega/omega_lib/src/omega_core/oc_exp_kill.cc b/omega/omega_lib/src/omega_core/oc_exp_kill.cc deleted file mode 100644 index bf3ba19..0000000 --- a/omega/omega_lib/src/omega_core/oc_exp_kill.cc +++ /dev/null @@ -1,297 +0,0 @@ -/***************************************************************************** - Copyright (C) 1994-2000 the Omega Project Team - Copyright (C) 2005-2011 Chun Chen - All Rights Reserved. - - Purpose: -   Expensive inequality elimination. - - Notes: - - History: -   03/31/09 Use BoolSet, Chun Chen -*****************************************************************************/ - -#include <omega/omega_core/oc_i.h> -#include <basic/boolset.h> -#include <vector> - -namespace omega { - -int Problem::expensiveKill() { -  int e; -  if (TRACE) fprintf(outputFile,"Performing expensive kill tests: [\n"); -  if (DBUG) printProblem(); -  Problem tmpProblem; -  int oldTrace = trace; -  int constraintsRemoved = 0; - -  trace = 0; -  conservative++; - -  for (e = nGEQs - 1; e >= 0; e--) -    if (!GEQs[e].essential) { -      if (DBUG) { -        fprintf(outputFile, "checking equation %d to see if it is redundant: ", e); -        printGEQ(&(GEQs[e])); -        fprintf(outputFile, "\n"); -      } -      tmpProblem = *this; -      tmpProblem.negateGEQ(e); -      tmpProblem.varsOfInterest = 0; -      tmpProblem.nSUBs = 0; -      tmpProblem.nMemories = 0; -      tmpProblem.safeVars = 0; -      tmpProblem.variablesFreed = 0; -      tmpProblem.isTemporary = true; - -      if (!tmpProblem.solve(false)) { -        if (DBUG) -          fprintf(outputFile, "redundant!\n"); -        constraintsRemoved++; -        deleteGEQ(e); -      } -    } -   -  if (constraintsRemoved) { -    if (TRACE) fprintf(outputFile,"%d Constraints removed!!\n",constraintsRemoved); -  } - -  trace = oldTrace; -  conservative--; -  if (TRACE) fprintf(outputFile,"] expensive kill tests done\n"); -  return 1; -} - -int Problem::expensiveRedKill() { -  int e; -  if (TRACE) fprintf(outputFile,"Performing expensive red kill tests: [\n"); -  Problem tmpProblem; -  int oldTrace = trace; -  int constraintsRemoved = 0; - -  trace = 0; -  conservative++; - -  for (e = nGEQs - 1; e >= 0; e--) -    if (!GEQs[e].essential && GEQs[e].color) { -      if (DEBUG) { -        fprintf(outputFile, "checking equation %d to see if it is redundant: ", e); -        printGEQ(&(GEQs[e])); -        fprintf(outputFile, "\n"); -      } -      tmpProblem = *this; -      tmpProblem.negateGEQ(e); -      tmpProblem.varsOfInterest = 0; -      tmpProblem.nSUBs = 0; -      tmpProblem.nMemories = 0; -      tmpProblem.safeVars = 0; -      tmpProblem.variablesFreed = 0; -      tmpProblem.isTemporary = true; -      tmpProblem.turnRedBlack(); -      if (!tmpProblem.solve(false)) { -        constraintsRemoved++; -        deleteGEQ(e); -      } -    } -   -  if (constraintsRemoved) { -    if (TRACE) fprintf(outputFile,"%d Constraints removed!!\n",constraintsRemoved); -  } - -  trace = oldTrace; -  conservative--; -  if (TRACE) fprintf(outputFile,"] expensive red kill tests done\n"); -  return 1; -} - - -int Problem::expensiveEqualityCheck() { -  int e; -  return 1; -  if (TRACE) fprintf(outputFile,"Performing expensive equality tests: [\n"); -  Problem tmpProblem; -  int oldTrace = trace; -  int equalitiesFound = 0; - -  trace = 0; -  conservative++; - -  for (e = nGEQs - 1; e >= 0; e--) { -    if (DEBUG) { -      fprintf(outputFile, "checking equation %d to see if it is an equality: ", e); -      printGEQ(&(GEQs[e])); -      fprintf(outputFile, "\n"); -    } -    tmpProblem = *this; -    tmpProblem.GEQs[e].coef[0]--; -    tmpProblem.varsOfInterest = 0; -    tmpProblem.nSUBs = 0; -    tmpProblem.nMemories = 0; -    tmpProblem.safeVars = 0; -    tmpProblem.variablesFreed = 0; -    tmpProblem.isTemporary = true; -    if (!tmpProblem.solve(false)) { -      int neweq = newEQ(); -      eqnncpy(&EQs[neweq], &GEQs[e], nVars); -      equalitiesFound++; -      addingEqualityConstraint(neweq); -    } -  } -  if (equalitiesFound) { -    if (TRACE) fprintf(outputFile,"%d Equalities found!!\n",equalitiesFound); -  } - -  trace = oldTrace; -  conservative--; -  if (equalitiesFound) { -    if (!solveEQ()) return 0; -    if (!normalize()) return 0; -  } -  if (TRACE) fprintf(outputFile,"] expensive equality tests done\n"); -  return 1; -} - - -void Problem::quickRedKill(int computeGist) { -  if (DBUG) { -    fprintf(outputFile, "in quickRedKill: [\n"); -    printProblem(); -  } - -  noteEssential(0); -  int moreToDo = chainKill(1,0); - -#ifdef NDEBUG -  if (!moreToDo) { -    if (DBUG) fprintf(outputFile, "] quickRedKill\n"); -    return; -  } -#endif - -  int isDead[nGEQs]; -  int deadCount = 0; -  std::vector<BoolSet<> > P(nGEQs, BoolSet<>(nVars)), Z(nGEQs, BoolSet<>(nVars)), N(nGEQs, BoolSet<>(nVars)); -  BoolSet<> PP, PZ, PN; /* possible Positives, possible zeros & possible negatives */ -  BoolSet<> MZ; /* must zeros */ -   -  int equationsToKill = 0; -  for (int e = nGEQs - 1; e >= 0; e--) { -    isDead[e] = 0; -    if (GEQs[e].color && !GEQs[e].essential) equationsToKill++; -    if (GEQs[e].color && GEQs[e].essential && !computeGist)  -      if (!moreToDo) { -        if (DBUG) fprintf(outputFile, "] quickRedKill\n"); -        return; -      } -    for (int i = nVars; i >= 1; i--) { -      if (GEQs[e].coef[i] > 0) -        P[e].set(i-1); -      else if (GEQs[e].coef[i] < 0) -        N[e].set(i-1); -      else -        Z[e].set(i-1); -    } -  } - -  if (!equationsToKill)  -    if (!moreToDo) { -      if (DBUG) fprintf(outputFile, "] quickRedKill\n"); -      return; -    } -   -  for (int e = nGEQs - 1; e > 0; e--) -    if (!isDead[e]) -      for (int e2 = e - 1; e2 >= 0; e2--) -        if (!isDead[e2]) { -          coef_t a = 0; -          int i, j; -          for (i = nVars; i > 1; i--) { -            for (j = i - 1; j > 0; j--) { -              a = (GEQs[e].coef[i] * GEQs[e2].coef[j] - GEQs[e2].coef[i] * GEQs[e].coef[j]); -              if (a != 0) -                goto foundPair; -            } -          } -          continue; - -        foundPair: -          if (DEBUG) { -            fprintf(outputFile, "found two equations to combine, i = %s, ", variable(i)); -            fprintf(outputFile, "j = %s, alpha = " coef_fmt "\n", variable(j), a); -            printGEQ(&(GEQs[e])); -            fprintf(outputFile, "\n"); -            printGEQ(&(GEQs[e2])); -            fprintf(outputFile, "\n"); -          } - -          MZ = (Z[e] & Z[e2]); -          PZ = MZ |  (P[e] & N[e2]) | (N[e] & P[e2]); -          PP = P[e] | P[e2]; -          PN = N[e] | N[e2]; - -          for (int e3 = nGEQs - 1; e3 >= 0; e3--) -            if (e3 != e && e3 != e2 && GEQs[e3].color && !GEQs[e3].essential) { -              coef_t alpha1, alpha2, alpha3; - -              if (!PZ.imply(Z[e3]) || MZ.imply(~Z[e3])) continue; -              if (!PP.imply(P[e3]) || !PN.imply(N[e3])) continue; - -              if (a > 0) { -                alpha1 = GEQs[e2].coef[j] * GEQs[e3].coef[i] - GEQs[e2].coef[i] * GEQs[e3].coef[j]; -                alpha2 = -(GEQs[e].coef[j] * GEQs[e3].coef[i] - GEQs[e].coef[i] * GEQs[e3].coef[j]); -                alpha3 = a; -              } -              else { -                alpha1 = -(GEQs[e2].coef[j] * GEQs[e3].coef[i] - GEQs[e2].coef[i] * GEQs[e3].coef[j]); -                alpha2 = -(-(GEQs[e].coef[j] * GEQs[e3].coef[i] - GEQs[e].coef[i] * GEQs[e3].coef[j])); -                alpha3 = -a; -              } -     -              if (alpha1 > 0 && alpha2 > 0) { -                if (DEBUG) { -                  fprintf(outputFile, "alpha1 = " coef_fmt ", alpha2 = " coef_fmt "; comparing against: ", alpha1, alpha2); -                  printGEQ(&(GEQs[e3])); -                  fprintf(outputFile, "\n"); -                } -                coef_t c; -                int k; -                for (k = nVars; k >= 0; k--) { -                  c = alpha1 * GEQs[e].coef[k] + alpha2 * GEQs[e2].coef[k]; -                  if (DEBUG) { -                    if (k>0)  -                      fprintf(outputFile, " %s: " coef_fmt ", " coef_fmt "\n", variable(k), c, alpha3 * GEQs[e3].coef[k]); -                    else fprintf(outputFile, " constant: " coef_fmt ", " coef_fmt "\n", c, alpha3 * GEQs[e3].coef[k]); -                  } -                  if (c != alpha3 * GEQs[e3].coef[k]) -                    break; -                } -                if (k < 0 || (k == 0 && c < alpha3 * (GEQs[e3].coef[k]+1))) { -                  if (DEBUG) { -                    deadCount++; -                    fprintf(outputFile, "red equation#%d is dead (%d dead so far, %d remain)\n", e3, deadCount, nGEQs - deadCount); -                    printGEQ(&(GEQs[e])); -                    fprintf(outputFile, "\n"); -                    printGEQ(&(GEQs[e2])); -                    fprintf(outputFile, "\n"); -                    printGEQ(&(GEQs[e3])); -                    fprintf(outputFile, "\n"); -                    assert(moreToDo); -                  } -                  isDead[e3] = 1; -                } -              } -            } -        } -   -  for (int e = nGEQs - 1; e >= 0; e--) -    if (isDead[e]) -      deleteGEQ(e); - -  if (DBUG) { -    fprintf(outputFile,"] quickRedKill\n"); -    printProblem(); -  } -} - -} // namespace diff --git a/omega/omega_lib/src/omega_core/oc_global.cc b/omega/omega_lib/src/omega_core/oc_global.cc deleted file mode 100644 index 17d8a0c..0000000 --- a/omega/omega_lib/src/omega_core/oc_global.cc +++ /dev/null @@ -1,45 +0,0 @@ -#include <omega/omega_core/oc_i.h> - -namespace omega { - -const int Problem::min_alloc = 10; -const int Problem::first_alloc_pad = 5; - -int omega_core_debug = 0; // 3: full debugging info - -int maxEQs  = 100; // original 35, increased by chun -int maxGEQs = 200; // original 70, increased by chun - -int newVar = -1; -int findingImplicitEqualities = 0; -int firstCheckForRedundantEquations = 0; -int doItAgain; -int conservative = 0; -FILE *outputFile = stderr;  /* printProblem writes its output to this file */ -char wildName[200][20]; -int nextWildcard = 0; -int trace = 1; -int depth = 0; -int headerLevel; -int inApproximateMode = 0; -int inStridesAllowedMode = 0; -int addingOuterEqualities = 0; -int outerColor = 0; -int reduceWithSubs = 1; -int pleaseNoEqualitiesInSimplifiedProblems = 0; -Problem *originalProblem = noProblem; -int omegaInitialized = 0; -int mayBeRed = 0; - - -// Hash table is used to hash all inequalties for all problems.  It -// persists across problems for quick problem merging in case.  When -// the table is filled to 1/3 full, it is flushed and the filling -// process starts all over again. -int packing[maxVars]; -int hashVersion = 0; -eqn hashMaster[hashTableSize]; -int fastLookup[maxKeys*2]; -int nextKey; - -} // namespace diff --git a/omega/omega_lib/src/omega_core/oc_print.cc b/omega/omega_lib/src/omega_core/oc_print.cc deleted file mode 100644 index 7934713..0000000 --- a/omega/omega_lib/src/omega_core/oc_print.cc +++ /dev/null @@ -1,686 +0,0 @@ -#include <omega/omega_core/oc_i.h> - -namespace omega { - -int print_in_code_gen_style = 0; - -void Problem::initializeVariables() const { -  Problem *p = (Problem *)this; -  int i; -  assert(!p->variablesInitialized); -  for (i = p->nVars; i >= 0; i--) -    p->forwardingAddress[i] = p->var[i] = i; -  p->variablesInitialized = 1; -} - - -std::string Problem::print_term_to_string(const eqn *e, int c) const { -  std::string s=""; -  int i; -  int first; -  int n = nVars; -  int wentFirst = -1; -  first = 1; -  for (i = 1; i <= n; i++) -    if (c * e->coef[i] > 0) { -      first = 0; -      wentFirst = i; - -      if (c * e->coef[i] == 1) -        s+= variable(i); -      else { -        s +=  to_string(c * e->coef[i]); -        if (print_in_code_gen_style) s += "*"; -        s += variable(i); -      } -      break; -    } -  for (i = 1; i <= n; i++) -    if (i != wentFirst && c * e->coef[i] != 0) { -      if (!first && c * e->coef[i] > 0) -        s += "+"; - -      first = 0; - -      if (c * e->coef[i] == 1) -        s += variable(i); -      else if (c * e->coef[i] == -1) { -        s +=  "-"; s += variable(i); -      } -      else { -        s += to_string(c * e->coef[i]);  -        if (print_in_code_gen_style) s += "*"; -        s += variable(i); -      } -    } -  if (!first && c * e->coef[0] > 0) -    s += "+"; -  if (first || c * e->coef[0] != 0) -    s += to_string(c * e->coef[0]); -  return s; -} - - -void Problem::printTerm(const eqn * e, int c) const { -  std::string s = print_term_to_string(e, c); -  fprintf(outputFile, "%s", s.c_str()); -} - - -void Problem::printSub(int v) const { -  std::string s = print_sub_to_string(v); -  fprintf(outputFile, "%s", s.c_str()); -} - - -std::string Problem::print_sub_to_string(int v) const { -  std::string s; - -  if (v > 0)  -    s = variable(v); -  else  -    s = print_term_to_string(&SUBs[-v-1], 1); -  return s; -} - - -void Problem::clearSubs() { -  nSUBs = 0; -  nMemories = 0; -} - - -void Problem::printEqn(const eqn *e, int test, int extra) const { -  char buf[maxVars * 12 + 180]; // original buf[maxVars * 12 + 80] - -  sprintEqn(buf, e, test, extra); -  fprintf(outputFile, "%s", buf); -} - - -std::string Problem::printEqnToString(const eqn *e, int test, int extra) const { -  char buf[maxVars * 12 + 180]; // original buf[maxVars * 12 + 80] -  sprintEqn(buf, e, test, extra); -  return std::string(buf); -} - - -void Problem::sprintEqn(char *str, const eqn *e, int test, int extra) const { -  int i; -  int first; -  int n = nVars + extra; -  int isLT; - -  isLT = test && e->coef[0] == -1; -  if (isLT) -    isLT = 1; -#if 0 -  if (test) { -    if (DEBUG && e->touched) { -      sprintf(str, "!"); -      while (*str) -        str++; -    } -    else if (DBUG && !e->touched && e->key != 0) { -      sprintf(str, "%d: ", e->key); -      while (*str) -        str++; -    } -  } -#endif -  if (e->color) { -    sprintf(str, "["); -    while (*str) -      str++; -  } -  first = 1; -  for (i = isLT; i <= n; i++) -    if (e->coef[i] < 0) { -      if (!first) { -        sprintf(str, "+"); -        while (*str) -          str++; -      } -      else -        first = 0; -      if (i == 0) { -        sprintf(str, coef_fmt, -e->coef[i]); -        while (*str) -          str++; -      } -      else if (e->coef[i] == -1) { -        sprintf(str, "%s", variable(i)); -        while (*str) -          str++; -      } -      else { -        if (print_in_code_gen_style)  -          sprintf(str, coef_fmt "*%s", -e->coef[i], variable(i)); -        else sprintf(str, coef_fmt "%s", -e->coef[i], variable(i)); -        while (*str) -          str++; -      } -    } -  if (first) { -    if (isLT) { -      sprintf(str, "1"); -      isLT = 0; -    } -    else -      sprintf(str, "0"); -    while (*str) -      str++; -  } -  if (test == 0) { -    if (print_in_code_gen_style) sprintf(str, " == "); -    else sprintf(str, " = "); -    while (*str) -      str++; -  } -  else { -    if (isLT) -      sprintf(str, " < "); -    else -      sprintf(str, " <= "); -    while (*str) -      str++; -  } - -  first = 1; -  for (i = 0; i <= n; i++) -    if (e->coef[i] > 0) { -      if (!first) { -        sprintf(str, "+"); -        while (*str) -          str++; -      } -      else -        first = 0; -      if (i == 0) { -        sprintf(str,  coef_fmt , e->coef[i]); -        while (*str) -          str++; -      } -      else if (e->coef[i] == 1) { -        sprintf(str, "%s", variable(i)); -        while (*str) -          str++; -      } -      else { -        if (print_in_code_gen_style) -          sprintf(str, coef_fmt "*%s", e->coef[i], variable(i)); -        else -          sprintf(str, coef_fmt "%s", e->coef[i], variable(i)); -        while (*str) -          str++; -      } -    } -  if (first) { -    sprintf(str, "0"); -    while (*str) -      str++; -  } -  if (e->color) { -    sprintf(str, "]"); -    while (*str) -      str++; -  } -} - - -void Problem::printSubstitution(int s) const { -  const eqn * eq = &(SUBs[s]); -  assert(eq->key > 0); -  fprintf(outputFile, "%s := ", orgVariable(eq->key)); -  printTerm(eq, 1); -} - - -void Problem::printVars(int /*debug*/) const { -  int i; -  fprintf(outputFile, "variables = "); -  if (safeVars > 0) -    fprintf(outputFile, "("); -  for (i = 1; i <= nVars; i++) { -    fprintf(outputFile, "%s", variable(i)); -    if (i == safeVars) -      fprintf(outputFile, ")"); -    if (i < nVars) -      fprintf(outputFile, ", "); -  } -  fprintf(outputFile, "\n"); -  /* -    fprintf(outputFile, "forward addresses = "); -    if (safeVars > 0) -    fprintf(outputFile, "("); -    for (i = 1; i <= nVars; i++)  -    { -    int v = forwardingAddress[i]; -    if (v > 0) fprintf(outputFile, "%s", variable(i)); -    else fprintf(outputFile, "*"); -    if (i == safeVars) -    fprintf(outputFile, ")"); -    if (i < nVars) -    fprintf(outputFile, ", "); -    }; -    fprintf(outputFile, "\n"); -  */ -} - - -void printHeader() { -  int i; -  for(i=0; i<headerLevel; i++) { -    fprintf(outputFile, ". "); -  } -} - - -void Problem::printProblem(int debug) const { -  int e; - -  if (!variablesInitialized) -    initializeVariables(); -  if (debug) { -    printHeader(); -    fprintf(outputFile, "#vars = %d, #EQ's = %d, #GEQ's = %d, # SUB's = %d, ofInterest = %d\n", -            nVars,nEQs,nGEQs,nSUBs,varsOfInterest); -    printHeader(); -    printVars(debug); -  } -  for (e = 0; e < nEQs; e++) { -    printHeader(); -    printEQ(&EQs[e]); -    fprintf(outputFile, "\n"); -  } -  for (e = 0; e < nGEQs; e++) { -    printHeader(); -    printGEQ(&GEQs[e]); -    fprintf(outputFile, "\n"); -  } -  for (e = 0; e < nSUBs; e++) { -    printHeader(); -    printSubstitution(e); -    fprintf(outputFile, "\n"); -  } - -  for (e = 0; e < nMemories; e++) { -    int i; -    printHeader(); -    switch(redMemory[e].kind) { -    case notRed: -      fprintf(outputFile,"notRed: "); -      break; -    case redGEQ: -      fprintf(outputFile,"Red: 0 <= "); -      break; -    case redLEQ: -      fprintf(outputFile,"Red ??: 0 >= "); -      break; -    case redEQ: -      fprintf(outputFile,"Red: 0 == "); -      break; -    case redStride: -      fprintf(outputFile,"Red stride " coef_fmt ": ", redMemory[e].stride); -      break; -    } -    fprintf(outputFile," " coef_fmt, redMemory[e].constantTerm); -    for(i=0;i< redMemory[e].length; i++) -      if(redMemory[e].coef[i] >= 0) -        fprintf(outputFile,"+" coef_fmt "%s", redMemory[e].coef[i], orgVariable(redMemory[e].var[i])); -      else -        fprintf(outputFile,"-" coef_fmt "%s", -redMemory[e].coef[i], orgVariable(redMemory[e].var[i])); -    fprintf(outputFile, "\n"); -  } -  fflush(outputFile); - -  CHECK_FOR_DUPLICATE_VARIABLE_NAMES; -} - - -void Problem::printRedEquations() const { -  int e; - -  if (!variablesInitialized) -    initializeVariables(); -  printVars(1); -  for (e = 0; e < nEQs; e++) { -    if (EQs[e].color == EQ_RED) { -      printEQ(&EQs[e]); -      fprintf(outputFile, "\n"); -    } -  } -  for (e = 0; e < nGEQs; e++) { -    if (GEQs[e].color == EQ_RED) { -      printGEQ(&GEQs[e]); -      fprintf(outputFile, "\n"); -    } -  } -  for (e = 0; e < nSUBs; e++) { -    if (SUBs[e].color) { -      printSubstitution(e); -      fprintf(outputFile, "\n"); -    } -  } -  fflush(outputFile); -} - - -int Problem::prettyPrintProblem() const { -  std::string s = prettyPrintProblemToString(); -  fprintf(outputFile, "%s", s.c_str()); -  fflush(outputFile); -  return 0; -} - - -std::string Problem::prettyPrintProblemToString() const { -  std::string s=""; -  int e; -  int v; -  int live[maxmaxGEQs]; -  int v1, v2, v3; -  int t, change; -  int stuffPrinted = 0; -  const char *connector = " && "; - -  typedef enum { -    none, le, lt -  } partialOrderType; - -  partialOrderType po[maxVars][maxVars]; -  int poE[maxVars][maxVars]; -  int lastLinks[maxVars]; -  int firstLinks[maxVars]; -  int chainLength[maxVars]; -  int chain[maxVars]; -  int varCount[maxVars]; -  int i, m, multiprint; - - -  if (!variablesInitialized) -    initializeVariables(); - -  if (nVars > 0) { -    for (e = 0; e < nEQs; e++) { -      if (stuffPrinted) -        s += connector; -      stuffPrinted = 1; -      s += print_EQ_to_string(&EQs[e]); -    } - -    for (e = 0; e < nGEQs; e++) { -      live[e] = true; -      varCount[e] = 0; -      for (v = 1; v <= nVars; v++) -        if (GEQs[e].coef[v]) varCount[e]++; -    } - -    if (!print_in_code_gen_style) -      while (1) { -        for (v = 1; v <= nVars; v++) { -          lastLinks[v] = firstLinks[v] = 0; -          chainLength[v] = 0; -          for (v2 = 1; v2 <= nVars; v2++) -            po[v][v2] = none; -        } - -        for (e = 0; e < nGEQs; e++) -          if (live[e] && varCount[e] <= 2) { -            for (v = 1; v <= nVars; v++) { -              if (GEQs[e].coef[v] == 1) -                firstLinks[v]++; -              else if (GEQs[e].coef[v] == -1) -                lastLinks[v]++; -            } - -            v1 = nVars; -            while (v1 > 0 && GEQs[e].coef[v1] == 0) -              v1--; -            v2 = v1 - 1; -            while (v2 > 0 && GEQs[e].coef[v2] == 0) -              v2--; -            v3 = v2 - 1; -            while (v3 > 0 && GEQs[e].coef[v3] == 0) -              v3--; - -            if (GEQs[e].coef[0] > 0 || GEQs[e].coef[0] < -1 -                || v2 <= 0 || v3 > 0 -                || GEQs[e].coef[v1] * GEQs[e].coef[v2] != -1) { -              /* Not a partial order relation */ - -            } -            else { -              if (GEQs[e].coef[v1] == 1) { -                v3 = v2; -                v2 = v1; -                v1 = v3; -              } -              /* relation is v1 <= v2 or v1 < v2 */ -              po[v1][v2] = ((GEQs[e].coef[0] == 0) ? le : lt); -              poE[v1][v2] = e; -            } -          } -        for (v = 1; v <= nVars; v++) -          chainLength[v] = lastLinks[v]; - -        /* -         * printf("\n\nPartial order:\n"); printf("        "); for (v1 = 1; v1 <= nVars; v1++) -         * printf("%7s",variable(v1)); printf("\n"); for (v1 = 1; v1 <= nVars; v1++) { printf("%6s: -         * ",variable(v1)); for (v2 = 1; v2 <= nVars; v2++) switch (po[v1][v2]) { case none: printf("       "); -         * break; case le:   printf("    <= "); break; case lt:   printf("    <  "); break; } printf("\n"); } -         */ - - -        /* Just in case nVars <= 0 */ -        change = false; -        for (t = 0; t < nVars; t++) { -          change = false; -          for (v1 = 1; v1 <= nVars; v1++) -            for (v2 = 1; v2 <= nVars; v2++) -              if (po[v1][v2] != none && -                  chainLength[v1] <= chainLength[v2]) { -                chainLength[v1] = chainLength[v2] + 1; -                change = true; -              } -        } - -        if (change) { -          /* caught in cycle */ -     -#if 0  -          printf("\n\nPartial order:\n"); printf("        ");  -          for (v1 = 1; v1 <= nVars; v1++) printf("%7s",variable(v1)); printf("\n");  -          for (v1 = 1; v1 <= nVars; v1++) {  -            printf("%6s: ",variable(v1));  -            for (v2 = 1; v2 <= nVars; v2++) switch (po[v1][v2]) {  -              case none: printf("       "); break;  -              case le:   printf("    <= "); break;  -              case lt:   printf("    <  "); break;  -              }  -            printf("\n");  -          } - -          printProblem(1); -#endif -          break; -        } - -        for (v1 = 1; v1 <= nVars; v1++) -          if (chainLength[v1] == 0) -            firstLinks[v1] = 0; - -        v = 1; -        for (v1 = 2; v1 <= nVars; v1++) -          if (chainLength[v1] + firstLinks[v1] > chainLength[v] + firstLinks[v]) -            v = v1; - -        if (chainLength[v] + firstLinks[v] == 0) -          break; - -        if (stuffPrinted) -          s += connector; -        stuffPrinted = 1; -        /* chain starts at v */ -        /* print firstLinks */ -        { -          coef_t tmp; -          int first; -          first = 1; -          for (e = 0; e < nGEQs; e++) -            if (live[e] && GEQs[e].coef[v] == 1 && varCount[e] <= 2) { -              if (!first) -                s += ", "; -              tmp = GEQs[e].coef[v]; -              ((Problem *)this)-> -                GEQs[e].coef[v] = 0; -              s += print_term_to_string(&GEQs[e], -1); -              ((Problem *)this)-> -                GEQs[e].coef[v] = tmp; -              live[e] = false; -              first = 0; -            } -          if (!first) -            s += " <= "; -        } - - -        /* find chain */ -        chain[0] = v; -        m = 1; -        while (1) { -          /* print chain */ -          for (v2 = 1; v2 <= nVars; v2++) -            if (po[v][v2] && chainLength[v] == 1 + chainLength[v2]) -              break; -          if (v2 > nVars) -            break; -          chain[m++] = v2; -          v = v2; -        } - -        s += variable(chain[0]); - -        multiprint = 0; -        for (i = 1; i < m; i++) { -          v = chain[i - 1]; -          v2 = chain[i]; -          if (po[v][v2] == le) -            s += " <= "; -          else -            s += " < "; -          s +=  variable(v2); -          live[poE[v][v2]] = false; -          if (!multiprint && i < m - 1) -            for (v3 = 1; v3 <= nVars; v3++) { -              if (v == v3 || v2 == v3) -                continue; -              if (po[v][v2] != po[v][v3]) -                continue; -              if (po[v2][chain[i + 1]] != po[v3][chain[i + 1]]) -                continue; -              s += ","; s += variable(v3); -              live[poE[v][v3]] = false; -              live[poE[v3][chain[i + 1]]] = false; -              multiprint = 1; -            } -          else -            multiprint = 0; -        } - -        v = chain[m - 1]; -        /* print lastLinks */ -        { -          coef_t tmp; -          int  first; -          first = 1; -          for (e = 0; e < nGEQs; e++) -            if (live[e] && GEQs[e].coef[v] == -1 && varCount[e] <= 2) { -              if (!first) -                s += ", "; -              else -                s += " <= "; -              tmp = GEQs[e].coef[v]; -              ((Problem *)this)-> -                GEQs[e].coef[v] = 0; -              s += print_term_to_string(&GEQs[e], 1); -              ((Problem *)this)-> -                GEQs[e].coef[v] = tmp; -              live[e] = false; -              first = 0; -            } -        } -      } - - -    for (e = 0; e < nGEQs; e++) -      if (live[e]) { -        if (stuffPrinted) -          s += connector; -        stuffPrinted = 1; -        s += print_GEQ_to_string(&GEQs[e]); -      } - -    for (e = 0; e < nSUBs; e++) { -      const eqn * eq = &SUBs[e]; -      if (stuffPrinted) -        s += connector; -      stuffPrinted = 1; -      if (eq->key > 0) { -        s += orgVariable(eq->key); s += " := "; -      } -      else { -        s += "#"; s += to_string(eq->key); s += " := "; -      } -      s += print_term_to_string(eq, 1); -    } -  } -  return s; -} - - -int Problem::prettyPrintRedEquations() const { -  int e, stuffPrinted = 0; -  const char *connector = " && "; - -  if (!variablesInitialized) -    initializeVariables(); - -  for (e = 0; e < nEQs; e++) { -    if (EQs[e].color == EQ_RED) { -      if (stuffPrinted) -        fprintf(outputFile, "%s", connector); -      stuffPrinted = 1; -      ((Problem *)this)-> -        EQs[e].color = EQ_BLACK; -      printEQ(&EQs[e]); -      ((Problem *)this)-> -        EQs[e].color = EQ_RED; -    } -  } -  for (e = 0; e < nGEQs; e++) { -    if (GEQs[e].color == EQ_RED) { -      if (stuffPrinted) -        fprintf(outputFile, "%s", connector); -      stuffPrinted = 1; -      ((Problem *)this)-> -        GEQs[e].color = EQ_BLACK; -      printGEQ(&GEQs[e]); -      ((Problem *)this)-> -        GEQs[e].color = EQ_RED; -    } -  } -  for (e = 0; e < nSUBs; e++) { -    if (SUBs[e].color) { -      if (stuffPrinted) -        fprintf(outputFile, "%s", connector); -      stuffPrinted = 1; -      printSubstitution(e); -    } -  } -  fflush(outputFile); - -  return 0; -} - -} diff --git a/omega/omega_lib/src/omega_core/oc_problems.cc b/omega/omega_lib/src/omega_core/oc_problems.cc deleted file mode 100644 index 8b6e04c..0000000 --- a/omega/omega_lib/src/omega_core/oc_problems.cc +++ /dev/null @@ -1,198 +0,0 @@ -#include <omega/omega_core/oc_i.h>  -#include <basic/omega_error.h> - -namespace omega { - -Problem::~Problem() { -  delete[] EQs; -  delete[] GEQs; -} - - -void check_number_EQs(int n) { -  if (n < 0) { -    fprintf(stderr,"ERROR: nEQs < 0??\n"); -    exit(1); -  } - -  if (n > maxmaxEQs) { -    // clear global variables -    inApproximateMode = 0; -    outerColor = 0; - -    throw presburger_error("\nERROR:\n" -                           "An attempt was made to set the number of available equality constraints to " + to_string(n) + ".\n" -                           "The maximum number of equality constraints in a conjunction is " + to_string(maxmaxEQs) + ".\n" -                           "This limit can be changed by redefining maxmaxEQs in oc.h and recompiling.\n\n"); - -    // fprintf(stderr, "\nERROR:\n"); -    // fprintf(stderr, "An attempt was made to set the number of available equality constraints to %d.\n", n); -    // fprintf(stderr, "The maximum number of equality constraints in a conjunction is %d.\n", maxmaxEQs); -    // fprintf(stderr, "This limit can be changed by redefining maxmaxEQs in oc.h and recompiling.\n\n"); -    // exit(2); -  } -} - -void check_number_GEQs(int n) { -  if (n < 0) { -    fprintf(stderr,"ERROR: nGEQs < 0??\n"); -    exit(1); -  } - -  if (n > maxmaxGEQs) { -    // clear global variables -    inApproximateMode = 0; -    outerColor = 0; -     -    throw presburger_error("\nERROR:\n" -                           "An attempt was made to set the number of available inequality constraints to " + to_string(n) +".\n" -                           "The maximum number of inequality constraints in a conjunction is " + to_string(maxmaxGEQs) +".\n" -                           "This limit can be changed by redefining maxmaxGEQs in oc.h and recompiling.\n\n"); - -    // fprintf(stderr, "\nERROR:\n"); -    // fprintf(stderr, "An attempt was made to set the number of available inequality constraints to %d.\n", n); -    // fprintf(stderr, "The maximum number of inequality constraints in a conjunction is %d.\n", maxmaxGEQs); -    // fprintf(stderr, "This limit can be changed by redefining maxmaxGEQs in oc.h and recompiling.\n\n"); -    // exit(2); -  } -} - - -void check_number_EQs_GEQs(int e, int g) { -  check_number_EQs(e); -  check_number_GEQs(g); -} - - -Problem::Problem(int in_eqs, int in_geqs) { -  check_number_EQs_GEQs(in_eqs, in_geqs); -  allocEQs = padEQs(in_eqs); -  allocGEQs = padGEQs(in_geqs); -  assert(allocEQs > 0 && allocGEQs > 0); -  EQs = new eqn[allocEQs]; -  GEQs = new eqn[allocGEQs]; -  nVars = 0; -  hashVersion = omega::hashVersion; -  variablesInitialized = 0; -  variablesFreed = 0; -  varsOfInterest = 0; -  safeVars = 0; -  nEQs = 0; -  nGEQs = 0; -  nSUBs = 0; -  nMemories = 0; -  isTemporary = false; -} - -Problem::Problem(const Problem & p2) { -  allocEQs = padEQs(p2.nEQs); // Don't over-allocate; p2 might have too many! -  allocGEQs = padGEQs(p2.nGEQs); -  assert(allocEQs > 0 && allocGEQs > 0); -  EQs = new eqn[allocEQs]; -  GEQs = new eqn[allocGEQs]; -  int e, i; -  nVars = p2.nVars; -  hashVersion = p2.hashVersion; -  variablesInitialized = p2.variablesInitialized; -  variablesFreed = p2.variablesFreed; -  varsOfInterest = p2.varsOfInterest; -  safeVars = p2.safeVars; -  nEQs = p2.nEQs; -  isTemporary = p2.isTemporary; -  //nSUBs = 0; -  for (e = p2.nEQs - 1; e >= 0; e--) -    eqnncpy(&(EQs[e]), &(p2.EQs[e]), p2.nVars); -  nGEQs = p2.nGEQs; -  for (e = p2.nGEQs - 1; e >= 0; e--) -    eqnncpy(&(GEQs[e]), &(p2.GEQs[e]), p2.nVars); -  for (i = 0; i <= p2.nVars; i++) -    var[i] = p2.var[i]; -  for (i = 0; i <= maxVars; i++) -    forwardingAddress[i] = p2.forwardingAddress[i]; -  //nMemories = 0; -  get_var_name = p2.get_var_name; -  getVarNameArgs = p2.getVarNameArgs; -} - -Problem & Problem::operator=(const Problem & p2) { -  if (this != &p2) { -    if(allocEQs < p2.nEQs) { -      delete[] EQs; -      allocEQs = padEQs(p2.nEQs); -      EQs = new eqn[allocEQs]; -    } -    if(allocGEQs < p2.nGEQs) { -      delete[] GEQs; -      allocGEQs = padGEQs(p2.nGEQs); -      GEQs = new eqn[allocGEQs]; -    } -    int e, i; -    nVars = p2.nVars; -    hashVersion = p2.hashVersion; -    variablesInitialized = p2.variablesInitialized; -    variablesFreed = p2.variablesFreed; -    varsOfInterest = p2.varsOfInterest; -    safeVars = p2.safeVars; -    nEQs = p2.nEQs; -    isTemporary = p2.isTemporary; -    //nSUBs = 0; -    for (e = p2.nEQs - 1; e >= 0; e--) -      eqnncpy(&(EQs[e]), &(p2.EQs[e]), p2.nVars); -    nGEQs = p2.nGEQs; -    for (e = p2.nGEQs - 1; e >= 0; e--) -      eqnncpy(&(GEQs[e]), &(p2.GEQs[e]), p2.nVars); -    for (i = 0; i <= p2.nVars; i++) -      var[i] = p2.var[i]; -    for (i = 0; i <= maxVars; i++) -      forwardingAddress[i] = p2.forwardingAddress[i]; -    //nMemories = 0; -    get_var_name = p2.get_var_name; -    getVarNameArgs = p2.getVarNameArgs; -  } -  return *this; -} - - -void Problem::zeroVariable(int i) { -  int e; -  for (e = nGEQs - 1; e >= 0; e--) GEQs[e].coef[i] = 0; -  for (e = nEQs - 1; e >= 0; e--) EQs[e].coef[i] = 0; -  for (e = nSUBs - 1; e >= 0; e--) SUBs[e].coef[i] = 0; -} -  -/* Functions for allocating EQ's and GEQ's */ - -int Problem::newGEQ() { -  if (++nGEQs > allocGEQs) { -    check_number_GEQs(nGEQs); -    allocGEQs = padGEQs(allocGEQs, nGEQs); -    assert(allocGEQs >= nGEQs); -    eqn *new_geqs = new eqn[allocGEQs]; -    for (int e = nGEQs - 2; e >= 0; e--) -      eqnncpy(&(new_geqs[e]), &(GEQs[e]), nVars); -    delete[] GEQs;  -    GEQs = new_geqs; -  } -//    problem->GEQs[nGEQs-1].color = black; -//    eqnnzero(&problem->GEQs[nGEQs-1],problem->nVars); -  return nGEQs-1; -} - -int Problem::newEQ() { -  if (++nEQs > allocEQs) { -    check_number_EQs(nEQs); -    allocEQs = padEQs(allocEQs, nEQs); -    assert(allocEQs >= nEQs); -    eqn *new_eqs = new eqn[allocEQs]; -    for (int e = nEQs - 2; e >= 0; e--) -      eqnncpy(&(new_eqs[e]), &(EQs[e]), nVars); -    delete[] EQs;  -    EQs = new_eqs; -  } -// Could do this here, but some calls to newEQ do a copy instead of a zero; -//    problem->EQs[nEQs-1].color = black; -//    eqnnzero(&problem->EQs[nEQs-1],problem->nVars); -  return nEQs-1; -} - -} // namespace diff --git a/omega/omega_lib/src/omega_core/oc_query.cc b/omega/omega_lib/src/omega_core/oc_query.cc deleted file mode 100644 index 528b297..0000000 --- a/omega/omega_lib/src/omega_core/oc_query.cc +++ /dev/null @@ -1,478 +0,0 @@ -#include <omega/omega_core/oc_i.h> - -namespace omega { - -void Problem::unprotectVariable( int v) { -  int e, j, i; -  coef_t t; -  i = forwardingAddress[v]; -  if (i < 0) { -    i = -1 - i; -    nSUBs--; -    if (i < nSUBs) { -      eqnncpy(&SUBs[i], &SUBs[nSUBs], nVars); -      forwardingAddress[SUBs[i].key] = -i - 1; -    } -  } -  else { -    int bringToLife[maxVars]; -    int comingBack = 0; -    int e2; -    for (e = nSUBs - 1; e >= 0; e--) -      if ((bringToLife[e] = (SUBs[e].coef[i] != 0))) -        comingBack++; - -    for (e2 = nSUBs - 1; e2 >= 0; e2--) -      if (bringToLife[e2]) { - -        nVars++; -        safeVars++; -        if (safeVars < nVars) { -          for (e = nGEQs - 1; e >= 0; e--) { -            GEQs[e].coef[nVars] = GEQs[e].coef[safeVars]; -            GEQs[e].coef[safeVars] = 0; -          } -          for (e = nEQs - 1; e >= 0; e--) { -            EQs[e].coef[nVars] = EQs[e].coef[safeVars]; -            EQs[e].coef[safeVars] = 0; -          } -          for (e = nSUBs - 1; e >= 0; e--) { -            SUBs[e].coef[nVars] = SUBs[e].coef[safeVars]; -            SUBs[e].coef[safeVars] = 0; -          } -          var[nVars] = var[safeVars]; -          forwardingAddress[var[nVars]] = nVars; -        } -        else { -          for (e = nGEQs - 1; e >= 0; e--) { -            GEQs[e].coef[safeVars] = 0; -          } -          for (e = nEQs - 1; e >= 0; e--) { -            EQs[e].coef[safeVars] = 0; -          } -          for (e = nSUBs - 1; e >= 0; e--) { -            SUBs[e].coef[safeVars] = 0; -          } -        } - -        var[safeVars] = SUBs[e2].key; -        forwardingAddress[SUBs[e2].key] = safeVars; - -        int neweq = newEQ(); -        eqnncpy(&(EQs[neweq]), &(SUBs[e2]), nVars); -        EQs[neweq].coef[safeVars] = -1; -        if (e2 < nSUBs - 1) -          eqnncpy(&(SUBs[e2]), &(SUBs[nSUBs - 1]), nVars); -        nSUBs--; -      } - -    if (i < safeVars) { -      j = safeVars; -      for (e = nSUBs - 1; e >= 0; e--) { -        t = SUBs[e].coef[j]; -        SUBs[e].coef[j] = SUBs[e].coef[i]; -        SUBs[e].coef[i] = t; -      } -      for (e = nGEQs - 1; e >= 0; e--) -        if (GEQs[e].coef[j] != GEQs[e].coef[i]) { -          GEQs[e].touched = true; -          t = GEQs[e].coef[j]; -          GEQs[e].coef[j] = GEQs[e].coef[i]; -          GEQs[e].coef[i] = t; -        } -      for (e = nEQs - 1; e >= 0; e--) { -        t = EQs[e].coef[j]; -        EQs[e].coef[j] = EQs[e].coef[i]; -        EQs[e].coef[i] = t; -      } -      { -        short t; -        t = var[j]; -        var[j] = var[i]; -        var[i] = t; -      } -      forwardingAddress[var[i]] = i; -      forwardingAddress[var[j]] = j; -    } -    safeVars--; -  } -  chainUnprotect(); -} - -void Problem::constrainVariableSign( int color, int i, int sign) { -  int nV = nVars; -  int e, k, j; - -  k = forwardingAddress[i]; -  if (k < 0) { -    k = -1 - k; - -    if (sign != 0) { -      e = newGEQ(); -      eqnncpy(&GEQs[e], &SUBs[k], nVars); -      for (j = 0; j <= nV; j++) -        GEQs[e].coef[j] *= sign; -      GEQs[e].coef[0]--; -      GEQs[e].touched = 1; -      GEQs[e].color = color; -    } -    else { -      e = newEQ(); -      eqnncpy(&EQs[e], &SUBs[k], nVars); -      EQs[e].color = color; -    } -  } -  else if (sign != 0) { -    e = newGEQ(); -    eqnnzero(&GEQs[e], nVars); -    GEQs[e].coef[k] = sign; -    GEQs[e].coef[0] = -1; -    GEQs[e].touched = 1; -    GEQs[e].color = color; -  } -  else { -    e = newEQ(); -    eqnnzero(&EQs[e], nVars); -    EQs[e].coef[k] = 1; -    EQs[e].color = color; -  } -  /* -    unprotectVariable(i); -    return (simplifyProblem(0,1,0)); -  */ -} - -void Problem::constrainVariableValue( int color, int i, int value) { -  int e, k; - -  k = forwardingAddress[i]; -  if (k < 0) { -    k = -1 - k; - -    e = newEQ(); -    eqnncpy(&EQs[e], &SUBs[k], nVars); -    EQs[e].coef[0] -= value; - -  } -  else { -    e = newEQ(); -    eqnnzero(&EQs[e], nVars); -    EQs[e].coef[k] = 1; -    EQs[e].coef[0] = -value; -  } -  EQs[e].color = color; -} - -// Analyze v1-v2 -void Problem:: query_difference(int v1, int v2, coef_t &lowerBound, coef_t &upperBound, bool &guaranteed) { -  int nV = nVars; -  int e,i,e2; - -  coef_t lb1,ub1;  -  coef_t lb2,ub2;  -  assert(nSUBs == 0);  -  lowerBound = negInfinity; -  lb1 = lb2  = negInfinity; -  upperBound = posInfinity; -  ub1 = ub2 = posInfinity; -  guaranteed = true; -  for (e = nEQs - 1; e >= 0; e--) { -    if (EQs[e].coef[v1] == 0 && EQs[e].coef[v2] == 0) -      continue; -    for(i=nV;i>0;i--)   -      if (EQs[e].coef[i] && i!=v1 && i != v2) { -        break; -      } -    if (i != 0) { -      if (i > safeVars) { -        // check to see if this variable appears anywhere else -        for(e2 = nEQs-1; e2>=0;e2--) if (e != e2 && EQs[e2].coef[i]) break; -        if (e2 < 0) -          for(e2 = nGEQs-1; e2>=0;e2--) if (e != e2 && GEQs[e2].coef[i]) break; -        if (e2 < 0) -          for(e2 = nSUBs-1; e2>=0;e2--) if (e != e2 && SUBs[e2].coef[i]) break; -        if (e2 >= 0) guaranteed = false; -      } -      else guaranteed = false; -      continue; -    } -    if (EQs[e].coef[v1]*EQs[e].coef[v2] == -1) { -      // found exact difference -      coef_t d = - EQs[e].coef[v1] * EQs[e].coef[0]; -      set_max(lowerBound, d); -      set_min(upperBound, d); -      guaranteed =true; -      return; -    } -    else if (EQs[e].coef[v1] == 0)  -      lb2 = ub2 = -EQs[e].coef[0]/ EQs[e].coef[v2]; -    else if (EQs[e].coef[v2] == 0)  -      lb1 = ub1 = -EQs[e].coef[0]/ EQs[e].coef[v1]; -    else guaranteed = false; -  } - -  bool isDead[maxmaxGEQs]; - -  for (e = nGEQs - 1; e >= 0; e--) isDead[e] = false; -  int tryAgain = 1; -  while (tryAgain) { -    tryAgain = 0; -    for (i = nVars; i > 0;i--) -      if (i!= v1 && i != v2) { -        for (e = nGEQs - 1; e >= 0; e--)  -          if (!isDead[e] && GEQs[e].coef[i]) -            break; -        if (e < 0) -          e2 = e; -        else if (GEQs[e].coef[i] > 0) { -          for (e2 = e - 1; e2 >= 0; e2--) -            if (!isDead[e2] && GEQs[e2].coef[i] < 0) -              break; -        } -        else { -          for (e2 = e - 1; e2 >= 0; e2--) -            if (!isDead[e2] && GEQs[e2].coef[i] > 0) -              break; -        } -        if (e2 < 0) { -          int e3; -          for (e3 = nSUBs - 1; e3 >= 0; e3--) -            if (SUBs[e3].coef[i]) -              break; -          if (e3 >= 0) -            continue; -          for (e3 = nEQs - 1; e3 >= 0; e3--) -            if (EQs[e3].coef[i]) -              break; -          if (e3 >= 0) -            continue; -          if (e >= 0) { -            isDead[e] = true; -            for (e--; e >= 0; e--) -              if (GEQs[e].coef[i]) isDead[e] = true; -          } -        } -      } -  } -  -  for (e = nGEQs - 1; e >= 0; e--) -    if (!isDead[e]) { -      if (GEQs[e].coef[v1] == 0 && GEQs[e].coef[v2] == 0) -        continue; -      for(i=nV;i>0;i--) -        if (GEQs[e].coef[i] && i!=v1 && i != v2) -          break; -      if (i != 0) { -        guaranteed = false; -        continue; -      } -      if (GEQs[e].coef[v1]*GEQs[e].coef[v2] == -1) { -        // found relative difference -        if (GEQs[e].coef[v1] == 1) {  -          // v1 - v2 + c >= 0 -          set_max(lowerBound, - GEQs[e].coef[0]); -        } -        else { -          // v2 - v1 + c >= 0 -          // c >= v1-v2 -          set_min(upperBound, GEQs[e].coef[0]); -        } -      } -      else if (GEQs[e].coef[v1] == 0 && GEQs[e].coef[v2] > 0)  -        lb2 = -GEQs[e].coef[0]/ GEQs[e].coef[v2]; -      else if (GEQs[e].coef[v1] == 0 && GEQs[e].coef[v2] < 0)  -        ub2 = -GEQs[e].coef[0]/ GEQs[e].coef[v2]; -      else if (GEQs[e].coef[v2] == 0 && GEQs[e].coef[v1] > 0)  -        lb1 = -GEQs[e].coef[0]/ GEQs[e].coef[v1]; -      else if (GEQs[e].coef[v2] == 0 && GEQs[e].coef[v1] < 0)  -        ub1 = -GEQs[e].coef[0]/ GEQs[e].coef[v1]; -      else guaranteed = false; -    } - -  //   ub1-lb2 >= v1-v2 >= lb1-ub2 -     -  if (negInfinity < lb2 && ub1 < posInfinity) set_min(upperBound, ub1-lb2); -  if (negInfinity < lb1 && ub2 < posInfinity) set_max(lowerBound, lb1-ub2); -  if (lowerBound >= upperBound) guaranteed = 1; -} -  - -int Problem::queryVariable(int i, coef_t *lowerBound, coef_t *upperBound) { -  int nV = nVars; -  int e, j; -  int isSimple; -  int coupled = false; -  for(j=1;j<=safeVars;j++) -    if (var[j] > 0)  -      assert(forwardingAddress[var[j]] == j); - -  assert(i > 0); -  i = forwardingAddress[i]; -  assert(i != 0); - -  (*lowerBound) = negInfinity; -  (*upperBound) = posInfinity; - -  if (i < 0) { -    int easy = true; -    i = -i - 1; -    for (j = 1; j <= nV; j++) -      if (SUBs[i].coef[j] != 0) -        easy = false; -    if (easy) { -      *upperBound = *lowerBound = SUBs[i].coef[0]; -      return (false); -    } -    return (true); -  } - -  for (e = nSUBs - 1; e >= 0; e--) -    if (SUBs[e].coef[i] != 0) -      coupled = true; - -  for (e = nEQs - 1; e >= 0; e--) -    if (EQs[e].coef[i] != 0) { -      isSimple = true; -      for (j = 1; j <= nV; j++) -        if (i != j && EQs[e].coef[j] != 0) { -          isSimple = false; -          coupled = true; -          break; -        } -      if (!isSimple) -        continue; -      else { -        *lowerBound = *upperBound = -EQs[e].coef[i] * EQs[e].coef[0]; -        return (false); -      } -    } -  for (e = nGEQs - 1; e >= 0; e--) -    if (GEQs[e].coef[i] != 0) { -      if (GEQs[e].key == i) { -        set_max(*lowerBound, -GEQs[e].coef[0]); -      } -      else if (GEQs[e].key == -i) { -        set_min(*upperBound, GEQs[e].coef[0]); -      } -      else -        coupled = true; -    } -  return (coupled); -} - -int Problem::query_variable_bounds(int i, coef_t *l, coef_t *u) { -  int coupled; -  *l = negInfinity; -  *u = posInfinity; -  coupled = queryVariable(i, l, u); -  if (!coupled || (nVars == 1 && forwardingAddress[i] == 1)) -    return 0; -  if (abs(forwardingAddress[i]) == 1 && nVars + nSUBs == 2 && nEQs + nSUBs == 1) { -    int couldBeZero; -    queryCoupledVariable(i, l, u, &couldBeZero, negInfinity, posInfinity); -    return 0; -  } -  return 1; -} - -void Problem::queryCoupledVariable(int i, coef_t *l, coef_t *u, int *couldBeZero, coef_t lowerBound, coef_t upperBound) { -  int e; -  coef_t b1, b2; -  const eqn *eqn; -  coef_t sign; -  int v; - -  if (abs(forwardingAddress[i]) != 1 || nVars + nSUBs != 2 || nEQs + nSUBs != 1) { -    fprintf(outputFile, "queryCoupledVariablecalled with bad parameters\n"); -    printProblem(); -    exit(2); -  } - -  if (forwardingAddress[i] == -1) { -    eqn = &SUBs[0]; -    sign = 1; -    v = 1; -  } -  else { -    eqn = &EQs[0]; -    sign = -eqn->coef[1]; -    v = 2; -  } - -  /* Variable i is defined in terms of variable v */ - -  for (e = nGEQs - 1; e >= 0; e--) -    if (GEQs[e].coef[v] != 0) { -      if (GEQs[e].coef[v] == 1) { -        set_max(lowerBound, -GEQs[e].coef[0]); -      } -      else { -        set_min(upperBound, GEQs[e].coef[0]); -      } -    } -  /* lowerBound and upperBound are bounds on the value of v */ - -  if (lowerBound > upperBound) { -    *l = posInfinity; -    *u = negInfinity; -    *couldBeZero = 0; -    return; -  } -  if (lowerBound == negInfinity) { -    if (eqn->coef[v] > 0) -      b1 = sign * negInfinity; -    else -      b1 = -sign * negInfinity; -  } -  else -    b1 = sign * (eqn->coef[0] + eqn->coef[v] * lowerBound); -  if (upperBound == posInfinity) { -    if (eqn->coef[v] > 0) -      b2 = sign * posInfinity; -    else -      b2 = -sign * posInfinity; -  } -  else -    b2 = sign * (eqn->coef[0] + eqn->coef[v] * upperBound); - -  /* b1 and b2 are bounds on the value of i (don't know which is upper bound) */ -  if (b1 <= b2) { -    set_max(*l, b1); -    set_min(*u, b2); -  } -  else { -    set_max(*l, b2); -    set_min(*u, b1); -  } -  *couldBeZero = *l <= 0 && 0 <= *u && int_mod(eqn->coef[0], abs(eqn->coef[v])) == 0; -} - - -int Problem::queryVariableSigns(int i, int dd_lt, int dd_eq, int dd_gt, coef_t lowerBound, coef_t upperBound, bool *distKnown, coef_t *dist) { -  int result; -  coef_t l, u; -  int couldBeZero; - -  l = negInfinity; -  u = posInfinity; - -  queryVariable(i, &l, &u); -  queryCoupledVariable(i, &l, &u, &couldBeZero, lowerBound, upperBound); -  result = 0; -  if (l < 0) -    result |= dd_gt; -  if (u > 0) -    result |= dd_lt; -  if (couldBeZero) -    result |= dd_eq; -  if (l == u) { -    *distKnown = 1; -    *dist = l; -  } -  else { -    *distKnown = 0; -  } -  return (result); -} - -} // namespace diff --git a/omega/omega_lib/src/omega_core/oc_quick_kill.cc b/omega/omega_lib/src/omega_core/oc_quick_kill.cc deleted file mode 100644 index e49aee7..0000000 --- a/omega/omega_lib/src/omega_core/oc_quick_kill.cc +++ /dev/null @@ -1,775 +0,0 @@ -/***************************************************************************** - Copyright (C) 1994-2000 the Omega Project Team - Copyright (C) 2005-2011 Chun Chen - All Rights Reserved. - - Purpose: -   Quick inequality elimination. - - Notes: - - History: -   03/31/09 Use BoolSet, Chun Chen -*****************************************************************************/ - -#include <omega/omega_core/oc_i.h> -#include <vector> -#include <algorithm> -#include <basic/boolset.h> - -namespace omega { - -int Problem::combineToTighten() { -  int effort = min(12+5*(nVars-safeVars),23); - -  if (DBUG) { -    fprintf(outputFile, "\nin combineToTighten (%d,%d):\n",effort,nGEQs); -    printProblem(); -    fprintf(outputFile, "\n"); -  } -  if (nGEQs > effort) { -    if (TRACE) { -      fprintf(outputFile, "too complicated to tighten\n"); -    } -    return 1; -  } - -  for(int e = 1; e < nGEQs; e++) { -    for(int e2 = 0; e2 < e; e2++) { -      coef_t g = 0; - -      bool has_wildcard = false; -      bool has_wildcard2 = false; -      for (int i = nVars; i > safeVars; i--) { -        coef_t a = GEQs[e].coef[i]; -        coef_t b = GEQs[e2].coef[i]; -        g = gcd(g, abs(a+b)); -        if (a != 0) -          has_wildcard = true; -        if (b != 0) -          has_wildcard2 = true; -      } -         -      coef_t c, c2; -      if ((has_wildcard && !has_wildcard2) || (!has_wildcard && has_wildcard2)) -        c = 0; -      else -        c = -1; -      for (int i = safeVars; i >= 1; i--) { -        coef_t a = GEQs[e].coef[i]; -        coef_t b = GEQs[e2].coef[i]; -        if (a != 0 || b != 0) { -          g = gcd(g, abs(a+b)); - -          if (c < 0) { -            if (g == 1) -              break; -          } -          else if ((a>0 && b<0) || (a<0 && b>0)) { -            if (c == 0) { -              try { -                coef_t prod = lcm(abs(a), abs(b)); -                c = prod/abs(a); -                c2 = prod/abs(b); -              } -              catch (std::overflow_error) { -                c = -1; -              } -            } -            else { -              if (c*a+c2*b != 0) -                c = -1; -            } -          } -          else { -            c = -1; -          } -        } -      } - -      bool done_unit_combine = false; -      if (g > 1 && (GEQs[e].coef[0] + GEQs[e2].coef[0]) % g != 0) { -        int e3 = newGEQ(); -        for(int i = nVars; i >= 1; i--) { -          GEQs[e3].coef[i] = (GEQs[e].coef[i] + GEQs[e2].coef[i])/g; -        } -        GEQs[e3].coef[0] = int_div(GEQs[e].coef[0] + GEQs[e2].coef[0], g); -        GEQs[e3].color = GEQs[e].color || GEQs[e2].color; -        GEQs[e3].touched = 1; -        if (DBUG) { -          fprintf(outputFile,  "Combined     "); -          printGEQ(&GEQs[e]); -          fprintf(outputFile,"\n         and "); -          printGEQ(&GEQs[e2]); -          fprintf(outputFile,"\n to get #%d: ",e3); -          printGEQ(&GEQs[e3]); -          fprintf(outputFile,"\n\n"); -        } - -        done_unit_combine = true; -        if (nGEQs > effort+5 || nGEQs > maxmaxGEQs-10) goto doneCombining; -      } - -      if (c > 0 && !(c == 1 && c2 == 1 && done_unit_combine)) { -        bool still_has_wildcard = false; -        coef_t p[nVars-safeVars]; -        for (int i = nVars; i > safeVars; i--) { -          p[i-safeVars-1] = c * GEQs[e].coef[i] + c2 * GEQs[e2].coef[i]; -          if (p[i-safeVars-1] != 0) -            still_has_wildcard = true; -        } -        if (still_has_wildcard) { -          int e3 = newGEQ(); -          for(int i = nVars; i > safeVars; i--) -            GEQs[e3].coef[i] = p[i-safeVars-1]; -          for (int i = safeVars; i > 0; i--) -            GEQs[e3].coef[i] = 0;           -          GEQs[e3].coef[0] = c * GEQs[e].coef[0] + c2 * GEQs[e2].coef[0]; -          GEQs[e3].color = GEQs[e].color || GEQs[e2].color; -          GEQs[e3].touched = 1; -          if (DBUG) { -            fprintf(outputFile,  "Additionally combined     "); -            printGEQ(&GEQs[e]); -            fprintf(outputFile,"\n         and "); -            printGEQ(&GEQs[e2]); -            fprintf(outputFile,"\n to get #%d: ",e3); -            printGEQ(&GEQs[e3]); -            fprintf(outputFile,"\n\n"); -          } - -          if (nGEQs > effort+5 || nGEQs > maxmaxGEQs-10) goto doneCombining; -        } -      }       -    } -  } - -doneCombining: -  if (normalize() == normalize_false) return 0; -  while (nEQs) { -    if (!solveEQ()) return 0; -    if (normalize() == normalize_false) return 0; -  } -  return 1; -} - - -void Problem::noteEssential(int onlyWildcards) { -  for (int e = nGEQs - 1; e >= 0; e--) { -    GEQs[e].essential = 0; -    GEQs[e].varCount = 0; -  } -  if (onlyWildcards) { -    for (int e = nGEQs - 1; e >= 0; e--) { -      GEQs[e].essential = 1; -      for (int i = nVars; i > safeVars; i--)  -        if (GEQs[e].coef[i] < -1 || GEQs[e].coef[i] > 1) { -          GEQs[e].essential = 0; -          break; -        } -    } -  } -  for (int i = nVars; i >= 1; i--) { -    int onlyLB = -1; -    int onlyUB = -1; -    for (int e = nGEQs - 1; e >= 0; e--)  -      if (GEQs[e].coef[i] > 0) { -        GEQs[e].varCount ++; -        if (onlyLB == -1) onlyLB = e; -        else onlyLB = -2; -      } -      else if (GEQs[e].coef[i] < 0) { -        GEQs[e].varCount ++; -        if (onlyUB == -1) onlyUB = e; -        else onlyUB = -2; -      } -    if (onlyUB >= 0) { -      if (DBUG) { -        fprintf(outputFile,"only UB: "); -        printGEQ(&GEQs[onlyUB]); -        fprintf(outputFile,"\n"); -      } -      GEQs[onlyUB].essential = 1; -    } -    if (onlyLB >= 0) { -      if (DBUG) { -        fprintf(outputFile,"only LB: "); -        printGEQ(&GEQs[onlyLB]); -        fprintf(outputFile,"\n"); -      } -      GEQs[onlyLB].essential = 1; -    } -  } -  for (int e = nGEQs - 1; e >= 0; e--)  -    if (!GEQs[e].essential && GEQs[e].varCount > 1) { -      int i1,i2,i3; -      for (i1 = nVars; i1 >= 1; i1--) if (GEQs[e].coef[i1]) break; -      for (i2 = i1-1; i2 >= 1; i2--)  if (GEQs[e].coef[i2]) break; -      for (i3 = i2-1; i3 >= 1; i3--)  if (GEQs[e].coef[i3]) break; -      assert(i2 >= 1); -      int e2; -      for (e2 = nGEQs - 1; e2 >= 0; e2--) -        if (e!=e2) { -          coef_t crossProduct; -          crossProduct = GEQs[e].coef[i1]*GEQs[e2].coef[i1]; -          crossProduct += GEQs[e].coef[i2]*GEQs[e2].coef[i2]; -          for (int i = i3; i >= 1; i--) -            if (GEQs[e2].coef[i]) -              crossProduct += GEQs[e].coef[i]*GEQs[e2].coef[i]; -          if (crossProduct > 0) { -            if (DBUG) fprintf(outputFile,"Cross product of %d and %d is " coef_fmt "\n", e, e2, crossProduct); -            break; -          } -        } -      if (e2 < 0) GEQs[e].essential = 1; -    } -  if (DBUG) { -    fprintf(outputFile,"Computed essential equations\n"); -    fprintf(outputFile,"essential equations:\n"); -    for (int e = 0; e < nGEQs; e++) -      if (GEQs[e].essential) { -        printGEQ(&GEQs[e]); -        fprintf(outputFile,"\n"); -      } -    fprintf(outputFile,"potentially redundant equations:\n"); -    for (int e = 0; e < nGEQs; e++) -      if (!GEQs[e].essential) { -        printGEQ(&GEQs[e]); -        fprintf(outputFile,"\n"); -      } -  } -} - - -int Problem::findDifference(int e, int &v1, int &v2) { -  // if 1 returned, eqn E is of form v1 -coef >= v2  -  for(v1=1;v1<=nVars;v1++) -    if (GEQs[e].coef[v1]) break; -  for(v2=v1+1;v2<=nVars;v2++) -    if (GEQs[e].coef[v2]) break; -  if (v2 > nVars) { -    if (GEQs[e].coef[v1] == -1) { -      v2 = v1; -      v1 = 0;  -      return 1; -    } -    if (GEQs[e].coef[v1] == 1) { -      v2 = 0; -      return 1; -    } -    return 0; -  } -  if (GEQs[e].coef[v1] * GEQs[e].coef[v2] != -1)  return 0; -  if (GEQs[e].coef[v1] < 0) std::swap(v1,v2); -  return 1; -} - - -namespace { -  struct succListStruct { -    int    num; -    int    notEssential; -    int    var[maxVars]; -    coef_t diff[maxVars]; -    int    eqn[maxVars]; -  }; -} -   - -int Problem::chainKill(int color, int onlyWildcards) { -  int v1,v2,e; -  int essentialPred[maxVars]; -  int redundant[maxmaxGEQs]; -  int inChain[maxVars]; -  int goodStartingPoint[maxVars]; -  int tryToEliminate[maxmaxGEQs]; -  int triedDoubleKill = 0; - -  succListStruct succ[maxVars]; - -restart: - -  int anyToKill = 0; -  int anyKilled = 0; -  int canHandle = 0; -    -  for(v1=0;v1<=nVars;v1++) { -    succ[v1].num = 0; -    succ[v1].notEssential = 0; -    goodStartingPoint[v1] = 0; -    inChain[v1] = -1; -    essentialPred[v1] = 0; -  } - -  int essentialEquations = 0; -  for (e = 0; e < nGEQs; e++) { -    redundant[e] = 0; -    tryToEliminate[e] = !GEQs[e].essential; -    if (GEQs[e].essential) essentialEquations++; -    if (color && !GEQs[e].color) tryToEliminate[e] = 0; -  } -  if (essentialEquations == nGEQs) return 0; -  if (2*essentialEquations < nVars) return 1; -    -  for (e = 0; e < nGEQs; e++)  -    if (tryToEliminate[e] && GEQs[e].varCount <= 2 && findDifference(e,v1,v2)) { -      assert(v1 == 0 || GEQs[e].coef[v1] == 1); -      assert(v2 == 0 || GEQs[e].coef[v2] == -1); -      succ[v2].notEssential++; -      int s = succ[v2].num++; -      succ[v2].eqn[s] = e; -      succ[v2].var[s] = v1; -      succ[v2].diff[s] = -GEQs[e].coef[0]; -      goodStartingPoint[v2] = 1; -      anyToKill++; -      canHandle++; -    } -  if (!anyToKill) { -    return canHandle < nGEQs; -  } -  for (e = 0; e < nGEQs; e++)  -    if (!tryToEliminate[e] && GEQs[e].varCount <= 2 && findDifference(e,v1,v2)) { -      assert(v1 == 0 || GEQs[e].coef[v1] == 1); -      assert(v2 == 0 || GEQs[e].coef[v2] == -1); -      int s = succ[v2].num++; -      essentialPred[v1]++; -      succ[v2].eqn[s] = e; -      succ[v2].var[s] = v1; -      succ[v2].diff[s] = -GEQs[e].coef[0]; -      canHandle++; -    } - - -  if (DBUG) { -    int s; -    fprintf(outputFile,"In chainkill: [\n"); -    for(v1 = 0;v1<=nVars;v1++) { -      fprintf(outputFile,"#%d <=   %s: ",essentialPred[v1],variable(v1)); -      for(s=0;s<succ[v1].notEssential;s++)  -        fprintf(outputFile," %s(" coef_fmt ") ",variable(succ[v1].var[s]), succ[v1].diff[s]); -      for(;s<succ[v1].num;s++)  -        fprintf(outputFile," %s[" coef_fmt "] ",variable(succ[v1].var[s]), succ[v1].diff[s]); -      fprintf(outputFile,"\n"); -    } -  } - -  for(;v1<=nVars;v1++) -    if (succ[v1].num == 1 && succ[v1].notEssential == 1) { -      succ[v1].notEssential--; -      essentialPred[succ[v1].var[succ[v1].notEssential]]++; -    } - -  if (DBUG) fprintf(outputFile,"Trying quick double kill:\n"); -  int s1a,s1b,s2; -  int v3; -  for(v1 = 0;v1<=nVars;v1++)  -    for(s1a=0;s1a<succ[v1].notEssential;s1a++) { -      v3 = succ[v1].var[s1a]; -      for(s1b=0;s1b<succ[v1].num;s1b++) -        if (s1a != s1b) { -          v2 = succ[v1].var[s1b]; -          for(s2=0;s2<succ[v2].num;s2++) -            if (succ[v2].var[s2] == v3 && succ[v1].diff[s1b] + succ[v2].diff[s2] >= succ[v1].diff[s1a]) { -              if (DBUG) { -                fprintf(outputFile,"quick double kill: ");  -                printGEQ(&GEQs[succ[v1].eqn[s1a]]); -                fprintf(outputFile,"\n");  -              } -              redundant[succ[v1].eqn[s1a]] = 1; -              anyKilled++; -              anyToKill--; -              goto nextVictim; -            } -        } -    nextVictim: v1 = v1; -    } -  if (anyKilled) { -    for (e = nGEQs-1; e >= 0;e--) -      if (redundant[e]) { -        if (DBUG) { -          fprintf(outputFile,"Deleting "); -          printGEQ(&GEQs[e]); -          fprintf(outputFile,"\n"); -        } -        deleteGEQ(e); -      } - -    if (!anyToKill) return canHandle < nGEQs; -    noteEssential(onlyWildcards); -    triedDoubleKill = 1; -    goto restart; -  } - -  for(v1 = 0;v1<=nVars;v1++) -    if (succ[v1].num == succ[v1].notEssential && succ[v1].notEssential > 0) { -      succ[v1].notEssential--; -      essentialPred[succ[v1].var[succ[v1].notEssential]]++; -    } -   -  while (1) { -    int chainLength; -    int chain[maxVars]; -    coef_t distance[maxVars]; -    // pick a place to start -    for(v1 = 0;v1<=nVars;v1++) -      if (essentialPred[v1] == 0 && succ[v1].num > succ[v1].notEssential) -        break; -    if (v1 > nVars)  -      for(v1 = 0;v1<=nVars;v1++) -        if (goodStartingPoint[v1] && succ[v1].num > succ[v1].notEssential) -          break; -    if (v1 > nVars) break; - -    chainLength = 1; -    chain[0] = v1; -    distance[0] = 0; -    inChain[v1] = 0; -    int s; -    -    while (succ[v1].num > succ[v1].notEssential) { -      s = succ[v1].num-1; -      if (inChain[succ[v1].var[s]] >= 0) { -        // Found cycle, don't do anything with them yet -        break; -      } -      succ[v1].num = s; - -      distance[chainLength]= distance[chainLength-1] + succ[v1].diff[s]; -      v1 = chain[chainLength] = succ[v1].var[s]; -      essentialPred[v1]--; -      assert(essentialPred[v1] >= 0); -      inChain[v1] = chainLength; -      chainLength++; -    } - - -    int c; -    if (DBUG) { -      fprintf(outputFile,"Found chain: \n"); -      for (c = 0; c < chainLength; c++)  -        fprintf(outputFile,"%s:" coef_fmt "  ",variable(chain[c]), distance[c]); -      fprintf(outputFile,"\n"); -    } -  -  -    for (c = 0; c < chainLength; c++) { -      v1 = chain[c]; -      for(s=0;s<succ[v1].notEssential;s++) { -        if (DBUG) -          fprintf(outputFile,"checking for %s + " coef_fmt " <= %s \n", variable(v1), succ[v1].diff[s], variable(succ[v1].var[s])); -        if (inChain[succ[v1].var[s]] > c+1) { -          if (DBUG) -            fprintf(outputFile,"%s + " coef_fmt " <= %s is in chain\n", variable(v1), distance[inChain[succ[v1].var[s]]]- distance[c], variable(succ[v1].var[s])); -          if ( distance[inChain[succ[v1].var[s]]]- distance[c] >= succ[v1].diff[s]) { -            if (DBUG)  -              fprintf(outputFile,"%s + " coef_fmt " <= %s is redundant\n", variable(v1),succ[v1].diff[s], variable(succ[v1].var[s])); -            redundant[succ[v1].eqn[s]] = 1; -          } -        } -      } -    }  -    for (c = 0; c < chainLength; c++)  -      inChain[chain[c]] = -1; -  } -   -  for (e = nGEQs-1; e >= 0;e--) -    if (redundant[e]) { -      if (DBUG) { -        fprintf(outputFile,"Deleting "); -        printGEQ(&GEQs[e]); -        fprintf(outputFile,"\n"); -      } -      deleteGEQ(e); -      anyKilled = 1; -    } - -  if (anyKilled) noteEssential(onlyWildcards); - -  if (anyKilled && DBUG) { -    fprintf(outputFile,"\nResult:\n"); -    printProblem(); -  } -  if (DBUG)  { -    fprintf(outputFile,"] end chainkill\n"); -    printProblem(); -  } -  return canHandle < nGEQs; -} - - -namespace { -  struct varCountStruct { -    int e; -    int safeVarCount; -    int wildVarCount; -    varCountStruct(int e_, int count1_, int count2_) { -      e = e_; -      safeVarCount = count1_; -      wildVarCount = count2_; } -  }; -  bool operator<(const varCountStruct &a, const varCountStruct &b) { -    if (a.wildVarCount < b.wildVarCount) -      return true; -    else if (a.wildVarCount > b.wildVarCount) -      return false; -    else -      return a.safeVarCount < b.safeVarCount; -  } -} - - -// -// Deduct redundant inequalities by combination of any two inequalities. -// Return value: 0 (no solution), -//               1 (nothing killed), -//               2 (some inequality killed). -// -int Problem::quickKill(int onlyWildcards, bool desperate) { -  if (!onlyWildcards && !combineToTighten()) -    return 0; -  noteEssential(onlyWildcards); -  int moreToDo = chainKill(0, onlyWildcards); - -#ifdef NDEBUG -  if (!moreToDo) return 1; -#endif - -   -  if (!desperate && nGEQs > 256) {  // original 60, increased by chun -    if (TRACE) { -      fprintf(outputFile, "%d inequalities are too complicated to quick kill\n", nGEQs); -    } -    return 1; -  } - -  if (DBUG) { -    fprintf(outputFile, "in eliminate Redudant:\n"); -    printProblem(); -  } - -  int isDead[nGEQs]; -  std::vector<varCountStruct> killOrder; -  std::vector<BoolSet<> > P(nGEQs, BoolSet<>(nVars)), Z(nGEQs, BoolSet<>(nVars)), N(nGEQs, BoolSet<>(nVars)); -  BoolSet<> PP, PZ, PN; // possible Positives, possible zeros & possible negatives - -  for (int e = nGEQs - 1; e >= 0; e--) { -    isDead[e] = 0; -    int safeVarCount = 0; -    int wildVarCount = 0; -    for (int i = nVars; i >= 1; i--) { -      if (GEQs[e].coef[i] == 0) -        Z[e].set(i-1); -      else { -        if (i > safeVars) -          wildVarCount++; -        else -          safeVarCount++; -        if (GEQs[e].coef[i] < 0) -          N[e].set(i-1); -        else -          P[e].set(i-1); -      } -    } - -    if (!GEQs[e].essential || wildVarCount > 0) -      killOrder.push_back(varCountStruct(e, safeVarCount, wildVarCount)); -  } - -  sort(killOrder.begin(), killOrder.end()); -   -  if (DEBUG) { -    fprintf(outputFile,"Prefered kill order:\n"); -    for (int e3I = killOrder.size()-1; e3I >= 0; e3I--) { -      fprintf(outputFile,"%2d: ",nGEQs-1-e3I); -      printGEQ(&GEQs[killOrder[e3I].e]); -      fprintf(outputFile,"\n"); -    } -  } - -  int e3U = killOrder.size()-1; -  while (e3U >= 0) { -    // each round of elimination is for inequalities of same complexity and rounds are at descending complexity order -    int e3L = e3U-1; -    for(; e3L >= 0; e3L--) -      if (killOrder[e3L].safeVarCount+killOrder[e3L].wildVarCount != killOrder[e3U].safeVarCount + killOrder[e3U].wildVarCount) -        break; - -    // check if e3 can be eliminated from combination of e1 and e2 -    for (int e1 = 0; e1 < nGEQs; e1++) -      if (!isDead[e1]) -        for (int e2 = e1+1; e2 < nGEQs; e2++) -          if (!isDead[e2]) { -            coef_t alpha = 0; -            int p, q; -            for (p = nVars; p > 1; p--)  -              for (q = p - 1; q > 0; q--) { -                try { -                  alpha = check_mul(GEQs[e1].coef[p], GEQs[e2].coef[q]) - check_mul(GEQs[e2].coef[p], GEQs[e1].coef[q]); -                } -                catch (std::overflow_error) { -                  continue; -                } -                if (alpha != 0) -                  goto foundPQ; -              } -            continue; - -          foundPQ: -            PZ = (Z[e1] & Z[e2]) | (P[e1] & N[e2]) | (N[e1] & P[e2]); -            PP = P[e1] | P[e2]; -            PN = N[e1] | N[e2]; -            if (DEBUG) { -              fprintf(outputFile,"Considering combination of "); -              printGEQ(&(GEQs[e1])); -              fprintf(outputFile," and  "); -              printGEQ(&(GEQs[e2])); -              fprintf(outputFile,"\n"); -            } - -            for (int e3I = e3U; e3I > e3L; e3I--) { -              int e3 = killOrder[e3I].e; -              if (!isDead[e3] && e3 != e1 && e3 != e2) -                try { -                  coef_t alpha1, alpha2, alpha3; - -                  if (!PZ.imply(Z[e3])) -                    goto nextE3; - -                  alpha1 = check_mul(GEQs[e2].coef[q], GEQs[e3].coef[p]) - check_mul(GEQs[e2].coef[p], GEQs[e3].coef[q]); -                  alpha2 = -(check_mul(GEQs[e1].coef[q], GEQs[e3].coef[p]) - check_mul(GEQs[e1].coef[p], GEQs[e3].coef[q])); -                  alpha3 = alpha; - -                  if (alpha1 < 0) { -                    alpha1 = -alpha1; -                    alpha2 = -alpha2; -                    alpha3 = -alpha3; -                  } -                  if (alpha1 == 0 || alpha2 <= 0) -                    goto nextE3; - -                  { -                    coef_t g = gcd(gcd(alpha1, alpha2), abs(alpha3)); -                    alpha1 /= g; -                    alpha2 /= g; -                    alpha3 /= g; -                  } -               -                  if (DEBUG) { -                    fprintf(outputFile, coef_fmt "e1 + " coef_fmt "e2 = " coef_fmt "e3: ",alpha1,alpha2,alpha3); -                    printGEQ(&(GEQs[e3])); -                    fprintf(outputFile,"\n"); -                  } - -                  if (alpha3 > 0) { // trying to prove e3 is redundant -                    if (!GEQs[e3].color && (GEQs[e1].color || GEQs[e2].color)) { -                      goto nextE3; -                    } -                    if (!PP.imply(P[e3]) | !PN.imply(N[e3])) -                      goto nextE3; - -                    // verify alpha1*v1+alpha2*v2 = alpha3*v3 -                    for (int k = nVars; k >= 1; k--) -                      if (check_mul(alpha3,  GEQs[e3].coef[k]) != check_mul(alpha1, GEQs[e1].coef[k]) + check_mul(alpha2, GEQs[e2].coef[k])) -                        goto nextE3; - -                    coef_t c = check_mul(alpha1, GEQs[e1].coef[0]) + check_mul(alpha2, GEQs[e2].coef[0]); -                    if (c < check_mul(alpha3, (GEQs[e3].coef[0] + 1))) { -                      if (DBUG) { -                        fprintf(outputFile, "found redundant inequality\n"); -                        fprintf(outputFile, "alpha1, alpha2, alpha3 = " coef_fmt "," coef_fmt "," coef_fmt "\n", alpha1, alpha2, alpha3); -                        printGEQ(&(GEQs[e1])); -                        fprintf(outputFile, "\n"); -                        printGEQ(&(GEQs[e2])); -                        fprintf(outputFile, "\n=> "); -                        printGEQ(&(GEQs[e3])); -                        fprintf(outputFile, "\n\n"); -                        assert(moreToDo); -                      } - -                      isDead[e3] = 1; -                    } -                  }  -                  else { // trying to prove e3 <= 0 or e3 = 0 -                    if (!PN.imply(P[e3]) | !PP.imply(N[e3])) -                      goto nextE3; - -                    // verify alpha1*v1+alpha2*v2 = alpha3*v3 -                    for (int k = nVars; k >= 1; k--) -                      if (check_mul(alpha3, GEQs[e3].coef[k]) != check_mul(alpha1, GEQs[e1].coef[k]) + check_mul(alpha2, GEQs[e2].coef[k])) -                        goto nextE3; - -                    if (DEBUG) { -                      fprintf(outputFile,"All but constant term checked\n"); -                    } -                    coef_t c = check_mul(alpha1, GEQs[e1].coef[0]) + check_mul(alpha2, GEQs[e2].coef[0]); -                    if (DEBUG) { -                      fprintf(outputFile,"All but constant term checked\n"); -                      fprintf(outputFile,"Constant term is " coef_fmt " vs " coef_fmt "\n", -                              alpha3*GEQs[e3].coef[0], -                              alpha3*(GEQs[e3].coef[0]-1)); -                    } -                    if (c < check_mul(alpha3, (GEQs[e3].coef[0]))) { -                      // we just proved e3 < 0, so no solutions exist -                      if (DBUG) { -                        fprintf(outputFile, "found implied over tight inequality\n"); -                        fprintf(outputFile, "alpha1, alpha2, alpha3 = " coef_fmt "," coef_fmt "," coef_fmt "\n", alpha1, alpha2, -alpha3); -                        printGEQ(&(GEQs[e1])); -                        fprintf(outputFile, "\n"); -                        printGEQ(&(GEQs[e2])); -                        fprintf(outputFile, "\n=> not "); -                        printGEQ(&(GEQs[e3])); -                        fprintf(outputFile, "\n\n"); -                      } -                      return 0; -                    } -                    else if (!GEQs[e3].color && (GEQs[e1].color || GEQs[e2].color)) { -                      goto nextE3; -                    } -                    else if (c < check_mul(alpha3, (GEQs[e3].coef[0] - 1))) { -                      // we just proved e3 <= 0, so e3 = 0 -                      if (DBUG) { -                        fprintf(outputFile, "found implied tight inequality\n"); -                        fprintf(outputFile, "alpha1, alpha2, alpha3 = " coef_fmt "," coef_fmt "," coef_fmt "\n", alpha1, alpha2, -alpha3); -                        printGEQ(&(GEQs[e1])); -                        fprintf(outputFile, "\n"); -                        printGEQ(&(GEQs[e2])); -                        fprintf(outputFile, "\n=> inverse "); -                        printGEQ(&(GEQs[e3])); -                        fprintf(outputFile, "\n\n"); -                      } -                      int neweq = newEQ(); -                      eqnncpy(&EQs[neweq], &GEQs[e3], nVars); -                      addingEqualityConstraint(neweq); -                      isDead[e3] = 1; -                    } -                  } -                nextE3:; -                } -                catch (std::overflow_error) { -                  continue; -                } -            } -          } - -    e3U = e3L; -  } - -  bool anything_killed = false; -  for (int e = nGEQs - 1; e >= 0; e--) { -    if (isDead[e]) { -      anything_killed = true; -      deleteGEQ(e); -    } -  } - -  if (DBUG) { -    fprintf(outputFile,"\nResult:\n"); -    printProblem(); -  } - -  if (anything_killed) -    return 2; -  else -    return 1; -} - -} // namespace diff --git a/omega/omega_lib/src/omega_core/oc_simple.cc b/omega/omega_lib/src/omega_core/oc_simple.cc deleted file mode 100644 index ebbf407..0000000 --- a/omega/omega_lib/src/omega_core/oc_simple.cc +++ /dev/null @@ -1,1373 +0,0 @@ -/***************************************************************************** - Copyright (C) 1994-2000 the Omega Project Team - Copyright (C) 2005-2011 Chun Chen - All Rights Reserved. - - Purpose: -  Support functions for solving a problem. - - Notes: - - History: -  10/13/08 Complete back substitution process, Chun Chen. -  05/28/09 Extend normalize process to handle redundancy involving -           wilddcards, Chun Chen -*****************************************************************************/ - -#include <omega/omega_core/oc_i.h> -#include <basic/boolset.h> -#include <algorithm> -#include <vector> - -namespace omega { - -int checkIfSingleVar(eqn* e, int i) { -  for (; i > 0; i--) -    if (e->coef[i]) { -      i--; -      break; -    } -  for (; i > 0; i--) -    if (e->coef[i]) -      break; -  return (i == 0); -} - - -int singleVarGEQ(eqn* e) { -  return  !e->touched && e->key != 0 && -maxVars <= e->key && e->key <= maxVars; -} - - -void checkVars(int nVars) { -  if (nVars > maxVars) { -    fprintf(stderr, "\nERROR:\n"); -    fprintf(stderr, "An attempt was made to create a conjunction with %d variables.\n", nVars); -    fprintf(stderr, "The current limit on variables in a single conjunction is %d.\n", maxVars); -    fprintf(stderr, "This limit can be changed by changing the #define of maxVars in oc.h.\n\n"); -    exit(2); -  } -} - - -void Problem::difficulty(int &numberNZs, coef_t &maxMinAbsCoef, coef_t &sumMinAbsCoef) const { -  numberNZs=0; -  maxMinAbsCoef=0; -  sumMinAbsCoef=0; -  for (int e = 0; e < nGEQs; e++) { -    coef_t maxCoef = 0; -    for(int i = 1;i <= nVars;i++)  -      if (GEQs[e].coef[i]!=0) { -        coef_t a = abs(GEQs[e].coef[i]); -        maxCoef = max(maxCoef,a); -        numberNZs++; -      } -    coef_t nextCoef = 0; -    for(int i = 1;i <= nVars;i++)  -      if (GEQs[e].coef[i]!=0) { -        coef_t a = abs(GEQs[e].coef[i]); -        if (a < maxCoef) nextCoef = max(nextCoef,a); -        else if (a == maxCoef) maxCoef = 0x7fffffff; -      } -    maxMinAbsCoef = max(maxMinAbsCoef,nextCoef); -    sumMinAbsCoef += nextCoef; -  } - -  for (int e = 0; e < nEQs; e++) { -    coef_t maxCoef = 0; -    for(int i = 1;i <= nVars;i++)  -      if (EQs[e].coef[i]!=0) { -        coef_t a = abs(EQs[e].coef[i]); -        maxCoef = max(maxCoef,a); -        numberNZs++; -      } -    coef_t nextCoef = 0; -    for(int i = 1;i <= nVars;i++)  -      if (EQs[e].coef[i]!=0) { -        coef_t a = abs(EQs[e].coef[i]); -        if (a < maxCoef) nextCoef = max(nextCoef,a); -        else if (a == maxCoef) maxCoef = 0x7fffffff; -      } -    maxMinAbsCoef = max(maxMinAbsCoef,nextCoef); -    sumMinAbsCoef += nextCoef; -  } -} - -int Problem::countRedGEQs() const { -  int result = 0; -  for (int e = 0; e < nGEQs; e++) -    if (GEQs[e].color == EQ_RED) result++; -  return result; -} - -int Problem::countRedEQs() const { -  int result = 0; -  for (int e = 0; e < nEQs; e++) -    if (EQs[e].color == EQ_RED) result++; -  return result; -} - -int Problem::countRedEquations() const { -  int result = 0; -  for (int e = 0; e < nEQs; e++) -    if (EQs[e].color == EQ_RED) { -      int i; -      for (i = nVars; i > 0; i--) if (EQs[e].coef[i]) break; -      if (i == 0 && EQs[e].coef[0] != 0) return 0; -      else result+=2; -    } -  for (int e = 0; e < nGEQs; e++) -    if (GEQs[e].color == EQ_RED) result+=1; -  for (int e = 0; e < nMemories; e++) -    switch(redMemory[e].kind ) { -    case redEQ: -    case redStride: -      e++; -    case redLEQ: -    case redGEQ: -      e++; -    case notRed: -      ;    /* avoid warning about notRed not handled */ -    } -  return result; -} - -void Problem::deleteBlack() { -  int RedVar[maxVars]; -  for(int i = safeVars+1;i <= nVars;i++) RedVar[i] = 0; - -  assert(nSUBs == 0); - -  for (int e = nEQs-1; e >= 0; e--) -    if (EQs[e].color != EQ_RED) { -      eqnncpy(&EQs[e],&EQs[nEQs-1], nVars); -      nEQs--; -    } -    else -      for(int i = safeVars+1;i <= nVars;i++) -        if (EQs[e].coef[i]) RedVar[i] = 1; - -  for (int e = nGEQs-1; e >= 0; e--) -    if (GEQs[e].color != EQ_RED) { -      eqnncpy(&GEQs[e],&GEQs[nGEQs-1], nVars); -      nGEQs--; -    } -    else -      for(int i = safeVars+1;i <= nVars;i++) -        if (GEQs[e].coef[i]) RedVar[i] = 1; - -  assert(nSUBs == 0); - -  for(int i = nVars; i > safeVars;i--) { -    if (!RedVar[i]) deleteVariable(i); -  } -} - - -void Problem::deleteRed() { -  int BlackVar[maxVars]; -  for(int i = safeVars+1;i <= nVars;i++) BlackVar[i] = 0; - -  assert(nSUBs == 0); -  for (int e = nEQs-1; e >=0; e--) -    if (EQs[e].color) { -      eqnncpy(&EQs[e],&EQs[nEQs-1], nVars); -      nEQs--; -    } -    else -      for(int i = safeVars+1;i <= nVars;i++) -        if (EQs[e].coef[i]) BlackVar[i] = 1; - -  for (int e = nGEQs-1; e >=0; e--) -    if (GEQs[e].color) { -      eqnncpy(&GEQs[e],&GEQs[nGEQs-1], nVars); -      nGEQs--; -    } -    else -      for(int i = safeVars+1;i <= nVars;i++) -        if (GEQs[e].coef[i]) BlackVar[i] = 1; - -  assert(nSUBs == 0); - -  for(int i = nVars; i> safeVars;i--) { -    if (!BlackVar[i]) deleteVariable(i); -  } -} - - -void Problem::turnRedBlack() { -  for (int e = nEQs-1; e >= 0; e--) EQs[e].color = 0; -  for (int e = nGEQs-1; e >= 0; e--) GEQs[e].color = 0; -} - - -void Problem::useWildNames() { -  for(int i = safeVars+1; i <= nVars; i++) nameWildcard(i); -} - - -void negateCoefficients(eqn* eqn, int nVars) { -  for (int i = nVars; i >= 0; i--) -    eqn-> coef[i] = -eqn->coef[i]; -  eqn->touched = true; -} - - -void Problem::negateGEQ(int e) { -  negateCoefficients(&GEQs[e],nVars); -  GEQs[e].coef[0]--; -} - - -void Problem:: deleteVariable(int i) { -  if (i < safeVars) { -    int j = safeVars; -    for (int e = nGEQs - 1; e >= 0; e--) { -      GEQs[e].touched = true; -      GEQs[e].coef[i] = GEQs[e].coef[j]; -      GEQs[e].coef[j] = GEQs[e].coef[nVars]; -    } -    for (int e = nEQs - 1; e >= 0; e--) { -      EQs[e].coef[i] = EQs[e].coef[j]; -      EQs[e].coef[j] = EQs[e].coef[nVars]; -    } -    for (int e = nSUBs - 1; e >= 0; e--) { -      SUBs[e].coef[i] = SUBs[e].coef[j]; -      SUBs[e].coef[j] = SUBs[e].coef[nVars]; -    } -    var[i] = var[j]; -    var[j] = var[nVars]; -  } -  else if (i < nVars) { -    for (int e = nGEQs - 1; e >= 0; e--) -      if (GEQs[e].coef[nVars]) { -        GEQs[e].coef[i] = GEQs[e].coef[nVars]; -        GEQs[e].touched = true; -      } -    for (int e = nEQs - 1; e >= 0; e--) -      EQs[e].coef[i] = EQs[e].coef[nVars]; -    for (int e = nSUBs - 1; e >= 0; e--) -      SUBs[e].coef[i] = SUBs[e].coef[nVars]; -    var[i] = var[nVars]; -  } -  if (i <= safeVars) -    safeVars--; -  nVars--; -} - - -void Problem::setInternals() { -  if (!variablesInitialized) { -    initializeVariables(); -  } - -  var[0] = 0; -  nextWildcard = 0; -  for(int i = 1;i <= nVars;i++) -    if (var[i] < 0)  -      var[i] = --nextWildcard; -   -  assert(nextWildcard >= -maxWildcards); - -  CHECK_FOR_DUPLICATE_VARIABLE_NAMES; - -  int v = nSUBs; -  for(int i = 1;i <= safeVars;i++) if (var[i] > 0) v++; -  varsOfInterest = v; - -  if (nextKey * 3 > maxKeys) { -    omega::hashVersion++; -    nextKey = maxVars + 1; -    for (int e = nGEQs - 1; e >= 0; e--) -      GEQs[e].touched = true; -    for (int i = 0; i < hashTableSize; i++) -      hashMaster[i].touched = -1; -    hashVersion = omega::hashVersion; -  } -  else if (hashVersion != omega::hashVersion) { -    for (int e = nGEQs - 1; e >= 0; e--) -      GEQs[e].touched = true; -    hashVersion = omega::hashVersion; -  } -} - - -void Problem::setExternals() { -  for (int i = 1; i <= safeVars; i++) -    forwardingAddress[var[i]] = i; -  for (int i = 0; i < nSUBs; i++) -    forwardingAddress[SUBs[i].key] = -i - 1; -} - - -void setOutputFile(FILE * file) { -  /* sets the file to which printProblem should send its output to "file" */ - -  outputFile = file; -} - - -void setPrintLevel(int level) { -  /* Sets the nber of points printed before constraints in printProblem */ -  headerLevel = level; -} - - -void Problem::putVariablesInStandardOrder() { -  for(int i = 1;i <= safeVars;i++)  { -    int b = i; -    for(int j=i+1;j<=safeVars;j++) { -      if (var[b] < var[j]) b = j; -    } -    if (b != i) swapVars(i,b); -  } -} -  - -void Problem::nameWildcard(int i) { -  int j; -  do { -    --nextWildcard; -    if (nextWildcard < -maxWildcards) -      nextWildcard = -1; -    var[i] = nextWildcard; -    for(j = nVars; j > 0;j--) if (i!=j && var[j] == nextWildcard) break; -  } while (j != 0);  -} - - -int Problem::protectWildcard(int i) { -  assert (i > safeVars); -  if (i != safeVars+1) swapVars(i,safeVars+1); -  safeVars++; -  nameWildcard(safeVars); -  return safeVars; -} - - -int Problem::addNewProtectedWildcard() { -  int i = ++safeVars; -  nVars++; -  if (nVars != i) { -    for (int e = nGEQs - 1; e >= 0; e--) { -      if (GEQs[e].coef[i] != 0) -        GEQs[e].touched = true; -      GEQs[e].coef[nVars] = GEQs[e].coef[i]; -    } -    for (int e = nEQs - 1; e >= 0; e--) { -      EQs[e].coef[nVars] = EQs[e].coef[i]; -    } -    for (int e = nSUBs - 1; e >= 0; e--) { -      SUBs[e].coef[nVars] = SUBs[e].coef[i]; -    } -    var[nVars] = var[i]; -  } -  for (int e = nGEQs - 1; e >= 0; e--) -    GEQs[e].coef[i] = 0; -  for (int e = nEQs - 1; e >= 0; e--) -    EQs[e].coef[i] = 0; -  for (int e = nSUBs - 1; e >= 0; e--) -    SUBs[e].coef[i] = 0; -  nameWildcard(i); -  return (i); -} - - -int Problem::addNewUnprotectedWildcard() { -  int i = ++nVars; -  for (int e = nGEQs - 1; e >= 0; e--) GEQs[e].coef[i] = 0; -  for (int e = nEQs - 1; e >= 0; e--) EQs[e].coef[i] = 0; -  for (int e = nSUBs - 1; e >= 0; e--) SUBs[e].coef[i] = 0; -  nameWildcard(i); -  return i; -} - - -void Problem::cleanoutWildcards() { -  bool renormalize = false; - -  // substituting wildcard equality -  for (int e = nEQs-1; e >= 0; e--) { -    for (int i = nVars; i >= safeVars+1; i--) -      if (EQs[e].coef[i] != 0) { -        coef_t c = EQs[e].coef[i]; -        coef_t a = abs(c); - -        bool preserveThisConstraint = true; -        for (int e2 = nEQs-1; e2 >= 0; e2--) -          if (e2 != e && EQs[e2].coef[i] != 0 && EQs[e2].color >= EQs[e].color) { -            preserveThisConstraint = preserveThisConstraint && (gcd(a,abs(EQs[e2].coef[i])) != 1); -            coef_t k = lcm(a, abs(EQs[e2].coef[i])); -            coef_t coef1 = (EQs[e2].coef[i]>0?1:-1) * k / c; -            coef_t coef2 = k / abs(EQs[e2].coef[i]); -            for (int j = nVars; j >= 0; j--) -              EQs[e2].coef[j] = EQs[e2].coef[j] * coef2 - EQs[e].coef[j] * coef1; -             -            coef_t g = 0; -            for (int j = nVars; j >= 0; j--) { -              g = gcd(abs(EQs[e2].coef[j]), g); -              if (g == 1) -                break; -            } -            if (g != 0 && g != 1) -              for (int j = nVars; j >= 0; j--) -                EQs[e2].coef[j] /= g; -          } - -        for (int e2 = nGEQs-1; e2 >= 0; e2--) -          if (GEQs[e2].coef[i] != 0 && GEQs[e2].color >= EQs[e].color) { -            coef_t k = lcm(a, abs(GEQs[e2].coef[i])); -            coef_t coef1 = (GEQs[e2].coef[i]>0?1:-1) * k / c; -            coef_t coef2 = k / abs(GEQs[e2].coef[i]); -            for (int j = nVars; j >= 0; j--) -              GEQs[e2].coef[j] = GEQs[e2].coef[j] * coef2 - EQs[e].coef[j] * coef1; -             -            GEQs[e2].touched = 1; -            renormalize = true; -          } -         -        for (int e2 = nSUBs-1; e2 >= 0; e2--) -          if (SUBs[e2].coef[i] != 0 && SUBs[e2].color >= EQs[e].color) { -            coef_t k = lcm(a, abs(SUBs[e2].coef[i])); -            coef_t coef1 = (SUBs[e2].coef[i]>0?1:-1) * k / c; -            coef_t coef2 = k / abs(SUBs[e2].coef[i]); -            for (int j = nVars; j >= 0; j--) -              SUBs[e2].coef[j] = SUBs[e2].coef[j] * coef2 - EQs[e].coef[j] * coef1; -             -            coef_t g = 0; -            for (int j = nVars; j >= 0; j--) { -              g = gcd(abs(SUBs[e2].coef[j]), g); -              if (g == 1) -                break; -            } -            if (g != 0 && g != 1) -              for (int j = nVars; j >= 0; j--) -                SUBs[e2].coef[j] /= g;             -          } - -        // remove redundent wildcard equality -        if (!preserveThisConstraint) { -          if (e < nEQs-1) -            eqnncpy (&EQs[e], &EQs[nEQs-1], nVars); -          nEQs--; -          deleteVariable(i); -        } -       -        break; -      } -  } - -  // remove multi-wildcard equality in approximation mode -  if (inApproximateMode) -    for (int e = nEQs-1; e >= 0; e--) -      for (int i = nVars; i >= safeVars+1; i--) -        if (EQs[e].coef[i] != 0) { -          int j = i-1; -          for (; j >= safeVars+1; j--) -            if (EQs[e].coef[j] != 0) -              break; - -          if (j != safeVars) { -            if (e < nEQs-1) -              eqnncpy (&EQs[e], &EQs[nEQs-1], nVars); -            nEQs--; -          } -       -          break; -        } - -  if (renormalize) -    normalize(); -} - - -void Problem:: check() const { -#ifndef NDEBUG -  int v = nSUBs; -  checkVars(nVars+1); -  for(int i = 1; i <= safeVars; i++) if (var[i] > 0) v++; -  assert(v == varsOfInterest); -  for(int e = 0; e < nGEQs; e++) assert(GEQs[e].touched || GEQs[e].key != 0); -  if(!mayBeRed) { -    for(int e = 0; e < nEQs; e++) assert(!EQs[e].color); -    for(int e = 0; e < nGEQs; e++) assert(!GEQs[e].color); -  } -  else  -    for(int i = safeVars+1; i <= nVars; i++) { -      int isBlack = 0; -      int isRed = 0; -      for(int e = 0; e < nEQs; e++) -        if (EQs[e].coef[i]) { -          if (EQs[e].color) isRed = 1; -          else isBlack = 1; -        } -      for(int e = 0; e < nGEQs; e++) -        if (GEQs[e].coef[i]) { -          if (GEQs[e].color) isRed = 1; -          else isBlack = 1; -        } -      if (isBlack && isRed && 0) { -        fprintf(outputFile,"Mixed Red and Black variable:\n"); -        printProblem(); -      } -    } -#endif  -} - - -void Problem::rememberRedConstraint(eqn *e, redType type, coef_t stride) { -  // Check if this is really a stride constraint -  if (type == redEQ && newVar == nVars && e->coef[newVar]) { -    type = redStride; -    stride = e->coef[newVar]; -  } -  //   else for(int i = safeVars+1; i <= nVars; i++) assert(!e->coef[i]); // outdated -- by chun 10/30/2008 - -  assert(type != notRed); -  assert(type == redStride || stride == 0); - -  if (TRACE) { -    fprintf(outputFile,"being asked to remember red constraint:\n"); -    switch(type) { -    case notRed: fprintf(outputFile,"notRed: "); -      break; -    case redGEQ: fprintf(outputFile,"Red: 0 <= "); -      break; -    case redLEQ: fprintf(outputFile,"Red: 0 >= "); -      break; -    case redEQ: fprintf(outputFile,"Red: 0 == "); -      break; -    case redStride: fprintf(outputFile,"Red stride " coef_fmt ": ",stride); -      break; -    } -    printTerm(e,1); -    fprintf(outputFile,"\n"); -    printProblem(); -    fprintf(outputFile,"----\n"); -  } - -  // Convert redLEQ to redGEQ -  eqn mem; -  eqnncpy(&mem,e, nVars); -  e = &mem; -  if (type == redLEQ) { -    for(int i = 0; i <= safeVars; i++) -      e->coef[i] = -e->coef[i]; -    type = redGEQ; -  } - -  // Prepare coefficient array for red constraint -  bool has_wildcard = false; -  coef_t coef[varsOfInterest-nextWildcard+1]; -  for (int i = 0; i <= varsOfInterest-nextWildcard; i++) -    coef[i] = 0; -  for (int i = 0; i <= safeVars; i++) { -    if (var[i] < 0) { -      if (e->coef[i] != 0) { -        coef[varsOfInterest-var[i]] = e->coef[i]; -        has_wildcard = true; -      } -    } -    else -      coef[var[i]] = e->coef[i]; -  } - -  // Sophisticated back substituion for wildcards, use Gaussian elimination -  // as a fallback if no simple equations available. -- by chun 10/13/2008 -  if (has_wildcard) { -    // Find substitutions involving wildcard -    coef_t *repl_subs[nSUBs]; -    int num_wild_in_repl_subs[nSUBs]; -    int num_repl_subs = 0; -    for (int i = 0; i < nSUBs; i++) { -      int t = 0; -      for (int j = 1; j <= safeVars; j++) { -        if (var[j] < 0 && SUBs[i].coef[j] != 0) -          t++; -      } -      if (t > 0) { -        repl_subs[num_repl_subs] = new coef_t[varsOfInterest-nextWildcard+1]; -        for (int j = 0; j <= varsOfInterest-nextWildcard; j++) -          repl_subs[num_repl_subs][j] = 0; -       -        for (int k = 0; k <= safeVars; k++) -          repl_subs[num_repl_subs][(var[k]<0)?varsOfInterest-var[k]:var[k]] = SUBs[i].coef[k]; -        repl_subs[num_repl_subs][SUBs[i].key] = -1; -        num_wild_in_repl_subs[num_repl_subs] = t; -        num_repl_subs++; -      } -    } - -    int wild_solved[-nextWildcard+1]; -    bool has_unsolved = false; -    for (int i = 1; i <= -nextWildcard; i++) { -      int minimum_wild = 0; -      int pos; -      for (int j = 0; j < num_repl_subs; j++) -        if (repl_subs[j][varsOfInterest+i] != 0 && (minimum_wild == 0 || num_wild_in_repl_subs[j] < minimum_wild)) { -          minimum_wild = num_wild_in_repl_subs[j]; -          pos = j; -        } -     -      if (minimum_wild == 0) { -        wild_solved[i] = -1; -        if (coef[varsOfInterest+i] != 0) { -          fprintf(outputFile,"No feasible back substitutions available\n"); -          printProblem(); -          exit(1); -        } -      } -      else if (minimum_wild == 1) -        wild_solved[i] = pos; -      else { -        wild_solved[i] = -1; -        if (coef[varsOfInterest+i] != 0) -          has_unsolved = true; -      } -    } - -    // Gaussian elimination -    while (has_unsolved) { -      for (int i = 0; i < num_repl_subs; i++) -        if (num_wild_in_repl_subs[i] > 1) { -          for (int j = 1; j <= -nextWildcard; j++) { -            if (repl_subs[i][varsOfInterest+j] != 0 && wild_solved[j] >= 0) { -              int s = wild_solved[j]; -              coef_t l = lcm(abs(repl_subs[i][varsOfInterest+j]), abs(repl_subs[s][varsOfInterest+j])); -              coef_t scale_1 = l/abs(repl_subs[i][varsOfInterest+j]); -              coef_t scale_2 = l/abs(repl_subs[s][varsOfInterest+j]); -              int sign = ((repl_subs[i][varsOfInterest+j]>0)?1:-1) * ((repl_subs[s][varsOfInterest+j]>0)?1:-1); -              for (int k = 0; k <= varsOfInterest-nextWildcard; k++) -                repl_subs[i][k] = scale_1*repl_subs[i][k] - sign*scale_2*repl_subs[s][k]; -              num_wild_in_repl_subs[i]--; -            } -          } - -          if (num_wild_in_repl_subs[i] == 1) { -            for (int j = 1; j <= -nextWildcard; j++) -              if (repl_subs[i][varsOfInterest+j] != 0) { -                assert(wild_solved[j]==-1); -                wild_solved[j] = i; -                break; -              } -          } -          else if (num_wild_in_repl_subs[i] > 1) { -            int pos = 0; -            for (int j = 1; j <= -nextWildcard; j++) -              if (repl_subs[i][varsOfInterest+j] != 0) { -                pos = j; -                break; -              } -            assert(pos > 0); -               -            for (int j = i+1; j < num_repl_subs; j++) -              if (repl_subs[j][varsOfInterest+pos] != 0) { -                coef_t l = lcm(abs(repl_subs[i][varsOfInterest+pos]), abs(repl_subs[j][varsOfInterest+pos])); -                coef_t scale_1 = l/abs(repl_subs[i][varsOfInterest+pos]); -                coef_t scale_2 = l/abs(repl_subs[j][varsOfInterest+pos]); -                int sign = ((repl_subs[i][varsOfInterest+pos]>0)?1:-1) * ((repl_subs[j][varsOfInterest+pos]>0)?1:-1); -                for (int k = 0; k <= varsOfInterest-nextWildcard; k++) -                  repl_subs[j][k] = scale_2*repl_subs[j][k] - sign*scale_1*repl_subs[i][k]; - -                num_wild_in_repl_subs[j] = 0; -                int first_wild = 0; -                for (int k = 1; k <= -nextWildcard; k++) -                  if (repl_subs[j][varsOfInterest+k] != 0) { -                    num_wild_in_repl_subs[j]++; -                    first_wild = k; -                  } - -                if (num_wild_in_repl_subs[j] == 1) { -                  if (wild_solved[first_wild] < 0) -                    wild_solved[first_wild] = j; -                } -              } -          } -        } -       -      has_unsolved = false; -      for (int i = 1; i <= -nextWildcard; i++) -        if (coef[varsOfInterest+i] != 0 && wild_solved[i] < 0) { -          has_unsolved = true; -          break; -        } -    }           -               -    // Substitute all widecards in the red constraint -    for (int i = 1; i <= -nextWildcard; i++) { -      if (coef[varsOfInterest+i] != 0) { -        int s = wild_solved[i]; -        assert(s >= 0); -       -        coef_t l = lcm(abs(coef[varsOfInterest+i]), abs(repl_subs[s][varsOfInterest+i])); -        coef_t scale_1 = l/abs(coef[varsOfInterest+i]); -        coef_t scale_2 = l/abs(repl_subs[s][varsOfInterest+i]); -        int sign = ((coef[varsOfInterest+i]>0)?1:-1) * ((repl_subs[s][varsOfInterest+i]>0)?1:-1); -        for (int j = 0; j <= varsOfInterest-nextWildcard; j++) -          coef[j] = scale_1*coef[j] - sign*scale_2*repl_subs[s][j]; - -        if (scale_1 != 1) -          stride *= scale_1; -      } -    } - -    for (int i = 0; i < num_repl_subs; i++) -      delete []repl_subs[i]; -  } -   -  // Ready to insert into redMemory -  int m = nMemories++; -  redMemory[m].length = 0; -  redMemory[m].kind = type; -  redMemory[m].constantTerm = coef[0]; -  for(int i = 1; i <= varsOfInterest; i++) -    if (coef[i]) { -      int j = redMemory[m].length++; -      redMemory[m].coef[j] = coef[i]; -      redMemory[m].var[j] = i; -    } -  if (type == redStride) redMemory[m].stride = stride; -  if (DBUG) { -    fprintf(outputFile,"Red constraint remembered\n"); -    printProblem(); -  } -} - -void Problem::recallRedMemories() { -  if (nMemories) { -    if (TRACE) { -      fprintf(outputFile,"Recalling red memories\n"); -      printProblem(); -    } - -    eqn* e = 0; -    for(int m = 0; m < nMemories; m++) { -      switch(redMemory[m].kind) { -      case redGEQ: -      { -        int temporary_eqn = newGEQ(); -        e = &GEQs[temporary_eqn]; -        eqnnzero(e, nVars); -        e->touched = 1; -        break; -      } -      case redEQ: -      { -        int temporary_eqn = newEQ(); -        e = &EQs[temporary_eqn]; -        eqnnzero(e, nVars); -        break; -      } -      case redStride: -      { -        int temporary_eqn = newEQ(); -        e = &EQs[temporary_eqn]; -        eqnnzero(e, nVars); -        int i = addNewUnprotectedWildcard(); -        e->coef[i] = -redMemory[m].stride; -        break; -      } -      default: -        assert(0); -      } -      e->color = EQ_RED; -      e->coef[0] = redMemory[m].constantTerm; -      for(int i = 0; i < redMemory[m].length; i++) { -        int v = redMemory[m].var[i]; -        assert(var[forwardingAddress[v]] == v); -        e->coef[forwardingAddress[v]] = redMemory[m].coef[i]; -      } -    } -         -    nMemories = 0; -    if (TRACE) { -      fprintf(outputFile,"Red memories recalled\n"); -      printProblem(); -    } -  } -} - -void Problem::swapVars(int i, int j) { -  if (DEBUG) { -    use_ugly_names++; -    fprintf(outputFile, "Swapping %d and %d\n", i, j); -    printProblem(); -    use_ugly_names--; -  } -  std::swap(var[i], var[j]); -  for (int e = nGEQs - 1; e >= 0; e--) -    if (GEQs[e].coef[i] != GEQs[e].coef[j]) { -      GEQs[e].touched = true; -      coef_t t = GEQs[e].coef[i]; -      GEQs[e].coef[i] = GEQs[e].coef[j]; -      GEQs[e].coef[j] = t; -    } -  for (int e = nEQs - 1; e >= 0; e--) -    if (EQs[e].coef[i] != EQs[e].coef[j]) { -      coef_t t = EQs[e].coef[i]; -      EQs[e].coef[i] = EQs[e].coef[j]; -      EQs[e].coef[j] = t; -    } -  for (int e = nSUBs - 1; e >= 0; e--) -    if (SUBs[e].coef[i] != SUBs[e].coef[j]) { -      coef_t t = SUBs[e].coef[i]; -      SUBs[e].coef[i] = SUBs[e].coef[j]; -      SUBs[e].coef[j] = t; -    } -  if (DEBUG) { -    use_ugly_names++; -    fprintf(outputFile, "Swapping complete \n"); -    printProblem(); -    fprintf(outputFile, "\n"); -    use_ugly_names--; -  } -} - -void Problem::addingEqualityConstraint(int e) { -  if (addingOuterEqualities && originalProblem != noProblem && -      originalProblem != this && !conservative) { -    int e2 = originalProblem->newEQ(); -    if (TRACE) -      fprintf(outputFile, "adding equality constraint %d to outer problem\n", e2); -    eqnnzero(&originalProblem->EQs[e2], originalProblem->nVars); -    for (int i = nVars; i >= 1; i--) { -      int j; -      for (j = originalProblem->nVars; j >= 1; j--) -        if (originalProblem->var[j] == var[i]) -          break; -      if (j <= 0 || (outerColor && j > originalProblem->safeVars)) { -        if (DBUG) -          fprintf(outputFile, "retracting\n"); -        originalProblem->nEQs--; -        return; -      } -      originalProblem->EQs[e2].coef[j] = EQs[e].coef[i]; -    } -    originalProblem->EQs[e2].coef[0] = EQs[e].coef[0]; -  -    originalProblem->EQs[e2].color = outerColor; -    if (DBUG) -      originalProblem->printProblem(); -  } -} - - -// Initialize hash codes for inequalities, remove obvious redundancy. -// Case 1: -// a1*x1+a2*x2+...>=c  (1) -// a1*x2+a2*x2+...>=c' (2) -// if c>=c' then (2) is redundant, and vice versa. -// -// case 2: -// a1*x1+a2*x2+...>=c  (1) -// a1*x1+a2*x2+...<=c' (2) -// if c=c' then add equality of (1) or (2), -// if c>c' then no solution. -// -// Finally it calls extended normalize process which handles -// wildcards in redundacy removal. -normalizeReturnType Problem::normalize() { -  int i, j; -  bool coupledSubscripts = false; - -  check(); - -  for (int e = 0; e < nGEQs; e++) { -    if (!GEQs[e].touched) { -      if (!singleVarGEQ(&GEQs[e])) -        coupledSubscripts = true; -    } -    else { // normalize e -      coef_t g; -      int topVar; -      int i0; -      coef_t hashCode; - -      { -        int *p = &packing[0]; -        for (int k = 1; k <= nVars; k++) -          if (GEQs[e].coef[k]) { -            *(p++) = k; -          } -        topVar = (p - &packing[0]) - 1; -      } - -      if (topVar == -1) { -        if (GEQs[e].coef[0] < 0) { -          // e has no solution -          return (normalize_false); -        } -        deleteGEQ(e); -        e--; -        continue; -      } -      else if (topVar == 0) { -        int singleVar = packing[0]; -        g = GEQs[e].coef[singleVar]; -        if (g > 0) { -          GEQs[e].coef[singleVar] = 1; -          GEQs[e].key = singleVar; -        } -        else { -          g = -g; -          GEQs[e].coef[singleVar] = -1; -          GEQs[e].key = -singleVar; -        } -        if (g > 1) -          GEQs[e].coef[0] = int_div(GEQs[e].coef[0], g); -      } -      else { -        coupledSubscripts = true; -        i0 = topVar; -        i = packing[i0--]; -        g = GEQs[e].coef[i]; -        hashCode = g * (i + 3); -        if (g < 0) -          g = -g; -        for (; i0 >= 0; i0--) { -          coef_t x; -          i = packing[i0]; -          x = GEQs[e].coef[i]; -          hashCode = hashCode * keyMult * (i + 3) + x; -          if (x < 0) -            x = -x; -          if (x == 1) { -            g = 1; -            i0--; -            break; -          } -          else -            g = gcd(x, g); -        } -        for (; i0 >= 0; i0--) { -          coef_t x; -          i = packing[i0]; -          x = GEQs[e].coef[i]; -          hashCode = hashCode * keyMult * (i + 3) + x; -        } -        if (g > 1) { -          GEQs[e].coef[0] = int_div(GEQs[e].coef[0], g); -          i0 = topVar; -          i = packing[i0--]; -          GEQs[e].coef[i] = GEQs[e].coef[i] / g; -          hashCode = GEQs[e].coef[i] * (i + 3); -          for (; i0 >= 0; i0--) { -            i = packing[i0]; -            GEQs[e].coef[i] = GEQs[e].coef[i] / g; -            hashCode = hashCode * keyMult * (i + 3) + GEQs[e].coef[i]; -          } -        } - -        { -          coef_t g2 = abs(hashCode);  // get e's hash code -          j = static_cast<int>(g2 % static_cast<coef_t>(hashTableSize)); -          assert (g2 % (coef_t) hashTableSize == j); -          while (1) { -            eqn *proto = &(hashMaster[j]); -            if (proto->touched == g2) { -              if (proto->coef[0] == topVar) { -                if (hashCode >= 0) -                  for (i0 = topVar; i0 >= 0; i0--) { -                    i = packing[i0]; -                    if (GEQs[e].coef[i] != proto->coef[i]) -                      break; -                  } -                else -                  for (i0 = topVar; i0 >= 0; i0--) { -                    i = packing[i0]; -                    if (GEQs[e].coef[i] != -proto->coef[i]) -                      break; -                  } - -                if (i0 < 0) { -                  if (hashCode >= 0) -                    GEQs[e].key = proto->key; -                  else -                    GEQs[e].key = -proto->key; -                  break; -                } -              } -            } -            else if (proto->touched < 0) { //insert e into the empty entry in hash table -              eqnnzero(proto, nVars); -              if (hashCode >= 0) -                for (i0 = topVar; i0 >= 0; i0--) { -                  i = packing[i0]; -                  proto->coef[i] = GEQs[e].coef[i]; -                } -              else -                for (i0 = topVar; i0 >= 0; i0--) { -                  i = packing[i0]; -                  proto->coef[i] = -GEQs[e].coef[i]; -                } -              proto->coef[0] = topVar; -              proto->touched = g2; -              proto->key = nextKey++; - -              if (proto->key > maxKeys) { -                fprintf(outputFile, "too many hash keys generated \n"); -                fflush(outputFile); -                exit(2); -              } -              if (hashCode >= 0) -                GEQs[e].key = proto->key; -              else -                GEQs[e].key = -proto->key; -              break; -            } -            j = (j + 1) % hashTableSize; -          } -        } -      } -    } - -    GEQs[e].touched = false; - -    { -      int eKey = GEQs[e].key; -      int e2; -      if (e > 0) { -        e2 = fastLookup[maxKeys - eKey]; -        if (e2 >= 0 && e2 < e && GEQs[e2].key == -eKey) { -          // confirm it is indeed a match  -- by chun 10/29/2008 -          int k; -          for (k = nVars; k >= 1; k--) -            if (GEQs[e2].coef[k] != -GEQs[e].coef[k]) -              break; - -          if (k == 0) {     -            if (GEQs[e2].coef[0] < -GEQs[e].coef[0]) { -              // there is no solution from e and e2 -              return (normalize_false); -            } -            else if (GEQs[e2].coef[0] == -GEQs[e].coef[0]) { -              // reduce e and e2 to an equation -              int neweq = newEQ(); -              eqnncpy(&EQs[neweq], &GEQs[e], nVars); -              EQs[neweq].color = GEQs[e].color || GEQs[e2].color; -              addingEqualityConstraint(neweq); -            } -          } -        } - -        e2 = fastLookup[maxKeys + eKey]; -        if (e2 >= 0 && e2 < e && GEQs[e2].key == eKey) { -          // confirm it is indeed a match  -- by chun 10/29/2008 -          int k; -          for (k = nVars; k >= 1; k--) -            if (GEQs[e2].coef[k] != GEQs[e].coef[k]) -              break; -           -          if (k == 0) { -            if (GEQs[e2].coef[0] > GEQs[e].coef[0] || -                (GEQs[e2].coef[0] == GEQs[e].coef[0] && GEQs[e2].color)) { -              // e2 is redundant -              GEQs[e2].coef[0] = GEQs[e].coef[0]; -              GEQs[e2].color =  GEQs[e].color; -              deleteGEQ(e); -              e--; -              continue; -            } -            else { -              // e is redundant -              deleteGEQ(e); -              e--; -              continue; -            } -          } -        } -      } -      fastLookup[maxKeys + eKey] = e; -    } -  } - -  // bypass entended normalization for temporary problem -  if (!isTemporary && !inApproximateMode) -    normalize_ext(); -     -  return coupledSubscripts ? normalize_coupled : normalize_uncoupled; -} - -// -// Extended normalize process, remove redundancy involving wildcards. -// e.g. -// exists alpha, beta: -// v1+8*alpha<=v2<=15+8*alpha (1) -// v1+8*beta<=v2<=15+8*beta   (2) -// if there are no other inequalities involving alpha or beta, -// then either (1) or (2) is redundant.  Such case can't be simplified -// by fourier-motzkin algorithm due to special meanings of existentials. -// -void Problem::normalize_ext() { -  std::vector<BoolSet<> > disjoint_wildcards(nVars-safeVars, BoolSet<>(nVars-safeVars)); -  std::vector<BoolSet<> > wildcards_in_inequality(nVars-safeVars, BoolSet<>(nGEQs)); -  for (int i = 0; i < nVars-safeVars; i++) { -    disjoint_wildcards[i].set(i); -  } - -  // create disjoint wildcard sets according to inequalities -  for (int e = 0; e < nGEQs; e++) { -    std::vector<BoolSet<> >::iterator first_set = disjoint_wildcards.end(); -    for (int i = 0; i < nVars-safeVars; i++) -      if (GEQs[e].coef[i+safeVars+1] != 0) { -        wildcards_in_inequality[i].set(e); - -        std::vector<BoolSet<> >::iterator cur_set = disjoint_wildcards.end(); -        for (std::vector<BoolSet<> >::iterator j = disjoint_wildcards.begin(); j != disjoint_wildcards.end(); j++) -          if ((*j).get(i)) { -            cur_set = j; -            break; -          } -        assert(cur_set!=disjoint_wildcards.end()); -        if (first_set == disjoint_wildcards.end()) -          first_set = cur_set; -        else if (first_set != cur_set) { -          *first_set |= *cur_set; -          disjoint_wildcards.erase(cur_set); -        } -      } -  } - -  // do not consider wildcards appearing in equalities -  for (int e = 0; e < nEQs; e++) -    for (int i = 0; i < nVars-safeVars; i++) -      if (EQs[e].coef[i+safeVars+1] != 0) { -        for (std::vector<BoolSet<> >::iterator j = disjoint_wildcards.begin(); j != disjoint_wildcards.end(); j++) -          if ((*j).get(i)) { -            disjoint_wildcards.erase(j); -            break; -          } -      } -   -  // create disjoint inequality sets -  std::vector<BoolSet<> > disjoint_inequalities(disjoint_wildcards.size()); -  for (size_t i = 0; i < disjoint_wildcards.size(); i++) -    for (int j = 0; j < nVars-safeVars; j++) -      if (disjoint_wildcards[i].get(j)) -        disjoint_inequalities[i] |= wildcards_in_inequality[j]; - -  // hash the inequality again, this time separate wildcard variables from -  // regular variables -  coef_t hash_safe[nGEQs]; -  coef_t hash_wild[nGEQs]; -  for (int e = 0; e < nGEQs; e++) { -    coef_t hashCode = 0; -    for (int i = 1; i <= safeVars; i++) -      if (GEQs[e].coef[i] != 0) -        hashCode = hashCode * keyMult * (i+3) + GEQs[e].coef[i]; -    hash_safe[e] = hashCode; -     -    hashCode = 0; -    for (int i = safeVars+1; i <= nVars; i++) -      if (GEQs[e].coef[i] != 0) -        hashCode = hashCode * keyMult + GEQs[e].coef[i]; -    hash_wild[e] = hashCode; -  } - -  // sort hash keys for each disjoint set -  std::vector<std::vector<std::pair<int, std::pair<coef_t, coef_t> > > > disjoint_hash(disjoint_inequalities.size()); -  for (size_t i = 0; i < disjoint_inequalities.size(); i++) -    for (int e = 0; e < nGEQs; e++) -      if (disjoint_inequalities[i].get(e)) { -        std::vector<std::pair<int, std::pair<coef_t, coef_t> > >::iterator j = disjoint_hash[i].begin(); -        for (; j != disjoint_hash[i].end(); j++) -          if ((hash_safe[e] > (*j).second.first) || -              (hash_safe[e] == (*j).second.first && hash_wild[e] > (*j).second.second)) -            break; -        disjoint_hash[i].insert(j, std::make_pair(e, std::make_pair(hash_safe[e], hash_wild[e]))); -      } - -  // test wildcard equivalance -  std::vector<bool> is_dead(nGEQs, false); -  for (size_t i = 0; i < disjoint_wildcards.size(); i++) { -    if (disjoint_inequalities[i].num_elem() == 0) -      continue; -     -    for (size_t j = i+1; j < disjoint_wildcards.size(); j++) { -      if (disjoint_wildcards[i].num_elem() != disjoint_wildcards[j].num_elem() || -          disjoint_hash[i].size() != disjoint_hash[j].size()) -        continue; - -      bool match = true; -      for (size_t k = 0; k < disjoint_hash[i].size(); k++) { -        if (disjoint_hash[i][k].second != disjoint_hash[j][k].second) { -          match = false; -          break; -        } -      } -      if (!match) -        continue; -       -      // confirm same coefficients for regular variables -      for (size_t k = 0; k < disjoint_hash[i].size(); k++) { -        for (int p = 1; p <= safeVars; p++) -          if (GEQs[disjoint_hash[i][k].first].coef[p] != GEQs[disjoint_hash[j][k].first].coef[p]) { -            match = false; -            break; -          } -        if (!match) -          break; -      } -      if (!match) -        continue; - -      // now try combinatory wildcard matching -      std::vector<int> wild_map(nVars-safeVars, -1); -      for (size_t k = 0; k < disjoint_hash[i].size(); k++) { -        int e1 = disjoint_hash[i][k].first; -        int e2 = disjoint_hash[j][k].first; -         -        for (int p = 0; p < nVars-safeVars; p++) -          if (GEQs[e1].coef[p+safeVars+1] != 0) { -            if (wild_map[p] == -1) { -              for (int q = 0; q < nVars-safeVars; q++) -                if (wild_map[q] == -1 && -                    GEQs[e2].coef[q+safeVars+1] == GEQs[e1].coef[p+safeVars+1]) { -                  wild_map[p] = q; -                  wild_map[q] = p; -                  break; -                } -              if (wild_map[p] == -1) { -                match = false; -                break; -              } -            } -            else if (GEQs[e2].coef[wild_map[p]+safeVars+1] != GEQs[e1].coef[p+safeVars+1]) { -              match = false; -              break; -            }    -          }              -        if (!match) -          break; - -        for (int p = 0; p < nVars-safeVars; p++) -          if (GEQs[e2].coef[p+safeVars+1] != 0 && -              (wild_map[p] == -1 || GEQs[e2].coef[p+safeVars+1] != GEQs[e1].coef[wild_map[p]+safeVars+1])) { -            match = false; -            break; -          } -        if (!match) -          break; -      } -      if (!match) -        continue; - -      // check constants -      int dir = 0; -      for (size_t k = 0; k < disjoint_hash[i].size(); k++) { -        if (GEQs[disjoint_hash[i][k].first].coef[0] > GEQs[disjoint_hash[j][k].first].coef[0]) { -          if (dir == 0) -            dir = 1; -          else if (dir == -1) { -            match = false; -            break; -          } -        } -        else if (GEQs[disjoint_hash[i][k].first].coef[0] < GEQs[disjoint_hash[j][k].first].coef[0]) { -          if (dir == 0) -            dir = -1; -          else if (dir == 1) { -            match = false; -            break; -          } -        } -      } -      if (!match) -        continue; - -      // check redness -      int red_dir = 0; -      for (size_t k = 0; k < disjoint_hash[i].size(); k++) { -        if (GEQs[disjoint_hash[i][k].first].color > GEQs[disjoint_hash[j][k].first].color) { -          if (red_dir == 0) -            red_dir = 1; -          else if (red_dir == -1) { -            match = false; -            break; -          } -        } -        else if (GEQs[disjoint_hash[i][k].first].color < GEQs[disjoint_hash[j][k].first].color) { -          if (red_dir == 0) -            red_dir = -1; -          else if (red_dir == 1) { -            match = false; -            break; -          } -        } -      } -      if (!match) -        continue; -         -      // remove redundant inequalities -      if (dir == 1 || (dir == 0 && red_dir == 1)) { -        for (size_t k = 0; k < disjoint_hash[i].size(); k++) { -          GEQs[disjoint_hash[i][k].first].coef[0] = GEQs[disjoint_hash[j][k].first].coef[0]; -          GEQs[disjoint_hash[i][k].first].color = GEQs[disjoint_hash[j][k].first].color; -          is_dead[disjoint_hash[j][k].first] = true; -        } -      } -      else { -        for (size_t k = 0; k < disjoint_hash[i].size(); k++) { -          is_dead[disjoint_hash[j][k].first] = true; -        } -      } -    } -  } - -  // eliminate dead inequalities -  for (int e = nGEQs-1; e >= 0; e--) -    if (is_dead[e]) { -      deleteGEQ(e); -    } -} - - -void initializeOmega(void) { -  if (omegaInitialized) -    return; - -//   assert(sizeof(eqn)==sizeof(int)*(headerWords)+sizeof(coef_t)*(1+maxVars)); -  nextWildcard = 0; -  nextKey = maxVars + 1; -  for (int i = 0; i < hashTableSize; i++) -    hashMaster[i].touched = -1; - -  sprintf(wildName[1], "__alpha"); -  sprintf(wildName[2], "__beta"); -  sprintf(wildName[3], "__gamma"); -  sprintf(wildName[4], "__delta"); -  sprintf(wildName[5], "__tau"); -  sprintf(wildName[6], "__sigma"); -  sprintf(wildName[7], "__chi"); -  sprintf(wildName[8], "__omega"); -  sprintf(wildName[9], "__pi"); -  sprintf(wildName[10], "__ni"); -  sprintf(wildName[11], "__Alpha"); -  sprintf(wildName[12], "__Beta"); -  sprintf(wildName[13], "__Gamma"); -  sprintf(wildName[14], "__Delta"); -  sprintf(wildName[15], "__Tau"); -  sprintf(wildName[16], "__Sigma"); -  sprintf(wildName[17], "__Chi"); -  sprintf(wildName[18], "__Omega"); -  sprintf(wildName[19], "__Pi"); - -  omegaInitialized = 1; -} - -// -// This is experimental (I would say, clinical) fact: -// If the code below is removed then simplifyProblem cycles. -// -class brainDammage { -public: -  brainDammage(); -}; -  -brainDammage::brainDammage() { -  initializeOmega(); -} -  -static brainDammage Podgorny; - -} // namespace diff --git a/omega/omega_lib/src/omega_core/oc_solve.cc b/omega/omega_lib/src/omega_core/oc_solve.cc deleted file mode 100644 index c25b6d0..0000000 --- a/omega/omega_lib/src/omega_core/oc_solve.cc +++ /dev/null @@ -1,1378 +0,0 @@ -/***************************************************************************** - Copyright (C) 1994-2000 the Omega Project Team - Copyright (C) 2005-2011 Chun Chen - All Rights Reserved. - - Purpose: -   Solve ineqalities. - - Notes: - - History: -*****************************************************************************/ - -#include <omega/omega_core/oc_i.h> - -namespace omega { - -static int solveDepth = 0; -#define maxDead maxmaxGEQs - -int Problem::solve(int desiredResult) { -  assert(omegaInitialized); -  int result; - -  checkVars(nVars+1); -  assert(nVars >= safeVars); -  if (desiredResult != OC_SOLVE_SIMPLIFY) -    safeVars = 0; -   -  solveDepth++; -  if (solveDepth > 50) { -    fprintf(outputFile, "Solve depth = %d, inApprox = %d, aborting\n", solveDepth, inApproximateMode); -    printProblem(); -    fflush(outputFile); - -    if (solveDepth > 60) -      exit(2); -  } - -  check(); -  do { -    doItAgain = 0; -    check(); -    if (solveEQ() == false) { -      solveDepth--; -      return (false); -    } -    check(); -    if (!nGEQs) { -      result = true; -      nVars = safeVars; -      break; -    } -    else -      result = solveGEQ(desiredResult); -    check(); -  } -  while (doItAgain && desiredResult == OC_SOLVE_SIMPLIFY); -  solveDepth--; - -  return (result); -} - - -// Supporting functions of solveGEQ -int Problem::smoothWeirdEquations() { -  int e1, e2, e3, p, q, k; -  coef_t alpha, alpha1, alpha2, alpha3; -  coef_t c; -  int v; -  int result = 0; - -  for (e1 = nGEQs - 1; e1 >= 0; e1--) -    if (!GEQs[e1].color) { -      coef_t g = 999999; -      for (v = nVars; v >= 1; v--) -        if (GEQs[e1].coef[v] != 0 && abs(GEQs[e1].coef[v]) < g) -          g = abs(GEQs[e1].coef[v]); -      if (g > 20) { -        e3 = newGEQ();  /* Create a scratch GEQ,not part of the prob.*/ -        nGEQs--; -        for (v = nVars; v >= 1; v--) -          GEQs[e3].coef[v] = int_div(6 * GEQs[e1].coef[v] + g / 2, g); -        GEQs[e3].color = EQ_BLACK; -        GEQs[e3].touched = 1; -        GEQs[e3].coef[0] = 9997; -        if (DBUG) { -          fprintf(outputFile, "Checking to see if we can derive: "); -          printGEQ(&GEQs[e3]); -          fprintf(outputFile, "\n from: "); -          printGEQ(&GEQs[e1]); -          fprintf(outputFile, "\n"); -        } - - -        for (e2 = nGEQs - 1; e2 >= 0; e2--) -          if (e1 != e2 && !GEQs[e2].color) { -            for (p = nVars; p > 1; p--) { -              for (q = p - 1; q > 0; q--) { -                alpha = check_mul(GEQs[e1].coef[p], GEQs[e2].coef[q]) - check_mul(GEQs[e2].coef[p], GEQs[e1].coef[q]); -                if (alpha != 0) -                  goto foundPQ; -              } -            } -            continue; - -          foundPQ: - -            alpha1 = check_mul(GEQs[e2].coef[q], GEQs[e3].coef[p]) - check_mul(GEQs[e2].coef[p], GEQs[e3].coef[q]); -            alpha2 = -(check_mul(GEQs[e1].coef[q], GEQs[e3].coef[p]) - check_mul(GEQs[e1].coef[p], GEQs[e3].coef[q])); -            alpha3 = alpha; - -            if (alpha1 * alpha2 <= 0) -              continue; -            if (alpha1 < 0) { -              alpha1 = -alpha1; -              alpha2 = -alpha2; -              alpha3 = -alpha3; -            } -            if (alpha3 > 0) { -              /* Trying to prove e3 is redundant */ - -              /* verify alpha1*v1+alpha2*v2 = alpha3*v3 */ -              for (k = nVars; k >= 1; k--) -                if (check_mul(alpha3, GEQs[e3].coef[k]) -                    != check_mul(alpha1, GEQs[e1].coef[k]) + check_mul(alpha2, GEQs[e2].coef[k])) -                  goto nextE2; - -              c = check_mul(alpha1, GEQs[e1].coef[0]) + check_mul(alpha2, GEQs[e2].coef[0]); -              if (c < check_mul(alpha3, (GEQs[e3].coef[0] + 1))) -                GEQs[e3].coef[0] = int_div(c, alpha3); - -            } -          nextE2:; -          } -        if (GEQs[e3].coef[0] < 9997) { -          result++; -#if !defined NDEBUG -          int e4 =  -#endif -            newGEQ(); -#if !defined NDEBUG -          assert(e3 == e4); -#endif -          if (DBUG) { -            fprintf(outputFile, "Smoothing wierd equations; adding:\n"); -            printGEQ(&GEQs[e3]); -            fprintf(outputFile, "\nto:\n"); -            printProblem(); -            fprintf(outputFile, "\n\n"); -          } -        } -      } -    } -  return (result); -} - - -void Problem::analyzeElimination( -  int &v, -  int &darkConstraints, -  int &darkShadowFeasible, -  int &unit, -  coef_t ¶llelSplinters, -  coef_t &disjointSplinters, -  coef_t &lbSplinters, -  coef_t &ubSplinters, -  int ¶llelLB) { - -  parallelSplinters = (posInfinity);  // was MAXINT -  disjointSplinters = 0; -  lbSplinters = 0; -  ubSplinters = 0; - -  darkConstraints = 0; -  darkShadowFeasible = 1; -  coef_t maxUBc = 0; -  coef_t maxLBc = 0; -  int e,e2; -  unit = 0; -  int exact = 1; - -  for (e = nGEQs - 1; e >= 0; e--) { -    coef_t c = GEQs[e].coef[v]; - -    if (c < 0) { -      coef_t Lc, Uc, g, diff, grey; - -      set_max(maxUBc, -c); -      Uc = -c; -      for (e2 = nGEQs - 1; e2 >= 0; e2--) -        if (GEQs[e2].coef[v] > 0) { -          Lc = GEQs[e2].coef[v]; -          g = 0; -          grey = (Lc - 1) * (Uc - 1); - -          for (int j = nVars; j >= 1; j--) { -            coef_t diff = check_mul(Lc, GEQs[e].coef[j]) + check_mul(Uc, GEQs[e2].coef[j]); -            if (diff < 0) diff = -diff; -            g = gcd(g, diff); -            if (g == 1) -              break; -          } -          diff = check_mul(Lc, GEQs[e].coef[0]) + check_mul(Uc, GEQs[e2].coef[0]); -          if (g == 0) { -            if (diff < 0) { -              /* Real shadow must be true */ -              /* otherwise we would have found it during */ -              /* check for opposing constraints */ -              fprintf(outputFile, "Found conflicting constraints "); -              printGEQ(&GEQs[e]); -              fprintf(outputFile," and "); -              printGEQ(&GEQs[e2]); -              fprintf(outputFile,"\nin\n"); -              printProblem(); -              assert(diff >= 0);  -            } -            if (diff < grey) { -              darkShadowFeasible = 0; -              if (parallelSplinters > diff+1) { -                parallelSplinters = diff + 1; -                parallelLB = e2; -              } -            } -            else {/* dark shadow is true, don't need to worry about this constraint pair */ -            } -          } -          else { -            coef_t splinters= int_div(diff, g) - int_div(diff - grey, g); -            if (splinters) exact = 0; -            disjointSplinters += splinters; -            if (g > 1) unit++; -            darkConstraints++; -          } -        } -    } -    else if (c > 0) { -      set_max(maxLBc, c); -    } /* else -         darkConstraints++; */ -  } - -  if (darkShadowFeasible) { -    disjointSplinters++; -    ubSplinters++; -    lbSplinters++; -  } -  else disjointSplinters = (posInfinity);  // was MAXINT - - -  if (!darkShadowFeasible || !exact)  -    for (e = nGEQs - 1; e >= 0; e--) { -      coef_t c = GEQs[e].coef[v]; -      if (c < -1) { -        c = -c; -        ubSplinters += 1+(check_mul(c, maxLBc) - c - maxLBc) / maxLBc; -      } -      else if (c > 1) { -        lbSplinters += 1+ (check_mul(c, maxUBc) - c - maxUBc) / maxUBc; -      } -    } - -  if (DEBUG) { -    fprintf(outputFile,"analyzing elimination of %s(%d)\n",variable(v),v); -    if (darkShadowFeasible) -      fprintf(outputFile,"  # dark constraints = %d\n", darkConstraints); -    else  -      fprintf(outputFile,"  dark shadow obviously unfeasible\n"); - -    fprintf(outputFile," " coef_fmt " LB splinters\n", lbSplinters); -    fprintf(outputFile," " coef_fmt " UB splinters\n", ubSplinters); -    if (disjointSplinters != (posInfinity)) -      fprintf(outputFile," " coef_fmt " disjoint splinters\n", disjointSplinters); -    if (parallelSplinters != (posInfinity)) -      fprintf(outputFile," " coef_fmt " parallel splinters\n", parallelSplinters); -    fprintf(outputFile, "\n"); -    fprintf(outputFile," %3d unit score \n", unit); -  } -} - - -void Problem::partialElimination() { -  if (DBUG) { -    fprintf(outputFile, "Performing Partial elimination\n"); -    printProblem(); -  } -  int fv; -  if (0)  -    fv = 0; -  else -    fv = safeVars; -  bool somethingHappened = false; -  for (int i = nVars; i > fv; i--) { -    bool isDead[maxmaxGEQs]; -    int e; -    for (e = nGEQs-1; e >= 0; e--) isDead[e] = false; -    int deadEqns[maxDead]; -    int numDead = 0; -    for (int e1 = nGEQs-1; e1 >= 0; e1--) -      if (abs(GEQs[e1].coef[i]) == 1) { -        bool isGood = true; -        for (int e2 = nGEQs-1; e2 >= 0; e2--) -          if (check_mul(GEQs[e2].coef[i], GEQs[e1].coef[i]) < 0)  -            if (GEQs[e1].key != -GEQs[e2].key) { -              coef_t Uc = abs(GEQs[e2].coef[i]); -              for (int k = nVars; k > fv; k--) -                if (GEQs[e2].coef[k] + check_mul(GEQs[e1].coef[k], Uc) != 0) -                  isGood = false; -            } -        if (isGood) { -          somethingHappened = true; -          for (int e2 = nGEQs-1; e2 >= 0; e2--) -            if (check_mul(GEQs[e2].coef[i], GEQs[e1].coef[i]) < 0) { -              if (GEQs[e1].key != -GEQs[e2].key) { -                coef_t Uc = abs(GEQs[e2].coef[i]); -                int new_eqn; -                if (numDead == 0) { -                  new_eqn = newGEQ(); -                } -                else { -                  new_eqn = deadEqns[--numDead]; -                } -                isDead[new_eqn] = false; -                if (DBUG) { -                  fprintf(outputFile,"Eliminating constraint on %s\n", variable(i)); -                  fprintf(outputFile, "e1 = %d, e2 = %d, gen = %d\n", e1, e2, new_eqn); -                  printGEQ(&(GEQs[e1])); -                  fprintf(outputFile, "\n"); -                  printGEQ(&(GEQs[e2])); -                  fprintf(outputFile, "\n"); -                } - -                for (int k = nVars; k >= 0; k--) -                  GEQs[new_eqn].coef[k] = GEQs[e2].coef[k] + check_mul(GEQs[e1].coef[k], Uc); -                GEQs[new_eqn].touched = true; -                GEQs[new_eqn].color = GEQs[e2].color | GEQs[e1].color; -                if (DBUG) { -                  fprintf(outputFile, "give "); -                  printGEQ(&(GEQs[new_eqn])); -                  fprintf(outputFile, "\n"); -                } -                assert(GEQs[new_eqn].coef[i] == 0); -              } -            } -          deadEqns[numDead++] = e1; -          isDead[e1] = true; -          if (DEBUG) -            fprintf(outputFile, "Killed %d\n", e1); -        } -      } -    for (e = nGEQs - 1; e >= 0; e--) -      if (isDead[e]) { -        deleteGEQ(e); -      } -  } -  if (somethingHappened && DBUG) { -    fprintf(outputFile, "Result of Partial elimination\n"); -    printProblem(); -  } -} - - -int Problem:: solveGEQ(int desiredResult) { -  int i, j, k, e; -  int fv; -  int result; -  int coupledSubscripts; -  int eliminateAgain; -  int smoothed = 0; -  int triedEliminatingRedundant = 0; -  j = 0; - -  if (desiredResult != OC_SOLVE_SIMPLIFY) { -    nSUBs = 0; -    nMemories = 0; -    safeVars = 0; -    varsOfInterest = 0; -  } - -solveGEQstart: -  while (1) { -    assert(desiredResult == OC_SOLVE_SIMPLIFY || nSUBs == 0); -    check_number_GEQs(nGEQs); - -    if (DEBUG) { -      fprintf(outputFile, "\nSolveGEQ(%d,%d):\n", desiredResult, pleaseNoEqualitiesInSimplifiedProblems); -      printProblem(); -      fprintf(outputFile, "\n"); -    } - -#ifndef NDEBUG -    for(e=0;e<nSUBs;e++) -      for(i=safeVars+1;i<=nVars;i++) -        assert(!SUBs[e].coef[i]); -#endif - -    check(); - -    if (nVars == 1) { -      int uColor = EQ_BLACK; -      int lColor = EQ_BLACK; -      coef_t upperBound = posInfinity; -      coef_t lowerBound = negInfinity; -      for (e = nGEQs - 1; e >= 0; e--) { -        coef_t a = GEQs[e].coef[1]; -        coef_t c = GEQs[e].coef[0]; -        /* our equation is ax + c >= 0, or ax >= -c, or c >= -ax */ -        if (a == 0) { -          if (c < 0) { -            if (TRACE) -              fprintf(outputFile, "equations have no solution (G)\n"); -            return (false); -          } -        } -        else if (a > 0) { -          if (a != 1) -            c = int_div(c, a); -          if (lowerBound < -c || (lowerBound == -c && !isRed(&GEQs[e]))) { -            lowerBound = -c; -            lColor = GEQs[e].color; -          } -        } -        else { -          if (a != -1) -            c = int_div(c, -a); -          if (upperBound > c || (upperBound == c && !isRed(&GEQs[e]))) { -            upperBound = c; -            uColor = GEQs[e].color; -          } -        } -      } -      if (DEBUG) -        fprintf(outputFile, "upper bound = " coef_fmt "\n", upperBound); -      if (DEBUG) -        fprintf(outputFile, "lower bound = " coef_fmt "\n", lowerBound); -      if (lowerBound > upperBound) { -        if (TRACE) -          fprintf(outputFile, "equations have no solution (H)\n"); -        return (false); -      } -      if (desiredResult == OC_SOLVE_SIMPLIFY) { -        nGEQs = 0; -        if (safeVars == 1) { -          if (lowerBound == upperBound && !uColor && !lColor) { -            int e = newEQ(); -            assert(e == 0); -            EQs[e].coef[0] = -lowerBound; -            EQs[e].coef[1] = 1; -            EQs[e].color = lColor | uColor; -            return (solve(desiredResult)); -          } -          else { -            if (lowerBound > negInfinity) { -              int e = newGEQ(); -              assert(e == 0); -              GEQs[e].coef[0] = -lowerBound; -              GEQs[e].coef[1] = 1; -              GEQs[e].key = 1; -              GEQs[e].color = lColor; -              GEQs[e].touched = 0; -            } -            if (upperBound < posInfinity) { -              int e = newGEQ(); -              GEQs[e].coef[0] = upperBound; -              GEQs[e].coef[1] = -1; -              GEQs[e].key = -1; -              GEQs[e].color = uColor; -              GEQs[e].touched = 0; -            } -          } -        } -        else -          nVars = 0; -        return (true); -      } -      if (originalProblem != noProblem && !lColor && !uColor && !conservative && lowerBound == upperBound) { -        int e = newEQ(); -        assert(e == 0); -        EQs[e].coef[0] = -lowerBound; -        EQs[e].coef[1] = 1; -        EQs[e].color = EQ_BLACK; -        addingEqualityConstraint(0); -      } -      return (true); -    } - -    if (!variablesFreed) { -      variablesFreed = 1; -      if (desiredResult != OC_SOLVE_SIMPLIFY) -        freeEliminations(0); -      else -        freeEliminations(safeVars); -      if (nVars == 1) -        continue; -    } - -  -    switch (normalize()) { -    case normalize_false: -      return (false); -      break; -    case normalize_coupled: -      coupledSubscripts = true; -      break; -    case normalize_uncoupled: -      coupledSubscripts = false; -      break; -    default: -      coupledSubscripts = false; -      assert(0 && "impossible case in SolveGEQ"); -    } - - -    if ((doTrace && desiredResult == OC_SOLVE_SIMPLIFY) || DBUG) { -      fprintf(outputFile, "\nafter normalization:\n"); -      printProblem(); -      fprintf(outputFile, "\n"); -      for(e=0;e<nGEQs;e++) assert(!GEQs[e].touched); -      fprintf(outputFile, "eliminating variable using fourier-motzkin elimination\n"); -    } - -    // eliminating variable using fourier-motzkin elimination -    do { -      eliminateAgain = 0; - -      if (nEQs > 0) -        return (solve(desiredResult)); - -      if (!coupledSubscripts) { -        if (safeVars == 0) -          nGEQs = 0; -        else -          for (e = nGEQs - 1; e >= 0; e--) -            if (GEQs[e].key > safeVars || -safeVars > GEQs[e].key) -              deleteGEQ(e); -        nVars = safeVars; -        return (true); -      } - -      if (desiredResult != OC_SOLVE_SIMPLIFY) -        fv = 0; -      else -        fv = safeVars; - -      if (nVars == 0 || nGEQs == 0) { -        nGEQs = 0; -        if (desiredResult == OC_SOLVE_SIMPLIFY)  -          nVars = safeVars; -        return (true); -      } -      if (desiredResult == OC_SOLVE_SIMPLIFY && nVars == safeVars) { -        return (true); -      } - - -      if (nGEQs+6 > maxGEQs || nGEQs > 2 * nVars * nVars + 4 * nVars + 10) { -        if (TRACE) -          fprintf(outputFile, "TOO MANY EQUATIONS; %d equations, %d variables, ELIMINATING REDUNDANT ONES\n", nGEQs, nVars); -        if (!quickKill(0,true)) -          return 0; -        if (nEQs > 0) -          return (solve(desiredResult)); -        if (TRACE) -          fprintf(outputFile, "END ELIMINATION OF REDUNDANT EQUATIONS\n"); -        if (DBUG) printProblem(); -      } - - -      { -        int darkConstraints, darkShadowFeasible, unit, parallelLB; -        coef_t parallelSplinters, disjointSplinters, lbSplinters, ubSplinters, splinters; -        coef_t bestScore, score; -        int bestVar; -        int exact; -        int Ue,Le; - -        if (desiredResult != OC_SOLVE_SIMPLIFY) fv = 0; -        else fv = safeVars; - -        if (DEBUG) {  -          fprintf(outputFile,"Considering elimination possibilities[ \n"); -          printProblem(); -        } - -      analyzeGEQstart:         -        try { -          bestScore = posInfinity; -          bestVar = -1; -          for (i = nVars; i != fv; i--) { -            analyzeElimination(i, darkConstraints, darkShadowFeasible, unit, parallelSplinters, disjointSplinters, lbSplinters, ubSplinters, parallelLB); - -            score = min(min(parallelSplinters,disjointSplinters), -                        min(lbSplinters,ubSplinters)); -            exact = score == 1; -            score = 10000*(score-1) + darkConstraints; -            if (score >= posInfinity) // too big the score -              score = posInfinity - 1; -            score -= 3*unit; - -            if (score < bestScore) { -              bestScore = score; -              bestVar = i; -              if (i > 4 && score < nGEQs) break; -            } -          } -          assert(bestVar>=0); -          exact = bestScore < 10000; -          i = bestVar; -          assert(i<=nVars); -          analyzeElimination(i, darkConstraints, darkShadowFeasible, unit, parallelSplinters, disjointSplinters, lbSplinters, ubSplinters, parallelLB); -          if (DEBUG) {  -            fprintf(outputFile,"] Choose to eliminate %s \n",variable(i)); -          } -          splinters = lbSplinters; -          if (splinters <= parallelSplinters)  -            parallelSplinters = posInfinity; -          else splinters = parallelSplinters; -          if (disjointSplinters == 1) splinters = 1; -          exact = splinters == 1; -          if (inApproximateMode) exact = 1; -        } -        catch (std::overflow_error) { -          int result = quickKill(0, true); -          if (result == 0) -            return 0; -          else if (result == 1) -            return true; -          else { -            if (nEQs > 0) -              return (solve(desiredResult)); -            triedEliminatingRedundant = 1; -            goto analyzeGEQstart; -          } -        } - -        if (!triedEliminatingRedundant && darkConstraints > maxGEQs) { -          if (TRACE) -            fprintf(outputFile, "Elimination will create TOO MANY EQUATIONS; %d equations, %d variables, %d new constraints, ELIMINATING REDUNDANT ONES\n", nGEQs, nVars,darkConstraints); -          if (!quickKill(0)) -            return 0; -          if (nEQs > 0) -            return (solve(desiredResult)); -          if (TRACE) -            fprintf(outputFile, "END ELIMINATION OF REDUNDANT EQUATIONS\n"); -          if (DBUG) printProblem(); - -          triedEliminatingRedundant = 1; -          eliminateAgain = 1; -          continue; -        } - -        if (!exact && !triedEliminatingRedundant && -            safeVars > 0 && desiredResult == OC_SOLVE_SIMPLIFY) { -          if (TRACE) -            fprintf(outputFile, "Trying to produce exact elimination by finding redundant constraints [\n"); -          if (!quickKill(1)) return 0; -          if (TRACE) -            fprintf(outputFile, "]\n"); -          triedEliminatingRedundant = 1; -          eliminateAgain = 1; -          continue; -        } -        triedEliminatingRedundant = 0; - -        if (desiredResult == OC_SOLVE_SIMPLIFY && !exact) { -          partialElimination(); -          switch (normalize()) { -          case normalize_false: -            return (false); -            break; -          case normalize_coupled: -          case normalize_uncoupled: -            break; -          } -          if (nEQs) return solveEQ(); -          if (DBUG) fprintf(outputFile,"Stopping short due to non-exact elimination\n"); -          return (true); -        } - -        if ( desiredResult == OC_SOLVE_SIMPLIFY && darkConstraints > maxGEQs) { -          if (DBUG) fprintf(outputFile,"Stopping short due to overflow of GEQs: %d\n", darkConstraints); -          return (true); -        } - -        if ((doTrace && desiredResult == OC_SOLVE_SIMPLIFY) || DBUG) { -          fprintf(outputFile, "going to eliminate %s, (%d)\n", variable(i), i); -          if (DEBUG) -            printProblem(); -          fprintf(outputFile, "score = " coef_fmt "/" coef_fmt "\n", bestScore,splinters); -        } - -        if (!exact && desiredResult == OC_SOLVE_SIMPLIFY && parallelSplinters == splinters) { -          return parallelSplinter(parallelLB, parallelSplinters, desiredResult); -        } -         -       // smoothed = 0; // what a bug!!! -- by chun 6/10/2008 - -        if (i != nVars) { -          j = nVars; -          swapVars(i,j); - -          i = j; -        } -        else if (DEBUG) { -          printVars(); -          fprintf(outputFile, "No swap needed before eliminating %s(%d/%d)\n",variable(i),i,nVars); -          for(j=1;j<=i;j++) fprintf(outputFile,"var #%d = %s(%x)\n",j,variable(j),var[j]); -          printProblem(); -        } -        nVars--; - -        if (exact) { -          if (nVars == 1) { -            coef_t upperBound = posInfinity; -            coef_t lowerBound = negInfinity; -            int ub_color = 0; -            int lb_color = 0; -            coef_t constantTerm, coefficient; -            int topEqn = nGEQs - 1; -            coef_t Lc; -            for (Le = topEqn; Le >= 0; Le--) -              if ((Lc = GEQs[Le].coef[i]) == 0) { -                if (GEQs[Le].coef[1] == 1) { -                  constantTerm = -GEQs[Le].coef[0]; -                  if (constantTerm > lowerBound || (constantTerm == lowerBound && !isRed(&GEQs[Le]))) { -                    lowerBound = constantTerm; -                    lb_color = GEQs[Le].color; -                  } -                  if (DEBUG) { -                    if (GEQs[Le].color == EQ_BLACK) -                      fprintf(outputFile, " :::=> %s >= " coef_fmt "\n", variable(1), constantTerm); -                    else -                      fprintf(outputFile, " :::=> [%s >= " coef_fmt "]\n", variable(1), constantTerm); -                  } -                } -                else { -                  constantTerm = GEQs[Le].coef[0]; -                  if (constantTerm < upperBound || (constantTerm == upperBound && !isRed(&GEQs[Le]))) { -                    upperBound = constantTerm; -                    ub_color = GEQs[Le].color; -                  } -                  if (DEBUG) { -                    if (GEQs[Le].color == EQ_BLACK) -                      fprintf(outputFile, " :::=> %s <= " coef_fmt "\n", variable(1), constantTerm); -                    else -                      fprintf(outputFile, " :::=> [%s <= " coef_fmt "]\n", variable(1), constantTerm); -                  } -                } -              } -              else if (Lc > 0) { -                for (Ue = topEqn; Ue >= 0; Ue--) -                  if (GEQs[Ue].coef[i] < 0) { -                    if (GEQs[Le].key != -GEQs[Ue].key) { -                      coef_t Uc = -GEQs[Ue].coef[i]; -                      coefficient = check_mul(GEQs[Ue].coef[1], Lc) + check_mul(GEQs[Le].coef[1], Uc); -                      constantTerm = check_mul(GEQs[Ue].coef[0], Lc) + check_mul(GEQs[Le].coef[0], Uc); -                      if (DEBUG) { -                        printGEQextra(&(GEQs[Ue])); -                        fprintf(outputFile, "\n"); -                        printGEQextra(&(GEQs[Le])); -                        fprintf(outputFile, "\n"); -                      } -                      if (coefficient > 0) { -                        constantTerm = -(int_div(constantTerm, coefficient)); -                        /* assert(black == 0) */ -                        if (constantTerm > lowerBound || -                            (constantTerm == lowerBound && -                             (desiredResult != OC_SOLVE_SIMPLIFY || (GEQs[Ue].color == EQ_BLACK && GEQs[Le].color == EQ_BLACK)))) { -                          lowerBound = constantTerm; -                          lb_color = GEQs[Ue].color || GEQs[Le].color; -                        } -                        if (DEBUG) { -                          if (GEQs[Ue].color || GEQs[Le].color) -                            fprintf(outputFile, " ::=> [%s >= " coef_fmt "]\n", variable(1), constantTerm); -                          else -                            fprintf(outputFile, " ::=> %s >= " coef_fmt "\n", variable(1), constantTerm); -                        } -                      } -                      else if (coefficient < 0) { -                        constantTerm = (int_div(constantTerm, -coefficient)); -                        if (constantTerm < upperBound || -                            (constantTerm == upperBound && GEQs[Ue].color == EQ_BLACK && GEQs[Le].color == EQ_BLACK)) { -                          upperBound = constantTerm; -                          ub_color = GEQs[Ue].color || GEQs[Le].color; -                        } -                        if (DEBUG) { -                          if (GEQs[Ue].color || GEQs[Le].color) -                            fprintf(outputFile, " ::=> [%s <= " coef_fmt "]\n", variable(1), constantTerm); -                          else -                            fprintf(outputFile, " ::=> %s <= " coef_fmt "\n", variable(1), constantTerm); -                        } -                      } -                    } -                  } -              } -            nGEQs = 0; -            if (DEBUG) -              fprintf(outputFile, " therefore, %c" coef_fmt " <= %c%s%c <= " coef_fmt "%c\n", lb_color ? '[' : ' ', lowerBound, (lb_color && !ub_color) ? ']' : ' ', variable(1), (!lb_color && ub_color) ? '[' : ' ', upperBound, ub_color ? ']' : ' '); -            if (lowerBound > upperBound) -              return (false); -       -            if (upperBound == lowerBound) { -              int e = newEQ(); -              assert(e == 0); -              EQs[e].coef[1] = -1; -              EQs[e].coef[0] = upperBound; -              EQs[e].color = ub_color | lb_color; -              addingEqualityConstraint(0); -            } -            else if (safeVars == 1) { -              if (upperBound != posInfinity) { -                int e = newGEQ(); -                assert(e == 0); -                GEQs[e].coef[1] = -1; -                GEQs[e].coef[0] = upperBound; -                GEQs[e].color = ub_color; -                GEQs[e].key = -1; -                GEQs[e].touched = 0; -              } -              if (lowerBound != negInfinity) { -                int e = newGEQ(); -                GEQs[e].coef[1] = 1; -                GEQs[e].coef[0] = -lowerBound; -                GEQs[e].color = lb_color; -                GEQs[e].key = 1; -                GEQs[e].touched = 0; -              } -            } -            if (safeVars == 0)  -              nVars = 0; -            return (true); -          } -          eliminateAgain = 1; - -          { -            int deadEqns[maxDead]; -            int numDead = 0; -            int topEqn = nGEQs - 1; -            int lowerBoundCount = 0; -            for (Le = topEqn; Le >= 0; Le--) -              if (GEQs[Le].coef[i] > 0) -                lowerBoundCount++; -            if (DEBUG) -              fprintf(outputFile, "lower bound count = %d\n", lowerBoundCount); -            if (lowerBoundCount == 0) { -              if (desiredResult != OC_SOLVE_SIMPLIFY) fv = 0; -              else fv = safeVars; -              nVars++; -              freeEliminations(fv); -              continue; -            } -            for (Le = topEqn; Le >= 0; Le--) -              if (GEQs[Le].coef[i] > 0) { -                coef_t Lc = GEQs[Le].coef[i]; -                for (Ue = topEqn; Ue >= 0; Ue--) -                  if (GEQs[Ue].coef[i] < 0) { -                    if (GEQs[Le].key != -GEQs[Ue].key) { -                      coef_t Uc = -GEQs[Ue].coef[i]; -                      int e2; -                      if (numDead == 0) { -                        /*( Big kludge warning ) */ -                        /* this code is still using location nVars+1 */ -                        /* but newGEQ, if it reallocates, only copies*/ -                        /* locations up to nVars.  This fixes that.  */ -                        nVars++; -                        e2 = newGEQ(); -                        nVars--; -                      } -                      else { -                        e2 = deadEqns[--numDead]; -                      } -                      if (DEBUG) -                        fprintf(outputFile, "Le = %d, Ue = %d, gen = %d\n", Le, Ue, e2); -                      if (DEBUG) { -                        printGEQextra(&(GEQs[Le])); -                        fprintf(outputFile, "\n"); -                        printGEQextra(&(GEQs[Ue])); -                        fprintf(outputFile, "\n"); -                      } -                      eliminateAgain = 0; -                      coef_t g = gcd(Lc,Uc); -                      coef_t Lc_over_g = Lc/g; -                      coef_t Uc_over_g = Uc/g; - -                      for (k = nVars; k >= 0; k--) -                        GEQs[e2].coef[k] = -                          check_mul(GEQs[Ue].coef[k], Lc_over_g) + check_mul(GEQs[Le].coef[k], Uc_over_g); -                                  -                      GEQs[e2].coef[nVars + 1] = 0; -                      GEQs[e2].touched = true; -                      GEQs[e2].color = GEQs[Ue].color | GEQs[Le].color; -                       -                      if (DEBUG) { -                        printGEQ(&(GEQs[e2])); -                        fprintf(outputFile, "\n"); -                      } -                    } -                    if (lowerBoundCount == 1) { -                      deadEqns[numDead++] = Ue; -                      if (DEBUG) -                        fprintf(outputFile, "Killed %d\n", Ue); -                    } -                  } -                lowerBoundCount--; -                deadEqns[numDead++] = Le; -                if (DEBUG) -                  fprintf(outputFile, "Killed %d\n", Le); -              } - -            { -              int isDead[maxmaxGEQs]; -              for (e = nGEQs - 1; e >= 0; e--) -                isDead[e] = false; -              while (numDead > 0) { -                e = deadEqns[--numDead]; -                isDead[e] = true; -              } -              for (e = nGEQs - 1; e >= 0; e--) -                if (isDead[e]) { -                  nVars++; -                  deleteGEQ(e); -                  nVars--; -                } -            } -            continue; -          } -        } -        else { -          Problem *rS, *iS; - -          rS = new Problem; -          iS = new Problem; - -          iS->nVars = rS->nVars = nVars; // do this immed.; in case of reallocation, we -          // need to know how much to copy -          rS->get_var_name = get_var_name; -          rS->getVarNameArgs = getVarNameArgs; -          iS->get_var_name = get_var_name; -          iS->getVarNameArgs = getVarNameArgs; - -          for (e = 0; e < nGEQs; e++) -            if (GEQs[e].coef[i] == 0) { -              int re2 = rS->newGEQ(); -              int ie2 = iS->newGEQ(); -              eqnncpy(&(rS->GEQs[re2]), &GEQs[e], nVars); -              eqnncpy(&(iS->GEQs[ie2]), &GEQs[e], nVars); -              if (DEBUG) { -                int t; -                fprintf(outputFile, "Copying (%d, " coef_fmt "): ", i, GEQs[e].coef[i]); -                printGEQextra(&GEQs[e]); -                fprintf(outputFile, "\n"); -                for (t = 0; t <= nVars + 1; t++) -                  fprintf(outputFile, coef_fmt " ", GEQs[e].coef[t]); -                fprintf(outputFile, "\n"); -              } -            } -          for (Le = nGEQs - 1; Le >= 0; Le--) -            if (GEQs[Le].coef[i] > 0) { -              coef_t Lc = GEQs[Le].coef[i]; -              for (Ue = nGEQs - 1; Ue >= 0; Ue--) -                if (GEQs[Ue].coef[i] < 0) -                  if (GEQs[Le].key != -GEQs[Ue].key) { -                    coef_t Uc = -GEQs[Ue].coef[i]; -                    coef_t g = gcd(Lc,Uc); -                    coef_t Lc_over_g = Lc/g; -                    coef_t Uc_over_g = Uc/g; -                    int re2 = rS->newGEQ(); -                    int ie2 = iS->newGEQ(); -                    rS->GEQs[re2].touched = iS->GEQs[ie2].touched = true; -                    if (DEBUG) { -                      fprintf(outputFile, "---\n"); -                      fprintf(outputFile, "Le(Lc) = %d(" coef_fmt "), Ue(Uc) = %d(" coef_fmt "), gen = %d\n", Le, Lc, Ue, Uc, ie2); -                      printGEQextra(&GEQs[Le]); -                      fprintf(outputFile, "\n"); -                      printGEQextra(&GEQs[Ue]); -                      fprintf(outputFile, "\n"); -                    } - -                    if (Uc == Lc) { -                      for (k = nVars; k >= 0; k--) -                        iS->GEQs[ie2].coef[k] = rS->GEQs[re2].coef[k] = -                          GEQs[Ue].coef[k] + GEQs[Le].coef[k]; -                      iS->GEQs[ie2].coef[0] -= (Uc - 1); -                    } -                    else { -                      for (k = nVars; k >= 0; k--) -                        iS->GEQs[ie2].coef[k] = rS->GEQs[re2].coef[k] = -                          check_mul(GEQs[Ue].coef[k], Lc_over_g) + check_mul(GEQs[Le].coef[k], Uc_over_g); -                      iS->GEQs[ie2].coef[0] -= check_mul(Uc_over_g-1, Lc_over_g-1); -                    } - -                    iS->GEQs[ie2].color = rS->GEQs[re2].color -                      = GEQs[Ue].color || GEQs[Le].color; - -                    if (DEBUG) { -                      printGEQ(&(rS->GEQs[re2])); -                      fprintf(outputFile, "\n"); -                    } -                    //        ie2 = iS->newGEQ(); -                    //        re2 = rS->newGEQ(); -                  } - -            } -          iS->variablesInitialized = rS->variablesInitialized = 1; -          iS->nEQs = rS->nEQs = 0; -          assert(desiredResult != OC_SOLVE_SIMPLIFY); -          assert(nSUBs == 0); -          iS->nSUBs = rS->nSUBs = nSUBs; -          iS->safeVars = rS->safeVars = safeVars; -          int t; -          for (t = nVars; t >= 0; t--) -            rS->var[t] = var[t]; -          for (t = nVars; t >= 0; t--) -            iS->var[t] = var[t]; -          nVars++; -          if (desiredResult != true) { -            int t = trace; -            if (TRACE) -              fprintf(outputFile, "\nreal solution(%d):\n", depth); -            depth++; -            trace = 0; -            if (originalProblem == noProblem) { -              originalProblem = this; -              result = rS->solveGEQ(false); -              originalProblem = noProblem; -            } -            else -              result = rS->solveGEQ(false); -            trace = t; -            depth--; -            if (result == false) { -              delete rS; -              delete iS; -              return (result); -            } - -            if (nEQs > 0) { -              /* An equality constraint must have been found */ -              delete rS; -              delete iS; -              return (solve(desiredResult)); -            } -          } -          if (desiredResult != false) { -            if (darkShadowFeasible) { -              if (TRACE) -                fprintf(outputFile, "\ninteger solution(%d):\n", depth); -              depth++; -              conservative++; -              result = iS->solveGEQ(desiredResult); -              conservative--; -              depth--; -              if (result != false) { -                delete rS; -                delete iS; -                return (result); -              } -            } -            if (TRACE) -              fprintf(outputFile, "have to do exact analysis\n"); -             -            { -              coef_t worstLowerBoundConstant=1; -              int lowerBounds = 0; -              int lowerBound[maxmaxGEQs]; -              int smallest; -              int t; -              conservative++; -              for (e = 0; e < nGEQs; e++) -                if (GEQs[e].coef[i] < -1) { -                  set_max(worstLowerBoundConstant, -                          -GEQs[e].coef[i]); -                } -                else if (GEQs[e].coef[i] > 1) -                  lowerBound[lowerBounds++] = e; -              /* sort array */ -              for (j = 0; j < lowerBounds; j++) { -                smallest = j; -                for (k = j + 1; k < lowerBounds; k++) -                  if (GEQs[lowerBound[smallest]].coef[i] > GEQs[lowerBound[k]].coef[i]) -                    smallest = k; -                t = lowerBound[smallest]; -                lowerBound[smallest] = lowerBound[j]; -                lowerBound[j] = t; -              } -              if (DEBUG) { -                fprintf(outputFile, "lower bound coeeficients = "); -                for (j = 0; j < lowerBounds; j++) -                  fprintf(outputFile, " " coef_fmt, GEQs[lowerBound[j]].coef[i]); -                fprintf(outputFile, "\n"); -              } - - -              for (j = 0; j < lowerBounds; j++) { -                coef_t maxIncr; -                coef_t c; -                e = lowerBound[j]; -                maxIncr = (check_mul(GEQs[e].coef[i]-1, worstLowerBoundConstant-1) - 1) / worstLowerBoundConstant; - -                /* maxIncr += 2; */ -                if ((doTrace && desiredResult == OC_SOLVE_SIMPLIFY) || DBUG) { -                  fprintf(outputFile, "for equation "); -                  printGEQ(&GEQs[e]); -                  fprintf(outputFile, "\ntry decrements from 0 to " coef_fmt "\n", maxIncr); -                  printProblem(); -                } -                if (maxIncr > 50) { -                  if (!smoothed && smoothWeirdEquations()) { -                    conservative--; -                    delete rS; -                    delete iS; -                    smoothed = 1; -                    goto solveGEQstart; -                  } -                } -                int neweq = newEQ(); -                assert(neweq == 0); -                eqnncpy(&EQs[neweq], &GEQs[e], nVars); -                /* -                 * if (GEQs[e].color) fprintf(outputFile,"warning: adding black equality constraint -                 * based on red inequality\n"); -                 */ -                EQs[neweq].color = EQ_BLACK; -                eqnnzero(&GEQs[e], nVars); -                GEQs[e].touched = true; -                for (c = maxIncr; c >= 0; c--) { -                  if (DBUG) -                    fprintf(outputFile, "trying next decrement of " coef_fmt "\n", maxIncr - c); -                  if (DBUG) -                    printProblem(); -                  *rS = *this; -                  if (DEBUG) -                    rS->printProblem(); -                  result = rS->solve(desiredResult); -                  if (result == true) { -                    delete rS; -                    delete iS; -                    conservative--; -                    return (true); -                  } -                  EQs[0].coef[0]--; -                } -                if (j + 1 < lowerBounds) { -                  nEQs = 0; -                  eqnncpy(&GEQs[e], &EQs[0], nVars); -                  GEQs[e].touched = 1; -                  GEQs[e].color = EQ_BLACK; -                  *rS = *this; -                  if (DEBUG) -                    fprintf(outputFile, "exhausted lower bound, checking if still feasible "); -                  result = rS->solve(false); -                  if (result == false) -                    break; -                } -              } -              if ((doTrace && desiredResult == OC_SOLVE_SIMPLIFY) || DBUG) -                fprintf(outputFile, "fall-off the end\n"); -              delete rS; -              delete iS; - -              conservative--; -              return (false); -            } -          } -          delete rS; -          delete iS; -        } -        return (OC_SOLVE_UNKNOWN); -      } -    } -    while (eliminateAgain); -  } -} - - -int Problem::parallelSplinter(int e, int diff, int desiredResult) { -  Problem *tmpProblem; -  int i; -  if (DBUG) { -    fprintf(outputFile, "Using parallel splintering\n"); -    printProblem(); -  } -  tmpProblem = new Problem; -  int neweq = newEQ(); -  assert(neweq == 0); -  eqnncpy(&EQs[0], &GEQs[e], nVars); -  for (i = 0; i <= diff; i++) { -    *tmpProblem = * this; -    tmpProblem->isTemporary = true; -    if (DBUG) { -      fprintf(outputFile, "Splinter # %i\n", i); -      printProblem(); -    } -    if (tmpProblem->solve(desiredResult)) { -      delete tmpProblem; -      return true; -    } -    EQs[0].coef[0]--; -  } -  delete tmpProblem; -  return false; -} - - -int Problem::verifyProblem() { -  int result; -  int e; -  int areRed; -  check(); -  Problem tmpProblem(*this); -  tmpProblem.varsOfInterest  = 0; -  tmpProblem.safeVars = 0; -  tmpProblem.nSUBs = 0; -  tmpProblem.nMemories = 0; -  tmpProblem.isTemporary = true; -  areRed = 0; -  if (mayBeRed) { -    for(e=0; e<nEQs;  e++) if (EQs[e].color) areRed = 1; -    for(e=0; e<nGEQs; e++) if (GEQs[e].color) areRed = 1; -    if (areRed) tmpProblem.turnRedBlack(); -  } -  originalProblem = this; -  assert(!outerColor); -  outerColor = areRed; -  if (TRACE) { -    fprintf(outputFile, "verifying problem: [\n"); -    printProblem(); -  } -  tmpProblem.check(); -  tmpProblem.freeEliminations(0); -  result = tmpProblem.solve(OC_SOLVE_UNKNOWN); -  originalProblem = noProblem; -  outerColor = 0; -  if (TRACE) { -    if (result) -      fprintf(outputFile, "] verified problem\n"); -    else -      fprintf(outputFile, "] disproved problem\n"); -    printProblem(); -  } -  check(); -  return result; -} - - -void Problem:: freeEliminations(int fv) { -  int tryAgain = 1; -  int i, e, e2; -  while (tryAgain) { -    tryAgain = 0; -    for (i = nVars; i > fv; i--) { -      for (e = nGEQs - 1; e >= 0; e--) -        if (GEQs[e].coef[i]) -          break; -      if (e < 0) -        e2 = e; -      else if (GEQs[e].coef[i] > 0) { -        for (e2 = e - 1; e2 >= 0; e2--) -          if (GEQs[e2].coef[i] < 0) -            break; -      } -      else { -        for (e2 = e - 1; e2 >= 0; e2--) -          if (GEQs[e2].coef[i] > 0) -            break; -      } -      if (e2 < 0) { -        int e3; -        for (e3 = nSUBs - 1; e3 >= 0; e3--) -          if (SUBs[e3].coef[i]) -            break; -        if (e3 >= 0) -          continue; -        for (e3 = nEQs - 1; e3 >= 0; e3--) -          if (EQs[e3].coef[i]) -            break; -        if (e3 >= 0) -          continue; -        if (DBUG) -          fprintf(outputFile, "a free elimination of %s (%d)\n", variable(i),e); -        if (e >= 0) { -          deleteGEQ(e); -          for (e--; e >= 0; e--) -            if (GEQs[e].coef[i]) { -              deleteGEQ(e); -            } -          tryAgain = (i < nVars); -        } -        deleteVariable(i); -      } -    } -  } - -  if (DEBUG) { -    fprintf(outputFile, "\nafter free eliminations:\n"); -    printProblem(); -    fprintf(outputFile, "\n"); -  } -} - - -void Problem::freeRedEliminations() { -  int tryAgain = 1; -  int i, e, e2; -  int isRedVar[maxVars]; -  int isDeadVar[maxVars]; -  int isDeadGEQ[maxmaxGEQs]; -  for (i = nVars; i > 0; i--) { -    isRedVar[i] = 0; -    isDeadVar[i] = 0; -  } -  for (e = nGEQs - 1; e >= 0; e--) { -    isDeadGEQ[e] = 0; -    if (GEQs[e].color) -      for (i = nVars; i > 0; i--) -        if (GEQs[e].coef[i] != 0) -          isRedVar[i] = 1; -  } - -  while (tryAgain) { -    tryAgain = 0; -    for (i = nVars; i > 0; i--) -      if (!isRedVar[i] && !isDeadVar[i]) { -        for (e = nGEQs - 1; e >= 0; e--) -          if (!isDeadGEQ[e] && GEQs[e].coef[i]) -            break; -        if (e < 0) -          e2 = e; -        else if (GEQs[e].coef[i] > 0) { -          for (e2 = e - 1; e2 >= 0; e2--) -            if (!isDeadGEQ[e2] && GEQs[e2].coef[i] < 0) -              break; -        } -        else { -          for (e2 = e - 1; e2 >= 0; e2--) -            if (!isDeadGEQ[e2] && GEQs[e2].coef[i] > 0) -              break; -        } -        if (e2 < 0) { -          int e3; -          for (e3 = nSUBs - 1; e3 >= 0; e3--) -            if (SUBs[e3].coef[i]) -              break; -          if (e3 >= 0) -            continue; -          for (e3 = nEQs - 1; e3 >= 0; e3--) -            if (EQs[e3].coef[i]) -              break; -          if (e3 >= 0) -            continue; -          if (DBUG) -            fprintf(outputFile, "a free red elimination of %s\n", variable(i)); -          for (; e >= 0; e--) -            if (GEQs[e].coef[i]) -              isDeadGEQ[e] = 1; -          tryAgain = 1; -          isDeadVar[i] = 1; -        } -      } -  } - -  for (e = nGEQs - 1; e >= 0; e--) -    if (isDeadGEQ[e]) -      deleteGEQ(e); - -  for (i = nVars; i > safeVars; i--) -    if (isDeadVar[i]) -      deleteVariable(i); - - -  if (DEBUG) { -    fprintf(outputFile, "\nafter free red eliminations:\n"); -    printProblem(); -    fprintf(outputFile, "\n"); -  } -} - -} // namespace diff --git a/omega/omega_lib/src/omega_core/oc_util.cc b/omega/omega_lib/src/omega_core/oc_util.cc deleted file mode 100644 index a7d21be..0000000 --- a/omega/omega_lib/src/omega_core/oc_util.cc +++ /dev/null @@ -1,327 +0,0 @@ -/***************************************************************************** - Copyright (C) 1994-2000 the Omega Project Team - Copyright (C) 2005-2011 Chun Chen - All Rights Reserved. - - Purpose: - - Notes: - - History: -*****************************************************************************/ - -#include <omega/omega_core/oc_i.h> -#include <algorithm> - -namespace omega { - -void Problem:: problem_merge(Problem &p2) { -  int newLocation[maxVars]; -  int i,e2; - -  resurrectSubs(); -  p2.resurrectSubs(); -  setExternals(); -  p2.setExternals(); - -  assert(safeVars == p2.safeVars); -  if(DBUG) { -    fprintf(outputFile,"Merging:\n"); -    printProblem(); -    fprintf(outputFile,"and\n"); -    p2.printProblem(); -  } -  for(i=1; i<= p2.safeVars; i++) { -    assert(p2.var[i] > 0) ; -    newLocation[i] = forwardingAddress[p2.var[i]]; -  } -  for(; i<= p2.nVars; i++) { -    int j = ++(nVars); -    newLocation[i] = j; -    zeroVariable(j); -    var[j] = -1; -  } -  newLocation[0] = 0; -      -  for (e2 = p2.nEQs - 1; e2 >= 0; e2--) { -    int e1 = newEQ(); -    eqnnzero(&(EQs[e1]), nVars); -    for(i=0;i<=p2.nVars;i++)  -      EQs[e1].coef[newLocation[i]] = p2.EQs[e2].coef[i]; -  } -  for (e2 = p2.nGEQs - 1; e2 >= 0; e2--) { -    int e1 = newGEQ(); -    eqnnzero(&(GEQs[e1]), nVars); -    GEQs[e1].touched = 1; -    for(i=0;i<=p2.nVars;i++)  -      GEQs[e1].coef[newLocation[i]] = p2.GEQs[e2].coef[i];  -  } -  int w = -1;  -  for (i = 1; i <= nVars; i++)  -    if (var[i] < 0)  var[i] = w--;  -  if(DBUG) { -    fprintf(outputFile,"to get:\n"); -    printProblem(); -  } -} - - - -void Problem::chainUnprotect() { -  int i, e; -  int unprotect[maxVars]; -  int any = 0; -  for (i = 1; i <= safeVars; i++) { -    unprotect[i] = (var[i] < 0); -    for (e = nSUBs - 1; e >= 0; e--) -      if (SUBs[e].coef[i]) -        unprotect[i] = 0; -  } -  for (i = 1; i <= safeVars; i++) if (unprotect[i]) any=1; -  if (!any) return; - -  if (DBUG) { -    fprintf(outputFile, "Doing chain reaction unprotection\n"); -    printProblem(); -    for (i = 1; i <= safeVars; i++) -      if (unprotect[i]) -        fprintf(outputFile, "unprotecting %s\n", variable(i)); -  } -  for (i = 1; i <= safeVars; i++) -    if (unprotect[i]) { -      /* wild card */ -      if (i < safeVars) { -        int j = safeVars; -        std::swap(var[i], var[j]); -        for (e = nGEQs - 1; e >= 0; e--) { -          GEQs[e].touched = 1; -          std::swap(GEQs[e].coef[i], GEQs[e].coef[j]); -        } -        for (e = nEQs - 1; e >= 0; e--) -          std::swap(EQs[e].coef[i], EQs[e].coef[j]); -        for (e = nSUBs - 1; e >= 0; e--) -          std::swap(SUBs[e].coef[i], SUBs[e].coef[j]); -        std::swap(unprotect[i], unprotect[j]); -        i--; -      } -      safeVars--; -    } -  if (DBUG) { -    fprintf(outputFile, "After chain reactions\n"); -    printProblem(); -  } -} - -void Problem::resurrectSubs() { -  if (nSUBs > 0 && !pleaseNoEqualitiesInSimplifiedProblems) { -    int i, e, n, m,mbr; -    mbr = 0; -    for (e = nGEQs - 1; e >= 0; e--) if (GEQs[e].color) mbr=1; -    for (e = nEQs - 1; e >= 0; e--) if (EQs[e].color) mbr=1; -    if (nMemories) mbr = 1; - -    assert(!mbr || mayBeRed); -     -    if (DBUG) { -      fprintf(outputFile, "problem reduced, bringing variables back to life\n"); -      if(mbr && !mayBeRed) fprintf(outputFile, "Red equations we don't expect\n"); -      printProblem(); -    } -    if (DBUG && nEQs > 0) -      fprintf(outputFile,"This is wierd: problem has equalities\n");  - -    for (i = 1; i <= safeVars; i++) -      if (var[i] < 0) { -        /* wild card */ -        if (i < safeVars) { -          int j = safeVars; -          std::swap(var[i], var[j]); -          for (e = nGEQs - 1; e >= 0; e--) { -            GEQs[e].touched = 1; -            std::swap(GEQs[e].coef[i], GEQs[e].coef[j]); -          } -          for (e = nEQs - 1; e >= 0; e--) -            std::swap(EQs[e].coef[i], EQs[e].coef[j]); -          for (e = nSUBs - 1; e >= 0; e--) -            std::swap(SUBs[e].coef[i], SUBs[e].coef[j]); -          i--; -        } -        safeVars--; -      } - -    m = nSUBs; -    n = nVars; -    if (n < safeVars + m) -      n = safeVars + m; -    for (e = nGEQs - 1; e >= 0; e--) { -      if (singleVarGEQ(&GEQs[e])) { -        i = abs(GEQs[e].key); -        if (i >= safeVars + 1) -          GEQs[e].key += (GEQs[e].key > 0 ? m : -m); -      } -      else { -        GEQs[e].touched = true; -        GEQs[e].key = 0; -      } -    } -    for (i = nVars; i >= safeVars + 1; i--) { -      var[i + m] = var[i]; -      for (e = nGEQs - 1; e >= 0; e--) -        GEQs[e].coef[i + m] = GEQs[e].coef[i]; -      for (e = nEQs - 1; e >= 0; e--) -        EQs[e].coef[i + m] = EQs[e].coef[i]; -      for (e = nSUBs - 1; e >= 0; e--) -        SUBs[e].coef[i + m] = SUBs[e].coef[i]; -    } -    for (i = safeVars + m; i >= safeVars + 1; i--) { -      for (e = nGEQs - 1; e >= 0; e--) GEQs[e].coef[i] = 0; -      for (e = nEQs - 1; e >= 0; e--) EQs[e].coef[i] = 0; -      for (e = nSUBs - 1; e >= 0; e--) SUBs[e].coef[i] = 0; -    } -    nVars += m; -    safeVars += m; -    for (e = nSUBs - 1; e >= 0; e--)   -      var[safeVars -m + 1 + e] = SUBs[e].key; -    for (i = 1; i <= safeVars; i++) -      forwardingAddress[var[i]] = i; -    if (DBUG) { -      fprintf(outputFile,"Ready to wake substitutions\n"); -      printProblem(); -    } -    for (e = nSUBs - 1; e >= 0; e--) { -      int neweq = newEQ(); -      eqnncpy(&(EQs[neweq]), &(SUBs[e]), nVars); -      EQs[neweq].coef[safeVars -m + 1 + e] = -1; -      EQs[neweq].color = EQ_BLACK; -      if (DBUG) { -        fprintf(outputFile, "brought back: "); -        printEQ(&EQs[neweq]); -        fprintf(outputFile, "\n"); -      } -    } -    nSUBs = 0; - -    if (DBUG) { -      fprintf(outputFile, "variables brought back to life\n"); -      printProblem(); -    } -  } -   -  coalesce(); -  recallRedMemories(); -  cleanoutWildcards(); -} - - -void Problem::reverseProtectedVariables() { -  int v1,v2,e,i; -  coef_t t; -  for (v1 = 1; v1 <= safeVars; v1++) { -    v2 = safeVars+1-v1; -    if (v2>=v1) break; -    for(e=0;e<nEQs;e++) { -      t = EQs[e].coef[v1]; -      EQs[e].coef[v1] = EQs[e].coef[v2]; -      EQs[e].coef[v2] = t; -    } -    for(e=0;e<nGEQs;e++) { -      t = GEQs[e].coef[v1]; -      GEQs[e].coef[v1] = GEQs[e].coef[v2]; -      GEQs[e].coef[v2] = t; -      GEQs[e].touched = 1; -    } -    for(e=0;e<nSUBs;e++) { -      t = SUBs[e].coef[v1]; -      SUBs[e].coef[v1] = SUBs[e].coef[v2]; -      SUBs[e].coef[v2] = t; -    } -  } - -  for (i = 1; i <= safeVars; i++) -    forwardingAddress[var[i]] = i; -  for (i = 0; i < nSUBs; i++) -    forwardingAddress[SUBs[i].key] = -i - 1; -} - -void Problem::ordered_elimination(int symbolic) { -  int i,j,e; -  int isDead[maxmaxGEQs]; -  for(e=0;e<nEQs;e++) isDead[e] = 0; - -  if (!variablesInitialized) { -    initializeVariables(); -  } - -  for(i=nVars;i>symbolic;i--) -    for(e=0;e<nEQs;e++) -      if (EQs[e].coef[i] == 1 || EQs[e].coef[i] == -1) { -        for(j=nVars;j>i;j--) if (EQs[e].coef[j]) break; -        if (i==j) { -          doElimination(e, i); -          isDead[e] = 1; -          break; -        } -      } -   -  for(e=nEQs-1;e>=0;e--) -    if (isDead[e]) { -      nEQs--; -      if (e < nEQs) eqnncpy(&EQs[e], &EQs[nEQs], nVars); -    } -   -  for (i = 1; i <= safeVars; i++) -    forwardingAddress[var[i]] = i; -  for (i = 0; i < nSUBs; i++) -    forwardingAddress[SUBs[i].key] = -i - 1; -} - - -coef_t Problem::checkSum() const { -  coef_t cs; -  int e; -  cs = 0; -  for(e=0;e<nGEQs;e++) { -    coef_t c = GEQs[e].coef[0]; -    cs += c*c*c; -  } -  return cs; -} - - -void Problem::coalesce() { -  int e, e2, colors; -  int isDead[maxmaxGEQs]; -  int foundSomething = 0; - - -  colors = 0; -  for (e = 0; e < nGEQs; e++) -    if (GEQs[e].color) -      colors++; -  if (colors < 2) -    return; -  for (e = 0; e < nGEQs; e++) -    isDead[e] = 0; -  for (e = 0; e < nGEQs; e++) -    if (!GEQs[e].touched) -      for (e2 = e + 1; e2 < nGEQs; e2++) -        if (!GEQs[e2].touched && GEQs[e].key == -GEQs[e2].key -            && GEQs[e].coef[0] == -GEQs[e2].coef[0]) { -          int neweq = newEQ(); -          eqnncpy(&EQs[neweq], &GEQs[e], nVars); -          EQs[neweq].color = GEQs[e].color || GEQs[e2].color; -          foundSomething++; -          isDead[e] = 1; -          isDead[e2] = 1; -        } -  for (e = nGEQs - 1; e >= 0; e--) -    if (isDead[e]) { -      deleteGEQ(e); -    } -  if (DEBUG && foundSomething) { -    fprintf(outputFile, "Coalesced GEQs into %d EQ's:\n", foundSomething); -    printProblem(); -  } -} - -} // namespace diff --git a/omega/omega_lib/src/pres_beaut.cc b/omega/omega_lib/src/pres_beaut.cc deleted file mode 100644 index c23962a..0000000 --- a/omega/omega_lib/src/pres_beaut.cc +++ /dev/null @@ -1,235 +0,0 @@ -#include <omega/pres_tree.h> -#include <omega/pres_conj.h> -#include <omega/Relation.h> -#include <omega/omega_i.h> - -///////////////////////// -//                     // -// Beautify functions  // -//                     // -///////////////////////// - - -namespace omega { - -// -// f & true = f -// f | false = f -// f1 & f2 & ... & fn = Conjunct(f1,f2,...,fn) -// - -void Rel_Body::beautify() { -  assert(children().length()==1); -  set_parent(NULL,this); - -  skip_finalization_check++; -  formula()->beautify(); -  Formula *child = formula(); -  if(child->node_type()==Op_And && child->children().empty()) { -    remove_child(child); -    delete child; -    add_conjunct();     -  } -  skip_finalization_check--; - -  if(pres_debug) { -    fprintf(DebugFile, "\n=== Beautified TREE ===\n"); -    prefix_print(DebugFile); -  } -  assert(children().length()==1); -} - -void Formula::beautify() { -  // copy list of children, as they may be removed as we work -  List<Formula*> kiddies = myChildren; - -  for(List_Iterator<Formula*> c(kiddies); c; c++) -    (*c)->beautify(); -} - -void F_Exists::beautify() { -  Formula::beautify(); -  assert(children().length()==1); - -  if(myLocals.empty()) { -    // exists( : ***) -    parent().remove_child(this); -    parent().add_child(children().remove_front()); -    delete this; -  } -  else if (children()[1]->node_type() == Op_And && children()[1]->children().empty()) { -    // exists(*** : TRUE) --chun 6/4/2008 -    parent().remove_child(this); -    parent().add_child(children().remove_front()); -    delete this; -  } -  else { -    Formula *child = children().front(); -    if(child->node_type() == Op_Conjunct || child->node_type() == Op_Exists) { -      child->push_exists(myLocals); -      parent().remove_child(this); -      parent().add_child(child); -      children().remove_front(); -      delete this; -    } -  } -} - -void F_Forall::beautify() { -  Formula::beautify(); -  assert(children().length()==1); - -  if(myLocals.empty()) { -    parent().remove_child(this); -    parent().add_child(children().remove_front()); -    delete this; -  } -} - - -// -// The Pix-free versions of beautify for And and Or are a bit -// less efficient  than the previous code,  as we keep moving -// things from one list to another, but they do not depend on -// knowing that a Pix is valid after the list is updated, and -// they can always be optimized later if necessary. -//  - -void F_Or::beautify() { -  Formula::beautify(); - -  List<Formula*> uglies, beauties; -  uglies.join(children());  assert(children().empty()); -#if ! defined NDEBUG -  foreach(c,Formula*,uglies,c->set_parent(0)); -#endif - -  while(!uglies.empty()) { -    Formula *f = uglies.remove_front(); -    if(f->node_type()==Op_And && f->children().empty() ) { -      // smth | true = true -      foreach(c,Formula*,uglies,delete c); -      foreach(c,Formula*,beauties,delete c); -      parent().remove_child(this); -      parent().add_and(); -      delete f; -      delete this; -      return; -    } -    else if(f->node_type()==Op_Or) { -      // OR(f[1-m], OR(c[1-n])) = OR(f[1-m], c[1-n]) -#if ! defined NDEBUG -      foreach(c,Formula*,f->children(),c->set_parent(0)); -#endif -      uglies.join(f->children()); -      delete f; -    } -    else -      beauties.prepend(f); -  } - -  if(beauties.length()==1) { -    beauties.front()->set_parent(&parent()); -    parent().remove_child(this); -    parent().add_child(beauties.remove_front()); -    delete this; -  } -  else { -    foreach(c,Formula*,beauties,(c->set_parent(this), -                                 c->set_relation(relation()))); -    assert(children().empty()); -    children().join(beauties); -  } -} - -void F_And::beautify() { -  Formula::beautify(); - -  Conjunct *conj = NULL; - -  List<Formula*> uglies, beauties; -  uglies.join(children());  assert(children().empty()); -#if ! defined NDEBUG -  foreach(c,Formula*,uglies,c->set_parent(0)); -#endif - -  while(!uglies.empty()) { -    Formula *f = uglies.remove_front(); -    if (f->node_type() == Op_Conjunct) { -      if(conj==NULL) -        conj = f->really_conjunct(); -      else { -        Conjunct *conj1 = merge_conjs(conj, f->really_conjunct(), MERGE_REGULAR); -        delete f; -        delete conj; -        conj = conj1; -      } -    } -    else if(f->node_type()==Op_Or && f->children().empty()) { -      // smth & false = false -      foreach(c,Formula*,uglies,delete c); -      foreach(c,Formula*,beauties,delete c); -      parent().remove_child(this); -      parent().add_or(); -      delete f; -      delete conj; -      delete this; -      return; -    } -    else if(f->node_type()==Op_And) { -      //  AND(f[1-m], AND(c[1-n])) = AND(f[1-m], c[1-n]) -#if ! defined NDEBUG -      foreach(c,Formula*,f->children(),c->set_parent(0)); -#endif -      uglies.join(f->children()); -      delete f; -    } -    else -      beauties.prepend(f); -  } - -  if(conj!=NULL) -    beauties.prepend(conj); - -  if(beauties.length()==1) { -    beauties.front()->set_parent(&parent()); -    parent().remove_child(this); -    parent().add_child(beauties.remove_front()); -    delete this; -  } -  else { -    foreach(c,Formula*,beauties,(c->set_parent(this), -                                 c->set_relation(relation()))); -    assert(children().empty()); -    children().join(beauties); -  } -} - -void F_Not::beautify() { -  Formula::beautify(); -  assert(children().length()==1); -  Formula *child = children().front(); - -  if(child->node_type()==Op_And && child->children().empty()) { -    // Not TRUE = FALSE -    parent().remove_child(this); -    parent().add_or(); -    delete this; -  } -  else if (child->node_type()==Op_Or && child->children().empty()) { -    // Not FALSE = TRUE -    parent().remove_child(this); -    parent().add_and(); -    delete this; -  } -} - -void Conjunct::beautify() { -  if(is_true()) { -    parent().remove_child(this); -    parent().add_and(); -    delete this; -  } -} - -} // namespace diff --git a/omega/omega_lib/src/pres_cnstr.cc b/omega/omega_lib/src/pres_cnstr.cc deleted file mode 100644 index a8ebd15..0000000 --- a/omega/omega_lib/src/pres_cnstr.cc +++ /dev/null @@ -1,450 +0,0 @@ -#include <omega/pres_cnstr.h> -#include <omega/pres_conj.h> -#include <omega/Relation.h> -#include <omega/omega_i.h> - -namespace omega { - -Constraint_Handle::Constraint_Handle(Conjunct *_c, eqn **_eqns, int _e): -  c(_c), eqns(_eqns), e(_e) { -} - -GEQ_Handle::GEQ_Handle(Conjunct *_c, int _e): -  Constraint_Handle(_c,&(_c->problem->GEQs),_e) { -} - -bool Constraint_Handle::is_const(Variable_ID v) { -  bool is_const=true; -  for(Constr_Vars_Iter cvi(*this, false); cvi && is_const; cvi++) -    is_const = ((*cvi).coef == 0 || ((*cvi).var == v && (*cvi).coef !=0)); -  return is_const; -} - -bool Constraint_Handle::is_const_except_for_global(Variable_ID v){ -  bool is_const=true; -  for(Constr_Vars_Iter cvi(*this, false); cvi && is_const; cvi++) -	if((*cvi).var->kind() != Global_Var) -      is_const = ((*cvi).coef == 0 || ((*cvi).var == v && (*cvi).coef !=0)); -  return is_const; -} - -bool EQ_Handle::operator==(const Constraint_Handle &that) { -  Constraint_Handle &e1=*this; -  const Constraint_Handle &e2=that; -  int sign = 0; -  for(Constr_Vars_Iter cvi(e1, false); cvi; cvi++) { -    coef_t c1 = (*cvi).coef; -    coef_t c2 = e2.get_coef((*cvi).var); -    if (sign == 0) sign = (c1*c2>=0?1:-1); -    if (sign*c1 != c2) return false; -  } -  assert(sign != 0); -  { -    for(Constr_Vars_Iter cvi(e2, false); cvi; cvi++) { -      coef_t c1 = e1.get_coef((*cvi).var); -      coef_t c2 = (*cvi).coef; -      if (sign*c1 != c2) return false; -    } -  } -  return sign * e1.get_const() == e2.get_const(); -} - -bool GEQ_Handle::operator==(const Constraint_Handle &that) { -  Constraint_Handle &e1=*this; -  const Constraint_Handle &e2=that; -  for(Constr_Vars_Iter cvi(e1, false); cvi; cvi++) { -    coef_t c1 = (*cvi).coef; -    coef_t c2 = e2.get_coef((*cvi).var); -    if (c1 != c2) return false; -  } -  { -    for(Constr_Vars_Iter cvi(e2, false); cvi; cvi++) { -      coef_t c1 = e1.get_coef((*cvi).var); -      coef_t c2 = (*cvi).coef; -      if (c1 != c2) return false; -    } -  } -  return e1.get_const() == e2.get_const(); -} - - - - -void GEQ_Handle::negate() { -  assert(! this->relation()->is_simplified()); -  int i; -  for(i=1; i<=c->problem->nVars; i++) { -    (*eqns)[e].coef[i] = -(*eqns)[e].coef[i]; -  } -  (*eqns)[e].coef[0] = -(*eqns)[e].coef[0]-1; -} - -bool Constraint_Handle::has_wildcards() const { -  Constr_Vars_Iter C(*this, true); -  if (C.live()) { -    assert(C.curr_var()->kind() == Wildcard_Var); -    assert(C.curr_coef() != 0); -    return 1; -  } -  return 0; -} - -int Constraint_Handle::max_tuple_pos() const { -  int m = 0; -  for( Constr_Vars_Iter C(*this, false); C.live() ; C.next()) { -    switch (C.curr_var()->kind()) { -    case Input_Var:  -    case Output_Var: { -      int pos = C.curr_var()->get_position(); -      if (m < pos) m = pos; -      break; -    } -    default:  -      ; -    } -  } -  return m; -} - -int Constraint_Handle::min_tuple_pos() const { -  int m = 0; -  for( Constr_Vars_Iter C(*this, false); C.live() ; C.next()) { -    switch (C.curr_var()->kind()) { -    case Input_Var:  -    case Output_Var: { -      int pos = C.curr_var()->get_position(); -      if (m == 0 || m > pos) m = pos; -      break; -    } -    default:  -      ; -    } -  } -  return m; -} - - -EQ_Handle::EQ_Handle(Conjunct *_c, int _e): Constraint_Handle(_c,&(_c->problem->EQs),_e) { -} - -// -// Update functions. -// -void Constraint_Handle::update_coef(Variable_ID D, coef_t I) { -  assert(! this->relation()->is_simplified()); -  assert(D != 0); -  // The next two assertions are somewhat high-cost. -#if !defined(NDEBUG) -  // skip_set_checks++; -  assert((D->kind() != Input_Var || D->get_position() <= this->relation()->n_inp())); -  assert((D->kind() != Output_Var || D->get_position() <= this->relation()->n_out())); -  // skip_set_checks--; -#endif -  int col = c->get_column(D); -  (*eqns)[e].coef[col] += I; -} - -void Constraint_Handle::update_const(coef_t I) { -  assert(! this->relation()->is_simplified()); -  (*eqns)[e].coef[0] += I; -} - - -// update a coefficient of a variable that already exists in mappedvars - -void Constraint_Handle::update_coef_during_simplify(Variable_ID D, coef_t I) { -  assert(D != 0); -  int col = c->get_column(D); -  (*eqns)[e].coef[col] += I; -} - -void Constraint_Handle::update_const_during_simplify(coef_t I) { -  (*eqns)[e].coef[0] += I; -} - -// -// Get functions. -// - -coef_t Constraint_Handle::get_coef(Variable_ID v) const { -  assert(this->relation()->is_simplified()); -  assert(v != 0); -  int col = c->find_column(v); -  if(col == 0) { -    return 0; -  } -  else { -    return (*eqns)[e].coef[col]; -  } -}  - -coef_t Constraint_Handle::get_coef_during_simplify(Variable_ID v) const { -  assert(v != 0); -  int col = c->find_column(v); -  if(col == 0) { -    return 0; -  } -  else { -    return (*eqns)[e].coef[col]; -  } -}  - -coef_t Constraint_Handle::get_const() const { -  assert(this->relation()->is_simplified()); -  return((*eqns)[e].coef[0]); -} - -coef_t Constraint_Handle::get_const_during_simplify() const { -  return((*eqns)[e].coef[0]); -} - -Variable_ID Constraint_Handle::get_local(const Global_Var_ID G) { -  return relation()->get_local(G); -} - -Variable_ID Constraint_Handle::get_local(const Global_Var_ID G, Argument_Tuple of) { -  return relation()->get_local(G, of); -} - -void Constraint_Handle::finalize() { -  c->n_open_constraints--; -} - -void Constraint_Handle::multiply(int multiplier) { -  int i; -  assert(! this->relation()->is_simplified()); -  for(i=1; i<=c->problem->nVars; i++) { -    (*eqns)[e].coef[i] = (*eqns)[e].coef[i] * multiplier; -  } -  (*eqns)[e].coef[0] = (*eqns)[e].coef[0] * multiplier; -} - -Rel_Body *Constraint_Handle::relation() const { -  return c->relation(); -} - - -// -// Variables of constraint iterator. -// -Constr_Vars_Iter::Constr_Vars_Iter(const Constraint_Handle &ch, bool _wild_only): eqns(ch.eqns), e(ch.e), prob(ch.c->problem), vars(ch.c->mappedVars), wild_only(_wild_only) { -  assert(vars.size() == prob->nVars); -  for(current=1; current<=prob->nVars; current++) { -    if((*eqns)[e].coef[current]!=0 &&  -       (!wild_only || vars[current]->kind()==Wildcard_Var))  -      return; -  } -} - -int Constr_Vars_Iter::live() const { -  return (current<=prob->nVars); -} - - -void Constr_Vars_Iter::operator++() { this->operator++(0); } - -void Constr_Vars_Iter::operator++(int) { -  for(current++ ; current <=prob->nVars; current++) -    if((*eqns)[e].coef[current]!=0 &&  -       (!wild_only || vars[current]->kind()==Wildcard_Var)) -      return; -} - - -Variable_ID Constr_Vars_Iter::curr_var() const { -  assert(current <= prob->nVars); -  return vars[current]; -} - -coef_t Constr_Vars_Iter::curr_coef() const { -  assert(current <= prob->nVars); -  return (*eqns)[e].coef[current]; -} - -Variable_Info Constr_Vars_Iter::operator*() const { -  assert(current <= prob->nVars); -  return Variable_Info(vars[current],(*eqns)[e].coef[current]); -} - -// -// Constraint iterator. -// -Constraint_Iterator Conjunct::constraints() { -  return Constraint_Iterator(this); -} - -Constraint_Iterator::Constraint_Iterator(Conjunct *_c): c(_c), current(0), -                                                        last(c->problem->nGEQs-1), eqns(&(c->problem->GEQs)) { -  if(!this->live()) (*this)++; // switch to EQ's if no GEQs -} - -int Constraint_Iterator::live() const { -  return current <=last; -} - -void Constraint_Iterator::operator++() { -  this->operator++(0); -} - -void Constraint_Iterator::operator++(int) { -  if(++current > last) -    if(eqns == &(c->problem->GEQs)) { // Switch to EQs -      eqns = &(c->problem->EQs); -      current = 0; -      last = c->problem->nEQs-1; -    } -} - -Constraint_Handle Constraint_Iterator::operator*() { -  assert((c && eqns && current <= last) && "Constraint_Iterator::operator*: bad call"); -  return Constraint_Handle(c,eqns,current); -}  - -Constraint_Handle Constraint_Iterator::operator*() const { -  assert((c && eqns && current <= last) && "Constraint_Iterator::operator*: bad call"); -  return Constraint_Handle(c,eqns,current); -}  - - -// -// EQ iterator. -// -EQ_Iterator Conjunct::EQs() { -  return EQ_Iterator(this); -} - -EQ_Iterator::EQ_Iterator(Conjunct *_c) : c(_c) { -  last = c->problem->nEQs-1; -  current = 0; -} - -int EQ_Iterator::live() const { -  return current <= last; -} - -void EQ_Iterator::operator++() { -  this->operator++(0); -} - -void EQ_Iterator::operator++(int) { -  current++; -} - -EQ_Handle EQ_Iterator::operator*() { -  assert((c && current <= last) && "EQ_Iterator::operator*: bad call"); -  return EQ_Handle(c,current); -}  - -EQ_Handle EQ_Iterator::operator*() const { -  assert((c && current <= last) && "EQ_Iterator::operator*: bad call"); -  return EQ_Handle(c,current); -}  - - -// -// GEQ iterator. -// -GEQ_Iterator Conjunct::GEQs() { -  return GEQ_Iterator(this); -} - -GEQ_Iterator::GEQ_Iterator(Conjunct *_c) : c(_c) { -  last = c->problem->nGEQs-1; -  current = 0; -} - -int GEQ_Iterator::live() const { -  return current <= last; -} - -void GEQ_Iterator::operator++() { -  this->operator++(0); -} - -void GEQ_Iterator::operator++(int) { -  current++; -} - - -GEQ_Handle GEQ_Iterator::operator*() { -  assert((c && current <= last) && "GEQ_Iterator::operator*: bad call"); -  return GEQ_Handle(c,current); -}  - -GEQ_Handle GEQ_Iterator::operator*() const { -  assert((c && current <= last) && "GEQ_Iterator::operator*: bad call"); -  return GEQ_Handle(c,current); -}  - - -void copy_constraint(Constraint_Handle H, const Constraint_Handle initial) { -  // skip_set_checks++; -//  assert(H.relation()->n_inp() == initial.relation()->n_inp()); -//  assert(H.relation()->n_out() == initial.relation()->n_out()); -     -  H.update_const_during_simplify(initial.get_const_during_simplify()); -  if (H.relation() == initial.relation())  { -    for( Constr_Vars_Iter C(initial, false); C.live() ; C.next()) { -      assert(C.curr_var()->kind()!= Forall_Var && -             C.curr_var()->kind()!= Exists_Var); -      if (C.curr_var()->kind()!= Wildcard_Var) -        H.update_coef_during_simplify(C.curr_var(), C.curr_coef()); -      else -        // Must add a new wildcard, -        // since they can't be used outside local Conjunct -        H.update_coef_during_simplify(H.c->declare(), C.curr_coef()); -    } -  } -  else { -    Rel_Body *this_rel = H.relation(); -    for( Constr_Vars_Iter C(initial, false); C.live() ; C.next()) { -      switch (C.curr_var()->kind()) { -      case Forall_Var: -      case Exists_Var: -        assert(0 && "Can't copy quantified constraints across relations"); -        break; -      case Wildcard_Var: -        // for each wildcard var we see, create a new wildcard -        // will lead to lots of wildcards, but Wayne likes it -        // that way -      { -        H.update_coef_during_simplify(H.c->declare(), C.curr_coef()); -        break; -      } -      case Input_Var: //use variable_ID of corresponding position -      { -        int pos = C.curr_var()->get_position(); -        assert(this_rel->n_inp() >= pos); -        Variable_ID V = this_rel->input_var(pos); -        H.update_coef_during_simplify(V, C.curr_coef()); -        break; -      } -      case Output_Var:  //use variable_ID of corresponding position -      { -        int pos = C.curr_var()->get_position(); -        assert(this_rel->n_out() >= pos); -        Variable_ID V = this_rel->output_var(pos); -        H.update_coef_during_simplify(V, C.curr_coef()); -        break; -      } - -      case Global_Var:  // get this Global's Var_ID in this relation -      { -        Variable_ID V; -        Global_Var_ID G = C.curr_var()->get_global_var(); -        if (G->arity() == 0) -          V = this_rel->get_local(G); -        else  -          V = this_rel->get_local(G,C.curr_var()->function_of()); -        H.update_coef_during_simplify(V, C.curr_coef()); -        break; -      } -      default: -        assert(0 && "copy_constraint: variable of impossible type"); -      } -    } -  } -  // skip_set_checks--; -} - -} // namespace diff --git a/omega/omega_lib/src/pres_col.cc b/omega/omega_lib/src/pres_col.cc deleted file mode 100644 index 1569116..0000000 --- a/omega/omega_lib/src/pres_col.cc +++ /dev/null @@ -1,104 +0,0 @@ -#include <omega/pres_conj.h> -#include <omega/RelBody.h> -#include <omega/omega_i.h> - -namespace omega { - -// -// Copy column fr_col of problem fp -// to   column to_col of problem tp. -// Displacement for constraints in tp are start_EQ and start_GEQ. -// -void copy_column(Problem *tp,  int to_col, -                 Problem *fp,  int fr_col, -                 int start_EQ, int start_GEQ) { -  checkVars(to_col); -  assert(start_EQ + fp->nEQs  <= tp->allocEQs); -  assert(start_GEQ + fp->nGEQs  <= tp->allocGEQs); - -  int i; -  for(i=0; i<fp->nEQs; i++) { -    tp->EQs[i+start_EQ].coef[to_col] = fp->EQs[i].coef[fr_col]; -  } -  for(i=0; i<fp->nGEQs; i++) { -    tp->GEQs[i+start_GEQ].coef[to_col] = fp->GEQs[i].coef[fr_col]; -  } -} - -// -// Zero column to_col of problem tp. -// Displacement for constraints in to_conj are start_EQ and start_GEQ. -// Number of constraints to zero are no_EQ and no_GEQ. -// -void zero_column(Problem *tp,  int to_col, -                 int start_EQ, int start_GEQ, -                 int no_EQs,   int no_GEQs) { -  assert(start_EQ + no_EQs <= tp->allocEQs); -  assert(start_GEQ + no_GEQs <= tp->allocGEQs); - -  int i; -  for(i=0; i<no_EQs; i++) { -    tp->EQs[i+start_EQ].coef[to_col] = 0; -  } -  for(i=0; i<no_GEQs; i++) { -    tp->GEQs[i+start_GEQ].coef[to_col] = 0; -  } -} - -// -// return column for D in conjunct -// -int Conjunct::get_column(Variable_ID D) { -  int col = find_column(D); -  if (col == 0)    // if it does not already have a column assigned -    col = map_to_column(D); -  assert(col > 0); // Not substituted -  return col; -} - -// -// Find column in conjunct. -//   -int Conjunct::find_column(Variable_ID D) { -  assert(D != 0); -  int column = mappedVars.index(D); -   -  // If it has been through the omega core (variablesInitialized),  -  // and it exists in the problem, check to see if it has been forwarded. -  // This will likely only be the case if substitutions have been done; -  // that won't arise in user code, only in print_with_subs and the -  // Substitutions class. -  if (problem->variablesInitialized && column > 0) { -    assert(problem->forwardingAddress[column] != 0);  -    column = problem->forwardingAddress[column]; -  } -  assert (column <= problem->nVars); -  return column; -} -   -// -// Create new column in conjunct. -//   -int Conjunct::map_to_column(Variable_ID D) { -  assert(D != 0); -  // This heavy-duty assertion says that if you are trying to use a global -  // var's local representative in a relation, that you have first told the  -  // relation that you are using it here.  PUFS requires that we know -  // all the function symbols that might be used in a relation. -  // If one wanted to be less strict, one could just tell the relation  -  // that the global variable was being used. -  assert(D->kind() != Global_Var || -         (relation()->has_local(D->get_global_var(), D->function_of())  -          && "Attempt to update global var without a local variable ID")); - -  cols_ordered = false; // extremely important -  checkVars(problem->nVars+2); -  int col = ++problem->nVars; -  mappedVars.append(D); -  problem->forwardingAddress[col] = col; -  problem->var[col] = col; -  zero_column(problem, col, 0, 0, problem->nEQs, problem->nGEQs); -  return col; -} - -} // namespace diff --git a/omega/omega_lib/src/pres_conj.cc b/omega/omega_lib/src/pres_conj.cc deleted file mode 100644 index f3f458d..0000000 --- a/omega/omega_lib/src/pres_conj.cc +++ /dev/null @@ -1,1460 +0,0 @@ -/***************************************************************************** - Copyright (C) 1994-2000 the Omega Project Team - Copyright (C) 2005-2011 Chun Chen - All Rights Reserved. - - Purpose: -   class Conjunct. - - Notes: - - History: -*****************************************************************************/ - -#include <omega/omega_core/oc.h> -#include <omega/pres_conj.h> -#include <omega/pres_cmpr.h> -#include <omega/Relation.h> -#include <omega/omega_i.h> -#include <set> - -namespace omega { - -int NR_CONJUNCTS, MAX_CONJUNCTS; - -/* - * Make a new wildcard variable, return WC number. - * Should be static to this file, but must be a friend of conjunct. - */ -int new_WC(Conjunct *nc, Problem *) { -  Variable_ID wc = nc->declare(); -  int wc_no = nc->map_to_column(wc); -  return(wc_no); -} - - -const char* get_var_name(unsigned int col, void * void_conj) { -#if defined PRINT_COLUMN_NUMBERS -  static char scum[512]; -#endif -  Conjunct *c = (Conjunct *) void_conj; -  if (col == 0) -    return 0; -  Variable_ID v = c->mappedVars[col]; -  assert(v!=0); -#if defined PRINT_COLUMN_NUMBERS -  strcpy(scum, v->char_name()); -  sprintf(scum + strlen(scum), "(%d)", col); -  return scum; -#endif -  return v->char_name(); -} - -void Conjunct::promise_that_ub_solutions_exist(Relation &R) { -#ifndef NDEBUG -  Relation verify=Relation(R, this); -  assert(verify.is_upper_bound_satisfiable()); -#endif  -  verified = true; -} - - -int Conjunct::max_ufs_arity_of_set() { -  int ma = 0, a; -  for (Variable_ID_Iterator v(mappedVars); v; v++) -    if ((*v)->kind() == Global_Var && (*v)->function_of() == Set_Tuple  -        && query_variable_used(*v)) { -      a = (*v)->get_global_var()->arity(); -      if (a > ma) -        ma = a; -    } -  return ma; -} - - -int Conjunct::max_ufs_arity_of_in() { -  int ma = 0, a; -  for (Variable_ID_Iterator v(mappedVars); v; v++) -    if ((*v)->kind() == Global_Var && (*v)->function_of() == Input_Tuple -        && query_variable_used(*v)) { -      a = (*v)->get_global_var()->arity(); -      if (a > ma) -        ma = a; -    } -  return ma; -} - - -int Conjunct::max_ufs_arity_of_out() { -  int ma = 0, a; -  for (Variable_ID_Iterator v(mappedVars); v; v++) -    if ((*v)->kind() == Global_Var &&  (*v)->function_of() == Output_Tuple -        && query_variable_used(*v)) { -      a = (*v)->get_global_var()->arity(); -      if (a > ma) -        ma = a; -    } -  return ma; -} - - -bool Conjunct::is_unknown() const {  -  assert(problem || comp_problem); -  return !exact && ((problem && problem->nEQs==0 && problem->nGEQs==0) || -                    (comp_problem && comp_problem->no_constraints())); -} - - -/* - * Remove black constraints from the problem. - * Make all the remaining red constraints black. - */ -void Conjunct::rm_color_constrs() { -  int geqs = 0, eqs = 0; - -  possible_leading_0s = -1; -  guaranteed_leading_0s = -1; -  leading_dir = 0; - -  for(int i=0; i<problem->nGEQs; i++) { -    if(problem->GEQs[i].color) { -      if(geqs!=i) -        eqnncpy(&problem->GEQs[geqs], &problem->GEQs[i], problem->nVars); -      problem->GEQs[geqs].color = EQ_BLACK; -      geqs++; -    } -  } -  problem->nGEQs = geqs; -   -  for(int i=0; i<problem->nEQs; i++) { -    if(problem->EQs[i].color) { -      if(eqs!=i) -        eqnncpy(&problem->EQs[eqs], &problem->EQs[i], problem->nVars); -      problem->EQs[eqs].color = EQ_BLACK; -      eqs++; -    } -  } -  problem->nEQs = eqs; -} - - - -// -// Conjunct constructors. -// -Conjunct::Conjunct() :  -  F_Declaration(NULL, NULL), -  mappedVars(0), -  n_open_constraints(0), -  cols_ordered(false), -  simplified(false), -  verified(false), -  guaranteed_leading_0s(-1), -  possible_leading_0s(-1), -  leading_dir(0), -  exact(true), -  r_constrs(0) { -  NR_CONJUNCTS++; -  if (NR_CONJUNCTS>MAX_CONJUNCTS) MAX_CONJUNCTS = NR_CONJUNCTS; -  problem = new Problem; -  comp_problem = NULL; -  problem->get_var_name = get_var_name; -  problem->getVarNameArgs = (void *) this; -} - - -Conjunct::Conjunct(Formula *f, Rel_Body *r) :  -  F_Declaration(f,r), -  mappedVars(0), -  n_open_constraints(0), -  cols_ordered(false), -  simplified(false), -  verified(false), -  guaranteed_leading_0s(-1), -  possible_leading_0s(-1), -  leading_dir(0), -  exact(true), -  r_constrs(0) {  -  NR_CONJUNCTS++; -  if (NR_CONJUNCTS>MAX_CONJUNCTS) MAX_CONJUNCTS = NR_CONJUNCTS; -  problem = new Problem; -  comp_problem = NULL; -  problem->get_var_name = get_var_name; -  problem->getVarNameArgs = (void *) this ; -} - -void internal_copy_conjunct(Conjunct* to, Conjunct* fr); - -// -// Copy Conjunct. -// -Conjunct* Conjunct::copy_conj_diff_relation(Formula *parent, Rel_Body *rel_body) { -  Conjunct *new_conj; -  if(problem && comp_problem==NULL) { -    new_conj = new Conjunct(parent, rel_body); -    internal_copy_conjunct(new_conj, this); -  } -  else if (problem==NULL && comp_problem) { -    /* copy compressed conjunct */ -    assert(0 && "copy compressed conjunct"); -    new_conj = 0; -  } -  else { -    assert(0 && "problem == NULL"); -    new_conj = 0; -  } -  return new_conj; -} - - -void internal_copy_conjunct(Conjunct* to, Conjunct* fr) { -  copy_conj_header(to, fr); - -  //  -  // We repeat part of what is done by copy_conj_header(to, fr) by -  // calling Problem::operator=(const Problem &).   -  // copy_conj_header should go away, but there is some code that still needs  -  // it in negate_conj.   -  // -  to->r_constrs = fr->r_constrs; -  to->simplified = fr->simplified; -  to->verified = fr->verified; -  to->guaranteed_leading_0s = fr->guaranteed_leading_0s; -  to->possible_leading_0s = fr->possible_leading_0s; -  to->leading_dir = fr->leading_dir; -  // the following duplicates some work of the "copy_conj_header" brain damage -  *to->problem = *fr->problem;  -  to->problem->getVarNameArgs = (void *)to;   // important -} - - -// -// Copy Conjunct variable declarations -// and problem parameters but not problem itself. -// -void copy_conj_header(Conjunct* to, Conjunct* fr) { -  free_var_decls(to->myLocals);  to->myLocals.clear(); - -  copy_var_decls(to->myLocals, fr->myLocals); -  to->mappedVars = fr->mappedVars; -  to->remap(); -  reset_remap_field(fr->myLocals); - -  to->cols_ordered = fr->cols_ordered; -  to->r_constrs = fr->r_constrs; -  to->simplified = fr->simplified; -  to->verified = fr->verified; -  to->guaranteed_leading_0s = fr->guaranteed_leading_0s; -  to->possible_leading_0s = fr->possible_leading_0s; -  to->leading_dir = fr->leading_dir; -  to->n_open_constraints = fr->n_open_constraints; -  to->exact=fr->exact; - -  Problem *fp = fr->problem; -  Problem *tp = to->problem; -  tp->nVars = fp->nVars; -  tp->safeVars = fp->safeVars; -  tp->variablesInitialized = fp->variablesInitialized; -  tp->variablesFreed = fp->variablesFreed; -  for(int i=1; i<=maxVars; i++) {  // only need nVars of var -    tp->forwardingAddress[i] = fp->forwardingAddress[i]; -    tp->var[i] = fp->var[i]; -  } -  to->problem->get_var_name = get_var_name; -  to->problem->getVarNameArgs = (void *)to ; -} - - -void Conjunct::reverse_leading_dir_info() { -  leading_dir *= -1; -} - - -void Conjunct::enforce_leading_info(int guaranteed, int possible, int dir) { -  skip_finalization_check++; -  guaranteed_leading_0s = guaranteed; - -  int d = min(relation()->n_inp(),relation()->n_out()); - -  assert(0 <= guaranteed); -  assert(guaranteed <= possible); -  assert(possible <= d); - -  for(int i = 1; i <= guaranteed; i++) { -    EQ_Handle e = add_EQ(); -    e.update_coef_during_simplify(input_var(i), -1); -    e.update_coef_during_simplify(output_var(i), 1); -    e.finalize(); -  } - - -  if (guaranteed == possible && guaranteed >= 0  && possible+1 <= d && dir) { -    GEQ_Handle g = add_GEQ(); -    if (dir > 0) { -      g.update_coef_during_simplify(input_var(possible+1), -1); -      g.update_coef_during_simplify(output_var(possible+1), 1); -    } -    else { -      g.update_coef_during_simplify(input_var(possible+1), 1); -      g.update_coef_during_simplify(output_var(possible+1), -1); -    } -    g.update_const_during_simplify(-1); -    g.finalize(); -    possible_leading_0s = possible; -    leading_dir = dir; -  } -	else { -    possible_leading_0s = d; -    leading_dir = 0; -  } - -  skip_finalization_check--; -#if ! defined NDEBUG -  assert_leading_info(); -#endif -} -	 - -void Conjunct::invalidate_leading_info(int changed) { -  if (changed == -1) { -    guaranteed_leading_0s = possible_leading_0s = -1; -    leading_dir = 0; -	} -  else { -    int d = min(relation()->n_inp(), relation()->n_out()); -    assert(1 <= changed && changed <= d); -    if (possible_leading_0s == changed -1) { -      possible_leading_0s  = d; -		} -    guaranteed_leading_0s = min(guaranteed_leading_0s,changed-1); -	} -#if ! defined NDEBUG -  assert_leading_info(); -#endif -} - - -int Conjunct::leading_dir_valid_and_known() { -  if (relation()->is_set()) { -    return 0; -	} -  // if we know leading dir, we can rule out extra possible 0's -  assert(leading_dir == 0 || -         possible_leading_0s == guaranteed_leading_0s); - -  return (possible_leading_0s == guaranteed_leading_0s && -          possible_leading_0s >= 0 && -          possible_leading_0s < min(relation()->n_inp(),relation()->n_out()) -          && leading_dir); -} - - -#if ! defined NDEBUG -void Conjunct::assert_leading_info() { -  if (relation()->is_set()) { -    return; -	} - -  int d = min(relation()->n_inp(), relation()->n_out()); - -  if ( guaranteed_leading_0s == -1 -       && guaranteed_leading_0s == possible_leading_0s) -    assert(leading_dir == 0); -  -  if(leading_dir != 0 &&  -	   possible_leading_0s != guaranteed_leading_0s) { -    use_ugly_names++; -    prefix_print(DebugFile); -    use_ugly_names--; -	} -	 -  assert(leading_dir == 0 || possible_leading_0s == guaranteed_leading_0s); - -  assert(possible_leading_0s <= d && guaranteed_leading_0s <= d); - -  assert(possible_leading_0s == -1 || guaranteed_leading_0s <= possible_leading_0s); - -  // check that there must be "guaranteed_leading_0s" 0s -  int carried_level; -  for (carried_level = 1; carried_level <= guaranteed_leading_0s; carried_level++) { -    Variable_ID in = input_var(carried_level), -	    out = output_var(carried_level); -    coef_t lb, ub; -    bool guar; -    query_difference(out, in, lb, ub, guar); -    if (lb != 0 && ub != 0) { -	    // probably "query_difference" is just approximate -	    // add the negation of leading_dir and assert that -	    // the result is unsatisfiable; -	    // add in > out (in-out-1>=0) and assert unsatisfiable. - -	    Conjunct *test = copy_conj_same_relation(); -	    test->problem->turnRedBlack(); -	    skip_finalization_check++; -	     -	    GEQ_Handle g = test->add_GEQ(); -	    g.update_coef_during_simplify(in, -1); -	    g.update_coef_during_simplify(out, 1); -	    g.update_const_during_simplify(-1); -	    g.finalize(); -	    assert(!simplify_conj(test, true, 0, 0)); -	    // test was deleted by simplify_conj, as it was FALSE - -	    test = copy_conj_same_relation(); -	    test->problem->turnRedBlack(); -	    g = test->add_GEQ(); -	    g.update_coef_during_simplify(in, 1); -	    g.update_coef_during_simplify(out, -1); -	    g.update_const_during_simplify(-1); -	    g.finalize(); -	    assert(!simplify_conj(test, true, 0, 0)); -	    // test was deleted by simplify_conj, as it was FALSE - -	    skip_finalization_check--; -    } -	} - -  carried_level = possible_leading_0s+1; - -  // check that there can't be another -  if (guaranteed_leading_0s == possible_leading_0s -      && possible_leading_0s >= 0 && -      carried_level <= min(relation()->n_inp(), relation()->n_out()))	{ -    Variable_ID in = input_var(carried_level), -	    out = output_var(carried_level); -    coef_t lb, ub; -    bool guar; -    query_difference(out, in, lb, ub, guar); -    if (lb <= 0 && ub >= 0) { -	    // probably "query_difference" is just approximate -	    // add a 0 and see if its satisfiable - -	    Conjunct *test = copy_conj_same_relation(); -	    test->problem->turnRedBlack(); -	    skip_finalization_check++; - -	    EQ_Handle e = test->add_EQ(); -	    e.update_coef_during_simplify(in, -1); -	    e.update_coef_during_simplify(out, 1); -	    e.finalize(); -	    assert(!simplify_conj(test, true, 0, 0)); -	    // test was deleted by simplify_conj, as it was FALSE - -	    skip_finalization_check--; -    } -	} - -  // check leading direction info -  if (leading_dir_valid_and_known()) { -    Variable_ID in = input_var(guaranteed_leading_0s+1), -	    out = output_var(guaranteed_leading_0s+1); -    coef_t lb, ub; -    bool guar; -    query_difference(out, in, lb, ub, guar); -    if ((leading_dir < 0 && ub >= 0) || -        (leading_dir > 0 && lb <= 0)) { -	    // probably "query_difference" is just approximate -	    // add the negation of leading_dir and assert that -	    // the result is unsatisfiable; -	    // eg for leading_dir = +1 (in must be < out), -	    // add in >= out (in-out>=0) and assert unsatisfiable. - -	    Conjunct *test = copy_conj_same_relation(); -	    test->problem->turnRedBlack(); -	    skip_finalization_check++; -	     -	    GEQ_Handle g = test->add_GEQ(); -	    g.update_coef_during_simplify(in, leading_dir); -	    g.update_coef_during_simplify(out, -leading_dir); -	    g.finalize(); - -	    assert(!simplify_conj(test, true, 0, 0)); -	    // test was deleted by simplify_conj, as it was FALSE - -	    skip_finalization_check--; -    } -	} -} -#endif - - -Variable_ID Conjunct::declare(Const_String s) { -  return do_declare(s, Wildcard_Var); -} - -Variable_ID Conjunct::declare() { -  return do_declare(Const_String(), Wildcard_Var); -} - -Variable_ID Conjunct::declare(Variable_ID v) { -  return do_declare(v->base_name, Wildcard_Var); -} - -Conjunct* Conjunct::really_conjunct() { -  return this; -} - - -Variable_ID_Tuple* Conjunct::variables() { -  return &mappedVars; -} - -Stride_Handle Conjunct::add_stride(int step, int preserves_level) { -  assert_not_finalized(); -  Variable_ID wild = declare(); -  int c; -  c = problem->newEQ(); -  simplified = false; -  verified = false; -  if (! preserves_level) { -    if (leading_dir == 0) -	    possible_leading_0s = -1; -    // otherwise we must still have leading_dir, and thus no more 0's -	} -  problem->EQs[c].color = EQ_BLACK; -  eqnnzero(&problem->EQs[c],problem->nVars); -  n_open_constraints++; -  EQ_Handle h = EQ_Handle(this, c); -  h.update_coef(wild,step); -  return h; -} - -// This should only be used to copy constraints from simplified relations,  -// i.e. there are no quantified variables in c except wildcards. -EQ_Handle Conjunct::add_EQ(const Constraint_Handle &c, int /*preserves_level, currently unused*/) { -  EQ_Handle e = add_EQ(); -  copy_constraint(e,c); -  return e; -} - - -EQ_Handle Conjunct::add_EQ(int preserves_level) { -  assert_not_finalized(); -  int c; -  c = problem->newEQ(); -  simplified = false; -  verified = false; -  if (!preserves_level)	{ -    if (leading_dir == 0) -	    possible_leading_0s = -1; -    // otherwise we must still have leading_dir, and thus no more 0's -	} -  problem->EQs[c].color = EQ_BLACK; -  eqnnzero(&problem->EQs[c],problem->nVars); -  n_open_constraints++; -  return EQ_Handle(this, c); -} - - -// This should only be used to copy constraints from simplified relations,  -// i.e. there are no quantified variables in c except wildcards. -GEQ_Handle Conjunct::add_GEQ(const Constraint_Handle &c, int /*preserves_level, currently unused */) { -  GEQ_Handle g = add_GEQ(); -  copy_constraint(g,c); -  return g; -} - - -GEQ_Handle Conjunct::add_GEQ(int preserves_level) { -  assert_not_finalized(); -  int c; -  c = problem->newGEQ(); -  simplified = false; -  verified = false; -  if (!preserves_level)	{ -    if (leading_dir == 0) -	    possible_leading_0s = -1; -    // otherwise we must still have leading_dir, and thus no more 0's -	} -  problem->GEQs[c].color = EQ_BLACK; -  eqnnzero(&problem->GEQs[c],problem->nVars); -  n_open_constraints++; -  return GEQ_Handle(this, c); -} - - -Conjunct *Conjunct::find_available_conjunct() { -	return this; -} - - -bool Conjunct::can_add_child() { -  return false; -} - - -void Conjunct::combine_columns() { -  int nvars = mappedVars.size(),i,j,k; - -  for(i=1; i<=nvars; i++) -    for(j=i+1; j<=nvars; j++) { -      // If they are the same, copy into the higher numbered column. -      // That way we won't have problems with already-merged columns later -      assert(i != j); -      if(mappedVars[i] == mappedVars[j]) { -        if (pres_debug) -          fprintf(DebugFile, "combine_col:Actually combined %d,%d\n", -                  j,i); -        for(k=0; k<problem->nEQs; k++) -          problem->EQs[k].coef[j] += problem->EQs[k].coef[i]; -        for(k=0; k<problem->nGEQs; k++) -          problem->GEQs[k].coef[j] += problem->GEQs[k].coef[i]; -        zero_column(problem, i, 0, 0, problem->nEQs, problem->nGEQs); -        // Create a wildcard w/no constraints.  temporary measure,  -        // so we don't have to shuffle columns -        Variable_ID zero_var = declare(); -        mappedVars[i] = zero_var; -        break; -      } -    } -} - - -void Conjunct::finalize() { -// Debugging version of finalize; copy the conjunct and free the old one, -// so that purify will catch accesses to finalized constraints -//    assert(n_open_constraints == 0); -//    Conjunct *C = this->copy(); -//    parent().replace_child(this, C); -//    delete this; -} - -Conjunct::~Conjunct() { -  NR_CONJUNCTS--; -  delete problem; -  delete comp_problem; -} - - -// -// Cost = # of terms in DNF when negated -//  or CantBeNegated if too bad (i.e. bad wildcards) -//  or AvoidNegating if it would be inexact -// -// Also check pres_legal_negations -- -//   If set to any_negation, just return the number -//   If set to one_geq_or_stride, return CantBeNegated if c > 1 -//   If set to one_geq_or_eq, return CantBeNegated if not a single geq or eq -// - -int Conjunct::cost() { -  int c; -  int i; -  int wc_no; -  int wc_j = 0;  // initialize to shut up the compiler - -  // cost 1 per GEQ, and if 1 GEQ has wildcards, +2 for each of them - -  c = problem->nGEQs; -  for(i=0; i<problem->nGEQs; i++) { -    wc_no = 0; -    for(int j=1; j<=problem->nVars; j++) if(problem->GEQs[i].coef[j]!=0) { -        Variable_ID v = mappedVars[j]; -        if(v->kind()==Wildcard_Var) { -          wc_no++; -          c+=2; -          wc_j = j; -        } -      } -    if (wc_no > 1) return CantBeNegated; -  } - -  for(i=0; i<problem->nEQs; i++) { -    wc_no = 0; -    for(int j=1; j<=problem->nVars; j++) if(problem->EQs[i].coef[j]!=0) { -        Variable_ID v = mappedVars[j]; -        if(v->kind()==Wildcard_Var) { -          wc_no++; -          wc_j = j; -        } -      } - -    if (wc_no == 0)	  // no wildcards -      c+=2; -    else if (wc_no == 1) { // one wildcard - maybe we can negate it -      int i2; -      for(i2=0; i2<problem->nEQs; i2++) -        if(i != i2 && problem->EQs[i2].coef[wc_j]!=0)  break; -      if (i2 >= problem->nEQs)  // Stride constraint -        c++; -      else   // We are not ready to handle this -        return CantBeNegated; -    } -    else		  // Multiple wildcards -      return CantBeNegated; -  } -  if (!exact) return AvoidNegating; - -  if (pres_legal_negations == any_negation) { -    return c; -  } -  else { -    // single GEQ ok either way as long as no wildcards -    // (we might be able to handle wildcards, but I haven't thought about it) -    if (problem->nEQs==0 && problem->nGEQs<=1) { -      if (c>1) { // the GEQ had a wildcard -- I'm not ready to go here. -	      if (pres_debug > 0) { -          fprintf(DebugFile, -                  "Refusing to negate a GEQ with wildcard(s)" -                  " under restricted_negation;  " -                  "It may be possible to fix this.\n"); -        } -	      return CantBeNegated; -	    } -      return c; -    } -    else if (problem->nEQs==1 && problem->nGEQs==0) { -      assert(c == 1 || c == 2); - -      if (pres_legal_negations == one_geq_or_stride) { -	      if (c == 1) -          return c;     // stride constraint is ok -	      else { -          if (pres_debug > 0) { -            fprintf(DebugFile, "Refusing to negate a non-stride EQ under current pres_legal_negations.\n"); -          } -          return CantBeNegated; -        } -	    } -      else { -	      assert(pres_legal_negations == one_geq_or_eq); -	      return c; -	    } -    } -    else { -      if (pres_debug > 0) { -	      fprintf(DebugFile, "Refusing to negate multiple constraints under current pres_legal_negations.\n"); -	    } -      return CantBeNegated; -    } -  } -} - - -// -// Merge CONJ1 & CONJ2 -> CONJ. -// Action: MERGE_REGULAR or MERGE_COMPOSE: regular merge. -//         MERGE_GIST    make constraints from conj2 red, i.e. -//                        Gist Conj2 given Conj1 (T.S. comment).  -// Reorder columns as we go. -// Merge the columns for identical variables.   -// We assume we know nothing about the ordering of conj1, conj2. -// -// Does not consume its arguments -// -// Optional 4th argument gives the relation for the result - if -//  null, conj1 and conj2 must have the same relation, which will -//  be used for the result -// -// The only members of conj1 and conj2 that are used are: problem, -//  mappedVars and declare(), and the leading_0s/leading_dir members -//  and exact. -// -// NOTE: variables that are shared between conjuncts are necessarily  -// declared above, not here; so we can simply create columns for the  -// locals of each conj after doing the protected vars.   -// -Conjunct* merge_conjs(Conjunct* conj1, Conjunct* conj2, -                      Merge_Action action, Rel_Body *body) { -  // body must be set unless both conjuncts are from the same relation -  assert(body || conj1->relation() == conj2->relation()); - -  if (body == conj1->relation() && body == conj2->relation()) -    body = 0;  // we test this later to see if there is a new body - -  Conjunct *conj3 = new Conjunct(NULL, body ? body : conj2->relation()); -  Problem *p1 = conj1->problem; -  Problem *p2 = conj2->problem; -  Problem *p3 = conj3->problem; -  int i; - -  if (action != MERGE_COMPOSE) { -    conj1->assert_leading_info(); -    conj2->assert_leading_info(); -	} - -  if(pres_debug>=2) { -    use_ugly_names++; -    fprintf(DebugFile, ">>> Merge conjuncts: Merging%s:\n", -            (action == MERGE_GIST ? " for gist" : -             (action == MERGE_COMPOSE ? " for composition" : ""))); -    conj1->prefix_print(DebugFile); -    conj2->prefix_print(DebugFile); -    fprintf(DebugFile, "\n"); -    use_ugly_names--; -	} - - - -  switch(action) { -  case MERGE_REGULAR: -  case MERGE_COMPOSE: -    conj3->exact=conj1->exact && conj2->exact; -    break; -  case MERGE_GIST: -    conj3->exact=conj2->exact; -    break; -	} - -  if (action == MERGE_COMPOSE) { -    conj3->guaranteed_leading_0s=min(conj1->guaranteed_leading_0s, -                                     conj2->guaranteed_leading_0s); -    conj3->possible_leading_0s=min((unsigned int) conj1->possible_leading_0s, -                                   (unsigned int) conj2->possible_leading_0s); - -    assert( conj3->guaranteed_leading_0s <= conj3->possible_leading_0s); - -    // investigate leading_dir - not well tested code -    if (conj1->guaranteed_leading_0s<0 || conj2->guaranteed_leading_0s<0) { -	    conj3->leading_dir = 0; -    } -    else if (conj1->guaranteed_leading_0s == conj2->guaranteed_leading_0s) -	    if (conj1->leading_dir == conj2->leading_dir) -        conj3->leading_dir = conj1->leading_dir; -	    else -        conj3->leading_dir = 0; -    else if (conj1->guaranteed_leading_0s < conj2->guaranteed_leading_0s) { -	    conj3->leading_dir = conj1->leading_dir; -    } -    else { // (conj1->guaranteed_leading_0s > conj2->guaranteed_leading_0s) -	    conj3->leading_dir = conj2->leading_dir; -    } - -    if (conj3->leading_dir == 0) -	    conj3->possible_leading_0s = min(conj3->relation()->n_inp(), -                                       conj3->relation()->n_out()); - -    assert(conj3->guaranteed_leading_0s <= conj3->possible_leading_0s); -    assert(conj3->guaranteed_leading_0s == conj3->possible_leading_0s -           || !conj3->leading_dir); -	} -  else if (!body) { // if body is set, who knows what leading 0's mean? -    assert(action == MERGE_REGULAR || action == MERGE_GIST); - -    int feasable = 1; - -    int redAndBlackGuarLeadingZeros = max(conj1->guaranteed_leading_0s, -                                          conj2->guaranteed_leading_0s); -    if (action == MERGE_REGULAR)  -	    conj3->guaranteed_leading_0s= redAndBlackGuarLeadingZeros; -    else conj3->guaranteed_leading_0s=conj1->guaranteed_leading_0s; - -    conj3->possible_leading_0s=min((unsigned)conj1->possible_leading_0s, -                                   (unsigned)conj2->possible_leading_0s); -    if (conj3->possible_leading_0s < redAndBlackGuarLeadingZeros) -	    feasable = 0; -    else if (conj3->guaranteed_leading_0s == -1  -             || conj3->possible_leading_0s > redAndBlackGuarLeadingZeros) -	    conj3->leading_dir = 0; -    else { -	    if (conj1->guaranteed_leading_0s == conj2->guaranteed_leading_0s) -        if (!conj1->leading_dir_valid_and_known()) -          conj3->leading_dir = conj2->leading_dir; -        else if (!conj2->leading_dir_valid_and_known()) -          conj3->leading_dir = conj1->leading_dir; -        else if (conj1->leading_dir * conj2->leading_dir > 0) -          conj3->leading_dir = conj1->leading_dir; // 1,2 same dir -        else -          feasable = 0;  // 1 and 2 go in opposite directions -	    else if (conj3->possible_leading_0s != conj3->guaranteed_leading_0s) -        conj3->leading_dir = 0; -	    else if (conj1->guaranteed_leading_0s<conj2->guaranteed_leading_0s) { -        assert(!conj1->leading_dir_valid_and_known()); -        conj3->leading_dir = conj2->leading_dir; -      } -	    else { -        assert(!conj2->leading_dir_valid_and_known()); -        conj3->leading_dir = conj1->leading_dir; -      } -    } - -    if (!feasable) { -	    if(pres_debug>=2) -        fprintf(DebugFile, ">>> Merge conjuncts: quick check proves FALSE.\n"); - -	    // return 0 = 1 - -	    int e = p3->newEQ();  -	    p3->EQs[e].color   = EQ_BLACK; -	    p3->EQs[e].touched = 1; -	    p3->EQs[e].key     = 0; -	    p3->EQs[e].coef[0] = 1; - -	    // Make sure these don't blow later assertions -	    conj3->possible_leading_0s = conj3->guaranteed_leading_0s = -1; -	    conj3->leading_dir = 0; - -	    return conj3; -    } -	} -  else { // provided "body" argument but not composing, leading 0s meaningless -    conj3->guaranteed_leading_0s = conj3->possible_leading_0s = -1; -    conj3->leading_dir = 0; -	} - -  // initialize omega stuff - -  for(i=0; i<p1->nGEQs+p2->nGEQs; i++) { -    int e = p3->newGEQ(); -    assert(e == i); -    p3->GEQs[e].color   = EQ_BLACK; -    p3->GEQs[e].touched = 1; -    p3->GEQs[e].key     = 0; -	} -  for(i=0; i<p1->nEQs+p2->nEQs; i++) { -    int e = p3->newEQ(); -    assert(e == i); -    p3->EQs[e].color   = EQ_BLACK; -    p3->EQs[e].touched = 1; -    p3->EQs[e].key     = 0; -	} - -  assert(p3->nGEQs == p1->nGEQs + p2->nGEQs); -  assert(p3->nEQs == p1->nEQs + p2->nEQs); - -  // flag constraints from second constraint as red, if necessary   -  if (action == MERGE_GIST) { -    for(i=0; i<p2->nEQs; i++) { -	    p3->EQs[i+p1->nEQs].color = EQ_RED; -    } -    for(i=0; i<p2->nGEQs; i++) { -	    p3->GEQs[i+p1->nGEQs].color = EQ_RED; -    } -	} - -  // copy constant column -  copy_column(p3, 0, p1, 0, 0, 0); -  copy_column(p3, 0, p2, 0, p1->nEQs, p1->nGEQs); -   -  // copy protected variables column from conj1 -  int new_col = 1; -  Variable_Iterator VI(conj1->mappedVars); -  for(i=1; VI; VI++, i++) { -    Variable_ID v = *VI; -    if(v->kind() != Wildcard_Var) { -	    conj3->mappedVars.append(v); -	    int fr_ix = i; -	    copy_column(p3, new_col, p1, fr_ix, 0, 0); -	    zero_column(p3, new_col, p1->nEQs, p1->nGEQs, -                  p2->nEQs, p2->nGEQs); -	    new_col++; -    } -	} -   -  // copy protected variables column from conj2, -  // checking if conj3 already has this variable from conj1 -  for(i=1; i <= conj2->mappedVars.size(); i++) { -    Variable_ID v = conj2->mappedVars[i]; -    if(v->kind() != Wildcard_Var) { -	    int to_ix = conj3->mappedVars.index(v); -	    int fr_ix = i; -	    if(to_ix > 0) { -        // use old column -        copy_column(p3, to_ix, p2, fr_ix, p1->nEQs, p1->nGEQs); -      } -	    else { -        // create new column -        conj3->mappedVars.append(v); -        zero_column(p3, new_col, 0, 0, p1->nEQs, p1->nGEQs); -        copy_column(p3, new_col, p2, fr_ix, p1->nEQs, p1->nGEQs); -        new_col++; -      } -    } -	} - -  p3->safeVars = new_col-1; -   -  // copy wildcards from conj1 -  for(i=1; i <= conj1->mappedVars.size(); i++) { -    Variable_ID v = conj1->mappedVars[i]; -    if(v->kind() == Wildcard_Var) { -	    Variable_ID nv = conj3->declare(v); -	    conj3->mappedVars.append(nv); -	    int fr_ix = i; -	    copy_column(p3, new_col, p1, fr_ix, 0, 0); -	    zero_column(p3, new_col, p1->nEQs, p1->nGEQs, -                  p2->nEQs, p2->nGEQs); -	    new_col++; -    } -	} -   -  // copy wildcards from conj2 -  for(i=1; i <= conj2->mappedVars.size(); i++) { -    Variable_ID v = conj2->mappedVars[i]; -    if(v->kind() == Wildcard_Var) { -	    Variable_ID nv = conj3->declare(v); -	    conj3->mappedVars.append(nv); -	    int fr_ix = i; -	    zero_column(p3, new_col, 0, 0, p1->nEQs, p1->nGEQs); -	    copy_column(p3, new_col, p2, fr_ix, p1->nEQs, p1->nGEQs); -	    new_col++; -    } -	} -  -  p3->nVars = new_col-1; -  checkVars(p3->nVars); -  p3->variablesInitialized = 1; -  for(i=1; i<=p3->nVars; i++) -    p3->var[i] = p3->forwardingAddress[i] = i; -     -  conj3->cols_ordered = true; -  conj3->simplified = false; -  conj3->verified = false; -     -  if(pres_debug>=2) { -    use_ugly_names++; -    fprintf(DebugFile, ">>> Merge conjuncts: result is:\n"); -    conj3->prefix_print(DebugFile); -    fprintf(DebugFile, "\n"); -    use_ugly_names--; -	} - -  conj3->assert_leading_info(); - -  return conj3; -} - - - - -// -// Reorder variables by swapping. -// cols_ordered is just a hint that thorough check needs to be done. -// Sets _safeVars. -//  -void Conjunct::reorder() { -  if(!cols_ordered) { -    int var_no = mappedVars.size(); -    int first_wild = 1; -    int last_prot = var_no; -    while(first_wild < last_prot) { -      for(; first_wild<=var_no && mappedVars[first_wild]->kind()!=Wildcard_Var; -          first_wild++) ; -      for(; last_prot>=1 && mappedVars[last_prot]->kind()==Wildcard_Var; -          last_prot--) ; -      if(first_wild < last_prot) { -        problem->swapVars(first_wild, last_prot); -        problem->variablesInitialized = false; -        Var_Decl *t = mappedVars[first_wild]; -        mappedVars[first_wild] = mappedVars[last_prot]; -        mappedVars[last_prot] = t; -        if(pres_debug) { -          fprintf(DebugFile, "<<<OrderConjCols>>>: swapped var-s %d and %d\n", first_wild, last_prot); -        } -      } -    } - -    int safe_vars; -    for(safe_vars=0; -        safe_vars<var_no && mappedVars[safe_vars+1]->kind()!=Wildcard_Var; -        safe_vars++) ; - -#if ! defined NDEBUG -    for(int s = safe_vars ; s<var_no ; s++ ) { -      assert(mappedVars[s+1]->kind() == Wildcard_Var); -    } -#endif - -    problem->safeVars = safe_vars; -    cols_ordered = true; -  } -} - - - -// Wherever possible, move function symbols to input tuple. -// This ensures that if in == out, red F(in) = x is redundant -// with black F(out) = x - -void Conjunct::move_UFS_to_input() {   -  if (guaranteed_leading_0s > 0) { -    std::set<Global_Var_ID> already_done; -    int remapped = 0; -    skip_finalization_check++; -    Rel_Body *body = relation(); - -    assert(body); -	 -    for (Variable_ID_Iterator func(*body->global_decls()); func; func++) { -	    Global_Var_ID f = (*func)->get_global_var(); -	    if (f->arity() <= guaranteed_leading_0s) -        if (already_done.find(f) == already_done.end() && -            body->has_local(f, Input_Tuple) && -            body->has_local(f, Output_Tuple)) { -          already_done.insert(f); - -          // equatE f(in) = f(out) -          Variable_ID f_in  = body->get_local(f, Input_Tuple); -          Variable_ID f_out = body->get_local(f, Output_Tuple); -          if (f_in != f_out) { -            EQ_Handle e = add_EQ(1); -		 -            e.update_coef_during_simplify(f_in, -1); -            e.update_coef_during_simplify(f_out, 1); -		 -            f_out->remap = f_in; -            remapped = 1; -          } -        }	     -    } - -    if (remapped) { -	    remap(); -	    combine_columns(); -	    reset_remap_field(*body->global_decls()); -	    remapped = 0; -    } -	 -    skip_finalization_check--; -	} -} - - - - - -// -// Simplify CONJ. -// Return TRUE if there are solutions, FALSE -- no solutions. -// -int simplify_conj(Conjunct* conj, int ver_sim, int simplificationEffort, int color) { -  if (conj->verified  -      && simplificationEffort <= conj->r_constrs  -      && (conj->simplified  || simplificationEffort < 0) -      && !color) { -	  if(pres_debug) { -	    fprintf(DebugFile, "$$$ Redundant simplify_conj ignored (%d,%d,%d)\n",ver_sim,simplificationEffort,color); -	    conj->prefix_print(DebugFile); -    } -	  return 1; -  } - -  if (simplificationEffort < 0) simplificationEffort = 0; -  conj->move_UFS_to_input(); -  conj->reorder(); - -  Problem *p = conj->problem; - -  use_ugly_names++; - -  int i; -  for(i=0; i<p->nGEQs; i++) { -    p->GEQs[i].touched = 1; -  } -  for(i=0; i<p->nEQs; i++) { -    p->EQs[i].touched = 1; -  } - -  if(pres_debug) { -    fprintf(DebugFile, "$$$ simplify_conj (%d,%d,%d)[\n",ver_sim,simplificationEffort,color); -    conj->prefix_print(DebugFile); -  } - -  assert(conj->cols_ordered); - -  int ret_code; -  assert(p == conj->problem); -  if(!color) { -    ret_code = conj->simplifyProblem(ver_sim && ! conj->verified,0,simplificationEffort); -  } -  else { -    ret_code = conj->redSimplifyProblem(simplificationEffort,1); -    ret_code = (ret_code==redFalse ? 0 : 1); -  } -  assert(p->nSUBs==0); - -  if(ret_code == 0) { -    if(pres_debug) -      fprintf(DebugFile, "] $$$ simplify_conj : false\n\n"); -    delete conj; -    use_ugly_names--; -    return(false); -  } - - -  // -  // mappedVars is mapping from columns to Variable_IDs. -  // Recompute mappedVars for problem returned from ip.c -  // -  Variable_ID_Tuple new_mapped(0);  // This is expanded by "append" -  for (i=1; i<=p->safeVars; i++) { -    // what is now in column i used to be in column p->var[i] -    Variable_ID v = conj->mappedVars[p->var[i]]; -    assert(v->kind() != Wildcard_Var); -    new_mapped.append(v); -  } - -  /* Redeclare all wildcards that weren't eliminated. */ -  free_var_decls(conj->myLocals);  conj->myLocals.clear(); - -  conj->mappedVars = new_mapped;   -  for (i = p->safeVars+1; i<=p->nVars; i++) { -    Variable_ID v = conj->declare(); -    conj->mappedVars.append(v); -  } - -  // reset var and forwarding address if desired. -  p->variablesInitialized = 1; -  for(i=1; i<=conj->problem->nVars; i++) -    conj->problem->var[i] = conj->problem->forwardingAddress[i] = i; -       -  if(pres_debug) { -    fprintf(DebugFile, "] $$$ simplify_conj\n"); -    conj->prefix_print(DebugFile); -    fprintf(DebugFile, "\n"); -  } - - -  use_ugly_names--; -  conj->simplified = true; -  conj->setup_anonymous_wildcard_names(); - -  return(true); -} - - -int Conjunct::rank() { -  Conjunct *C = this->copy_conj_same_relation(); -  C->reorder(); -  C->ordered_elimination(C->relation()->global_decls()->size()); -  int C_rank = 0; -  for(Variable_Iterator vi = C->mappedVars; vi; vi++) -    if(C->find_column(*vi) > 0) C_rank++; -  delete C; -  return C_rank; - -} - - -void Conjunct::query_difference(Variable_ID v1, Variable_ID v2, coef_t &lowerBound, coef_t &upperBound, bool &guaranteed) { -  int c1 = get_column(v1); -  int c2 = get_column(v2); -  assert(c1 && c2); -  problem->query_difference(c1, c2, lowerBound, upperBound, guaranteed); -} - - -void Conjunct::query_variable_bounds(Variable_ID v, coef_t &lowerBound, coef_t &upperBound) { -  int c = get_column(v); -  assert (c); -  problem->query_variable_bounds(c, &lowerBound, &upperBound); -} - -coef_t Conjunct::query_variable_mod(Variable_ID v, coef_t factor) { -  int c = get_column(v); -  assert(c); -  return problem->query_variable_mod(c, factor); -} - -bool Conjunct::query_variable_used(Variable_ID v) { -  for (GEQ_Iterator g = GEQs(); g.live(); g.next()) { -    if ((*g).get_coef(v)) return true; -	} -  for (EQ_Iterator e = EQs(); e.live(); e.next()) { -    if ((*e).get_coef(v)) return true; -	} -  return false; -} - - -int Conjunct::simplifyProblem(int verify, int subs, int redundantElimination) { -  if (verified) verify = 0; -  int result = problem->simplifyProblem(verify, subs, redundantElimination); -  if (result == false && !exact) -    exact=true; -  assert(!(verified && verify && result == false)); -  if (verify && result) verified = true; -  else if (!result) verified = false; -  return result; -} - - -// not as confident about this one as the previous: -int Conjunct::redSimplifyProblem(int effort, int computeGist) { -  redCheck result = problem->redSimplifyProblem(effort, computeGist); -  if (result == redFalse && !exact) -    exact=true; -  return result; -} - - -// -// Add given list of wildcards S to this Conjunct. -// Clears argument. (That's very important, otherwise those var_id's get freed) -// Push_exists takes responsibility for reusing or deleting Var_ID's; -//  here we reuse them.  Must also empty out the Tuple when finished (joins). -void Conjunct::push_exists(Variable_ID_Tuple &S) { -  for(Tuple_Iterator<Variable_ID> VI(S); VI; VI++) { -    (*VI)->var_kind = Wildcard_Var; -  } -  myLocals.join(S);       // Sets S to be empty. -  cols_ordered = false; -  simplified = false; -} - - -Conjunct *Formula::add_conjunct() { -  assert_not_finalized(); -  assert(can_add_child()); -  Conjunct *f = new Conjunct(this, myRelation); -  myChildren.append(f); -  return f; -} - -// Compress/uncompress functions - -bool Conjunct::is_compressed() { -  if(problem!=NULL && comp_problem==NULL) { -    return false; -  } -  else if(problem==NULL && comp_problem!=NULL) { -    return true; -  } -  else { -    assert(0 && "Conjunct::is_compressed: bad conjunct"); -    return false; -  } -} - - -void Conjunct::compress() { -  if(!is_compressed()) {    // compress -    comp_problem = new Comp_Problem(problem); -    delete problem; -    problem = NULL; -  } -} - - -void Conjunct::uncompress() { -  if(is_compressed()) { -    problem = comp_problem->UncompressProblem(); -    delete comp_problem; -    comp_problem = NULL; -  } -} - - -Comp_Problem::Comp_Problem(Problem *problem) : -  _nVars(problem->nVars),  -  _safeVars(problem->safeVars), -  _get_var_name(problem->get_var_name),  -  _getVarNameArgs(problem->getVarNameArgs), -  eqs(&problem->EQs[0],problem->nEQs,problem->nVars),  -  geqs(&problem->GEQs[0],problem->nGEQs,problem->nVars) { -} - -Comp_Constraints::Comp_Constraints(eqn *constrs, int no_constrs, int no_vars) : -  n_constrs(no_constrs),  -  n_vars(no_vars) { -  coefs = new coef_t[(n_vars+1)*n_constrs]; -  int e, v; -  for(e=0; e<n_constrs; e++) { -    for(v=0; v<=n_vars; v++) { -      coefs[coef_index(e,v)] = constrs[e].coef[v]; -    } -  } -} - - -Comp_Constraints::~Comp_Constraints() { -  delete coefs; -} - - -Problem *Comp_Problem::UncompressProblem() { -  Problem *p = new Problem(eqs.n_constraints(), geqs.n_constraints()); -  p->get_var_name     = get_var_name; -  p->getVarNameArgs = _getVarNameArgs; -  p->nVars          = _nVars; -  p->safeVars       = _safeVars; -  for(int i=1; i<=p->nVars; i++) { -		p->forwardingAddress[i] = i; -		p->var[i] = i; -  } -  eqs.UncompressConstr(&p->EQs[0], p->nEQs); -  geqs.UncompressConstr(&p->GEQs[0], p->nGEQs); -  return p; -} - -void Comp_Constraints::UncompressConstr(eqn *constrs, short &pn_constrs) { -  int e, v; -  for(e=0; e<n_constrs; e++) { -    eqnnzero(&constrs[e], 0); -    for(v=0; v<=n_vars; v++) { -      constrs[e].coef[v] = coefs[coef_index(e,v)]; -    } -    constrs[e].touched = 1; -  } -  pn_constrs = n_constrs; -} - - -void Conjunct::convertEQstoGEQs(bool excludeStrides) {  -  simplify_conj(this,true,1,EQ_BLACK);  // don't remember why I want to comment this statement out with reason "will cause inconsistency between Conjunct::mappedVars and Problem::nVars",  06/09/2009 by chun -  problem->convertEQstoGEQs(excludeStrides); -} - - -void Conjunct::calculate_dimensions(Relation &R, int &ndim_all, int &ndim_domain) { - -  Conjunct * c = this; -  Relation rc=Relation(R, c); - -  if(relation_debug) { -    fprintf(DebugFile,"{{{\nIn Conjunct::calculate_dimensions:\n"); -    rc.prefix_print(DebugFile); -  } - -  rc=Approximate(rc); -  Relation rd=rc; - -  if(relation_debug) { -    fprintf(DebugFile,"Conjunct::calculate_dimensions: Approximated as:\n"); -    rc.prefix_print(DebugFile); -  } - -  // skip_set_checks++; - -  Conjunct * rc_conj=rc.single_conjunct(); -  ndim_all=rc.n_inp()+rc.n_out(); -  ndim_all-=rc_conj->n_EQs(); - -  rc = Project_On_Sym(rc); -  rc.simplify(); - -  if(relation_debug) { -    fprintf(DebugFile, "Conjunct::calculate_dimensions: after project_on_sym\n"); -    rc.prefix_print(DebugFile); -  } - -  int n_eq_sym = 1000; -  for (DNF_Iterator s(rc.query_DNF()); s.live(); s.next())  -    n_eq_sym = min(n_eq_sym, s.curr()->n_EQs()); -  ndim_all+=n_eq_sym; -  // skip_set_checks--; - -  if (R.is_set())  -    ndim_domain = ndim_all; -  else { -    /* get dimensions for the domain (broadcasting) */ - -    rd=Domain(rd); -    rd.simplify(); - -    if(relation_debug) { -      fprintf(DebugFile,"Domain is:\n"); -      rd.prefix_print(DebugFile); -    } - -    rc_conj=rd.single_conjunct(); -    ndim_domain=rd.n_set()-rc_conj->n_EQs()+n_eq_sym; -  } - -  if(relation_debug) { -    fprintf(DebugFile,"n_eq_sym=%d \n",n_eq_sym); -    fprintf(DebugFile,"Dimensions: all=%d domain=%d\n}}}\n", ndim_all,ndim_domain); -  } -} - -} // namespace diff --git a/omega/omega_lib/src/pres_decl.cc b/omega/omega_lib/src/pres_decl.cc deleted file mode 100644 index f5ac312..0000000 --- a/omega/omega_lib/src/pres_decl.cc +++ /dev/null @@ -1,71 +0,0 @@ -#include <omega/pres_decl.h> -#include <omega/omega_i.h> - -namespace omega { - -// -// Declare functions. -// -Variable_ID F_Declaration::do_declare(Const_String s, Var_Kind var_type) { -  Variable_ID v; -  assert(var_type != Global_Var); -  if(!s.null()) { -    v = new Var_Decl(s, var_type, 0); -  } -  else { -    v = new Var_Decl(var_type, 0); -  } -  myLocals.append(v); -  return v; -} - -Variable_ID F_Declaration::declare(Const_String) { -  assert(0);  // must be declared in forall, exists, or conjunct -  return(NULL); -} - -Section<Variable_ID> F_Declaration::declare_tuple(int n) { -  int first = myLocals.size()+1; - -  for (int i=1 ; i<=n; i++) -    declare(); - -  return Section<Variable_ID>(&myLocals, first, n); -} - - -void F_Declaration::finalize() { -  assert(n_children() == 1); -  Formula::finalize(); -} - -bool F_Declaration::can_add_child() { -  return n_children() < 1; -} - - -F_Declaration::F_Declaration(Formula *p, Rel_Body *r): -  Formula(p,r), myLocals(0) { -} - -F_Declaration::F_Declaration(Formula *p, Rel_Body *r, Variable_ID_Tuple &S): -  Formula(p,r), myLocals(S) { -} - -// -// Destruct declarative node. -// Delete variableID's themselves if they are not global. -// -F_Declaration::~F_Declaration() { -  free_var_decls(myLocals); -} - -//Setup names for printing -void F_Declaration::setup_anonymous_wildcard_names() { -  for(Tuple_Iterator<Variable_ID> VI(myLocals); VI; VI++) { -    Variable_ID v = *VI; -    if (v->base_name.null()) v->instance = wildCardInstanceNumber++; -  } -} - -} // namespace diff --git a/omega/omega_lib/src/pres_dnf.cc b/omega/omega_lib/src/pres_dnf.cc deleted file mode 100644 index c9fd7e6..0000000 --- a/omega/omega_lib/src/pres_dnf.cc +++ /dev/null @@ -1,1416 +0,0 @@ -/***************************************************************************** - Copyright (C) 1994-2000 the Omega Project Team - Copyright (C) 2005-2011 Chun Chen - All Rights Reserved. - - Purpose: -   Functions for disjunctive normal form. - - Notes: - - History: -*****************************************************************************/ - -#include <basic/Bag.h> -#include <omega/pres_dnf.h> -#include <omega/pres_conj.h> -#include <omega/pres_tree.h>  /* all DNFize functions are here */ -#include <omega/Relation.h> -#include <omega/omega_i.h> - -namespace omega { - -void DNF::remap() { -  for(DNF_Iterator DI(this); DI.live(); DI.next()) { -    Conjunct *C = DI.curr(); -    C->remap(); -  } -} - - -// -// DNF1 & DNF2 -> DNF. -// Free arguments. -// -DNF* DNF_and_DNF(DNF* dnf1, DNF* dnf2) { -  DNF* new_dnf = new DNF; -  for(DNF_Iterator p(dnf2); p.live(); p.next()) { -    new_dnf->join_DNF(DNF_and_conj(dnf1, p.curr())); -  } -  delete dnf1; -  delete dnf2; -  if(new_dnf->length() > 1) { -    new_dnf->simplify(); -  } - -  if(pres_debug) { -    fprintf(DebugFile, "+++ DNF_and_DNF OUT +++\n"); -    new_dnf->prefix_print(DebugFile); -  } -  return(new_dnf); -} - - -/* - * Remove redundant conjuncts from given DNF. - * If (C1 => C2), remove C1. - * C1 => C2 is TRUE: when problem where C1 is Black and C2 is Red  - * Blk   Red       : has no red constraints. - * It means that C1 is a subset of C2 and therefore C1 is redundant. - * - * Exception: C1 => UNKNOWN - leave them as they are - */ -void DNF::rm_redundant_conjs(int effort) { -  if(is_definitely_false() || has_single_conjunct()) -    return; - -  use_ugly_names++; -  // skip_set_checks++; - -  int count = 0; -  for(DNF_Iterator p(this); p.live(); p.next()) count++; - -  if(pres_debug) { -    int i = 0; -    fprintf(DebugFile, "@@@ rm_redundant_conjs IN @@@[\n"); -    prefix_print(DebugFile); -    for(DNF_Iterator p(this); p.live(); p.next()) -      fprintf(DebugFile, "#%d = %p\n", ++i, p.curr()); -  } - -  DNF_Iterator pdnext; -  DNF_Iterator pdel(this); -  for(; pdel.live(); pdel=pdnext) { -    pdnext = pdel; -    pdnext.next(); -    Conjunct *cdel = pdel.curr(); -    int del_min_leading_zeros = cdel->query_guaranteed_leading_0s(); -    int del_max_leading_zeros = cdel->query_possible_leading_0s(); - -    for(DNF_Iterator p(this); p.live(); p.next()) { -      Conjunct *c = p.curr(); -      if(c != cdel) { -        int c_min_leading_zeros = cdel->query_guaranteed_leading_0s(); -        int c_max_leading_zeros = cdel->query_possible_leading_0s(); -        if(pres_debug) -          fprintf(DebugFile, "@@@ rm_redundant_conjs @%p => @%p[\n", cdel, c); - -        if (c->is_inexact() && cdel->is_exact()) { -          if (pres_debug) -            fprintf(DebugFile, "]@@@ rm_redundant_conjs @@@ Exact Conj => Inexact Conj is not tested\n"); -        } -        else if (del_min_leading_zeros  >=0 && c_min_leading_zeros >= 0 -                 && c_max_leading_zeros >= 0 && del_max_leading_zeros >=0 -                 && (del_min_leading_zeros  > c_max_leading_zeros -                     || c_min_leading_zeros > del_max_leading_zeros)) { -          if (1 || pres_debug) -            fprintf(DebugFile, "]@@@ not redundant due to leading zero info\n"); -        } -        else { -          Conjunct *cgist = merge_conjs(cdel, c, MERGE_GIST); - -          if (!cgist->redSimplifyProblem(effort,0)) { -            if(pres_debug) { -              fprintf(DebugFile, "]@@@ rm_redundant_conjs @@@ IMPLICATION TRUE @%p\n", cdel); -              cdel->prefix_print (DebugFile); -              fprintf(DebugFile, "=>\n"); -              c->prefix_print (DebugFile); -            } -            rm_conjunct(cdel); -            delete cdel; -            delete cgist; -            break; -          } -          else { -            if(pres_debug) { -              fprintf(DebugFile, "]@@@ rm_redundant_conjs @@@ IMPLICATION FALSE @%p\n", cdel); -              if(pres_debug > 1) -                cgist->prefix_print(DebugFile); -            } -            delete cgist; -          } -        } -      } -    } -  } - -  if(pres_debug) { -    fprintf(DebugFile, "]@@@ rm_redundant_conjs OUT @@@\n"); -    prefix_print(DebugFile); -  } -  // skip_set_checks--; -  use_ugly_names--; -} - - -/* Remove  inexact conjuncts from given DNF if it contains UNKNOWN - * conjunct - */ - -void DNF::rm_redundant_inexact_conjs() { -  if (is_definitely_false() || has_single_conjunct()) -    return; - -  bool has_unknown=false; -  bool has_inexact=false; - -  Conjunct * c_unknown = 0;  // make compiler shut up -  for (DNF_Iterator p(this); p.live(); p.next()) { -    assert (p.curr()->problem!=NULL); -    if (p.curr()->is_inexact()) { -      if (p.curr()->is_unknown()) { -        has_unknown=true; -        c_unknown = p.curr(); -      } -      else -        has_inexact=true; -    } -  } - -  if (! has_unknown || ! has_inexact) -    return; - -  use_ugly_names++; -  // skip_set_checks++;   - -  DNF_Iterator pdnext; -  DNF_Iterator pdel(this); - -  for (; pdel.live(); pdel=pdnext) { -    pdnext = pdel; -    pdnext.next(); -    Conjunct * cdel=pdel.curr(); -    if (cdel->is_inexact() && cdel!=c_unknown) { -      rm_conjunct(cdel); -      delete cdel; -    } -  } - -  use_ugly_names--; -  // skip_set_checks--; -} -   - - -// -// DNF properties. -// -bool DNF::is_definitely_false() const { -  return(conjList.empty()); -} - -bool DNF::is_definitely_true() const { -  return(has_single_conjunct() && single_conjunct()->is_true()); -} - -int DNF::length() const { -  return conjList.length(); -} - -Conjunct *DNF::single_conjunct() const { -  assert(conjList.length()==1); -  return(conjList.front()); -} - -bool DNF::has_single_conjunct() const { -  return (conjList.length()==1); -} - -Conjunct *DNF::rm_first_conjunct() { -  if(conjList.empty()) { -    return NULL; -  } -  else { -    return conjList.remove_front(); -  } -} - - -// -// Convert DNF to Formula and add it root. -// Free this DNF.  -// -void DNF::DNF_to_formula(Formula* root) { -  Formula *new_or; -  if (conjList.length()!=1) { -    skip_finalization_check++; -    new_or = root->add_or(); -    skip_finalization_check--; -  } -  else { -    new_or = root; -  } -  while(!conjList.empty()) { -    Conjunct *conj = conjList.remove_front(); -    new_or->add_child(conj); -  } -  delete this; -} - - -// -// DNF functions. -// -DNF::DNF() : conjList() { -} - -DNF::~DNF() { -  // for(DNF_Iterator p(this); p.live(); p.next()) { -  //   if(p.curr() != NULL) -  //     delete p.curr(); -  // } -  for(List_Iterator<Conjunct *> i(conjList); i.live(); i.next()) -    delete *i; -} - -// -// Copy DNF -// -DNF* DNF::copy(Rel_Body *rel_body) { -  DNF *new_dnf = new DNF; -  for(DNF_Iterator pd(this); pd.live(); pd.next()) { -    Conjunct *conj = pd.curr(); -    if(conj) -      new_dnf->add_conjunct(conj->copy_conj_diff_relation(rel_body,rel_body)); -  } -  return(new_dnf); -} - -// -// Add Conjunct to DNF -// -void DNF::add_conjunct(Conjunct* conj) { -  conjList.append(conj); -} - -// -// Add DNF to DNF. -// The second DNF is reused. -// -void DNF::join_DNF(DNF* dnf) { -  conjList.join(dnf->conjList); -  delete dnf; -} - -// -// Remove conjunct from DNF. -// Conjunct itself is not deleted. -// -void DNF::rm_conjunct(Conjunct *c) { -  if(conjList.front() == c) { -    conjList.remove_front(); -  } -  else { -    List_Iterator<Conjunct*> p, pp; -    for(p=List_Iterator<Conjunct*> (conjList); p; p++) { -      if((*p)==c) { -        conjList.del_after(pp); -        return; -      } -      pp = p; -    } -    assert(0 && "DNF::rm_conjunct: no such conjunct"); -  } -} - - -// remove (but don't delete) all conjuncts - -void DNF::clear() { -  conjList.clear(); -} - - -// -// DNF & CONJ -> new DNF. -// Don't touch arguments. -// -DNF* DNF_and_conj(DNF* dnf, Conjunct* conj) { -  DNF* new_dnf = new DNF; -  for(DNF_Iterator p(dnf); p.live(); p.next()) { -    Conjunct* new_conj = merge_conjs(p.curr(), conj, MERGE_REGULAR); -    new_dnf->add_conjunct(new_conj); -  } -  if(new_dnf->length() > 1) { -    new_dnf->simplify(); -  } -  return(new_dnf); -} - -// -// Compute C0 and not (C1 or C2 or ... CN). -// Reuse/delete its arguments. -// -DNF* conj_and_not_dnf(Conjunct *positive_conjunct, DNF *neg_conjs, bool weak) { -  DNF *ret_dnf = new DNF; -  int recursive = 0; -  use_ugly_names++; - -  if(pres_debug) { -    fprintf(DebugFile, "conj_and_not_dnf [\n"); -    fprintf(DebugFile, "positive_conjunct:\n"); -    positive_conjunct->prefix_print(DebugFile); -    fprintf(DebugFile, "neg_conjs:\n"); -    neg_conjs->prefix_print(DebugFile); -    fprintf(DebugFile, "\n\n"); -  } - -  if (simplify_conj(positive_conjunct, true, false, EQ_BLACK) == false) { -    positive_conjunct = NULL; -    goto ReturnDNF; -  } - -  /* Compute gists of negative conjuncts given positive conjunct */ - - -  int c0_updated; -  c0_updated = true; -  while(c0_updated) { -    c0_updated = false; -    for(DNF_Iterator p(neg_conjs); p.live(); p.next()) { -      Conjunct *neg_conj = p.curr(); -      if(neg_conj==NULL) continue; -      if (!positive_conjunct->is_exact() -          && !neg_conj->is_exact()) { -        // C1 and unknown & ~(C2 and unknown) = C1 and unknown -        delete neg_conj; -        p.curr_set(NULL); -        continue; -      } -      Conjunct *cgist = merge_conjs(positive_conjunct, neg_conj, MERGE_GIST); -      if(simplify_conj(cgist, false, true, EQ_RED) == false) { -        // C1 & ~FALSE = C1 -        delete neg_conj; -        p.curr_set(NULL); -      }  -      else { -        cgist->rm_color_constrs(); -        if(cgist->is_true()) { -          // C1 & ~TRUE = FALSE -          delete cgist; -          goto ReturnDNF; -        }  -        else { -          if(cgist->cost()==1) {        // single inequality -            DNF *neg_dnf = negate_conj(cgist); -            delete cgist; -            Conjunct *conj = -              merge_conjs(positive_conjunct, neg_dnf->single_conjunct(), MERGE_REGULAR); -            delete positive_conjunct; -            delete neg_dnf; -            positive_conjunct = conj; -            delete neg_conj; -            p.curr_set(NULL); -            if(!simplify_conj(positive_conjunct, false, false, EQ_BLACK)) { -              positive_conjunct = NULL; -              goto ReturnDNF; -            } -            c0_updated = true; -          }  -          else { -            delete neg_conj; -            p.curr_set(cgist); -          } -        } -      } -    } -  } - -  if(pres_debug) { -    fprintf(DebugFile, "--- conj_and_not_dnf positive_conjunct NEW:\n"); -    positive_conjunct->prefix_print(DebugFile); -    fprintf(DebugFile, "--- conj_and_not_dnf neg_conjs GISTS:\n"); -    neg_conjs->prefix_print(DebugFile); -    fprintf(DebugFile, "--- conj_and_not_dnf ---\n\n"); -  } - -  /* Find minimal negative conjunct */ -  { -    Conjunct *min_conj = NULL; -    int min_cost = INT_MAX; -    DNF_Iterator min_p; -    int live_count = 0; -    for(DNF_Iterator q(neg_conjs); q.live(); q.next()) { -      Conjunct *neg_conj = q.curr(); -      if(neg_conj!=NULL) { -        live_count++; -        if(neg_conj->cost() < min_cost) { -          min_conj = neg_conj; -          min_cost = neg_conj->cost(); -          min_p = q; -        } -      } -    } - -    /* Negate minimal conjunct, AND result with positive conjunct */ -    if(weak || min_conj==NULL) { -      ret_dnf->add_conjunct(positive_conjunct); -      positive_conjunct = NULL; -    } -    else if (min_cost == CantBeNegated) { -      static int OMEGA_WHINGE = -1; -      if (OMEGA_WHINGE < 0) { -        OMEGA_WHINGE = getenv("OMEGA_WHINGE") ? atoi(getenv("OMEGA_WHINGE")) : 0; -      } -      if (OMEGA_WHINGE) { -        fprintf(stderr, "Ignoring negative clause that can't be negated and generating inexact result\n"); -        if (!pres_debug) fprintf(DebugFile, "Ignoring negative clause that can't be negated and generating inexact result\n"); -      } - -      positive_conjunct->make_inexact(); -      ret_dnf->add_conjunct(positive_conjunct); -      positive_conjunct = NULL; -      if(pres_debug)  -        fprintf(DebugFile, "Ignoring negative clause that can't be negated and generating inexact upper bound\n"); -    } -    else { -      DNF *neg_dnf = negate_conj(min_conj); -      delete min_conj; -      min_p.curr_set(NULL); -      DNF *new_pos = DNF_and_conj(neg_dnf, positive_conjunct); -      delete neg_dnf; -      delete positive_conjunct; -      positive_conjunct = NULL; -      // new_dnf->rm_redundant_conjs(2); -      if(live_count>1) { -        recursive = 1; -        for(DNF_Iterator pd(new_pos); pd.live(); pd.next()) { -          Conjunct *conj = pd.curr(); -          ret_dnf->join_DNF(conj_and_not_dnf(conj, neg_conjs->copy(conj->relation()))); -          pd.curr_set(NULL); -        } -        delete new_pos; -      } -      else { -        ret_dnf->join_DNF(new_pos); -      } -    } -  } - -ReturnDNF:; -  delete positive_conjunct; -  delete neg_conjs; - -  //if (recursive) ret_dnf->rm_redundant_conjs(1); - -  if(pres_debug) { -    fprintf(DebugFile, "] conj_and_not_dnf RETURN:\n"); -    ret_dnf->prefix_print(DebugFile); -    fprintf(DebugFile, "\n\n"); -  } -  use_ugly_names--; -  return ret_dnf; -} - -/* first some functions for manipulating oc "problems" */ - -static void EqnnZero(eqn *e, int s) { -//   memset((char*)e, 0, (headerWords+1+s)*sizeof(int)); -  e->key = 0; -  e->touched = 0; -  e->color = EQ_BLACK; -  e->essential = 0; -  e->varCount = 0; -  for (int i = 0; i <= s; i++) -    e->coef[i] = 0;     -} - -/* - * Make a new black equation in a given problem  - */ -static int NewEquation(Problem *p) { -  int e = p->newEQ(); -  EqnnZero(&p->EQs[e], p->nVars); -  return e; -} - -/* - * Make a new black inequality in a given problem  - */ -static int NewInequality(Problem *p) { -  int g = p->newGEQ(); -  EqnnZero(&p->GEQs[g], p->nVars); -  return g; -} - -// -// ~CONJ -> DNF -// -DNF* negate_conj(Conjunct* conj) { -  if(pres_debug) { -    fprintf(DebugFile, "%%%%%% negate_conj IN %%%%%%\n"); -    conj->prefix_print(DebugFile); -    fprintf(DebugFile, "\n"); -  } - -  DNF* new_dnf = new DNF; -  Problem *p = conj->problem; -  int i, j,k; - -  if (!conj->is_exact()) new_dnf->add_conjunct(conj->copy_conj_same_relation()); - -  Conjunct* true_part = new Conjunct(NULL, conj->relation()); -  Problem *tp = true_part->problem; -  copy_conj_header(true_part, conj); -  true_part->invalidate_leading_info(); -  int *wildCard = new int[p->nGEQs]; -  int *handleIt = new int[p->nVars+1]; -  for(j=1; j<=p->nVars; j++) handleIt[j] = false; - -  for(i=0; i<p->nGEQs; i++) { -    wildCard[i] = 0; -    for(j=1; j<=p->nVars; j++) { -      Variable_ID v = conj->mappedVars[j]; -      if(v->kind()==Wildcard_Var && p->GEQs[i].coef[j]!=0) { -        assert(wildCard[i] == 0); -        handleIt[j] = true; -        if (p->GEQs[i].coef[j] > 0) wildCard[i] = j; -        else wildCard[i] = -j; -      } -    } -  } - -  for(i=0; i<p->nGEQs; i++) if (wildCard[i] == 0) { -      /* ~(ax + by + c >= 0) = (-ax -by -c-1 >= 0) */ -      Conjunct* new_conj = true_part->copy_conj_same_relation(); -      Problem *np = new_conj->problem; -      new_conj->exact=true; -      int n_e = NewInequality(np); -      int t_e = NewInequality(tp); -      np->GEQs[n_e].coef[0] = -p->GEQs[i].coef[0]-1; -      tp->GEQs[t_e].coef[0] = p->GEQs[i].coef[0]; -      for(j=1; j<=p->nVars; j++) { -        Variable_ID v = conj->mappedVars[j]; -        if(v->kind()==Wildcard_Var && p->GEQs[i].coef[j]!=0) { -          assert(0 && "negate_conj: wildcard in inequality"); -        } -        np->GEQs[n_e].coef[j] = -p->GEQs[i].coef[j]; -        tp->GEQs[t_e].coef[j] = p->GEQs[i].coef[j]; - -      } -      assert(j-1 == p->nVars); -      assert(j-1 == conj->mappedVars.size()); -      new_dnf->add_conjunct(new_conj); -    } - - -  for(i=0; i<p->nEQs; i++) { -    int wc_no = 0; -    int wc_j = 0;  // make complier shut up -    for(j=1; j<=p->nVars; j++) { -      Variable_ID v = conj->mappedVars[j]; -      if(v->kind()==Wildcard_Var && p->EQs[i].coef[j]!=0) { -        wc_no++; -        wc_j = j; -      } -    } - -    if(wc_no!=0) { -#if ! defined NDEBUG -      int i2; -      assert(!handleIt[wc_j]); -      for(i2=0; i2<p->nEQs; i2++) -        if(i != i2 && p->EQs[i2].coef[wc_j] != 0)  break; -      assert(i2 >= p->nEQs); -#endif -      assert(wc_no == 1 && "negate_conj: more than 1 wildcard in equality"); - -      // === Negating equality with a wildcard for K>0 === -      // ~(exists v st expr + K v  + C = 0) = -      //  (exists v st 1 <= - expr - K v - C <= K-1) - -      Conjunct *nc = true_part->copy_conj_same_relation(); -      Problem *np = nc->problem; -      nc->exact=true; - -      // -K alpha = expr  <==>  K alpha = expr -      if(p->EQs[i].coef[wc_j]<0) -        p->EQs[i].coef[wc_j] = -p->EQs[i].coef[wc_j]; - -      if(p->EQs[i].coef[wc_j]==2) { -        // ~(exists v st  expr +2v +C = 0) = -        //  (exists v st -expr -2v -C = 1) -        // That is (expr +2v +C+1 = 0) -        int e = NewEquation(np); -        np->EQs[e].coef[0] = p->EQs[i].coef[0] +1; -        for(j=1; j<=p->nVars; j++) { -          np->EQs[e].coef[j] = p->EQs[i].coef[j]; -        } -      } -      else { -        // -expr -Kv -C-1 >= 0 -        int e = NewInequality(np); -        np->GEQs[e].coef[0] = -p->EQs[i].coef[0] -1; -        for(j=1; j<=p->nVars; j++) { -          np->GEQs[e].coef[j] = -p->EQs[i].coef[j]; -        } - -        // +expr +Kv +C+K-1 >= 0 -        e = NewInequality(np); -        np->GEQs[e].coef[0] = p->EQs[i].coef[0] +p->EQs[i].coef[wc_j] -1; -        for(j=1; j<=p->nVars; j++) { -          np->GEQs[e].coef[j] = p->EQs[i].coef[j]; -        } -      } - -      new_dnf->add_conjunct(nc); - -    } -    else { -      /* ~(ax + by + c = 0) = (-ax -by -c-1 >= 0) Or (ax + by + c -1 >= 0) */ -      Conjunct *nc1 = true_part->copy_conj_same_relation(); -      Conjunct *nc2 = true_part->copy_conj_same_relation(); -      Problem* np1 = nc1->problem; -      Problem* np2 = nc2->problem; -      nc1->invalidate_leading_info(); -      nc2->invalidate_leading_info(); -      nc1->exact=true; -      nc2->exact=true; -      int n_e1 = NewInequality(np1); -      int n_e2 = NewInequality(np2); -      np1->GEQs[n_e1].coef[0] = -p->EQs[i].coef[0]-1; -      np2->GEQs[n_e2].coef[0] =  p->EQs[i].coef[0]-1; -      for(j=1; j<=p->nVars; j++) { -        coef_t coef = p->EQs[i].coef[j]; -        np1->GEQs[n_e1].coef[j] = -coef; -        np2->GEQs[n_e2].coef[j] =  coef; -      } -      new_dnf->add_conjunct(nc1); -      new_dnf->add_conjunct(nc2); -    } -    { -      int e = NewEquation(tp); -      tp->EQs[e].coef[0] =  p->EQs[i].coef[0]; -      for(j=1; j<=p->nVars; j++)  -        tp->EQs[e].coef[j] = p->EQs[i].coef[j]; -    } -  } - -  for(j=1; j<=p->nVars; j++) -    if (handleIt[j]) { -      for(i=0; i<p->nGEQs; i++) -        if (wildCard[i] == j) -          for(k=0; k<p->nGEQs; k++) if (wildCard[k] == -j){ -              // E_i <= c_i alpha -              //        c_k alpha <= E_k -              // c_k E_i <= c_i c_k alpha <= c_i E_k -              // c_k E_i <= c_i c_k floor (c_i E_k / c_i c_k) -              // negating: -              // c_k E_i > c_i c_k floor (c_i E_k / c_i c_k) -              // c_k E_i > c_i c_k beta > c_i E_k - c_i c_k -              // c_k E_i - 1 >= c_i c_k beta >= c_i E_k - c_i c_k + 1 -              Conjunct* new_conj = true_part->copy_conj_same_relation(); -              Problem *np = new_conj->problem; -              coef_t c_k = - p->GEQs[k].coef[j]; -              coef_t c_i = p->GEQs[i].coef[j]; -              assert(c_k > 0); -              assert(c_i > 0); -              new_conj->exact=true; -              int n_e = NewInequality(np); -              // c_k E_i - 1 >= c_i c_k beta  -              int v; -              for(v=0; v<=p->nVars; v++) { -                np->GEQs[n_e].coef[v] = - c_k * p->GEQs[i].coef[v]; -              } -              np->GEQs[n_e].coef[j] = -c_i * c_k; -              np->GEQs[n_e].coef[0]--; - -              n_e = NewInequality(np); -              // c_i c_k beta >= c_i E_k - c_i c_k + 1 -              // c_i c_k beta + c_i c_k -1 >= c_i E_k  -              for(v=0; v<=p->nVars; v++) { -                np->GEQs[n_e].coef[v] = - c_i * p->GEQs[k].coef[v]; -              } -              np->GEQs[n_e].coef[j] = c_i * c_k; -              np->GEQs[n_e].coef[0] += c_i * c_k -1; - -              new_dnf->add_conjunct(new_conj); -            } -    } - -  if(pres_debug) { -    fprintf(DebugFile, "%%%%%% negate_conj OUT %%%%%%\n"); -    new_dnf->prefix_print(DebugFile); -  } -  delete true_part; -  delete[] wildCard; -  delete[] handleIt; -  return(new_dnf); -} - - - - -/////////////////////////////////////////////////////// -// DNFize formula -- this is the real simplification // -// It also destroys the formula it simplifies        // -/////////////////////////////////////////////////////// - - - -// -// Try to separate positive and negative clauses below the AND, -// letting us use the techniques described in Pugh & Wonnacott: -// "An Exact Method for Value-Based Dependence Analysis" -// - - -DNF* F_And::DNFize() { -  Conjunct *positive_conjunct = NULL; -  DNF *neg_conjs = new DNF; -  List<DNF*> pos_dnfs; -  List_Iterator<DNF*> pos_dnf_i; -  DNF *new_dnf = new DNF; -  int JustReturnDNF = 0; - -  use_ugly_names++; - -  if(pres_debug) { -    fprintf(DebugFile, "\nF_And:: DNFize [\n"); -    prefix_print(DebugFile); -  } - -  if(children().empty()) { -    Conjunct * c=new Conjunct(NULL, relation()); -    new_dnf->add_conjunct(c); -  } -  else { -    while(!children().empty()) { -      Formula* carg = children().remove_front(); -      if(carg->node_type()==Op_Not) { -        // DNF1 & ~DNF2 -> DNF -        DNF *dnf = carg->children().remove_front()->DNFize(); -        delete carg; -        neg_conjs->join_DNF(dnf);       // negative conjunct -      } -      else { -        // DNF1 & DNF2 -> DNF -        DNF *dnf = carg->DNFize(); -        int dl = dnf->length(); -        if(dl==0) { -          // DNF & false -> false -          delete this; -          JustReturnDNF = 1; -          break; -        } -        else if(dl==1) { -          // positive conjunct -          Conjunct *conj = dnf->rm_first_conjunct(); -          delete dnf; -          if(positive_conjunct==NULL) { -            positive_conjunct = conj; -          } -          else { -            Conjunct *new_conj = merge_conjs(positive_conjunct, conj, MERGE_REGULAR); -            delete conj; -            delete positive_conjunct; -            positive_conjunct = new_conj; -          } -        } -        else { -          // positive DNF -          pos_dnfs.append(dnf); -        } -      } -    } - -    if (!JustReturnDNF) { -      Rel_Body * my_relation = relation(); -      delete this; - -      // If we have a positive_conjunct, it can serve as the 1st arg to -      // conj_and_not_dnf.  Otherwise, if pos_dnfs has one DNF, -      // use each conjunct there for this purpose. -      // Only pass "true" here if there is nothing else to try, -      // as long as TRY_TO_AVOID_TRUE_AND_NOT_DNF is set. -      // -      // Perhaps we should even try to and multiple DNF's? - -      if (!positive_conjunct && pos_dnfs.length() == 1) { -        if(pres_debug) { -          fprintf(DebugFile, "--- F_AND::DNFize() Single pos_dnf:\n"); -          pos_dnfs[1]->prefix_print(DebugFile); -          fprintf(DebugFile, "--- F_AND::DNFize() vs neg_conjs:\n"); -          neg_conjs->prefix_print(DebugFile); -        } - -        DNF *real_neg_conjs = new DNF; -        for (DNF_Iterator nc(neg_conjs); nc; nc++) { -          if (simplify_conj((*nc), true, false, EQ_BLACK) != false) -            real_neg_conjs->add_conjunct(*nc); -          (*nc) = 0; -        } -        delete neg_conjs; -        neg_conjs = real_neg_conjs; - -        for(DNF_Iterator pc(pos_dnfs[1]); pc; pc++) { -          new_dnf->join_DNF(conj_and_not_dnf((*pc), neg_conjs->copy((*pc)->relation()))); -          (*pc) = 0; -        } -      } -      else if(positive_conjunct==NULL && neg_conjs->is_definitely_false()) { -        pos_dnf_i = List_Iterator<DNF*>(pos_dnfs); -        delete new_dnf; -        new_dnf = *pos_dnf_i; -        *pos_dnf_i = NULL; -        pos_dnf_i++; -        for ( ; pos_dnf_i; pos_dnf_i++) { -          DNF *pos_dnf = *pos_dnf_i; -          new_dnf = DNF_and_DNF(new_dnf, pos_dnf); -          *pos_dnf_i = NULL; -        } -      }  -      else { -        if(positive_conjunct==NULL) {   -          static int OMEGA_WHINGE = -1; -          if (OMEGA_WHINGE < 0) { -            OMEGA_WHINGE = getenv("OMEGA_WHINGE") ? atoi(getenv("OMEGA_WHINGE")) : 0; -          } - -          if (pres_debug || OMEGA_WHINGE) { -            fprintf(DebugFile, "Uh-oh: F_AND::DNFize() resorting to TRUE and not DNF\n"); -            fprintf(DebugFile, "--- F_AND::DNFize() neg_conjs\n"); -            neg_conjs->prefix_print(DebugFile); -            fprintf(DebugFile, "--- F_AND::DNFize() pos_dnfs:\n"); -            for (pos_dnf_i=List_Iterator<DNF*>(pos_dnfs); pos_dnf_i; pos_dnf_i++) { -              (*pos_dnf_i)->prefix_print(DebugFile); -              fprintf(DebugFile,"---- --\n"); -            } -          } -          if (OMEGA_WHINGE) { -            fprintf(stderr, "Uh-oh: F_AND::DNFize() resorting to TRUE and not DNF\n"); -            fprintf(stderr, "--- F_AND::DNFize() neg_conjs\n"); -            neg_conjs->prefix_print(stderr); -            fprintf(stderr, "--- F_AND::DNFize() pos_dnfs:\n"); -            for (pos_dnf_i=List_Iterator<DNF*>(pos_dnfs); pos_dnf_i; pos_dnf_i++) { -              (*pos_dnf_i)->prefix_print(stderr); -              fprintf(stderr,"---- --\n"); -            } -          } -          positive_conjunct = new Conjunct(NULL, my_relation); -        } -  -        if(!neg_conjs->is_definitely_false()) { -          new_dnf->join_DNF(conj_and_not_dnf(positive_conjunct, neg_conjs)); -          neg_conjs = NULL; -        } -        else { -          new_dnf->add_conjunct(positive_conjunct); -        } -        positive_conjunct = NULL; - -        // -        // AND it with positive DNFs -        // -        if(pres_debug) { -          fprintf(DebugFile, "--- F_AND::DNFize() pos_dnfs:\n"); -          for (pos_dnf_i=List_Iterator<DNF*>(pos_dnfs); pos_dnf_i; pos_dnf_i++) -            (*pos_dnf_i)->prefix_print(DebugFile); -        } -        for (pos_dnf_i = List_Iterator<DNF*>(pos_dnfs); pos_dnf_i; pos_dnf_i++) { -          DNF *pos_dnf = *pos_dnf_i; -          new_dnf = DNF_and_DNF(new_dnf, pos_dnf); -          *pos_dnf_i = NULL; -        } -      } -    } -  } - -  delete positive_conjunct; -  delete neg_conjs; -  for (pos_dnf_i = List_Iterator<DNF*>(pos_dnfs); pos_dnf_i; pos_dnf_i++) -    delete *pos_dnf_i; - -  if(pres_debug) { -    fprintf(DebugFile, "] F_AND::DNFize() OUT \n"); -    new_dnf->prefix_print(DebugFile); -  } - -  use_ugly_names--; - -  return new_dnf; -} - -// -// ~ dnf  = true ^ ~ dnf, so just call conj_and_not_dnf -// - -DNF* F_Not::DNFize() { -  Conjunct *positive_conjunct = new Conjunct(NULL, relation());   -  DNF *neg_conjs = children().remove_front()->DNFize(); -  delete this; -  DNF *new_dnf = conj_and_not_dnf(positive_conjunct, neg_conjs); - -  if(pres_debug) { -    fprintf(DebugFile, "=== F_NOT::DNFize() OUT ===\n"); -    new_dnf->prefix_print(DebugFile); -  } -  return new_dnf; -} - - -// -// or is almost in DNF already: -// - -DNF* F_Or::DNFize() { -  DNF* new_dnf = new DNF; -  bool empty_or=true; - -  while(!children().empty()) { -    DNF* c_dnf = children().remove_front()->DNFize(); -    new_dnf->join_DNF(c_dnf); -    empty_or=false;  -  } - -     -  delete this; - -  if(pres_debug) { -    fprintf(DebugFile, "=== F_OR::DNFize() OUT ===\n"); -    new_dnf->prefix_print(DebugFile); -  } -  return(new_dnf); -} - - -// -// exists x : (c1 v c2 v ...) --> (exists x : c1) v (exists x : c2) v ... -// - -DNF* F_Exists::DNFize() { -  DNF *dnf = children().remove_front()->DNFize(); - -  for (DNF_Iterator pd(dnf); pd.live(); pd.next()) { -    Conjunct *conj = pd.curr(); - -    // can simply call localize_vars for DNF with a single conjunct -    Variable_ID_Tuple locals_copy(myLocals.size()); -    copy_var_decls(locals_copy, myLocals); -    conj->push_exists(locals_copy); -    conj->remap(); -    reset_remap_field(myLocals); - -    conj->r_constrs = 0; -    conj->simplified = false; // who knows -    conj->cols_ordered = false; -  } -  delete this; - -  if(pres_debug) { -    fprintf(DebugFile, "=== F_EXISTS::DNFize() OUT ===\n"); -    dnf->prefix_print(DebugFile); -  } -  return(dnf); -} - - -// -// Single conjunct is already in DNF. -// - -DNF* Conjunct::DNFize() { -  assert(!is_compressed()); -  DNF *results = new DNF; - -  if (is_true()) { -    simplified = true; -    verified = true; -    results->add_conjunct(this); -  } -  else { -    results->add_conjunct(this); -  } - -  return results; -} - - -// -// Foralls should have been removed before we get to DNFize -// - -DNF* F_Forall::DNFize() { -  assert(0); -  return(NULL); -} - -void DNF::count_leading_0s() { -  if (conjList.empty()) -    return; - -  for (DNF_Iterator conj(this); conj; conj++) { -    (*conj)->count_leading_0s(); -  } -} - - -// return x s.t. forall conjuncts c, c has >= x leading 0s -// if set, always returns -1; arg tells you if it's a set or relation. - -int DNF::query_guaranteed_leading_0s(int what_to_return_for_empty_dnf) { -  count_leading_0s(); -  int result = what_to_return_for_empty_dnf; // if set, -1; if rel, 0 -  bool first = true; - -  for (DNF_Iterator conj(this); conj; conj++) { -    int tmp = (*conj)->query_guaranteed_leading_0s(); -    assert(tmp >= 0 || ((*conj)->relation()->is_set() && tmp == -1)); -    if (first || tmp < result) result = tmp; -    first = false; -  } -     -  return result; -} - -// return x s.t. forall conjuncts c, c has <= x leading 0s -// if no conjuncts, return the argument - -int DNF::query_possible_leading_0s(int n_input_and_output) { -  count_leading_0s(); -  int result = n_input_and_output; -  bool first = true; - -  for (DNF_Iterator conj(this); conj; conj++) { -    int tmp = (*conj)->query_possible_leading_0s(); -    assert(tmp >= 0 || (tmp == -1 && (*conj)->relation()->is_set())); -    if (first || tmp > result) result = tmp; -    first = false; -  } - -  return result; -} - - -// return 0 if we don't know, or +-1 if we do - -int DNF::query_leading_dir() { -  count_leading_0s(); -  int result = 0; -  bool first = true; - -  for (DNF_Iterator conj(this); conj; conj++) { -    int glz = (*conj)->query_guaranteed_leading_0s(); -    int plz = (*conj)->query_possible_leading_0s(); -    int rlz = 0; // shut the compiler up -    if (glz != plz) -      return 0; - -    if (first) { -      rlz = glz; -      result = (*conj)->query_leading_dir(); -      first = false; -    } -    else -      if (glz != rlz || result != (*conj)->query_leading_dir()) -        return 0; -  } - -  return result; -} - -void Conjunct::count_leading_0s() { -  Rel_Body *body = relation(); -  int max_depth = min(body->n_inp(), body->n_out()); -  if(body->is_set()) { -    assert(guaranteed_leading_0s == -1 && possible_leading_0s == -1); -// guaranteed_leading_0s = possible_leading_0s = -1; -    leading_dir = 0; -    return; -  } - - -#if ! defined NDEBUG -  assert_leading_info(); -#endif -  if (guaranteed_leading_0s < 0) { -    int L; -    for (L=1; L <= max_depth; L++) { -      Variable_ID in = body->input_var(L), out = body->output_var(L); -      coef_t min, max; -      bool guaranteed; -      -      query_difference(out, in, min, max, guaranteed); -      if (min < 0 || max > 0) { -        if (min > 0 || max < 0) { // we know guaranteed & possible -          guaranteed_leading_0s = possible_leading_0s = L-1; -          if (min > 0) // We know its 0,..,0,+ -            leading_dir = 1; -          else  // We know its 0,..,0,- -            leading_dir = -1; -          return; -        } -        break; -      } -    } -    guaranteed_leading_0s = L-1; -    for ( ; L <= max_depth; L++) { -      Variable_ID in = body->input_var(L), -        out = body->output_var(L); -      coef_t min, max; -      bool guaranteed; -      -      query_difference(out, in, min, max, guaranteed); -      -      if (min > 0 || max < 0) break; -    } -    possible_leading_0s = L-1; -  } -#if ! defined NDEBUG -  assert_leading_info(); -#endif -} - -// -// add level-carried DNF form out to level "level" -// - - -void DNF::make_level_carried_to(int level) { -  count_leading_0s(); -  Rel_Body *body = 0;  // make compiler shut up -  if (length() > 0 && !(body = conjList.front()->relation())->is_set()) { -    // LCDNF makes no sense otherwise -    Relation tmp; -#ifndef NDEBUG -    tmp = Relation(*body,42); -#endif - -    DNF *newstuff = new DNF; -    int shared_depth = min(body->n_inp(), body->n_out()); -    int split_to     = level >= 0 ? min(shared_depth,level) : shared_depth; - -    skip_finalization_check++; -    EQ_Handle e; - -    for (DNF_Iterator conj(this); conj; conj++) { -      assert(body = (*conj)->relation()); -      int leading_eqs; - -      bool is_guaranteed = (*conj)->verified; - -      for (leading_eqs=1; leading_eqs <= split_to; leading_eqs++) { -        Variable_ID in = body->input_var(leading_eqs), -          out = body->output_var(leading_eqs); -        coef_t min, max; -        bool guaranteed; - -        if (leading_eqs > (*conj)->possible_leading_0s && -            (*conj)->leading_dir_valid_and_known()) { -          leading_eqs--; -          break; -        } - -        if (leading_eqs > (*conj)->guaranteed_leading_0s) { -          (*conj)->query_difference(out, in, min, max, guaranteed); -          if (min > 0 || max < 0) guaranteed = true; -//      fprintf(DebugFile,"Make level carried, %d <= diff%d <= %d (%d):\n", -//    min,leading_eqs,max,guaranteed);  -//      use_ugly_names++; -//      (*conj)->prefix_print(DebugFile); -//       use_ugly_names--; -          if (!guaranteed) is_guaranteed = false; -          bool generateLTClause = min < 0; -          bool generateGTClause = max > 0; -          bool retainEQClause = (leading_eqs <= (*conj)->possible_leading_0s && -                                 min <= 0 && max >= 0); -          if (!(generateLTClause || generateGTClause || retainEQClause)) { -            // conjunct is infeasible -            if (pres_debug) { -              fprintf(DebugFile, "Conjunct discovered to be infeasible during make_level_carried_to(%d):\n", level); -              (*conj)->prefix_print(DebugFile); -            } -#if ! defined NDEBUG -            Conjunct *cpy = (*conj)->copy_conj_same_relation(); -            assert(!simplify_conj(cpy, true, 32767, 0)); -#endif -          } - -          if (generateLTClause) { -            Conjunct *lt; -            if (!generateGTClause && !retainEQClause) -              lt = *conj; -            else -              lt = (*conj)->copy_conj_same_relation(); -            if (max >= 0) { -              GEQ_Handle l = lt->add_GEQ(); // out<in ==> in-out-1>=0 -              l.update_coef_during_simplify(in, 1); -              l.update_coef_during_simplify(out, -1); -              l.update_const_during_simplify(-1); -            } -            lt->guaranteed_leading_0s  -              = lt->possible_leading_0s = leading_eqs-1; -            lt->leading_dir = -1; -            if (is_guaranteed) { -              /* -                fprintf(DebugFile,"Promising solutions to: %d <= diff%d <= %d (%d):\n", -                min,leading_eqs,max,guaranteed);  -                use_ugly_names++; -                lt->prefix_print(DebugFile); -                use_ugly_names--; -              */ -              lt->promise_that_ub_solutions_exist(tmp); -            } -            else if (0) { -              fprintf(DebugFile,"Can't guaranteed solutions to:\n"); -              use_ugly_names++; -              lt->prefix_print(DebugFile); -              use_ugly_names--; -            } -            if (generateGTClause || retainEQClause) -              newstuff->add_conjunct(lt); -          } - -          if (generateGTClause) { -            Conjunct *gt; -            if (retainEQClause) gt = (*conj)->copy_conj_same_relation(); -            else gt = *conj; -            if (min <= 0) { -              GEQ_Handle g = gt->add_GEQ(); // out>in ==> out-in-1>=0 -              g.update_coef_during_simplify(in, -1); -              g.update_coef_during_simplify(out, 1); -              g.update_const_during_simplify(-1); -            } -            gt->guaranteed_leading_0s = -              gt->possible_leading_0s = leading_eqs-1; -            gt->leading_dir = 1; -            if (is_guaranteed) { -              /* -                fprintf(DebugFile,"Promising solutions to: %d <= diff%d <= %d (%d):\n", -                min,leading_eqs,max,guaranteed);  -                use_ugly_names++; -                gt->prefix_print(DebugFile); -                use_ugly_names--; -              */ -              gt->promise_that_ub_solutions_exist(tmp); -            } -            else if (0) { -              fprintf(DebugFile,"Can't guaranteed solutions to:\n"); -              use_ugly_names++; -              gt->prefix_print(DebugFile); -              use_ugly_names--; -            } -            if (retainEQClause) newstuff->add_conjunct(gt); -          } - -          if (retainEQClause) { -            assert(min <= 0 && 0 <= max); - -            if (min < 0 || max > 0) { -              e = (*conj)->add_EQ(1); -              e.update_coef_during_simplify(in, -1); -              e.update_coef_during_simplify(out, 1); -            } - -            assert((*conj)->guaranteed_leading_0s == -1 -                   || leading_eqs > (*conj)->guaranteed_leading_0s); -            assert((*conj)->possible_leading_0s == -1 -                   || leading_eqs <= (*conj)->possible_leading_0s); - -            (*conj)->guaranteed_leading_0s = leading_eqs; -          } -          else break; -        } - -        { -          Set<Global_Var_ID> already_done; -          int remapped = 0; - -          assert((*conj)->guaranteed_leading_0s == -1 -                 || leading_eqs <= (*conj)->guaranteed_leading_0s); - -          for (Variable_ID_Iterator func(*body->global_decls()); func; func++) { -            Global_Var_ID f = (*func)->get_global_var(); -            if (!already_done.contains(f) && -                body->has_local(f, Input_Tuple) && -                body->has_local(f, Output_Tuple) && -                f->arity() == leading_eqs) { -              already_done.insert(f); - -              // add f(in) = f(out), project one away -              e = (*conj)->add_EQ(1); -              Variable_ID f_in  =body->get_local(f,Input_Tuple); -              Variable_ID f_out =body->get_local(f,Output_Tuple); - -              e.update_coef_during_simplify(f_in, -1); -              e.update_coef_during_simplify(f_out, 1); - -              f_out->remap = f_in; -              remapped = 1; -              is_guaranteed = false; -            }      -          } - -          if (remapped) { -            (*conj)->remap(); -            (*conj)->combine_columns(); -            reset_remap_field(*body->global_decls()); -            remapped = 0; -          } -        } -      } -      if (is_guaranteed)  -        (*conj)->promise_that_ub_solutions_exist(tmp);  -      else if (0) { -        fprintf(DebugFile,"Can't guaranteed solutions to:\n"); -        use_ugly_names++; -        (*conj)->prefix_print(DebugFile); -        use_ugly_names--; -      } -    } - -    skip_finalization_check--; -    join_DNF(newstuff); -  } - -#if ! defined NDEBUG -  for (DNF_Iterator c(this); c; c++) -    (*c)->assert_leading_info(); -#endif - -  simplify(); -} - -void DNF::remove_inexact_conj() { -  bool found_inexact=false; - -  do { -    bool first=true; -    found_inexact=false; -    DNF_Iterator c_prev; -    for (DNF_Iterator c(this); c; c++) { -      if (!(*c)->is_exact()) { // remove it from the list -        found_inexact=true; -        delete (*c); -        if (first) -          conjList.del_front(); -        else -          conjList.del_after(c_prev); -        break; -      }   -      else { -        first=false; -        c_prev=c; -      } -    } -  }  -  while (found_inexact); -} - - -int s_rdt_constrs; - -// -// Simplify all conjuncts in a DNF -// -void DNF::simplify() { -  for (DNF_Iterator pd(this); pd.live(); ) { -    Conjunct *conj = pd.curr(); -    pd.next(); -    if(s_rdt_constrs >= 0 && !simplify_conj(conj, true, s_rdt_constrs, EQ_BLACK)) { -      rm_conjunct(conj); -    } -  } -} - -} // namespace diff --git a/omega/omega_lib/src/pres_form.cc b/omega/omega_lib/src/pres_form.cc deleted file mode 100644 index 82b710b..0000000 --- a/omega/omega_lib/src/pres_form.cc +++ /dev/null @@ -1,147 +0,0 @@ -#include <omega/pres_form.h> -#include <omega/pres_tree.h> -#include <omega/pres_conj.h> -#include <omega/Relation.h> -#include <omega/omega_i.h> - -namespace omega { - -// -// Children and parents. -// -void Formula::remove_child(Formula *kid) { -  assert(&kid->parent() == this); -  if (myChildren.front() == kid)  -    myChildren.del_front(); -  else { -    List_Iterator<Formula*> j,k; -    for(j=List_Iterator<Formula*>(myChildren); *j != kid && j; k=j, j++) -      ; -  -    if (k) -      myChildren.del_after(k); -    else -      assert(0 && "Child to be removed not found in child list"); -  } -} - - -void Formula::add_child(Formula *kid) { -  assert(can_add_child()); -  myChildren.append(kid); -  kid->myParent = this; -  kid->myRelation = this->relation(); -} - -void Formula::replace_child(Formula *child, Formula* new_child) { -  assert(&child->parent() == this); -  for(List_Iterator<Formula *> LI(myChildren);  LI;  LI++) -    if(*LI == child) { -      *LI = new_child; -      new_child->myParent = this; -      new_child->myRelation = this->relation(); -      break; -    } -} - -void Formula::set_parent(Formula *parent, Rel_Body *reln) { -  myParent = parent; -  myRelation = reln; -  for(List_Iterator<Formula*> c(myChildren); c; c++) -    (*c)->set_parent(this,reln); -} - -// -// Function that sets myRelation pointers in a tree. -// -void Formula::set_relation(Rel_Body *r) { -  myRelation = r; -  for(List_Iterator<Formula *> FI(myChildren); FI; FI++) -    (*FI)->set_relation(r); -} - - -// -// Function that descends to conjuncts to merge columns -// -void Formula::combine_columns() { -  foreach(child,Formula *,myChildren,child->combine_columns()); -} - - -void Formula::finalize() { -  for(List_Iterator<Formula*> c(children()); c; c++) -    (*c)->finalize(); -} - -bool Formula::can_add_child() { -  return true; -} - - - -Conjunct *Formula::really_conjunct() { -  assert(0 && "really_conjunct() called on something that wasn't"); -  return NULL; -} - -Formula::Formula(Formula *p, Rel_Body *r): myParent(p), myRelation(r) { -} - - -void Formula::verify_tree() { // should be const -#if ! defined NDEBUG -  Any_Iterator<Formula*> c = myChildren.any_iterator(); -  for (; c; c++) { -    assert((*c)->myParent==this); -    assert((*c)->myRelation==this->myRelation); -    (*c)->verify_tree(); -  } -#endif -} - -Formula *Formula::copy(Formula *, Rel_Body *) { -  assert(0); -  return NULL; -} - -Formula::~Formula() { -  for(List_Iterator<Formula*> c(myChildren); c; c++) { -    delete *c; -  } -  myChildren.clear(); -} - -void Formula::assert_not_finalized() { -  if (!skip_finalization_check) { -    assert(! relation()->is_finalized()); -    assert(! relation()->is_shared()); -  } -} - -void Formula::reverse_leading_dir_info() { -  for(List_Iterator<Formula*> c(myChildren); c; c++) -    (*c)->reverse_leading_dir_info(); -} - -void Formula::invalidate_leading_info(int changed) { -  for(List_Iterator<Formula*> c(myChildren); c; c++) -    (*c)->invalidate_leading_info(changed); -} - -void Formula::enforce_leading_info(int guaranteed, int possible, int dir) { -  for(List_Iterator<Formula*> c(myChildren); c; c++) -    (*c)->enforce_leading_info(guaranteed, possible, dir); -} - -// -// Push_exists functions. -// Push exists takes responsibility for the Variable_ID's in the Tuple. -// It should: -//    * Re-use them, or -//    * Delete them. -void Formula::push_exists(Variable_ID_Tuple &) { -  assert(0); -} - -} // namespace diff --git a/omega/omega_lib/src/pres_gen.cc b/omega/omega_lib/src/pres_gen.cc deleted file mode 100644 index 0f05d40..0000000 --- a/omega/omega_lib/src/pres_gen.cc +++ /dev/null @@ -1,45 +0,0 @@ -#include <omega/pres_gen.h> - -namespace omega { - -int     skip_finalization_check=0; -// int     skip_set_checks=0; - -int   pres_debug=0	; -FILE *DebugFile=stderr;  // This is the default; it's best to set it yourself. - -negation_control pres_legal_negations = any_negation; - -// -// I/O utility functions. -// -// void PresErrAssert(const char *t) { -//   fprintf(stdout, "\nERROR: %s\n", t); -//   if(pres_debug) { -//     fprintf(DebugFile, "\nERROR: %s\n", t); -//   } -//   exit(1); -// } - - - -// -// Needed for gprof -// -#if defined PROFILE_MALLOCS -void* operator new(size_t n) { -  void *result = malloc (n < 1 ? 1 : n); -  if (result) -    return result; -  else { -    write(2,"Virtual memory exceeded in new\n",32); -    return 0; -  } -} - -void operator delete (void* f) { -  if (f) free(f); -} -#endif - -} // namespace diff --git a/omega/omega_lib/src/pres_logic.cc b/omega/omega_lib/src/pres_logic.cc deleted file mode 100644 index 8ee90f1..0000000 --- a/omega/omega_lib/src/pres_logic.cc +++ /dev/null @@ -1,226 +0,0 @@ -#include <omega/pres_logic.h> -#include <omega/pres_conj.h> -#include <omega/pres_quant.h> -#include <omega/omega_i.h> - -namespace omega { - -GEQ_Handle F_And::add_GEQ(int preserves_level) { -  assert_not_finalized(); -  if (pos_conj == NULL || pos_conj->problem->nGEQs >= maxGEQs) { -    pos_conj = NULL; -    for(List_Iterator<Formula*> c(children()); c; c++) { -      if ((*c)->node_type()==Op_Conjunct && -          ((*c)->really_conjunct())->problem->nGEQs < maxGEQs) { -        pos_conj = (*c)->really_conjunct(); -        break; -      } -    } -    if(!pos_conj) pos_conj = add_conjunct();// FERD -- set level if preserved? -  } -  return pos_conj->add_GEQ(preserves_level); -} - - -EQ_Handle F_And::add_EQ(int preserves_level) { -  assert_not_finalized(); -  if (pos_conj == NULL || pos_conj->problem->nEQs >= maxEQs) { -    pos_conj = NULL; -    for(List_Iterator<Formula*> c(children()); c; c++) { -      if ((*c)->node_type()==Op_Conjunct && -          ((*c)->really_conjunct())->problem->nEQs < maxEQs) { -        pos_conj = (*c)->really_conjunct(); -        break; -      } -    } -    if(!pos_conj) pos_conj = add_conjunct();//FERD-set level info if preserved? -  } -  return pos_conj->add_EQ(preserves_level); -} - -Stride_Handle F_And::add_stride(int step, int preserves_level) { -  assert_not_finalized(); -  if (pos_conj == NULL || pos_conj->problem->nEQs >= maxEQs) { -    pos_conj = NULL; -    for(List_Iterator<Formula*> c(children()); c; c++) { -      if ((*c)->node_type()==Op_Conjunct && -          ((*c)->really_conjunct())->problem->nEQs < maxEQs) { -        pos_conj = (*c)->really_conjunct(); -        break; -      } -    } -    if(!pos_conj) pos_conj = add_conjunct();  // FERD -set level if preserved? -  } -  return pos_conj->add_stride(step, preserves_level); -} - -GEQ_Handle F_And::add_GEQ(const Constraint_Handle &constraint, int preserves_level) { -  assert_not_finalized(); -  if (pos_conj == NULL || pos_conj->problem->nGEQs >= maxGEQs) { -    pos_conj = NULL; -    for(List_Iterator<Formula*> c(children()); c; c++) { -      if ((*c)->node_type()==Op_Conjunct && -          ((*c)->really_conjunct())->problem->nGEQs < maxGEQs) { -        pos_conj = (*c)->really_conjunct(); -        break; -      } -    } -    if(!pos_conj) pos_conj = add_conjunct();// FERD -- set level if preserved? -  } -  return pos_conj->add_GEQ(constraint, preserves_level); -} - - -EQ_Handle F_And::add_EQ(const Constraint_Handle &constraint, int preserves_level) { -  assert_not_finalized(); -  if (pos_conj == NULL || pos_conj->problem->nEQs >= maxEQs) { -    pos_conj = NULL; -    for(List_Iterator<Formula*> c(children()); c; c++) { -      if ((*c)->node_type()==Op_Conjunct && -          ((*c)->really_conjunct())->problem->nEQs < maxEQs) { -        pos_conj = (*c)->really_conjunct(); -        break; -      } -    } -    if(!pos_conj) pos_conj = add_conjunct();//FERD-set level info if preserved? -  } -  return pos_conj->add_EQ(constraint,preserves_level); -} - - -void F_And::add_unknown() { -  assert_not_finalized(); -  if (pos_conj == NULL) { -    for (List_Iterator<Formula*> c(children()); c; c++) { -      if ((*c)->node_type()==Op_Conjunct) { -        pos_conj = (*c)->really_conjunct(); -        break; -      } -    } -    if(!pos_conj) pos_conj = add_conjunct(); // FERD - set level if preseved? -  } -  pos_conj->make_inexact(); -}      - -Conjunct *F_Or::find_available_conjunct() { -  return 0; -} - -Conjunct *F_Not::find_available_conjunct() { -  return 0; -} - -Conjunct *F_And::find_available_conjunct() { -  for(List_Iterator<Formula*> child(children()); child; child++) { -    Conjunct *c = (*child)->find_available_conjunct(); -    if (c) return c; -  } -  return 0; -} - - -void F_Not::finalize() { -  assert(n_children() == 1); -  Formula::finalize(); -} - -bool F_Not::can_add_child() { -  return n_children() < 1; -} - -F_And *F_And::and_with() { -  assert_not_finalized(); -  assert(can_add_child()); -  return this; -} - -F_And::F_And(Formula *p, Rel_Body *r): Formula(p,r), pos_conj(NULL) { -} - -F_Or::F_Or(Formula *p, Rel_Body *r): Formula(p,r){ -} - -F_Not::F_Not(Formula *p, Rel_Body *r): Formula(p,r){ -} - -Formula *F_And::copy(Formula *parent, Rel_Body *reln) { -  F_And *f = new F_And(parent, reln); -  for(List_Iterator<Formula*> c(children()); c; c++) -    f->children().append((*c)->copy(f,reln)); -  return f; -} - -Formula *F_Or::copy(Formula *parent, Rel_Body *reln) { -  F_Or *f = new F_Or(parent, reln); -  for(List_Iterator<Formula*> c(children()); c; c++) -    f->children().append((*c)->copy(f,reln)); -  return f; -} - -Formula *F_Not::copy(Formula *parent, Rel_Body *reln) { -  F_Not *f = new F_Not(parent, reln); -  for(List_Iterator<Formula*> c(children()); c; c++) -    f->children().append((*c)->copy(f,reln)); -  return f; -} - -// -// Create F_Exists nodes below this F_Or. -// Copy list S to each of the created nodes. -// Push_exists takes responsibility for reusing or deleting Var_ID's; -//  here we delete them.  Must also empty out the Tuple when finished. -void F_Or::push_exists(Variable_ID_Tuple &S) { -  List<Formula*> mc; -  mc.join(children()); - -  while(!mc.empty()) { -    Formula *f = mc.remove_front(); -    F_Exists *e = add_exists(); - -    copy_var_decls(e->myLocals, S); -    f->remap(); -    reset_remap_field(S); - -    e->add_child(f); -  } -  // Since these are not reused, they have to be deleted -  for(Tuple_Iterator<Variable_ID> VI(S); VI; VI++) { -    assert((*VI)->kind() == Exists_Var); -    delete *VI; -  } -  S.clear(); -} - -void F_Exists::push_exists(Variable_ID_Tuple &S) { -  myLocals.join(S); -} - -F_Not *Formula::add_not() { -  assert_not_finalized(); -  assert(can_add_child()); -  F_Not *f = new F_Not(this, myRelation); -  myChildren.append(f); -  return f; -} - -F_And *Formula::add_and() { -  assert_not_finalized(); -  assert(can_add_child()); -  F_And *f = new F_And(this, myRelation); -  myChildren.append(f); -  return f; -} - -F_And *Formula::and_with() { -  return add_and(); -} - -F_Or *Formula::add_or() { -  assert_not_finalized(); -  assert(can_add_child()); -  F_Or *f = new F_Or(this, myRelation); -  myChildren.append(f); -  return f; -} - -} // namespace diff --git a/omega/omega_lib/src/pres_print.cc b/omega/omega_lib/src/pres_print.cc deleted file mode 100644 index 4f2cd0d..0000000 --- a/omega/omega_lib/src/pres_print.cc +++ /dev/null @@ -1,908 +0,0 @@ -#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; -} - -} diff --git a/omega/omega_lib/src/pres_quant.cc b/omega/omega_lib/src/pres_quant.cc deleted file mode 100644 index 5483bad..0000000 --- a/omega/omega_lib/src/pres_quant.cc +++ /dev/null @@ -1,95 +0,0 @@ -#include <omega/pres_quant.h> -#include <omega/omega_i.h> - -namespace omega { - -F_Forall::F_Forall(Formula *p, Rel_Body *r): F_Declaration(p,r) { -} - -F_Exists::F_Exists(Formula *p, Rel_Body *r): F_Declaration(p,r) { -} - -F_Exists::F_Exists(Formula *p, Rel_Body *r, Variable_ID_Tuple &S): F_Declaration(p,r,S) { -} - - -Formula *F_Forall::copy(Formula *parent, Rel_Body *reln) { -  F_Forall *f = new F_Forall(parent, reln); -  copy_var_decls(f->myLocals, myLocals); -  for(List_Iterator<Formula*> c(children()); c; c++) -    f->children().append((*c)->copy(f,reln)); -  reset_remap_field(myLocals); -  return f; -} - -Formula *F_Exists::copy(Formula *parent, Rel_Body *reln) { -  F_Exists *f = new F_Exists(parent, reln); -  copy_var_decls(f->myLocals, myLocals); -  for(List_Iterator<Formula*> c(children()); c; c++) -    f->children().append((*c)->copy(f,reln)); -  reset_remap_field(myLocals); -  return f; -} - -Variable_ID F_Forall::declare(Const_String s) { -  return do_declare(s, Forall_Var); -} - -Variable_ID F_Forall::declare() { -  return do_declare(Const_String(), Forall_Var); -} - -Variable_ID F_Forall::declare(Variable_ID v) { -  return do_declare(v->base_name, Forall_Var); -} - - -Variable_ID F_Exists::declare(Const_String s) { -  return do_declare(s, Exists_Var); -} - -Variable_ID F_Exists::declare() { -  return do_declare(Const_String(), Exists_Var); -} - -Variable_ID F_Exists::declare(Variable_ID v) { -  return do_declare(v->base_name, Exists_Var); -} - -Conjunct *F_Forall::find_available_conjunct() { -  return 0; -} - -Conjunct *F_Exists::find_available_conjunct() { -  assert(children().length() == 1 || children().length() == 0); -  if (children().length() == 0) -    return 0; -  else  -    return children().front()->find_available_conjunct(); -} - -F_Exists *Formula::add_exists() { -  assert_not_finalized(); -  assert(can_add_child()); -  F_Exists *f = new F_Exists(this, myRelation); -  myChildren.append(f); -  return f; -} - -F_Exists *Formula::add_exists(Variable_ID_Tuple &S) { -  assert_not_finalized(); -  assert(can_add_child()); -  F_Exists *f = new F_Exists(this, myRelation, S); -  myChildren.append(f); -  return f; -} - -F_Forall *Formula::add_forall() { -  assert_not_finalized(); -  assert(can_add_child()); -  F_Forall *f = new F_Forall(this, myRelation); -  myChildren.append(f); -  return f; -} - -} // namespace diff --git a/omega/omega_lib/src/pres_rear.cc b/omega/omega_lib/src/pres_rear.cc deleted file mode 100644 index 508959d..0000000 --- a/omega/omega_lib/src/pres_rear.cc +++ /dev/null @@ -1,131 +0,0 @@ -#include <omega/pres_tree.h> -#include <omega/pres_conj.h> -#include <omega/Relation.h> -#include <omega/omega_i.h> - -namespace omega { - -///////////////////////// -//                     // -// Rearrange functions // -//                     // -///////////////////////// - -// -// Rules: -// ~ (f1 | f2 | ... | fn) = ~f1 & ~f2 & ... & fn -// ~ ~ f = f -// Forall v: f = ~ (Exists v: ~ f) -// Exists v: (f1 | ... | fn) = (Exists v: f1) | ... | (Exists v: fn) -// - -void Rel_Body::rearrange() { -  assert(children().length()==1); - -  skip_finalization_check++; -  formula()->rearrange(); -  skip_finalization_check--; - -  if(pres_debug) { -    fprintf(DebugFile, "\n=== Rearranged TREE ===\n"); -    prefix_print(DebugFile); -  } -} - -void Formula::rearrange() { -  // copy list of children, as they may be removed as we work -  List<Formula*> kiddies = myChildren; - -  for(List_Iterator<Formula*> c(kiddies); c; c++) -    (*c)->rearrange(); -} - -// -// Push nots down the tree until quantifier or conjunct, rearrange kids -// -void F_Not::rearrange() { -  Formula *child = children().front(); -  Formula *new_child, *f; - -  switch(child->node_type()) { -  case Op_Or: -    parent().remove_child(this); -    new_child = parent().add_and(); -    while(!child->children().empty()) { -      f = child->children().remove_front();  -      F_Not *new_not = new_child->add_not();  -      new_not->add_child(f);  -    } -    delete this; -    break; -//case Op_And: -//  parent().remove_child(this); -//  new_child = parent().add_or(); -//  while(!child->myChildren.empty()) { -//    f = child->myChildren.remove_front();  -//    F_Not *new_not = new_child->add_not();  -//    new_not->add_child(f);  -//  } -//  delete this; -//  break; -  case Op_Not: -    parent().remove_child(this); -    f = child->children().remove_front();  -    parent().add_child(f); -    delete this; -    f->rearrange(); -    return; -  default: -    new_child = child; -    break; -  } - -  new_child->rearrange(); -} -  -// -// Convert a universal quantifier to "not exists not". -// Forall v: f = ~ (Exists v: ~ f) -// -void F_Forall::rearrange() { -  Formula &p = parent(); -  p.remove_child(this); -   -  F_Not *topnot = p.add_not(); -  F_Exists *exist = topnot->add_exists(); -  for (Variable_ID_Iterator VI(myLocals); VI; VI++) -    (*VI)->set_kind(Exists_Var); -  exist->myLocals.join(myLocals); - -  F_Not *botnot = exist->add_not(); -  Formula *f = children().remove_front(); -  botnot->add_child(f); - -  delete this; - -  botnot->rearrange(); -} - -// -// Exists v: (f1 | ... | fn) = (Exists v: f1) | ... | (Exists v: fn) -// -void F_Exists::rearrange() { -  Formula* child = children().front(); -  switch(child->node_type()) { -  case Op_Or: -  case Op_Conjunct: -  case Op_Exists: -    child->push_exists(myLocals); -    parent().remove_child(this); -    parent().add_child(child); -    children().remove_front(); -    delete this; -    break; -  default: -    break; -  } - -  child->rearrange(); -} - -} // namespace diff --git a/omega/omega_lib/src/pres_subs.cc b/omega/omega_lib/src/pres_subs.cc deleted file mode 100644 index 9854b09..0000000 --- a/omega/omega_lib/src/pres_subs.cc +++ /dev/null @@ -1,131 +0,0 @@ -#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 diff --git a/omega/omega_lib/src/pres_var.cc b/omega/omega_lib/src/pres_var.cc deleted file mode 100644 index 0ec406f..0000000 --- a/omega/omega_lib/src/pres_var.cc +++ /dev/null @@ -1,459 +0,0 @@ -#include <omega/pres_var.h> -#include <omega/pres_tree.h> -#include <omega/pres_conj.h> -#include <omega/omega_i.h> - -namespace omega { - -int wildCardInstanceNumber; - -const int Global_Input_Output_Tuple::initial_allocation = 10; - -// Declare named Variable -Var_Decl::Var_Decl(Const_String name, Var_Kind vkind, int pos): -  base_name(name), -  instance(999), -  remap(this), -  var_kind(vkind),  -  position(pos),  -  global_var(NULL), -  of((Argument_Tuple) 0) { -  assert(((vkind==Input_Var || vkind==Output_Var) && pos>0) || pos==0); -} - -// Declare unnamed variable -Var_Decl::Var_Decl(Var_Kind vkind, int pos): -  instance(999), -  remap(this), -  var_kind(vkind),  -  position(pos),  -  global_var(NULL), -  of((Argument_Tuple) 0) { -  assert(((vkind==Input_Var || vkind==Output_Var) && pos>0) || pos==0); -} - -// Copy variable declaration -Var_Decl::Var_Decl(Variable_ID v):  -  base_name(v->base_name),  -  instance(v->instance), -  remap(this), -  var_kind(v->var_kind),  -  position(v->position),  -  global_var(v->global_var), -  of(v->of) { -} - -Var_Decl::Var_Decl(Const_String name, Global_Var_ID v): -  base_name(name),  -  instance(999), -  remap(this), -  var_kind(Global_Var),  -  position(0),  -  global_var(v), -  of((Argument_Tuple) 0) { -  assert(v->arity() == 0); -} - -Var_Decl::Var_Decl(Const_String name, Global_Var_ID v, Argument_Tuple function_of): -  base_name(name), -  instance(999), -  remap(this), -  var_kind(Global_Var),  -  position(0),  -  global_var(v), -  of(function_of) { -} - -int Var_Decl::get_position() { -  assert((var_kind == Input_Var || var_kind == Output_Var) && "Var_Decl::get_position: bad var_kind"); -  return(position); -} - -Global_Var_ID Var_Decl::get_global_var() { -  assert(var_kind == Global_Var && "Var_Decl::get_global_var: bad var_kind"); -  return(global_var); -} - -Argument_Tuple Var_Decl::function_of() { -  assert(var_kind == Global_Var); -  return(of); -} - - -Omega_Var *Global_Var_Decl::really_omega_var() { -  assert(0); -  return(NULL); -} - -Coef_Var_Decl *Global_Var_Decl::really_coef_var() { -  assert(0); -  return(NULL); -} - -// -// Variable name. -// - -const int N_greek_letters = 19; - -char greek_letters[19][10] = { -  "alpha" , "beta" , "gamma" , "delta" , "tau" , "sigma" , "chi" , -  "omega" , "pi" , "ni" , "Alpha" , "Beta" , "Gamma" , "Delta" , -  "Tau" , "Sigma" , "Chi" , "Omega" , "Pi"  -}; - -const int numBuffers = 50; -const int bufferSize = 90; -char nameBuffers[numBuffers][bufferSize]; -int nextBuffer = 0; - -int use_ugly_names = 0; - -const char *Var_Decl::char_name() { -  char *s = nameBuffers[nextBuffer++]; -  char *start = s; -  if (nextBuffer >= numBuffers) nextBuffer = 0; -  int primes; - -  if (use_ugly_names)  -    primes = 0; -  else  -    primes = instance; - -  switch(var_kind) { -  case Input_Var: -    if (!use_ugly_names && !base_name.null()) -      sprintf(s,"%s",(const char *)base_name); -    else { -      primes = 0; -      sprintf(s,"In_%d",position); -    } -    break; -  case Output_Var: -    if (!use_ugly_names && !base_name.null()) -      sprintf(s,"%s",(const char *)base_name); -    else { -      primes = 0; -      sprintf(s,"Out_%d",position); -    } -    break; -  case Global_Var: -    assert(!base_name.null()); -    if (use_ugly_names)  -      sprintf(s,"%s@%p",(const char *)base_name,  this); -    else { -      sprintf(s,"%s",(const char *)base_name); -      primes = get_global_var()->instance; -    } -    break; -  default:  -    if (use_ugly_names) { -      if (!base_name.null()) -        sprintf(s,"%s@%p",(const char *)base_name, this); -      else -        sprintf(s,"?@%p", this); -    } -    else if (!base_name.null()) sprintf(s,"%s",(const char *)base_name); -    else { -      assert(instance < 999); -      sprintf(s,"%s", -              greek_letters[instance % N_greek_letters]); -      primes = instance/N_greek_letters; -    } -    break; -  } - -  while (*s) s++; -  int i; -  assert(primes < 999); -  for(i=1; i<= primes; i++) *s++ = '\''; -  *s = '\0'; -  if (var_kind == Global_Var) { -    int a = get_global_var()->arity(); -    if (a) { -      if (use_ugly_names) { -        static const char *arg_names[4] = { "???", "In", "Out", "In == Out" }; -        sprintf(s, "(%s[1#%d])", arg_names[function_of()], a); -      } -      else { -        int f_of = function_of(); -        assert(f_of == Input_Tuple || f_of == Output_Tuple); -        *s++ = '('; -        for(i = 1;i<=a;i++) { -          if (f_of == Input_Tuple)  -            sprintf(s,"%s",(const char *)input_vars[i]->char_name()); -          else -            sprintf(s,"%s",(const char *)output_vars[i]->char_name()); -          while (*s) s++; -          if (i<a) *s++ = ','; -        } -        *s++ = ')'; -        *s++ = 0; -      } -    } -  } - -  assert(s < start+bufferSize);  -  return start; -} - -std::string Var_Decl::name() { -  return char_name(); -} - -// -// Copy variable declarations. -// -void copy_var_decls(Variable_ID_Tuple &new_vl, Variable_ID_Tuple &vl) { -  if (new_vl.size() < vl.size()) { -    new_vl.reallocate(vl.size()); -  } -  for(int p=1; p<=vl.size(); p++) { -    Variable_ID v = vl[p]; -    if(v->kind()==Global_Var) { -      new_vl[p] = v; -      v->remap = v; -    } -    else { -      new_vl[p] = new Var_Decl(vl[p]); -      v->remap = new_vl[p]; -    } -  } -} - -// -// Name a variable. -// -void Var_Decl::name_variable(char *newname) { -  base_name = newname; -} - - -static Const_String coef_var_name(int i, int v) { -  char s[100]; -  sprintf(s, "c_%d_%d", i, v); -  return Const_String(s); -} - - -// -// Global variables stuff. -// -Global_Var_Decl::Global_Var_Decl(Const_String baseName): -  loc_rep1(baseName, this, Input_Tuple), -  loc_rep2(baseName, this, Output_Tuple) { -} - -Global_Kind Global_Var_Decl::kind() const { -  assert(0); -  return Coef_Var; -} - -Coef_Var_Decl::Coef_Var_Decl(int id, int var):  -  Global_Var_Decl(coef_var_name(id, var)) { -  i = id;  -  v = var; -} - -Coef_Var_Decl *Coef_Var_Decl::really_coef_var() { -  return this; -} - -int Coef_Var_Decl::stmt() const { -  return i; -} - -int Coef_Var_Decl::var() const { -  return v; -} - -Global_Kind Coef_Var_Decl::kind() const { -  return Coef_Var; -} - -Free_Var_Decl::Free_Var_Decl(Const_String name):  -  Global_Var_Decl(name), _arity(0) { -} - -Free_Var_Decl::Free_Var_Decl(Const_String name, int arity):  -  Global_Var_Decl(name), _arity(arity) { -} - -int Free_Var_Decl::arity() const { -  return _arity; -} - -Global_Kind Free_Var_Decl::kind() const { -  return Free_Var; -} - - -// -// Delete variable from variable list. Does not preserve order -// -bool rm_variable(Variable_ID_Tuple &vl, Variable_ID v) { -  int n = vl.size(); -  int i; -  for(i = 1; i<n; i++) if (vl[i] == v) break; -  if (i>n) return 0; -  vl[i] = vl[n]; -  vl.delete_last(); -  return 1; -} - - -// -// Destroy variable declarations. -// -void free_var_decls(Variable_ID_Tuple &c) { -  for(Variable_ID_Iterator p = c; p; p++) { -    Variable_ID v = *p; -    if(v->kind()!=Global_Var) { -      delete v; -    } -  } -} - - -Variable_ID input_var(int nth) { -  assert(1 <= nth && nth <= input_vars.size()); -  return input_vars[nth]; -} - -Variable_ID output_var(int nth) { -  assert(1<= nth && nth <= output_vars.size()); -  return output_vars[nth]; -} - -Variable_ID set_var(int nth) { -  assert(1 <= nth && set_vars.size()); -  return input_vars[nth]; -} - - -// -// Remap mappedVars in all conjuncts of formula. -// Uses the remap field of the Var_Decl. -// -void Formula::remap() { -  for(List_Iterator<Formula*> c(children()); c; c++) -    (*c)->remap(); -} - -void Conjunct::remap() { -  for(Variable_Iterator VI(mappedVars); VI; VI++) { -    Variable_ID v = *VI; -    *VI = v->remap; -  } -  cols_ordered = false; -} - -// Function to reset the remap field of a Variable_ID -void reset_remap_field(Variable_ID v) { -  v->remap = v; -} - -// Function to reset the remap fields of a Variable_ID_Seq -void reset_remap_field(Sequence<Variable_ID> &T) { -  for(Any_Iterator<Variable_ID> VI(T.any_iterator()); VI; VI++) { -    Variable_ID v = *VI; -    v->remap = v; -  } -}   - -// Function to reset the remap fields of a Variable_ID_Tuple, -// more efficiently -void reset_remap_field(Variable_ID_Tuple &T) { -  for(Variable_Iterator VI(T); VI; VI++) { -    Variable_ID v = *VI; -    v->remap = v; -  } -}   -   -void reset_remap_field(Sequence<Variable_ID> &T, int var_no) { -  int i=1; -  for(Any_Iterator<Variable_ID> VI(T.any_iterator()); i <= var_no && VI; VI++) { -    Variable_ID v = *VI; -    v->remap = v; -    i++; -  } -}     - -void reset_remap_field(Variable_ID_Tuple &T, int var_no) { -  int i=1; -  for(Variable_Iterator VI(T); i <= var_no && VI; VI++) { -    Variable_ID v = *VI; -    v->remap = v; -    i++; -  } -}     - - -// Global input and output variable tuples. -// These Tuples must be initialized as more in/out vars are needed. -//Variable_ID_Tuple  input_vars(0); -//Variable_ID_Tuple  output_vars(0); -//Variable_ID_Tuple& set_vars = input_vars; -Global_Input_Output_Tuple input_vars(Input_Var); -Global_Input_Output_Tuple output_vars(Output_Var); -Global_Input_Output_Tuple &set_vars = input_vars; - -//////////////////////////////////////// -//                                    // -// Variable and Declaration functions // -//                                    // -//////////////////////////////////////// - -// -// Constructors and properties. -// - - -// Allocate ten variables initially.  Most applications won't require more. -Global_Input_Output_Tuple::Global_Input_Output_Tuple(Var_Kind in_my_kind, int init): -  my_kind(in_my_kind) { -  for (int i=1; i<=(init == -1? initial_allocation: max(0,init)); i++)  -    this->append(new Var_Decl(Const_String(), my_kind, i)); -} - -Global_Input_Output_Tuple::~Global_Input_Output_Tuple() { -  for (int i=1; i<=size(); i++)  -    delete data[i-1]; -} - -Variable_ID & Global_Input_Output_Tuple::operator[](int index) { -  assert(index > 0); -  while(size() < index) -    this->append(new Var_Decl(Const_String(), my_kind, size()+1)); -  return data[index-1]; -} - -const Variable_ID & Global_Input_Output_Tuple::operator[](int index) const { -  assert(index > 0); -  Global_Input_Output_Tuple *unconst_this = (Global_Input_Output_Tuple *) this; -  while(size() < index) -    unconst_this->append(new Var_Decl(Const_String(), my_kind, size()+1)); -  return data[index-1]; -} - -Variable_ID  Var_Decl::UF_owner() { -  Variable_ID v = this; -  while (v->remap != v) v = v->remap; -  return v; -} - -void  Var_Decl::UF_union(Variable_ID b) { -  Variable_ID a  = this; -  while (a->remap != a) { -    Variable_ID tmp = a->remap; -    a->remap = tmp->remap; -    a = tmp; -  } -  while (b->remap != a) { -    Variable_ID tmp = b->remap; -    b->remap = a; -    b = tmp; -  } -} - -} // namespace diff --git a/omega/omega_lib/src/reach.cc b/omega/omega_lib/src/reach.cc deleted file mode 100644 index bde785c..0000000 --- a/omega/omega_lib/src/reach.cc +++ /dev/null @@ -1,211 +0,0 @@ -#include <omega.h> -#include <omega/Relations.h> -#include <basic/Dynamic_Array.h> -#include <omega/reach.h> - -namespace omega { - -typedef Dynamic_Array1<Relation> Rel_Array1; -typedef Dynamic_Array2<Relation> Rel_Array2; - -// This is from parallelism.c, modified - -static void closure_rel(Rel_Array2 &trans, int i, int k, int j) { -  Relation tik; - -  if (trans[k][k].is_upper_bound_satisfiable()) { -    Relation tkk = TransitiveClosure(copy(trans[k][k])); -    tkk.simplify(2,4); -    tik = Composition(tkk, copy(trans[i][k])); -    tik.simplify(2,4); -    tik = Union(copy(trans[i][k]), tik); -    tik.simplify(2,4); -  } -  else { -    tik = trans[i][k]; -  } -  Relation fresh; -  Relation tkj = trans[k][j]; -  fresh = Composition(tkj, tik); -  fresh.simplify(2,4); -  trans[i][j] = Union(trans[i][j], fresh); -  trans[i][j].simplify(2,4); - -#if 0 -  fprintf(DebugFile, "%d -> %d -> %d\n", i, k, j); -  trans[i][j].print_with_subs(DebugFile); -#endif -} - - -static void close_rels(Rel_Array2 &trans,int n_nodes) { -  for (int k=1; k<=n_nodes; k++) -    for (int i=1; i<=n_nodes; i++) -      if (trans[i][k].is_upper_bound_satisfiable()) -        for (int j=1; j<=n_nodes; j++) -          if (trans[k][j].is_upper_bound_satisfiable()) -            closure_rel(trans, i, k, j); -} - - -void dump_rels(Rel_Array2 &a, reachable_information *reachable_info) { -  int i,j; -  int n_nodes = reachable_info->node_names.size(); -  for(i = 1; i <= n_nodes; i++) -    for(j = 1; j <= n_nodes; j++) { -      fprintf(stderr,"t[%s][%s] = ", -              (reachable_info->node_names[i]).c_str(), -              (reachable_info->node_names[j]).c_str()); -      a[i][j].print_with_subs(stderr); -    } -} - - -void dump_sets(Rel_Array1 &a, reachable_information *reachable_info) { -  int i; -  int n_nodes = reachable_info->node_names.size(); -  for(i = 1; i <= n_nodes; i++) { -    fprintf(stderr,"r[%s] = ", (reachable_info->node_names[i]).c_str()); -    a[i].print_with_subs(stderr); -  } -} - - - -Rel_Array1 *Reachable_Nodes(reachable_information *reachable_info) { -  Tuple<std::string> &node_names = reachable_info->node_names; -  Tuple<int> &arity = reachable_info->node_arity; -  Rel_Array2 &transitions = reachable_info->transitions; -  Rel_Array1 &start_nodes = reachable_info->start_nodes; - -  int n_nodes = node_names.size(),i,j; - -#define DUMP_INITIAL 1 -#define DUMP_CLOSED 1 - -  if(DUMP_INITIAL && relation_debug){ -    fprintf(stderr,"Initially:\n"); -    dump_rels(transitions, reachable_info); -  } - -  close_rels(transitions,n_nodes); - -  if(DUMP_CLOSED && relation_debug) { -    fprintf(stderr,"Closed:\n"); -    dump_rels(transitions, reachable_info); -  } - -  Rel_Array1 *finalp =  -    new Rel_Array1("node"); -  Rel_Array1 &final = *finalp; -  final.resize(n_nodes+1); -  for (i=1; i<=n_nodes; i++) -    final[i] = Relation::False(arity[i]); - -  for(i = 1; i <= n_nodes; i++) -    for(j = 1; j <= n_nodes; j++) -      if(start_nodes[i].is_upper_bound_satisfiable()) -        final[j] = Union(final[j], -                         Composition(copy(transitions[i][j]), -                                     copy(start_nodes[i]))); -  return finalp;  -} - -static void compute_initially_reachable(Rel_Array1 &r, -                                        Rel_Array1 &start_nodes, -                                        Rel_Array2 &, -                                        Rel_Array2 &closed, -                                        Rel_Array1 &end_nodes, -                                        int n_nodes, Tuple<int> &arity){ -  for(int n = 1; n <= n_nodes; n++) -    r[n] = Relation::False(arity[n]); - -  for(int i = 1; i <= n_nodes; i++) -    for(int j = 1; j <= n_nodes; j++) -      r[i] = Union(r[i], -                   Range(Restrict_Domain( -                           Restrict_Range(copy(closed[j][i]), -                                          copy(end_nodes[i])), -                           copy(start_nodes[j])))); -} - - -static bool iterate(Rel_Array1 &r, Rel_Array2 &, Rel_Array2 &closed, -                    Rel_Array1 &, int n_nodes) { -  bool changed; - -  changed = false; -  for(int j = 1; j <= n_nodes; j++) { -    for(int i = 1; i <= n_nodes; i++) { -      /* look for additional steps from interesting states */ -      Relation new_rj =  Range(Restrict_Domain(copy(closed[i][j]), -                                               copy(r[i]))); -      if(!Must_Be_Subset(copy(new_rj),copy(r[j]))) { -        r[j] = Union(r[j],new_rj); -        r[j].simplify(2,2); -        changed = true; -      } -    } -  } -  return changed; -} - - - - -Rel_Array1 *I_Reachable_Nodes(reachable_information *reachable_info) { -  bool changed; - -  Tuple<std::string> &node_names = reachable_info->node_names; -  int n_nodes = node_names.size(); -  Tuple<int> &arity = reachable_info->node_arity; -  Rel_Array2 &transitions = reachable_info->transitions; -  Rel_Array1 &start_nodes = reachable_info->start_nodes; -  Rel_Array2 closed("node number","node number"); -  closed.resize(n_nodes+1,n_nodes+1);  // abuse of dynamic arrays -  Rel_Array1 *rp = new Rel_Array1("node number"); -  Rel_Array1 &r = *rp; -  r.resize(n_nodes+1);  // abuse of dynamic arrays - -  int i,j; - -  Rel_Array1 end_nodes("Hi!"); -  end_nodes.resize(n_nodes+1); // for future use -  for(int n = 1; n <= n_nodes; n++) end_nodes[n] = Relation::True(arity[n]); - -  for(j = 1; j <= n_nodes; j++) { -    closed[j][j] = TransitiveClosure(copy(transitions[j][j])); -    for(i = 1; i <= n_nodes; i++) -      if (i != j) -        closed[i][j] = transitions[i][j]; -  } - -  compute_initially_reachable(r,start_nodes,transitions,closed,end_nodes, -                              n_nodes,arity); - -#define DUMP_INITIAL 1 -#define DUMP_CLOSED 1 - -  if(DUMP_INITIAL && relation_debug > 1) { -    fprintf(stderr,"Closed:\n"); -    dump_rels(closed, reachable_info); -  } -  if(DUMP_INITIAL && relation_debug) { -    fprintf(stderr,"start nodes:\n"); -    dump_sets(start_nodes, reachable_info); -    fprintf(stderr,"Initially reachable:\n"); -    dump_sets(r, reachable_info); -  } - -  changed = true; -  int iterations = 0, max_iterations = 1000; -  while(changed && iterations < max_iterations) { -    changed = iterate(r,transitions,closed,start_nodes,n_nodes); -    iterations++; -  } -  if(relation_debug) -    fprintf(stdout,"[Iterations to convergence: %d]\n",iterations); -  return rp; -} - -} // namespace  | 
