All pastes #585235 Raw Edit

Miscellany

public text v1 · immutable
·published 2007-06-23 04:20 UTC
rendered paste body
#!/app/gmd/bin/perl

use strict;
use Data::Dumper;
use Getopt::Std;
use POSIX qw(log10);

my %opts;

getopts('htdusr:', \%opts );
if ( $opts{h} ) {
	usage();
	exit;
}
#  There's some reason I didn't use the time as a key ... I don't remember why :-/  this data structure sucks to work with
# Format of the data structure is :
# Per sample 
#  0  :  Time
#  1  :  time ranking
#  2  :  time converted to seconds since the beginning of the day
#  3  :  updates / s for specific time sample
#  4  :  delta ( change from the previous sample to the current )
#  5  :  delta ranking
#  6  :  slope
#  7  :  slope ranking


my @file = <>;
my ($time,$seconds, $score,$trank);
my @pairs = map {
	( $time , $score) = split;
	$time =~ /(\d\d)\:(\d\d):(\d\d)/;
	$seconds = ( $1*3600 + $2*60 + $3 );
	[ $time,$trank++, $seconds, $score ];   # last column is for score ranking
} @file;

# populate the delta fields and the slope fields
for ( my $i; $i <= $#pairs; $i++ ) {
	$pairs[$i][5] = ($i != 0) ? $pairs[$i][3] - $pairs[$i-1][3] : 0;
#	print $pairs[$i][0],"\t",$pairs[$i][3],"\t",$pairs[$i][4],"\n"; #= $pairs[$i][2] - $pairs[$i-1][2]\n";
#	print "$pairs[$i][7] = ($i != 0) ? ( $pairs[$i][5] / ($pairs[$i][2] - $pairs[$i-1][2]) ): 0\n**\n";
	if ( $pairs[$i][2] eq $pairs[$i-1][2] ) {
		print "Double timestamped for : $pairs[$i-1][0] and $pairs[$i][0] , assuming 5 second interval !\n";
		$pairs[$i][7] = ($i != 0) ? ( $pairs[$i][5] / (5) ): 0;
	}
	else {
		$pairs[$i][7] = ($i != 0) ? ( $pairs[$i][5] / ($pairs[$i][2] - $pairs[$i-1][2]) ): 0;
	}
}

my $set = \@pairs;

#		print "set before : ",join (",",@{$set}),"\n";
if ( $opts{r} ) {
	if ( $opts{r} =~ /^(?:(09|1[0123456]))\:([012345]\d)to(?:(09|1[0123456])\:([012345]\d))/ ) { 
#		print "Start hour : $1\n";
#		print "Start minute : $2\n";
#		print "End Hour : $3\n";
#		print "End minute : $4\n";
		print "begin_time : $1*60*60+$2*60 : ",$1*60*60+$2*60," end time: $3*60*60+$4*60 : ",$3*60*60+$4*60,"\n";

		$set = trim_time($1*60*60+$2*60 , $3*60*60+$4*60, $set );
#		print "set : ",join (",",@{$set}),"\n";
#		print Dumper($set);
#		exit;
	}
	else {
		print "Option R must be formatted :  '-r 09:50to10:00'\n";
		exit;
	}
}

#		print "set after : ",join (",",@{$set}),"\n";

rank_updaterate($set);
rank_delta($set);
rank_slope($set);

if ( $opts{t} ) {
	printme( "*** Time Sorted***",sort mangle_time @{$set});
}
if ( $opts{d} ) {
	printme( "*** Deriv. Sorted***",sort mangle_deriv @{$set});
}
if ( $opts{u} ) {
	printme( "*** Update rate Sorted ***",sort mangle_updaterate @{$set}) ;
}
if ( $opts{s} ) {
	printme ( "*** Slope Sorted ***",sort mangle_slope @{$set});
}
#print $$set[0][0],"\n";
#print $$set[0][1],"\n";
#print $$set[0][2],"\n";
#print $$set[0][3],"\n";
#print $$set[0][4],"\n";
#print "sleeping 20\n";

#$set = trim_time( 8*60*60, 17*60*60, $set);
#print $$set[0][0],"\n";
#print $$set[0][1],"\n";
#print $$set[0][2],"\n";
#print $$set[0][3],"\n";
#print $$set[0][4],"\n";

#printme ( "** Trimmed **", sort mangle_updaterate @{trim_time( 9*60*60+55*60, 10*60*60, $set)} );
printme ( "** Trimmed **", sort mangle_updaterate @{$set} );

print "Done\n";
sub rank_updaterate {
	my $data = shift;
	
	# figure out the rank for the update rate
	my $rank = 1;
	my $last = 0;
	foreach my $element ( sort mangle_updaterate @{$data} ) {
		if ( @{$element}[3] < $last ) {
			$rank++;
		}
		# notice that [1] is used as our placeholder, it's the only unique item we have in the array between the 2 !
		$$data[ @{$element}[1] ][4] = $rank;  # stuff the ranking into the original array
		$last = @{$element}[3];
	}
}

sub rank_delta {
	my $data = shift;

	# find the rank for the deltas
	my $rank = 1;
	my $last = 0;
	foreach my $element ( sort mangle_deriv @{$data} ) {
		if (abs @{$element}[5] < abs $last ) {
			$rank++;
		}
		$$data[ @{$element}[1] ][6] = $rank;
		$last = @{$element}[5];
	}
}

sub rank_slope {
	my $data = shift;

	# find the rank for the slope
	my $rank = 1;
	my $last = 0;
	foreach my $element ( sort mangle_slope @{$data} ) {
	        if ( @{$element}[7] < $last ) {
	                $rank++;
	        }
	        $$data[ @{$element}[1] ][8] = $rank;
	        $last = @{$element}[7];
	}
}

sub trim_time {     #  expects 2 times in seconds and the data, returns a new array of the proper length
	my $start_time = shift;
	my $end_time = shift;
	my $array = shift;
	my $results;

	#  trim the array to the time specifics we need
	foreach my $element ( @{$array} ) {
#		print "@{$element}[2] > $start_time   && @{$element}[2] < $end_time \n";
		if ( @{$element}[2] > $start_time && @{$element}[2] < $end_time ) {
#			print join ( ",", @{$element} ),"\n";
			push ( @{$results} , $element );
		}
	}
	$array = $results;
	return $array;
}

sub printme {
	my $header = shift;
	my @array = @_;
	print $header."\n";
	printf "%9s %7s (%6s) %7s (%5s)  %6s (%5s)\n", "Time","upd./s","rank","delta","rank","slope","rank";
	map {
	       printf "%9s %7s (%6s) %7s (%5s)  %6.1f (%5s)\n",$_->[0],$_->[3],$_->[4],$_->[5],$_->[6],$_->[7],$_->[8];
	} @array;
}
sub mangle_deriv {   # sort by the absolute value of the difference in update rate between the last sample
	abs( $b->[5] ) <=> abs ( $a->[5] );
#	$b->[5] <=> $a->[5];
}
sub mangle_time {   
	$a->[2] <=> $b->[2];
}
sub mangle_updaterate {
	$b->[3] <=> $a->[3];
}
sub mangle_slope {
	$b->[7] <=> $a->[7];
}

sub usage {
print <<HERE

        usage: $0 [-t] [-u] [-d] [datafile]

        -d              : delta -- compare the current update rate to the previous sample update rate and sort by the absolute value of the difference and print
        -h              : this help screen
	-s		: slope -- sort by the slope of the line between the previous and current samples
        -t		: time -- sort by the time within the file and print
        -u              : sort by the update rate and print

        examples :
		$0 -t 20070328.log
		$0 -t -u 20070328.log
		$0 -u 20070328.log
		$0 -d 20070328.log
		$0 -t -d 20070328.log
		
HERE
}