/netfoil/index.php
PHP | 1057 lines | 953 code | 43 blank | 61 comment | 120 complexity | 11549c226040c83822a17bf085b3b162 MD5 | raw file
- <?php
- error_reporting(E_ERROR);
- function preparaString($inputTiposConstantes, $inputConceitoAlvo, $inputBK, $inputTeste) {
- /*Pegando os Tipos e as Constantes*/
- $inputTiposConstantes = str_replace("\r\n", "\n", $inputTiposConstantes);
- $inputTiposConstantes = preg_replace("/\\n{2,}/", "\n", $inputTiposConstantes);
- $inputTiposConstantes = preg_replace("/\\n*$/", "", $inputTiposConstantes);
- $inputTiposConstantes .="\n\n";
-
- /*Pegando o conceito alvo e os exemplos*/
- $inputConceitoAlvo = str_replace("\r\n", "\n", $inputConceitoAlvo);
- $inputConceitoAlvo = preg_replace("/\\n{2,}/", "\n", $inputConceitoAlvo);
- $inputConceitoAlvo = preg_replace("/\\n*$/", "", $inputConceitoAlvo);
- $inputConceitoAlvo .="\n";
-
- $inputConceitoAlvo = explode("\n.\n", $inputConceitoAlvo);
- for ($nRelacao = 0; $nRelacao < (sizeof($inputConceitoAlvo)-1); $nRelacao++ ){
- /*Separando exemplos para dividir em 2/3 - 1/3*/
- $resultado = separaExemplos($inputConceitoAlvo[$nRelacao]);
-
- $relacoes[$nRelacao] = $resultado['relacao'];
- $exemplosPos[$nRelacao] = $resultado['exemplosPos'];
- $exemplosNeg[$nRelacao] = $resultado['exemplosNeg'];
- }
-
- /*Pegando o conhecimento Preliminar BK*/
- $inputBK = str_replace("\r\n", "\n", $inputBK);
- $inputBK = preg_replace("/\\n{2,}/", "\n", $inputBK);
- $inputBK = preg_replace("/\\n*$/", "", $inputBK);
- $inputBK .="\n";
-
- /*Verificando qual a Running Option selecionada*/
- if ($inputTeste != "") {
- /*Pegando Exemplos de Teste*/
- $inputTeste = "\n" . str_replace("\r\n", "\n", $inputTeste);
- $inputTeste = preg_replace("/\\n{2,}/", "\n", $inputTeste);
- $inputTeste = preg_replace("/\\n*$/", "", $inputTeste);
- $strTesteSeparada = explode("\n.\n", $inputTeste);
- for ($nRelacao = 0; $nRelacao < sizeof($strTesteSeparada); $nRelacao++) {
- $exemplos = preg_match_all("/(\+|\-)/", $strTesteSeparada[$nRelacao], $vetorExemplosTeste);
- if ($exemplos) {
- $totalPositivo[$nRelacao] = 0;
- $totalNegativo[$nRelacao] = 0;
- foreach($vetorExemplosTeste[0] as $exemploTeste) {
- if ($exemploTeste == "+") {
- $totalPositivo[$nRelacao] ++;
- }
- else {
- $totalNegativo[$nRelacao] ++;
- }
- }
- }
- }
- }
- else {
- $totalPositivo = 0;
- $totalNegativo = 0;
- }
- return array('tipos' => $inputTiposConstantes, 'relacoes' => $relacoes, 'exemplosPos' => $exemplosPos, 'exemplosNeg' => $exemplosNeg, 'bk' => $inputBK, 'teste' => $inputTeste, 'testePos' => $totalPositivo, 'testeNeg' => $totalNegativo);
- }
-
- function separaExemplos($strConceitoAlvoSeparada) {
- $exemplosDivididos = explode("\n;\n", $strConceitoAlvoSeparada);
-
- $tempRelacaoExemplosPos = explode(")\n", $exemplosDivididos[0]);
- $relacao = $tempRelacaoExemplosPos[0] . ")";
- $exemplosPos = explode("\n", $tempRelacaoExemplosPos[1]);
- $exemplosNeg = explode("\n", $exemplosDivididos[1]);
- $resultado['relacao'] = $relacao;
- $resultado['exemplosPos'] = $exemplosPos;
- $resultado['exemplosNeg'] = $exemplosNeg;
- return $resultado;
- }
-
- function construirStrConceitoAlvo($relacoes, $exemplosPos, $exemplosNeg) {
- $inputConceitoAlvo = "";
- for ($nRelacao = 0; $nRelacao < sizeof($relacoes); $nRelacao++) {
- /*Colocando a relacao novamente*/
- $inputConceitoAlvo .= $relacoes[$nRelacao] . "\n";
- /*Colocando Exemplos Positivos*/
- $inputConceitoAlvo .= implode("\n", $exemplosPos[$nRelacao]) . "\n";
- /*Colocando ";" caso haja negativos*/
- if (sizeof($exemplosNeg) > 0) {
- $inputConceitoAlvo .= ";\n";
- }
- /*Colocando Exemplos Negativos*/
- $inputConceitoAlvo .= implode("\n", $exemplosNeg[$nRelacao]) . "\n";
- $inputConceitoAlvo .= ".\n";
- }
- return $inputConceitoAlvo;
- }
-
- function construirTesteHoldout($relacoes, $exemplosPos, $exemplosNeg) {
- /*Colocando uma linha em branco entre o BK e os Exemplos de Teste*/
- $strTeste = "\n";
- foreach ($relacoes as $numRelacao => $relacao){
- shuffle($exemplosPos[$numRelacao]);
- shuffle($exemplosNeg[$numRelacao]);
- $totalTestePos[$numRelacao] = intval(sizeof($exemplosPos[$numRelacao])/3);
- $totalTesteNeg[$numRelacao] = intval(sizeof($exemplosNeg[$numRelacao])/3);
- $vetorRelacaoTemp = explode("(", $relacao);
- $strTeste .= $vetorRelacaoTemp[0] . "\n";
- for ($i = 0; $i < $totalTestePos[$numRelacao]; $i++) {
- $strTeste .= array_pop($exemplosPos[$numRelacao]) . ": +\n";
- }
- for ($i = 0; $i < $totalTesteNeg[$numRelacao]; $i++) {
- $strTeste .= array_pop($exemplosNeg[$numRelacao]) . ": -\n";
- }
- $strTeste .= ".\n";
- }
- $strTeste = preg_replace("/\\n$/", "", $strTeste);
- return array('exemplosPos' => $exemplosPos, 'exemplosNeg' => $exemplosNeg, 'strTeste' => $strTeste, 'testeNeg' => $totalTesteNeg, 'testePos' => $totalTestePos);
- }
-
- function construirTesteKFold($relacoes, $exemplosPos, $exemplosNeg, $k, $kAtual, $arrayPosNeg, $leaveOneOut = false) {
- $strTeste = "\n";
- foreach ($relacoes as $numRelacao => $relacao){
- $totalExemplos = sizeof($arrayPosNeg[$numRelacao]);
- if ($kAtual < ($k-1) || $leaveOneOut) {
- $tamanhoFold[$numRelacao] = intval($totalExemplos / $k);
- $offset = $tamanhoFold[$numRelacao] * $kAtual;
- }
- else {
- $tamanhoFold[$numRelacao] = intval($totalExemplos / $k);
- $offset = $tamanhoFold[$numRelacao] * $kAtual;
- $tamanhoFold[$numRelacao] = intval($totalExemplos / $k) + ($totalExemplos % $k);
- }
- $vetorRelacaoTemp = explode("(", $relacao);
- $strTeste .= $vetorRelacaoTemp[0] . "\n";
- $totalTesteNeg[$numRelacao] = 0;
- $totalTestePos[$numRelacao] = 0;
- for ($i = $offset; $i < ($tamanhoFold[$numRelacao] + $offset); $i++) {
- if ($arrayPosNeg[$numRelacao][$i]['tipo'] == '+') {
- unset($exemplosPos[$numRelacao][$arrayPosNeg[$numRelacao][$i]['indice']]);
- $strTeste .= $arrayPosNeg[$numRelacao][$i]['exemplo'] . ": +\n";
- $totalTestePos[$numRelacao]++;
- }
- else {
- unset($exemplosNeg[$numRelacao][$arrayPosNeg[$numRelacao][$i]['indice']]);
- $strTeste .= $arrayPosNeg[$numRelacao][$i]['exemplo'] . ": -\n";
- $totalTesteNeg[$numRelacao]++;
- }
- }
-
- $strTeste .= ".\n";
- }
- $strTeste = preg_replace("/\\n$/", "", $strTeste);
- return array('exemplosPos' => $exemplosPos, 'exemplosNeg' => $exemplosNeg, 'strTeste' => $strTeste, 'testeNeg' => $totalTesteNeg, 'testePos' => $totalTestePos);
- }
-
- function executaFoil($arrayArquivo) {
- $strArquivo = $arrayArquivo['tipos'];
- $strArquivo .= construirStrConceitoAlvo($arrayArquivo['relacoes'], $arrayArquivo['exemplosPos'], $arrayArquivo['exemplosNeg']);
- $strArquivo .= $arrayArquivo['bk'];
- $strArquivo .= $arrayArquivo['teste'];
-
- if ($strArquivo != "") {
- $strArquivo.="\n";
- $arquivo = fopen('./foil/arquivo_entrada.d', 'wb');
- fwrite($arquivo, $strArquivo);
- fclose($arquivo);
- }
- else {
- escreveErro("VocЖ nсo digitou nenhuma entrada!");
- die();
- }
- $chamada_FOIL = "./foil/foil6";
- $parametros = "";
- $arquivoEntrada = "./foil/arquivo_entrada.d";
-
- $parametros = trataParametros();
-
- if ($parametros != "erro") {
- $chamadaCompleta = $chamada_FOIL . $parametros . " <" . $arquivoEntrada;
- $output_FOIL = shell_exec($chamadaCompleta);
- $output_FOIL = str_replace("\n", "<br/>", $output_FOIL);
- unlink($arquivoEntrada);
- }
- if ($output_FOIL != "") {
- /*Pegando o numero de exemplos de teste positivos e negativos*/
- $totalTestePos = $arrayArquivo['testePos'];
- $totalTesteNeg = $arrayArquivo['testeNeg'];
- /*Pegando resposta do Teste para calcular medidas de Performance*/
- $testeRealizado = preg_match_all("/Test relation.*Summary: [0-9]* (errors|error) in [0-9]* (trials|trial)/", $output_FOIL, $vetorResultadoTestes);
- if ($testeRealizado) {
- $testesRelacoes = explode("<br/><br/>",$vetorResultadoTestes[0][0]);
- $i = 0;
- foreach($testesRelacoes as $testeRelacao) {
- $negativoFalso = 0;
- $positivoFalso = 0;
- /*Calculando a Acurрcia*/
- preg_match_all("/Summary: ([0-9]*) (errors|error) in ([0-9]*) (trials|trial)/", $testeRelacao, $vetorAcuracia);
- $acertos = $vetorAcuracia[3][0] - $vetorAcuracia[1][0];
- $total = $vetorAcuracia[3][0];
- $acuracia = $acertos / $total;
-
- /*Pegando o numero de erros por classe (+ e -)*/
- $falhas = preg_match_all("/(\+|\-)/", $testeRelacao, $vetorErrosTeste);
- if ($falhas) {
- foreach($vetorErrosTeste[0] as $erroExemplo) {
- if ($erroExemplo == "+") {
- $negativoFalso ++;
- }
- else {
- $positivoFalso ++;
- }
- }
- }
- $positivosVerdadeiros = $totalTestePos[$i] - $negativoFalso;
- /*Calculando Sensibilidade*/
- if ($totalTestePos[$i] != 0) {
- $sensibilidade = $positivosVerdadeiros/$totalTestePos[$i];
- $strSensibilidade = "Sensibilidade: " . number_format($sensibilidade, 3, ",", ".");
- }
- else {
- $strSensibilidade = "Nсo ж possьvel calcular a Sensibilidade.";
- }
- /*Calculando Especificidade*/
- if ($totalTesteNeg[$i] != 0) {
- $especificidade = ($totalTesteNeg[$i] - $positivoFalso)/$totalTesteNeg[$i];
- $strEspecificidade = "Especificidade: " . number_format($especificidade, 3, ",", ".");
- }
- else {
- $strEspecificidade = "Nсo ж possьvel calcular a Especificidade.";
- }
- /*Calculando Precisao*/
- if ($positivosVerdadeiros + $positivoFalso != 0) {
- $precisao = $positivosVerdadeiros/($positivosVerdadeiros + $positivoFalso);
- $strPrecisao = "Precisсo: " . number_format($precisao, 3, ",", ".");
- }
- else {
- $strPrecisao = "Nсo ж possьvel calcular a Precisсo.";
- }
- $output_FOIL = str_replace($testeRelacao, $testeRelacao . "<br /> Total de Positivos de Teste: " . $totalTestePos[$i] .
- "<br /> Total de Negativos de Teste: " . $totalTesteNeg[$i] .
- "<br /> NЩmero de Positivos Falsos: " . $positivoFalso .
- "<br /> NЩmero de Negativos Falsos: " . $negativoFalso .
- "<br/ > Acurрcia: " . number_format($acuracia, 3, ",", ".") .
- "<br/ >" . $strSensibilidade .
- "<br/ >" . $strEspecificidade .
- "<br/ >" . $strPrecisao , $output_FOIL);
- $i++;
- }
- }
- /*$output_FOIL = str_replace("tuples that are both positive and negative", "tuplas que sсo tanto positivas quanto negativas", $output_FOIL);
- $output_FOIL = str_replace("Options", "Opушes Selecionadas", $output_FOIL);
- $output_FOIL = str_replace("verbosity level", "Nьvel de detalhamento da Saьda - ", $output_FOIL);
- $output_FOIL = str_replace("minimum clause accuracy", "Acurрcia Mьnima - ", $output_FOIL);
- $output_FOIL = str_replace("no negated literals", "Literais negados nсo utilizados", $output_FOIL);
- $output_FOIL = str_replace("negated literals only for =, > relations", "Literais negados : Apenas relaушes de Diferenуa", $output_FOIL);
- $output_FOIL = str_replace("allow up to", "Permitir atж", $output_FOIL);
- $output_FOIL = str_replace("variables", "variрvel(s)", $output_FOIL);
- $output_FOIL = str_replace("or use smaller sample of negative tuples", "ou use uma amostra menor de tuplas negativas", $output_FOIL);
- $output_FOIL = str_replace("sample", "Utilizando uma amostra de", $output_FOIL);
- $output_FOIL = str_replace("of negative tuples", "de tuplas negativas", $output_FOIL);
- $output_FOIL = str_replace("maximum variable depth", "Profundidade mрxima das variрveis - ", $output_FOIL);
- $output_FOIL = str_replace("maximum", "Mрximo de", $output_FOIL);
- $output_FOIL = str_replace("consecutive weak literals", "literais fracos consecutivos", $output_FOIL);
- $output_FOIL = str_replace("backups from one literal", "backups de um literal", $output_FOIL);
- $output_FOIL = str_replace("total backups", "backups totais", $output_FOIL);
- $output_FOIL = str_replace("backed-up literals have", "Literais alternativos tem", $output_FOIL);
- $output_FOIL = str_replace("of best gain", "de melhor ganho", $output_FOIL);
- $output_FOIL = str_replace("use determinate literals when gain <=", "Use literais determinantes quando ganho <=", $output_FOIL);
- $output_FOIL = str_replace("possible", "possьvel", $output_FOIL);
- $output_FOIL = str_replace("Relation", "Relaусo", $output_FOIL);
- $output_FOIL = str_replace("[January 1996]", "", $output_FOIL);
- $output_FOIL = str_replace("Time", "Tempo", $output_FOIL);
- $output_FOIL = str_replace("secs", "segundos", $output_FOIL);
- $output_FOIL = str_replace("Training Set Size will exceed tuple limit", "O tamanho do conjunto de treinamento excede o limite do nЩmero de Tuplas", $output_FOIL);
- $output_FOIL = str_replace("Rerun with larger", "Rode novamente com um nЩmero maior de", $output_FOIL);
- $output_FOIL = str_replace("to proceed further", "para prosseguir", $output_FOIL);
- $output_FOIL = str_replace("negative tuples", "tuplas negativas", $output_FOIL);
- $output_FOIL = str_replace("positive tuples", "tuplas positivas", $output_FOIL);
- $output_FOIL = str_replace("negative tuple", "tupla negativa", $output_FOIL);
- $output_FOIL = str_replace("positive tuple", "tupla positiva", $output_FOIL);
- $output_FOIL = str_replace("warning", "Aviso", $output_FOIL);
- $output_FOIL = str_replace("contains", "Contжm", $output_FOIL);
- $output_FOIL = str_replace("duplicate", "duplicatas de", $output_FOIL);
- $output_FOIL = str_replace("tuples", "tuplas", $output_FOIL);
- $output_FOIL = str_replace("Test relation", "Teste da Relaусo", $output_FOIL);
- $output_FOIL = str_replace("Summary", "Resumo", $output_FOIL);
- $output_FOIL = str_replace("error in", "classificaусo errada num total de", $output_FOIL);
- $output_FOIL = str_replace("trials", "exemplos de teste", $output_FOIL);
- $output_FOIL = str_replace("Warning: the following definition", "Aviso: Esta definiусo", $output_FOIL);
- $output_FOIL = str_replace("does not cover", "nсo cobre", $output_FOIL);
- $output_FOIL = str_replace("in the relation", "na relaусo", $output_FOIL);*/
- return $output_FOIL;
- }
- else {
- escreveErro("Xi... Um erro desconhecido aconteceu...");
- die();
- }
- }
-
- function escreveErro($erro) {
- ?>
- <h2 class="tituloErro">Opa! Um erro ocorreu...</h2>
- <div class="divErro">
- <p>
- <?php echo $erro;?>
- </p>
- <p>
- Por favor, <a href="/netfoil" class="aCorpo">volte e tente novamente!</a>
- </p>
- </div>
- <?php
- }
-
- function trataParametros() {
- $parametros = "";
-
- switch($_POST['selectClausulasNegativas']) {
- case 'sim':
- break;
-
- case 'diferenca':
- $parametros .= ' -N';
- break;
-
- case 'nao':
- $parametros .= ' -n';
- break;
- }
-
- $parametros .= ' -v' . $_POST['selectVerbosityLevel'];
-
- if ($_POST['inputNumeroVariaveis'] != "") {
- if (is_numeric($_POST['inputNumeroVariaveis'])) {
- $parametros .= ' -V' . $_POST['inputNumeroVariaveis'];
- }
- else {
- escreveErro("O NЩmero Mрximo de Variрveis estр incorreto.");
- return "erro";
- }
- }
-
- if ($_POST['inputPorcentagemClausulasNegativas'] != "") {
- if (is_numeric($_POST['inputPorcentagemClausulasNegativas']) && $_POST['inputPorcentagemClausulasNegativas'] >= 0 && $_POST['inputPorcentagemClausulasNegativas'] <= 100) {
- $parametros .= ' -s' . $_POST['inputPorcentagemClausulasNegativas'];
- }
- else {
- escreveErro("A Porcentagem de Clрusulas Negativas deve ser um valor entre 0 e 100.");
- return "erro";
- }
- }
-
- if ($_POST['inputNumeroTuplas'] != "") {
- if (is_numeric($_POST['inputNumeroTuplas'])) {
- $parametros .= ' -m' . $_POST['inputNumeroTuplas'];
- }
- else {
- escreveErro("O NЩmero Mрximo de Tuplas estр incorreto.");
- return "erro";
- }
- }
-
- if ($_POST['inputLimiteProfundidade'] != "") {
- if (is_numeric($_POST['inputLimiteProfundidade'])) {
- $parametros .= ' -d' . $_POST['inputLimiteProfundidade'];
- }
- else {
- escreveErro("O Limite Mрximo de Profundidade das Variрveis estр incorreto.");
- return "erro";
- }
- }
-
- if ($_POST['inputLiteraisFracos'] != "") {
- if (is_numeric($_POST['inputLiteraisFracos'])) {
- $parametros .= ' -w' . $_POST['inputLiteraisFracos'];
- }
- else {
- escreveErro("O Tamanho Mрximo da SeqЧencia de Literais Fracos estр incorreto.");
- return "erro";
- }
- }
-
- if ($_POST['inputAcuraciaMinima'] != "") {
- if (is_numeric($_POST['inputAcuraciaMinima']) && $_POST['inputAcuraciaMinima'] >= 0 && $_POST['inputAcuraciaMinima'] <= 100) {
- $parametros .= ' -a' . $_POST['inputAcuraciaMinima'];
- }
- else {
- escreveErro("A Acurрcia Mьnima deve ser um valor entre 0 e 100.");
- return "erro";
- }
- }
-
- if ($_POST['inputLimiteAlternativas'] != "") {
- if (is_numeric($_POST['inputLimiteAlternativas'])) {
- $parametros .= ' -l' . $_POST['inputLimiteAlternativas'];
- }
- else {
- escreveErro("O Limite de Alternativas estр incorreto.");
- return "erro";
- }
- }
-
- if ($_POST['inputLimiteCheckpoints'] != "") {
- if (is_numeric($_POST['inputLimiteCheckpoints'])) {
- $parametros .= ' -t' . $_POST['inputLimiteCheckpoints'];
- }
- else {
- escreveErro("O NЩmero Mрximo de Checkpoints estр incorreto.");
- return "erro";
- }
- }
-
- if ($_POST['inputGanhoMinimo'] != "") {
- if (is_numeric($_POST['inputGanhoMinimo']) && $_POST['inputGanhoMinimo'] >= 0 && $_POST['inputGanhoMinimo'] <= 100) {
- $parametros .= ' -f' . $_POST['inputGanhoMinimo'];
- }
- else {
- escreveErro("O Ganho Mьnimo deve ser um valor entre 0 e 100.");
- return "erro";
- }
- }
-
- if ($_POST['inputGanhoPossivel'] != "") {
- if (is_numeric($_POST['inputGanhoPossivel']) && $_POST['inputGanhoPossivel'] >= 0 && $_POST['inputGanhoPossivel'] <= 100) {
- $parametros .= ' -g' . $_POST['inputGanhoPossivel'];
- }
- else {
- escreveErro("A ┌ltima Opусo deve ser um valor entre 0 e 100.");
- return "erro";
- }
- }
-
- return $parametros;
- }
- ?>
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
- <html>
- <head>
- <meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
- <link href="./estilo.css" type="text/css" rel="stylesheet"/>
- <script type="text/javascript" src="./javascript.js"></script>
- <title>
- NetFoil - Um sistema de Aprendizado Online
- </title>
- </head>
- <body onload="javascript:inicio();">
- <div id="divSite">
- <div id="divCabecalho">
- <a href="/netfoil">
- <img src="./imagens/netfoilpequeno.png" alt="Logo NetFoil" title="NetFoil - Um sistema de Aprendizado Online" />
- </a>
- <h1>
- Sistema de Aprendizado Online
- </h1>
- </div>
- <div id="divPrincipal">
- <div id="divSuperior">
- </div>
- <div id="divCentral">
- <?php
- if ($_POST) {
- if ($_POST['radioInput'] == 'arquivo') {
- $arquivo = $_FILES['inputArquivo'];
- $arquivoTeste = $_FILES['inputArquivoTeste'];
- $strTipos = "";
- $strConceitoAlvo = "";
- $strBK = "";
- if ($arquivo['name'] != '' && $arquivo['size'] > 0) {
- move_uploaded_file($arquivo['tmp_name'], './foil/arquivo_temporario1.d');
-
- if($arquivoTemp = fopen('./foil/arquivo_temporario1.d', 'rb')) {
- $strTemp = fread($arquivoTemp, filesize('./foil/arquivo_temporario1.d'));
- fclose($arquivoTemp);
- unlink('./foil/arquivo_temporario1.d');
- }
- $arrayEntrada = explode("\n\n", $strTemp);
-
- $strTipos = $arrayEntrada[0];
- $arrayRelacoes = explode("\n.\n", $arrayEntrada[1]);
- array_pop($arrayRelacoes);
-
- foreach($arrayRelacoes as $relacao) {
- if (preg_match("/^\*.*/", $relacao)) {
- $strBK .= $relacao . "\n.\n";
- }
- else {
- $strConceitoAlvo .= $relacao . "\n.\n";
- }
- }
- }
- else {
- escreveErro("VocЖ nсo enviou nenhum arquivo!");
- die();
- }
- $strTeste = "";
- if ($_POST['inputDivisaoFolds'] == 'comexemplo') {
- if ($arquivoTeste['name'] != '' && $arquivoTeste['size'] > 0) {
- move_uploaded_file($arquivoTeste['tmp_name'], './foil/arquivo_temporario2.d');
-
- if($arquivoTemp = fopen('./foil/arquivo_temporario2.d', 'rb')) {
- $strTeste = fread($arquivoTemp, filesize('./foil/arquivo_temporario2.d'));
- fclose($arquivoTemp);
- unlink('./foil/arquivo_temporario2.d');
- }
- }
- else {
- escreveErro("VocЖ nсo enviou nenhum arquivo de teste!");
- die();
- }
- }
-
- $arrayArquivo = preparaString($strTipos, $strConceitoAlvo, $strBK, $strTeste);
- }
- else {
- //TODO Tirar enter do inicio da string
- if ($_POST['radioInput'] == 'manual') {
- $strTeste = isset($_POST['textareaInputManualTeste']) ? $_POST['textareaInputManualTeste'] : "";
- $arrayArquivo = preparaString($_POST['textareaInputManualTiposConstantes'], $_POST['textareaInputManualConceitoAlvo'], $_POST['textareaInputManualBK'], $strTeste);
- }
- }
-
- $divisaoFolds = $_POST['inputDivisaoFolds'];
- switch($divisaoFolds) {
- case "semexemplo":
- $output_FOIL = executaFoil($arrayArquivo);
- ?>
- <h1 class="tituloResultado">Resultado obtido</h1>
- <p class="pResultadoObtido">
- <?php echo $output_FOIL;?>
- </p>
- <?php
- break;
- case "comexemplo":
- $output_FOIL = executaFoil($arrayArquivo);
- ?>
- <h1 class="tituloResultado">Resultado obtido</h1>
- <p class="pResultadoObtido">
- <?php echo $output_FOIL;?>
- </p>
- <?php
- break;
- case "holdout":
- $resultado = construirTesteHoldout($arrayArquivo['relacoes'], $arrayArquivo['exemplosPos'], $arrayArquivo['exemplosNeg']);
- $arrayArquivo['exemplosPos'] = $resultado['exemplosPos'];
- $arrayArquivo['exemplosNeg'] = $resultado['exemplosNeg'];
- $arrayArquivo['teste'] = $resultado['strTeste'];
- $arrayArquivo['testeNeg'] = $resultado['testeNeg'];
- $arrayArquivo['testePos'] = $resultado['testePos'];
- $output_FOIL = executaFoil($arrayArquivo);
- ?>
- <h1 class="tituloResultado">Resultado obtido</h1>
- <p class="pResultadoObtido">
- <?php echo $output_FOIL;?>
- </p>
- <?php
- break;
- case "kfold":
- $k = $_POST['inputK'];
- if (!is_numeric($k) || $k <= 1) {
- escreveErro("Valor invрlido para K");
- die();
- }
- $arrayPosNeg = array();
- foreach($arrayArquivo['relacoes'] as $chave => $relacao) {
- for ($i = 0; $i < sizeof($arrayArquivo['exemplosPos'][$chave]); $i++) {
- $arrayPosNeg[$chave][$i] = array('exemplo' => $arrayArquivo['exemplosPos'][$chave][$i], 'tipo' => '+', 'indice' => $i);
- }
- for ($i = 0; $i < sizeof($arrayArquivo['exemplosNeg'][$chave]); $i++) {
- $arrayPosNeg[$chave][$i + sizeof($arrayArquivo['exemplosPos'][$chave])] = array('exemplo' => $arrayArquivo['exemplosNeg'][$chave][$i], 'tipo' => '-', 'indice' => $i);
- }
- shuffle($arrayPosNeg[$chave]);
- }
-
- for ($i = 0; $i < $k; $i++){
- $resultado = construirTesteKFold($arrayArquivo['relacoes'], $arrayArquivo['exemplosPos'], $arrayArquivo['exemplosNeg'], $k, $i, $arrayPosNeg);
- $arrayArquivoTemp = $arrayArquivo;
- $arrayArquivoTemp['exemplosPos'] = $resultado['exemplosPos'];
- $arrayArquivoTemp['exemplosNeg'] = $resultado['exemplosNeg'];
- $arrayArquivoTemp['teste'] = $resultado['strTeste'];
- $arrayArquivoTemp['testeNeg'] = $resultado['testeNeg'];
- $arrayArquivoTemp['testePos'] = $resultado['testePos'];
- $output_FOIL = executaFoil($arrayArquivoTemp);
- ?>
- <h1 class="tituloResultado">Resultado obtido no experimento K = <?php echo ($i+1);?></h1>
- <p class="pResultadoObtido">
- <?php echo $output_FOIL;?>
- </p>
- <?php
- }
- break;
- case "leaveoneout":
- $arrayPosNeg = array();
- foreach($arrayArquivo['relacoes'] as $chave => $relacao) {
- for ($i = 0; $i < sizeof($arrayArquivo['exemplosPos'][$chave]); $i++) {
- $arrayPosNeg[$chave][$i] = array('exemplo' => $arrayArquivo['exemplosPos'][$chave][$i], 'tipo' => '+', 'indice' => $i);
- }
- for ($i = 0; $i < sizeof($arrayArquivo['exemplosNeg'][$chave]); $i++) {
- $arrayPosNeg[$chave][$i + sizeof($arrayArquivo['exemplosPos'][$chave])] = array('exemplo' => $arrayArquivo['exemplosNeg'][$chave][$i], 'tipo' => '-', 'indice' => $i);
- }
- shuffle($arrayPosNeg[$chave]);
- }
- if (sizeof($arrayPosNeg) != 1) {
- escreveErro("Sз ж possьvel utilizar o mжtodo Leave One Out com uma relaусo alvo.");
- die();
- }
- $k = sizeof($arrayPosNeg[0]);
-
- for ($i = 0; $i < $k; $i++){
- $resultado = construirTesteKFold($arrayArquivo['relacoes'], $arrayArquivo['exemplosPos'], $arrayArquivo['exemplosNeg'], $k, $i, $arrayPosNeg, true);
- $arrayArquivoTemp = $arrayArquivo;
- $arrayArquivoTemp['exemplosPos'] = $resultado['exemplosPos'];
- $arrayArquivoTemp['exemplosNeg'] = $resultado['exemplosNeg'];
- $arrayArquivoTemp['teste'] = $resultado['strTeste'];
- $arrayArquivoTemp['testeNeg'] = $resultado['testeNeg'];
- $arrayArquivoTemp['testePos'] = $resultado['testePos'];
- $output_FOIL = executaFoil($arrayArquivoTemp);
- ?>
- <h1 class="tituloResultado">Resultado obtido no experimento K = <?php echo ($i+1);?></h1>
- <p class="pResultadoObtido">
- <?php echo $output_FOIL;?>
- </p>
- <?php
- }
- break;
- }
- }
- else {
- ?>
- <form id="formPrincipal" method="post" action="" enctype="multipart/form-data">
- <fieldset id="fieldsetEscolhaInput">
- <legend>
- Escolha de input
- </legend>
- <div class="divRadioEscolhaInput">
- <input id="radioInputArquivo" name="radioInput" type="radio" value="arquivo" onclick="javascript:exibeInput('arquivo');" />
- <label id="labelInputArquivo" for="radioInputArquivo" onclick="javascript:exibeInput('arquivo');">Envio de Arquivo</label>
- </div>
- <div class="divRadioEscolhaInput">
- <input id="radioInputManual" name="radioInput" type="radio" value="manual" onclick="javascript:exibeInput('manual');" />
- <label id="labelInputManual" for="radioInputManual" onclick="javascript:exibeInput('manual');">Entrada Manual</label>
- </div>
- </fieldset>
- <!-- DIV PEDINDO SELECAO DE INPUT -->
- <div id="divExplicacao">
- <p>
- Bem vindo ao NetFoil!
- </p>
- <p>
- Por favor, selecione um mжtodo de entrada de dados acima para continuar...
- </p>
- </div>
- <!-- FIELDSET DE INPUT DE ARQUIVO -->
- <fieldset id="fieldsetInputArquivo">
- <legend>
- Escolha de Arquivo
- </legend>
- <div id="divEscolhaArquivo">
- <label class="labelEscolhaArquivo">Escolha o arquivo</label>
- <input type="file" name="inputArquivo" />
- </div>
- </fieldset>
- <!-- FIELDSET DE INPUT MANUAL -->
- <fieldset id="fieldsetInputManual">
- <legend>
- Entrada Manual
- </legend>
- <p id="pExplicacaoEntradaManual">
- Aqui vai entrar uma explicaусo sobre a formataусo do arquivo de entrada...
- </p>
- <div class="divEntradaManual">
- <label id="labelEntradaManualTiposConstantes" class="labelEntradaManual" for="textareaInputManualTiposConstantes">Tipos e Constantes</label>
- <div class="divExplicacaoOculta" id="divExplicacaoOcultaEspecial1">
- <div class="divTextoExplicacaoOculta">
- <p>
- Formato:
- </p>
- <p>
- Tipo1: constante1, constante2, constante3, ..., constanteN.
- </p>
- <p>
- Tipo2: constante1, constante2, constante3, ..., constanteN.
- </p>
- </div>
- </div>
- <textarea rows="5" cols="80" name="textareaInputManualTiposConstantes" id="textareaInputManualTiposConstantes"></textarea>
- </div>
-
- <div class="divEntradaManual">
- <label id="labelEntradaManualExemplos" class="labelEntradaManual" for="textareaInputManualConceitoAlvo">Conceito Alvo e Exemplos</label>
- <div class="divExplicacaoOculta" id="divExplicacaoOcultaEspecial2">
- <div class="divTextoExplicacaoOculta">
- <p>
- Formato:
- </p>
- <p>
- Conceito1(TipoA,TipoB)
- </p>
- <p>
- constanteTipoA1,constanteTipoB1,
- </p>
- <p>
- constanteTipoA2,constanteTipoB2
- </p>
- <p>
- ;
- </p>
- <p>
- constanteTipoA3,constanteTipoB3,
- </p>
- <p>
- constanteTipoA4,constanteTipoB4
- </p>
- <p>
- .
- </p>
- <p>
- Os dois primeiros exemplos sсo positivos(antes de "<strong>;</strong>"-<strong>ponto e vьrgula</strong>) e os dois Щltimos sсo negativos.
- </p>
- <p>
- Pode-se aprender mais de um conceito de uma sз vez.
- </p>
- </div>
- </div>
- <textarea rows="10" cols="80" name="textareaInputManualConceitoAlvo" id="textareaInputManualConceitoAlvo"></textarea>
- </div>
-
- <div class="divEntradaManual">
- <label class="labelEntradaManual" id="labelEntradaManualBK" for="textareaInputManualBK">Conhecimento Preliminar</label>
- <div class="divExplicacaoOculta" id="divExplicacaoOcultaEspecial3">
- <div class="divTextoExplicacaoOculta">
- <p>
- Formato:
- </p>
- <p>
- *Predicado(Tipo1,Tipo2) #-
- </p>
- <p>
- constanteTipo1,constanteTipo2
- </p>
- <p>
- constanteTipo1,constanteTipo2
- </p>
- <p>
- .
- </p>
- <p>
- A <strong>#</strong> informa que a variрvel de Tipo1 ж de entrada e o <strong>-</strong> significa que a variрvel de Tipo 2 pode ser tanto de entrada como de saьda.
- </p>
- <p>
- Pode-se colocar quantos predicados forem necessрrios no Conhecimento Preliminar.
- </p>
- </div>
- </div>
- <textarea rows="10" cols="80" name="textareaInputManualBK" id="textareaInputManualBK"></textarea>
- </div>
- </fieldset>
- <!-- FIELDSET DE OPCOES -->
- <fieldset id="fieldsetOpcoes">
- <legend>
- Escolha de Opушes
- </legend>
- <!-- RUNNING OPTIONS -->
- <div class="divOpcao">
- <label class="labelOpcao">
- Divisсo do conjunto de Exemplos para teste:
- </label>
- <div class="divDivisaoFolds">
- <input type="radio" name="inputDivisaoFolds" id="inputDivisaoFoldsSemExemplo" value="semexemplo" onclick="javascript:controlaVisibilidadeTeste(this);"/>
- <label class="labelDivisaoFolds" for="inputDivisaoFoldsSemExemplo" onclick="javascript:controlaVisibilidadeTeste(this);">
- Nсo Testar
- </label>
- </div>
- <div class="divDivisaoFolds" id="divDivisaoFoldsComExemplo">
- <input type="radio" name="inputDivisaoFolds" id="inputDivisaoFoldsComExemplo" value="comexemplo" onclick="javascript:controlaVisibilidadeTeste(this);" />
- <label class="labelDivisaoFolds" for="inputDivisaoFoldsComExemplo" onclick="javascript:controlaVisibilidadeTeste(this);" >
- Testar utilizando outros exemplos
- </label>
- <!-- INPUT MANUAL DE EXEMPLOS -->
- <div id="divInputManualTeste">
- <label class="labelEntradaManual" for="textareaInputManualTeste">Exemplos de Teste</label>
- <textarea rows="5" cols="75" name="textareaInputManualTeste" id="textareaInputManualTeste"></textarea>
- </div>
- <!-- INPUT ARQUIVO DE EXEMPLOS -->
- <div id="divInputArquivoTeste">
- <label class="labelEscolhaArquivoTeste" for="inputArquivoTeste">Exemplos de Teste</label>
- <input type="file" name="inputArquivoTeste" id="inputArquivoTeste" />
- </div>
- </div>
- <div class="divDivisaoFolds" id="divDivisaoFoldsKFold">
- <input type="radio" name="inputDivisaoFolds" id="inputDivisaoFoldsKFold" value="kfold" onclick="javascript:controlaVisibilidadeTeste(this);"/>
- <label class="labelDivisaoFolds" for="inputDivisaoFoldsKFold" onclick="javascript:controlaVisibilidadeTeste(this);">
- Utilizar K-Fold Cross Validation
- </label>
- <!-- INPUT NUMERO FOLDS -->
- <div id="divInputKFold">
- <label class="labelOpcao" for="inputK">N║ de Folds</label>
- <input type="text" name="inputK" id="inputK" />
- </div>
- </div>
- <div class="divDivisaoFolds">
- <input type="radio" name="inputDivisaoFolds" id="inputDivisaoFoldsHoldOut" value="holdout" onclick="javascript:controlaVisibilidadeTeste(this);"/>
- <label class="labelDivisaoFolds" for="inputDivisaoFoldsHoldOut" onclick="javascript:controlaVisibilidadeTeste(this);">
- Utilizar HoldOut
- </label>
- </div>
- <div class="divDivisaoFolds">
- <input type="radio" name="inputDivisaoFolds" id="inputDivisaoFoldsLeaveOneOut" value="leaveoneout" onclick="javascript:controlaVisibilidadeTeste(this);"/>
- <label class="labelDivisaoFolds" for="inputDivisaoFoldsLeaveOneOut" onclick="javascript:controlaVisibilidadeTeste(this);">
- Utilizar Leave one Out
- </label>
- </div>
- </div>
- <div class="divOpcao">
- <label class="labelOpcao">
- Considerar clрusulas negativas?
- </label>
- <select name="selectClausulasNegativas">
- <option value="sim">
- Sim, todas.
- </option>
- <!-- Corresponde ao argumento -N -->
- <option value="diferenca">
- Sim, mas somente clрusulas de diferenуa.
- </option>
- <!-- Corresponde ao argumento -n -->
- <option value="nao">
- Nсo, nenhuma.
- </option>
- </select>
- <div class="divExplicacaoOculta">
- <div class="divTextoExplicacaoOculta">
- <p>
- Possьveis escolhas e seus significados:
- </p>
- <ul id="listaDicaOpcao1">
- <li>
- <strong>Sim, todas.</strong> - Todas as clрusulas negativas serсo consideradas pelo algoritmo FOIL.
- </li>
- <li>
- <strong>Sim, mas somente clрusulas de diferenуa.</strong> - Somente clрusulas do tipo A<>B ou A<>constante serсo consideradas.
- </li>
- <li>
- <strong>Nсo, nenhuma.</strong> - Nenhuma clрusula negativa ou de diferenуa serр considerada.
- </li>
- </ul>
- </div>
- </div>
- </div>
- <div class="divOpcao">
- <label class="labelOpcao">
- Nьvel de detalhamento da saьda
- </label>
- <select name="selectVerbosityLevel">
- <!-- Corresponde ao argument -vNUMEROESCOLHIDO -->
- <?php
- for ($i = 0; $i <= 4; $i++) {
- ?>
- <option value="<?php echo $i;?>">
- <?php echo $i;?>
- </option>
- <?php
- }
- ?>
- </select>
- <div class="divExplicacaoOculta">
- <div class="divTextoExplicacaoOculta">
- <p>
- O <strong>Nьvel de Detalhamento da Saьda</strong> indica o quсo explicativa sobre os passos do algoritmo e suas decisшes serр a saьda gerada.
- </p>
- <p>
- Quanto mais alto o Nьvel, mais detalhes sobre os passos do algoritmo serсo exibidos.
- </p>
- </div>
- </div>
- </div>
- <div class="divOpcao">
- <label class="labelOpcao">
- NЩmero mрximo de variрveis
- </label>
- <!-- Corresponde ao argumento -VNUMEROESCOLHIDO -->
- <input id="inputNumeroVariaveis" name="inputNumeroVariaveis" type="text" maxlength="20" />
- <div class="divExplicacaoOculta">
- <div class="divTextoExplicacaoOculta">
- <p>
- Define o <strong>NЩmero Mрximo de Variрveis</strong> que pode ser utilizado pelo algoritmo na busca por uma definiусo.
- </p>
- <p>
- <i>Valor default: 52.</i>
- </p>
- </div>
- </div>
- </div>
- <div class="divOpcao">
- <label class="labelOpcao">
- Considerar apenas uma porcentagem de clрusulas negativas?
- </label>
- <input id="inputPorcentagemClausulasNegativas" name="inputPorcentagemClausulasNegativas" maxlength="3" />
- <div class="divExplicacaoOculta">
- <div class="divTextoExplicacaoOculta">
- <p>
- Ao utilizar a <strong>Hipзtese do Mundo Fechado</strong> em alguns aprendizados, muitas clрusulas negativas podem ser geradas. Esta opусo faz com que somente uma porcentagem de clрusulas negativas seja avaliada.
- </p>
- <p>
- <i>Esta opусo nсo faz efeito se as clрusulas negativas forem dadas explicitamente.</i>
- </p>
- </div>
- </div>
- </div>
- <div class="divOpcao">
- <label class="labelOpcao">
- NЩmero mрximo de tuplas
- </label>
- <!-- Corresponde ao argumento -mNUMEROESCOLHIDO -->
- <input id="inputNumeroTuplas" name="inputNumeroTuplas" type="text" maxlength="20" />
- <div class="divExplicacaoOculta">
- <div class="divTextoExplicacaoOculta">
- <p>
- Define o <strong>NЩmero Mрximo de Tuplas</strong>, se vocЖ obtiver avisos sobre a exclusсo de literais devido ao limite mрximo de tuplas, aumente este valor. Entretanto, quanto maior este valor, mais tempo o algoritmo demorarр para rodar.
- </p>
- <p>
- <i>Valor default: 100000.</i>
- </p>
- </div>
- </div>
- </div>
- <div class="divOpcao">
- <label class="labelOpcao">
- Limite de profundidade de variрveis
- </label>
- <!-- Corresponde ao argumento -dNUMEROESCOLHIDO -->
- <input id="inputLimiteProfundidade" name="inputLimiteProfundidade" type="text" maxlength="20" />
- <div class="divExplicacaoOculta">
- <div class="divTextoExplicacaoOculta">
- <p>
- Deefine a <strong>Profundidade Mрxima de Variрveis</strong> em literais.
- </p>
- <p>
- <i>Valor default: 4.</i>
- </p>
- </div>
- </div>
- </div>
- <div class="divOpcao">
- <label class="labelOpcao">
- SeqЧЖncia mрxima de literais fracos
- </label>
- <!-- Corresponde ao argumento -wNUMEROESCOLHIDO -->
- <input id="inputLiteraisFracos" name="inputLiteraisFracos" type="text" maxlength="20" />
- <div class="divExplicacaoOculta">
- <div class="divTextoExplicacaoOculta">
- <p>
- <strong>Literais Fracos</strong> sсo literais que apresentam ganho 0.
- </p>
- <p>
- Esta opусo define a maior seqЧЖncia de literais fracos que o FOIL irр aceitar.
- </p>
- <p>
- <i>Valor default: 4.</i>
- </p>
- </div>
- </div>
- </div>
- <div class="divOpcao">
- <label class="labelOpcao">
- Acurрcia mьnima
- </label>
- <!-- Corresponde ao argumento -aNUMEROESCOLHIDO -->
- <input id="inputAcuraciaMinima" name="inputAcuraciaMinima" type="text" maxlength="3" />
- <div class="divExplicacaoOculta">
- <div class="divTextoExplicacaoOculta">
- <p>
- Este campo sз aceita valores de 0 a 100. (Porcentagens)
- </p>
- <p>
- Esta opусo define a <strong>Acurрcia Mьnima</strong> de clрusulas que o FOIL irр aceitar em seu aprendizado. Qualquer clрusula com acurрcia menor que a escolhida serр descartada.
- </p>
- <p>
- <i>Valor default: 80%.</i>
- </p>
- </div>
- </div>
- </div>
- <div class="divOpcao">
- <label class="labelOpcao">
- Limite de alternativas
- </label>
- <!-- Corresponde ao argumento -lNUMEROESCOLHIDO -->
- <input id="inputLimiteAlternativas" name="inputLimiteAlternativas" type="text" maxlength="20" />
- <div class="divExplicacaoOculta">
- <div class="divTextoExplicacaoOculta">
- <p>
- Define o <strong>NЩmero Mрximo de Literais Alternativos</strong> que o FOIL guardarр.
- </p>
- <p>
- <i>Valor default: 5.</i>
- </p>
- </div>
- </div>
- </div>
- <div class="divOpcao">
- <label class="labelOpcao">
- NЩmero mрximo de Checkpoints
- </label>
- <!-- Corresponde ao argumento -tNUMEROESCOLHIDO -->
- <input id="inputLimiteCheckpoints" name="inputLimiteCheckpoints" type="text" maxlength="20" />
- <div class="divExplicacaoOculta">
- <div class="divTextoExplicacaoOculta">
- <p>
- Define o <strong>NЩmero Mрximo de Checkpoints</strong> em determinado momento.
- </p>
- <p>
- <i>Valor default: 20.</i>
- </p>
- </div>
- </div>
- </div>
- <div class="divOpcao">
- <label class="labelOpcao">
- Porcentagem mьnima de ganho para literais alternativos
- </label>
- <!-- Corresponde ao argumento -fNUMEROESCOLHIDO -->
- <input id="inputGanhoMinimo" name="inputGanhoMinimo" type="text" maxlength="3" />
- <div class="divExplicacaoOculta">
- <div class="divTextoExplicacaoOculta">
- <p>
- Este campo sз aceita valores de 0 a 100. (Porcentagens)
- </p>
- <p>
- Define a porcentagem do ganho do melhor literal que os literais alternativos devem possuir.
- </p>
- <p>
- <i>Valor default: 80%.</i>
- </p>
- </div>
- </div>
- </div>
- </fieldset>
- <!-- FIELDSET ENVIAR -->
- <fieldset id="fieldsetEnviar">
- <legend>
- Pronto para aprender?
- </legend>
- <input type="submit" name="btnEnviar" value="Aprender!" />
- </fieldset>
- </form>
- <?php
- }
- ?>
- </div>
- <div id="divInferior">
- </div>
- </div>
- <div id="divRodape">
- <p id="pDesenvolvedorSistema">
- Desenvolvido por <a href="mailto:digoxavi@gmail.com" class="aRodape">Diego Xavier</a> e <a href="mailto:vl.ribeiro3@gmail.com" class="aRodape">Vinьcius Ribeiro</a>
- </p>
- <p id="pDesenvolvedorAlgoritmo">
- Algoritmo Foil por <a href="http://www.rulequest.com/Personal/" class="aRodape">Ross Quinlan</a>
- </p>
- </div>
- </div>
- </body>
- </html>