view release on metacpan or search on metacpan
1234567891011121314151617use
strict;
use
warnings;
use
Module::Build;
my
$builder
= Module::Build->new(
module_name
=>
'AI::CBR'
,
license
=>
'perl'
,
dist_author
=>
'Darko Obradovic <dobradovic@gmx.de>'
,
dist_version_from
=>
'lib/AI/CBR.pm'
,
build_requires
=> {
'Test::More'
=> 0,
},
add_to_cleanup
=> [
'AI-CBR-*'
],
create_makefile_pl
=>
'traditional'
,
);
$builder
->create_build_script();
1234567891011121314151617181920---
name: AI-CBR
version: 0.02
author:
-
'Darko Obradovic <dobradovic@gmx.de>'
abstract: Framework
for
Case-Based Reasoning
license: perl
resources:
license: http://dev.perl.org/licenses/
build_requires:
Test::More: 0
provides:
AI::CBR:
file: lib/AI/CBR.pm
version: 0.02
AI::CBR::Case:
file: lib/AI/CBR/Case.pm
AI::CBR::Case::Compound:
file: lib/AI/CBR/Case/Compound.pm
AI::CBR::Retrieval:
lib/AI/CBR.pm view on Meta::CPAN
5859606162636465666768697071727374757677=head1 AUTHOR
Darko Obradovic, C<< <dobradovic at gmx.de> >>
=head1 BUGS
Please report any bugs or feature requests to C<bug-ai-cbr at rt.cpan.org>, or through
the web interface at L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=AI-CBR>. I will be notified, and then you'll
automatically be notified of progress on your bug as I make changes.
=head1 SUPPORT
You can find documentation for this module with the perldoc command.
perldoc AI::CBR
lib/AI/CBR.pm view on Meta::CPAN
9596979899100101102103104105106107108109110111112113=item * Search CPAN
=back
=head1 COPYRIGHT & LICENSE
Copyright 2009 Darko Obradovic, all rights reserved.
This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.
=cut
1;
# End of AI::CBR::Case
lib/AI/CBR/Case.pm view on Meta::CPAN
1234567891011121314151617181920package
AI::CBR::Case;
use
warnings;
use
strict;
our
$DEFAULT_WEIGHT
= 1;
=head1 NAME
AI::CBR::Case - case definition and representation
=head1 SYNOPSIS
Define and initialise a case.
In a productive system, you will want to encapsulate this.
use AI::CBR::Case;
use AI::CBR::Sim qw(sim_frac sim_eq sim_set);
lib/AI/CBR/Case.pm view on Meta::CPAN
102103104105106107108109110111112113114115116117118119120121=head1 AUTHOR
Darko Obradovic, C<< <dobradovic at gmx.de> >>
=head1 BUGS
Please report any bugs or feature requests to C<bug-ai-cbr at rt.cpan.org>, or through
the web interface at L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=AI-CBR>. I will be notified, and then you'll
automatically be notified of progress on your bug as I make changes.
=head1 SUPPORT
You can find documentation for this module with the perldoc command.
perldoc AI::CBR::Case
lib/AI/CBR/Case.pm view on Meta::CPAN
139140141142143144145146147148149150151152153154155156157=item * Search CPAN
=back
=head1 COPYRIGHT & LICENSE
Copyright 2009 Darko Obradovic, all rights reserved.
This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.
=cut
1;
# End of AI::CBR::Case
lib/AI/CBR/Case/Compound.pm view on Meta::CPAN
123456789101112131415161718192021package
AI::CBR::Case::Compound;
use
warnings;
use
strict;
our
$DEFAULT_WEIGHT
= 1;
=head1 NAME
AI::CBR::Case::Compound - compound case definition and representation
=head1 SYNOPSIS
Define and initialise a compound (or object-oriented) case.
This is a case consisting of multiple object definitions related in some way.
In a productive system, you will want to encapsulate this.
use AI::CBR::Case::Compound;
use AI::CBR::Sim qw(sim_eq sim_dist);
lib/AI/CBR/Case/Compound.pm view on Meta::CPAN
8990919293949596979899100101102103104105106107108=head1 AUTHOR
Darko Obradovic, C<< <dobradovic at gmx.de> >>
=head1 BUGS
Please report any bugs or feature requests to C<bug-ai-cbr at rt.cpan.org>, or through
the web interface at L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=AI-CBR>. I will be notified, and then you'll
automatically be notified of progress on your bug as I make changes.
=head1 SUPPORT
You can find documentation for this module with the perldoc command.
perldoc AI::CBR::Case::Compound
lib/AI/CBR/Case/Compound.pm view on Meta::CPAN
127128129130131132133134135136137138139140141142143144145=item * Search CPAN
=back
=head1 COPYRIGHT & LICENSE
Copyright 2009 Darko Obradovic, all rights reserved.
This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.
=cut
1;
# End of AI::CBR::Case::Compound
lib/AI/CBR/Retrieval.pm view on Meta::CPAN
8687888990919293949596979899100101102103104105106
$candidate
->{_sim} *= _nrt(
$num_queries
,
$sum_sims
/
$sum_weights
);
}
}
my
@candidates_sorted
=
sort
{
$b
->{_sim} <=>
$a
->{_sim} } @{
$self
->{candidates}};
$self
->{candidates} = \
@candidates_sorted
;
}
=head2 RETRIEVAL METHODS
Use one of these methods to get the similar cases you are interested into.
=head3 most_similar_candidate
Returns the most similar candidate.
No parameters.
=cut
sub
most_similar_candidate {
my
(
$self
) =
@_
;
lib/AI/CBR/Retrieval.pm view on Meta::CPAN
160161162163164165166167168169170171172173174175176177178179=head1 AUTHOR
Darko Obradovic, C<< <dobradovic at gmx.de> >>
=head1 BUGS
Please report any bugs or feature requests to C<bug-ai-cbr at rt.cpan.org>, or through
the web interface at L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=AI-CBR>. I will be notified, and then you'll
automatically be notified of progress on your bug as I make changes.
=head1 SUPPORT
You can find documentation for this module with the perldoc command.
perldoc AI::CBR::Retrieval
lib/AI/CBR/Retrieval.pm view on Meta::CPAN
197198199200201202203204205206207208209210211212213214215=item * Search CPAN
=back
=head1 COPYRIGHT & LICENSE
Copyright 2009 Darko Obradovic, all rights reserved.
This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.
=cut
1;
# End of AI::CBR::Retrieval
lib/AI/CBR/Sim.pm view on Meta::CPAN
36373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112=item * sim_set
=back
=head1 FUNCTIONS
=head2 sim_dist
Works for any numeric values.
Suitable when you are interested into the difference of values in a given range.
Returns the fraction of the difference of the values with respect to a given maximum range of interest.
The madatory third argument is this range.
sim_dist(26, 22, 10); # returns 0.4
sim_dist(-2, 1, 100); # returns 0.03
=cut
sub
sim_dist {
my
(
$a
,
$b
,
$range
) =
@_
;
return
1
if
$a
==
$b
;
my
$dist
=
abs
(
$a
-
$b
);
return
0
if
$dist
>=
$range
;
return
1 -
$dist
/
$range
;
}
=head2 sim_frac
Works for non-negative numeric values.
Suitable when you are only interested into their relative difference with respect to 0.
Returns the fraction of the smaller argument with respect to the higher one.
sim_frac(3, 2); # returns 0.67
sim_frac(40, 50); # returns 0.8
=cut
sub
sim_frac {
my
(
$a
,
$b
) =
@_
;
return
1
if
$a
==
$b
;
return
0
if
$a
*
$b
== 0;
return
$a
>
$b
?
$b
/
$a
:
$a
/
$b
;
}
=head2 sim_eq
Works for any textual value.
Suitable when you are interested only into equality/inequality.
Returns 1 in case of equality, 0 in case of inequality.
No third argument.
sim_eq('foo', 'bar'); # returns 0
sim_eq('foo', 'foo'); # returns 1
=cut
sub
sim_eq {
return
$_
[0] eq
$_
[1] ? 1 : 0;
}
=head2 sim_set
Works for sets/lists of textual values.
Suitable when you are interested into overlap of the two sets.
Arguments are two array references with textual values.
Returns the number of elements in the intersection
divided by the number of elements in the union.
No third argument.
sim_set([qw/a b c/], [qw/b c d/]); # returns 0.5
sim_set([qw/a b c/], [qw/c/]); # returns 0.33
=cut
lib/AI/CBR/Sim.pm view on Meta::CPAN
131132133134135136137138139140141142143144145146147148149150=head1 AUTHOR
Darko Obradovic, C<< <dobradovic at gmx.de> >>
=head1 BUGS
Please report any bugs or feature requests to C<bug-ai-cbr at rt.cpan.org>, or through
the web interface at L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=AI-CBR>. I will be notified, and then you'll
automatically be notified of progress on your bug as I make changes.
=head1 SUPPORT
You can find documentation for this module with the perldoc command.
perldoc AI::CBR::Sim
lib/AI/CBR/Sim.pm view on Meta::CPAN
168169170171172173174175176177178179180181182183184185186=item * Search CPAN
=back
=head1 COPYRIGHT & LICENSE
Copyright 2009 Darko Obradovic, all rights reserved.
This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.
=cut
1;
# End of AI::CBR::Sim
t/03-retrieval.t view on Meta::CPAN
123456789101112131415161718192021#!perl -T
use
AI::CBR::Case;
use
AI::CBR::Retrieval;
my
$case_base
= [
{
id
=>1,
age
=>25,
gender
=>
'male'
,
job
=>
'manager'
,
symptoms
=>[
qw(headache)
],
reason
=>
'stress'
},
{
id
=>2,
age
=>40,
gender
=>
'male'
,
job
=>
'programmer'
,
symptoms
=>[
qw(headache cough)
],
reason
=>
'flu'
},
{
id
=>3,
age
=>30,
gender
=>
'female'
,
job
=>
'programmer'
,
symptoms
=>[
qw(cough)
],
reason
=>
'flu'
},
{
id
=>4,
age
=>25,
gender
=>
'male'
,
job
=>
'programmer'
,
symptoms
=>[
qw(headache)
],
reason
=>
'alcohol'
},
];
my
$case1
= AI::CBR::Case->new(
age
=> {
value
=> 30,
sim
=> \
&sim_frac
},
gender
=> {
value
=>
'male'
,
sim
=> \
&sim_eq
},
job
=> {
value
=>
'programmer'
,
sim
=> \
&sim_eq
},
symptoms
=> {
value
=> [
qw(headache)
],
sim
=> \
&sim_set
,
weight
=>2 },