File: PartialTriang.hh

package info (click to toggle)
topcom 0.17.8%2Bds-2
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 78,572 kB
  • sloc: cpp: 16,640; sh: 975; makefile: 345; ansic: 40
file content (171 lines) | stat: -rw-r--r-- 5,634 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
////////////////////////////////////////////////////////////////////////////////
// 
// PartialTriang.hh 
//
//    produced: 30/04/98 jr
// last change: 30/04/98 jr
//
////////////////////////////////////////////////////////////////////////////////
#ifndef PARTIALTRIANG_HH
#define PARTIALTRIANG_HH

#include "HashMap.hh"
#include "SimplicialComplex.hh"

#include "CommandlineOptions.hh"

#include "Permutation.hh"
#include "PointConfiguration.hh"
#include "Chirotope.hh"
#include "Circuits.hh"
#include "Facets.hh"
#include "Admissibles.hh"
#include "InteriorFacets.hh"

class PartialTriang : public SimplicialComplex {
private:
  parameter_type           _no;
  parameter_type           _rank;
  const InteriorFacets*    _intfacetsptr;
  const Admissibles*       _admtableptr;
  SimplicialComplex        _admissibles;
  SimplicialComplex        _freefacets;
private:
  PartialTriang();
public:
  // constructors:
  inline PartialTriang(const parameter_type no, 
		       const parameter_type rank, 
		       const Admissibles& admtable, 
		       const InteriorFacets& intfacets);
  inline PartialTriang(const PartialTriang& pt);
  inline PartialTriang(const PartialTriang& pt, const Simplex& new_simp);
  inline PartialTriang(const PartialTriang& pt, 
		       const Simplex& new_simp, 
		       const SimplicialComplex& forbidden);
  // destructor:
  inline ~PartialTriang();
  // assignments:
  inline PartialTriang& operator=(const PartialTriang& pt);
  // accessors:
  inline const parameter_type     no()                 const { return _no; }
  inline const parameter_type     rank()               const { return _rank; }
  inline const InteriorFacets*    intfacetsptr()       const { return _intfacetsptr; }
  inline const Admissibles*       admtableptr()        const { return _admtableptr; }
  inline const SimplicialComplex& admissibles()        const { return _admissibles; }
  inline const SimplicialComplex& freefacets()         const { return _freefacets; }
  // functions:
  inline void forbid(const Simplex&);
  inline void forbid(const SimplicialComplex&);
  inline bool complete();
private:
  // internal algorithms:
  void _add_simplex(const Simplex& simp);
  void _add_simplex(const Simplex& simp, const SimplicialComplex& forbidden);
  void _update_admissibles(const Simplex& simp);
  void _update_admissibles(const Simplex& simp, const SimplicialComplex& forbidden);
  void _update_freefacets(const Simplex& simp);
};

// constructors:
inline PartialTriang::PartialTriang(const parameter_type no, 
				    const parameter_type rank, 
				    const Admissibles& admtable, 
				    const InteriorFacets& intfacets) : 
  SimplicialComplex(), 
  _no(no), _rank(rank), 
  _intfacetsptr(&intfacets), _admtableptr(&admtable), 
  _admissibles(), _freefacets() {
  for (Admissibles::const_iterator iter = _admtableptr->begin(); iter != _admtableptr->end(); ++iter) {
    _admissibles += iter->key();
  }
}
inline PartialTriang::PartialTriang(const PartialTriang& pt) : 
  SimplicialComplex(pt), 
  _no(pt._no), _rank(pt._rank),
  _intfacetsptr(pt._intfacetsptr), _admtableptr(pt._admtableptr), 
  _admissibles(pt._admissibles), _freefacets(pt._freefacets) {}
inline PartialTriang::PartialTriang(const PartialTriang& pt, const Simplex& new_simp) : 
  SimplicialComplex(pt), 
  _no(pt._no), _rank(pt._rank),
  _intfacetsptr(pt._intfacetsptr), _admtableptr(pt._admtableptr), 
  _admissibles(pt._admissibles), _freefacets(pt._freefacets) {
  _add_simplex(new_simp);
}
inline PartialTriang::PartialTriang(const PartialTriang& pt, 
				    const Simplex& new_simp, 
				    const SimplicialComplex& forbidden) : 
  SimplicialComplex(pt), 
  _no(pt._no), _rank(pt._rank),
  _intfacetsptr(pt._intfacetsptr), _admtableptr(pt._admtableptr), 
  _admissibles(pt._admissibles), _freefacets(pt._freefacets) {
  _add_simplex(new_simp, forbidden);
}

// destructor:
inline PartialTriang::~PartialTriang() {}

// assignment:
inline PartialTriang& PartialTriang::operator=(const PartialTriang& pt) {
  if (this == &pt) {
    return *this;
  }
  SimplicialComplex::operator=(pt);
  _no = pt._no;
  _rank = pt._rank;
  _intfacetsptr = pt._intfacetsptr;
  _admtableptr = pt._admtableptr;
  _admissibles = pt._admissibles;
  _freefacets = pt._freefacets;
  return *this;
}

// functions:
inline void PartialTriang::forbid(const Simplex& simp) {
  _admissibles -= simp;
}
inline void PartialTriang::forbid(const SimplicialComplex& sc) {
  _admissibles -= sc;
}
inline bool PartialTriang::complete() {
  if (_freefacets.is_empty()) {
    return true;
  }
  for (SimplicialComplex::iterator iter = _admissibles.begin(); 
       iter != _admissibles.end(); 
       ++iter) {
    PartialTriang new_partialtriang(*this, *iter);
    if (new_partialtriang.complete()) {
      *this = new_partialtriang;
      return true;
    }
  }
  return false;
}

// internal algorithms:
inline void PartialTriang::_add_simplex(const Simplex& simp) {
  *this += simp;
  _update_admissibles(simp);
  _update_freefacets(simp);
}
inline void PartialTriang::_add_simplex(const Simplex& simp, const SimplicialComplex& forbidden) {
  *this += simp;
  _update_admissibles(simp, forbidden);
  _update_freefacets(simp);
}
inline void PartialTriang::_update_admissibles(const Simplex& simp) {
  _admissibles *= (*_admtableptr)[simp];
}
inline void PartialTriang::_update_admissibles(const Simplex& simp, 
					       const SimplicialComplex& forbidden) {
  _admissibles *= (*_admtableptr)[simp];
  _admissibles -= forbidden;
}
inline void PartialTriang::_update_freefacets(const Simplex& simp) {
  _freefacets ^= (*_intfacetsptr)[simp];
}

#endif

// eof PartialTriang.hh