#!/usr/bin/perl -w

#
# Copyright (C) 2001 by USC/ISI
# All rights reserved.
#
# Redistribution and use in source and binary forms are permitted
# provided that the above copyright notice and this paragraph are
# duplicated in all such forms and that any documentation, advertising
# materials, and other materials related to such distribution and use
# acknowledge that the software was developed by the University of
# Southern California, Information Sciences Institute.  The name of the
# University may not be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#
# An perl script that transforms a data file (one-column format) into
# a ns-style CDF file, used by SAMAN ModelGen
#
# This work is supported by DARPA through SAMAN Project
# (http://www.isi.edu/saman/), administered by the Space and Naval
# Warfare System Center San Diego under Contract No. N66001-00-C-8066

sub usage {
        print STDERR <<END;
      usage: $0 [-e FirstEpoch] [-i Increment] [-d Dividend] [-t DataFile]
        Options:
            -e string  specify the starting epoch
            -i string  size of each bin
            -d string  scaling factor of each epoch
            -t string  filename of data

END
        exit 1;
}
BEGIN {
        $dblibdir = "./";
        push(@INC, $dblibdir);
}
use DbGetopt;
require "dblib.pl";
my(@orig_argv) = @ARGV;
&usage if ($#ARGV < 0);
my($prog) = &progname;
my($dbopts) = new DbGetopt("e:i:d:t:?", \@ARGV);
my($ch);                                                                       
while ($dbopts->getopt) {
        $ch = $dbopts->opt;
        if ($ch eq 'e') {
                $epoch = $dbopts->optarg;
        } elsif ($ch eq 'i') { 
                $incr = $dbopts->optarg;
        } elsif ($ch eq 'd') { 
                $dividend = $dbopts->optarg;
        } elsif ($ch eq 't') { 
                $tfile = $dbopts->optarg;
	} else {
                &usage;
        };
};                          

&outputCDF($epoch,$incr,$dividend,$tfile);

sub numerically { $a <=> $b; }

sub outputCDF {

	local($cur_epoch,$incr,$dividend,$tfile) = @_;

	local(@data);
	local(@dataS);
	local(@epoch);
	local(@cum);

	open(ORIG,$tfile) || die("cannot open $tfile.\n");
	$tfileS = join('.',$tfile,"cdf");
	$newtfile = join(' ',">",$tfileS);
	open(CDF,$newtfile) || die("cannot open $newtfile.\n");

	$count = 0;
	$cur_time = 0;

	$i = 0;
	while ($line = <ORIG>) {
		chop $line;
		$data[$i] = $line;
		$i++;
	}

	close(ORIG);

	if ($i eq 0) { exit; }

	@dataS = sort numerically @data;

	$i = 0;
	$sum = 0;

	foreach $j (0 .. $#dataS) {

		$cur_time = $dataS[$j];

		if ($cur_time > $cur_epoch) {
        		while ($cur_epoch < $cur_time) {

     				$epoch[$i] = $cur_epoch;
     				$sum = $sum + $count;
     				$cum[$i] = $sum;
     				$i++;

     				$cur_epoch = $cur_epoch + $incr;
     				$count=0;
   			}
   			if ($cur_time <= $cur_epoch) {
      				$count = 1;
   			} else {
      				$count = 0;
   			}
		} else {
   			$count++;
		}

	}

	$epoch[$i] = $cur_epoch;
	$sum = $sum + $count;
	$cum[$i] = $sum;

	$oldcum = 0;
	foreach $j (0 .. $#epoch) {
		$prob = $cum[$j]/$cum[$#cum];
		$e = $epoch[$j]/$dividend;
		if ($cum[$j] ne $oldcum) {
			print CDF "$e $cum[$j] $prob\n";
		}
  		$oldcum = $cum[$j];
	}

	close(CDF);
}

