chiark / gitweb /
Merge branch 'ijackson'
[ypp-sc-tools.db-test.git] / yarrg / web / routetrade
index 05294b5503ce8bbd8d81319451b686e38f1e1304..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,
@@ -324,7 +327,7 @@ foreach my $f (@flows) {
                my $first= $base;
                do {
                        my $this= $uue % $base;
-print STDERR "uue=$uue this=$this ";
+#print STDERR "uue=$uue this=$this ";
                        $uue -= $this;
                        $uue /= $base;
                        $this += $first;
@@ -332,8 +335,8 @@ print STDERR "uue=$uue this=$this ";
                        $cmpu .= chr($this + ($this < 26 ? ord('a') :
                                              $this < 52 ? ord('A')-26
                                                         : ord('0')-52));
-print STDERR " uue=$uue this=$this cmpu=$cmpu\n";
-die "$cmpu $uue ?" if length $cmpu > 20;
+#print STDERR " uue=$uue this=$this cmpu=$cmpu\n";
+                       die "$cmpu $uue ?" if length $cmpu > 20;
                } while ($uue);
                $cmpu;
        } @uid;
@@ -450,9 +453,9 @@ foreach my $ci (0..($#islandids-1)) {
                next unless @relsubflow;
                die unless @relsubflow == 1;
                push @rel_subflows, @relsubflow;
-print " RELEVANT $ci $relsubflow[0]->{Var} ";
+#print " RELEVANT $ci $relsubflow[0]->{Var} ";
        }
-print " RELEVANT $ci COUNT ".scalar(@rel_subflows)."  ";
+#print " RELEVANT $ci COUNT ".scalar(@rel_subflows)."  ";
        if (!@rel_subflows) {
                foreach my $mv (qw(mass volume)) {
                        $sail_total[$ci]{$mv}= 0;
@@ -462,12 +465,12 @@ print " RELEVANT $ci COUNT ".scalar(@rel_subflows)."  ";
 
        my $applylimit= sub {
                my ($mv, $max, $f2val) = @_;
-               return unless defined $max;
-print " DEFINED MAX $mv $max ";
+               $max= 1e9 unless defined $max;
+#print " DEFINED MAX $mv $max ";
                $cplex .= "
    ". sprintf("%-10s","${mv}_$ci:")." ".
                join(" + ", map {
-print " PART MAX $_->{Var} $_->{Flow}{Ix} ";
+#print " PART MAX $_->{Var} $_->{Flow}{Ix} ";
                        $f2val->($_->{Flow}) .' '. $_->{Var};
                } @rel_subflows).
                " <= $max";
@@ -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 {