1 ////////////////////////////////////////////////////////////////////////////////
2 //
3 // Circuits.hh
4 //
5 //    produced: 21/08/97 jr
6 // last change: 30/10/97 jr
7 //
8 ////////////////////////////////////////////////////////////////////////////////
9 #ifndef CIRCUITS_HH
10 #define CIRCUITS_HH
11 
12 #include <assert.h>
13 
14 #include "Pair.hh"
15 #include "Array.hh"
16 #include "IntegerSet.hh"
17 #include "SimplicialComplex.hh"
18 #include "HashMap.hh"
19 
20 #include "CommandlineOptions.hh"
21 
22 #include "PointConfiguration.hh"
23 #include "Chirotope.hh"
24 
25 typedef IntegerSet                   dependent_set_type;
26 typedef Pair<IntegerSet, IntegerSet> circuit_data;
27 
28 class Circuit : public circuit_data {
29 public:
30   // constructors:
31   inline Circuit();
32   inline Circuit(const Circuit&);
33   Circuit(const Chirotope&, const IntegerSet&);
34   // destructor:
35   inline ~Circuit();
36   // assignment:
37   inline Circuit& operator=(const Circuit&);
38   // functions:
39   inline dependent_set_type support()      const;
40   SimplicialComplex  upper_facets() const;
41   SimplicialComplex  lower_facets() const;
42   inline Circuit     inverse     () const;
43 };
44 
45 // constructors:
Circuit()46 inline Circuit::Circuit() : circuit_data() {}
Circuit(const Circuit & circ)47 inline Circuit::Circuit(const Circuit& circ) : circuit_data(circ) {}
48 // destructor:
~Circuit()49 inline Circuit::~Circuit() {}
50 // assignment:
operator =(const Circuit & circ)51 inline Circuit& Circuit::operator=(const Circuit& circ) {
52   if (this == &circ) {
53     return *this;
54   }
55   circuit_data::operator=(circ);
56   return *this;
57 }
58 
59 // functions:
support() const60 inline dependent_set_type Circuit::support() const {
61   return (first + second);
62 }
63 
inverse() const64 inline Circuit Circuit::inverse () const {
65   Circuit result;
66   result.first = second;
67   result.second = first;
68   return result;
69 }
70 
71 typedef HashMap<IntegerSet, Circuit> circuits_data;
72 
73 class Circuits : public circuits_data {
74 private:
75   parameter_type  _no;
76   parameter_type  _rank;
77 public:
78   // constructors:
79   inline Circuits();
80   inline Circuits(const Circuits&);
81   Circuits(const Chirotope&);
82   // destructor:
83   inline ~Circuits();
84   // accessors:
85   inline const parameter_type no() const;
86   inline const parameter_type rank() const;
87   // functions:
88   inline const IntegerSet& positive_part(const IntegerSet& dependent) const;
89   inline const IntegerSet& negative_part(const IntegerSet& dependent) const;
90   // stream output/input:
91   std::ostream& print_string(std::ostream&) const;
92   std::istream& read_string(std::istream&);
93   inline friend std::ostream& operator<<(std::ostream&, const Circuits&);
94   inline friend std::istream& operator>>(std::istream&, Circuits&);
95 };
96 
97 // constructors:
Circuits()98 inline Circuits::Circuits() : circuits_data(), _no(0), _rank(0) {
99 }
Circuits(const Circuits & circuits)100 inline Circuits::Circuits(const Circuits& circuits) :
101   circuits_data(circuits), _no(circuits._no), _rank(circuits._rank) {
102 }
103 
104 // destructor:
~Circuits()105 inline Circuits::~Circuits() {}
106 
107 // accessors:
no() const108 inline const parameter_type Circuits::no()   const { return _no; }
rank() const109 inline const parameter_type Circuits::rank() const { return _rank; }
110 
111 // functions:
positive_part(const IntegerSet & dependent) const112 inline const IntegerSet& Circuits::positive_part(const IntegerSet& dependent) const {
113   return member(dependent)->first;
114 }
negative_part(const IntegerSet & dependent) const115 inline const IntegerSet& Circuits::negative_part(const IntegerSet& dependent) const {
116   return member(dependent)->second;
117 }
118 // stream output/input:
operator <<(std::ostream & ost,const Circuits & circuits)119 inline std::ostream& operator<<(std::ostream& ost, const Circuits& circuits) {
120   ost << circuits._no << ',' << circuits._rank << ':'
121       << (circuits_data&)(circuits);
122   return ost;
123 }
operator >>(std::istream & ist,Circuits & circuits)124 inline std::istream& operator>>(std::istream& ist, Circuits& circuits) {
125   char c;
126 
127   ist >> std::ws >> circuits._no >> std::ws >> c >> std::ws >> circuits._rank >> std::ws >> c >> std::ws
128       >> (circuits_data&)(circuits);
129   return ist;
130 }
131 
132 // typedef Circuit                                  Cocircuit;
133 // typedef Circuits                                 Cocircuits;
134 
135 #endif
136 
137 // eof Circuits.hh
138