/** * @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í }
/** * @param Task $task * @param Datasource $testingDatasource * @return ScoringResult */ public function evaluateTask(Task $task, Datasource $testingDatasource) { $rulesXmlFileName = $task->taskId . '.xml'; /** @var string $rulesXmlFilePath - cesta souboru s pravidly v XML */ $rulesXmlFilePath = @$this->params['tempDirectory'] . '/' . $rulesXmlFileName; $associationRulesXmlSerializer = new AssociationRulesXmlSerializer($task->rules); $rulesXml = $associationRulesXmlSerializer->getXml()->asXML(); file_put_contents($rulesXmlFilePath, $rulesXml); $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 = []; //export jednotlivých řádků z DB a jejich otestování while ($testedRowsCount < $dbRowsCount) { $csv = CsvSerializer::prepareCsvFromDatabase($database, $dbDatasource, $testedRowsCount, self::ROWS_PER_TEST, ';', '"'); $csvFileName = $testingDatasource->datasourceId . '-' . $testedRowsCount . '-' . self::ROWS_PER_TEST . '.csv'; /** @var string $csvFilePath - cesta k CSV souboru s částí dat */ $csvFilePath = @$this->params['tempDirectory'] . '/' . $csvFileName; file_put_contents($csvFilePath, $csv); $url = $this->serverUrl . '?rulesXml=' . $this->getTempFileUrl($rulesXmlFileName) . '&dataCsv=' . $this->getTempFileUrl($csvFileName); //try{ $response = self::curlRequestResponse($url); $xml = simplexml_load_string($response); $partialResult = new ScoringResult(); $partialResult->truePositive = (string) $xml->truePositive; $partialResult->falsePositive = (string) $xml->falsePositive; $partialResult->rowsCount = (string) $xml->rowsCount; $partialResults[] = $partialResult; unset($xml); //}catch (\Exception $e){ // /*ignore error...*/ //} unlink($csvFilePath); $testedRowsCount += self::ROWS_PER_TEST; } //XXX unlink($rulesXmlFilePath); //sestavení celkového výsledku return ScoringResult::merge($partialResults); }
/** * Funkce pro připravení parametrů nového datového zdroje pro daného uživatele... * @param string $dbType * @param User $user * @param bool $ignoreCheck * @return Datasource */ public function prepareNewDatasourceForUser($dbType, User $user, $ignoreCheck = false) { $defaultDbConnection = $this->databaseFactory->getDefaultDbConnection($dbType, $user); $datasource = Datasource::newFromDbConnection($defaultDbConnection); if ($dbType == DbConnection::TYPE_UNLIMITED) { return $datasource; } if ($ignoreCheck) { return $datasource; } $this->databaseFactory->checkDatabaseAvailability($defaultDbConnection, $user); return $datasource; }
/** * Funkce pro import CSV souboru * @param string $filename * @param string $dbType * @param User $user * @param string $tableName * @param string $encoding='utf-8' * @param string $delimiter=',' * @param string $enclosure='"' * @param string $escapeCharacter='\\' * @param string $nullValue='' * @return DbDatasource * @throws \Exception */ public function importCsvFile($filename, $dbType, User $user, $tableName, $encoding = 'utf-8', $delimiter = ',', $enclosure = '"', $escapeCharacter = '\\', $nullValue = '') { $columns = $this->getColsInCSV($filename, $delimiter, $enclosure, $escapeCharacter); if (empty($columns)) { throw new \Exception('No columns detected!'); } $dataTypes = []; foreach ($columns as $column) { $dataTypes[] = $column->type == DbField::TYPE_NOMINAL ? 'nominal' : 'numeric'; } $database = $this->databaseFactory->getDatabaseInstanceWithDefaultDbConnection($dbType, $user); return $database->importCsvFile($this->getFilePath($filename), $tableName, $encoding, $delimiter, $enclosure, $escapeCharacter, $nullValue, $dataTypes); }