From a user’s point of view, who wants to implement a linear-programming based branch-and-bound algorithm, ABACUS provides a small system of base classes from which the application specific classes can be derived. All problem independent parts are “invisible” for the user such that he can concentrate on the problem specific algorithms and data structures.
The basic ideas are pure virtual functions, virtual functions, and virtual dummy functions. A pure virtual function has to be implemented in a class derived by the user of the framework, e.g., the initialization of the branch-and-bound tree with a subproblem associated with the application. In virtual functions we provide default implementations, which are often useful for a big number of applications, but can be redefined if required, e.g., the branching strategy. Finally, under a virtual dummy function we understand a virtual function that does nothing in its default implementation, but can be redefined in a derived class, e.g., the separation of cutting planes. It is not a pure virtual function as its definition is not required for the correctness of the algorithm.
Moreover, an application based on ABACUS can be refined step by step. Only the derivation of a few new classes and the definition of some pure virtual functions is required to get a branch-and-bound algorithm running. Then, this branch-and-bound algorithm can be enhanced by the dynamic generation of constraints and/or variables, primal heuristics, or the implementation of new branching or enumeration strategies.
Default strategies are available for numerous parts of the branch-and-bound algorithm, which can be controlled via a parameter file. If none of the system strategies meets the requirements of the application, the default strategy can simply be replaced by the redefinition of a virtual function in a derived class.