use strict; use warnings; use diagnostics; use Data::Dumper; use List::Util qw(sum); use Math::Random::MT qw(rand); open (F1,'>>event_times_new2.csv'); open (F2,'>>lambda_star_new2.csv'); my @event_times; my @net_event_times; my @immigrants; my @new_immigrants; my @s; my @d; my @u; my @v; my $lambda0; my $alpha; my $beta; my $result; my $sum; my $lambda_star; my $time; my $counterfails=0; my $num=1; $time=8000000; $lambda0=1.2; $alpha=0.8; $beta=0.9; #subroutine that computes intensity function sub lambda { my $t = $_[0]; $sum=0; for (my $i=0; $i<@event_times; $i++) { $net_event_times[$i]=($t-$event_times[$i]); $immigrants[$i]=$alpha*exp(((-1)*$beta)*$net_event_times[$i]); } $sum= sum @immigrants; if ($immigrants[-1]==$alpha){ $sum+=(-$alpha); } $result=$lambda0+$sum; return $result; } #ALGO it self for (my $i=0; $i<2; $i++) { if ($i==0){ $lambda_star=$lambda0; $s[$i]=0; $d[$i]=0; $u[$i]=rand($num); $s[$i]=(-1)*(1/$lambda_star)*log($u[$i]); if ($s[$i]<$time){ $event_times[$i]=$s[$i]; print F1 "$event_times[$i]\n"; print F2 "$lambda_star\n"; }else{ die } }else { my $valuelambda=lambda($event_times[(($i)-1)]); $lambda_star=$valuelambda+$alpha; START: $u[$i]=rand($num); $s[$i]=$s[(($i)-1)]+(-1)*(1/$lambda_star)*log($u[$i]); if ($s[$i]>$time){ die } $d[$i]=rand($num) ; my $rejectionlambda=lambda($s[$i]); if ($d[$i]<($rejectionlambda/$lambda_star)){ $event_times[$i]=$s[$i]; print F1 "$event_times[$i]\n"; print F2 "$lambda_star\n"; }else{ $counterfails+=1; $lambda_star=$rejectionlambda; goto START; } } } print F1 "The number of event-times that failed the A/R procedure is $counterfails\n"; close F1; close F2;