Algorithm Interface
Boscia's solve
function only requires the oracles of the objective function f
and its gradient g
as well as the BLMO encoding the feasible region.
Boscia.postsolve
— Methodpostsolve(tree, result, time_ref, verbose, max_iteration_post)
Runs the post solve to optimize for the continuous variables if present. Is called if use_post_solve
is enabled in the solve
function. Prints solution statistics if verbose is set to true
.
Boscia.solve
— Methodsolve(f, g, blmo::BoundedLinearMinimizationOracle; ...)
Requires
f
oracle of the objective function.g
oracle of the gradient of the objectiveblmo
encodes the feasible region and can handle additional bound constraints. This can either be a MIP solver instance (e.g., SCIP) or be a custom type (seepolytope_blmos.jl
). Has to be of typeBoundedLinearMinimizationOracle
(seeblmo_interface.jl
).
Returns
x
the best solution found.tlmo
the BLMO wrapped in a TimeTrackingLMO instance.result
a dictionary containg the statistics like number of nodes, total solving etc. It also contains information for plotting progress plots like the lower and upper bound progress.
Optional settings
traverse_strategy
encodes how to choose the next node for evaluation. By default the node with the best lower bound is picked.branching_strategy
fixes the branching strategy. By default, weuseMOST_INFEASIBLE
, i.e. we branch on the entry which is the farthest away from being an integer.variant
the Frank-Wolfe variant to be used to solve the node problem. Options currently available areAwayFrankWolfe
,Blended
,BPCG
andVanillaFrankWolfe
.line_search
specifies the line search method used in the FrankWolfe variant. Default is theAdaptive
line search. For other available types, check the FrankWolfe.jl package.active_set
can be used to specify a starting point. By default, the direction (1,..,n) where n is the size of the problem is used to find a start vertex. This has to be of the typeFrankWolfe.ActiveSet
. Beware that the active set may only contain actual vertices of the feasible region.lazy
flag specifies whether the lazification of the Frank-Wolfe variant should be used. Per defaulttrue
. Note that it has no effect on Vanilla Frank-Wolfe.lazy_tolerance
decides how much progress is deemed enough to not have to call the LMO. Only used if thelazy
flag is activated.fw_epsilon
the solving precision of Frank-Wolfe at the root node.verbose
iftrue
, logs and solution statistics are printed.dual_gap
absolute dual gap. If reached, the algorithm stops.rel_dual_gap
relative dual gap. If reached, the algorithm stops.time_limit
algorithm will stop if the time limit is reached. Depending on the problem it is possible that no feasible solution has been found yet. On default, there is no time limit.print_iter
encodes after how many processed nodes the current node and solution status is printed. The logs are always printed if a new integral solution has been found.dual_gap_decay_factor
the FrankWolfe tolerance at a given leveli
in the tree is given byfw_epsilon * dual_gap_decay_factor^i
until we reach themin_node_fw_epsilon
.max_fw_iter
maximum number of iterations in a Frank-Wolfe run.min_number_lower
if notInf
, evaluation of a node is stopped if at leastmin_number_lower
open nodes have a better lower bound.min_node_fw_epsilon
smallest fw epsilon tolerance, see alsodual_gap_decay_factor
.use_postsolve
iftrue
, runs the specified Frank-Wolfe variant on the problem with the integral variables fixed to the solution, i.e. it only optimizes over the continuous variables. This might improve the solution if one has many continuous variables.min_fw_iterations
the minimum number of Frank-Wolfe iterations performed in the node evaluation.max_iteration_post
maximum number of iterations in the Frank-Wolfe run during postsolve.dual_tightening
flag to decide whether to use dual tightening techniques at node level. Note that this only porvides valid tightenings if your function is convex!global_dual_tightening
flag to decide whether to generate dual tightenings from new solutions that are gloablly valid.bnb_callback
an optional callback called after every node evaluation.strong_convexity
strong convexity parameter of the objectivef
, used for tightening the dual bound at every node.sharpness_constant
- the constantM > 0
for(θ, M)
-sharpness.f
is(θ, M)
-sharpness:f
satisfiesmin_{x^* ∈ X^*} || x - x^* || ≤ M (f(x) - f^(x^*))^θ
whereX^*
is the set of minimizer off
. Note that tightenings using sharpness are only valid if the problem has a unique minimizer, i.e.f
is stricly convex!sharpness_exponent
- the exponentθ ∈ [0, 1/2]
for(θ, M)
-sharpness.domain_oracle
given a pointx
: returnstrue
ifx
is in the domain off
, else false. Per default, it always returnstrue
. In case of the non-trivial domain oracle, the starting point has to be domain feasible forf
. Additionally, the user has to provide a functiondomain_point
, see below. Also, depending on the line search method, you might have to provide the domain oracle to it, too.find_domain_point
given the current node bounds return a domain feasible point respecting the bounds. If no such point can be found, returnnothing
.start_solution
an initial solution can be provided if known. It will be used as the initial incumbent.fw_verbose
iftrue
, the Frank-Wolfe logs are printed at each node. Mostly meant for debugging.use_shadow_set
the shadow set is the set of discarded vertices which is inherited by the children nodes. It is used to avoid recomputing of vertices in case the BLMO is expensive. In case of a cheap BLMO, performance might improve by disabling this option.custom_heuristics
list of custom heuristics from the user.prob_rounding
the probability for calling the simple rounding heuristic. Since the feasibility has to be checked, it might be expensive to do this for every node. Per default, this is activated for every node.clean_solutions
flag deciding whether new solutions should be polished. They will be rounded and then a quick Frank-Wolfe run will be started.max_clean_iter
maximum number of iterations in the Frank-Wolfe call for polishing new solutions.use_strong_lazy
specifies strong lazification in DICG. Otherwise, weak version is used.use_DICG_warm_start
iftrue
, enables DICG-specific warm-start strategy.use_strong_warm_start
iftrue
, performs additional in-face check for vertices.build_dicg_start_point
default generates a random feasible vertex.