X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?p=ypp-sc-tools.db-test.git;a=blobdiff_plain;f=yarrg%2Frsvalue.c;h=b469378303de295f3c12d17b20cc9b65f44ac772;hp=30e561243135602bcae853b5f2f6b1d32138bb30;hb=HEAD;hpb=b893cd231686686783b7a32bc429803760c86352 diff --git a/yarrg/rsvalue.c b/yarrg/rsvalue.c index 30e5612..b469378 100644 --- a/yarrg/rsvalue.c +++ b/yarrg/rsvalue.c @@ -1,10 +1,36 @@ -/**/ +/* + * Route searcher - route evaluation + */ +/* + * This is part of the YARRG website, a tool for assisting + * players of Yohoho Puzzle Pirates. + * + * Copyright (C) 2009 Ian Jackson + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * Yohoho and Puzzle Pirates are probably trademarks of Three Rings and + * are used without permission. This program is not endorsed or + * sponsored by Three Rings. + */ #include #include "rscommon.h" DEBUG_DEFINE_DEBUGF(value); +DEBUG_DEFINE_SOME_DEBUGF(value2,debug2f); typedef struct { int mass, volu; } CommodInfo; static int commodstabsz; @@ -61,18 +87,22 @@ static void add_constraint(int row, double coefficient) { constraint_coeffs[nconstraint_rows]= coefficient; } -static void avail_c(const Trade *t, IslandTradeEnd **trades, - int price, const char *srcdst, - int islandid, sqlite3_stmt *ss_ite) { - /* find row number of trade availability constraint */ +static IslandTradeEnd *get_ite(const Trade *t, IslandTradeEnd **trades, + int price) { IslandTradeEnd *search; - + for (search= *trades; search; search=search->next) if (search->commodid==t->commodid && search->price==price) - goto found; + return search; abort(); - - found:; +} + +static void avail_c(const Trade *t, IslandTradeEnd *ite, + int price, const char *srcdst, + int islandid, sqlite3_stmt *ss_ite) { + /* find row number of trade availability constraint */ + IslandTradeEnd *search= ite; + if (search->generation != generation) { search->rownum= lpx_add_rows(lp, 1); lpx_set_row_bnds(lp, search->rownum, LPX_UP, 0, search->qty); @@ -136,16 +166,19 @@ static IslandPair *ipair_get_create(int si, int di) { assert(di < islandtablesz); if (!(ipa= ipairs[si])) { - ipa= ipairs[si]= mcalloc(sizeof(*ipa) * islandtablesz); + ipairs[si]= MCALLOC(ipa, islandtablesz); } if ((ip= ipa[di])) return ip; - ipa[di]= ip= mmalloc(sizeof(*ip)); + ipa[di]= NEW(ip); ip->trades= 0; ip->route_tail_value= -1; - debugf("VALUE ipair_get(i%d,i%d) running...\n", si,di); + if (si==di) ctr_islands_arbitrage++; + else ctr_ipairs_relevant++; + + debug2f("VALUE ipair_get(i%d,i%d) running...\n", si,di); SQL_MUST( sqlite3_bind_int(ss_ipair_dist, 1, si) ); SQL_MUST( sqlite3_bind_int(ss_ipair_dist, 2, di) ); assert(SQL_STEP(ss_ipair_dist)); @@ -251,10 +284,22 @@ double value_route(int nislands, const int *islands, int exclude_arbitrage) { debugf(" TRADE i%d#%d..i%d#%d c%d %d-%d ", si,s, di,d, t->commodid, t->src_price, t->dst_price); + IslandTradeEnd + *src_ite= get_ite(t, &itradeends[si].src, t->src_price), + *dst_ite= get_ite(t, &itradeends[di].dst, t->dst_price); + + int qty= src_ite->qty < dst_ite->qty ? src_ite->qty : dst_ite->qty; + int maxprofit= qty * (t->dst_price - t->src_price); + debugf("maxprofit=%d ",maxprofit); + if (maxprofit < min_trade_maxprofit) { + debugf("trivial\n"); + continue; + } + nconstraint_rows=0; - avail_c(t, &itradeends[si].src, t->src_price, "src", si,ss_ite_sell); - avail_c(t, &itradeends[di].dst, t->dst_price, "dst", di,ss_ite_buy); + avail_c(t, src_ite, t->src_price, "src", si,ss_ite_sell); + avail_c(t, dst_ite, t->dst_price, "dst", di,ss_ite_buy); int leg; for (leg=s; legtrades; if (!block || ip->trades->ntrades >= TRADES_PER_BLOCK) { - block= mmalloc(sizeof(*block)); + NEW(block); block->next= ip->trades; ip->trades= block; block->ntrades= 0; @@ -379,7 +427,7 @@ static void read_islandtradeends(const char *bs, int srcdstoff) { goto found; /* not found, add new end */ - search= mmalloc(sizeof(*search)); + NEW(search); search->commodid= commodid; search->price= price; search->next= *trades; @@ -395,12 +443,11 @@ static void read_islandtradeends(const char *bs, int srcdstoff) { void setup_value(void) { sqlite3_stmt *sst; - int i; commodstabsz= sql_single_int("SELECT max(commodid) FROM commods") + 1; - commodstab= mmalloc(sizeof(*commodstab)*commodstabsz); - for (i=0; imass= this->volu= -1 + ); SQL_PREPARE(sst, "SELECT commodid,unitmass,unitvolume FROM commods"); @@ -413,8 +460,8 @@ void setup_value(void) { } sqlite3_finalize(sst); - ipairs= mcalloc(sizeof(*ipairs) * islandtablesz); - itradeends= mcalloc(sizeof(*itradeends) * islandtablesz); + MCALLOC(ipairs, islandtablesz); + MCALLOC(itradeends, islandtablesz); SQL_PREPARE(ss_ipair_dist, " SELECT dist FROM dists\n"