version 1.106, 2002/11/14 21:36:23
|
version 1.107, 2002/11/15 17:30:33
|
Line 1284 sub min {
|
Line 1284 sub min {
|
if ($a < $b) { return $a; } else { return $b; } |
if ($a < $b) { return $a; } else { return $b; } |
} |
} |
|
|
|
# In the CVS repository, documentation of this algorithm is included |
|
# in /doc/lonnavdocs, as a PDF and .tex source. Markers like **1** |
|
# will reference the same location in the text as the part of the |
|
# algorithm is running through. |
|
|
sub new { |
sub new { |
# magic invocation to create a class instance |
# magic invocation to create a class instance |
my $proto = shift; |
my $proto = shift; |
Line 1326 sub new {
|
Line 1331 sub new {
|
|
|
my $maxDepth = 0; # tracks max depth |
my $maxDepth = 0; # tracks max depth |
|
|
|
# **1** |
|
|
foreach my $pass (@iterations) { |
foreach my $pass (@iterations) { |
my $direction = $pass->[0]; |
my $direction = $pass->[0]; |
my $valName = $pass->[1]; |
my $valName = $pass->[1]; |
Line 1351 sub new {
|
Line 1358 sub new {
|
my $nextResources = $curRes->$nextResourceMethod(); |
my $nextResources = $curRes->$nextResourceMethod(); |
my $resourceCount = scalar(@{$nextResources}); |
my $resourceCount = scalar(@{$nextResources}); |
|
|
if ($resourceCount == 1) { |
if ($resourceCount == 1) { # **3** |
my $current = $nextResources->[0]->{DATA}->{$valName} || 999999999; |
my $current = $nextResources->[0]->{DATA}->{$valName} || 999999999; |
$nextResources->[0]->{DATA}->{$valName} = min($resultingVal, $current); |
$nextResources->[0]->{DATA}->{$valName} = min($resultingVal, $current); |
} |
} |
|
|
if ($resourceCount > 1) { |
if ($resourceCount > 1) { # **4** |
foreach my $res (@{$nextResources}) { |
foreach my $res (@{$nextResources}) { |
my $current = $res->{DATA}->{$valName} || 999999999; |
my $current = $res->{DATA}->{$valName} || 999999999; |
$res->{DATA}->{$valName} = min($current, $resultingVal + 1); |
$res->{DATA}->{$valName} = min($current, $resultingVal + 1); |
Line 1364 sub new {
|
Line 1371 sub new {
|
} |
} |
} |
} |
|
|
# Assign the final val |
# Assign the final val (**2**) |
if (ref($curRes) && $direction == BACKWARD()) { |
if (ref($curRes) && $direction == BACKWARD()) { |
my $finalDepth = min($curRes->{DATA}->{TOP_DOWN_VAL}, |
my $finalDepth = min($curRes->{DATA}->{TOP_DOWN_VAL}, |
$curRes->{DATA}->{BOT_UP_VAL}); |
$curRes->{DATA}->{BOT_UP_VAL}); |
Line 1386 sub new {
|
Line 1393 sub new {
|
push @{$self->{STACK}}, []; |
push @{$self->{STACK}}, []; |
} |
} |
|
|
# Prime the recursion w/ the first resource |
# Prime the recursion w/ the first resource **5** |
push @{$self->{STACK}->[0]}, $self->{FIRST_RESOURCE}; |
push @{$self->{STACK}->[0]}, $self->{FIRST_RESOURCE}; |
$self->{ALREADY_SEEN}->{$self->{FIRST_RESOURCE}->{ID}} = 1; |
$self->{ALREADY_SEEN}->{$self->{FIRST_RESOURCE}->{ID}} = 1; |
|
|
Line 1435 sub next {
|
Line 1442 sub next {
|
my $newDepth; |
my $newDepth; |
my $here; |
my $here; |
while ( $i >= 0 && !$found ) { |
while ( $i >= 0 && !$found ) { |
if ( scalar(@{$self->{STACK}->[$i]}) > 0 ) { |
if ( scalar(@{$self->{STACK}->[$i]}) > 0 ) { # **6** |
$here = pop @{$self->{STACK}->[$i]}; |
$here = pop @{$self->{STACK}->[$i]}; # **7** |
$found = 1; |
$found = 1; |
$newDepth = $i; |
$newDepth = $i; |
} |
} |
Line 1456 sub next {
|
Line 1463 sub next {
|
|
|
# If this is not a resource, it must be an END_BRANCH marker we want |
# If this is not a resource, it must be an END_BRANCH marker we want |
# to return directly. |
# to return directly. |
if (!ref($here)) { |
if (!ref($here)) { # **8** |
if ($here == END_BRANCH()) { # paranoia, in case of later extension |
if ($here == END_BRANCH()) { # paranoia, in case of later extension |
$self->{CURRENT_DEPTH}--; |
$self->{CURRENT_DEPTH}--; |
return $here; |
return $here; |
Line 1504 sub next {
|
Line 1511 sub next {
|
# one level lower. Thus, this is the end of the branch, since there are no |
# one level lower. Thus, this is the end of the branch, since there are no |
# more resources added to this level or above. |
# more resources added to this level or above. |
my $isEndOfBranch = $maxDepthAdded < $self->{CURRENT_DEPTH}; |
my $isEndOfBranch = $maxDepthAdded < $self->{CURRENT_DEPTH}; |
if ($isEndOfBranch) { |
if ($isEndOfBranch) { # **9** |
push @{$self->{STACK}->[$self->{CURRENT_DEPTH}]}, END_BRANCH(); |
push @{$self->{STACK}->[$self->{CURRENT_DEPTH}]}, END_BRANCH(); |
} |
} |
|
|