00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef BLOCKS_H
00015 #define BLOCKS_H
00016
00017 #include "blocks_fwd.h"
00018 #include <cassert>
00019
00020 #include "bruhat_fwd.h"
00021 #include "descents.h"
00022 #include "kgb_fwd.h"
00023 #include "complexredgp_fwd.h"
00024 #include "realredgp_fwd.h"
00025 #include "weyl_fwd.h"
00026
00027 #include "bitset.h"
00028 #include "bitmap.h"
00029 #include "realform.h"
00030 #include "weyl.h"
00031
00032 namespace atlas {
00033
00034
00035
00036
00037
00038 namespace blocks {
00039
00040
00041 const BlockElt UndefBlock = ~ BlockElt(0);
00042
00043 }
00044
00045
00046
00047 namespace blocks {
00048
00049 std::vector<BlockElt> dual_map(const Block& b, const Block& dual_b);
00050 bitmap::BitMap common_Cartans(realredgp::RealReductiveGroup& GR,
00051 realredgp::RealReductiveGroup& dGR);
00052
00053 }
00054
00055
00056
00057 namespace blocks {
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081 class Block {
00082
00083 enum State { BruhatConstructed, NumStates };
00084
00085
00086
00087
00088
00089 realform::RealForm d_realForm;
00090
00091
00092
00093
00094 realform::RealForm d_dualForm;
00095
00096
00097 size_t d_rank;
00098
00099 const weyl::WeylGroup& d_weylGroup;
00100
00101
00102
00103
00104 size_t d_xrange;
00105
00106
00107
00108
00109 size_t d_yrange;
00110
00111
00112
00113
00114 kgb::KGBEltList d_x;
00115
00116
00117
00118
00119 kgb::KGBEltList d_y;
00120
00121
00122
00123 std::vector<BlockElt> d_first_z_of_x;
00124
00125
00126
00127
00128 std::vector<BlockEltList> d_cross;
00129
00130
00131
00132
00133
00134 std::vector<BlockEltPairList> d_cayley;
00135
00136
00137
00138
00139
00140
00141 descents::DescentStatusList d_descent;
00142
00143
00144
00145
00146 std::vector<size_t> d_length;
00147
00148
00149
00150
00151 std::vector<size_t> d_Cartan;
00152
00153
00154
00155
00156
00157
00158
00159 weyl::TwistedInvolutionList d_involution;
00160
00161
00162
00163
00164 std::vector<bitset::RankFlags> d_involutionSupport;
00165
00166
00167
00168
00169 bitset::BitSet<NumStates> d_state;
00170
00171
00172
00173
00174
00175
00176
00177
00178 bruhat::BruhatOrder* d_bruhat;
00179
00180 public:
00181
00182
00183 Block(complexredgp::ComplexReductiveGroup&, realform::RealForm rf,
00184 realform::RealForm drf, bool select_Cartans=false);
00185
00186 ~Block();
00187
00188
00189
00190
00191
00192 const descents::DescentStatus& descent(BlockElt z) const {
00193 assert(z<size());
00194 return d_descent[z];
00195 }
00196
00197
00198 descents::DescentStatus::Value descentValue(size_t s, BlockElt z) const {
00199 assert(z<size());
00200 assert(s<d_rank);
00201 return d_descent[z][s];
00202 }
00203
00204
00205 bool isWeakDescent(size_t s, BlockElt z) const
00206 { return descents::DescentStatus::isDescent(descentValue(s,z)); }
00207
00208 realform::RealForm dualForm() const {
00209 return d_dualForm;
00210 }
00211
00212 size_t firstStrictDescent(BlockElt z) const;
00213 size_t firstStrictGoodDescent(BlockElt z) const;
00214
00215
00216 BlockElt cross(size_t s, BlockElt z) const {
00217 assert(z<size());
00218 assert(s<d_rank);
00219 return d_cross[s][z];
00220 }
00221
00222
00223 BlockEltPair cayley(size_t s, BlockElt z) const {
00224 assert(z<size());
00225 assert(s<d_rank);
00226 if (not isWeakDescent(s,z))
00227 return d_cayley[s][z];
00228 else return BlockEltPair(UndefBlock,UndefBlock);
00229 }
00230
00231
00232 BlockEltPair inverseCayley(size_t s, BlockElt z) const {
00233 assert(z<size());
00234 assert(s<d_rank);
00235 if (isWeakDescent(s,z))
00236 return d_cayley[s][z];
00237 else return BlockEltPair(UndefBlock,UndefBlock);
00238 }
00239
00240
00241 const bitset::RankFlags& involutionSupport(size_t z) const {
00242 assert(z<size());
00243 return d_involutionSupport[z];
00244 }
00245
00246 bool isStrictAscent(size_t, BlockElt) const;
00247
00248 bool isStrictDescent(size_t, BlockElt) const;
00249
00250
00251 size_t length(BlockElt z) const {
00252 return d_length[z];
00253 }
00254
00255
00256 size_t Cartan_class(BlockElt z) const {
00257 assert(z<size());
00258 return d_Cartan[z];
00259 }
00260
00261
00262 BlockEltPair link(size_t alpha,size_t beta,BlockElt y) const;
00263
00264
00265 size_t rank() const {
00266 return d_rank;
00267 }
00268
00269 realform::RealForm realForm() const {
00270 return d_realForm;
00271 }
00272
00273
00274 size_t size() const {
00275 return d_involution.size();
00276 }
00277
00278
00279
00280
00281
00282
00283
00284 const weyl::TwistedInvolution& involution(BlockElt z) const{
00285 assert(z<size());
00286 return d_involution[z];
00287 }
00288
00289
00290 const weyl::WeylGroup& weylGroup() const {
00291 return d_weylGroup;
00292 }
00293
00294 kgb::KGBElt x(BlockElt z) const {
00295 assert(z<size());
00296 return d_x[z];
00297 }
00298
00299 kgb::KGBElt y(BlockElt z) const {
00300 assert(z<size());
00301 return d_y[z];
00302 }
00303
00304
00305 BlockElt element(kgb::KGBElt x,kgb::KGBElt y) const;
00306
00307 std::pair<BlockElt,BlockElt> R_packet(BlockElt z) const
00308 {
00309 assert(z<size());
00310 BlockElt x=d_x[z];
00311 return std::make_pair(d_first_z_of_x[x],d_first_z_of_x[x+1]);
00312 }
00313
00314 size_t xsize() const {
00315 return d_xrange;
00316 }
00317 size_t ysize() const {
00318 return d_yrange;
00319 }
00320
00321
00322 bruhat::BruhatOrder& bruhatOrder()
00323 {
00324 fillBruhat(); return *d_bruhat;
00325 }
00326
00327
00328 private:
00329 weyl::TwistedInvolution dualInvolution
00330 (const weyl::TwistedInvolution& tw,weyl::WeylInterface to_dual) const;
00331
00332 void generate(realredgp::RealReductiveGroup& G,
00333 realredgp::RealReductiveGroup& dG,
00334 bool select_Cartans);
00335
00336 void fillBruhat();
00337 };
00338
00339 }
00340
00341 }
00342 #endif