int user_generate_cuts_in_lp(void *user, int varnum, var_desc **vars, double *x, int *new_row_num, waiting_row ***new_rows)
The user might decide to generate cuts directly within the LP process
instead of using the cut generator. This can be accomplished either
through a call to this function or simply by configuring SYMPHONY such
that the cut generator is called directly from the LP solver. One
example of when this might be done is when generating Gomory cuts
(this is planned to be part of SYMPHONY later) or something else that
requires knowledge of the current LP tableau. The IN arguments are the
same as in
user_send_lp_solution() (except
that there is no where argument). Not only the generated cuts
but the corresponding rows must be returned (the cuts are in the
waiting_row structures) because the
user_unpack_cuts()
function will not be invoked for the generated cuts. Also, the user
must fill out the violation field for every row. The reason for
this is that any cut generated here will definitely correspond to the
current LP solution so the user must have already computed the
violation when generating the cut.
Post-processing consists of checking if any of the new cuts are
already in the local pool (or dominated by a cut in the local pool).
Since the user will probably use this function to generate
tableau-dependent cuts, it is highly unlikely that any of the new cuts would
already be in the pool. Therefore the user will probably return
USER_AND_PP to force SYMPHONY to skip post-processing.
SYMPHONY checks if any of the newly generated rows are already in the local pool.