MOOSE - Multiscale Object Oriented Simulation Environment
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
SparseMsg.cpp
Go to the documentation of this file.
1 /**********************************************************************
2 ** This program is part of 'MOOSE', the
3 ** Messaging Object Oriented Simulation Environment.
4 ** Copyright (C) 2003-2009 Upinder S. Bhalla. and NCBS
5 ** It is made available under the terms of the
6 ** GNU Lesser General Public License version 2.1
7 ** See the file COPYING.LIB for the full notice.
8 **********************************************************************/
9 
10 #include "../basecode/header.h"
11 #include "../basecode/global.h"
12 #include "../shell/Shell.h"
13 #include "../basecode/SparseMatrix.h"
14 #include "SparseMsg.h"
15 
16 // Initializing static variables
18 vector< SparseMsg* > SparseMsg::msg_;
19 
21 // MOOSE wrapper functions for field access.
23 
25 {
27  // Field definitions.
30  "numRows",
31  "Number of rows in matrix.",
33  );
35  "numColumns",
36  "Number of columns in matrix.",
38  );
40  "numEntries",
41  "Number of Entries in matrix.",
43  );
44 
45  static ValueFinfo< SparseMsg, vector< unsigned int > > connectionList(
46  "connectionList",
47  "Pairwise specification of connection matrix where each x,y value "
48  "represents a connection from src[x] to dest[y]. "
49  "The (x,y) entries are ordered in a single vector as \n"
50  "(x0, x1,... x_n-1, y0, y1,... y_n-1)\n",
53  );
54 
57  matrixEntry(
58  "matrixEntry",
59  "The non-zero matrix entries in the sparse matrix. Their"
60  "column indices are in a separate vector and the row"
61  "informatino in a third",
63  );
66  columnIndex(
67  "columnIndex",
68  "Column Index of each matrix entry",
70  );
73  rowStart(
74  "rowStart",
75  "Row start for each block of entries and column indices",
77  );
78 
79  static ValueFinfo< SparseMsg, double > probability(
80  "probability",
81  "connection probability for random connectivity.",
84  );
85 
87  "seed",
88  "Random number seed for generating probabilistic connectivity.",
91  );
92 
94 // DestFinfos
96 
97  static DestFinfo setRandomConnectivity( "setRandomConnectivity",
98  "Assigns connectivity with specified probability and seed",
101 
102  static DestFinfo setEntry( "setEntry",
103  "Assigns single row,column value",
105  &SparseMsg::setEntry ) );
106 
107  static DestFinfo unsetEntry( "unsetEntry",
108  "Clears single row,column entry",
111 
112  static DestFinfo clear( "clear",
113  "Clears out the entire matrix",
115  &SparseMsg::clear ) );
116 
117  static DestFinfo transpose( "transpose",
118  "Transposes the sparse matrix",
121 
122  static DestFinfo pairFill( "pairFill",
123  "Fills entire matrix using pairs of (x,y) indices to indicate "
124  "presence of a connection. If the target is a FieldElement it"
125  "automagically assigns FieldIndices.",
126  new OpFunc2< SparseMsg,
127  vector< unsigned int >, vector< unsigned int> >(
128  &SparseMsg::pairFill ) );
129 
130  static DestFinfo tripletFill( "tripletFill",
131  "Fills entire matrix using triplets of (x,y,fieldIndex) to fully "
132  "specify every connection in the sparse matrix.",
133  new OpFunc3< SparseMsg,
134  vector< unsigned int >, vector< unsigned int>,
135  vector< unsigned int > >(
137 
138  static DestFinfo tripletFill1( "tripletFill1",
139  "Single contiguous array to fill entire connection matrix using "
140  "triplets of (x,y, fieldindex) ordered as \n"
141  "(x0, x1,... xn-1, y0, y1,... yn-1, fi0, fi1,... fi_n-1)\n",
142  new OpFunc1< SparseMsg, vector< unsigned int > >(
144 
146 // Assemble it all.
148 
149  static Finfo* sparseMsgFinfos[] =
150  {
151  &numRows, // readonly value
152  &numColumns, // readonly value
153  &numEntries, // readonly value
154  &connectionList, // value
155  &matrixEntry, // ReadOnlyValue
156  &columnIndex, // ReadOnlyValue
157  &rowStart, // ReadOnlyValue
158  &probability, // value
159  &seed, // value
160  &setRandomConnectivity, // dest
161  &setEntry, // dest
162  &unsetEntry, //dest
163  &clear, //dest
164  &transpose, //dest
165  &pairFill, //dest
166  &tripletFill, //dest
167  &tripletFill1, //dest
168  };
169 
170  static Dinfo< short > dinfo;
171  static Cinfo sparseMsgCinfo (
172  "SparseMsg", // name
173  Msg::initCinfo(), // base class
174  sparseMsgFinfos,
175  sizeof( sparseMsgFinfos ) / sizeof( Finfo* ), // num Fields
176  &dinfo
177  );
178 
179  return &sparseMsgCinfo;
180 }
181 
183 
185 // Value Fields
187 void SparseMsg::setProbability ( double probability )
188 {
189  p_ = probability;
190  randomConnect( probability );
191 }
192 
194 {
195  return p_;
196 }
197 
198 void SparseMsg::setSeed ( unsigned long seed )
199 {
200  if( seed > 0 )
201  seed_ = seed;
202  else
203  seed_ = rd_();
204 
205  rng_.seed( seed_ );
206  randomConnect( p_ );
207 }
208 
209 unsigned long SparseMsg::getSeed () const
210 {
211  return seed_;
212 }
213 
214 unsigned int SparseMsg::getNumRows() const
215 {
216  return matrix_.nRows();
217 }
218 
219 unsigned int SparseMsg::getNumColumns() const
220 {
221  return matrix_.nColumns();
222 }
223 
224 unsigned int SparseMsg::getNumEntries() const
225 {
226  return matrix_.nEntries();
227 }
228 
229 vector< unsigned int > SparseMsg::getMatrixEntry() const
230 {
231  return matrix_.matrixEntry();
232 }
233 
234 vector< unsigned int > SparseMsg::getColIndex() const
235 {
236  return matrix_.colIndex();
237 }
238 
239 vector< unsigned int > SparseMsg::getRowStart() const
240 {
241  return matrix_.rowStart();
242 }
243 
244 void SparseMsg::setEntryPairs( vector< unsigned int > v )
245 {
246  vector< unsigned int > src( v.begin(), v.begin() + v.size()/2 );
247  vector< unsigned int > dest( v.begin() + v.size()/2, v.end() );
248  pairFill( src, dest );
249 }
250 
251 vector< unsigned int > SparseMsg::getEntryPairs() const
252 {
253  vector< unsigned int > cols = matrix_.colIndex();
254  vector< unsigned int > y;
255  for ( unsigned int row = 0; row < matrix_.nRows(); ++row )
256  {
257  unsigned int begin = matrix_.rowStart()[row];
258  unsigned int end = matrix_.rowStart()[row+1];
259  for ( unsigned int j = begin; j < end; ++j )
260  y.push_back( row );
261  }
262  assert( cols.size() == y.size() );
263  y.insert( y.end(), cols.begin(), cols.end() );
264  return y;
265 }
266 
268 // DestFields
270 
271 void SparseMsg::setRandomConnectivity( double probability, long seed )
272 {
273  p_ = probability;
274  rng_.seed( seed );
275  randomConnect( probability );
276 }
277 
279  unsigned int row, unsigned int column, unsigned int value )
280 {
281  matrix_.set( row, column, value );
282 }
283 
284 void SparseMsg::unsetEntry( unsigned int row, unsigned int column )
285 {
286  matrix_.unset( row, column );
287 }
288 
290 {
291  matrix_.clear();
292 }
293 
295 {
296  matrix_.transpose();
297  e1()->markRewired();
298  e2()->markRewired();
299 }
300 
302 {
303  unsigned int startData = e2_->localDataStart();
304  unsigned int endData = startData + e2_->numLocalData();
306  temp.transpose();
307  for ( unsigned int i = 0; i < temp.nRows(); ++ i )
308  {
309  const unsigned int* colIndex;
310  const unsigned int* entry;
311  unsigned int num = temp.getRow( i, &entry, &colIndex );
312  if ( i >= startData && i < endData )
313  {
314  // Inefficient. Better to do it in one pass after getting
315  // the max num
316  e2_->resizeField( i - startData, num + 1 );
317  }
318  }
319  e1()->markRewired();
320  e2()->markRewired();
321 }
322 
323 void SparseMsg::pairFill( vector< unsigned int > src,
324  vector< unsigned int> dest )
325 {
326  // Sanity check
327  vector< unsigned int >::const_iterator i;
328  for ( i = src.begin(); i != src.end(); ++i )
329  {
330  if (*i >= e1()->numData() )
331  {
332  cout << "Warning: SparseMsg::pairFill: Src index " << *i <<
333  " exceeds Src array size " << e1()->numData() <<
334  ". Aborting\n";
335  return;
336  }
337  }
338  for ( i = dest.begin(); i != dest.end(); ++i )
339  {
340  if (*i >= e2()->numData() )
341  {
342  cout << "Warning: SparseMsg::pairFill: Dest index " << *i <<
343  " exceeds Dest array size " << e2()->numData() <<
344  ". Aborting\n";
345  return;
346  }
347  }
348 
349  vector< unsigned int > numAtDest( dest.size(), 0 );
350  vector< unsigned int > fieldIndex( dest.size(), 0 );
351  for ( unsigned int i = 0; i < dest.size(); ++i )
352  {
353  fieldIndex[i] = numAtDest[ dest[i] ];
354  // Could do on previous line, but clarity
355  ++numAtDest[ dest[i] ];
356  }
357 
362  matrix_.tripletFill( src, dest, fieldIndex, true );
363  updateAfterFill();
364 }
365 
366 void SparseMsg::tripletFill( vector< unsigned int > src,
367  vector< unsigned int> destDataIndex,
368  vector< unsigned int> destFieldIndex )
369 {
370  // We set retainSize flag to true
371  matrix_.tripletFill( src, destDataIndex, destFieldIndex, true );
372  updateAfterFill();
373 }
374 
375 void SparseMsg::tripletFill1( vector< unsigned int > v )
376 {
377  unsigned int s3 = v.size() / 3;
378  vector< unsigned int > src( v.begin(), v.begin() + s3 );
379  vector< unsigned int > dest( v.begin() + s3, v.begin() + 2 * s3 );
380  vector< unsigned int > fieldIndex( v.begin() + 2 * s3, v.end() );
381  tripletFill( src, dest, fieldIndex );
382 }
383 
385 // Here are the actual class functions
387 
388 
389 SparseMsg::SparseMsg( Element* e1, Element* e2, unsigned int msgIndex )
390  : Msg( ObjId( managerId_, (msgIndex != 0) ? msgIndex: msg_.size() ),
391  e1, e2 ),
392  numThreads_( 1 ),
393  nrows_( 0 ),
394  p_( 0.0 ), seed_( 0 )
395 {
396  unsigned int nrows = 0;
397  unsigned int ncolumns = 0;
398  nrows = e1->numData();
399  ncolumns = e2->numData();
400  matrix_.setSize( nrows, ncolumns );
401  if ( msgIndex == 0 )
402  {
403  msg_.push_back( this );
404  }
405  else
406  {
407  if ( msg_.size() <= msgIndex )
408  msg_.resize( msgIndex + 1 );
409  msg_[ msgIndex ] = this;
410  }
411 
412  // cout << Shell::myNode() << ": SparseMsg constructor between " << e1->getName() << " and " << e2->getName() << endl;
413 
414  // Init rng with random device.
415  if( seed_ == 0 )
416  rng_.seed( rd_() );
417 }
418 
420 {
421  assert( mid_.dataIndex < msg_.size() );
422  msg_[ mid_.dataIndex ] = 0; // ensure deleted ptr isn't reused.
423 }
424 
425 unsigned int rowIndex( const Element* e, const DataId& d )
426 {
427  // FieldDataHandlerBase* fdh = dynamic_cast< FieldDataHandlerBase* >( e->dataHandler() );
428 
429  return d;
430 }
431 
432 
433 Eref SparseMsg::firstTgt( const Eref& src ) const
434 {
435  if ( matrix_.nEntries() == 0 )
436  return Eref( 0, 0 );
437 
438  if ( src.element() == e1_ )
439  {
440  const unsigned int* fieldIndex;
441  const unsigned int* colIndex;
442  unsigned int n = matrix_.getRow( src.dataIndex(),
443  &fieldIndex, &colIndex );
444  if ( n != 0 )
445  {
446  return Eref( e2_, colIndex[0], fieldIndex[0] );
447  }
448  }
449  else if ( src.element() == e2_ )
450  {
451  return Eref( e1_, 0 );
452  }
453  return Eref( 0, 0 );
454 }
455 
465 unsigned int SparseMsg::randomConnect( double probability )
466 {
467  unsigned int nRows = matrix_.nRows(); // Sources
468  unsigned int nCols = matrix_.nColumns(); // Destinations
469  matrix_.clear();
470  unsigned int totalSynapses = 0;
471  vector< unsigned int > sizes( nCols, 0 );
472  unsigned int totSynNum = 0;
473  Element* syn = e2_;
474  unsigned int startData = syn->localDataStart();
475  unsigned int endData = startData + syn->numLocalData();
476 
477  assert( nCols == syn->numData() );
478 
479  matrix_.transpose();
480  for ( unsigned int i = 0; i < nCols; ++i )
481  {
482  vector< unsigned int > synIndex;
483  // This needs to be obtained from current size of syn array.
484  // unsigned int synNum = sizes[ i ];
485  unsigned int synNum = 0;
486  for ( unsigned int j = 0; j < nRows; ++j )
487  {
488  double r = dist_( rng_ ); // Want to ensure it is called each time round the loop.
489  if ( r < probability )
490  {
491  synIndex.push_back( synNum );
492  ++synNum;
493  ++totSynNum;
494  }
495  else
496  {
497  synIndex.push_back( ~0 );
498  }
499  }
500 
501  if ( i >= startData && i < endData )
502  {
503  e2_->resizeField( i - startData, synNum );
504  }
505  totalSynapses += synNum;
506  matrix_.addRow( i, synIndex );
507  /*
508  * This is the correct form, but I need to implement something
509  * to check up for target nodes in order to use this.
510  if ( i >= startData && i < endData ) {
511  e2_->resizeField( i - startData, synNum );
512  totalSynapses += synNum;
513  matrix_.addRow( i, synIndex );
514  } else {
515  synIndex.resize( 0 );
516  synIndex.assign( nRows, ~0 );
517  matrix_.addRow( i, synIndex );
518  }
519  */
520  }
521 
522  matrix_.transpose();
523  // cout << Shell::myNode() << ": sizes.size() = " << sizes.size() << ", ncols = " << nCols << ", startSynapse = " << startSynapse << endl;
524  e1()->markRewired();
525  e2()->markRewired();
526  return totalSynapses;
527 }
528 
530 {
531  return SparseMsg::managerId_;
532 }
533 
535 {
536  matrix_ = m;
537 }
538 
540 {
541  return matrix_;
542 }
543 
545 {
546  if ( f.element() == e1() )
547  {
548  const unsigned int* entry;
549  const unsigned int* colIndex;
550  unsigned int num = matrix_.getRow( f.dataIndex, &entry, &colIndex );
551  if ( num > 0 ) // Return the first matching entry.
552  {
553  return ObjId( e2()->id(), colIndex[0] );
554  }
555  return ObjId( 0, BADINDEX );
556  }
557  else if ( f.element() == e2() ) // Bad! Slow! Avoid!
558  {
559  vector< unsigned int > entry;
560  vector< unsigned int > rowIndex;
561  unsigned int num = matrix_.getColumn( f.dataIndex, entry, rowIndex );
562  if ( num > 0 ) // Return the first matching entry.
563  {
564  return ObjId( e1()->id(), DataId( rowIndex[0] ) );
565  }
566  }
567  return ObjId( 0, BADINDEX );
568 }
569 
570 Msg* SparseMsg::copy( Id origSrc, Id newSrc, Id newTgt,
571  FuncId fid, unsigned int b, unsigned int n ) const
572 {
573  const Element* orig = origSrc.element();
574  if ( n <= 1 )
575  {
576  SparseMsg* ret = 0;
577  if ( orig == e1() )
578  {
579  ret = new SparseMsg( newSrc.element(), newTgt.element(), 0 );
580  ret->e1()->addMsgAndFunc( ret->mid(), fid, b );
581  }
582  else if ( orig == e2() )
583  {
584  ret = new SparseMsg( newTgt.element(), newSrc.element(), 0 );
585  ret->e2()->addMsgAndFunc( ret->mid(), fid, b );
586  }
587  else
588  {
589  assert( 0 );
590  }
591  ret->setMatrix( matrix_ );
592  ret->nrows_ = nrows_;
593  return ret;
594  }
595  else
596  {
597  // Here we need a SliceMsg which goes from one 2-d array to another.
598  cout << "Error: SparseMsg::copy: SparseSliceMsg not yet implemented\n";
599  return 0;
600  }
601 }
602 
604  const SparseMatrix< unsigned int >& matrix,
605  vector< vector < Eref > >& v, Element* e1, Element* e2 )
606 {
607  v.clear();
608  v.resize( e1->numData() );
609  assert( e1->numData() == matrix.nRows() );
610  assert( e2->numData() == matrix.nColumns() );
611  for ( unsigned int i = 0; i < e1->numData(); ++i )
612  {
613  const unsigned int* entry;
614  const unsigned int* colIndex;
615  unsigned int num = matrix.getRow( i, &entry, &colIndex );
616  v[i].resize( num );
617  for ( unsigned int j = 0; j < num; ++j )
618  {
619  v[i][j] = Eref( e2, colIndex[j], entry[j] );
620  }
621  }
622 }
623 
624 void SparseMsg::sources( vector< vector < Eref > >& v ) const
625 {
627  temp.transpose();
628  fillErefsFromMatrix( temp, v, e2_, e1_ );
629 }
630 
631 void SparseMsg::targets( vector< vector< Eref > >& v ) const
632 {
634 }
635 
637 unsigned int SparseMsg::numMsg()
638 {
639  return msg_.size();
640 }
641 
643 char* SparseMsg::lookupMsg( unsigned int index )
644 {
645  assert( index < msg_.size() );
646  return reinterpret_cast< char* >( msg_[index] );
647 }
void markRewired()
Definition: Element.cpp:706
unsigned int nEntries() const
Definition: SparseMatrix.h:97
Element * e2() const
Definition: Msg.h:68
unsigned int randomConnect(double probability)
Definition: SparseMsg.cpp:465
void tripletFill(const vector< unsigned int > &row, const vector< unsigned int > &col, const vector< T > &z, bool retainSize=false)
Definition: SparseMatrix.h:583
ObjId mid() const
Definition: Msg.h:106
uint32_t value
Definition: moosemodule.h:42
const vector< T > & matrixEntry() const
Here we expose the sparse matrix for MOOSE use.
Definition: SparseMatrix.h:427
unsigned int nColumns() const
Definition: SparseMatrix.h:92
vector< unsigned int > getEntryPairs() const
Definition: SparseMsg.cpp:251
static const Cinfo * sparseMsgCinfo
Definition: SparseMsg.cpp:182
double p_
Definition: SparseMsg.h:147
Element * element() const
Synonym for Id::operator()()
Definition: Id.cpp:113
void set(unsigned int row, unsigned int column, T value)
Definition: SparseMatrix.h:161
Definition: Dinfo.h:60
Definition: OpFunc.h:56
unsigned int getRow(unsigned int row, const T **entry, const unsigned int **colIndex) const
Definition: SparseMatrix.h:288
moose::MOOSE_RNG_DEFAULT_ENGINE rng_
Definition: SparseMsg.h:154
unsigned int nrows_
Definition: SparseMsg.h:146
void clear()
Definition: SparseMsg.cpp:289
unsigned int dataIndex() const
Definition: Eref.h:50
void setEntryPairs(vector< unsigned int > entries)
Definition: SparseMsg.cpp:244
void fillErefsFromMatrix(const SparseMatrix< unsigned int > &matrix, vector< vector< Eref > > &v, Element *e1, Element *e2)
Definition: SparseMsg.cpp:603
unsigned int nRows() const
Definition: SparseMatrix.h:87
void addMsgAndFunc(ObjId mid, FuncId fid, BindIndex bindIndex)
Definition: Element.cpp:128
Definition: ObjId.h:20
const int numEntries
Definition: proc.cpp:60
void transpose()
Definition: SparseMatrix.h:456
Element * element() const
Definition: Eref.h:42
void tripletFill(vector< unsigned int > src, vector< unsigned int > dest, vector< unsigned int > field)
Definition: SparseMsg.cpp:366
unsigned int getNumColumns() const
Definition: SparseMsg.cpp:219
SparseMatrix< unsigned int > matrix_
Definition: SparseMsg.h:144
vector< unsigned int > getColIndex() const
Definition: SparseMsg.cpp:234
void setRandomConnectivity(double probability, long seed)
Definition: SparseMsg.cpp:271
Definition: OpFunc.h:40
unsigned int getNumRows() const
Definition: SparseMsg.cpp:214
void setProbability(double value)
Definition: SparseMsg.cpp:187
unsigned long seed_
Definition: SparseMsg.h:152
vector< unsigned int > getMatrixEntry() const
Definition: SparseMsg.cpp:229
void tripletFill1(vector< unsigned int > entries)
Definition: SparseMsg.cpp:375
Id managerId() const
Definition: SparseMsg.cpp:529
unsigned int rowIndex(const Element *e, const DataId &d)
Definition: SparseMsg.cpp:425
void addRow(unsigned int rowNum, const vector< T > &row)
Definition: SparseMatrix.h:387
static char * lookupMsg(unsigned int index)
Static function for Msg access.
Definition: SparseMsg.cpp:643
const vector< unsigned int > & colIndex() const
Definition: SparseMatrix.h:431
moose::MOOSE_UNIFORM_DISTRIBUTION< double > dist_
Definition: SparseMsg.h:155
Definition: OpFunc.h:27
Definition: Eref.h:26
static Id managerId_
Definition: SparseMsg.h:148
static unsigned int numMsg()
Msg lookup functions.
Definition: SparseMsg.cpp:637
void pairFill(vector< unsigned int > src, vector< unsigned int > dest)
Definition: SparseMsg.cpp:323
void unsetEntry(unsigned int row, unsigned int column)
Definition: SparseMsg.cpp:284
void updateAfterFill()
Definition: SparseMsg.cpp:301
void setSize(unsigned int nrows, unsigned int ncolumns)
Definition: SparseMatrix.h:126
virtual unsigned int numData() const =0
Returns number of data entries across all nodes.
Definition: Msg.h:18
virtual unsigned int localDataStart() const =0
Returns index of first data entry on this node.
Element * e1_
Index of this Msg on the msg_ vector.
Definition: Msg.h:180
void setSeed(unsigned long value)
Definition: SparseMsg.cpp:198
ObjId mid_
Definition: Msg.h:178
virtual unsigned int numLocalData() const =0
Returns number of local data entries on this node.
void transpose()
Definition: SparseMsg.cpp:294
Element * e1() const
Definition: Msg.h:61
double getProbability() const
Definition: SparseMsg.cpp:193
ObjId findOtherEnd(ObjId end) const
Definition: SparseMsg.cpp:544
void setEntry(unsigned int row, unsigned int column, unsigned int value)
Definition: SparseMsg.cpp:278
Element * element() const
Definition: ObjId.cpp:124
static const Cinfo * initCinfo()
Definition: SparseMsg.cpp:24
unsigned int getNumEntries() const
Definition: SparseMsg.cpp:224
Definition: Id.h:17
void unset(unsigned int row, unsigned int column)
Definition: SparseMatrix.h:212
Definition: OpFunc.h:13
void sources(vector< vector< Eref > > &v) const
Definition: SparseMsg.cpp:624
const vector< unsigned int > & rowStart() const
Definition: SparseMatrix.h:435
SparseMatrix< unsigned int > & getMatrix()
Definition: SparseMsg.cpp:539
moose::MOOSE_RANDOM_DEVICE rd_
Definition: SparseMsg.h:153
static vector< SparseMsg * > msg_
Definition: SparseMsg.h:149
Element * e2_
Element 1 attached to Msg.
Definition: Msg.h:181
vector< unsigned int > getRowStart() const
Definition: SparseMsg.cpp:239
unsigned int FuncId
Definition: header.h:42
void setMatrix(const SparseMatrix< unsigned int > &m)
Definition: SparseMsg.cpp:534
void targets(vector< vector< Eref > > &v) const
Definition: SparseMsg.cpp:631
virtual void resizeField(unsigned int rawIndex, unsigned int newNumField)=0
const unsigned int BADINDEX
Used by ObjId and Eref.
Definition: consts.cpp:25
unsigned int getColumn(unsigned int col, vector< T > &entry, vector< unsigned int > &rowIndex) const
Definition: SparseMatrix.h:342
unsigned int DataId
Definition: header.h:47
Definition: Cinfo.h:18
SparseMsg(Element *e1, Element *e2, unsigned int msgIndex)
Definition: SparseMsg.cpp:389
static const Cinfo * initCinfo()
Definition: Msg.cpp:165
unsigned long getSeed() const
Definition: SparseMsg.cpp:209
unsigned int dataIndex
Definition: ObjId.h:99
Msg * copy(Id origSrc, Id newSrc, Id newTgt, FuncId fid, unsigned int b, unsigned int n) const
Definition: SparseMsg.cpp:570
Definition: Finfo.h:12
Eref firstTgt(const Eref &src) const
Definition: SparseMsg.cpp:433