chiark / gitweb /
Merge branch 'web' of /u/ijackson/things/ypp-sc-tools
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 17 Sep 2009 00:43:35 +0000 (01:43 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 17 Sep 2009 00:43:35 +0000 (01:43 +0100)
1  2 
yarrg/web/routetrade

diff --combined yarrg/web/routetrade
index 383d55481b93bc34bf24f06bf58e19730722bc56,553afe05e96f63a36ab4d74e1709f7f22fe57dcd..d90bf40fb7afe7993c0f0924e4ea38c2e6dc2ba0
@@@ -54,7 -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 +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= "           
        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,
@@@ -506,8 -509,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= '';