Public Member Functions | Private Member Functions | Private Attributes

chomp::homology::gcomplex< cell, euclidom > Class Template Reference

The class that defines a geometric complex - a set of cells (cubes, simplices, etc). More...

#include <gcomplex.h>

List of all members.

Public Member Functions

 gcomplex ()
 The default constructor.
 gcomplex (const gcomplex< cell, euclidom > &c)
 The copy constructor.
 ~gcomplex ()
 The destructor.
gcomplexoperator= (const gcomplex< cell, euclidom > &c)
 The assignment operator.
int dim () const
 Returns the dimension of the complex, that is, the highest dimension of any cell contained in the complex.
int_t size () const
 Returns the number of cells in the complex.
bool empty () const
 Returns 'true' iff the cell complex is empty.
const hashedset< cell > & operator[] (int d) const
 Returns the set of cells of the given dimension.
const hashedset< cell > & getcob (const cell &c) const
 Returns the coboundary of the given cell.
const hashedset< cell > & getcob (const cell &c, int d) const
 Returns the coboundary of the given cell.
gcomplex< cell, euclidom > & add (const cell &c)
 Add a cell to the geometric complex.
gcomplex< cell, euclidom > & add (const hashedset< cell > &c, int d)
 Adds a set of cells to the geometric complex.
gcomplex< cell, euclidom > & add (const hashedset< cell > &c)
 Adds a set of cells to the geometric complex.
gcomplex< cell, euclidom > & add (const gcomplex< cell, euclidom > &c)
 Adds all the cells from a geometric complex.
gcomplex< cell, euclidom > & remove (const cell &c)
 Remove a cell from the geometric complex.
gcomplex< cell, euclidom > & remove (const hashedset< cell > &c, int d)
 Removes a set of cells to the geometric complex.
gcomplex< cell, euclidom > & remove (const hashedset< cell > &c)
 Removes a set of cells to the geometric complex.
gcomplex< cell, euclidom > & remove (const gcomplex< cell, euclidom > &c)
 Adds all the cells from a geometric complex.
gcomplex< cell, euclidom > & removeall (int d)
 Remove all the cells of the given dimension.
bool check (const cell &c) const
 Check whether the given cell is in the complex.
int_t addboundaries (int d, bool addcob=false)
 Adds boundaries of all the cells of given dimension to the geometric complex.
int_t addboundaries (bool addcob=false)
 Adds boundaries of all the cells of all dimensions to the geometric complex.
int_t addboundaries (int d, gcomplex< cell, euclidom > &notthese, bool keepused=false)
 Adds boundaries of all the cells of given dimension to the geometric complex, except for the cells which belong to the geometric complex "notthese".
int_t addboundaries (gcomplex< cell, euclidom > &notthese, bool keepused=false)
 Adds boundaries of all the cells of all dimensions to the geometric complex, except for the cells which belong to the geometric complex "notthese".
int_t addboundaries (int d, chaincomplex< euclidom > &c)
 Adds boundaries and also fills in the given chain complex.
int_t addboundaries (chaincomplex< euclidom > &c)
 Adds boundaries and also fills in the given chain complex.
int_t addboundaries (int d, chaincomplex< euclidom > &c, gcomplex< cell, euclidom > &notthese, bool keepused=false)
 Adds boundaries and also fills in the given chain complex.
int_t addboundaries (chaincomplex< euclidom > &c, gcomplex< cell, euclidom > &notthese, bool keepused=false)
 Adds boundaries and also fills in the given chain complex.
int_t addboundaries (int d, chaincomplex< euclidom > *c, gcomplex< cell, euclidom > *notthese, bool dontadd, bool keepused, bool addcob)
 The actual function that is used for all the functions for adding boundaries of a fixed dimension.
int_t addboundaries (chaincomplex< euclidom > *c, gcomplex< cell, euclidom > *notthese, bool dontadd, bool keepused, bool addcob)
 The actual function that is used for all the functions for adding boundaries of all dimensions.
int_t collapse (int d, gcomplex< cell, euclidom > &other, const gcomplex< cell, euclidom > &keep, bool addbd, bool addcob, bool disjoint, bool quiet=false)
 Adds boundaries of all the cells of the given dimension and then performs free face collapses.
int_t collapse (gcomplex< cell, euclidom > &other, gcomplex< cell, euclidom > &keep, bool addbd, bool addcob, bool disjoint, const int *level=NULL, bool quiet=false)
 Adds boundaries to 'other' and 'keep', and then does the free face collapses.

Private Member Functions

void increasedimension (int d)
 Increases the dimension of the complex to take this cell.
void decreasedimension ()
 Frees empty sets if there are no cells of high dimensions.

Private Attributes

hashedset< cell > ** tab
 The tables with cells of dimension 0, 1, 2, etc.
mvmap< cell, cell > ** cob
 The tables with coboundaries of cells of these dimensions.
int n
 The number of tables.

Detailed Description

template<class cell, class euclidom>
class chomp::homology::gcomplex< cell, euclidom >

The class that defines a geometric complex - a set of cells (cubes, simplices, etc).

Each cell has its dimension returned by the method "dim ()" of the cell object. Additionally, the following functions must be defined for the cell objects: "boundarylength (cell)" returns the length of the boundary of a cell (i.e., the number of lower-dimensional cells in its boundary), "boundarycell (cell, i)" returns the i-th cell in the boundary, and "boundarycoef (cell, i)" returns the i-th integer coefficient in the boundary.

Definition at line 85 of file gcomplex.h.


Constructor & Destructor Documentation

template<class cell , class euclidom >
chomp::homology::gcomplex< cell, euclidom >::gcomplex (  )  [inline]

The default constructor.

Definition at line 253 of file gcomplex.h.

                                         : tab (NULL), cob (NULL), n (0)
{
        return;
} /* gcomplex<cell,euclidom>::gcomplex */

template<class cell , class euclidom >
chomp::homology::gcomplex< cell, euclidom >::gcomplex ( const gcomplex< cell, euclidom > &  c  ) 

The copy constructor.

Definition at line 259 of file gcomplex.h.

References chomp::homology::gcomplex< cell, euclidom >::cob, chomp::homology::gcomplex< cell, euclidom >::n, and chomp::homology::gcomplex< cell, euclidom >::tab.

{
        n = c. n;
        if (n > 0)
        {
                tab = new hashedset<cell> *[n];
                cob = new mvmap<cell,cell> *[n];
                if (!tab || !cob)
                        throw "Cannot copy a geometric complex.";
        }
        else
        {
                tab = NULL;
                cob = NULL;
        }
        for (int i = 0; i < n; ++ i)
        {
                tab [i] = new hashedset<cell> (*(c. tab [i]));
                cob [i] = new mvmap<cell,cell> (*(c. cob [i]));
                if (!tab [i] || !cob [i])
                        throw "Cannot copy part of a geometric complex.";
        }
        return;
} /* gcomplex<cell,euclidom>::gcomplex */

template<class cell , class euclidom >
chomp::homology::gcomplex< cell, euclidom >::~gcomplex (  ) 

The destructor.

Definition at line 338 of file gcomplex.h.

References chomp::homology::gcomplex< cell, euclidom >::cob, chomp::homology::gcomplex< cell, euclidom >::n, and chomp::homology::gcomplex< cell, euclidom >::tab.

{
        for (int i = 0; i < n; ++ i)
        {
                if (tab [i])
                        delete tab [i];
                if (cob [i])
                        delete cob [i];
        }
        if (tab)
                delete [] tab;
        if (cob)
                delete [] cob;
        return;
} /* gcomplex<cell,euclidom>::~gcomplex */


Member Function Documentation

template<class cell , class euclidom >
gcomplex< cell, euclidom > & chomp::homology::gcomplex< cell, euclidom >::add ( const cell &  c  )  [inline]

Add a cell to the geometric complex.

Definition at line 406 of file gcomplex.h.

References chomp::homology::gcomplex< cell, euclidom >::dim(), chomp::homology::gcomplex< cell, euclidom >::increasedimension(), chomp::homology::gcomplex< cell, euclidom >::n, and chomp::homology::gcomplex< cell, euclidom >::tab.

Referenced by chomp::homology::gcomplex< cell, euclidom >::addboundaries(), and chomp::homology::gcomplex< cell, euclidom >::collapse().

{
        // get the dimension of the cell
        int d = c. dim ();
        if (d < 0)
                throw "Negative dimension of a cell to be added.";

        // if the dimension of the cell is beyond the allocated table,
        // then increase the table
        if (n <= d)
                increasedimension (d);

        // add the cell to the suitable set of cells
        tab [d] -> add (c);

        return *this;
} /* gcomplex<cell,euclidom>::add */

template<class cell , class euclidom >
gcomplex< cell, euclidom > & chomp::homology::gcomplex< cell, euclidom >::add ( const hashedset< cell > &  c,
int  d 
) [inline]

Adds a set of cells to the geometric complex.

It is assumed that all the cells have dimension d.

Definition at line 426 of file gcomplex.h.

{
        // increase the dimension of the complex if necessary
        if (d > n)
                increasedimension (d);

        // add the set of cells to the suitable set
        tab [d] -> add (c);

        return *this;
} /* gcomplex<cell,euclidom>::add */

template<class cell , class euclidom >
gcomplex< cell, euclidom > & chomp::homology::gcomplex< cell, euclidom >::add ( const hashedset< cell > &  c  ) 

Adds a set of cells to the geometric complex.

Definition at line 440 of file gcomplex.h.

{
        int_t size = c. size ();
        for (int_t i = 0; i < size; ++ i)
                add (c [i]);

        return *this;
} /* gcomplex<cell,euclidom>::add */

template<class cell , class euclidom >
gcomplex< cell, euclidom > & chomp::homology::gcomplex< cell, euclidom >::add ( const gcomplex< cell, euclidom > &  c  ) 

Adds all the cells from a geometric complex.

Definition at line 451 of file gcomplex.h.

{
        // increase the dimension of the complex if necessary
        if (c. n > n)
                increasedimension (c. dim ());

        // add the sets of cells
        for (int i = 0; i < c. n; ++ i)
        {
                tab [i] -> add (*(c. tab [i]));
        /*      const hashedset<cell> &cset = *(c. tab [i]);
                for (int j = 0; j < cset. size (); ++ j)
                {
                        const cell &thecell = cset [j];
                        tab [i] -> add (thecell);
                        if (cob && c. cob)
                                (*(cob [i])) [thecell] =
                                        ((*(c. cob [i])) (thecell));
                }
        */
        }

        return *this;
} /* gcomplex<cell,euclidom>::add */

template<class cell , class euclidom >
int_t chomp::homology::gcomplex< cell, euclidom >::addboundaries ( int  d,
bool  addcob = false 
) [inline]

Adds boundaries of all the cells of given dimension to the geometric complex.

If requested, keeps the information about the coboundaries. Returns the number of cells added.

Definition at line 648 of file gcomplex.h.

Referenced by chomp::homology::gcomplex< cell, euclidom >::addboundaries(), and chomp::homology::gcomplex< cell, euclidom >::collapse().

{
        return addboundaries (d, NULL, NULL, false, false, addcob);
} /* gcomplex<cell,euclidom>::addboundaries */

template<class cell , class euclidom >
int_t chomp::homology::gcomplex< cell, euclidom >::addboundaries ( chaincomplex< euclidom > *  c,
gcomplex< cell, euclidom > *  notthese,
bool  dontadd,
bool  keepused,
bool  addcob 
)

The actual function that is used for all the functions for adding boundaries of all dimensions.

Definition at line 636 of file gcomplex.h.

References chomp::homology::gcomplex< cell, euclidom >::addboundaries(), and chomp::homology::gcomplex< cell, euclidom >::n.

{
        int_t countadded = 0;
        for (int d = n - 1; d > 0; -- d)
                countadded += addboundaries (d, c, notthese,
                        dontadd, keepused, addcob);
        return countadded;
} /* gcomplex<cell,euclidom>::addboundaries */

template<class cell , class euclidom >
int_t chomp::homology::gcomplex< cell, euclidom >::addboundaries ( bool  addcob = false  )  [inline]

Adds boundaries of all the cells of all dimensions to the geometric complex.

If requested, keeps the information about the coboundaries. Returns the number of cells added.

Definition at line 654 of file gcomplex.h.

References chomp::homology::gcomplex< cell, euclidom >::addboundaries().

{
        return addboundaries (NULL, NULL, false, false, addcob);
} /* gcomplex<cell,euclidom>::addboundaries */

template<class cell , class euclidom >
int_t chomp::homology::gcomplex< cell, euclidom >::addboundaries ( int  d,
gcomplex< cell, euclidom > &  notthese,
bool  keepused = false 
) [inline]

Adds boundaries of all the cells of given dimension to the geometric complex, except for the cells which belong to the geometric complex "notthese".

If "keepused" is set to false, then cells whose boundaries have been added are removed from the geometric complex; otherwise, they are kept there. Returns the number of cells added.

Definition at line 660 of file gcomplex.h.

References chomp::homology::gcomplex< cell, euclidom >::addboundaries().

{
        return addboundaries (d, NULL, &notthese, false, keepused, false);
} /* gcomplex<cell,euclidom>::addboundaries */

template<class cell , class euclidom >
int_t chomp::homology::gcomplex< cell, euclidom >::addboundaries ( gcomplex< cell, euclidom > &  notthese,
bool  keepused = false 
)

Adds boundaries of all the cells of all dimensions to the geometric complex, except for the cells which belong to the geometric complex "notthese".

If "keepused" is set to false, then cells whose boundaries have been added are removed from the geometric complex; otherwise, they are kept there. Returns the number of cells added.

Definition at line 668 of file gcomplex.h.

References chomp::homology::addboundaries().

{
        return addboundaries (NULL, &notthese, false, keepused, false);
} /* gcomplex<cell,euclidom>::addboundaries */

template<class cell , class euclidom >
int_t chomp::homology::gcomplex< cell, euclidom >::addboundaries ( int  d,
chaincomplex< euclidom > &  c 
) [inline]

Adds boundaries and also fills in the given chain complex.

Definition at line 674 of file gcomplex.h.

References chomp::homology::gcomplex< cell, euclidom >::addboundaries().

{
        return addboundaries (d, &c, NULL, false, false, false);
} /* gcomplex<cell,euclidom>::addboundaries */

template<class cell , class euclidom >
int_t chomp::homology::gcomplex< cell, euclidom >::addboundaries ( chaincomplex< euclidom > &  c  )  [inline]

Adds boundaries and also fills in the given chain complex.

Definition at line 681 of file gcomplex.h.

References chomp::homology::gcomplex< cell, euclidom >::addboundaries().

{
        return addboundaries (&c, NULL, false, false, false);
} /* gcomplex<cell,euclidom>::addboundaries */

template<class cell , class euclidom >
int_t chomp::homology::gcomplex< cell, euclidom >::addboundaries ( int  d,
chaincomplex< euclidom > &  c,
gcomplex< cell, euclidom > &  notthese,
bool  keepused = false 
) [inline]

Adds boundaries and also fills in the given chain complex.

Definition at line 687 of file gcomplex.h.

References chomp::homology::gcomplex< cell, euclidom >::addboundaries().

{
        return addboundaries (d, &c, &notthese, false, keepused, false);
} /* gcomplex<cell,euclidom>::addboundaries */

template<class cell , class euclidom >
int_t chomp::homology::gcomplex< cell, euclidom >::addboundaries ( chaincomplex< euclidom > &  c,
gcomplex< cell, euclidom > &  notthese,
bool  keepused = false 
) [inline]

Adds boundaries and also fills in the given chain complex.

Definition at line 695 of file gcomplex.h.

References chomp::homology::gcomplex< cell, euclidom >::addboundaries().

{
        return addboundaries (&c, &notthese, false, keepused, false);
} /* gcomplex<cell,euclidom>::addboundaries */

template<class cell , class euclidom >
int_t chomp::homology::gcomplex< cell, euclidom >::addboundaries ( int  d,
chaincomplex< euclidom > *  c,
gcomplex< cell, euclidom > *  notthese,
bool  dontadd,
bool  keepused,
bool  addcob 
)

The actual function that is used for all the functions for adding boundaries of a fixed dimension.

Definition at line 580 of file gcomplex.h.

References chomp::homology::gcomplex< cell, euclidom >::add(), chomp::homology::gcomplex< cell, euclidom >::addboundaries(), chomp::homology::boundarycell(), chomp::homology::boundarycoef(), chomp::homology::boundarylength(), chomp::homology::gcomplex< cell, euclidom >::check(), chomp::homology::gcomplex< cell, euclidom >::cob, chomp::homology::gcomplex< cell, euclidom >::n, chomp::homology::gcomplex< cell, euclidom >::removeall(), chomp::homology::gcomplex< cell, euclidom >::size(), and chomp::homology::gcomplex< cell, euclidom >::tab.

{
        // if the dimension is inappropriate, do nothing
        if ((d <= 0) || (d >= n))
                return 0;

        // first add boundaries to the other cell complex
        if (notthese && !dontadd)
                notthese -> addboundaries (d);

        int_t prevsize = tab [d - 1] -> size ();
        hashedset<cell> &cset = *(tab [d]);
        for (int_t i = 0; i < cset. size (); ++ i)
        {
                const cell &thecell = cset [i];
                int len = boundarylength (thecell);
                for (int j = 0; j < len; ++ j)
                {
                        // take the j-th boundary cell
                        cell bcell = boundarycell (thecell, j);

                        // add it to the cell complex unless it is unwanted
                        if (!notthese || !notthese -> check (bcell))
                        {
                                tab [d - 1] -> add (bcell);
                                if (c)
                                {
                                        int icoef = boundarycoef (thecell, j);
                                        euclidom coef;
                                        if (icoef < 0)
                                        {
                                                coef = -icoef;
                                                coef = -coef;
                                        }
                                        else
                                                coef = icoef;
                                        c -> add (d, tab [d - 1] ->
                                                getnumber (bcell), i, coef);
                                }
                                if (addcob)
                                        (*(cob [d - 1])) [bcell].
                                                add (thecell);
                        }
                }
        }

        // clean the used level in 'notthese'
        if (notthese && !keepused)
                notthese -> removeall (d);

        return tab [d - 1] -> size () - prevsize;
} /* gcomplex<cell,euclidom>::addboundaries */

template<class cell , class euclidom >
bool chomp::homology::gcomplex< cell, euclidom >::check ( const cell &  c  )  const

Check whether the given cell is in the complex.

Returns true if yes, false if not.

Definition at line 563 of file gcomplex.h.

References chomp::homology::gcomplex< cell, euclidom >::dim(), chomp::homology::gcomplex< cell, euclidom >::n, and chomp::homology::gcomplex< cell, euclidom >::tab.

Referenced by chomp::homology::gcomplex< cell, euclidom >::addboundaries(), and chomp::homology::gcomplex< cell, euclidom >::collapse().

{
        // get the dimension of the cell
        int d = c. dim ();
        if (d < 0)
                throw "Negative dimension of a cell to be checked.";

        // if the dimension of the cell is beyond the allocated table,
        // then it is not there
        if (n <= d)
                return false;

        // check for the existence of the cell in the suitable set of cells
        return tab [d] -> check (c);
} /* gcomplex<cell,euclidom>::check */

template<class cell , class euclidom >
int_t chomp::homology::gcomplex< cell, euclidom >::collapse ( int  d,
gcomplex< cell, euclidom > &  other,
const gcomplex< cell, euclidom > &  keep,
bool  addbd,
bool  addcob,
bool  disjoint,
bool  quiet = false 
)

Adds boundaries of all the cells of the given dimension and then performs free face collapses.

Does not remove cells listed in 'keep'. Removes from 'other' and 'this' unnecessary d-dim cells. Returns the number of collapses performed.

Definition at line 753 of file gcomplex.h.

References chomp::homology::gcomplex< cell, euclidom >::add(), chomp::homology::boundarycell(), chomp::homology::boundarylength(), chomp::homology::gcomplex< cell, euclidom >::check(), chomp::homology::gcomplex< cell, euclidom >::cob, chomp::homology::gcomplex< cell, euclidom >::decreasedimension(), chomp::homology::gcomplex< cell, euclidom >::dim(), chomp::homology::findelem(), chomp::homology::gcomplex< cell, euclidom >::remove(), chomp::homology::gcomplex< cell, euclidom >::removeall(), chomp::homology::scon, chomp::homology::gcomplex< cell, euclidom >::size(), chomp::homology::sseq, and chomp::homology::gcomplex< cell, euclidom >::tab.

Referenced by chomp::homology::gcomplex< cell, euclidom >::collapse().

{
        if ((d <= 0) || (d > dim ()))
                return 0;

        // prepare references to the sets of cells of interest
        hashedset<cell> &cset = *(tab [d]);
        hashedset<cell> &bset = *(tab [d - 1]);
        hashedset<cell> empty;
        hashedset<cell> &cother = (other. dim () >= d) ?
                *(other. tab [d]) : empty;
        hashedset<cell> &bother = (other. dim () >= d - 1) ?
                *(other. tab [d - 1]) : empty;
        const hashedset<cell> &ckeep = (keep. dim () >= d) ?
                *(keep. tab [d]) : empty;
        const hashedset<cell> &bkeep = (keep. dim () >= d - 1) ?
                *(keep. tab [d - 1]) : empty;

        // show the currently processed dimension
        if (!quiet)
        {
                if (d > 9)
                        scon << "#\b";
                else
                        scon << d << '\b';
        }

        // go through all the cells from A and generate their boundaries
        if (addbd)
        {
                if (!quiet)
                {
                        sseq << "\"Adding boundaries of cells in A...\"\n";
                        sseq << "D 0\n";
                }
                for (int_t i = 0; i < cother. size (); ++ i)
                {
                        // select the given cell in 'cother'
                        const cell &thecell = cother [i];

                        // detect the length of the boundary of this cell
                        int blen = boundarylength (thecell);

                        // add to 'bother' all the cells in this boundary
                        for (int j = 0; j < blen; ++ j)
                                bother. add (boundarycell (thecell, j));

                        // write the boundary cells to the sequential file
                        if (!quiet && (sseq. show || sseq. log))
                        {
                                for (int j = 0; j < blen; ++ j)
                                        sseq << '2' << boundarycell
                                                (thecell, j) << '\n';
                        }
                }
        }
        if (!quiet)
                sseq << "D 100\n";

        // if the complexes should be disjoint, remove 'bother' from 'bset'
        if (disjoint)
                bset. remove (bother);

        // prepare tables for coboundaries of cells in X and their lengths
        multitable<int> coblen;
        multitable<hashedset <cell> > coboundary;
        if (!bset. empty ())
                coblen. fill (0, bset. size ());

        // go through the list of all the cells of dimension 'd' in the set,
        // add their boundaries to 'bset' and create the coboundary links;
        // note: these cells may appear in the 'other' complex
        if (!quiet)
                sseq << "\"Adding boundaries of cells of dimension " <<
                        d << "\"\nD 0\n";
        bool maximal = (d == dim ());
        for (int_t i = 0; i < cset. size (); ++ i)
        {
                // select the i-th d-dimensional cell
                const cell &thecell = cset [i];

                // check if this cell belongs to 'cother'
                bool cbelongs = cother. check (thecell);

                // if this cell should be removed, do it
                if (cbelongs && (disjoint || maximal))
                {
                //      if (!quiet && (sseq. show || sseq. log))
                //              sseq << '0' << thecell << '\n';
                        cother. remove (thecell);
                        cset. removenum (i --);
                        continue;
                }

                // detect the length of the boundary of this cell
                int blen = boundarylength (thecell);

                // should this cell be kept secure from the collapses?
                bool keepit = ckeep. check (thecell);

                // go through all the cells in this boundary
                for (int j = 0; j < blen; ++ j)
                {
                        // take the j-th boundary cell
                        cell bcell = boundarycell (thecell, j);

                        // check if this cell belongs to the other complex
                        bool bbelongs = bother. check (bcell);

                        // if it is in 'bother', then skip it if disjoint
                        if (bbelongs && disjoint)
                                continue;

                        // add this cell to 'bset' or get its number
                        int_t prev = bset. size ();
                        int_t number = addbd ? bset. add (bcell) :
                                bset. getnumber (bcell);

                        // if the cell is not there, skip it
                        if (number < 0)
                                continue;

                        // if this is the first occurrence of the cell
                        if ((prev < bset. size ()) || (coblen [number] == 0))
                        {
                                // write it to the sequence if necessary
                                if (!quiet && !bbelongs)
                                        sseq << '1' << bcell << '\n';

                                // if this cell should be kept, mark it
                                if (keepit || bkeep. check (bset [number]) ||
                                        bother. check (bset [number]))
                                        coblen [number] = 13;
                                else
                                        coblen [number] = 1;
                                coboundary [number]. add (thecell);
                        }

                        // otherwise add the corresponding coboundary link
                        else
                        {
                                ++ (coblen [number]);
                                coboundary [number]. add (thecell);
                        }
                }
        }
        if (!quiet)
                sseq << "D 100\n";

        // show a dot
        if (!quiet)
                scon << "*\b";

        // prepare tables for cells to be removed
        hashedset<cell> cremove, bremove;
        int_t nremove = 0;

        // go through all the free faces
        if (!quiet)
                sseq << "\"Collapsing free faces...\"\n";
        while (1)
        {
                // find a free face
                int_t ncell = findelem (coblen, 1, bset. size ());

                // if not found then finish
                if (ncell < 0)
                        break;

                // collapse this cell with its parent cell
                const cell &parent = coboundary [ncell] [0];
                int blen = boundarylength (parent);
                coblen [ncell] = 0;

                // remove the parent cell from coboundaries
                for (int j = 0; j < blen; ++ j)
                {
                        cell thecell = boundarycell (parent, j);
                        int_t number = bset. getnumber (thecell);
                        if ((number >= 0) && (coblen [number] > 0))
                        {
                                coboundary [number]. remove (parent);
                                -- (coblen [number]);
                        }
                }

                // write these cells to the sequence file
                if (!quiet)
                {
                        sseq << '0' << bset [ncell] << '\n';
                        sseq << '0' << parent << '\n';
                }

                // mark these cells for removal
                cremove. add (parent);
                bremove. add (bset [ncell]);
                ++ nremove;

                // clear the coboundary, because it is no longer used
                coboundary [ncell] = empty;
        }

        // add the computed coboundaries if required
        if (addcob)
        {
                for (int_t i = 0; i < bset. size (); ++ i)
                        if (!bremove. check (bset [i]))
                        {
                                coboundary [i]. remove (cremove);
                                (*(cob [d - 1])) [bset [i]]. add
                                        (coboundary [i]);
                        }
        }

        // remove cells that are scheduled for removal from 'cset'
        if (nremove == cset. size ())
        {
                removeall (d);
                other. removeall (d);
        }
        else
        {
                for (int_t i = 0; i < nremove; ++ i)
                        cset. remove (cremove [i]);
        }

        // remove from the set of boundary cells these scheduled for removal
        for (int_t i = 0; i < nremove; ++ i)
                bset. remove (bremove [i]);

        // update the dimension of the cell complex - is this necessary?
        decreasedimension ();

        // show a dot
        if (!quiet)
                scon << '.';

        return nremove;
} /* gcomplex<cell,euclidom>::collapse */

template<class cell , class euclidom >
int_t chomp::homology::gcomplex< cell, euclidom >::collapse ( gcomplex< cell, euclidom > &  other,
gcomplex< cell, euclidom > &  keep,
bool  addbd,
bool  addcob,
bool  disjoint,
const int *  level = NULL,
bool  quiet = false 
)

Adds boundaries to 'other' and 'keep', and then does the free face collapses.

Does this at all levels or only the necessary ones. Remove sfrom 'other' cells that are not in the result. If 'disjoint', then removes 'other' from 'this'. Removes from 'keep' cells not contained in the result. Returns the number of collapses performed.

Definition at line 996 of file gcomplex.h.

References chomp::homology::gcomplex< cell, euclidom >::addboundaries(), chomp::homology::gcomplex< cell, euclidom >::check(), chomp::homology::gcomplex< cell, euclidom >::collapse(), chomp::homology::gcomplex< cell, euclidom >::dim(), chomp::homology::gcomplex< cell, euclidom >::empty(), chomp::homology::gcomplex< cell, euclidom >::removeall(), chomp::homology::scon, chomp::homology::gcomplex< cell, euclidom >::size(), and chomp::homology::gcomplex< cell, euclidom >::tab.

{
        // determine the lower bound for the adding boundaries levels
        int dmin = 0;
        if (level)
        {
                while ((dmin < dim ()) && (!level [dmin]))
                        ++ dmin;
                if (dmin && level [dmin])
                        -- dmin;
        }

        // add boundaries to high-dimensional cells in 'keep'
        while (keep. dim () > dim ())
        {
                keep. addboundaries (keep. dim ());
                keep. removeall (keep. dim ());
        }

        // add boundaries to high-dimensional cells in 'other'
        if (other. dim () > dim ())
        {
                other. addboundaries (other. dim ());
                other. removeall (other. dim ());
        }

        // add boundaries and collapse in all the dimensions of interest
        int_t counter = 0;
        for (int d = dim (); d > dmin; -- d)
        {
                // add boundaries to the other cell complexes
                keep. addboundaries (d);

                // add boundaries and collapse this level
                counter += collapse (d, other, keep, addbd, addcob, disjoint,
                        quiet);

                // remove unnecessary cells from 'other'
                if (disjoint)
                        other. removeall (d);

                // remove unnecessary cells from 'keep'
                keep. removeall (d);
        }

        // forget all the other cells of minimal dimension which are not used
        if (!disjoint && (dim () >= dmin) && (other. dim () >= dmin))
        {
                hashedset<cell> &cset = *(tab [dmin]);
                hashedset<cell> &cother = *(other. tab [dmin]);
                for (int_t i = 0; i < cother. size (); ++ i)
                {
                        if (!(cset. check (cother [i])))
                                cother. removenum (i --);
                }
        }

        // remove unused cells which were supposed to be kept
        if (!keep. empty ())
        {
                gcomplex<cell,euclidom> empty;
                keep = empty;
        }

        if (!quiet)
                scon << ' ';

        return counter;
} /* gcomplex<cell,euclidom>::collapse */

template<class cell , class euclidom >
void chomp::homology::gcomplex< cell, euclidom >::decreasedimension (  )  [private]

Frees empty sets if there are no cells of high dimensions.

Definition at line 1104 of file gcomplex.h.

References chomp::homology::gcomplex< cell, euclidom >::cob, chomp::homology::gcomplex< cell, euclidom >::empty(), chomp::homology::gcomplex< cell, euclidom >::n, and chomp::homology::gcomplex< cell, euclidom >::tab.

Referenced by chomp::homology::gcomplex< cell, euclidom >::collapse(), and chomp::homology::gcomplex< cell, euclidom >::removeall().

{
        while (n && tab [n - 1] -> empty ())
        {
                -- n;
                delete tab [n];
                delete cob [n];
        }
        if (!n)
        {
                delete [] tab;
                tab = NULL;
                delete [] cob;
                cob = NULL;
        }
        return;
} /* gcomplex<cell,euclidom>::decreasedimension */

template<class cell , class euclidom >
int chomp::homology::gcomplex< cell, euclidom >::dim (  )  const [inline]

Returns the dimension of the complex, that is, the highest dimension of any cell contained in the complex.

Definition at line 355 of file gcomplex.h.

References chomp::homology::gcomplex< cell, euclidom >::n.

Referenced by chomp::homology::gcomplex< cell, euclidom >::add(), chomp::homology::gcomplex< cell, euclidom >::check(), chomp::homology::gcomplex< cell, euclidom >::collapse(), and chomp::homology::gcomplex< cell, euclidom >::getcob().

{
        return n - 1;
} /* gcomplex<cell,euclidom>::dim */

template<class cell , class euclidom >
bool chomp::homology::gcomplex< cell, euclidom >::empty (  )  const

Returns 'true' iff the cell complex is empty.

Definition at line 370 of file gcomplex.h.

References chomp::homology::gcomplex< cell, euclidom >::n, and chomp::homology::gcomplex< cell, euclidom >::tab.

Referenced by chomp::homology::gcomplex< cell, euclidom >::collapse(), and chomp::homology::gcomplex< cell, euclidom >::decreasedimension().

{
        if (!n)
                return true;
        for (int i = 0; i < n; ++ i)
                if (!(*(tab [i])). empty ())
                        return false;
        return true;
} /* gcomplex<cell,euclidom>::empty */

template<class cell , class euclidom >
const hashedset< cell > & chomp::homology::gcomplex< cell, euclidom >::getcob ( const cell &  c  )  const [inline]

Returns the coboundary of the given cell.

Definition at line 390 of file gcomplex.h.

References chomp::homology::gcomplex< cell, euclidom >::dim().

{
        return getcob (c, c. dim ());
} /* gcomplex<cell,euclidom>::getcob */

template<class cell , class euclidom >
const hashedset< cell > & chomp::homology::gcomplex< cell, euclidom >::getcob ( const cell &  c,
int  d 
) const [inline]

Returns the coboundary of the given cell.

The dimension of the cell must be given.

Definition at line 397 of file gcomplex.h.

References chomp::homology::gcomplex< cell, euclidom >::cob, and chomp::homology::gcomplex< cell, euclidom >::n.

{
        if ((d < 0) || (d >= n))
                throw "Dimension out of range for coboundary.";
        return (*(cob [d])) (c);
} /* gcomplex<cell,euclidom>::getcob */

template<class cell , class euclidom >
void chomp::homology::gcomplex< cell, euclidom >::increasedimension ( int  d  )  [private]

Increases the dimension of the complex to take this cell.

Definition at line 1069 of file gcomplex.h.

References chomp::homology::gcomplex< cell, euclidom >::cob, chomp::homology::gcomplex< cell, euclidom >::n, and chomp::homology::gcomplex< cell, euclidom >::tab.

Referenced by chomp::homology::gcomplex< cell, euclidom >::add().

{
        // create a new table for sets of cells
        hashedset<cell> **newtab = new hashedset<cell> *[d + 1];
        mvmap<cell,cell> **newcob = new mvmap<cell,cell> *[d + 1];

        // copy anything that was in the old table
        for (int i = 0; i < n; ++ i)
        {
                newtab [i] = tab [i];
                newcob [i] = cob [i];
        }

        // delete the old table if it was allocated
        if (tab)
                delete [] tab;
        if (cob)
                delete [] cob;

        // initialize the remaining portion of the new table
        tab = newtab;
        cob = newcob;
        for (int i = n; i < d + 1; ++ i)
        {
                tab [i] = new hashedset<cell>;
                cob [i] = new mvmap<cell,cell>;
        }

        // set the new dimension
        n = d + 1;

        return;
} /* gcomplex<cell,euclidom>::increasedimension */

template<class cell , class euclidom >
gcomplex< cell, euclidom > & chomp::homology::gcomplex< cell, euclidom >::operator= ( const gcomplex< cell, euclidom > &  c  ) 

The assignment operator.

Definition at line 286 of file gcomplex.h.

{
        // if the sizes of the tables are not the same, re-allocate the table
        // and use the copying constructor to create an identical table
        if (n != c. n)
        {
                if (tab)
                {
                        for (int i = 0; i < n; ++ i)
                                delete tab [i];
                        delete [] tab;
                }
                if (cob)
                {
                        for (int i = 0; i < n; ++ i)
                                delete cob [i];
                        delete [] cob;
                }
                n = c. n;
                if (n > 0)
                {
                        tab = new hashedset<cell> *[n];
                        cob = new mvmap<cell,cell> *[n];
                        if (!tab || !cob)
                                throw "Cannot copy a geometric complex.";
                }
                else
                {
                        tab = NULL;
                        cob = NULL;
                }
                for (int i = 0; i < n; ++ i)
                {
                        tab [i] = new hashedset<cell> (*(c. tab [i]));
                        cob [i] = new mvmap<cell,cell> (*(c. cob [i]));
                        if (!tab [i] || !cob [i])
                                throw "Cannot copy part of a geom. complex.";
                }
        }
        // otherwise copy the source table to this complex
        else
        {
                for (int i = 0; i < n; ++ i)
                {
                        *(tab [i]) = *(c. tab [i]);
                        *(cob [i]) = *(c. cob [i]);
                }
        }
        return *this;
} /* gcomplex<cell,euclidom>::operator = */

template<class cell , class euclidom >
const hashedset< cell > & chomp::homology::gcomplex< cell, euclidom >::operator[] ( int  d  )  const [inline]

Returns the set of cells of the given dimension.

Definition at line 381 of file gcomplex.h.

References chomp::homology::gcomplex< cell, euclidom >::n, and chomp::homology::gcomplex< cell, euclidom >::tab.

{
        if ((d < 0) || (d >= n))
                throw "Dimension out of range for retrieving cells.";
        return *(tab [d]);
} /* gcomplex<cell,euclidom>::operator [] */

template<class cell , class euclidom >
gcomplex< cell, euclidom > & chomp::homology::gcomplex< cell, euclidom >::remove ( const gcomplex< cell, euclidom > &  c  ) 

Adds all the cells from a geometric complex.

Definition at line 502 of file gcomplex.h.

References chomp::homology::decreasedimension().

{
        // figure out the number of tables to work on
        int m = c. n;
        if (m > n)
                m = n;

        // remove the sets of cells
        for (int i = 0; i < m; ++ i)
                tab [i] -> remove (*(c. tab [i]));

        // decrease the dimension of the complex if no highdim cells remain
        decreasedimension ();

        return *this;
} /* gcomplex<cell,euclidom>::remove */

template<class cell , class euclidom >
gcomplex< cell, euclidom > & chomp::homology::gcomplex< cell, euclidom >::remove ( const hashedset< cell > &  c,
int  d 
) [inline]

Removes a set of cells to the geometric complex.

It is assumed that all the cells have dimension d.

Definition at line 521 of file gcomplex.h.

References chomp::homology::decreasedimension().

{
        // remove the set of cells to the suitable set
        tab [d] -> remove (c);

        // decrease the dimension of the complex if no highdim cells remain
        decreasedimension ();

        return *this;
} /* gcomplex<cell,euclidom>::remove */

template<class cell , class euclidom >
gcomplex< cell, euclidom > & chomp::homology::gcomplex< cell, euclidom >::remove ( const hashedset< cell > &  c  ) 

Removes a set of cells to the geometric complex.

Definition at line 534 of file gcomplex.h.

{
        int_t size = c. size ();
        for (int_t i = 0; i < size; ++ i)
                remove (c [i]);

        return *this;
} /* gcomplex<cell,euclidom>::remove */

template<class cell , class euclidom >
gcomplex< cell, euclidom > & chomp::homology::gcomplex< cell, euclidom >::remove ( const cell &  c  )  [inline]

Remove a cell from the geometric complex.

Definition at line 478 of file gcomplex.h.

References chomp::homology::decreasedimension().

Referenced by chomp::homology::gcomplex< cell, euclidom >::collapse().

{
        // get the dimension of the cell
        int d = c. dim ();
        if (d < 0)
                throw "Negative dimension of a cell to be removed.";

        // if the dimension of the cell is beyond the allocated table,
        // then ignore it
        if (n <= d)
                return *this;

        // remove the cell from the suitable set of cells
        tab [d] -> remove (c);

        // decrease the dimension of the complex if no cells remain
        if ((d == n - 1) && tab [d] -> empty ())
                decreasedimension ();

        return *this;
} /* gcomplex<cell,euclidom>::remove */

template<class cell , class euclidom >
gcomplex< cell, euclidom > & chomp::homology::gcomplex< cell, euclidom >::removeall ( int  d  ) 

Remove all the cells of the given dimension.

Definition at line 544 of file gcomplex.h.

References chomp::homology::gcomplex< cell, euclidom >::cob, chomp::homology::gcomplex< cell, euclidom >::decreasedimension(), chomp::homology::gcomplex< cell, euclidom >::n, and chomp::homology::gcomplex< cell, euclidom >::tab.

Referenced by chomp::homology::gcomplex< cell, euclidom >::addboundaries(), and chomp::homology::gcomplex< cell, euclidom >::collapse().

{
        if (d == n - 1)
        {
                -- n;
                delete tab [n];
                delete cob [n];
                decreasedimension ();
        }
        else if ((d >= 0) && (d < n))
        {
                delete tab [d];
                tab [d] = new hashedset<cell>;
        }

        return *this;
} /* gcomplex<cell,euclidom>::removeall */

template<class cell , class euclidom >
int_t chomp::homology::gcomplex< cell, euclidom >::size (  )  const

Returns the number of cells in the complex.

Definition at line 361 of file gcomplex.h.

References chomp::homology::gcomplex< cell, euclidom >::n, and chomp::homology::gcomplex< cell, euclidom >::tab.

Referenced by chomp::homology::gcomplex< cell, euclidom >::addboundaries(), and chomp::homology::gcomplex< cell, euclidom >::collapse().

{
        int_t count = 0;
        for (int i = 0; i < n; ++ i)
                count += tab [i] -> size ();
        return count;
} /* gcomplex<cell,euclidom>::size */


Member Data Documentation

template<class cell, class euclidom>
mvmap<cell,cell>** chomp::homology::gcomplex< cell, euclidom >::cob [private]
template<class cell, class euclidom>
int chomp::homology::gcomplex< cell, euclidom >::n [private]
template<class cell, class euclidom>
hashedset<cell>** chomp::homology::gcomplex< cell, euclidom >::tab [private]

The documentation for this class was generated from the following file: