chiark / gitweb /
WIP routesearch; fix IslandTradeEnd memory management
authorIan Jackson <ian@liberator.(none)>
Sat, 3 Oct 2009 08:54:20 +0000 (09:54 +0100)
committerIan Jackson <ian@liberator.(none)>
Sat, 3 Oct 2009 08:54:20 +0000 (09:54 +0100)
yarrg/rsvalue.c

index f046c99..da7dbaf 100644 (file)
@@ -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; s<nislands; s++) {
-    IslandTradeEnds *ite;
-    int si= islands[s];
-    int i;
-    for (i=0, ite=ites; i<nites; i++, ite++)
-      if (ite->islandid==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<d; leg++) {
@@ -354,6 +337,8 @@ void setup_value(void) {
   for (i=0; i<commodstablesz; i++)
     commodstable[i].mass= commodstable[i].volu= -1;
 
+  itradeends= mcalloc(sizeof(*itradeends) * islandtablesz);
+
   SQL_PREPARE(sst,
              "SELECT commodid,unitmass,unitvolume FROM commods");
   while (SQL_STEP(sst)) {