13 #include "../msg/OneToAllMsg.h"
14 #include "../shell/Shell.h"
15 #include "../scheduling/Clock.h"
21 msgBinding_( c->numBindIndex() ),
22 msgDigest_( c->numBindIndex() ),
27 id.bindIdToElement(
this );
37 for ( vector< vector< MsgFuncBinding > >::iterator
40 for ( vector< MsgFuncBinding >::iterator
41 j = i->begin(); j != i->end(); ++j )
48 for ( vector< ObjId >::iterator i =
m_.begin(); i !=
m_.end(); ++i )
81 while (
m_.size() > 0 )
83 if (
m_.back().bad() )
118 m_.erase(
remove(
m_.begin(),
m_.end(), mid ),
m_.end() );
123 i->erase( remove_if( i->begin(), i->end(), match ), i->end() );
141 for( vector< MsgFuncBinding >::iterator i = temp.begin();
142 i != temp.end(); ++i )
166 bool zombieInName = ( c->
name().substr(0, 6) ==
"Zombie" );
167 if (
tick_ == -2 && !zombieInName )
172 else if (
tick_ >= 0 )
199 static Id clockId( 1 );
201 vector< ObjId > msgs;
202 for ( vector< ObjId >::const_iterator i =
m_.begin();
207 if ( m->
e1() == this )
217 msgs.push_back( *i );
220 sort( msgs.begin(), msgs.end() );
222 msgs.erase( unique( msgs.begin(), msgs.end() ), msgs.end() );
223 for( vector< ObjId >::iterator
224 i = msgs.begin(); i != msgs.end(); ++i )
232 ss <<
"proc" << tick;
246 cout <<
"Error: Element::setTick: failed to connect " << tgt <<
261 if ( t < 0 || t > 31 )
267 if ( f2 && dynamic_cast< const SharedFinfo* >( f2 ) )
280 cout <<
"Element::setTick:Warning: Attempt to assign a tick to a '"
281 <<
cinfo_->
name() <<
"'.\nThis does not support process actions.\n";
315 cout <<
"Outgoing: \n";
316 for ( map< string, Finfo* >::const_iterator i =
324 unsigned int numTgt = mb.size();
327 for (
unsigned int j = 0; j < numTgt; ++j )
330 cout << j <<
": MessageId=" << mb[j].mid <<
331 ", FuncId=" << mb[j].fid <<
339 cout <<
"Dest and Src: \n";
340 for (
unsigned int i = 0; i <
m_.size(); ++i )
343 cout << i <<
": MessageId= " <<
m_[i] <<
345 ", e2= " << m->
e2()->
name_ << endl;
352 for ( vector< ObjId >::const_iterator i =
m_.begin();
357 if ( m->
e1() == this )
376 for (
unsigned int i = 0; i <
msgBinding_.size(); ++i )
378 const vector< MsgFuncBinding >& mb =
msgBinding_[i];
379 vector< MsgFuncBinding>::const_iterator bi =
380 find( mb.begin(), mb.end(), b );
381 if ( bi != mb.end() )
393 const Element* elm,
const vector< MsgFuncBinding >& vec )
395 vector< FuncOrder > fo( vec.size() );
396 for (
unsigned int j = 0; j < vec.size(); ++j )
400 if ( msg->
e1() == elm )
409 sort( fo.begin(), fo.end() );
434 vector< vector < Eref > >& erefs,
435 vector< vector< bool > >& targetNodes )
438 for (
unsigned int i = 0; i < erefs.size(); ++i )
441 vector< Eref >& vec = erefs[i];
442 for (
unsigned int j = 0; j < vec.size(); ++j )
444 const Eref& er = vec[j];
445 unsigned int node = er.
getNode();
448 i >= start && i < end )
450 if ( node != myNode )
451 targetNodes[i][node] =
true;
456 targetNodes[i][k] =
true;
459 if ( node == myNode )
460 temp.push_back( er );
469 vector< vector< bool > >& targetNodes )
473 vector< vector < Eref > > erefs;
474 if ( msg->
e1() == this )
476 else if ( msg->
e2() == this )
486 erefs, targetNodes );
488 for (
unsigned int j = 0; j < erefs.size(); ++j )
490 vector< MsgDigest >& md =
493 if ( md.size() == 0 || md.back().func != fo.
func() )
506 md.back().targets.insert( md.back().targets.end(),
518 unsigned int srcNum, vector< vector< bool > >& targetNodes )
526 if ( msg->
e1() == this )
537 for (
unsigned int i = 0; i <
numData(); ++i )
542 if ( targetNodes[i][j] )
543 tgts.push_back(
Eref(
this, i, j ) );
549 if ( tgts.size() > 0 )
551 vector< MsgDigest >& md =
559 unsigned int totFunc,
unsigned int numData,
unsigned int funcNum )
561 unsigned int ret = 0;
562 for (
unsigned int i = 0; i < numData; ++i )
564 ret += md[ totFunc * i + funcNum ].size();
575 vector< vector< bool > > targetNodes(
numData(), temp );
579 for (
unsigned int i = 0; i <
msgBinding_.size(); ++i )
583 for ( vector< FuncOrder >::const_iterator
584 k = fo.begin(); k != fo.end(); ++k )
598 cout <<
"\nfor Element " <<
name_;
599 cout <<
", Func: " << i <<
", numFunc = " << fo.size() <<
600 ", numPre= " << numPre <<
601 ", numPost= " << numPost << endl;
602 for (
unsigned int j = 0; j <
numData(); ++j )
604 cout << endl << j <<
" ";
607 cout << (int)targetNodes[j][node];
625 vector< const SrcFinfo* > srcVec;
626 vector< const DestFinfo* > destVec;
627 vector< const SharedFinfo* > sharedVec;
628 vector< const Finfo* > valueVec;
629 for ( map< string, Finfo* >::const_iterator i =
637 srcVec.push_back( sf );
639 destVec.push_back( df );
641 sharedVec.push_back( shf );
643 valueVec.push_back( i->second );
646 cout <<
"Showing SrcFinfos: \n";
647 for (
unsigned int i = 0; i < srcVec.size(); ++i )
648 cout << i <<
": " << srcVec[i]->
name() <<
" Bind=" << srcVec[i]->getBindIndex() << endl;
649 cout <<
"Showing " << destVec.size() <<
" DestFinfos: \n";
654 cout <<
"Showing SharedFinfos: \n";
655 for (
unsigned int i = 0; i < sharedVec.size(); ++i )
657 cout << i <<
": " << sharedVec[i]->name() <<
" Src=[ ";
658 for (
unsigned int j = 0; j < sharedVec[i]->src().size(); ++j )
659 cout <<
" " << sharedVec[i]->src()[j]->name();
660 cout <<
" ] Dest=[ ";
661 for (
unsigned int j = 0; j < sharedVec[i]->dest().size(); ++j )
662 cout <<
" " << sharedVec[i]->dest()[j]->name();
665 cout <<
"Listing ValueFinfos: \n";
668 for (
unsigned int i = 0; i < valueVec.size(); ++i )
670 valueVec[i]->strGet( er, valueVec[i]->
name(), val );
671 cout << i <<
": " << valueVec[i]->name() <<
" " <<
678 for( vector< Id >::const_iterator i = tree.begin();
679 i != tree.end(); i++ )
680 i->element()->markAsDoomed();
681 bool killShell =
false;
684 for( vector< Id >::const_iterator i = tree.begin();
685 i != tree.end(); i++ )
714 unsigned int start = 0;
721 for (
unsigned int i = start; i < end; ++i )
724 const vector< MsgDigest> & md =
726 for (
unsigned int j = 0; j < md.size(); ++j )
729 for (
unsigned int k = 0; k < md[j].targets.size(); ++k )
732 md[j].targets[k].dataIndex() <<
"," <<
733 md[j].targets[k].fieldIndex();
753 unsigned int oldSize = ret.size();
755 const vector< MsgFuncBinding >* msgVec =
759 for (
unsigned int i = 0; i < msgVec->size(); ++i )
764 if ( m->
e2() == this )
769 return ret.size() - oldSize;
774 vector< ObjId >& tgt,
775 vector< string >& func
779 assert( srcDataId < this->
numData() );
784 const vector< MsgFuncBinding >* msgVec =
786 for (
unsigned int i = 0; i < msgVec->size(); ++i )
790 FuncId fid = (*msgVec)[i].fid;
791 if ( m->
e1() == this )
794 vector< vector< Eref > > t;
796 assert( t.size() == this->
numData() );
797 vector< Eref >& row = t[srcDataId];
798 for ( vector< Eref >::const_iterator
799 e = row.begin(); e != row.end(); ++e )
801 tgt.push_back( e->objId() );
802 func.push_back( name );
805 else if ( m->
e2() == this )
808 vector< vector< Eref > > t;
810 assert( t.size() == this->
numData() );
811 vector< Eref >& row = t[srcDataId];
812 for ( vector< Eref >::const_iterator
813 e = row.begin(); e != row.end(); ++e )
815 tgt.push_back( e->objId() );
816 func.push_back( name );
829 vector< ObjId >& srcObj,
830 vector< string >& sender )
const
832 for ( vector< ObjId >::const_iterator i =
m_.begin();
837 if ( m->
e1() == this )
849 srcObj.push_back(
ObjId( src->
id(), 0 ) );
853 return srcObj.size();
860 assert( srcDataId < this->
numData() );
863 Eref er( const_cast< Element* >(
this ), srcDataId );
866 for ( vector< MsgDigest >::const_iterator
867 i = md.begin(); i != md.end(); ++i )
869 for ( vector< Eref >::const_iterator
870 j = i->targets.begin(); j != i->targets.end(); ++j )
872 if ( j->dataIndex() ==
ALLDATA )
874 for (
unsigned int k = 0;
875 k < j->element()->numData(); ++k )
876 ret.push_back(
ObjId( j->id(), k ) );
880 ret.push_back( j->objId() );
891 unsigned int oldSize = ret.size();
894 vector< ObjId > caller;
896 for ( vector< ObjId >::iterator i = caller.begin();
897 i != caller.end(); ++i )
903 if ( m->
e1() == this )
907 return ret.size() - oldSize;
925 vector< ObjId > caller;
927 for ( vector< ObjId >::iterator i = caller.begin();
928 i != caller.end(); ++i )
933 if ( m->
e1() == this )
937 ret.push_back( pair< Id, unsigned int >( m->
e2()->
id(), idx ) );
939 else if ( m->
e2() == this )
943 ret.push_back( pair< Id, unsigned int >( m->
e1()->
id(), idx ) );
959 assert( srcF || destF || sharedF );
966 else if ( ! sharedF->
src().empty() )
968 else if ( ! sharedF->
dest().empty() )
970 Finfo* subFinfo = sharedF->
dest().front();
972 dynamic_cast< const DestFinfo*
>( subFinfo );
973 assert( subDestFinfo );
987 for ( vector< ObjId >::const_iterator i =
m_.begin();
992 if ( m->
e1() == this )
1003 caller.push_back( *i );
1006 return caller.size();
1010 vector< pair< BindIndex, FuncId > >& ret )
const
1013 for (
unsigned int i = 0; i <
msgBinding_.size(); ++i )
1015 const vector< MsgFuncBinding >& mb =
msgBinding_[i];
1016 for ( vector< MsgFuncBinding >::const_iterator j = mb.begin();
1017 j != mb.end(); ++j )
1019 if ( j->mid == mid )
1021 ret.push_back( pair< BindIndex, FuncId >( i, j->fid ));
const vector< ObjId > & msgIn() const
const OpFunc * getOpFunc(FuncId fid) const
void putOffNodeTargetsInDigest(unsigned int srcNum, vector< vector< bool > > &targetNodes)
void setName(const string &val)
vector< ObjId > getMsgTargets(DataId srcDataId, const SrcFinfo *finfo) const
unsigned int getOutputs(vector< Id > &ret, const SrcFinfo *finfo) const
Element * element() const
Synonym for Id::operator()()
virtual Eref firstTgt(const Eref &src) const =0
void clearBinding(BindIndex b)
BindIndex getBindIndex() const
unsigned int getNode() const
const vector< Finfo * > & dest() const
unsigned int dataIndex() const
unsigned int getMsgTargetAndFunctions(DataId srcDataId, const SrcFinfo *finfo, vector< ObjId > &tgt, vector< string > &func) const
unsigned int getInputsWithTgtIndex(vector< pair< Id, unsigned int > > &ret, const DestFinfo *finfo) const
void printMsgDigest(unsigned int srcIndex, unsigned int dataIndex) const
const vector< SrcFinfo * > & src() const
virtual void zombieSwap(const Cinfo *zCinfo)
virtual func, this base version must be called by all derived classes
void addMsgAndFunc(ObjId mid, FuncId fid, BindIndex bindIndex)
const map< string, Finfo * > & finfoMap() const
const string & name() const
Element * element() const
unsigned int getMsgSourceAndSender(FuncId fid, vector< ObjId > &src, vector< string > &sender) const
unsigned int fieldIndex() const
virtual void sources(vector< vector< Eref > > &v) const =0
virtual void targets(vector< vector< Eref > > &v) const =0
void innerSetTick(unsigned int tick)
bool isRewired_
True if messages have been changed and need to digestMessages.
unsigned int getInputs(vector< Id > &ret, const DestFinfo *finfo) const
unsigned int getFieldsOfOutgoingMsg(ObjId mid, vector< pair< BindIndex, FuncId > > &ret) const
const unsigned int ALLDATA
Used by ObjId and Eref.
const vector< MsgDigest > & msgDigest(unsigned int bindIndex) const
const std::string & name() const
vector< FuncOrder > putFuncsInOrder(const Element *elm, const vector< MsgFuncBinding > &vec)
static unsigned int myNode
bool hasMsgs(BindIndex b) const
Id id_
Name of the Element.
const vector< MsgDigest > & msgDigest(unsigned int index)
static void deleteMsg(ObjId mid)
ObjId findCaller(FuncId fid) const
virtual bool addMsg(const Finfo *target, ObjId mid, Element *src) const
virtual const OpFunc * makeHopFunc(HopIndex hopIndex) const =0
virtual bool hasFields() const =0
const string & destFinfoName(FuncId fid) const
static unsigned int lookupDefaultTick(const string &className)
const vector< MsgFuncBinding > * getMsgAndFunc(BindIndex b) const
const Cinfo * cinfo() const
virtual unsigned int numData() const =0
Returns number of data entries across all nodes.
virtual bool isGlobal() const =0
True if there is a copy of every dataEntry on all nodes.
const OpFunc * func() const
virtual unsigned int localDataStart() const =0
Returns index of first data entry on this node.
const Cinfo * cinfo_
Stores the unique identifier for Element.
virtual unsigned int numLocalData() const =0
Returns number of local data entries on this node.
vector< vector< MsgDigest > > msgDigest_
unsigned int getInputMsgs(vector< ObjId > &caller, FuncId fid) const
Element(Id id, const Cinfo *c, const string &name)
void putTargetsInDigest(unsigned int srcNum, const MsgFuncBinding &mfb, const FuncOrder &fo, vector< vector< bool > > &targetNodes)
static void destroyElementTree(const vector< Id > &tree)
bool operator()(const MsgFuncBinding &m) const
void dropAllMsgsFromSrc(Id src)
unsigned int getNeighbors(vector< Id > &ret, const Finfo *finfo) const
static unsigned int myNode()
static const Msg * getMsg(ObjId m)
const string & srcFinfoName(BindIndex bid) const
static unsigned int numNodes()
vector< vector< MsgFuncBinding > > msgBinding_
unsigned int findNumDigest(const vector< vector< MsgDigest > > &md, unsigned int totFunc, unsigned int numData, unsigned int funcNum)
static bool addClockMsg(unsigned int tick, Id tgt, const Finfo *f2)
void clearAllMsgs()
Used upon ending of MOOSE session, to rapidly clear out messages.
int tick_
Returns tick on which element is scheduled. -1 for disabled.
const string & getName() const
void replaceCinfo(const Cinfo *newCinfo)
Support function for zombieSwap, replaces Cinfo.
const unsigned int BADINDEX
Used by ObjId and Eref.
unsigned int findBinding(MsgFuncBinding b) const
const Finfo * findFinfo(const string &name) const
bool isDoomed_
True if the element is marked for destruction.
void filterOffNodeTargets(unsigned int start, unsigned int end, bool isSrcGlobal, unsigned int myNode, vector< vector< Eref > > &erefs, vector< vector< bool > > &targetNodes)