From efb064a7b665a2a704f52a8357dc88137cba7f82 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Wed, 9 Sep 2009 18:35:03 +0100 Subject: [PATCH] Show total and spare mass and volume for each leg sailed --- yarrg/TODO | 2 - yarrg/web/routetrade | 114 +++++++++++++++++++++++++++++++------------ 2 files changed, 83 insertions(+), 33 deletions(-) diff --git a/yarrg/TODO b/yarrg/TODO index 6b227eb..c2bd4cb 100644 --- a/yarrg/TODO +++ b/yarrg/TODO @@ -34,8 +34,6 @@ WEBSITE initial/final stocks feature - max volume/mass - max capital better documentation diff --git a/yarrg/web/routetrade b/yarrg/web/routetrade index 397e385..0da1fd8 100644 --- a/yarrg/web/routetrade +++ b/yarrg/web/routetrade @@ -264,6 +264,8 @@ foreach my $v (qw(MaxMass MaxVolume)) { <%perl> +my @total_massvol; + if (!@flows) { print 'No profitable trading opportunities were found.'; return; @@ -442,7 +444,7 @@ foreach my $ci (0..($#islandids-1)) { foreach my $mv (qw(mass volume)) { my $max_vn= "max_$mv"; my $max= $mv eq 'mass' ? $max_mass : $max_volume; - next unless defined $max; + $max= 1e9 unless defined $max; #print " DEFINED MAX $mv $max "; $cplex .= " ". sprintf("%-10s","${mv}_$ci:")." ". @@ -483,31 +485,54 @@ if ($qa->{'debug'}) { print "
\n" if $qa->{'debug'};
 	my $found_section= 0;
 	my $glpsol_out= '';
+	my $continuation='';
 	while (<$output>) {
 		$glpsol_out.= $_;
 		print encode_entities($_) if $qa->{'debug'};
-		if (m/^\s*No\.\s+Column name\s+(?:St\s+)?Activity\s/) {
-			die if $found_section>0;
+		if (m/^\s*No\.\s+(Row|Column) name\s+(?:St\s+)?Activity\s/) {
+			die "$_ $found_section ?" if $found_section>0;
 			$found_section= 1;
 			next;
 		}
 		next unless $found_section==1;
-		next if m/^[- ]+$/;
-		if (!/\S/) {
-			$found_section= 2;
-			next;
+		if (!length $continuation) {
+			next if !$continuation &&  m/^[- ]+$/;
+			if (!/\S/) {
+				$found_section= 0;
+				next;
+			}
+			if (m/^ \s* \d+ \s+ \w+ $/x) {
+				$continuation= $&;
+				next;
+			}
+		}
+		$_= $continuation.$_;
+		$continuation= '';
+		my ($varname, $qty) = m/^
+			\s* \d+ \s+
+			(\w+) \s+ (?: [A-Z*]+ \s+ )?
+			([0-9.]+) \s
+			/x or die "$_ ?";
+		if ($varname =~ m/^f(\d+)$/) {
+			my ($ix) = $1;
+			my $flow= $flows[$ix] or die;
+			$flow->{OptQty}= $qty;
+			$flow->{OptProfit}= $flow->{'unitprofit'} * $qty;
+			$flow->{OptCapital}= $flow->{OptQty} *
+				$flow->{'org_price'};
+		} elsif ($varname =~ m/^(mass|volume)_(\d+)$/) {
+			my ($mv,$ix) = ($1,$2);
+			$total_massvol[$ix]{$mv}= $qty;
 		}
-		my ($ix, $qty) =
-			m/^\s*\d+\s+f(\d+)\s+\S+\s+(\d+)\s/ or die "$_ ?";
-		my $flow= $flows[$ix] or die;
-		$flow->{OptQty}= $qty;
-		$flow->{OptProfit}= $flow->{'unitprofit'} * $qty;
-		$flow->{OptCapital}= $flow->{OptQty} * $flow->{'org_price'};
 	}
 	print "
\n" if $qa->{'debug'}; my $prerr= "\n=====\n$cplex\n=====\n$glpsol_out\n=====\n "; pipethrough_run_finish($output,$prerr); - die $prerr unless $found_section; + map { defined $_->{OptQty} or die "$prerr $_->{Ix}" } @flows; +# map { defined +# die $prerr if grep { ! } @flows; +# map { die +# die $prerr if map { }; $addcols->({ DoReverse => 1, Special => sub { @@ -696,17 +721,40 @@ $addcols->({ Total => 0, DoReverse => 1 }, qw( } } - my $total; + my ($total, $total_to_show); my $dline= 0; - my $show_flows= sub { - my ($od,$arbitrage,$collectdeliver) = @_; + my $show_total= sub { + my ($totaldesc, $sign) = @_; + if (defined $total) { + die if defined $total_to_show; + $total_total += $sign * $total; + $total_to_show= [ $totaldesc, $total ]; + $total= undef; + } + $dline= 0; + }; + my $show_total_now= sub { + my ($xinfo) = @_; + return unless defined $total_to_show; + my ($totaldesc,$totalwas) = @$total_to_show; -% + + +<% $xinfo %> +<% $totaldesc %> +<% $totalwas |h %> total +<%perl> + $total_to_show= undef; + }; + +% my $show_flows= sub { +% my ($od,$arbitrage,$collectdeliver) = @_; % my $todo= $flowlists{$od}; % return unless $todo; % foreach my $tkey (sort keys %$todo) { % my $t= $todo->{$tkey}; % next if $t->{"${od}Arbitrage"} != $arbitrage; +% $show_total_now->(''); % if (!$age_reported++) { % my $age= $now - $t->{Timestamp}; % my $cellid= "da_${i}"; @@ -743,25 +791,29 @@ $addcols->({ Total => 0, DoReverse => 1 }, qw( % $dline ^= 1; % } % }; -% my $show_total= sub { -% my ($totaldesc, $sign)= @_; -% if (defined $total) { - - -<% $totaldesc %> -<% $total |h %> total -% $total_total += $sign * $total; -% } -% $total= undef; -% $dline= 0; <%perl> - }; $show_flows->('dst',0,'Deliver'); $show_total->('Proceeds',1); $show_flows->('org',1,'Collect'); $show_total->('(Arbitrage) outlay',-1); $show_flows->('dst',1,'Deliver'); $show_total->('(Arbitrage) proceeds',1); $show_flows->('org',0,'Collect'); $show_total->('Outlay',-1); - + my $totals= ''; + if ($i < $#islandids) { + $totals .= "In hold $total_massvol[$i]{mass} kg,". + " $total_massvol[$i]{volume} l"; + my $delim= '; spare '; + my $domv= sub { + my ($max, $got, $units) = @_; + return unless defined $max; + $totals .= $delim; + $totals .= sprintf "%g %s", ($max-$got), $units; + $delim= ', '; + }; + $domv->($max_mass, $total_massvol[$i]{mass}, 'kg'); + $domv->($max_volume, $total_massvol[$i]{volume}, 'l'); + $totals .= ".\n"; + } + $show_total_now->($totals); } -- 2.30.2