Config
The application contains a config file (app_config.json) that is located in the config
directory of the kidney
server. An example of this config file is shown below:
{ "log_level" : "info", "solver": "coin", "log_file" : "kidney_log.txt", "templates_dir" : "./templates", "constraints_dir" : "./constraints", "optimal" : "size:weight" "max_ip_run_time_secs": 55, "max_heuristic_time_secs": 180, "abacus_logging": false, "abacus_print_lp": false, "pricing_steps": 1, "farkas_pricing_steps": 100, "max_col_gen_iteration_time": "00:30::00", "strong_branching_candidates": 5 "random_seed_limits": [[200,0],[400,20000]] "col_gen_detect": {"coin": 100000, "cplex": 400000} }
A description of each item follows:
log_level
- the level that the logger should output messages at. For the list of possible values see the logging section of this site
solver
- the solver to use can be either
coin
orcplex
(default:coin
) log_file
- the path where the log file should reside
templates_dir
- This is the location where the template files that control how the output
is displayed can be found. When the ruby server is run in daemon mode (i.e.
-d
flag) then this path must be an absolute path. Usually the template files will be located in the root of the install folder. So in the case of running the application in daemon mode and you have installed the kidney server in say "/opt/kidney", this value would read"templates_dir": "/opt/kidney/templates"
constraints_dir
- This is the location where the constraint files can be found - that is the
lua files that describe the constraints that are available to the system. These will normally be stored in the root
of the installation folder and if running the server from the directory this values default setting of
./constraints
will suffice. However, like thetemplate_dir
option above, if the server is run in daemon mode (-d
then the full path must be specified. For example,"templates_dir": "/opt/kidney/constraints"
, when the application is installed in the/opt/kidney
directory optimal
- The
optimal
setting controls the set of constraints that are enforced when finding the optimal solution - that is, you suppliedoperation
asoptimal
when making an API call. An example of the value given to theoptimal
key is shown above, in this example we seek to find the optimal solution where the total number of transplants is first maximised (size
option), then subject to this, the total weight is maximised (weight
option). A constraint is supplied by giving its short name, this name corresponds to the name of the lua file that holds the constraint. So in the case ofsize
above, we would expect to find a constraint file with the namesize.lua
in theconstraints_dir
folder. Note, there is an exception to the rule where the short name corresponds to the lua file name. This happens when the constraint is implemented in C++ and cannot be modified (or represented) using a lua file. At the moment there only exists a single constraint where this is the case. The name of this constraint isquick_effective
and this is a constraint that uses a graph theoretic approach to construct a constraint that maximises the number of effective pairwise exchanges - this is a much faster approach than using integer programming to obtain the constraint. If this constraint is used then it must come first in the list of constraints, failing to do so will result in unpredictable behaviour. Should you wish to maximise the number of effective pairwise as the second or greater priority, then you must use theeffective
constraint. Finally we observe the set of constraints is specified by separating the list of constraints using a colon - as in the example above. The default value for this option isquick_effective:size:pairwise:backarc:weight
max_ip_run_time_secs
- the maximum run time in seconds before giving up trying to find a solution. For use with non column generation solvers, has no effect if using column generation. The value of 0 indicates that no time limit will be set.This parameter is for advanced use only.
max_heuristic_time_secs
- the maximum time in seconds to allow the primal heuristic to run before giving up and starting the branching process. A value of 0 means do not run the heuristic , and -1 indicates that it should run until the IP has been solved. Default value is 120 seconds. This parameter is for advanced use only
abacus_logging
- indicates whether abacus should output its logging information when undertaking column generation. Set to true if you want to observe progress or debug the application. Default is false. This parameter is for advanced use only
abacus_print_lp
- if set to true will print out the full lp model every time it runs the lp solver. Default is false
pricing_steps
- the number of cycles that should be added on every pricing iteration. Default 100. This parameter is for advanced use only.
farkas_pricing_steps
- the number of cycles that should be added at every iteration when we are doing Farkas pricing. Default 100. This parameter is for advanced use only
max_col_gen_iteration_time
- string with format "HH:MM:SS" indicating how long we should continue with a column generation iteration before just returning the best solution we have so far. Default "00:30:00". This parameter is for advanced use only
strong_branching_candidates
- set to 0 if we don't want to use strong branching otherwise indicates the number of candidates to try when using strong branching. Default 0. This parameter is for advanced use only
random_seed_limits
- Any array of values that contains the number of random seeds to apply to an
instance of a specific size during column generation. For example,
[[200,0],[400, 20000]]
, indicates that if we have 200 patients then we don't want any random seeds, and if we have between 200 and 400 patients then there should be 20,000 random seeds, anything over 400 patients will lead to 400000 random seeds. Default value [[200,0],[400,1000],[600,10000],[800,100000]]. Advanced use only. col_gen_detect
- this is a json object with key/value pairs indicating after how many cycles with
a particular solver we should resort to column generation. For example,
{"coin": 100000, "cplex": 400000}
, states that if we identify more than 100,000 when using coin then column generation will automatically be used, similarly if we are using cplex and identify more than 400,000 cycles then we should use column generation. A value of -1 for a particular solver states that we should never use column generation, and a value of 0 means always use column generation. Default for this parameter is{"coin": 100000, "cplex": 400000}
. Advanced use only.