Calculate dependency 'weights'
# Create a source from a file my $Source = Algorithm::Dependency::Source->new( 'file.txt' ); # Create a Weight algorithm object my $alg = Algorithm::Dependency::Weight->new( source => $Source ); # Find the weight for a single item my $weight = $alg->weight('foo'); print "The weight of 'foo' is $weight\n"; # Or a group my $hash = $alg->weight_hash('foo', 'bar', 'baz'); print "The weight of 'foo', 'bar', and 'bar' are $hash->{foo}," . " $hash->{bar} and $hash->{baz} respectively\n"; # Or all of the items my $all = $alg->weight_all; print "The following is a list from heaviest to lightest:\n"; foreach ( sort { $all->{$b} <=> $all->{$a} } keys %$all ) { print "$_: $all->{$_}\n"; }
In dependency systems, it can often be very useful to calculate an aggregate or sum for one or all items. For example, to find the \*(L"naive install weight\*(R" of a Perl distribution (where \*(L"naive\*(R" means you treat each distribution equally), you would want the distribtion (1) + all its dependencies (n) + all their dependencies (n2) recursively downwards.
If calculated using a normal Algorithm::Dependency object, the result would be (in a simple systems) equal to:
# Create your normal (non-ordered alg:dep) my $dependency = Algorithm::Dependency->new( ... );
# Find the naive weight for an item my $weight = scalar($dependency->schedule('itemname'));
\*(C`Algorithm::Dependency::Weight\*(C' provides a way of doing this with a little more sophistication, and in a way that should work reasonable well across all the Algorithm::Dependency family.
Please note that the this might be a little (or more than a little) slower than it could be for the limited case of generating weights for all of the items at once in a dependency system with no selected items and no circular dependencies. \s-1BUT\s0 you can at least rely on this class to do the job properly regardless of the particulars of the situation, which is probably more important.
The \*(C`new\*(C' constructor creates a new \*(C`Algorithm::Dependency::Weight\*(C' object. It takes a number of key/value pairs as parameters (although at the present time only one). The \*(C`source\*(C' param is mostly the same as for Algorithm::Dependency. The one addition is that as a source you can provide an Algorithm::Dependency object, and the Algorithm::Dependency::Source for that will be used.
Returns a new \*(C`Algorithm::Dependency::Weight\*(C' object, or \*(C`undef\*(C' on error.
The \*(C`source\*(C' accessor returns the source used for the weight calculations.
This will be either the one passed to the constructor, or the source from inside the \*(C`Algorithm::Dependency\*(C' object passed as the \*(C`source\*(C' param (not the object itself, its source). The \*(C`weight\*(C' method takes the name of a single item and calculates its weight based on the configuration of the \*(C`Algorithm::Dependency::Weight\*(C' object.
Returns the weight as a scalar (which in the naive case will be an integer, but in more complex uses may be any real number), or \*(C`undef\*(C' on error. The \*(C`weight_merged\*(C' method takes the name of a set of items and calculates an aggregated weight for the whole set.
Returns the weight as a scalar, or \*(C`undef\*(C' on error. The \*(C`weight_hash\*(C' method takes a list of item names, and calculates their weights.
Returns a reference to a \*(C`HASH\*(C' with the item names as keys and weights as values, or \*(C`undef\*(C' on error.
The \*(C`weight_all\*(C' method provides the one-shot method for getting the weights of all items at once. Please note that this does not do anything different or special, but is slightly faster than iterating yourself.
Returns a reference to a \*(C`HASH\*(C' with the item names as keys and weights as values, or \*(C`undef\*(C' on error.
- Add support for non-naive weights via either custom code or method name
Bugs should be submitted via the \s-1CPAN\s0 bug tracker, located at
http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Algorithm-Dependency <http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Algorithm-Dependency>
For general comments, contact the author.
Adam Kennedy <[email protected]>
Algorithm::Dependency, Algorithm::Dependency::Source
Copyright 2003 - 2009 Adam Kennedy.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
The full text of the license can be found in the \s-1LICENSE\s0 file included with this module.