X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?p=ypp-sc-tools.db-live.git;a=blobdiff_plain;f=yarrg%2Frscommon.h;h=0933e0fecc9565b2368ebb0d3f4b55284aff5f6b;hp=f62fd99d9ed15cdf4d9cd873a6406c3d7a60d38b;hb=706d75804688b94f51b806adc44f10269c35b0db;hpb=fe2cd54600f099689170bc2d9c47a48559c1d692 diff --git a/yarrg/rscommon.h b/yarrg/rscommon.h index f62fd99..0933e0f 100644 --- a/yarrg/rscommon.h +++ b/yarrg/rscommon.h @@ -8,6 +8,7 @@ DF(sql2) \ DF(value) \ DF(search) \ + DF(filter) \ DF(check) \ DF(lp) @@ -17,6 +18,25 @@ #include "common.h" +#define COUNTER_LIST \ + CTR(commodities_loaded) \ + CTR(trades_loaded) \ + CTR(islands_arbitrage) \ + CTR(ipairs_relevant) \ + CTR(quantities_loaded) \ + CTR(routes_considered) \ + CTR(routes_quickelim) \ + CTR(routes_stratelim) \ + CTR(routes_valued) \ + CTR(newbests_strat_absolute) \ + CTR(newbests_strat_perleague) \ + CTR(subroute_tails_valued) \ + CTR(subroutes_valued) \ + CTR(subroutes_nonempty) +#define CTR(x) extern int ctr_##x; + COUNTER_LIST +#undef CTR + #define SQL_MUST( call ) ({ \ /* `call' is an expression returning result, using const char *sqe; \ * chk1 and chk2 are blocks using sqe and int sqr; */ \ @@ -30,9 +50,34 @@ void sql_fatal(const char *stmt_what, int sqr, const char *act_what) NORET; -#define SQL_STEP(ssh) (sql_step_wrap((ssh), #ssh, __FILE__, __LINE__)) -int sql_step_wrap(sqlite3_stmt *ssh, const char *ssh_string, - const char *file, int line); +#define SQL_STEP(ssh) (sql_step((ssh), #ssh, __FILE__, __LINE__)) +int sql_step(sqlite3_stmt *ssh, const char *ssh_string, + const char *file, int line); + +#define SQL_DISTINCT_DECL(cols, nintcols) \ + int cols[nintcols]; \ + cols[0]= -1; +#define SQL_DISTINCT_STEP(ssh, cols, nkeycols) \ + (sql_step_distinct((ssh), #ssh, __FILE__, __LINE__, \ + (cols), sizeof((cols))/sizeof((cols)[0]), nkeycols)) +int sql_step_distinct(sqlite3_stmt *ssh, const char *ssh_string, + const char *file, int line, + int *cols, int ncols, int nkeycols); + /* These work if we're making a query whose columns consist of: + * - keys: integer column(s) on which the results are sorted by the query + * - consequences: zero or more integer cols strictly dependent on the keys + * - extra: zero or more further (possibly non-integer) columns + * + * Call SQL_DISTINCT_DECL, passing intcols = the total number of keys and + * consequences; it will declare int cols[intfields]; + * + * Then each SQL_DISTINCT_STEP is like SQL_STEP only you have to + * pass the number of key columns and it only returns rows with + * distinct keys. Rows with all-identical keys are asserted to + * have identical consequences. After each call to + * SQL_DISTINCT_STEP the keys and consequences will be stored in + * cols. + */ int sql_single_int(const char *stmt); @@ -52,18 +97,23 @@ void setup_sql(void); typedef struct { double distance_loss_factor; - int ntrades; struct TradesBlock *trades; 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); +typedef struct { + double absolute, perleague; + int absolute_ports[MAX_ROUTELEN], perleague_ports[MAX_ROUTELEN]; +} PotentialResult; + void setup_search(void); -void search(int start_isle); +void search(int start_isle, PotentialResult ****strat_base_io + /* strat_base[finalarch][midarch]-> */); extern double max_mass, max_volu, max_capi; extern double distance_loss_factor_per_league; @@ -73,5 +123,55 @@ extern int max_dist; extern int islandtablesz; +extern int narches; +extern char **archnames; +extern int *islandid2arch; + + +#define NEW(ptr) ((ptr)= mmalloc(sizeof(*ptr))) + +#define MCALLOC(array, count) ((array)= mcalloc(sizeof(*(array)) * (count))) + +#define MCALLOC_INITEACH(array, count, init_this) ({ \ + MCALLOC((array), (count)); \ + int initi; \ + typeof(&(array)[0]) this; \ + for (initi=0, this=(array); initi<(count); initi++, this++) { \ + init_this; \ + } \ + }) + + +typedef struct { + double value; + PotentialResult *pr; +} HighScoreEntry; + +extern int nhighscores_absolute, nhighscores_perleague; +extern HighScoreEntry *highscores_absolute; +extern HighScoreEntry *highscores_perleague; + + +#define ONDEMAND(pointer_lvalue, calloc_size_count) \ + ((pointer_lvalue) ? : \ + ((pointer_lvalue) = mcalloc(sizeof(*(pointer_lvalue)) * calloc_size_count))) + + +static inline int isle2arch(int isle) { + int arch= islandid2arch[isle]; + assert(arch>=0); + return arch; +} + +static inline int route2midarch(const int *ports, int nports) { + int archs[nports], last_arch=-1, narchs=0, i; + for (i=0; i