The Gaudi Framework  v36r16 (ea80daf8)
GaudiHive.precedence.CruncherSequence Class Reference
Inheritance diagram for GaudiHive.precedence.CruncherSequence:
Collaboration diagram for GaudiHive.precedence.CruncherSequence:

Public Member Functions

def __init__ (self, timeValue, BlockingBoolValue, sleepFraction, cfgPath, dfgPath, topSequencer, showStat=False, timeline=False, outputLevel=INFO, cardinality=1)
 
def get (self)
 

Public Attributes

 cardinality
 
 timeValue
 
 BlockingBoolValue
 
 sleepFraction
 
 cfg
 
 dfg
 
 enableTimeline
 
 outputLevel
 
 sequencer
 

Static Public Attributes

 unique_sequencers
 
 dupl_seqs
 
 OR_sequencers
 
 unique_algos
 
 dupl_algos
 
 unique_data_objects
 

Private Member Functions

def _declare_data_deps (self, algo_name, algo)
 
def _generate_sequence (self, name, seq=None)
 

Detailed Description

Constructs the sequence tree of CPUCrunchers with provided control flow and data flow precedence rules.

Definition at line 172 of file precedence.py.

Constructor & Destructor Documentation

◆ __init__()

def GaudiHive.precedence.CruncherSequence.__init__ (   self,
  timeValue,
  BlockingBoolValue,
  sleepFraction,
  cfgPath,
  dfgPath,
  topSequencer,
  showStat = False,
  timeline = False,
  outputLevel = INFO,
  cardinality = 1 
)
Keyword arguments:
timeValue -- timeValue object to set algorithm execution time
BlockingBoolValue -- *BooleanValue object to set whether an algorithm has to experience CPU-blocking execution
cfgPath -- relative to $ENV_PROJECT_SOURCE_DIR/GaudiHive/data path to GRAPHML file with control flow dependencies
dfgPath -- relative to $ENV_PROJECT_SOURCE_DIR/GaudiHive/data path to GRAPHML file with data flow dependencies
showStat -- print out statistics on precedence graph

Definition at line 183 of file precedence.py.

183  def __init__(
184  self,
185  timeValue,
186  BlockingBoolValue,
187  sleepFraction,
188  cfgPath,
189  dfgPath,
190  topSequencer,
191  showStat=False,
192  timeline=False,
193  outputLevel=INFO,
194  cardinality=1,
195  ):
196  """
197  Keyword arguments:
198  timeValue -- timeValue object to set algorithm execution time
199  BlockingBoolValue -- *BooleanValue object to set whether an algorithm has to experience CPU-blocking execution
200  cfgPath -- relative to $ENV_PROJECT_SOURCE_DIR/GaudiHive/data path to GRAPHML file with control flow dependencies
201  dfgPath -- relative to $ENV_PROJECT_SOURCE_DIR/GaudiHive/data path to GRAPHML file with data flow dependencies
202  showStat -- print out statistics on precedence graph
203  """
204 
205  self.cardinality = cardinality
206  self.timeValue = timeValue
207  self.BlockingBoolValue = BlockingBoolValue
208  self.sleepFraction = sleepFraction
209 
210  self.cfg = nx.read_graphml(_buildFilePath(cfgPath))
211  self.dfg = nx.read_graphml(_buildFilePath(dfgPath))
212 
213  self.enableTimeline = timeline
214 
215  self.outputLevel = outputLevel
216 
217  # Generate control flow part
218  self.sequencer = self._generate_sequence(topSequencer)
219 
220  if showStat:
221  print("\n===== Statistics on Algorithms =====")
222  print(
223  "Total number of algorithm nodes: ",
224  len(self.unique_algos)
225  + sum([self.dupl_algos[i] - 1 for i in self.dupl_algos]),
226  )
227  print("Number of unique algorithms: ", len(self.unique_algos))
228  print(
229  " -->",
230  len(self.dupl_algos),
231  "of them being re-used with the following distribution: ",
232  [self.dupl_algos[i] for i in self.dupl_algos],
233  )
234  # pprint.pprint(dupl_algos)
235 
236  print("\n===== Statistics on Sequencers =====")
237  print(
238  "Total number of sequencers: ",
239  len(self.unique_sequencers)
240  + sum([self.dupl_seqs[i] - 1 for i in self.dupl_seqs]),
241  )
242  print("Number of unique sequencers: ", len(self.unique_sequencers))
243  print(
244  " -->",
245  len(self.dupl_seqs),
246  "of them being re-used with the following distribution: ",
247  [self.dupl_seqs[i] for i in self.dupl_seqs],
248  )
249  # pprint.pprint(dupl_seqs)
250  print("Number of OR-sequencers: ", len(self.OR_sequencers))
251 
252  print("\n===== Statistics on DataObjects =====")
253  print("Number of unique DataObjects: ", len(self.unique_data_objects))
254  # pprint.pprint(self.unique_data_objects)
255  print()
256 

Member Function Documentation

◆ _declare_data_deps()

def GaudiHive.precedence.CruncherSequence._declare_data_deps (   self,
  algo_name,
  algo 
)
private
Declare data inputs and outputs for a given algorithm.

Definition at line 261 of file precedence.py.

261  def _declare_data_deps(self, algo_name, algo):
262  """Declare data inputs and outputs for a given algorithm."""
263 
264  # Declare data inputs
265  for inNode, outNode in self.dfg.in_edges(algo_name):
266  dataName = inNode
267  if dataName not in self.unique_data_objects:
268  self.unique_data_objects.append(dataName)
269 
270  if dataName not in algo.inpKeys:
271  algo.inpKeys.append(dataName)
272 
273  # Declare data outputs
274  for inNode, outNode in self.dfg.out_edges(algo_name):
275  dataName = outNode
276  if dataName not in self.unique_data_objects:
277  self.unique_data_objects.append(dataName)
278 
279  if dataName not in algo.outKeys:
280  algo.outKeys.append(dataName)
281 

◆ _generate_sequence()

def GaudiHive.precedence.CruncherSequence._generate_sequence (   self,
  name,
  seq = None 
)
private
Assemble the tree of sequencers.

Definition at line 282 of file precedence.py.

282  def _generate_sequence(self, name, seq=None):
283  """Assemble the tree of sequencers."""
284 
285  if not seq:
286  seq = GaudiSequencer(name, ShortCircuit=False)
287 
288  for n in self.cfg[name]:
289  # extract entity name and type
290  algo_name = n.split("/")[1] if "/" in n else n
291 
292  if "type" in self.cfg.nodes[n]:
293  # first rely on explicit type, if given
294  algo_type = self.cfg.nodes[n].get("type")
295  else:
296  # if the type is not given explicitly, try to extract it from entity name,
297  # and, if unsuccessful, assume it is an algorithm
298  algo_type = n.split("/")[0] if "/" in n else "Algorithm"
299 
300  if algo_type in ["GaudiSequencer", "AthSequencer", "ProcessPhase"]:
301  if algo_name in ["RecoITSeq", "RecoOTSeq", "RecoTTSeq"]:
302  continue
303 
304  if n not in self.unique_sequencers:
305  self.unique_sequencers.append(n)
306  else:
307  if n not in self.dupl_seqs:
308  self.dupl_seqs[n] = 2
309  else:
310  self.dupl_seqs[n] += 1
311 
312  seq_daughter = GaudiSequencer(algo_name, OutputLevel=INFO)
313  if self.cfg.nodes[n].get("ModeOR") == "True":
314  self.OR_sequencers.append(n)
315  seq_daughter.ModeOR = True
316  # if self.cfg.nodes[n].get('Lazy') == 'False':
317  # print "Non-Lazy - ", n
318  seq_daughter.ShortCircuit = False
319  if seq_daughter not in seq.Members:
320  seq.Members += [seq_daughter]
321  # iterate deeper
322  self._generate_sequence(n, seq_daughter)
323  else:
324  # rndname = ''.join(random.choice(string.lowercase) for i in range(5))
325  # if algo_name in unique_algos: algo_name = algo_name + "-" + rndname
326  if n not in self.unique_algos:
327  self.unique_algos.append(n)
328  else:
329  if n not in self.dupl_algos:
330  self.dupl_algos[n] = 2
331  else:
332  self.dupl_algos[n] += 1
333 
334  avgRuntime, varRuntime = self.timeValue.get(algo_name)
335 
336  algo_daughter = CPUCruncher(
337  algo_name,
338  Cardinality=self.cardinality,
339  OutputLevel=self.outputLevel,
340  varRuntime=varRuntime,
341  avgRuntime=avgRuntime,
342  SleepFraction=self.sleepFraction
343  if self.BlockingBoolValue.get()
344  else 0.0,
345  Timeline=self.enableTimeline,
346  )
347 
348  self._declare_data_deps(algo_name, algo_daughter)
349 
350  if algo_daughter not in seq.Members:
351  seq.Members += [algo_daughter]
352 
353  return seq

◆ get()

def GaudiHive.precedence.CruncherSequence.get (   self)

Definition at line 257 of file precedence.py.

257  def get(self):
258 
259  return self.sequencer
260 

Member Data Documentation

◆ BlockingBoolValue

GaudiHive.precedence.CruncherSequence.BlockingBoolValue

Definition at line 195 of file precedence.py.

◆ cardinality

GaudiHive.precedence.CruncherSequence.cardinality

Definition at line 193 of file precedence.py.

◆ cfg

GaudiHive.precedence.CruncherSequence.cfg

Definition at line 198 of file precedence.py.

◆ dfg

GaudiHive.precedence.CruncherSequence.dfg

Definition at line 199 of file precedence.py.

◆ dupl_algos

GaudiHive.precedence.CruncherSequence.dupl_algos
static

Definition at line 179 of file precedence.py.

◆ dupl_seqs

GaudiHive.precedence.CruncherSequence.dupl_seqs
static

Definition at line 176 of file precedence.py.

◆ enableTimeline

GaudiHive.precedence.CruncherSequence.enableTimeline

Definition at line 201 of file precedence.py.

◆ OR_sequencers

GaudiHive.precedence.CruncherSequence.OR_sequencers
static

Definition at line 177 of file precedence.py.

◆ outputLevel

GaudiHive.precedence.CruncherSequence.outputLevel

Definition at line 203 of file precedence.py.

◆ sequencer

GaudiHive.precedence.CruncherSequence.sequencer

Definition at line 206 of file precedence.py.

◆ sleepFraction

GaudiHive.precedence.CruncherSequence.sleepFraction

Definition at line 196 of file precedence.py.

◆ timeValue

GaudiHive.precedence.CruncherSequence.timeValue

Definition at line 194 of file precedence.py.

◆ unique_algos

GaudiHive.precedence.CruncherSequence.unique_algos
static

Definition at line 178 of file precedence.py.

◆ unique_data_objects

GaudiHive.precedence.CruncherSequence.unique_data_objects
static

Definition at line 181 of file precedence.py.

◆ unique_sequencers

GaudiHive.precedence.CruncherSequence.unique_sequencers
static

Definition at line 175 of file precedence.py.


The documentation for this class was generated from the following file:
GaudiHive.precedence._buildFilePath
def _buildFilePath(filePath)
Definition: precedence.py:26
CPUCruncher
Definition: CPUCruncher.h:29
Gaudi::Functional::details::get
auto get(const Handle &handle, const Algo &, const EventContext &) -> decltype(details::deref(handle.get()))
Definition: FunctionalDetails.h:444
GaudiSequencer
Definition: GaudiSequencer.h:38