#!/usr/bin/perl

$where = $ARGV[0];

$StotalMess = 0;
$StotalMess2 = 0;
$UtotalMess = 0;
$UtotalMess2 = 0;


$StotalFiles = 0;
$UtotalFiles = 0;

$StotalTime = 0;
$StotalTime2 = 0;
$UtotalTime = 0;
$UtotalTime2 = 0;

$StotalLinks = 0;
$StotalLinks2 = 0;
$UtotalLinks = 0;
$UtotalLinks2 = 0;

$StotalMaxInc = 0;
$StotalMaxInc2 = 0;
$UtotalMaxInc = 0;
$UtotalMaxInc2 = 0;

$StotalAvgInc = 0;
$StotalAvgInc2 = 0;
$UtotalAvgInc = 0;
$UtotalAvgInc2 = 0;

$StotalAgentsInc = 0;
$StotalAgentsInc2 = 0;
$UtotalAgentsInc = 0;
$UtotalAgentsInc2 = 0;

$StotalMaxLinks = 0;
$StotalMaxLinks2 = 0;
$UtotalMaxLinks = 0;
$UtotalMaxLinks2 = 0;

foreach $file (<$where*.log>){
  $thisMess = 0;
  $thisTime = 0;
  $thisLinks = 0;
  $thisMaxInc = 0;
  $thisAvgInc = 0;
  $thisAgentsInc = 0;
  $thisMaxLinks = 0;
  $thisSolved = "false";

  processFile($file);

  if($thisSolved eq "true"){

    $StotalMess += $thisMess;
    $StotalMess2 += $thisMess * $thisMess;
    
    $StotalTime += $thisTime;
    $StotalTime2 += $thisTime * $thisTime;
    
    $StotalLinks += $thisLinks;
    $StotalLinks2 += $thisLinks * $thisLinks;
    
    $StotalMaxInc +=$thisMaxInc;
    $StotalMaxInc2 +=$thisMaxInc * $thisMaxInc;
    
    $StotalAvgInc += $thisAvgInc;
    $StotalAvgInc2 += $thisAvgInc * $thisAvgInc;
    
    $StotalAgentsInc += $thisAgentsInc;
    $StotalAgentsInc2 += $thisAgentsInc * $thisAgentsInc;
    
    $StotalMaxLinks += $thisMaxLinks;
    $StotalMaxLinks2 += $thisMaxLinks * $thisMaxLinks;
    
    $StotalFiles++;
  } else {
    $UtotalMess += $thisMess;
    $UtotalMess2 += $thisMess * $thisMess;
    
    $UtotalTime += $thisTime;
    $UtotalTime2 += $thisTime * $thisTime;
    
    $UtotalLinks += $thisLinks;
    $UtotalLinks2 += $thisLinks * $thisLinks;
    
    $UtotalMaxInc +=$thisMaxInc;
    $UtotalMaxInc2 +=$thisMaxInc * $thisMaxInc;
    
    $UtotalAvgInc += $thisAvgInc;
    $UtotalAvgInc2 += $thisAvgInc * $thisAvgInc;
    
    $UtotalAgentsInc += $thisAgentsInc;
    $UtotalAgentsInc2 += $thisAgentsInc * $thisAgentsInc;
    
    $UtotalMaxLinks += $thisMaxLinks;
    $UtotalMaxLinks2 += $thisMaxLinks * $thisMaxLinks;
    
    $UtotalFiles++;
  }

  #print "file $file $thisTime $thisLinks $thisMess $thisMaxInc $thisAvgInc $thisAgentsInc $thisMaxLinks, $thisSolved\n";
}

#Time data
processData($StotalTime, $StotalTime2, $StotalFiles,$UtotalTime, $UtotalTime2, $UtotalFiles, "Time");

#Messages data
processData($StotalMess, $StotalMess2, $StotalFiles,$UtotalMess, $UtotalMess2, $UtotalFiles, "Messages");

#Links data
processData($StotalLinks, $StotalLinks2, $StotalFiles,$UtotalLinks, $UtotalLinks2, $UtotalFiles, "TotalLinks");

#Maximum links data
processData($StotalMaxLinks, $StotalMaxLinks2, $StotalFiles,$UtotalMaxLinks, $UtotalMaxLinks2, $UtotalFiles, "MaxLinks");

#Max links increase
processData($StotalMaxInc, $StotalMaxInc2, $StotalFiles,$UtotalMaxInc, $UtotalMaxInc2, $UtotalFiles, "MaxLinksInc");

#Avg Links Increase
processData($StotalAvgInc, $StotalAvgInc2, $StotalFiles, $UtotalAvgInc, $UtotalAvgInc2, $UtotalFiles, "AvgLinksInc");

#Number of agents increased
processData($StotalAgentsInc, $StotalAgentsInc2, $StotalFiles, $UtotalAgentsInc, $UtotalAgentsInc2, $UtotalFiles, "AgentsInc");


sub processFile {
  ($file) = @_;
  open(IN, $file) || die "file not available for reading";
  
  while($line = <IN>){
    if($line =~ /(\d+).*TotalMessagesReceived.(\d+)/){	
      #printf("$2\n");
      $thisMess += $2;
    }
    elsif($line =~ /(\d+).*TotalLinks.(\d+)/){
      #printf("$2\n");
      $thisLinks = $2;
    }
    elsif($line =~ /(\d+).*MaxLinks.(\d+)/){
      #printf("$2\n");
      $thisMaxLinks = $2;
    }
    elsif($line =~ /(\d+).*MaxLinkInc.(\d+)/){
      #printf("$2\n");
      $thisMaxInc = $2;
    }
    elsif($line =~ /(\d+).*NumAgentInc.(\d+)/){
      #printf("$2\n");
      $thisAgentsInc = $2;
    }
    elsif($line =~ /(\d+).*AvgLinkInc.(\d+)/){
      #printf("$2\n");
      $thisAvgInc = $2;
    }
    elsif($line =~ /(\d+).*Solved.(\w+)/){
      #printf("$2\n");
      $thisSolved = $2;
      chomp($thisSolved);
    }

    $thisTime = $1;
  }
  close(in);
}


sub processData{
  ($StotVal, $StotVal2, $StotFiles, $UtotVal, $UtotVal2, $UtotFiles, $label) = @_;

  if($StotFiles > 1){
    $sDev = sqrt(($StotVal2 - (($StotVal*$StotVal)/$StotFiles))/($StotFiles-1));
  } else {
    $sDev = 0.0;
  }

  if($StotFiles > 0){
    $sAvg = $StotVal/$StotFiles;
  } else {
    $sAvg = 0.0;
  }

  if($UtotFiles > 1){
    $uDev = sqrt(($UtotVal2 - (($UtotVal*$UtotVal)/$UtotFiles))/($UtotFiles-1));
  } else {
    $uDev = 0.0;
  }

  if($UtotFiles > 0){
    $uAvg = $UtotVal/$UtotFiles;
  } else {
    $uAvg = 0.0;
  }

  $AtotVal = $StotVal + $UtotalVal;
  $AtotFiles = $StotFiles + $UtotFiles;
  $AtotVal2 = $StotVal2 + $UtotVal2;

  if($AtotFiles > 1){
    $aDev = sqrt(($AtotVal2 - (($AtotVal*$AtotVal)/$AtotFiles))/($AtotFiles-1));
  } else {
    $aDev = 0.0;
  }

  if($AtotFiles > 0){
    $aAvg = $AtotVal/$AtotFiles;
  } else {
    $aAvg = 0.0;
  }

  printf("$label-Satisfiable: %d %2.1f %2.1f \n", $StotFiles, $sAvg, $sDev);
  printf("$label-Unsatisfiable: %d %2.1f %2.1f \n", $UtotFiles, $uAvg, $uDev);
  printf("$label-Accumulated: %d %2.1f %2.1f \n", $AtotFiles, $aAvg, $aDev);
}
