#!perl -T use Test::More tests => 31; use Math::Trig; use Data::CosineSimilarity; sub near { my ($value, $test) = @_; my $e = 0.0001; ok( abs( $value - $test ) < $e, "$value near $test"); } note 'Euclidean Norm'; note 'Scalar Product'; note 'independant'; { my $cs = Data::CosineSimilarity->new; isa_ok $cs, 'Data::CosineSimilarity'; $cs->add( a => { aaa => 3, aa => 2 } ); $cs->add( b => { bbb => 1, bb => 4 } ); my $r = $cs->similarity( 'a', 'b' ); isa_ok $r, 'Data::CosineSimilarity::Result'; is_deeply [ $r->labels ], [ 'a', 'b' ], 'labels'; is $r->cosine, 0, 'cosine'; is $r->radian, pi/2, 'radian'; is $r->degree, 90, 'degree'; } note 'similar'; { my $cs = Data::CosineSimilarity->new; isa_ok $cs, 'Data::CosineSimilarity'; $cs->add( a => { aaa => 2, aa => 2 } ); $cs->add( b => { aaa => 1, aa => 1 } ); my $r = $cs->similarity( 'a', 'b' ); isa_ok $r, 'Data::CosineSimilarity::Result'; is_deeply [ $r->labels ], [ 'a', 'b' ], 'labels'; is $r->cosine, 1, 'cosine'; near( $r->radian, 0 ); near( $r->degree, 0 ); } note '45 degree'; { my $cs = Data::CosineSimilarity->new; isa_ok $cs, 'Data::CosineSimilarity'; $cs->add( a => { aaa => 1, aa => 1 } ); $cs->add( b => { aaa => 1, aa => 0 } ); my $r = $cs->similarity( 'a', 'b' ); isa_ok $r, 'Data::CosineSimilarity::Result'; is_deeply [ $r->labels ], [ 'a', 'b' ], 'labels'; is $r->cosine, 1/sqrt(2), 'cosine'; is $r->radian, pi/4, 'radian'; is $r->degree, 45, '45 degree'; } note 'best and worst'; { my $cs = Data::CosineSimilarity->new; isa_ok $cs, 'Data::CosineSimilarity'; $cs->add( a => { aaa => 1, aa => 1 } ); $cs->add( b => { aaa => 1, aa => 0 } ); $cs->add( c => { aaa => 2, aa => 2 } ); my ($best, $worst, $r); ($best, $r) = $cs->best_for_label('a'); is $best, 'c'; isa_ok $r, 'Data::CosineSimilarity::Result'; is_deeply [ $r->labels ], [ 'a', 'c' ], 'labels'; is $r->cosine, 1, 'cosine'; near( $r->radian, 0 ); near( $r->degree, 0 ); ($worst, $r) = $cs->worst_for_label('a'); is $worst, 'b'; isa_ok $r, 'Data::CosineSimilarity::Result'; is_deeply [ $r->labels ], [ 'a', 'b' ], 'labels'; is $r->cosine, 1/sqrt(2), 'cosine'; is $r->radian, pi/4, 'radian'; is $r->degree, 45, '45 degree'; }