#!/usr/local/bin/perl

use warnings;

open IN, "<".$ARGV[0] or die "Cannot open $ARGV[0]: $!";
while (<IN>){
	next if /^#/;
	chomp;
	s/ //;
	$count++;
	$y[$count]=$_;
#    print "$y[$count]\n";
	$sumxy+=$count*$y[$count];
	$sumx+= $count;
	$sumy+= $y[$count]; 
	$sumx2 += $count**2;
}
close IN;

$beta=($count*$sumxy-$sumx*$sumy)/($count*$sumx2-$sumx**2);
$alfa=$sumy/$count-$beta*$sumx/$count;

# ask:
# print "Seasionality: ";
# chomp ($sea = <STDIN>);
# if ($sea<=0 || $sea+0 ne $sea || $sea>$count/2) {
#     goto ask;
# }

$MIN=9e99;
for $sea (1..int($count/2)){
    @season=();
    @c=();
    $s=0;    
    for $i (1 .. $count){
	$s++;
	if ($s>$sea) { $s = 1; }
	$c[$s]++;
	$season[$s] += $y[$i]/($alfa+$beta*$i);
    }
    for $s (1 .. $sea){
	$season[$s] /= $c[$s]; 
    }
    $se=0;
    for $i (1..$count){
	$s++;
	if ($s>$sea) { $s=1; }
	$f = ($alfa+$beta*$i) * $season[$s];
	$se += ($f-$y[$i])**2;
    }
    $mse = $se/$count;
    if ($mse < $MIN){
	$MIN = $mse;
	$seas=$sea;
    }
}
$sea=$seas;
@season=();
@c=();
$s=0;    
for $i (1 .. $count){
    $s++;
    if ($s>$sea) { $s = 1; }
    $c[$s]++;
    $season[$s] += $y[$i]/($alfa+$beta*$i);
}
for $s (1 .. $sea){
    $season[$s] /= $c[$s]; 
}


print "-" x 70,"\n";
print "y = $alfa + $beta x\n";
print "Seasonality = $sea\n";
print "-" x 70,"\n";

print "\tD\tF\tAD\tSE\n";
$s=0;
for $i (1 .. $count){
    $s++;
    if ($s>$sea) { $s=1; }
	$f = ($alfa+$beta*$i) * $season[$s];
    $dd=$y[$i];
	$ad=abs($dd-$f);
	$se=($dd-$f)**2;
        printf "%i)\t%.02f\t%.2f\t%.2f\t%.2f\n",$i,$dd,$f,$ad,$se;
	$mad+=$ad;
	$mse+=$se;
}
$mad /= $count;
$mse /= $count;
print "\t\tMAD=$mad\tMSE=$mse\n";
for $i ($count+1..$count+10){
        $s++;
    if ($s>$sea) { $s=1; }
	print "$i)\t\t", ($alfa+$beta*$i)*$season[$s] , "\n";
}


__END__	
