-
Notifications
You must be signed in to change notification settings - Fork 5
/
fcoxgroup.h
249 lines (205 loc) · 8.21 KB
/
fcoxgroup.h
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
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
/*
This is fcoxgroup.h
Coxeter version 3.0 Copyright (C) 2002 Fokko du Cloux
See file main.cpp for full copyright notice
*/
/****************************************************************************
This module defines the hierarchy of finite Coxeter groups; see coxgroup.h
for the layout of the general hierarchy of Coxeter groups. As explained
there, many of these classes are barely implemented. We also explained
that only leaf classes in the hierarchy are concrete; in preparation
for possible derivation of Finite*RankCoxGroup, we have shadowed them
by the concrete classes F*RCoxGroup; the same holds for SmallCoxGroup.
****************************************************************************/
#ifndef FCOXGROUP_H /* guard against multiple inclusions */
#define FCOXGROUP_H
#include "globals.h"
#include "coxgroup.h"
namespace fcoxgroup {
using namespace coxeter;
/******** type declarations *************************************************/
class FiniteCoxGroup;
class FiniteBigRankCoxGroup;
class GeneralFBRCoxGroup;
class FiniteMedRankCoxGroup;
class GeneralFMRCoxGroup;
class FiniteSmallRankCoxGroup;
class GeneralFSRCoxGroup;
class SmallCoxGroup;
class GeneralSCoxGroup;
typedef CoxNbr DenseArray;
/******** function declarations *********************************************/
bool isFiniteType(CoxGroup *W);
Rank maxSmallRank(const Type& x);
/******** type definitions **************************************************/
class FiniteCoxGroup : public CoxGroup {
protected:
CoxArr d_longest_coxarr;
CoxWord d_longest_coxword;
Length d_maxlength;
CoxSize d_order;
Transducer *d_transducer;
Partition d_lcell;
Partition d_rcell;
Partition d_lrcell;
Partition d_luneqcell;
Partition d_runeqcell;
Partition d_lruneqcell;
Partition d_ldescent;
Partition d_rdescent;
Partition d_ltau;
Partition d_rtau;
Partition d_lstring;
Partition d_rstring;
List<CoxNbr> d_duflo;
public:
/* constructors */
void* operator new(size_t size) {return arena().alloc(size);}
void operator delete(void* ptr)
{return arena().free(ptr,sizeof(FiniteCoxGroup));}
FiniteCoxGroup(const Type& x, const Rank& l);
virtual ~FiniteCoxGroup();
/* accessors */
bool isFullContext() const;
const CoxArr& longest_coxarr() const; /* inlined */
const CoxWord& longest_coxword() const; /* inlined */
Length maxLength() const; /* inlined */
void modify(ParseInterface& P, const Token& tok) const;
CoxSize order() const; /* inlined */
bool parseModifier(ParseInterface& P) const;
const FiltrationTerm *transducer(const Rank& l = 0) const; /* inlined */
/* modifiers */
FiltrationTerm *transducer(const Rank& l = 0)
{return d_transducer->transducer(l);}
/* array operations */
const CoxArr& assign(CoxArr& a, const CoxArr& b) const; /* inlined */
virtual const CoxArr& inverseArr(CoxArr& a) const;
Length length(const CoxArr& a) const;
const CoxArr& powerArr(CoxArr& a, const Ulong& m) const;
int prodArr(CoxArr& a, const CoxArr& b) const;
LFlags rDescent(const CoxArr& a) const;
const CoxWord& reducedArr(CoxWord& g, const CoxArr& a) const;
const CoxArr& setZero(CoxArr& a) const; /* inlined */
/* mixed operations */
const CoxArr& assign(CoxArr& a, const CoxWord& g) const;
int prodArr(CoxArr& a, Generator s) const;
int prodArr(CoxArr& a, const CoxWord& g) const;
// manipulators
void fullContext(); /* inlined */
/* kazhdan-lusztig cells and realted partitions */
const Partition& lCell();
const Partition& lrCell();
const Partition& rCell();
const List<CoxNbr>& duflo();
const Partition& lUneqCell();
const Partition& lrUneqCell();
const Partition& rUneqCell();
const Partition& lDescent();
const Partition& rDescent();
const Partition& lString();
const Partition& rString();
const Partition& lTau();
const Partition& rTau();
};
class FiniteBigRankCoxGroup : public FiniteCoxGroup {
public:
/* constructors and destructors */
void* operator new(size_t size) {return arena().alloc(size);}
void operator delete(void* ptr)
{return arena().free(ptr,sizeof(FiniteBigRankCoxGroup));}
FiniteBigRankCoxGroup(const Type& x, const Rank& l);
virtual ~FiniteBigRankCoxGroup();
/* accessors */
kl::KLContext& kl() const; /* inlined */
};
class GeneralFBRCoxGroup : public FiniteBigRankCoxGroup { /* leaf class */
public:
/* constructors and destructors */
void* operator new(size_t size) {return arena().alloc(size);}
void operator delete(void* ptr)
{return arena().free(ptr,sizeof(GeneralFBRCoxGroup));}
GeneralFBRCoxGroup(const Type& x, const Rank& l);
~GeneralFBRCoxGroup();
};
class FiniteMedRankCoxGroup : public FiniteCoxGroup {
public:
/* constructors and destructors */
void* operator new(size_t size) {return arena().alloc(size);}
void operator delete(void* ptr)
{return arena().free(ptr,sizeof(FiniteMedRankCoxGroup));}
FiniteMedRankCoxGroup(const Type& x, const Rank& l);
virtual ~FiniteMedRankCoxGroup();
/* accessors */
kl::KLContext& kl() const; /* inlined */
};
class GeneralFMRCoxGroup : public FiniteMedRankCoxGroup { /* leaf class */
public:
/* constructors and destructors */
void* operator new(size_t size) {return arena().alloc(size);}
void operator delete(void* ptr)
{return arena().free(ptr,sizeof(GeneralFMRCoxGroup));}
GeneralFMRCoxGroup(const Type& x, const Rank& l);
~GeneralFMRCoxGroup();
};
class FiniteSmallRankCoxGroup : public FiniteMedRankCoxGroup {
public:
/* constructors and destructors */
void* operator new(size_t size) {return arena().alloc(size);}
void operator delete(void* ptr)
{return arena().free(ptr,sizeof(FiniteSmallRankCoxGroup));}
FiniteSmallRankCoxGroup(const Type& x, const Rank& l);
virtual ~FiniteSmallRankCoxGroup();
/* accessors */
kl::KLContext& kl() const; /* inlined */
};
class GeneralFSRCoxGroup : public FiniteSmallRankCoxGroup { /* leaf class */
public:
/* constructors and destructors */
void* operator new(size_t size) {return arena().alloc(size);}
void operator delete(void* ptr)
{return arena().free(ptr,sizeof(GeneralFSRCoxGroup));}
GeneralFSRCoxGroup(const Type& x, const Rank& l);
~GeneralFSRCoxGroup();
};
class SmallCoxGroup : public FiniteSmallRankCoxGroup {
public:
/* constructors and destructors */
void* operator new(size_t size) {return arena().alloc(size);}
void operator delete(void* ptr)
{return arena().free(ptr,sizeof(SmallCoxGroup));}
SmallCoxGroup(const Type& x, const Rank& l);
virtual ~SmallCoxGroup();
/* accessors */
const CoxArr& assign(CoxArr& a, const DenseArray& x) const;
void assign(DenseArray& x, const CoxArr& a) const;
bool parseDenseArray(ParseInterface& P) const;
virtual bool parseGroupElement(ParseInterface& P) const;
int prodD(CoxWord& g, const DenseArray& x) const;
int prodD(DenseArray& x, const CoxWord& g) const;
};
class GeneralSCoxGroup : public SmallCoxGroup { /* leaf class */
public:
/* constructors and destructors */
void* operator new(size_t size) {return arena().alloc(size);}
void operator delete(void* ptr)
{return arena().free(ptr,sizeof(GeneralSCoxGroup));}
GeneralSCoxGroup(const Type& x, const Rank& l);
~GeneralSCoxGroup();
};
/******** Inline implementations ******************************************/
inline const CoxArr& FiniteCoxGroup::assign(CoxArr& a, const CoxArr& b) const
{memmove(a,b,rank()*sizeof(ParNbr)); return a;}
inline void FiniteCoxGroup::fullContext()
{extendContext(d_longest_coxword);}
inline const CoxArr& FiniteCoxGroup::longest_coxarr() const
{return d_longest_coxarr;}
inline const CoxWord& FiniteCoxGroup::longest_coxword() const
{return d_longest_coxword;}
inline Length FiniteCoxGroup::maxLength() const {return d_maxlength;}
inline CoxSize FiniteCoxGroup::order() const {return d_order;}
inline const CoxArr& FiniteCoxGroup::setZero(CoxArr& a) const
{memset(a,0,rank()*sizeof(ParNbr)); return a;}
inline const FiltrationTerm* FiniteCoxGroup::transducer(const Rank& l) const
{return d_transducer->transducer(l);}
}
#endif