Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemath
GitHub Repository: sagemath/sagelib
Path: blob/master/sage/geometry/triangulation/data.h
4057 views
1
#ifndef __DATA_H__
2
#define __DATA_H__
3
4
#include <cstdlib>
5
#include <time.h>
6
#include <iostream>
7
#include <set>
8
#include <functional>
9
#include <vector>
10
11
12
// may be insufficient if you have 16 bit int's
13
typedef unsigned int hash_value;
14
15
16
17
// typedef unsigned long int simplex;
18
typedef int vertex;
19
typedef int simplex;
20
21
class flip;
22
class flips;
23
class vertices_lookup;
24
25
26
// a set of vertices; usually vertices of a simplex
27
class vertices: public std::set<vertex,std::less<vertex> >
28
{
29
private:
30
static int n;
31
static int d;
32
static vertices_lookup lookup;
33
protected:
34
public:
35
vertices();
36
vertices(const simplex&);
37
const simplex vertices_to_simplex() const;
38
const vertices & simplex_to_vertices(const simplex &); // uses lookup-table
39
void set_dimensions(int N, int D);
40
friend std::ostream & operator << (std::ostream &, const vertices &);
41
friend bool operator==(const vertices &, const vertices &);
42
bool full_set() const { return this->size() == n; }
43
};
44
45
// tables used by vertices to make computation faster
46
class vertices_lookup
47
{
48
private:
49
int n,d;
50
std::vector<vertices> SimplexToVertices;
51
std::vector<std::vector<int> > fast_binomial;
52
protected:
53
vertices manual_vertices_to_simplex(const simplex &) const;
54
public:
55
void generate_tables(int N, int D);
56
const vertices & simplex_to_vertices(const simplex &) const;
57
int get_binomial(int i, int j) const;
58
};
59
60
61
// total order on the vertices
62
struct vertices_order
63
{
64
bool operator() (const vertices &, const vertices &) const;
65
};
66
67
68
// simplical complex, data compressed by vertices_to_simplex
69
class compact_simplices: public std::vector<simplex>
70
{
71
private:
72
protected:
73
public:
74
compact_simplices();
75
virtual ~compact_simplices();
76
hash_value hash_function() const;
77
friend std::ostream & operator <<
78
(std::ostream &, const compact_simplices &);
79
friend const bool operator==
80
(const compact_simplices &, const compact_simplices &);
81
};
82
83
// same but with complete vertex information
84
class simplices: public compact_simplices
85
{
86
private:
87
std::vector<vertices> v;
88
protected:
89
void compress();
90
void decompress();
91
public:
92
simplices() { };
93
simplices(const std::set<vertices,vertices_order> &);
94
simplices(const compact_simplices &);
95
bool starshaped(const vertex) const;
96
bool fine() const;
97
virtual ~simplices();
98
const std::vector<vertices> & get_vertices() const { return(v); }
99
friend std::ostream & operator << (std::ostream & out, const simplices & s);
100
};
101
102
class flip
103
{
104
private:
105
std::vector<vertices> deltaplus, deltaminus;
106
protected:
107
public:
108
flip();
109
flip(const std::vector<vertices>& pos, const std::vector<vertices>& neg);
110
flip(const flip &);
111
virtual ~flip();
112
flip & operator =(const flip &);
113
friend std::ostream & operator <<(std::ostream &, const flip &);
114
const std::vector<vertices> & get_deltaplus() const { return deltaplus; };
115
const std::vector<vertices> & get_deltaminus() const { return deltaminus;};
116
void mirror();
117
};
118
119
class flips: public std::vector<flip>
120
{
121
protected:
122
void sort_flips_containing();
123
public:
124
flips();
125
virtual ~flips();
126
};
127
128
129
class goodcircuit
130
{
131
private:
132
std::vector<std::vector<vertices> > supported;
133
flip supporter;
134
std::vector<std::set<vertices,vertices_order> > link;
135
std::set<vertices,vertices_order> bistellarneighbor;
136
bool good;
137
public:
138
goodcircuit(const simplices &, const flip &);
139
bool is_good() const { return(good); }
140
void do_flip(const simplices &, const flip &);
141
simplices get_neighbor() const { return(bistellarneighbor); }
142
};
143
144
145
146
147
#endif
148
149