29 unsigned int row,
const vector< double >& v
32 assert( nColumns() == 0 || row < nRows() );
33 assert( v.size() == nColumns() );
35 const unsigned int* colIndex = 0;
36 unsigned int numEntries = getRow( row, &entry, &colIndex );
40 for (
const int* i = entry; i != end; ++i ) {
41 ret += *i * v[ *colIndex++ ];
62 assert ( !( std::isnan( ret ) ) );
74 unsigned int row, vector< unsigned int >& deps
79 for (
unsigned int i = 0; i < nrows_; ++i ) {
81 unsigned int j = rowStart_[ row ];
82 unsigned int jend = rowStart_[ row + 1 ];
83 unsigned int k = rowStart_[ i ];
84 unsigned int kend = rowStart_[ i + 1 ];
86 while ( j < jend && k < kend ) {
87 if ( colIndex_[ j ] == colIndex_[ k ] ) {
93 assert( round( N_[k] ) != 0 );
97 }
else if ( colIndex_[ j ] < colIndex_[ k ] ) {
99 }
else if ( colIndex_[ j ] > colIndex_[ k ] ) {
116 assert( ncolumns_ == S.size() && reacIndex < nrows_ );
117 unsigned int rowBeginIndex = rowStart_[ reacIndex ];
119 vector< int >::const_iterator rowBegin =
120 N_.begin() + rowBeginIndex;
121 vector< int >::const_iterator rowEnd =
122 N_.begin() + rowTruncated_[ reacIndex ];
123 vector< unsigned int >::const_iterator molIndex =
124 colIndex_.begin() + rowBeginIndex;
126 for ( vector< int >::const_iterator i = rowBegin; i != rowEnd; ++i ) {
127 double& x = S[ *molIndex++ ];
143 rowTruncated_.resize( nrows_, 0 );
144 if ( colIndex_.size() == 0 )
146 for (
unsigned int i = 0; i < nrows_; ++i ) {
147 unsigned int endCol = rowStart_[ i ];
148 for (
unsigned int j = rowStart_[ i ];
149 j < rowStart_[ i + 1 ]; ++j ) {
150 if ( colIndex_[ j ] < maxColumnIndex ) {
156 rowTruncated_[ i ] = endCol;
163 vector< unsigned int >::iterator pos = unique( v.begin(), v.end() );
164 v.resize( pos - v.begin() );
171 void testKinSparseMatrix()
183 static int transposon[][ 8 ] = {
184 { -1, 1, 0, 0, -1, 1, -1, 1 },
185 { -1, 1, 0, 0, 0, 0, 0, 0 },
186 { 1, -1, -1, 1, 0, 0, 0, 0 },
187 { 0, 0, -1, 1, 0, 0, 0, 0 },
188 { 0, 0, 1, -1, 0, 0, -1, 1 },
189 { 0, 0, 0, 0, -1, 1, 0, 0 },
190 { 0, 0, 0, 0, 1, -1, 2, -2 }
193 cout <<
"\nTesting KinSparseMatrix" << flush;
194 const unsigned int NR = 4;
195 const unsigned int NC = 5;
197 const unsigned int NTR = 7;
198 const unsigned int NTC = 8;
203 for (
unsigned int i = 0; i < NR; i++ ) {
204 for (
unsigned int j = 0; j < NC; j++ ) {
205 sm.
set( i, j, 10 * i + j );
207 int ret = sm.
get( i, j );
208 assert( ret == static_cast< int >( 10 * i + j ) );
213 vector< double > v( 5, 1.0 );
215 assert( fabs( dret - 10.0 ) < EPSILON );
217 assert( fabs( dret - 60.0 ) < EPSILON );
219 assert( fabs( dret - 110.0 ) < EPSILON );
221 assert( fabs( dret - 160.0 ) < EPSILON );
228 for (
unsigned int i = 0; i < NTR; i++ )
229 for (
unsigned int j = 0; j < NTC; j++ )
230 orig.
set( i, j, transposon[ i ][ j ] );
232 for (
unsigned int i = 0; i < NTR; i++ )
233 for (
unsigned int j = 0; j < NTC; j++ )
234 assert( orig.
get( i, j ) == transposon[ i ][ j ] );
237 for (
unsigned int i = 0; i < NTR; i++ )
238 for (
unsigned int j = 0; j < NTC; j++ )
239 assert( orig.
get( j, i ) == transposon[ i ][ j ] );
247 vector< unsigned int > deps;
T get(unsigned int row, unsigned int column) const
void set(unsigned int row, unsigned int column, T value)
void makeVecUnique(vector< unsigned int > &v)
void fireReac(unsigned int reacIndex, vector< double > &S, double direction) const
void getGillespieDependence(unsigned int row, vector< unsigned int > &cols) const
double computeRowRate(unsigned int row, const vector< double > &v) const
void setSize(unsigned int nrows, unsigned int ncolumns)
void truncateRow(unsigned int maxColumnIndex)