/** * Dummy strategy to return as order value index of the vertex * * @param OutTree $tree * @return array */ public function optimize(OutTree $tree) { $vertices = $tree->getVerticesDescendant($tree->getVertexRoot()); $i = 0; $output = []; /** @var Vertex $vertex */ foreach ($vertices as $vertex) { $output[$vertex->getId()] = $i++; } return $output; }
/** * Build out-tree graph from defined Processes and their relations. * * @return OutTree */ public function buildTree() { if (!$this->tree) { $root = $this->graph->createVertex(0); // Create edges directed from the root node foreach ($this->processes as $processClassName => $processObject) { $vertex = $this->graph->getVertex($processClassName); if (!$processObject->delayMinutes) { // process doesn't depend on anything => link it to the root node $root->createEdgeTo($vertex)->setWeight(0); } else { // link process to its dependency // Throw error if dependency is to not existing vertex if (!$this->graph->hasVertex($processObject->delayAfter)) { throw new \InvalidArgumentException(sprintf('Testcase "%s" has @delayAfter dependency on "%s", but this testcase was not defined.', $processClassName, $processObject->delayAfter)); } $this->graph->getVertex($processObject->delayAfter)->createEdgeTo($vertex)->setWeight($processObject->delayMinutes); } } } $this->tree = new OutTree($this->graph); if (!$this->tree->isTree()) { throw new \InvalidArgumentException(sprintf('Cannot build tree graph from tests dependencies. Probably some cyclic dependency is present.')); } return $this->tree; }
/** * Optimize order of tests in given tree based on their defined delay. * The aim is to run as first processes having the longest delay of their sub-dependencies. * * @param OutTree $tree * @return array Array of [string key (= testclass fully qualified name) => int value (= test order)] */ public function optimize(OutTree $tree) { // get root node of the tree $root = $tree->getVertexRoot(); // get all root descendants vertices (without the root vertex itself) $children = $tree->getVerticesDescendant($root); // for each vertex (process) get maximum total weight of its subtree (longest distance) $subTreeMaxDistances = []; /** @var Vertex $childVertex */ foreach ($children as $childVertex) { $alg = new Dijkstra($childVertex); // get map with distances to all linked reachable vertexes $distanceMap = $alg->getDistanceMap(); // save the longest distance $subTreeMaxDistances[$childVertex->getId()] = $distanceMap ? max($distanceMap) : 0; } return $subTreeMaxDistances; }