AI-Fuzzy
view release on metacpan or search on metacpan
lib/AI/Fuzzy/Set.pm view on Meta::CPAN
package AI::Fuzzy::Set;
## Fuzzy Set ####
sub new {
my $class = shift;
my $self = {} ;
# accepts a hash of member weights..
# ( $members{$member}=$weight )
%{$self->{members}} = @_;
bless $self, $class;
}
sub membership {
# naturally, it returns a fuzzy value - the degree
# to wich $item is a member of the set! :)
my $self = shift;
my $item = shift;
if (defined(${$self->{members}}{$item})) {
return ${$self->{members}}{$item};
} else {
return 0;
}
}
sub members {
# returns list of members, sorted from least membership to greatest
my $self = shift;
my %l = %{$self->{members}};
return sort { $l{$a} <=> $l{$b} } keys %l;
}
sub equal {
# returns true if the argument set is equal to this one
my $self = shift;
my $otherset = shift;
my (%us, %them);
%us = %{$self->{members}} if (exists $self->{members});
%them = %{$otherset->{members}} if (exists $otherset->{members});
# for all keys in us and them
foreach my $key (keys (%us), keys (%them)) {
# not equal if either set is missing a key
return 0 unless (exists ($us{$key}) && exists ($them{$key}) );
# not equal if the membership of the keys isn't equal
return 0 unless (float_equal($us{$key},$them{$key}, 10));
}
# otherwise they are equal
return 1;
}
sub union {
# returns a set that is the union of us and the argument set
my $self = shift;
my $otherset = shift;
my (%us, %them, %new);
%us = %{$self->{members}} if (exists $self->{members});
%them = %{$otherset->{members}} if (exists $otherset->{members});
# for all keys in us and them
foreach my $key (keys (%us), keys (%them)) {
if (not exists $us{$key} and exists $them{$key}) {
$new{$key} = $them{$key};
next;
( run in 0.465 second using v1.01-cache-2.11-cpan-39bf76dae61 )