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=237cab1347d8006ed63587529fd61f442a34acb9;hp=873ff30810f708bf7282ebcdcc0f21c828dcb3b1;hb=683d7344fb6dc8c5b98263e648e46087e5fe91f1;hpb=cf1aa28767bcecb39ff18b2ee80952ed38f40e0d diff --git a/yarrg/rscommon.h b/yarrg/rscommon.h index 873ff30..237cab1 100644 --- a/yarrg/rscommon.h +++ b/yarrg/rscommon.h @@ -1,3 +1,30 @@ +/* + * Route searcher - common definitions + */ +/* + * This is part of the YARRG website, a tool for assisting + * players of Yohoho Puzzle Pirates. + * + * Copyright (C) 2009 Ian Jackson + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * Yohoho and Puzzle Pirates are probably trademarks of Three Rings and + * are used without permission. This program is not endorsed or + * sponsored by Three Rings. + */ + #ifndef RSCOMMON_H #define RSCOMMON_H @@ -7,39 +34,55 @@ DF(sql) \ DF(sql2) \ DF(value) \ + DF(value2) \ DF(search) \ DF(filter) \ DF(check) \ + DF(tableau) \ DF(lp) -#define debug stdout -#define DEBUG_DEV "/dev/stdout" +//#define debug_flags 0 + +#define debug debug_file #include "common.h" +extern FILE *debug_file; +#define DEBUG_DEV "/dev/stdout" /* just for glpk */ + + +#define GRANUS 3 #define COUNTER_LIST \ CTR(commodities_loaded) \ CTR(trades_loaded) \ + CTR(islands_arbitrage) \ + CTR(ipairs_relevant) \ CTR(quantities_loaded) \ CTR(routes_considered) \ - CTR(routes_eliminated) \ + CTR(routes_wrongfinalelim) \ + CTR(routes_quickelim) \ + CTR(routes_bucketelim) \ CTR(routes_valued) \ + CTR(routes_wrongfinal) \ + CTRA(newbests_granu,GRANUS*2) \ CTR(subroute_tails_valued) \ CTR(subroutes_valued) \ CTR(subroutes_nonempty) -#define CTR(x) extern int ctr_##x; +#define CTR(x) extern int ctr_##x; +#define CTRA(x,n) extern int ctr_##x[n]; COUNTER_LIST #undef CTR +#undef CTRA #define SQL_MUST( call ) ({ \ /* `call' is an expression returning result, using const char *sqe; \ * chk1 and chk2 are blocks using sqe and int sqr; */ \ const char *sql_must_call_string= #call; \ int sqr; \ - if (DEBUGP(sql2)) fprintf(stderr,"SQL %s", sql_must_call_string); \ + if (DEBUGP(sql2)) fprintf(debug,"SQL %s", sql_must_call_string); \ sqr= (call); \ - if (DEBUGP(sql2)) fprintf(stderr," = %d\n", sqr); \ + if (DEBUGP(sql2)) fprintf(debug," = %d\n", sqr); \ if (sqr) sql_fatal("(unknown)", sqr, sql_must_call_string); \ }) \ @@ -87,7 +130,7 @@ void sql_bind(sqlite3_stmt *ss, int index, int value, extern sqlite3 *db; -void setup_sql(void); +void setup_sql(const char *database); typedef struct { @@ -101,27 +144,87 @@ IslandPair *ipair_get_maybe(int si, int di); double value_route(int nislands, const int *islands, int exclude_arbitrage); void setup_value(void); +#define AP 2 /* 0=absolute, 1=perleague */ +#define A 0 +#define P 1 + typedef struct { - double absolute, perleague; - int absolute_ports[MAX_ROUTELEN], perleague_ports[MAX_ROUTELEN]; -} PotentialResult; + double value[AP]; + int length; + int ports[MAX_ROUTELEN]; +} OnePotentialResult; + +typedef struct { + OnePotentialResult prs[AP]; +} Bucket; void setup_search(void); -void search(int start_isle, PotentialResult ****strat_base_io - /* strat_base[finalisle][midisle]-> */); +void search(int start_isle, int final_isle /* -1 means any */, + Bucket ****buckets_base_io[GRANUS] + /* bucket_base[granui][finalthing][midthing]-> */); extern double max_mass, max_volu, max_capi; extern double distance_loss_factor_per_league; -extern int max_dist; +extern int max_dist, min_trade_maxprofit; #define LOSS_FACTOR_PER_DELAY_SLOT (1-1e-8) extern int islandtablesz; +extern int narches; +extern char **archnames; +extern int *islandid2arch; + +extern int granusz_fin[GRANUS], granusz_mid[GRANUS]; + + +extern FILE *output; + + +#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; + Bucket *bucket; +} HighScoreEntry; + +extern int granus; +extern int nhighscores[GRANUS][AP]; +extern HighScoreEntry *highscores[GRANUS][AP]; + #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