#!/usr/bin/perl

$|=1;
$thresh = 8;
$name = "AAA";

while(<>){
    @x = split;
    @x = &normalize(@x);
    next unless ($ct++ > 80);
    $mindist = 100000000000;
    foreach $c (@clusters){
	$dist = $c->dist(@x);
#	print $c->{name}, " $dist, ";
	if($dist < $mindist){
	    $mindist = $dist;
	    $cluster = $c;
	}
    }
#    print "\n";
#    print "$ct $mindist ", $cluster->{name}, "\n";
    if($mindist < $thresh){
	print $cluster->{name}, " $mindist $#clusters\n";;
	$cluster->update(@x);
    }
    else{
#	print "new Cluster $name, $mindist from ", $cluster->{name}, "\n";
	push(@clusters, new Cluster($name++, @x));
	$c = $clusters[$#clusters];
	print "Distance from my own new cluster is ", $c->dist(@x), "\n";
    }
}

sub normalize {
    @s = @_;
    for $i (0..$#s){
	if($ct < 80){
	    $v[$i] = 5 if($v[$i] < .0001);
	    $m[$i] = ($m[$i]+(.02*$s[$i]))/1.02;
	    $v[$i] = ($v[$i]+(.02*(abs($s[$i]-$m[$i]))))/1.02;
	}
	$s[$i] = $s[$i]-$m[$i];
	$s[$i] = $s[$i]/($v[$i]+.1);
    }
    return @s;
}

package Cluster;

sub new {
    $self = shift;
    $name = shift;
    my @rest= @_;
    return bless { 'name' => $name,
		   'mean' => bless \@rest};
}

sub dist  {
    $self = shift;
    @p = @_;
    @m = @{$self->{mean}};
    $tot = 0;
    foreach $i (0..$#m){
	$tot += ($p[$i]-$m[$i])**2;
    }
    return sqrt($tot);
}

sub update {
    $self = shift;
    @p = @_;
    my @m = @{$self->{mean}};
    for $i (0..$#p){
	$m[$i] = ($m[$i]+(.02*$p[$i]))/1.02;
    }
    $self->{mean} = \@m;
}
