X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?a=blobdiff_plain;f=yarrg%2Frscommon.h;h=965b6db7205413286a3ba65a2cf7966809a915cb;hb=88a4cb4aba6429c13a848dafe3f82652cfc168cb;hp=860409e41a99ea0e6a7a06f3ed4b756344f6c3fe;hpb=23f08e0abdbd5212e4a867c80f7833e4ebcbb1cf;p=ypp-sc-tools.db-test.git diff --git a/yarrg/rscommon.h b/yarrg/rscommon.h index 860409e..965b6db 100644 --- a/yarrg/rscommon.h +++ b/yarrg/rscommon.h @@ -7,8 +7,12 @@ DF(sql) \ DF(sql2) \ DF(value) \ + DF(search) \ + DF(check) \ DF(lp) + #define debug stdout +#define DEBUG_DEV "/dev/stdout" #include "common.h" @@ -26,9 +30,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); @@ -43,14 +72,30 @@ void sql_bind(sqlite3_stmt *ss, int index, int value, extern sqlite3 *db; -void setup(void); -double value_route(int nislands, const int *islands); +void setup_sql(void); + + +typedef struct { + double distance_loss_factor; + struct TradesBlock *trades; + double route_tail_value; +} IslandPair; + +IslandPair *ipair_get_maybe(int si, int di); + +double value_route(int nislands, const int *islands, int exclude_arbitrage); void setup_value(void); -void setup_commods(void); + +void setup_search(void); +void search(int start_isle); extern double max_mass, max_volu, max_capi; extern double distance_loss_factor_per_league; +extern int max_dist; + +#define LOSS_FACTOR_PER_DELAY_SLOT (1-1e-8) + +extern int islandtablesz; -#define LOSS_FACTOR_PER_DELAY_SLOT (1-1e8) #endif /*RSCOMMON_H*/