X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?a=blobdiff_plain;f=yarrg%2Frsvalue.c;h=30e561243135602bcae853b5f2f6b1d32138bb30;hb=b893cd231686686783b7a32bc429803760c86352;hp=c3fac1a01f9260c0812ea58c0f0bffe23f395fe0;hpb=2388148ea6c557995767e4391088838946c2f238;p=ypp-sc-tools.main.git diff --git a/yarrg/rsvalue.c b/yarrg/rsvalue.c index c3fac1a..30e5612 100644 --- a/yarrg/rsvalue.c +++ b/yarrg/rsvalue.c @@ -13,6 +13,7 @@ static CommodInfo *commodstab; static sqlite3_stmt *ss_ipair_dist; static sqlite3_stmt *ss_ite_buy, *ss_ite_sell; + #define MAX_LEGS (MAX_ROUTELEN-1) typedef struct { @@ -118,7 +119,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); @@ -148,6 +159,8 @@ IslandPair *ipair_get(int si, int di) { double value_route(int nislands, const int *islands, int exclude_arbitrage) { int s,d; + ctr_subroutes_valued++; + /* We need to construct the LP problem. GLPK talks * about rows and columns, which are numbered from 1. * @@ -185,6 +198,7 @@ double value_route(int nislands, const int *islands, int exclude_arbitrage) { lp= lpx_create_prob(); lpx_set_obj_dir(lp, LPX_MAX); lpx_set_int_parm(lp, LPX_K_MSGLEV, DEBUGP(lp) ? 3 : 1); + lpx_set_int_parm(lp, LPX_K_PRESOL, 1); if (DEBUGP(value)) { lpx_set_prob_name(lp,(char*)"value_route"); @@ -218,9 +232,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; @@ -278,6 +292,8 @@ double value_route(int nislands, const int *islands, int exclude_arbitrage) { double profit= 0; if (lpx_get_num_cols(lp)) { + ctr_subroutes_nonempty++; + if (DEBUGP(lp)) lpx_write_cpxlp(lp, (char*)DEBUG_DEV); @@ -317,7 +333,8 @@ 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]); + ctr_trades_loaded++; + 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)); @@ -347,6 +364,7 @@ static void read_islandtradeends(const char *bs, int srcdstoff) { SQL_DISTINCT_DECL(cols,5); while (SQL_DISTINCT_STEP(ss,cols,3)) { + ctr_quantities_loaded++; IslandTradeEnd *search; int commodid= cols[0]; @@ -387,6 +405,7 @@ void setup_value(void) { SQL_PREPARE(sst, "SELECT commodid,unitmass,unitvolume FROM commods"); while (SQL_STEP(sst)) { + ctr_commodities_loaded++; int id= sqlite3_column_int(sst,0); assert(id>=0 && id