#!/usr/bin/php -q
<?php
libxml_use_internal_errors(true);

$sorted = false;
$cumulated = false;
$function = "GEMM";

$proc = 0;
$XML = array();
$keys = null;

function display_xml_error($error, $xml)
{
    $return  = $xml[$error->line - 1] . "\n";
    $return .= str_repeat('-', $error->column) . "^\n";

    switch ($error->level) {
        case LIBXML_ERR_WARNING:
            $return .= "Warning $error->code: ";
            break;
         case LIBXML_ERR_ERROR:
            $return .= "Error $error->code: ";
            break;
        case LIBXML_ERR_FATAL:
            $return .= "Fatal Error $error->code: ";
            break;
    }

    $return .= trim($error->message) .
               "\n  Line: $error->line" .
               "\n  Column: $error->column";

    if ($error->file) {
        $return .= "\n  File: $error->file";
    }

    return "$return\n\n--------------------------------------------\n\n";
}

for($fileidx = 1; $fileidx < $argc; $fileidx++ ) {
    $xml = simplexml_load_file( $argv[$fileidx] );
    if( !$xml ) {
        error_log("Parse Error in $argv[$fileidx]:\n");
        $errors = libxml_get_errors();
        error_log(" There was " . count($errors) . " errors\n");
        foreach ($errors as $error) {
           error_log( " - " . display_xml_error($error, $xml) . "\n");
        }
        libxml_clear_errors();
        continue;
    }

    if( $proc == 0 ) {
        $keys = $xml->DICTIONARY;
    } else {
        $nk = $xml->DICTIONARY;
        $kid = 0;
        foreach( $keys->KEY as $k ) {
            $n1 = $k->NAME;
            $n2 = $nk->KEY[$kid]->NAME;
            if( "$n1" != "$n2" ) {
                error_log("$n1 != $n2 -> Dictionaries don't match. All dictionaries must match\n");
                exit;
            } 
            $kid++;
        }
    }

    $XML[] = $xml;
    $proc++;
}

$tu = $XML[0]->PROFILES['TIME_UNIT'];

echo "set title ''\n";
echo "set xlabel 'Operation Number'\n";

echo "set ylabel 'Execution Time ($tu)";
if( $cumulated ) {
    echo " -- cumulated";
 }
echo "'\n";

echo "set key below\n";
echo "set yrange [0:]\n";

$proc = 0;
$comma = "";
echo 'plot ';
foreach($XML as $xml) {
    $thid = 0;
    foreach( $xml->PROFILES->THREAD as $th ) {
        foreach( $th->KEY as $key ) {
            $nb = $key['ID'];
            $kn = "NOTFOUND";
            foreach($keys->KEY as $k) {
                if( $k['ID'] == "$nb" ) {
                    $kn = $k->NAME;
                    break;
                }
            }
            if( $kn != $function ) continue;
            echo "$comma'-' t '$kn on $proc:$thid' w lp ls $thid";
            $comma = ", ";
        }
        $thid++;
    }
    $proc++;
}
echo "\n";

foreach($XML as $xml) {
    $thid = 0;
    foreach( $xml->PROFILES->THREAD as $th ) {
        foreach( $th->KEY as $key ) {
            $nb = $key['ID'];
            $kn = "NOTFOUND";
            foreach($keys->KEY as $k) {
                if( $k['ID'] == "$nb" ) {
                    $kn = $k->NAME;
                    break;
                }
            }
            if( $kn != $function ) continue;

            $values = array();
            foreach( $key->EVENT as $e ) {
                $start = $e->START;
                $end = $e->END;
                $id = $e->ID;
                $duration = $end-$start;
                $values[] = $duration;
            }
            if( $sorted ) {
                sort($values, SORT_NUMERIC);
            }
            $sum = 0;
            foreach($values as $v) {
                if( $cumulated ) {
                    $sum += $v;
                    echo "$sum\n";
                } else {
                    echo "$v\n";
                }
            }
            echo "e\n";
        }
        $thid++;
    }
    $proc++;
}
?>
