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

atlas::kl::helper::Helper Class Reference

Inheritance diagram for atlas::kl::helper::Helper:

Inheritance graph
[legend]
Collaboration diagram for atlas::kl::helper::Helper:

Collaboration graph
[legend]
List of all members.

Public Member Functions

 Helper (const KLContext &)
 ~Helper ()
blocks::BlockEltPair cayley (size_t s, BlockElt y) const
 Cayley transform of block element y through simple root s.
BlockElt cross (size_t s, BlockElt y) const
 Cross action of simple root s on block element y.
const descents::DescentStatusdescent (BlockElt y) const
 Returns vector of RANK_MAX unsigned char; entry s gives descent status of simple root s for block element y.
descents::DescentStatus::Value descentValue (size_t s, BlockElt y) const
 Unsigned char whose value gives the descent status of simple root s for block element y.
size_t firstDirectRecursion (BlockElt y) const
 Returns the first descent generator that is not real type II.
blocks::BlockEltPair inverseCayley (size_t s, BlockElt y) const
KLPolRef klPol (BlockElt x, BlockElt y, KLRow::const_iterator klv, klsupport::PrimitiveRow::const_iterator p_begin, klsupport::PrimitiveRow::const_iterator p_end) const
 Returns the Kazhdan-Lusztig polynomial for x corresponding to the given row.
bool ascentMu (BlockElt x, BlockElt y, size_t s) const
 Computes whether |mu(x,y)==1| in a good ascent situation.
MuCoeff goodDescentMu (BlockElt x, BlockElt y, size_t s) const
 Gets |mu(x,y)| by a good descent recursion.
MuCoeff lengthOneMu (BlockElt x, BlockElt y) const
 Computes $(x,y)$ in the special case that $l(y)-l(x) = 1$.
size_t orbit (BlockElt y) const
 First coordinate (corresponding to K orbit on G/B) of pair of integers specifying block element y.
size_t dualOrbit (BlockElt y) const
 Second coordinate (corresponding to K^vee orbit on G^vee/B^vee) of pair of integers specifying block element y.
MuCoeff type2Mu (BlockElt x, BlockElt y) const
 Gets mu(x,y) by type II recursion.
void completePacket (BlockElt y)
 Finishes the filling of the R-packet starting at y.
void directRecursion (BlockElt y, size_t s)
 Fills in the row for y using a direct recursion.
void fill ()
 Dispatches the work of filling the KL- and mu-lists.
void fillKLRow (BlockElt y)
 Fills in the row for y in the KL-table.
void fillMuRow (BlockElt y)
 Fills in the row for y in the mu-table.
void fillThickets (BlockElt y)
 Finishes the filling of the R-packet starting at y.
void muCorrection (std::vector< KLPol > &klv, const klsupport::PrimitiveRow &e, BlockElt y, size_t s)
 Subtracts from klv the correcting terms in the K-L recursion.
void recursionRow (std::vector< KLPol > &klv, const klsupport::PrimitiveRow &e, BlockElt y, size_t s)
 Puts in klv the right-hand side of the recursion formula for y corresponding to the descent s.
void writeRow (const std::vector< KLPol > &klv, const klsupport::PrimitiveRow &e, BlockElt y)
 Writes down row y in d_kl and d_prim.
KLPolRef klPol (BlockElt x, BlockElt y) const
 The Kazhdan-Lusztig-Vogan polynomial P_{x,y}.

Private Attributes

KLHashStore d_hashtable
size_t prim_size
size_t nr_of_prim_nulls

Friends

class Thicket

Constructor & Destructor Documentation

atlas::kl::helper::Helper::Helper const KLContext  ) 
 

Definition at line 817 of file kl.cpp.

atlas::kl::helper::Helper::~Helper  )  [inline]
 

Definition at line 132 of file kl.cpp.


Member Function Documentation

bool atlas::kl::helper::Helper::ascentMu BlockElt  x,
BlockElt  y,
size_t  s
const [inline]
 

Computes whether |mu(x,y)==1| in a good ascent situation.

Preconditions: $l(y)>0$; $l(x)=l(y)-1$; $s$ is an ascent for $x$ w.r.t. $y$

Explanation: this is the situation where |mu(x,y)| is directly expressible. The point is that |x| will ascend to an element of the same length as |y|, so that the corresponding K-L polynomial is zero unless |x| ascends to |y|.

Definition at line 884 of file kl.cpp.

References cayley(), cross(), and descentValue().

Referenced by lengthOneMu(), and type2Mu().

blocks::BlockEltPair atlas::kl::helper::Helper::cayley size_t  s,
BlockElt  y
const [inline]
 

Cayley transform of block element y through simple root s.

Definition at line 147 of file kl.cpp.

Referenced by atlas::kl::helper::Thicket::ascentCompute(), ascentMu(), and writeRow().

void atlas::kl::helper::Helper::completePacket BlockElt  y  ) 
 

Finishes the filling of the R-packet starting at y.

Precondition: all the rows in the packet capable of a direct recursion are filled; at least one row is of this form;

Explanation: what we do here, is completing the rows that can be completed from the already filled ones, using real type II recursions. Whatever is left will constitute "thickets", and will be dealt with by another function.

Algorithm: we traverse the set of y1 in the packet that can be obtained from one of the filled ones through real type II cross-actions.

Definition at line 1078 of file kl.cpp.

References atlas::kl::KLContext::block(), cross(), descentValue(), fillThickets(), klPol(), atlas::kl::KLContext::makeExtremalRow(), atlas::blocks::Block::R_packet(), atlas::kl::KLContext::rank(), recursionRow(), and writeRow().

Referenced by fillKLRow().

BlockElt atlas::kl::helper::Helper::cross size_t  s,
BlockElt  y
const [inline]
 

Cross action of simple root s on block element y.

Definition at line 154 of file kl.cpp.

Referenced by ascentMu(), completePacket(), atlas::kl::helper::Thicket::cross(), goodDescentMu(), muCorrection(), recursionRow(), and type2Mu().

const descents::DescentStatus& atlas::kl::helper::Helper::descent BlockElt  y  )  const [inline]
 

Returns vector of RANK_MAX unsigned char; entry s gives descent status of simple root s for block element y.

Definition at line 162 of file kl.cpp.

Referenced by atlas::kl::helper::Thicket::descent(), firstDirectRecursion(), type2Mu(), and writeRow().

descents::DescentStatus::Value atlas::kl::helper::Helper::descentValue size_t  s,
BlockElt  y
const [inline]
 

Unsigned char whose value gives the descent status of simple root s for block element y.

Definition at line 170 of file kl.cpp.

Referenced by ascentMu(), completePacket(), atlas::kl::helper::Thicket::descentValue(), goodDescentMu(), muCorrection(), recursionRow(), and type2Mu().

void atlas::kl::helper::Helper::directRecursion BlockElt  y,
size_t  s
 

Fills in the row for y using a direct recursion.

Precondition: s is either a complex, or a real type I descent generator for y.

The real work is done by the recursionRow function, that will be used also in the real type II descents.

Definition at line 1146 of file kl.cpp.

References atlas::kl::KLContext::makeExtremalRow(), recursionRow(), and writeRow().

Referenced by fillKLRow().

size_t atlas::kl::helper::Helper::dualOrbit BlockElt  y  )  const [inline]
 

Second coordinate (corresponding to K^vee orbit on G^vee/B^vee) of pair of integers specifying block element y.

Definition at line 208 of file kl.cpp.

void atlas::kl::helper::Helper::fill  ) 
 

Dispatches the work of filling the KL- and mu-lists.

Reimplemented from atlas::kl::KLContext.

Definition at line 1166 of file kl.cpp.

References atlas::hashtable::HashTable< Entry, Number >::capacity(), d_hashtable, atlas::klsupport::KLSupport::fill(), fillKLRow(), fillMuRow(), atlas::kl::KLPol, atlas::kl::KLContext::length(), atlas::kl::KLContext::lengthLess(), prim_size, atlas::hashtable::HashTable< Entry, Number >::size(), and atlas::klsupport::KLSupport::size().

Referenced by atlas::kl::KLContext::fill().

void atlas::kl::helper::Helper::fillKLRow BlockElt  y  ) 
 

Fills in the row for y in the KL-table.

Precondition: all lower rows have been filled; y is of length > 0; R-packets are consecutively numbered;

Explanation: this function actually fills out the whole R-packet to which y belongs (unless it returns immediately). This is done in two stages: first, we fill the rows for which there is a direct recursion relation. The second stage, if any, is forwarded to the completePacket function.

Definition at line 1274 of file kl.cpp.

References atlas::kl::KLContext::block(), completePacket(), directRecursion(), firstDirectRecursion(), atlas::blocks::Block::R_packet(), and atlas::kl::KLContext::rank().

Referenced by fill().

void atlas::kl::helper::Helper::fillMuRow BlockElt  y  ) 
 

Fills in the row for y in the mu-table.

Precondition: the row for y in the KL-table has been filled; length(y) > 0;

Explanation: for the elements of length < length(y) - 1, mu(x,y) can be non-zero only if x is extremal w.r.t. y; so we run through d_kl[y], and look at the cases where the polynomial is of degree (1/2)(l(y)-l(x)-1) (the biggest possible). For the elements of colength 1, in the classical case we always had mu(x,y)=1. Here that's not true anymore, zero might be a possibility, and also larger values I believe; but at any rate the mu-values can be computed in terms of other mu-values.

NOTE: we are not using the hasse-list here, although it is probably a good idea to compute that; that will reduce the mu-computation.

Definition at line 1317 of file kl.cpp.

References atlas::kl::KLIndex, atlas::kl::KLPolRef, atlas::kl::KLContext::length(), atlas::kl::KLContext::lengthLess(), lengthOneMu(), and atlas::kl::MuCoeff.

Referenced by fill().

void atlas::kl::helper::Helper::fillThickets BlockElt  y  ) 
 

Finishes the filling of the R-packet starting at y.

Precondition: all the rows in the packet that are not part of a "thicket" have already been filled.

Explanation: a thicket is an element that has only real type II descents, and that moreover is such that all elements in its conected component for the relation of being connected by a sequence of real type II cross-actions, is of the same form (for instance, it happens quite often that the principal series representations are a thicket.) Then we must use the "structural fact" in Lemma 6.2 of David's Park City notes: for each x lower than y, there is an element y' of the thicket for which x has an ascent (or if there is no such y', the K-L polynomial is zero.)

Algorithm: (a) for each y' in the R-packet that has not already been filled, we determine the thicket of y' via a traversal algorithm, as usual (b) we fill in all the P_{x,y} in that thicket by a downwards recursion. In order to do that, we put the union of all the x'es in the extremal lists in a common ordered list. Then we move down the list; for each x, by assumption there is an y' in the thicket for which it is not extremal, and starting from there we can fill in P_{x,y} in all the rows where it needs to be filled.

NOTE: thickets are always small, at the very worst a few hundred elements, so we don't have to worry about efficiency here.

NOTE: perhaps it might be expected that there is usually (always?) a "large" element in the thicket, that would provide ascents for all x'es. So it might be worthwhile to sort the elements in the thicket in order of number of descents.

Definition at line 1393 of file kl.cpp.

References atlas::kl::KLContext::block(), atlas::kl::helper::Thicket::fill(), and atlas::blocks::Block::R_packet().

Referenced by completePacket().

size_t atlas::kl::helper::Helper::firstDirectRecursion BlockElt  y  )  const
 

Returns the first descent generator that is not real type II.

Explanation: those are the ones that give a direct recursion formula for the K-L basis element.

Definition at line 832 of file kl.cpp.

References descent(), and atlas::kl::KLContext::rank().

Referenced by fillKLRow().

MuCoeff atlas::kl::helper::Helper::goodDescentMu BlockElt  x,
BlockElt  y,
size_t  s
const [inline]
 

Gets |mu(x,y)| by a good descent recursion.

Precondition: $l(y)>0$; $l(x)=l(y)-1$; all previous mu-rows have been filled in; |s| is a good descent for |y|;

Explanation: a good descent for |y| is a descent that is neither real type II nor imaginary compact (so it is either a complex or real type I); these are the cases where |mu(x,y)| is directly expressed by recursion.

Definition at line 919 of file kl.cpp.

References cross(), descentValue(), inverseCayley(), atlas::kl::KLContext::mu(), and atlas::kl::MuCoeff.

Referenced by type2Mu().

blocks::BlockEltPair atlas::kl::helper::Helper::inverseCayley size_t  s,
BlockElt  y
const [inline]
 

Definition at line 176 of file kl.cpp.

Referenced by goodDescentMu(), muCorrection(), and recursionRow().

KLPolRef atlas::kl::KLContext::klPol BlockElt  x,
BlockElt  y
const
 

The Kazhdan-Lusztig-Vogan polynomial P_{x,y}.

KLPolRef atlas::kl::helper::Helper::klPol BlockElt  x,
BlockElt  y,
KLRow::const_iterator  klv,
klsupport::PrimitiveRow::const_iterator  p_begin,
klsupport::PrimitiveRow::const_iterator  p_end
const
 

Returns the Kazhdan-Lusztig polynomial for x corresponding to the given row.

Precondition: |klv| holds the tail of the set of primitive Kazhdan-Lusztig polynomials for |y|, enough to find the required one by elementary lookup; |[p_begin,p_end[| is the corresponding range of primitive elements.

Algorithm: primitivize |x| with respect to the descents in |y|; if a real nonparity situation is encountered, return |Zero|; otherwise look up the primitive |x| in the range and return the corresponding element from |klv|

Definition at line 860 of file kl.cpp.

References atlas::kl::KLContext::descentSet(), atlas::kl::KLPolRef, and atlas::klsupport::KLSupport::primitivize().

Referenced by completePacket(), atlas::kl::helper::Thicket::klPol(), lengthOneMu(), muCorrection(), recursionRow(), and writeRow().

MuCoeff atlas::kl::helper::Helper::lengthOneMu BlockElt  x,
BlockElt  y
const
 

Computes $(x,y)$ in the special case that $l(y)-l(x) = 1$.

Preconditions: $l(y) > 0$; $l(x) = l(y)-1$; the $$-rows for all $y$ of smaller lengths have already been filled in.

Explanation: these are the $$-values that can come up in possibly non-extremal situations. The value can be obtaind simply as the constant term of |klPol(x,y)|, but for efficiency reasons we handle some easy cases directly, avoiding the cost of calling |klPol|. In fact in all the cases these values of $$ can be, and used to be, computed recursively by formulas using only other $$-values of the same kind.

Definition at line 964 of file kl.cpp.

References atlas::bitset::BitSet< n >::andnot(), atlas::bitset::BitSet< n >::any(), ascentMu(), atlas::kl::KLContext::descentSet(), atlas::bitset::BitSet< n >::firstBit(), klPol(), atlas::kl::KLPolRef, atlas::kl::MuCoeff, and atlas::bitset::RankFlags.

Referenced by fillMuRow().

void atlas::kl::helper::Helper::muCorrection std::vector< KLPol > &  klv,
const klsupport::PrimitiveRow e,
BlockElt  y,
size_t  s
 

Subtracts from klv the correcting terms in the K-L recursion.

Precondtion: klp contains the terms corresponding to c_s.c_y, for the x that are extremal w.r.t. y; the mu-table and KL-table has been filled in for elements of length <= y.

Explanation: the recursion formula is of the form:

lhs = c_s.c_{y1} - sum_{z} mu(z,y1)c_z

where z runs over the elements < y such that s is a descent for z, y1 is s.y, and lhs is c_y when s is a complex descent or real type I for y, and c_{y}+c_{s.y} when s is real type II.

Definition at line 1425 of file kl.cpp.

References cross(), descentValue(), inverseCayley(), klPol(), atlas::kl::KLPolRef, atlas::kl::KLContext::length(), atlas::kl::MuCoeff, and atlas::kl::MuRow.

Referenced by recursionRow().

size_t atlas::kl::helper::Helper::orbit BlockElt  y  )  const [inline]
 

First coordinate (corresponding to K orbit on G/B) of pair of integers specifying block element y.

Definition at line 201 of file kl.cpp.

void atlas::kl::helper::Helper::recursionRow std::vector< KLPol > &  klv,
const klsupport::PrimitiveRow e,
BlockElt  y,
size_t  s
 

Puts in klv the right-hand side of the recursion formula for y corresponding to the descent s.

Precondition: s is either a complex, or a real type I or type II descent generator for y.

Explanation: the shape of the formula is:

P_{x,y} = (c_s.c_{y1})-part - correction term

where y1 = cross(s,y) when s is complex for y, one of the two elements in inverseCayley(s,y) when s is real. The (c_s.c_{y1})-part depends on the status of x w.r.t. s (we look only at extremal x, so we know it is a descent); the correction term, coming from sum_z mu(z,y1)c_z, depends only on y1.

Definition at line 1511 of file kl.cpp.

References cross(), descentValue(), inverseCayley(), klPol(), and muCorrection().

Referenced by completePacket(), directRecursion(), and atlas::kl::helper::Thicket::Thicket().

MuCoeff atlas::kl::helper::Helper::type2Mu BlockElt  x,
BlockElt  y
const
 

Gets mu(x,y) by type II recursion.

This code is currently unused (see lengthOneMu above).

Precondition: length(y) > 0; length(x) = length(y)-1; all previous mu-rows have been filled in; x is extremal w.r.t. y, and all descents of y are real type II;

Explanation: in this situation, we have recursion formulas that will yield mu(x,y)+mu(x,s.y). It is known that proceeding in this way we must end up with a y' for which x is not extremal.

Algorithm: we keep a stack of recursion formulas of the above kind, walking through the orbit of y under the simple descents, until we reach a y that (a) has a non-type-II descent, or (b) for which x is non-extremal.

Definition at line 1005 of file kl.cpp.

References ascentMu(), cross(), descent(), descentValue(), atlas::kl::helper::firstAscent(), goodDescentMu(), atlas::kl::MuCoeff, and atlas::kl::KLContext::rank().

void atlas::kl::helper::Helper::writeRow const std::vector< KLPol > &  klv,
const klsupport::PrimitiveRow er,
BlockElt  y
 

Writes down row y in d_kl and d_prim.

Precondition: klv contains the polynomials corresponding to the extremal values in the row; er contains the corresponding (extremal with respect to y) block elements.

Explanation: the difficulty is that we want to write down the _primitive_ elements, i.e., those x for which all descents for y are either descents or imaginary type II ascents; and moreover, we write down only those values for which the polynomial is nonzero. The values for which there is an imaginary type II ascent are computed "on the fly", from higher up values in the row.

Definition at line 1604 of file kl.cpp.

References atlas::hashtable::HashTable< Entry, Number >::begin(), cayley(), atlas::bits::copy(), d_hashtable, descent(), atlas::hashtable::HashTable< Entry, Number >::end(), atlas::kl::helper::firstAscent(), atlas::polynomials::Polynomial< C >::isZero(), klPol(), atlas::kl::KLPol, atlas::kl::KLRow, atlas::kl::KLContext::makePrimitiveRow(), atlas::hashtable::HashTable< Entry, Number >::match(), nr_of_prim_nulls, prim_size, atlas::kl::KLContext::rank(), and atlas::polynomials::Polynomial< C >::safeAdd().

Referenced by completePacket(), and directRecursion().


Friends And Related Function Documentation

friend class Thicket [friend]
 

Definition at line 118 of file kl.cpp.


Member Data Documentation

KLHashStore atlas::kl::helper::Helper::d_hashtable [private]
 

Definition at line 120 of file kl.cpp.

Referenced by atlas::kl::helper::Thicket::ascentCompute(), atlas::kl::helper::Thicket::edgeCompute(), fill(), and writeRow().

size_t atlas::kl::helper::Helper::nr_of_prim_nulls [private]
 

Definition at line 125 of file kl.cpp.

Referenced by atlas::kl::helper::Thicket::fill(), and writeRow().

size_t atlas::kl::helper::Helper::prim_size [private]
 

Definition at line 124 of file kl.cpp.

Referenced by atlas::kl::helper::Thicket::fill(), fill(), and writeRow().


The documentation for this class was generated from the following file:
Generated on Wed Mar 26 16:52:56 2008 for atlas by  doxygen 1.3.9.1