pcodigo2web/workspace/avaliador/gerarresults.php

274 lines
8.1 KiB
PHP
Executable File

<?php
// Este script gera resultados de predicao para professores
// A partir dos arquivos notastreino.csv e notastestepreditas.csv de cada submissao em arquivospredicao/, geramos relatorios de predicao calculando a diferenca entre a nota predita e a nota dada pelo professor. Uma copia do relatorio é copiada no diretorio original e outra em resultadosobtidos/.
// É criada também uma página com os resultados de todas as tarefas
// Diretorio de entrada
$diretorioe= "arquivospredicao/";
$diretorior= "resultadosobtidos/";
$arqtreino="notastreino.csv"; // Contém todas as notas dadas pelo professor para uma questao
$arqteste= "notastestepreditas.csv";
if ((file_exists($diretorioe))) // If 1
{
// Abertura da página de resultados
$paginaresultados="apresentaresultados.htm";
$pr= fopen($paginaresultados,'w');
fwrite($pr,"<html><head><meta http-equiv=Content-Type content=text/html;charset=utf-8><title>SOAP</title></head><body><table align=center border=1 bordercolor=#BDBDBD bordercolordark=steelblue>");
fwrite($pr,"<tr><td colspan=6 align=center><font color=steelblue size=5>SOAP - Resultados de Predição de Notas </td> </tr>");
fwrite($pr,"<tr><td> Tarefas </td>");
fwrite($pr,"<td> Qtd. Notas preditas </td>");
fwrite($pr,"<td> Intervalo de Notas </td>");
fwrite($pr,"<td> Erro Médio </td>");
fwrite($pr,"<td> Erro Mínimo </td>");
fwrite($pr,"<td> Erro Máximo </td></tr>");
// Se não existe, cria o diretorio com resultados
if (!(file_exists($diretorior)))
{
mkdir($diretorior);
}
// Entrar em diretorio de entrada
$ponteiro1 = opendir($diretorioe);
// Para cada subdiretorio de arquivospredicao (isto é, cada questao)
while (($nometarefa = readdir($ponteiro1))) // While 1
{
if ( ($nometarefa<>".") && ($nometarefa<>"..") && ($nometarefa<>"listaavaliacao.txt") ) // If 2
{
// Abrir arquivo de gravação
$arqr = $diretorior."relatorio-".$nometarefa.".csv";
$fgr = fopen($arqr,'w');
fwrite($fgr,"Id-Questao; Nota do Professor; Nota Predita; Erro de Predicao \n \n");
$treino = $diretorioe.$nometarefa."/".$arqtreino;
$teste = $diretorioe.$nometarefa."/".$arqteste;
$ain = $diretorioe.$nometarefa."/"."intervalonotas.csv";
$contpreditas=0;
// Carrega o arquivo de teste (se não estiver vazio) e os separa em vetores de rotulos e notas
if ( (file_exists($teste)) && (file_exists($treino)) && (file_exists($ain))) // If 3
{
// Carregar intervalonotas.csv
$fin = file($ain);
$lir = explode("/",$fin[0]);
$vmin=$lir[0];
$vmax=trim($lir[1]);
unset($lir);
unset($fin);
// Carregar arquivo de teste
$te = file($teste);
$n=count($te);
// Carregar treino
$tr=file($treino);
$nt = count($tr);
if ($n>0)
{
$vte=array();
$vnte=array();
$i=0;
foreach($te as $linha)
{
// Copiar os rotulos de teste para vetor
$l= explode(";",$linha);
$vte[$i]=$l[0]; // Rotulo
$vnte[$i]= trim($l[1]); // Nota
unset($l);
$i++;
}
unset($te);
$j=0;
// Para avaliar erro
$somaerros=0;
$erromaximo=$vmin;
$errominimo=$vmax;
// Para cada linha do arquivo notastreino.csv
foreach($tr as $linha)
{
$l = explode(";", $linha);
// Obter rotulo e nota
$rotulo = trim($l[0]);
$notadada = trim($l[1]);
$pos = array_search($l[0],$vte);
if ($pos!='')
{
// Gravar Rotulo, Nota do Professor, Nota predita
if ($notadada>-1) // Se Professor atribuiu nota
{
$contpreditas++;
$notapredita = $vnte[$pos];
$erro = round($notapredita - $notadada, 2);
$erroabsoluto = abs($erro);
$somaerros=$somaerros + $erroabsoluto;
if ($erroabsoluto>$erromaximo)
{
$erromaximo=$erroabsoluto;
}
if ($erroabsoluto<$errominimo)
{
$errominimo=$erroabsoluto;
}
$pacote = "$rotulo; $notadada; $notapredita; $erro \n";
}
else // Se nota for -1, escreva "***"
{
$pacote = "$rotulo;***;******;*** \n";
}
}
else
{
// Gravar Rotulo, Nota do professor, "treino"
// Se nota for -1, escreva "***"
if ($notadada>-1)
{
$pacote= "$rotulo;$notadada;NOTA DO PROFESSOR;*** \n";
}
else
{
$pacote = "$rotulo;***;NOTA DO PROFESSOR;*** \n";
}
}
fwrite($fgr, $pacote);
$j++;
unset($l);
} // Fim do foreach para ler notastreino
unset($tr);
unset($vte);
unset($vnte);
} // FIm do if que verifica se ($n>0)
else
{
$msg = "Não houve predicao para a questão $nometarefa. \n Número insuficiente de amostras ou professor não pontuou amostras solicitadas. \n";
$erromedio="***";
$errominimo="***";
$erromaximo="***";
fwrite($fgr, $msg);
}
if (($errominimo=="***") && ($erromaximo=="***"))
{
$erromedio="***";
}
else
{
if ($contpreditas>0)
{
if ($somaerros>0)
{
$erromedio=round($somaerros/$contpreditas,2);
}
else
{
$erromedio=0.0;
}
}
else
{
$erromedio="***";
$erromaximo="***";
$errominimo="***";
}
}
$gravarhtml="<tr><td><a alink=black vlink=black link=black href=resultadosobtidos/relatorio-".$nometarefa.".csv target=blank>".$nometarefa."</a></td><td align=center>".$contpreditas." de ".$nt."</td><td align=center>".$vmin." a ".$vmax."</td><td align=center>".$erromedio."</td><td align=center>".$errominimo."</td><td align=center>".$erromaximo."</td></tr>";
fwrite($pr,$gravarhtml);
} // Fim do If 3
else
{
$msg = "Não houve predicao para a questão $nometarefa. \n Número insuficiente de amostras ou professor não pontuou amostras solicitadas. \n";
$erromedio="***";
$errominimo="***";
$erromaximo="***";
fwrite($fgr, $msg);
}
fclose($fgr);
} // Fim do If 2
} // Fim do While 1
fwrite($pr,"<tr><td colspan=6> <b>*** </b> Significa que não houve predição </tr>");
fwrite($pr,"</table></body></html>");
fclose($pr);
} // Fim do If 1
else
{
echo "\n \n Diretorio com resultados de predicao não encontrado! \n";
}
?>