X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/blast.git/blobdiff_plain/0d3590739ff5a4ca9e87c052ac142f5d1d3a68ab..84eeae848c9d322ea4c935b8ec7338f69becbc10:/Graph.cpp?ds=sidebyside diff --git a/Graph.cpp b/Graph.cpp index a4dd676..eb66dc4 100644 --- a/Graph.cpp +++ b/Graph.cpp @@ -107,3 +107,68 @@ bool Graph::removeSourceBlock(FunctionalBlock *block) { sources.removeAll(block); return true; } + +bool Graph::createPatterns() { + bool ok = true; + foreach(AbstractBlock* block, sources) { + FunctionalBlock* funBlock = AB_TO_FUN(block); + ok = funBlock->createPatterns(); + if (!ok) return false; + } + + foreach(AbstractBlock* block, groups) { + GroupBlock* group = AB_TO_GRP(block); + foreach(AbstractBlock* inBlock, group->getBlocks()) { + if (inBlock->isFunctionalBlock()) { + FunctionalBlock* funBlock = AB_TO_FUN(inBlock); + ok = funBlock->createPatterns(); + if (!ok) return false; + } + } + } + return true; +} + +void Graph::resetPatternComputed() { + foreach(AbstractBlock* block, sources) { + block->setPatternComputed(false); + } + foreach(AbstractBlock* block, groups) { + GroupBlock* group = AB_TO_GRP(block); + group->setPatternComputed(false); + foreach(AbstractBlock* inBlock, group->getBlocks()) { + inBlock->setPatternComputed(false); + } + } +} + +bool Graph::computeOutputPatterns(int nbExec) { + + createPatterns(); + resetPatternComputed(); + // search for all block that are generators. + QList generators; + generators.append(sources); + foreach(AbstractBlock* block, groups) { + GroupBlock* group = AB_TO_GRP(block); + foreach(AbstractBlock* inBlock, group->getBlocks()) { + FunctionalBlock* funBlock = AB_TO_FUN(inBlock); + if ((inBlock->isFunctionalBlock()) && (inBlock->isGeneratorBlock())) { + generators.append(funBlock); + } + } + } + // search for maximum PP length + int maxPP = 0; + foreach(FunctionalBlock* block, generators) { + if (block->getProductionPatternLength() > maxPP) maxPP = block->getProductionPatternLength(); + } + // compute output for generators + int maxExecLen = maxPP*nbExec; + foreach(FunctionalBlock* block, generators) { + int d = block->getProductionPatternLength(); + block->computeOutputPattern((maxExecLen+d-1)/d); + } + // compute output for top group + topGroup->computeOutputPattern(); +}