/**
  * @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());
 }