X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?a=blobdiff_plain;f=yarrg%2Fweb%2Froutetrade;h=6bc7277d341a69049358dbb40176700657674187;hb=f41b94c1ec31bbff084b7429c1aec495aca2ab1e;hp=0edcca539afa87cc072e9abc6ab4dd6c86fedfc5;hpb=c2c600fb1b0bbe2627ac95e4dfe5e502780d986f;p=ypp-sc-tools.db-live.git
diff --git a/yarrg/web/routetrade b/yarrg/web/routetrade
index 0edcca5..6bc7277 100644
--- a/yarrg/web/routetrade
+++ b/yarrg/web/routetrade
@@ -142,16 +142,31 @@ my $sth= $dbh->prepare($stmt);
$sth->execute(@query_params);
my @flows;
-my @columns;
+my @cols;
+
+my $addcols= sub {
+ my $base= shift @_;
+ foreach my $name (@_) {
+ push @cols, { Name => $name, %$base };
+ }
+};
+
if ($qa->{ShowStalls}) {
- push @columns, qw(org_name org_stallname dst_name dst_stallname);
+ $addcols->({ Text => 1 }, qw(
+ org_name org_stallname
+ dst_name dst_stallname
+ ));
} else {
- push @columns, qw(org_name dst_name);
+ $addcols->({Text => 1 }, qw(
+ org_name dst_name
+ ));
}
-push @columns, qw(commodname
- org_price org_qty dst_price dst_qty
- unitprofit PctProfit
- MaxQty MaxCapital MaxProfit);
+$addcols->({ Text => 1 }, qw(commodname));
+$addcols->({},
+ qw( org_qty org_price dst_qty dst_price
+ Margin unitprofit MaxQty
+ MaxCapital MaxProfit
+ ));
%perl>
@@ -162,14 +177,97 @@ push @columns, qw(commodname
% }
-% {
<& dumptable:start, qa => $qa, sth => $sth &>
-% my $flow;
-% while ($flow= $sth->fetchrow_hashref()) {
-% $flow->{Ix}= @flows;
-% $flow->{Var}= "f$flow->{Ix}";
-% push @flows, $flow;
-<& dumptable:row, qa => $qa, sth => $sth, row => $flow &>
+% {
+% my $f;
+% while ($f= $sth->fetchrow_hashref()) {
+<%perl>
+
+ $f->{Ix}= @flows;
+ $f->{Var}= "f$f->{Ix}";
+
+ $f->{MaxQty}= $f->{'org_qty'} < $f->{'dst_qty'}
+ ? $f->{'org_qty'} : $f->{'dst_qty'};
+ $f->{MaxProfit}= $f->{MaxQty} * $f->{'unitprofit'};
+ $f->{MaxCapital}= $f->{MaxQty} * $f->{'org_price'};
+
+ $f->{Margin}= sprintf "%3.1f%%",
+ $f->{'dst_price'} * 100.0 / $f->{'org_price'} - 100.0;
+
+ $f->{"org_stallid"}= $f->{"dst_stallid"}= 'all'
+ if !$qa->{ShowStalls};
+
+ my @uid= $f->{commodid};
+ foreach my $od (qw(org dst)) {
+ push @uid,
+ $f->{"${od}_id"},
+ $f->{"${od}_price"};
+ push @uid,
+ $f->{"${od}_stallid"}
+ if $qa->{ShowStalls};
+ }
+ $f->{UidLong}= join '_', @uid;
+
+ my $base= 31;
+ my $cmpu= '';
+ map {
+ my $uue= $_;
+ my $first= $base;
+ do {
+ my $this= $uue % $base;
+print STDERR "uue=$uue this=$this ";
+ $uue -= $this;
+ $uue /= $base;
+ $this += $first;
+ $first= 0;
+ $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;
+ } while ($uue);
+ $cmpu;
+ } @uid;
+ $f->{UidShort}= $cmpu;
+
+ if ($qa->{'debug'}) {
+ my @outuid;
+ $_= $f->{UidShort};
+ my $mul;
+ while (m/./) {
+ my $v= m/^[a-z]/ ? ord($&)-ord('a') :
+ m/^[A-Z]/ ? ord($&)-ord('A')+26 :
+ m/^[0-9]/ ? ord($&)-ord('0')+52 :
+ die "$_ ?";
+ if ($v >= $base) {
+ push @outuid, 0;
+ $v -= $base;
+ $mul= 1;
+#print STDERR "(next)\n";
+ }
+ die "$f->{UidShort} $_ ?" unless defined $mul;
+ $outuid[$#outuid] += $v * $mul;
+
+#print STDERR "$f->{UidShort} $_ $& v=$v mul=$mul ord()=".ord($&).
+# "[vs.".ord('a').",".ord('A').",".ord('0')."]".
+# " outuid=@outuid\n";
+
+ $mul *= $base;
+ s/^.//;
+ }
+ my $recons_long= join '_', @outuid;
+ $f->{UidLong} eq $recons_long or
+ die "$f->{UidLong} = $f->{UidShort} = $recons_long ?";
+ }
+
+ if ($qa->{"R$f->{UidShort}"} && !$qa->{"T$f->{UidShort}"}) {
+ $f->{Suppress}= 1;
+ }
+
+ push @flows, $f;
+
+%perl>
+<& dumptable:row, qa => $qa, sth => $sth, row => $f &>
% }
<& dumptable:end, qa => $qa &>
% }
@@ -198,20 +296,29 @@ Maximize
totalprofit:
".(join " +
- ", map { "$_->{unit_profit} $_->{Var}" } @flows)."
+ ", map { "$_->{unitprofit} $_->{Var}" } @flows)."
Subject To
";
my %avail_csts;
foreach my $flow (@flows) {
+ if ($flow->{Suppress}) {
+ $cplex .= "
+ $flow->{Var} = 0
+";
+ next;
+ }
foreach my $od (qw(org dst)) {
- my $cstname= join '_',
+ my $cstname= join '_', (
'avail',
$flow->{'commodid'},
$od,
$flow->{"${od}_id"},
- $flow->{"${od}_price"};
+ $flow->{"${od}_price"},
+ $flow->{"${od}_stallid"},
+ );
+
push @{ $avail_csts{$cstname}{Flows} }, $flow->{Var};
$avail_csts{$cstname}{Qty}= $flow->{"${od}_qty"};
}
@@ -272,9 +379,12 @@ if ($qa->{'debug'}) {
die unless $found_section;
};
-print join ' ', map { $_->{Optimal} } @flows;
-
-push @columns, qw(OptQty OptCapital OptProfit);
+$addcols->({}, qw(
+ OptQty
+ ));
+$addcols->({ Total => 0 }, qw(
+ OptCapital OptProfit
+ ));
%perl>
@@ -283,8 +393,20 @@ push @columns, qw(OptQty OptCapital OptProfit);
% {
% my $cdspan= $qa->{ShowStalls} ? ' colspan=2' : '';
% my $cdstall= $qa->{ShowStalls} ? '
Stall | ' : '';
-