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