Main Page | Namespace List | Class Hierarchy | Class List | File List | Namespace Members | Class Members | File Members

/home/r0/dav/atlas.dir/atlas3/sources/gkmod/kl.h

Go to the documentation of this file.
00001 /*!
00002 \file
00003 \brief
00004 Class definitions and function declarations for the class KLContext.
00005 */
00006 /*
00007   This is kl.h
00008 
00009   Copyright (C) 2004,2005 Fokko du Cloux
00010   part of the Atlas of Reductive Lie Groups
00011 
00012   See file main.cpp for full copyright notice
00013 */
00014 
00015 #ifndef KL_H  /* guard against multiple inclusions */
00016 #define KL_H
00017 
00018 #include <limits>
00019 
00020 #include "kl_fwd.h"
00021 
00022 #include "blocks_fwd.h"
00023 
00024 #include "bitset.h"
00025 #include "klsupport.h"
00026 #include "polynomials.h"
00027 #include "wgraph.h"
00028 
00029 namespace atlas {
00030 
00031 /******** constant declarations *********************************************/
00032 
00033 namespace kl {
00034 
00035   /*!
00036 \brief Polynomial 0, which is stored as a vector of size 0.
00037   */
00038   const KLPol Zero;
00039 
00040   /*! \brief Polynomial 1.q^0. */
00041   const KLPol One(0); // Polynomial(d) gives 1.q^d.
00042 
00043   const KLCoeff UndefKLCoeff = std::numeric_limits<KLCoeff>::max();
00044   const KLCoeff UndefMuCoeff = std::numeric_limits<MuCoeff>::max();
00045 
00046 typedef std::vector<KLPol> KLStore;
00047 
00048 typedef KLStore::const_reference KLPolRef;
00049 
00050 typedef std::vector<KLIndex> KLRow;
00051 
00052 
00053 
00054 } // namespace kl
00055 
00056 /******** function declarations *********************************************/
00057 
00058 namespace kl {
00059 
00060   void wGraph(wgraph::WGraph&, const KLContext&);
00061 
00062 }
00063 
00064 /******** type definitions **************************************************/
00065 
00066 /* Namely: the definition of KLContext itself */
00067 
00068 
00069 namespace kl {
00070 
00071  using blocks::BlockElt;
00072 
00073   /*!
00074 \brief Calculates and stores the Kazhdan-Lusztig polynomials for a
00075 block of representations of G.
00076   */
00077 class KLContext {
00078 
00079  protected:  // permit access of our Helper class to the data members
00080 
00081   /*!
00082 \brief Records whether the KL polynomials for the block have all been computed.
00083   */
00084   enum State { KLFilled, NumStates };
00085 
00086   /*!
00087 \brief Bit 0 flags whether the KL polynomials have
00088 all been computed.
00089   */
00090   bitset::BitSet<NumStates> d_state;
00091 
00092   /*!
00093 \brief Pointer to the KLSupport class for this block.
00094   */
00095   klsupport::KLSupport* d_support;   // non-owned pointer
00096 
00097   /*!
00098 \brief Entry d_prim[y] is a list of the elements x_i that are primitive
00099 with respect to y and have P_{y,x_i} not zero.
00100   */
00101   std::vector<klsupport::PrimitiveRow> d_prim;
00102 
00103   /*!
00104 \brief Entry d_kl[y] is a list of pointers to the polynomials
00105 P_{y,x_i}, numbered as in the list d_prim[y].
00106   */
00107   std::vector<KLRow> d_kl;           // list of polynomial pointers
00108 
00109   /*!
00110 \brief Entry d_mu[y] is a MuRow, which has parallel vectors for x and mu(x,y)
00111   */
00112   std::vector<MuRow> d_mu;           // lists of x's and their mu-coefficients
00113 
00114   /*!
00115 \brief Set of KL polynomials.
00116   */
00117   KLStore d_store;           // the distinct actual polynomials
00118   /*!
00119 \brief Pointer to the polynomial 0.
00120   */
00121   KLIndex d_zero;
00122   /*!
00123 \brief Pointer to the polynomial 1.
00124   */
00125   KLIndex d_one;
00126 
00127 public:
00128 
00129 // constructors and destructors
00130   KLContext(klsupport::KLSupport&); // initial base object
00131 
00132   // there is no point in making the destructor virtual
00133   ~KLContext() {}
00134 
00135 // copy, assignment and swap
00136   KLContext(const KLContext&);
00137 
00138   KLContext& operator= (const KLContext&);
00139 
00140   void swap(KLContext&);
00141 
00142 // accessors
00143   const blocks::Block& block() const {
00144     return d_support->block();
00145   }
00146 
00147   // the following two were moved here from the Helper class
00148   void makeExtremalRow(klsupport::PrimitiveRow& e, BlockElt y) const;
00149 
00150   void makePrimitiveRow(klsupport::PrimitiveRow& e, BlockElt y) const;
00151 
00152   /*!
00153 \brief List of the elements x_i that are primitive with respect to y and have
00154  P_{y,x_i} NOT ZERO. This method is somewhat of a misnomer
00155   */
00156   const klsupport::PrimitiveRow& primitiveRow(BlockElt y) const {
00157     return d_prim[y];
00158   }
00159 
00160   const bitset::RankFlags& descentSet(BlockElt y) const {
00161     return d_support->descentSet(y);
00162   }
00163 
00164   bool isZero(const KLIndex p) const {
00165     return p == d_zero;
00166   }
00167 
00168   /*!
00169 \brief The Kazhdan-Lusztig-Vogan polynomial P_{x,y}
00170 */
00171   KLPolRef klPol(BlockElt x, BlockElt y) const;
00172 
00173   /*!
00174 \brief Returns the list of pointers to the non-zero KL polynomials
00175 P_{y,x_i} (with x_i primitive with respect to y).
00176   */
00177   const KLRow& klRow(BlockElt y) const {
00178     return d_kl[y];
00179   }
00180 
00181   /*!
00182 \brief Length of y as a block element.
00183   */
00184   size_t length(BlockElt y) const {
00185     return d_support->length(y);
00186   }
00187 
00188   /*!
00189 \brief Length of y as a block element.
00190   */
00191   size_t lengthLess(size_t l) const {
00192     return d_support->lengthLess(l);
00193   }
00194   MuCoeff mu(BlockElt x, BlockElt y) const;
00195 
00196   /*!
00197 \brief List of MuData, which are pairs (x, top degree coefficient of
00198 P_{y,x}).
00199   */
00200   const MuRow& muRow(BlockElt y) const {
00201     return d_mu[y];
00202   }
00203 
00204   /*!
00205 \brief Returns the set of all non-zero KL polynomials for the block.
00206   */
00207   const KLStore& polStore() const {
00208     return d_store;
00209   }
00210 
00211   /*!
00212 \brief Rank of the group.
00213   */
00214   const size_t rank() const {
00215     return d_support->rank();
00216   }
00217 
00218   /*!
00219 \brief Size of the block.
00220   */
00221   const size_t size() const {
00222     return d_kl.size();
00223   }
00224 
00225 // get bitmap of primitive elements for row |y| with nonzero KL polynomial
00226   bitmap::BitMap primMap (BlockElt y) const;
00227 
00228 // manipulators
00229 
00230   // this method used to be virtual, but that seems completely silly. MvL
00231   void fill();
00232 
00233   blocks::Block& block() {
00234     return d_support->block();
00235   }
00236 
00237 
00238 
00239 };
00240 
00241 }
00242 
00243 }
00244 
00245 #endif

Generated on Wed Mar 26 16:49:33 2008 for atlas by  doxygen 1.3.9.1