From 8fecbed75b67d8e1ebbb84ac2ad7a2173e5e5c7c Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sun, 4 Oct 2009 23:44:33 +0100 Subject: [PATCH] routetrade: Do not instantiate useless island pairs --- yarrg/rscommon.h | 2 +- yarrg/rssearch.c | 3 ++- yarrg/rsvalue.c | 18 ++++++++++++++---- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/yarrg/rscommon.h b/yarrg/rscommon.h index d91765e..965b6db 100644 --- a/yarrg/rscommon.h +++ b/yarrg/rscommon.h @@ -81,7 +81,7 @@ typedef struct { double route_tail_value; } IslandPair; -IslandPair *ipair_get(int si, int di); +IslandPair *ipair_get_maybe(int si, int di); double value_route(int nislands, const int *islands, int exclude_arbitrage); void setup_value(void); diff --git a/yarrg/rssearch.c b/yarrg/rssearch.c index eb40a47..9404cb2 100644 --- a/yarrg/rssearch.c +++ b/yarrg/rssearch.c @@ -53,7 +53,8 @@ static double process_route(int nports, int totaldist, for (i=0; iroute_tail_value < 0) ip->route_tail_value= value_route(2, pair, pair[0]!=pair[1]); guess_absolute += ip->route_tail_value; diff --git a/yarrg/rsvalue.c b/yarrg/rsvalue.c index c3fac1a..d2190dc 100644 --- a/yarrg/rsvalue.c +++ b/yarrg/rsvalue.c @@ -118,7 +118,17 @@ static void add_leg_c(int startrow, int leg, double value) { add_constraint(startrow+leg, value); } -IslandPair *ipair_get(int si, int di) { +IslandPair *ipair_get_maybe(int si, int di) { + IslandPair **ipa; + + assert(si < islandtablesz); + assert(di < islandtablesz); + + if (!(ipa= ipairs[si])) return 0; + return ipa[di]; +} + +static IslandPair *ipair_get_create(int si, int di) { IslandPair *ip, **ipa; assert(si < islandtablesz); @@ -218,9 +228,9 @@ double value_route(int nislands, const int *islands, int exclude_arbitrage) { /*----- actually add these trades to the LP problem -----*/ - IslandPair *ip= ipair_get(islands[s], islands[d]); + IslandPair *ip= ipair_get_maybe(islands[s], islands[d]); - if (!ip->trades) + if (!ip || !ip->trades) goto next_d; double loss_factor= delay_slot_loss_factor * ip->distance_loss_factor; @@ -317,7 +327,7 @@ static void read_trades(void) { SQL_DISTINCT_DECL(cols,5); while (SQL_DISTINCT_STEP(ss_trades,cols,5)) { - IslandPair *ip= ipair_get(cols[1], cols[3]); + IslandPair *ip= ipair_get_create(cols[1], cols[3]); TradesBlock *block= ip->trades; if (!block || ip->trades->ntrades >= TRADES_PER_BLOCK) { block= mmalloc(sizeof(*block)); -- 2.30.2