From: Ian Jackson Date: Sat, 3 Oct 2009 08:54:20 +0000 (+0100) Subject: WIP routesearch; fix IslandTradeEnd memory management X-Git-Tag: 5.0^2~89 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?p=ypp-sc-tools.main.git;a=commitdiff_plain;h=1fcfaa86e65477e56372d827ed970229c336d3f2;hp=0145dc7f4fcaf62090a77fb2d69d5d7807c8d48d WIP routesearch; fix IslandTradeEnd memory management --- diff --git a/yarrg/rsvalue.c b/yarrg/rsvalue.c index f046c99..da7dbaf 100644 --- a/yarrg/rsvalue.c +++ b/yarrg/rsvalue.c @@ -40,12 +40,14 @@ typedef struct IslandTradeEnd { int qty; unsigned long generation; int rownum; -} IslandTradeEnd, *IslandDirnTradeEnds; +} IslandTradeEnd; typedef struct { - int islandid; - IslandDirnTradeEnds collect, deliver; -} IslandTradeEnds; + IslandTradeEnd *src, *dst; +} IslandTradeEndHeads; + +IslandTradeEndHeads *itradeends; + /* itradeends[islandid].{src,dst}->commodid etc. */ static LPX *lp; static unsigned long generation; @@ -61,7 +63,7 @@ static void add_constraint(int row, double coefficient) { constraint_coeffs[nconstraint_rows]= coefficient; } -static void avail_c(const Trade *t, IslandDirnTradeEnds *trades, +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 */ @@ -211,25 +213,6 @@ double value_route(int nislands, const int *islands) { assert(nislands >= 1); assert(++generation); - int nites=0; - IslandTradeEnds ites[nislands], *iteps[nislands]; - - for (s=0; sislandid==si) - goto found; - /* not found, add new */ - assert(ite == &ites[nites]); - ite->islandid= si; - ite->collect= ite->deliver= 0; - nites++; - found: - iteps[s]= ite; - } - assert(!lp); lp= lpx_create_prob(); lpx_set_obj_dir(lp, LPX_MAX); @@ -288,8 +271,8 @@ double value_route(int nislands, const int *islands) { nconstraint_rows=0; - avail_c(t, &iteps[s]->collect, t->src_price,"src", si, ss_ite_sell); - avail_c(t, &iteps[d]->deliver, t->dst_price,"dst", di, ss_ite_buy); + avail_c(t, &itradeends[s].src, t->src_price, "src", si, ss_ite_sell); + avail_c(t, &itradeends[d].dst, t->dst_price, "dst", di, ss_ite_buy); int leg; for (leg=s; leg