This class defines objects which represent chains as finite sequences of elements identified by integral numbers with coefficients in a given Euclidean domain. More...
#include <chains.h>
Public Member Functions | |
chain () | |
The default constructor. | |
chain (const chain< euclidom > &c) | |
The copy constructor. | |
chain< euclidom > & | operator= (const chain< euclidom > &c) |
The assignment operator. | |
~chain () | |
The destructor. | |
int | size () const |
Returns the size of the chain, that is, the number of elements with non-zero coefficients. | |
bool | empty () const |
Returns true if the chain is empty (zero), false otherwise. | |
euclidom | getcoefficient (int n=-1) const |
Finds and returns the coefficient in front of the given element. | |
int | findnumber (int n) const |
Find the position of an element with the given identifier. | |
euclidom | coef (int i) const |
Returns the coefficient in front of the i-th element in the chain. | |
int | num (int i) const |
Returns the number (identifier) of the i-th element in the chain. | |
bool | contains_non_invertible () const |
Determines if the chain contains a non-invertible coefficient. | |
int | findbest (chain< euclidom > *table=NULL) const |
Finds the best element in the chain for reduction, that is, the element with minimal value of delta. | |
chain< euclidom > & | add (int n, euclidom e) |
Adds an element algebraically to the chain. | |
chain< euclidom > & | remove (int n) |
Removes an element with the given identifier from the chain. | |
chain< euclidom > & | add (const chain< euclidom > &other, euclidom e, int number=-1, chain< euclidom > *table=NULL) |
Adds one chain to another with a given coefficient. | |
chain< euclidom > & | swap (chain< euclidom > &other, int number=-1, int othernumber=-1, chain< euclidom > *table=NULL) |
Swaps one chain with another. | |
chain< euclidom > & | take (chain< euclidom > &c) |
Takes data from another chain. Destroys the other chain. | |
chain< euclidom > & | multiply (euclidom e, int number=-1) |
Multiplies one or all the coefficients in the chain by the given number. | |
outputstream & | show (outputstream &out, const char *label=NULL) const |
Shows the chain to the output stream. | |
std::ostream & | show (std::ostream &out, const char *label=NULL) const |
Shows the chain to the standard output stream. | |
Private Member Functions | |
chain< euclidom > & | insertpair (int i, int n, euclidom e) |
Inserts one chain element at the given position. | |
chain< euclidom > & | removepair (int i) |
Removes one chain element at the given position. | |
chain< euclidom > & | swapnumbers (int number1, int number2) |
Swaps two numbers (identifiers) in the chain. | |
bool | allocated () const |
Checks if the tables have been allocated depending on the value of their length. | |
Private Attributes | |
int | len |
The length of the list and the length of the table. | |
union { | |
struct { | |
int * n | |
euclidom * e | |
} t | |
struct { | |
int * n | |
euclidom * e | |
} x | |
}; | |
Elements of the list sorted according to the identifier. |
This class defines objects which represent chains as finite sequences of elements identified by integral numbers with coefficients in a given Euclidean domain.
Definition at line 101 of file chains.h.
chomp::homology::chain< euclidom >::chain | ( | ) | [inline] |
The default constructor.
Definition at line 246 of file chains.h.
References chomp::homology::chain< euclidom >::len.
{ len = 0; return; } /* chain<euclidom>::chain */
chomp::homology::chain< euclidom >::chain | ( | const chain< euclidom > & | c | ) | [inline] |
The copy constructor.
Definition at line 253 of file chains.h.
References chomp::homology::chain< euclidom >::allocated(), chomp::homology::chain< euclidom >::e, chomp::homology::chain< euclidom >::len, chomp::homology::chain< euclidom >::n, chomp::homology::chain< euclidom >::t, and chomp::homology::chain< euclidom >::x.
{ // copy the length of the chain len = c. len; // allocate new tables if necessary and copy the data if (allocated ()) { t. n = new int [len]; t. e = new euclidom [len]; if (!t. n || !t. e) throw "Not enough memory to create a chain copy."; for (int i = 0; i < len; ++ i) { t. n [i] = c. t. n [i]; t. e [i] = c. t. e [i]; } } else { for (int i = 0; i < len; ++ i) { x. n [i] = c. x. n [i]; x. e [i] = c. x. e [i]; } } return; } /* chain<euclidom>::chain */
chomp::homology::chain< euclidom >::~chain | ( | ) | [inline] |
The destructor.
Definition at line 321 of file chains.h.
References chomp::homology::chain< euclidom >::allocated(), chomp::homology::chain< euclidom >::e, chomp::homology::chain< euclidom >::n, and chomp::homology::chain< euclidom >::t.
chain< euclidom > & chomp::homology::chain< euclidom >::add | ( | int | n, | |
euclidom | e | |||
) | [inline] |
Adds an element algebraically to the chain.
Definition at line 690 of file chains.h.
References chomp::homology::chain< euclidom >::allocated(), chomp::homology::chain< euclidom >::insertpair(), chomp::homology::chain< euclidom >::len, chomp::homology::chain< euclidom >::removepair(), chomp::homology::chain< euclidom >::t, and chomp::homology::chain< euclidom >::x.
Referenced by chomp::homology::chain< euclidom >::add().
{ // if the coefficient is zero, ignore the pair if (e == 0) return *this; bool a = allocated (); int *tntab = a ? t. n : x. n; euclidom *tetab = a ? t. e : x. e; // find the position in the table for adding this pair int i = 0; while ((i < len) && (tntab [i] < n)) ++ i; // if an element with this identifier was found, add the coefficients if ((i < len) && (tntab [i] == n)) { // add the coefficient tetab [i] += e; // if the coefficient became zero, remove this pair if (tetab [i] == 0) return removepair (i); // otherwise we are done else return *this; } // otherwise insert this pair into the chain return insertpair (i, n, e); } /* chain<euclidom>::add */
chain< euclidom > & chomp::homology::chain< euclidom >::add | ( | const chain< euclidom > & | other, | |
euclidom | e, | |||
int | number = -1 , |
|||
chain< euclidom > * | table = NULL | |||
) | [inline] |
Adds one chain to another with a given coefficient.
If the chain is a row of a matrix, then its number and the table of columns must be given for proper modification. If this is a column, its number and columns must be given.
Definition at line 743 of file chains.h.
References chomp::homology::chain< euclidom >::add(), chomp::homology::chain< euclidom >::allocated(), chomp::homology::chain< euclidom >::len, chomp::homology::chain< euclidom >::t, and chomp::homology::chain< euclidom >::x.
{ // if the coefficient is zero or the other chain is zero, // then there is nothing to do if ((e == 0) || !other. len) return *this; // prepare big tables for the new chain int tablen = len + other. len; int *bigntab = new int [tablen]; euclidom *bigetab = new euclidom [tablen]; if (!bigntab || !bigetab) throw "Not enough memory to add chains."; // prepare the counters of elements of the two input chains // and of the output chain int i = 0, j = 0, k = 0; // determine the actual tables to be processed bool a = allocated (); bool oa = other. allocated (); const int *tntab = a ? t. n : x. n; const euclidom *tetab = a ? t. e : x. e; const int *ontab = oa ? other. t. n : other. x. n; const euclidom *oetab = oa ? other. t. e : other. x. e; // go through both input chains and compute the output chain while ((i < len) || (j < other. len)) { if (i >= len) { bigntab [k] = ontab [j]; bigetab [k] = e * oetab [j ++]; if (table) { table [bigntab [k]]. add (number, bigetab [k]); } ++ k; } else if ((j >= other. len) || (tntab [i] < ontab [j])) { bigntab [k] = tntab [i]; bigetab [k ++] = tetab [i ++]; } else if (tntab [i] > ontab [j]) { bigntab [k] = ontab [j]; bigetab [k] = e * oetab [j ++]; if (table) { table [bigntab [k]]. add (number, bigetab [k]); } ++ k; } else // if (tntab [i] == ontab [j]) { bigntab [k] = tntab [i]; euclidom addelem = e * oetab [j ++]; bigetab [k] = tetab [i ++] + addelem; euclidom zero; zero = 0; if (bigetab [k] != zero) { if (table) { table [bigntab [k]]. add (number, addelem); } ++ k; } else if (table) { table [bigntab [k]]. remove (number); } } } // release the old tables if they are useless now if (a && ((k != len) || (k == tablen))) { delete [] t. n; delete [] t. e; } // use the previous tables and release the big table if beneficial if (a && (k == len) && (k != tablen)) { for (int i = 0; i < len; ++ i) { t. n [i] = bigntab [i]; t. e [i] = bigetab [i]; } delete [] bigntab; delete [] bigetab; return *this; } len = k; // if the new tables don't have to be allocated, only copy the data if (!allocated ()) { for (int i = 0; i < len; ++ i) { x. n [i] = bigntab [i]; x. e [i] = bigetab [i]; } delete [] bigntab; delete [] bigetab; return *this; } // if the big tables cannot be used, allocate new tables if (len != tablen) { t. n = new int [len]; t. e = new euclidom [len]; if (!t. n || !t. e) throw "Cannot shorten a sum of chains."; for (int i = 0; i < len; ++ i) { t. n [i] = bigntab [i]; t. e [i] = bigetab [i]; } delete [] bigntab; delete [] bigetab; } // otherwise, simply use the big tables else { t. n = bigntab; t. e = bigetab; } return *this; } /* chain<euclidom>::add */
bool chomp::homology::chain< euclidom >::allocated | ( | ) | const [inline, private] |
Checks if the tables have been allocated depending on the value of their length.
Only tables longer than some limit are allocated.
Definition at line 235 of file chains.h.
References CHAINFIXED, and chomp::homology::chain< euclidom >::len.
Referenced by chomp::homology::chain< euclidom >::add(), chomp::homology::chain< euclidom >::chain(), chomp::homology::chain< euclidom >::coef(), chomp::homology::chain< euclidom >::contains_non_invertible(), chomp::homology::chain< euclidom >::findbest(), chomp::homology::chain< euclidom >::findnumber(), chomp::homology::chain< euclidom >::getcoefficient(), chomp::homology::chain< euclidom >::multiply(), chomp::homology::chain< euclidom >::num(), chomp::homology::chain< euclidom >::remove(), chomp::homology::chain< euclidom >::removepair(), chomp::homology::chain< euclidom >::show(), chomp::homology::chain< euclidom >::swap(), chomp::homology::chain< euclidom >::swapnumbers(), chomp::homology::chain< euclidom >::take(), and chomp::homology::chain< euclidom >::~chain().
{ if (len <= static_cast<int> (CHAINFIXED)) return false; // return (sizeof (int *) < ((sizeof (int) < sizeof (euclidom)) ? // sizeof (euclidom) : sizeof (int)) * len); else return true; } /* chain<euclidom>::allocated */
euclidom chomp::homology::chain< euclidom >::coef | ( | int | i | ) | const [inline] |
Returns the coefficient in front of the i-th element in the chain.
Definition at line 389 of file chains.h.
References chomp::homology::chain< euclidom >::allocated(), chomp::homology::chain< euclidom >::e, chomp::homology::chain< euclidom >::len, chomp::homology::chain< euclidom >::t, and chomp::homology::chain< euclidom >::x.
bool chomp::homology::chain< euclidom >::contains_non_invertible | ( | ) | const [inline] |
Determines if the chain contains a non-invertible coefficient.
Returns true if yes, false if not.
Definition at line 405 of file chains.h.
References chomp::homology::chain< euclidom >::allocated(), chomp::homology::chain< euclidom >::e, chomp::homology::chain< euclidom >::len, chomp::homology::chain< euclidom >::t, and chomp::homology::chain< euclidom >::x.
bool chomp::homology::chain< euclidom >::empty | ( | ) | const [inline] |
Returns true if the chain is empty (zero), false otherwise.
Definition at line 338 of file chains.h.
References chomp::homology::chain< euclidom >::len.
{ return !len; } /* chain<euclidom>::empty */
int chomp::homology::chain< euclidom >::findbest | ( | chain< euclidom > * | table = NULL |
) | const [inline] |
Finds the best element in the chain for reduction, that is, the element with minimal value of delta.
IF the given table is given, then additionally an element with the shortest chain length in the table is searched for. Returns the actual number of this element in the chain (not its identifier) or -1 if the chain is empty (zero).
Definition at line 427 of file chains.h.
References chomp::homology::chain< euclidom >::allocated(), chomp::homology::chain< euclidom >::e, chomp::homology::chain< euclidom >::len, chomp::homology::chain< euclidom >::n, chomp::homology::chain< euclidom >::size(), chomp::homology::chain< euclidom >::t, and chomp::homology::chain< euclidom >::x.
{ // if the chain is so short that the answer is obvious, return it if (len <= 1) return (len - 1); // find the number which has the smallest delta function value int this_delta, best_delta = -1; int best_i = 0; // go through the whole table bool a = allocated (); const int *tntab = a ? t. n : x. n; const euclidom *tetab = a ? t. e : x. e; int i; for (i = 0; i < len; ++ i) { // compute the value of the function delta this_delta = tetab [i]. delta (); // if the value is the smallest possible // and no further analysis was required, finish here if (!table && (this_delta == 1)) return i; // if this delta is better, remember it if (!i || (this_delta < best_delta)) { best_delta = this_delta; best_i = i; } } // if no further analysis is required, return the result just now if (!table) return best_i; // analyse which element has the shortest corresponding chain int this_length, best_length = table [tntab [best_i]]. size (); for (i = best_i + 1; i < len; ++ i) { if (tetab [i]. delta () == best_delta) { this_length = table [tntab [i]]. size (); if (best_length > this_length) { best_length = this_length; best_i = i; } } } return best_i; } /* chain<euclidom>::findbest */
int chomp::homology::chain< euclidom >::findnumber | ( | int | n | ) | const [inline] |
Find the position of an element with the given identifier.
Returns -1 if not found.
Definition at line 374 of file chains.h.
References chomp::homology::chain< euclidom >::allocated(), chomp::homology::chain< euclidom >::len, chomp::homology::chain< euclidom >::t, and chomp::homology::chain< euclidom >::x.
euclidom chomp::homology::chain< euclidom >::getcoefficient | ( | int | n = -1 |
) | const |
Finds and returns the coefficient in front of the given element.
If the identifier is negative, then returns the first nonzero coefficient or 0 if none.
Definition at line 344 of file chains.h.
References chomp::homology::chain< euclidom >::allocated(), chomp::homology::chain< euclidom >::e, chomp::homology::chain< euclidom >::len, chomp::homology::chain< euclidom >::t, and chomp::homology::chain< euclidom >::x.
{ bool a = allocated (); const euclidom *tetab = a ? t. e : x. e; if (n < 0) { if (len > 0) return tetab [0]; else { euclidom zero; zero = 0; return zero; } } const int *tntab = a ? t. n : x. n; int i = 0; while ((i < len) && (tntab [i] < n)) ++ i; if ((i >= len) || (tntab [i] != n)) { euclidom zero; zero = 0; return zero; } return tetab [i]; } /* chain<euclidom>::getcoefficient */
chain< euclidom > & chomp::homology::chain< euclidom >::insertpair | ( | int | i, | |
int | n, | |||
euclidom | e | |||
) | [inline, private] |
Inserts one chain element at the given position.
Definition at line 488 of file chains.h.
Referenced by chomp::homology::chain< euclidom >::add().
{ // remember if the table was previously allocated or not bool a = allocated (); // increase the length ++ len; // determine if the new table should be allocated or not bool na = allocated (); // if a new table has to be allocated, do it if (na) { // allocate a new table int *newntab = new int [len]; euclidom *newetab = new euclidom [len]; if (!newntab || !newetab) throw "Cannot add an element to a chain."; // determine the addresses of the old tables int *oldntab = a ? t. n : x. n; euclidom *oldetab = a ? t. e : x. e; // copy the old data and insert the new pair int j; for (j = 0; j < i; ++ j) { newntab [j] = oldntab [j]; newetab [j] = oldetab [j]; } newntab [i] = n; newetab [i] = e; for (j = i + 1; j < len; ++ j) { newntab [j] = oldntab [j - 1]; newetab [j] = oldetab [j - 1]; } // release the previous tables if they were allocated if (a) { delete [] t. n; delete [] t. e; } // take the new tables to the data structure t. n = newntab; t. e = newetab; } // otherwise just insert the new element at the appropriate position else // if (!na && !a) { for (int j = len - 1; j > i; -- j) { x. n [j] = x. n [j - 1]; x. e [j] = x. e [j - 1]; } x. n [i] = n; x. e [i] = e; } return *this; } /* chain<euclidom>::insertpair */
chain< euclidom > & chomp::homology::chain< euclidom >::multiply | ( | euclidom | e, | |
int | number = -1 | |||
) | [inline] |
Multiplies one or all the coefficients in the chain by the given number.
Definition at line 1020 of file chains.h.
References chomp::homology::chain< euclidom >::allocated(), chomp::homology::chain< euclidom >::len, chomp::homology::chain< euclidom >::removepair(), chomp::homology::chain< euclidom >::t, and chomp::homology::chain< euclidom >::x.
{ // check if the tables have been allocated or not bool a = allocated (); int *tntab = a ? t. n : x. n; euclidom *tetab = a ? t. e : x. e; // if there is only one element to be multiplied, find it and do it if (number >= 0) { for (int i = 0; i < len; ++ i) { if (tntab [i] == number) { if (e == 0) removepair (i); else { tetab [i] *= e; // if (tetab [i] == 0) // removepair (i); } return *this; } } } // if the entire chain has to be multiplied by a non-zero number... else if (e != 0) { for (int i = 0; i < len; ++ i) { tetab [i] *= e; if (tetab [i] == 0) removepair (i); } } // otherwise, if the chain has to be made zero, clean it else { if (a) { delete [] t. n; delete [] t. e; } len = 0; } return *this; } /* chain<euclidom>::multiply */
int chomp::homology::chain< euclidom >::num | ( | int | i | ) | const [inline] |
Returns the number (identifier) of the i-th element in the chain.
Definition at line 397 of file chains.h.
References chomp::homology::chain< euclidom >::allocated(), chomp::homology::chain< euclidom >::len, chomp::homology::chain< euclidom >::n, chomp::homology::chain< euclidom >::t, and chomp::homology::chain< euclidom >::x.
chain< euclidom > & chomp::homology::chain< euclidom >::operator= | ( | const chain< euclidom > & | c | ) | [inline] |
The assignment operator.
Definition at line 284 of file chains.h.
{ // first release allocated tables if any if (allocated ()) { delete [] t. n; delete [] t. e; } // copy the length of the chain len = c. len; // allocate new tables if necessary and copy the data if (allocated ()) { t. n = new int [len]; t. e = new euclidom [len]; if (!t. n || !t. e) throw "Not enough memory to create a chain copy =."; for (int i = 0; i < len; ++ i) { t. n [i] = c. t. n [i]; t. e [i] = c. t. e [i]; } } else { for (int i = 0; i < len; ++ i) { x. n [i] = c. x. n [i]; x. e [i] = c. x. e [i]; } } return *this; } /* chain<euclidom>::operator = */
chain< euclidom > & chomp::homology::chain< euclidom >::remove | ( | int | n | ) |
Removes an element with the given identifier from the chain.
Definition at line 725 of file chains.h.
References chomp::homology::chain< euclidom >::allocated(), chomp::homology::chain< euclidom >::len, chomp::homology::chain< euclidom >::removepair(), chomp::homology::chain< euclidom >::t, and chomp::homology::chain< euclidom >::x.
chain< euclidom > & chomp::homology::chain< euclidom >::removepair | ( | int | i | ) | [inline, private] |
Removes one chain element at the given position.
Definition at line 555 of file chains.h.
References chomp::homology::chain< euclidom >::allocated(), chomp::homology::chain< euclidom >::len, chomp::homology::chain< euclidom >::t, and chomp::homology::chain< euclidom >::x.
Referenced by chomp::homology::chain< euclidom >::add(), chomp::homology::chain< euclidom >::multiply(), and chomp::homology::chain< euclidom >::remove().
{ // remember if the table was previously allocated or not bool a = allocated (); // decrease the length if (len) -- len; // determine if the new table should be allocated or not bool na = allocated (); // allocate the new tables if necessary if (na) { int *newntab = new int [len]; euclidom *newetab = new euclidom [len]; if (!newntab || !newetab) throw "Cannot remove a pair from a chain."; // copy the data form the previous tables int j; for (j = 0; j < i; ++ j) { newntab [j] = t. n [j]; newetab [j] = t. e [j]; } for (j = i; j < len; ++ j) { newntab [j] = t. n [j + 1]; newetab [j] = t. e [j + 1]; } delete [] t. n; delete [] t. e; t. n = newntab; t. e = newetab; } // otherwise, copy the data from the previous tables else { int *oldntab = a ? t. n : x. n; euclidom *oldetab = a ? t. e : x. e; // copy the data form the previous tables int j; for (j = 0; a && (j < i); ++ j) { x. n [j] = oldntab [j]; x. e [j] = oldetab [j]; } for (j = i; j < len; ++ j) { x. n [j] = oldntab [j + 1]; x. e [j] = oldetab [j + 1]; } // release the old tables if necessary if (a) { delete [] oldntab; delete [] oldetab; } } return *this; } /* chain<euclidom>::removepair */
outputstream & chomp::homology::chain< euclidom >::show | ( | outputstream & | out, | |
const char * | label = NULL | |||
) | const [inline] |
Shows the chain to the output stream.
Uses a given label for indicating identifiers of elements in the chain.
Definition at line 1073 of file chains.h.
References chomp::homology::chain< euclidom >::allocated(), chomp::homology::chain< euclidom >::len, chomp::homology::chain< euclidom >::t, and chomp::homology::chain< euclidom >::x.
Referenced by chomp::homology::chain< euclidom >::show().
{ if (len <= 0) out << "0"; bool a = allocated (); const int *tntab = a ? t. n : x. n; const euclidom *tetab = a ? t. e : x. e; for (int i = 0; i < len; ++ i) { euclidom e = tetab [i]; int n = tntab [i] + 1; if (e == 1) out << (i ? " + " : "") << (label ? label : "") << n; else if (-e == 1) out << (i ? " - " : "-") << (label ? label : "") << n; else out << (i ? " + " : "") << e << " * " << (label ? label : "") << n; } return out; } /* chain<euclidom>::show */
std::ostream & chomp::homology::chain< euclidom >::show | ( | std::ostream & | out, | |
const char * | label = NULL | |||
) | const [inline] |
Shows the chain to the standard output stream.
Uses a given label for indicating identifiers of elements in the chain.
Definition at line 1100 of file chains.h.
References chomp::homology::chain< euclidom >::show().
{ outputstream tout (out); show (tout, label); return out; } /* chain<euclidom>::show */
int chomp::homology::chain< euclidom >::size | ( | ) | const [inline] |
Returns the size of the chain, that is, the number of elements with non-zero coefficients.
Definition at line 332 of file chains.h.
References chomp::homology::chain< euclidom >::len.
Referenced by chomp::homology::chain< euclidom >::findbest().
{ return len; } /* chain<euclidom>::size */
chain< euclidom > & chomp::homology::chain< euclidom >::swap | ( | chain< euclidom > & | other, | |
int | number = -1 , |
|||
int | othernumber = -1 , |
|||
chain< euclidom > * | table = NULL | |||
) | [inline] |
Swaps one chain with another.
If the chain is a row of a matrix, then its number, the number of the other row and the table of columns must be given for proper modification; if this is a column, its number and columns must be given
Definition at line 885 of file chains.h.
References chomp::homology::chain< euclidom >::allocated(), chomp::homology::chain< euclidom >::len, chomp::homology::swapelements(), chomp::homology::chain< euclidom >::swapnumbers(), chomp::homology::chain< euclidom >::t, and chomp::homology::chain< euclidom >::x.
{ // check which chains where allocated bool a = allocated (); bool oa = other. allocated (); // swap the data of the chains if (a && oa) { swapelements (t. n, other. t. n); swapelements (t. e, other. t. e); } else if (!a && !oa) { // common variable for interations (required by MSVC++) int i; // swap the data in the common area of both chains for (i = 0; (i < len) && (i < other. len); ++ i) { swapelements (x. n [i], other. x. n [i]); swapelements (x. e [i], other. x. e [i]); } // copy the remaining portion of the data for (i = len; i < other. len; ++ i) { x. n [i] = other. x. n [i]; x. e [i] = other. x. e [i]; } for (i = other. len; i < len; ++ i) { other. x. n [i] = x. n [i]; other. x. e [i] = x. e [i]; } } else if (a) // && !oa { int *tempn = t. n; euclidom *tempe = t. e; for (int i = 0; i < other. len; ++ i) { x. n [i] = other. x. n [i]; x. e [i] = other. x. e [i]; } other. t. n = tempn; other. t. e = tempe; } else // if (oa) // && !a { int *tempn = other. t. n; euclidom *tempe = other. t. e; for (int i = 0; i < len; ++ i) { other. x. n [i] = x. n [i]; other. x. e [i] = x. e [i]; } t. n = tempn; t. e = tempe; } // swap the lengths of the chains (do not swap 'a' with 'oa') swapelements (len, other. len); if (!table) return *this; // change the numbers in every relevant entry of the table int *tntab = oa ? t. n : x. n; int *ontab = a ? other. t. n : other. x. n; int i = 0, j = 0; while ((i < len) || (j < other. len)) { // determine which table entry should be modified int n; if (i >= len) n = ontab [j ++]; else if (j >= other. len) n = tntab [i ++]; else if (tntab [i] < ontab [j]) n = tntab [i ++]; else if (ontab [j] < tntab [i]) n = ontab [j ++]; else { n = tntab [i ++]; ++ j; // ++ i; // ++ j; // continue; } // swap numbers in that table entry table [n]. swapnumbers (othernumber, number); } return *this; } /* chain<euclidom>::swap */
chain< euclidom > & chomp::homology::chain< euclidom >::swapnumbers | ( | int | number1, | |
int | number2 | |||
) | [inline, private] |
Swaps two numbers (identifiers) in the chain.
Definition at line 624 of file chains.h.
References chomp::homology::chain< euclidom >::allocated(), chomp::homology::chain< euclidom >::len, chomp::homology::swapelements(), chomp::homology::chain< euclidom >::t, and chomp::homology::chain< euclidom >::x.
Referenced by chomp::homology::chain< euclidom >::swap().
{ // if the numbers are the same, do nothing if (number1 == number2) return *this; // force the first number be less than the second number if (number1 > number2) { int tempnumber = number1; number1 = number2; number2 = tempnumber; } // determine the true tables to be processed bool a = allocated (); int *tntab = a ? t. n : x. n; euclidom *tetab = a ? t. e : x. e; // find both numbers or the positions they should be at int i1 = 0, i2 = 0; while ((i1 < len) && (tntab [i1] < number1)) ++ i1; while ((i2 < len) && (tntab [i2] < number2)) ++ i2; // if the first number was found... if ((i1 < len) && (tntab [i1] == number1)) { // if both numbers were found, exchange their coefficients if ((i2 < len) && (tntab [i2] == number2)) swapelements (tetab [i1], tetab [i2]); // if only the first was found, move it to the new position else { euclidom temp = tetab [i1]; for (int i = i1 + 1; i < i2; ++ i) { tntab [i - 1] = tntab [i]; tetab [i - 1] = tetab [i]; } tntab [i2 - 1] = number2; tetab [i2 - 1] = temp; } } // otherwise if the second number only was found, move it to its pos. else if ((i2 < len) && (tntab [i2] == number2)) { euclidom temp = tetab [i2]; for (int i = i2; i > i1; -- i) { tntab [i] = tntab [i - 1]; tetab [i] = tetab [i - 1]; } tntab [i1] = number1; tetab [i1] = temp; } return *this; } /* chain<euclidom>::swapnumbers */
chain< euclidom > & chomp::homology::chain< euclidom >::take | ( | chain< euclidom > & | c | ) | [inline] |
Takes data from another chain. Destroys the other chain.
Definition at line 986 of file chains.h.
References chomp::homology::chain< euclidom >::allocated(), chomp::homology::chain< euclidom >::len, chomp::homology::chain< euclidom >::t, and chomp::homology::chain< euclidom >::x.
{ // release the current tables if they were allocated if (allocated ()) { delete [] t. n; delete [] t. e; } // if the other tables were allocated, take them if (c. allocated ()) { t. n = c. t. n; t. e = c. t. e; } // otherwise copy the data from the internal other tables else { for (int i = 0; i < c. len; ++ i) { x. n [i] = c. x. n [i]; x. e [i] = c. x. e [i]; } } // copy the length and reset the other length len = c. len; c. len = 0; return *this; } /* chain<euclidom>::take */
union { ... } [private] |
Elements of the list sorted according to the identifier.
If there are very few of them, they are kept in the space normally reserved for the addresses. Otherwise, an array is allocated in the memory.
euclidom* chomp::homology::chain< euclidom >::e |
Definition at line 202 of file chains.h.
Referenced by chomp::homology::chain< euclidom >::chain(), chomp::homology::chain< euclidom >::coef(), chomp::homology::chain< euclidom >::contains_non_invertible(), chomp::homology::chain< euclidom >::findbest(), chomp::homology::chain< euclidom >::getcoefficient(), and chomp::homology::chain< euclidom >::~chain().
int chomp::homology::chain< euclidom >::len [private] |
The length of the list and the length of the table.
Definition at line 191 of file chains.h.
Referenced by chomp::homology::chain< euclidom >::add(), chomp::homology::chain< euclidom >::allocated(), chomp::homology::chain< euclidom >::chain(), chomp::homology::chain< euclidom >::coef(), chomp::homology::chain< euclidom >::contains_non_invertible(), chomp::homology::chain< euclidom >::empty(), chomp::homology::chain< euclidom >::findbest(), chomp::homology::chain< euclidom >::findnumber(), chomp::homology::chain< euclidom >::getcoefficient(), chomp::homology::chain< euclidom >::multiply(), chomp::homology::chain< euclidom >::num(), chomp::homology::chain< euclidom >::remove(), chomp::homology::chain< euclidom >::removepair(), chomp::homology::chain< euclidom >::show(), chomp::homology::chain< euclidom >::size(), chomp::homology::chain< euclidom >::swap(), chomp::homology::chain< euclidom >::swapnumbers(), and chomp::homology::chain< euclidom >::take().
int* chomp::homology::chain< euclidom >::n |
Definition at line 201 of file chains.h.
Referenced by chomp::homology::chain< euclidom >::chain(), chomp::homology::chain< euclidom >::findbest(), chomp::homology::chain< euclidom >::num(), and chomp::homology::chain< euclidom >::~chain().
struct { ... } chomp::homology::chain< euclidom >::t |
Referenced by chomp::homology::chain< euclidom >::add(), chomp::homology::chain< euclidom >::chain(), chomp::homology::chain< euclidom >::coef(), chomp::homology::chain< euclidom >::contains_non_invertible(), chomp::homology::chain< euclidom >::findbest(), chomp::homology::chain< euclidom >::findnumber(), chomp::homology::chain< euclidom >::getcoefficient(), chomp::homology::chain< euclidom >::multiply(), chomp::homology::chain< euclidom >::num(), chomp::homology::chain< euclidom >::remove(), chomp::homology::chain< euclidom >::removepair(), chomp::homology::chain< euclidom >::show(), chomp::homology::chain< euclidom >::swap(), chomp::homology::chain< euclidom >::swapnumbers(), chomp::homology::chain< euclidom >::take(), and chomp::homology::chain< euclidom >::~chain().
struct { ... } chomp::homology::chain< euclidom >::x |
Referenced by chomp::homology::chain< euclidom >::add(), chomp::homology::chain< euclidom >::chain(), chomp::homology::chain< euclidom >::coef(), chomp::homology::chain< euclidom >::contains_non_invertible(), chomp::homology::chain< euclidom >::findbest(), chomp::homology::chain< euclidom >::findnumber(), chomp::homology::chain< euclidom >::getcoefficient(), chomp::homology::chain< euclidom >::multiply(), chomp::homology::chain< euclidom >::num(), chomp::homology::chain< euclidom >::remove(), chomp::homology::chain< euclidom >::removepair(), chomp::homology::chain< euclidom >::show(), chomp::homology::chain< euclidom >::swap(), chomp::homology::chain< euclidom >::swapnumbers(), and chomp::homology::chain< euclidom >::take().