chiark / gitweb /
Merge branch 'ijackson'
[ypp-sc-tools.db-test.git] / yarrg / web / routetrade
index 4be17c6e1a791a2ae952191137dfe22b561adf6a..d90bf40fb7afe7993c0f0924e4ea38c2e6dc2ba0 100644 (file)
@@ -54,7 +54,7 @@ my $loss_per_delay_slot= 1e-8;
 
 my $now= time;
 
-my %flow_conds;
+my @flow_conds;
 my @query_params;
 my %dists;
 
@@ -82,30 +82,33 @@ my @subflows;
 foreach my $org_i (0..$#islandids) {
        my $org_isle= $islandids[$org_i];
        my $org_cond= $sd_condition->('sell',$org_i);
-       my %dst_conds;
+       my @dst_conds;
        foreach my $dst_i ($org_i..$#islandids) {
                my $dst_isle= $islandids[$dst_i];
                # Don't ever consider sailing things round the houses:
-               next if grep { $dst_isle == $_ } @islandids[$org_i..$dst_i-1];
-               next if grep { $org_isle == $_ } @islandids[$org_i+1..$dst_i];
-               my $dst_cond= $sd_condition->('buy',$dst_i);
+               next if defined $dst_isle and
+                       grep { $dst_isle == $_ } @islandids[$org_i..$dst_i-1];
+               next if defined $org_isle and
+                       grep { $org_isle == $_ } @islandids[$org_i+1..$dst_i];
+               my $dst_cond;
                if ($dst_i==$org_i and !defined $org_isle) {
                        # we always want arbitrage, but mentioning an arch
                        # once shouldn't produce intra-arch trades
-                       $dst_cond=
-                               "($dst_cond AND sell.islandid = buy.islandid)";
+                       $dst_cond= "sell.islandid = buy.islandid";
+               } else {
+                       $dst_cond= $sd_condition->('buy',$dst_i);
                }
-               $dst_conds{$dst_cond}= 1;
+               push @dst_conds, $dst_cond;
 
                if ($specific) {
                        push @{ $ipair2subflowinfs{$org_isle,$dst_isle} },
                                [ $org_i, $dst_i ];
                }
        }
-       $flow_conds{ "$org_cond AND (
+       push @flow_conds, "$org_cond AND (
                        ".join("
-                    OR ", sort keys %dst_conds)."
-               )" }= 1;
+                    OR ",@dst_conds)."
+               )";
 }
 
 my $stmt= "            
@@ -154,7 +157,7 @@ my $stmt= "
        JOIN dists ON aiid = sell.islandid AND biid = buy.islandid
        WHERE   (
                ".join("
-          OR   ", sort keys %flow_conds)."
+          OR   ", @flow_conds)."
        )
          AND   buy.price > sell.price
        ORDER BY org_name, dst_name, commodname, unitprofit DESC,
@@ -462,7 +465,7 @@ foreach my $ci (0..($#islandids-1)) {
 
        my $applylimit= sub {
                my ($mv, $max, $f2val) = @_;
-               return unless defined $max;
+               $max= 1e9 unless defined $max;
 #print " DEFINED MAX $mv $max ";
                $cplex .= "
    ". sprintf("%-10s","${mv}_$ci:")." ".
@@ -506,7 +509,8 @@ if ($qa->{'debug'}) {
        my $input= pipethrough_prep();
        print $input $cplex or die $!;
        my $output= pipethrough_run_along($input, undef, 'glpsol',
-               qw(glpsol --cpxlp /dev/stdin -o /dev/stdout));
+               qw(glpsol --tmlim 2 --memlim 5 --intopt --cuts --bfs
+                         --cpxlp /dev/stdin -o /dev/stdout));
        print "<pre>\n" if $qa->{'debug'};
        my $found_section= 0;
        my $glpsol_out= '';
@@ -844,7 +848,7 @@ $addcols->({ Total => 0, DoReverse => 1, TotalSubflows => 1 }, qw(
      $show_flows->('org',0,'Collect'); $show_total->('Outlay',-1);
      my $totals= '';
      if ($i < $#islandids) {
-       $totals .=      "Hold: $sail_total[$i]{mass}kg,".
+       $totals .=      "In hold $sail_total[$i]{mass}kg,".
                        " $sail_total[$i]{volume} l";
        my $delim= '; spare ';
        my $domv= sub {