Version: 9.16.0
Bloc.hxx
Go to the documentation of this file.
1// Copyright (C) 2006-2026 CEA, EDF
2//
3// This library is free software; you can redistribute it and/or
4// modify it under the terms of the GNU Lesser General Public
5// License as published by the Free Software Foundation; either
6// version 2.1 of the License, or (at your option) any later version.
7//
8// This library is distributed in the hope that it will be useful,
9// but WITHOUT ANY WARRANTY; without even the implied warranty of
10// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11// Lesser General Public License for more details.
12//
13// You should have received a copy of the GNU Lesser General Public
14// License along with this library; if not, write to the Free Software
15// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16//
17// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18//
19
20#ifndef __BLOC_HXX__
21#define __BLOC_HXX__
22
25#include "AutoRefCnt.hxx"
26
27namespace YACS
28{
29 namespace ENGINE
30 {
31 class PartDefinition;
32 class DynParaLoop;
33 class AbstractPoint;
34 class PlayGround;
36 {
37 protected:
38 std::list<Node *> _setOfNode;//OWNERSHIP OF ALL NODES
40 mutable std::map<Node *,std::set<Node *> > *_fwLinks;
42 mutable std::map<Node *,std::set<Node *> > *_bwLinks;
43 protected:
44 Node *simpleClone(ComposedNode *father, bool editionOnly=true) const;
45 public:
46 Bloc(const Bloc& other, ComposedNode *father, bool editionOnly);
47 Bloc(const std::string& name);
48 virtual ~Bloc();
49 bool isFinished();
50 int getNumberOfCFLinks() const;
51 void init(bool start=true);
52 void getReadyTasks(std::vector<Task *>& tasks);
53 void exUpdateState();
54 //Node* DISOWNnode is a SWIG notation to indicate that the ownership of the node is transfered to C++
55 bool edAddChild(Node *DISOWNnode) ;
56 void edRemoveChild(Node *node) ;
57 std::list<Node *> getChildren() const { return _setOfNode; }
58 std::list<Node *> edGetDirectDescendants() const { return _setOfNode; }
59 std::vector< std::list<Node *> > splitIntoIndependantGraph() const;
60 Node *getChildByShortName(const std::string& name) const ;
61 virtual void writeDot(std::ostream &os) const;
62 void accept(Visitor *visitor);
63 template<bool direction>
64 void findAllPathsStartingFrom(Node *start, std::list< std::vector<Node *> >& vec, std::map<Node *, std::set<Node *> >& accelStr) const;
65 template<bool direction>
66 void findAllNodesStartingFrom(Node *start, std::set<Node *>& result, std::map<Node *, std::set<Node *> >& accelStr, LinkInfo& info) const;
67 virtual std::string typeName() { return "YACS__ENGINE__Bloc"; }
68 int getMaxLevelOfParallelism() const;
69 void getWeightRegardingDPL(ComplexWeight *weight);
70 void removeRecursivelyRedundantCL();
71 void partitionRegardingDPL(const PartDefinition *pd, std::map<ComposedNode *, YACS::BASES::AutoRefCnt<PartDefinition> >& zeMap);
72 void fitToPlayGround(const PlayGround *pg);
73 void propagePlayGround(const PlayGround *pg);
74 protected:
75 bool areAllSubNodesFinished() const;
76 bool areAllSubNodesDone() const;
77 bool isNameAlreadyUsed(const std::string& name) const;
78 void checkNoCyclePassingThrough(Node *node) ;
79 std::vector< std::pair<OutGate *, InGate *> > getSetOfInternalCFLinks() const;
80 YACS::Event updateStateOnFinishedEventFrom(Node *node);
81 YACS::Event updateStateOnFailedEventFrom(Node *node, const Executor *execInst);
82 void initComputation() const;
83 void performCFComputationsOnlyOneLevel(LinkInfo& info) const;
84 void performCFComputations(LinkInfo& info) const;
85 void destructCFComputations(LinkInfo& info) const;
86 void checkControlDependancy(OutPort *start, InPort *end, bool cross,
87 std::map < ComposedNode *, std::list < OutPort * >, SortHierarc >& fw,
88 std::vector<OutPort *>& fwCross,
89 std::map< ComposedNode *, std::list < OutPort *>, SortHierarc >& bw,
90 LinkInfo& info) const;
91 bool areLinked(Node *start, Node *end, bool fw) const;
92 bool arePossiblyRunnableAtSameTime(Node *start, Node *end) const;
93 void checkCFLinks(const std::list<OutPort *>& starts, InputPort *end, unsigned char& alreadyFed, bool direction, LinkInfo& info) const;
94 static void verdictForOkAndUseless1(const std::map<Node *,std::list <OutPort *> >& pool, InputPort *end, const std::vector<Node *>& candidates,
95 unsigned char& alreadyFed, bool direction, LinkInfo& info);
96 static void verdictForCollapses(const std::map<Node *,std::list <OutPort *> >& pool, InputPort *end, const std::set<Node *>& candidates,
97 unsigned char& alreadyFed, bool direction, LinkInfo& info);
98 void seekOkAndUseless1(std::vector<Node *>& okAndUseless1, std::set<Node *>& allNodes) const;
99 void seekUseless2(std::vector<Node *>& useless2, std::set<Node *>& allNodes) const;
100 private:
101 std::list< AbstractPoint * > analyzeParallelism() const;
102 static void findUselessLinksIn(const std::list< std::vector<Node *> >& res , LinkInfo& info);
103 template<bool direction>
104 static unsigned appendIfAlreadyFound(std::list< std::vector<Node *> >& res, const std::vector<Node *>& startRes, Node *node, std::map<Node *, std::set<Node *> >& fastFinder);
105 static void updateWithNewFind(const std::vector<Node *>& path, std::map<Node *, std::set<Node *> >& fastFinder);
106 };
107
108 template<bool direction>
110 {
111 };
112
113 template<>
115 {
116 typedef std::list< std::pair<InGate *,bool> >::iterator Iterator;
117 typedef std::list< std::pair<InGate *,bool> >& Nexts;
118 static Nexts getNexts(Node *node) { return node->getOutGate()->edMapInGate(); }
119 };
120
121
122 template<>
124 {
125 typedef std::list< std::pair<OutGate *,bool> >::iterator Iterator;
126 typedef std::list< std::pair<OutGate *,bool> >& Nexts;
127 static Nexts getNexts(Node *node) { return node->getInGate()->edMapOutGate(); }
128 };
129
134 template<bool direction>
135 unsigned Bloc::appendIfAlreadyFound(std::list< std::vector<Node *> >& res, const std::vector<Node *>& startRes, Node *node, std::map<Node *, std::set<Node *> >& fastFinder)
136 {
137 std::map<Node *, std::set<Node *> >::iterator iter=fastFinder.find(node);
138 if(iter==fastFinder.end())
139 return 0;
140 unsigned ret=0;
141 std::vector<std::pair<std::set<Node *>::iterator, std::set<Node *>::iterator > > li;
142 std::pair<std::set<Node *>::iterator, std::set<Node *>::iterator> ipr(((*iter).second).begin(),((*iter).second).end());
143 li.push_back(ipr);
144 std::vector<Node *> work(startRes);
145 std::list< std::vector<Node *> >::iterator where=res.end(); where--;
146 std::list< std::vector<Node *> >::iterator updates=where;
147 while(!li.empty())
148 {
149 if(li.back().first!=li.back().second)
150 {
151 work.push_back(*(li.back().first));
152 if(CFDirectionVisTraits<direction>::getNexts(work.back()).empty())
153 {
154 where=res.insert(where,work);
155 ret++;
156 li.back().first++;
157 work.pop_back();
158 }
159 else
160 {
161 std::set<Node *>& s=fastFinder[*(li.back().first)];
162 std::pair<std::set<Node *>::iterator, std::set<Node *>::iterator> pr(s.begin(),s.end());
163 li.push_back(pr);
164 }
165 }
166 else
167 {
168 work.pop_back();
169 li.pop_back();
170 if(!li.empty())
171 li.back().first++;
172 }
173 }
174 updates--;
175 for(unsigned i=0;i<ret;i++,updates--)
176 updateWithNewFind(*updates,fastFinder);
177 return ret;
178 }
179
180 template<bool direction>
181 void Bloc::findAllNodesStartingFrom(Node *start, std::set<Node *>& result,
182 std::map<Node *, std::set<Node *> >& accelStr, LinkInfo& info) const
183 {
184 std::list< std::vector<Node *> > li;
185 findAllPathsStartingFrom<direction>(start,li,accelStr);
186 for(std::list< std::vector<Node *> >::const_iterator iter=li.begin();iter!=li.end();iter++)
187 for(std::vector<Node *>::const_iterator iter2=(*iter).begin()+1;iter2!=(*iter).end();iter2++)
188 result.insert(*iter2);
189 if(direction)
190 findUselessLinksIn(li,info);
191 }
192
200 template<bool direction>
201 void Bloc::findAllPathsStartingFrom(Node *start, std::list< std::vector<Node *> >& vec,
202 std::map<Node *, std::set<Node *> >& accelStr) const
203 {
205 Node *current=start;
206 int caseId=0;
207 int idInCase=0;
208 vec.push_back(std::vector<Node *>());
210 std::list< std::vector<Node *> >::iterator curLine=vec.begin();
211 while(start->_colour!=YACS::Black)
212 {
213 (*curLine).push_back(current);
214 idInCase++;
215 //
217 {
218
219 vec.push_back(std::vector<Node *>((*curLine)));
220 updateWithNewFind(*curLine,accelStr);
221 current->_colour=YACS::Black;
222 curLine++;
223 if(idInCase>1)
224 {
225 idInCase-=2;
226 current=(*curLine)[idInCase];
227 (*curLine).pop_back();
228 (*curLine).pop_back();
229 }
230 continue;
231 }
232 if(current->_colour==YACS::Black)
233 {
234 appendIfAlreadyFound<direction>(vec,(*curLine),current,accelStr);
235 curLine=vec.end(); curLine--;
236 current->_colour=YACS::Black;
237 if(idInCase>1)
238 {
239 idInCase-=2;
240 current=(*curLine)[idInCase];
241 (*curLine).pop_back();
242 (*curLine).pop_back();
243 }
244 continue;
245 }
246 for(iter=CFDirectionVisTraits<direction>::getNexts(current).begin();iter!=CFDirectionVisTraits<direction>::getNexts(current).end();iter++)
247 if(!(*iter).second)
248 break;
249 if(iter==CFDirectionVisTraits<direction>::getNexts(current).end())
250 {//Fail this branch should be forgotten go rev
251 current->_colour=YACS::Black;
252 (*curLine).pop_back();
253 if(idInCase>1)
254 {
255 idInCase-=2;
256 current=(*curLine)[idInCase];
257 (*curLine).pop_back();
258 }
259 }
260 else
261 {
262 //Nothing to signal continuing in this direction hoping to find
263 current=(*iter).first->getNode();
264 (*iter).second=true;
265 }
266 }
267 vec.pop_back();
268 }
269 }
270}
271
272
273#endif
#define YACSLIBENGINE_EXPORT
Composed node to group elementary and composed nodes.
Definition: Bloc.hxx:36
std::list< Node * > _setOfNode
Definition: Bloc.hxx:38
static unsigned appendIfAlreadyFound(std::list< std::vector< Node * > > &res, const std::vector< Node * > &startRes, Node *node, std::map< Node *, std::set< Node * > > &fastFinder)
Definition: Bloc.hxx:135
virtual std::string typeName()
Definition: Bloc.hxx:67
std::list< Node * > edGetDirectDescendants() const
Definition: Bloc.hxx:58
void findAllNodesStartingFrom(Node *start, std::set< Node * > &result, std::map< Node *, std::set< Node * > > &accelStr, LinkInfo &info) const
Definition: Bloc.hxx:181
std::list< Node * > getChildren() const
Definition: Bloc.hxx:57
static void updateWithNewFind(const std::vector< Node * > &path, std::map< Node *, std::set< Node * > > &fastFinder)
Definition: Bloc.cxx:869
std::map< Node *, std::set< Node * > > * _bwLinks
For internal calculations.
Definition: Bloc.hxx:42
void findAllPathsStartingFrom(Node *start, std::list< std::vector< Node * > > &vec, std::map< Node *, std::set< Node * > > &accelStr) const
Definition: Bloc.hxx:201
std::map< Node *, std::set< Node * > > * _fwLinks
For internal calculations.
Definition: Bloc.hxx:40
static void findUselessLinksIn(const std::list< std::vector< Node * > > &res, LinkInfo &info)
Definition: Bloc.cxx:883
void initComputation() const
Definition: Bloc.cxx:701
Base class for all composed nodes.
Threaded Executor.
Definition: Executor.hxx:63
std::list< std::pair< OutGate *, bool > > & edMapOutGate()
Definition: InGate.hxx:48
Base class for Input Ports.
Definition: InputPort.hxx:44
Class that deal with list of semantics links for high level analysis.
Definition: LinkInfo.hxx:83
Base class for all nodes.
Definition: Node.hxx:70
YACS::Colour _colour
Definition: Node.hxx:84
OutGate * getOutGate()
Definition: Node.hxx:124
InGate * getInGate()
Definition: Node.hxx:123
std::list< std::pair< InGate *, bool > > & edMapInGate()
Definition: OutGate.hxx:52
Event
Definition: define.hxx:56
@ Black
Definition: define.hxx:30
std::list< std::pair< OutGate *, bool > > & Nexts
Definition: Bloc.hxx:126
std::list< std::pair< OutGate *, bool > >::iterator Iterator
Definition: Bloc.hxx:125
static Nexts getNexts(Node *node)
Definition: Bloc.hxx:127
std::list< std::pair< InGate *, bool > >::iterator Iterator
Definition: Bloc.hxx:116
std::list< std::pair< InGate *, bool > > & Nexts
Definition: Bloc.hxx:117
static Nexts getNexts(Node *node)
Definition: Bloc.hxx:118