/** * Calculates OPTIMISTIC path bound for PDP permutation * * @param \Litvinenko\Combinatorics\Pdp\Path $path * @param string $boundType * @param array $additionalInfo * * @return float */ protected function _calculateBound($path, $boundType, array $additionalInfo = array()) { $result = null; // calculates only optimistic bounds if ($boundType == self::BOUND_TYPE_OPTIMISTIC) { $result = $this->getTotalDistance($path->getPoints()); } return $result; }
/** * Stub for calculating OPTIMISTIC node bound for PDP * NEEDED $additionalInfo content: array('parent_node' => <parent node>, 'total_point_count' => <number of gererating elements used for bound calculation>) * * @param \Litvinenko\Combinatorics\Pdp\Path $path * @param string $boundType * @param array $additionalInfo * * @return float */ protected function _calculateBound(\Litvinenko\Combinatorics\Pdp\Path $path, $boundType, array $additionalInfo = array()) { $result = null; // this stub calculates only optimistic bounds if ($boundType == self::BOUND_TYPE_OPTIMISTIC) { $points = $path->getPoints(); $parentNode = $additionalInfo['parent_node']; // if parent node is empty, just return id of first point if (!$parentNode->getContent()->getPoints()) { $firstPoint = reset($points); $result = (double) $firstPoint->getId(); } else { // otherwise, return : parent bound PLUS sum: (<point 1 id> - <total_point_count>)^2 + (<point 2 id> - <total_point_count>)^2 + ... $result = $parentNode->getOptimisticBound() + 1; // we add 1 to be sure that child bound will be greater than parent one $count = $additionalInfo['total_point_count']; foreach ($points as $point) { $result += pow($count / 2 - (double) $point->getId(), 2); } } } return $result; }