chiark / gitweb /
Merge branch 'stable-5.x'
[ypp-sc-tools.main.git] / yarrg / web / routetrade
index 27cf295d19376abb8451f7dbba43f972a7aab100..9660094532aa1544fb5db23092546991c098ee75 100644 (file)
@@ -410,11 +410,17 @@ Maximize
   totalprofit:
 ";
 
+my %stall_poe_limits;
+
 foreach my $sf (@subflows) {
        my $eup= $sf->{Flow}{ExpectedUnitProfit};
        $eup *= (1.0-$loss_per_delay_slot) ** $sf->{Org};
        $cplex .= sprintf "
                %+.20f %s", $eup, $sf->{Var};
+       if ($qa->{ShowStalls}>=2) {
+               my $stall= $sf->{Flow}{'dst_stallid'};
+               push @{ $stall_poe_limits{$stall} }, $sf;
+       }
 }
 $cplex .= "
 
@@ -488,6 +494,24 @@ foreach my $ci (0..($#islandids-1)) {
        $cplex.= "\n";
 }
 
+if ($qa->{ShowStalls}>=2) {
+       my $stallpoe= $dbh->prepare(<<END);
+SELECT max(qty*price) FROM buy WHERE stallid=?
+END
+       foreach my $stallid (sort { $a <=> $b } keys %stall_poe_limits) {
+               $stallpoe->execute($stallid);
+               my ($lim)= $stallpoe->fetchrow_array();
+               $stallpoe->finish();
+               $cplex.= "
+    ". sprintf("%-15s","poe_$stallid:")." ".
+               join(" + ", map {
+                       sprintf "%d %s", $_->{Flow}{'dst_price'}, $_->{Var};
+               } @{ $stall_poe_limits{$stallid} }).
+               " <= $lim";
+       }
+       $cplex.= "\n";
+}
+
 $cplex.= "
 Bounds
         ".(join "
@@ -515,7 +539,7 @@ if ($qa->{'debug'}) {
        my $input= pipethrough_prep();
        print $input $cplex or die $!;
        my $output= pipethrough_run_along($input, undef, 'glpsol',
-               qw(glpsol --tmlim 2 --memlim 5 --intopt --cuts --bfs
+               qw(glpsol --tmlim 5 --memlim 5 --intopt --cuts --bfs
                          --cpxlp /dev/stdin -o /dev/stdout));
        print "<pre>\n" if $qa->{'debug'};
        my $found_section= 0;
@@ -638,14 +662,18 @@ Generated by YARRG at <strong><%
 %
 % foreach my $i (0..$#islandids) {
 <% $tbody->(1) %>
-<tr><td colspan=5>
+<tr>
 %      $iquery->execute($islandids[$i]);
 %      my ($islandname) = $iquery->fetchrow_array();
 %      if (!$i) {
+<td colspan=2>
 <strong>Start at <% $islandname |h %></strong>
+<td colspan=2><a href="docs#posinclass">[what are these codes?]</a>
+<td>
 %      } else {
 %              my $this_dist= $distance->($islandids[$i-1],$islandids[$i]);
 %              $total_dist += $this_dist;
+<td colspan=5>
 <%perl>
                my $total_value= 0;
                foreach my $sf (@subflows) {
@@ -689,18 +717,31 @@ Generated by YARRG at <strong><%
                } unless $$todo;
                $$todo->{'commodname'}= $f->{'commodname'};
                $$todo->{'posinclass'}= '';
-               if ($f->{'posinclass'}) {
-                       my $findclass= $dbh->prepare(<<END);
+               my $incl= $f->{'posinclass'};
+
+               my $findclass= $dbh->prepare(<<END);
 SELECT commodclass, maxposinclass FROM commodclasses WHERE commodclassid = ?
 END
-                       $findclass->execute($f->{'commodclassid'});
-                       my $classinfo= $findclass->fetchrow_hashref();
+               $findclass->execute($f->{'commodclassid'});
+               my $classinfo= $findclass->fetchrow_hashref();
+               if ($classinfo) {
+                       my $clname= $classinfo->{'commodclass'};
+                       my $desc= encode_entities(sprintf "%s is under %s",
+                                       $f->{'commodname'}, $clname);
+                       my $abbrev= substr($clname,0,1);
+                       if ($incl) {
+                               my $maxpic= $classinfo->{'maxposinclass'};
+                               $desc.= (sprintf ", commodity %d of %d",
+                                       $incl, $maxpic);
+                               if ($classinfo->{'maxposinclass'} >= 8) {
+                                       my @tmbs= qw(0 1 2 3 4 5 6 7 8 9);
+                                       my $tmbi= ($incl+0.5)*$#tmbs/$maxpic;
+                                       $abbrev.= " ".$tmbs[$tmbi]."&nbsp;";
+                               }
+                       }
                        $$todo->{'posinclass'}=
-                               sprintf "(%s %d/%d)",
-                               $classinfo->{'commodclass'},
-                               $f->{'posinclass'},
-                               $classinfo->{'maxposinclass'}
-                                       if $classinfo->{'maxposinclass'} > 9;
+                               "<div class=mouseover title=\"$desc\">"
+                               .$abbrev."</div>";
                }
                $$todo->{'stallname'}= $stallname;
                $$todo->{Price}= $price;
@@ -764,7 +805,7 @@ END
 % tr_datarow($m,$dline);
 <<% $td %>><% $collectdeliver %>
 <<% $td %>><% $t->{'commodname'} |h %>
-<<% $td %>><% $t->{'posinclass'} |h %>
+<<% $td %>><% $t->{'posinclass'} %>
 %
 %              my @stalls= sort keys %{ $t->{Stalls} };
 %              my $pstall= sub {