理系学生日記

おまえはいつまで学生気分なのか

シミュレーション時間を見積もる

シミュレーションしてるといつ終わるのかわからなくて,「もうおわったかなー」とか気になったり,「まだ終わってないかなー」とか気になったり,「そろそろ終わったよな」とか「いや,さすがにもう終わってるだろ」とか気になったりして,精神衛生上良くない感じがしたりする.そういうのってきっと良くないので,いつごろ終わるのか計算してメール送るスクリプトとか書いてみた.Getopt::CompactDate::Calc::ObjectMail::Sendmailあたりのモジュールはつかった。


シミュレーション回数とかパラメータとかはオプションで与えるようにしてたので,ほかにメールアドレスとかも与えるようにする.

my $o = Getopt::Compact->new(
    name => 'sim',
    struct =>
    [
     [[qw(C cnt)],      q{number of simulation trials (default: 5)}, '=i' ],
     [[qw(n num)],      q{number of initially-deployed nodes (default: 300)}, '=i', \@num ],
     [[qw(B ber)],      q{bit error rate (default: 1e-5)}, '=s', \@ber ],
     # パラメータとかいろいろ
     [[qw(d dest)],     q{destination mail address (default: hoge@hoge.hoge-u.ac.jp)}, '=s' ],
     [[qw(s src)],      q{source mail address (default: bar@bar-u.ac.jp)}, '=s' ],
     [[qw(S smtp)],     q{SMTP server (default: smtp@smtp-u.ac.jp)}, '=s' ],
    ],
    );
my $opts = $o->opts;

$opts->{dest} ||= 'hoge@hoge.hoge-u.ac.jp';
$opts->{src}  ||= 'bar@bar-u.ac.jp';
$opts->{smtp} ||= 'smtp@smtp-u.ac.jp';

シミュレーション時間の見積もりは,各パラメータセットについて1回だけシミュレーションを行って,その時間をシミュレーション回数倍してやる.

sub assume_sim_time (@) {
    my (@params) = @_;  # パラメータセットの配列

    my $start = Date::Calc->today_and_now();

    # シミュレーション回数を強制的に1にする
    my @testparam = map { { %$_, cnt => 1 } } @params;
    execute( $_ ) for (@testparam);

    my $end = Date::Calc->today_and_now();

    my $diff = $end - $start;
    # time()かなんかで秒数測った方が効率的なんじゃね?という話もある.
    $end += $diff for ( 2 .. $opts->{cnt} ); 

    return ($start, $end);
}

メールとか送る.メールは研究室のサーバ経由で送る.

sub send_sim_time {
    my ($start, $end) = @_;

    my %mail =
	 ( To	   => $opts->{dest},
	   From	   => $opts->{src},
	   Server  => $opts->{smtp},
	   Subject => 'assumption',
	 );

    my $msg = "start: " . join('/', $start->date) . ' ' . join(':', $start->time) . "\n";
    $msg   .= "end:   " . join('/', $end->date)   . ' ' . join(':', $end->time)   . "\n";

    sendmail( %mail, Message => $msg ) or die $Mail::Sendmail::error;
    print "Ok. Log says\n", $Mail::Sendmail::log, "\n";
}

すると,各パラメータセットについて一通り終わった時点で,こんなメールがくる.

start: 2007/8/21 20:28:46
end:   2007/8/25 17:13:18