Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 55 additions & 0 deletions sage.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
/*
Coxeter version 3.0 Copyright (C) 2009 Mike Hansen
*/

#include "sage.h"

namespace sage {

void interval(List<CoxWord>& list, CoxGroup& W, const CoxWord& g, const CoxWord& h)

/*
Return a list of the elements in the Bruhat interval between g and h.
Note that this assumes that g and h are in order.
*/
{
if (not W.inOrder(g,h)) {
return;
}

W.extendContext(h);

CoxNbr x = W.contextNumber(g);
CoxNbr y = W.contextNumber(h);

BitMap b(W.contextSize());
W.extractClosure(b,y);

BitMap::ReverseIterator b_rend = b.rend();
List<CoxNbr> res(0);

for (BitMap::ReverseIterator i = b.rbegin(); i != b_rend; ++i)
if (not W.inOrder(x,*i)) {
BitMap bi(W.contextSize());
W.extractClosure(bi,*i);
CoxNbr z = *i; // andnot will invalidate iterator
b.andnot(bi);
b.setBit(z); // otherwise the decrement will not be correct
} else
res.append(*i);

schubert::NFCompare nfc(W.schubert(),W.ordering());
Permutation a(res.size());
sortI(res,nfc,a);

list.setSize(0);
for (size_t j = 0; j < res.size(); ++j) {
CoxWord w(0);
W.schubert().append(w, res[a[j]]);
list.append(w);
}

return;
}

}
22 changes: 22 additions & 0 deletions sage.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
/*
Coxeter version 3.0 Copyright (C) 2009 Mike Hansen
*/

#ifndef SAGE_H /* guard against multiple inclusions */
#define SAGE_H

#include "globals.h"
#include "coxgroup.h"
#include "coxtypes.h"
#include "schubert.h"
#include "list.h"

namespace sage {
using namespace coxeter;
using namespace coxtypes;
using namespace list;

void interval(List<CoxWord>& result, CoxGroup& W, const CoxWord& g, const CoxWord& h);
}

#endif