view release on metacpan or search on metacpan
lib/AI/Pathfinding/OptimizeMultiple.pm view on Meta::CPAN
$iters_quota += $q_more;
# Next number of iterations for each scan x scan combination.
my $next_num_iters = (
( $ones_constant x $flares_num_iters ) + (
PDL::MatrixOps::identity( $self->_get_num_scans() ) *
$iters_quota
)
);
# print "\$next_num_iters = $next_num_iters\n";
my $iters = $self->_scans_data()->slice(":,:,0");
my $iters_repeat =
$iters->dummy( 0, $self->_get_num_scans() )->xchg( 1, 2 )
->clump( 2 .. 3 );
# print "\$iters_repeat =", join(",",$iters_repeat->dims()), "\n";
my $next_num_iters_repeat =
$next_num_iters->dummy( 0, $self->_num_boards() )->xchg( 0, 2 );
# print "\$next_num_iters_repeat =", join(",",$next_num_iters_repeat->dims()), "\n";
# A boolean tensor of which boards were solved:
# Dimension 0 - Which scan is it. - size - _get_num_scans()
# Dimension 1 - Which scan we added the quota to
# - size - _get_num_scans()
# Dimension 2 - Which board. - size - _num_boards()
my $solved =
( $iters_repeat >= 0 ) * ( $iters_repeat < $next_num_iters_repeat );
# print "\$num_moves_repeat =", join(",",$num_moves_repeat->dims()), "\n";
my $num_moves_solved =
( $solved * $num_moves_repeat ) +
( $solved->not() * $UNSOLVED_NUM_MOVES_CONSTANT );
my $minimal_num_moves_solved =
$num_moves_solved->xchg( 0, 1 )->minimum();
my $which_minima_are_solved =
( $minimal_num_moves_solved != $UNSOLVED_NUM_MOVES_CONSTANT );
my $minimal_with_zeroes =
$which_minima_are_solved * $minimal_num_moves_solved;
my $solved_moves_sums = _my_xchg_sum_over($minimal_with_zeroes);
my $solved_moves_counts = _my_xchg_sum_over($which_minima_are_solved);
my $solved_moves_avgs = $solved_moves_sums / $solved_moves_counts;
# print join(",", $solved_moves_avgs->minmaximum()), "\n";
my $min_avg;
( $min_avg, undef, $selected_scan_idx, undef ) =
$solved_moves_avgs->minmaximum();
$last_avg = $min_avg;
push @{ $self->chosen_scans() },
$self->_calc_chosen_scan( $selected_scan_idx, $iters_quota );
lib/AI/Pathfinding/OptimizeMultiple.pm view on Meta::CPAN
( $flares_num_iters_repeat >= $iters->clump( 1 .. 2 ) ) &
( $iters->clump( 1 .. 2 ) >= 0 );
my $total_num_iters = (
( $solved_with_which_iter * $flares_num_iters_repeat )->sum() + (
$solved_with_which_iter->not()->andover() *
$flares_num_iters->sum()
)->sum()
);
print "Finished ", $loop_iter_num++,
" ; #Solved = $num_solved ; Iters = $total_num_iters ; Avg = $min_avg\n";
STDOUT->flush();
}
}
sub calc_board_iters
{
my $self = shift;
my $board = shift;
lib/AI/Pathfinding/OptimizeMultiple.pm view on Meta::CPAN
cmd_line => "--preset third_search",
),
],
}
);
$obj->calc_meta_scan();
foreach my $scan_alloc (@{$self->chosen_scans()})
{
printf "Run %s for %d iterations.\n",
$scans[$scan_alloc->scan_idx], $scan_alloc->iters;
}
=head1 DESCRIPTION
This CPAN distribution implements the algorithm described here:
=over 4
=item * L<https://groups.google.com/group/comp.ai.games/msg/41e899e9beea5583?dmode=source&output=gplain&noredirect>
lib/AI/Pathfinding/OptimizeMultiple/App/CmdLine.pm view on Meta::CPAN
"opt-for=s" => \$optimize_for,
"simulate-to=s" => \$simulate_to,
"sprtf" => \$_add_horne_prune,
"input-class=s" => \$input_obj_class,
"stats-factors=f" => \%stats_factors,
) or die "Extracting options from ARGV array failed - $!";
if ($help)
{
$self->_should_exit_immediately(1);
print <<"EOF";
$0 - optimize a game AI multi-tasking configuration
--help | -h - displays this help screen
--output=[filename] | -o [filename] - output to this file instead of STDOUT.
EOF
return;
}
$self->_start_board($_start_board);
$self->_num_boards($num_boards);
lib/AI/Pathfinding/OptimizeMultiple/App/CmdLine.pm view on Meta::CPAN
{
return "\n\n\n";
}
sub _out_script
{
my $self = shift;
my $cmd_line_string = shift;
$self->_get_script_fh()
->print( $cmd_line_string,
$self->_get_script_terminator($cmd_line_string) );
}
sub _get_line_of_command
{
my $self = shift;
my $args_string = join( " ",
$self->_start_board(),
$self->_start_board() + $self->_num_boards() - 1, 1 );
lib/AI/Pathfinding/OptimizeMultiple/App/CmdLine.pm view on Meta::CPAN
? "get_scans_lens_iters_pdls"
: "get_scans_iters_pdls"
);
return $self->_input_obj->$method();
}
sub _arbitrator_trace_cb
{
my $args = shift;
printf( "%s \@ %s (%s solved)\n",
@$args{qw(iters_quota selected_scan_idx total_boards_solved)} );
}
sub _init_arbitrator
{
my $self = shift;
return $self->_arbitrator(
AI::Pathfinding::OptimizeMultiple->new(
{
lib/AI/Pathfinding/OptimizeMultiple/App/CmdLine.pm view on Meta::CPAN
}
)
);
}
sub _report_total_iters
{
my $self = shift;
if ( $self->_arbitrator()->get_final_status() eq "solved_all" )
{
print "Solved all!\n";
}
printf( "total_iters = %s\n", $self->_arbitrator()->get_total_iters() );
}
sub _arbitrator_process
{
my $self = shift;
$self->_arbitrator()->calc_meta_scan();
my $scans =
$self->_post_processor->process( $self->_arbitrator->chosen_scans() );
$self->_chosen_scans($scans);
}
sub _do_trace_for_board
{
my $self = shift;
my $board = shift;
my $results = $self->_arbitrator()->calc_board_iters($board);
print "\@info=" . join( ",", @{ $results->{per_scan_iters} } ) . "\n";
print +( $board + $self->_start_board() ) . ": "
. $results->{board_iters} . "\n";
}
sub _real_do_trace
{
my $self = shift;
foreach my $board ( 0 .. $self->_num_boards() - 1 )
{
$self->_do_trace_for_board($board);
}
lib/AI/Pathfinding/OptimizeMultiple/App/CmdLine.pm view on Meta::CPAN
}
sub _get_run_string
{
my $self = shift;
my $results = shift;
return join(
"",
map {
sprintf( '%i@%i,',
$_->iters(), $self->_map_scan_idx_to_id( $_->scan_idx() ) )
} @{ $self->_post_processor->process( $results->scan_runs() ) },
);
}
sub _do_simulation_for_board
{
my ( $self, $board ) = @_;
my $results = $self->_arbitrator()->simulate_board($board);
my $scan_mapper = sub {
my $index = shift;
return $self->_map_scan_idx_to_id($index);
};
return sprintf( "%i:%s:%s:%i",
$board + 1,
$results->get_status(),
$self->_get_run_string($results),
$results->get_total_iters(),
);
}
sub _real_do_simulation
{
my $self = shift;
open my $simulate_out_fh, ">", $self->_simulate_to()
or Carp::confess( "Could not open " . $self->_simulate_to() . " - $!" );
foreach my $board ( 0 .. $self->_num_boards() - 1 )
{
print {$simulate_out_fh} $self->_do_simulation_for_board($board), "\n";
}
close($simulate_out_fh);
return;
}
sub _do_simulation
{
my $self = shift;
lib/AI/Pathfinding/OptimizeMultiple/DataInputObj.pm view on Meta::CPAN
"data/" . $scan->id() . ".fcpro.moves.txt"
),
]
);
writefraw( $c, $dest );
}
{
my $scan_vec = readfraw($dest);
$scans_lens_data->{ $scan->id() } = $scan_vec->slice(
sprintf( "%d:%d,:,*",
( $start_board - 1 ),
( ( $self->num_boards() - 1 ) + ( $start_board - 1 ) ) )
)->xchg( 1, 2 );
}
}
}
return { 'scans' => $scans_data, 'with_lens' => $scans_lens_data };
}
lib/AI/Pathfinding/OptimizeMultiple/DataInputObj.pm view on Meta::CPAN
my $fn = $self->_get_next_id_file_path;
use autodie;
open my $in, "<", $fn;
$id = <$in>;
chomp($id);
close($in);
open my $out, ">", $fn;
print {$out} ( $id + 1 );
close($out);
return $id;
}
sub get_prev_scans
{
my ($self) = @_;
my @prev_scans;
lib/AI/Pathfinding/OptimizeMultiple/DataInputObj.pm view on Meta::CPAN
my $cmd_line = $self->_get_scan_cmd_line($args);
open my $from_cmd, "-|", @$cmd_line
or die "Could not start '@$cmd_line'";
open my $fcs_out, ">", "data/$id.fcs.moves.txt";
open my $fc_pro_out, ">", "data/$id.fcpro.moves.txt";
$fcs_out->autoflush(1);
$fc_pro_out->autoflush(1);
while ( my $line = <$from_cmd> )
{
print $line;
chomp($line);
if ( $line =~ m{\A\[\[Num FCS Moves\]\]=(.*)\z}o )
{
print {$fcs_out} "$1\n";
}
elsif ( $line =~ m{\A\[\[Num FCPro Moves\]\]=(.*)\z}o )
{
print {$fc_pro_out} "$1\n";
}
}
close($from_cmd);
close($fcs_out);
close($fc_pro_out);
}
sub get_scan_ids_aref
{
my $self = shift;
lib/AI/Pathfinding/OptimizeMultiple/ScanRun.pm view on Meta::CPAN
AI::Pathfinding::OptimizeMultiple::ScanRun - running scan_idx for certain
iterations.
=head1 VERSION
version 0.0.17
=head1 SYNOPSIS
printf "Run %s for %d iterations.\n",
$scans[$scan_alloc->scan_idx], $scan_alloc->iters;
=head1 DESCRIPTION
A class for scan iterations.
=head1 SLOTS
=head2 $scan_run->scan_idx()