/** * @param Task $task * @param Datasource $testingDatasource * @return ScoringResult * @throws \Exception */ public function evaluateTask(Task $task, Datasource $testingDatasource) { #region sestavení PMML a následné vytvoření scoreru $pmml = $this->prepareTaskPmml($task); $url = $this->serverUrl . '/scorer'; try { $response = self::curlRequestResponse($url, $pmml, '', ['Content-Type' => 'application/xml; charset=utf-8']); $response = Json::decode($response, Json::FORCE_ARRAY); if (@$response['code'] == 201 && !empty($response['id'])) { $scorerId = $response['id']; } else { throw new \Exception(@$response['description']); } } catch (\Exception $e) { throw new \Exception('Scorer creation failed!', 500, $e); } #endregion sestavení PMML a následné vytvoření scoreru #region postupné posílání řádků z testovací DB tabulky $database = $this->databaseFactory->getDatabaseInstance($testingDatasource->getDbConnection(), $task->miner->user); $dbDatasource = $database->getDbDatasource($testingDatasource->dbDatasourceId > 0 ? $testingDatasource->dbDatasourceId : $testingDatasource->dbTable); $dbRowsCount = $dbDatasource->size; $testedRowsCount = 0; /** @var ScoringResult[] $partialResults */ $partialResults = []; $url .= '/' . $scorerId; //export jednotlivých řádků z DB a jejich otestování while ($testedRowsCount < $dbRowsCount) { //připravení JSONu a jeho odeslání $dbValuesRows = $database->getDbValuesRows($dbDatasource, $testedRowsCount, self::ROWS_PER_TEST); $json = Json::encode($dbValuesRows->getRowsAsArray()); $response = self::curlRequestResponse($url, $json, '', ['Content-Type' => 'application/json; charset=utf-8']); $response = Json::decode($response, Json::FORCE_ARRAY); if ($response["code"] != 200) { throw new \Exception('Invalid scorer response!'); } //vytvoření objektu s výsledky $scoringResult = new EasyMinerScoringResult($response); $partialResult = $scoringResult->getScoringConfusionMatrix()->getScoringResult(true); $partialResults[] = $partialResult; //TODO tady bude v budoucnu možné doplnit zpracování celé kontingenční tabulky //připočtení řádků a uvolnění paměti unset($scoringResult); $testedRowsCount += self::ROWS_PER_TEST; } #endregion postupné posílání řádků z testovací DB tabulky #region sestavení celkového výsledku a jeho vrácení return ScoringResult::merge($partialResults); #endregion sestavení celkového výsledku a jeho vrácení }
/** * Funkce pro připojení dalších výsledků ke stávající instanci * @param EasyMinerScoringResult $scoringResult2 */ public function mergeEasyMinerScoringResult(EasyMinerScoringResult $scoringResult2) { if ($this->classificationAttribute != $scoringResult2->getClassificationAttribute()) { if ($this->classificationAttribute == "" && $scoringResult2->classificationAttribute != "") { $this->classificationAttribute = $scoringResult2->classificationAttribute; } elseif ($this->classificationAttribute != "" && $scoringResult2->classificationAttribute != "") { throw new \BadFunctionCallException('Classification attributes are different!'); } } array_push($this->rules, $scoringResult2->getRules()); $this->confusionMatrix->mergeScoringConfusionMatrix($scoringResult2->getScoringConfusionMatrix()); array_push($this->classificationResults, $scoringResult2->getClassificationResults()); }