summaryrefslogtreecommitdiff
path: root/newstructure/thirdparty/linux/include/coin/CglTwomir.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'newstructure/thirdparty/linux/include/coin/CglTwomir.hpp')
-rw-r--r--newstructure/thirdparty/linux/include/coin/CglTwomir.hpp565
1 files changed, 0 insertions, 565 deletions
diff --git a/newstructure/thirdparty/linux/include/coin/CglTwomir.hpp b/newstructure/thirdparty/linux/include/coin/CglTwomir.hpp
deleted file mode 100644
index ba00380..0000000
--- a/newstructure/thirdparty/linux/include/coin/CglTwomir.hpp
+++ /dev/null
@@ -1,565 +0,0 @@
-// $Id: CglTwomir.hpp 1119 2013-04-06 20:24:18Z stefan $
-// Copyright (C) 2002, International Business Machines
-// Corporation and others. All Rights Reserved.
-// This code is licensed under the terms of the Eclipse Public License (EPL).
-
-#ifndef CglTwomir_H
-#define CglTwomir_H
-#include <string>
-
-#include "CglCutGenerator.hpp"
-#include "CoinFactorization.hpp"
-
-typedef struct
-{
-
- int nz; /* current length of arrays index[] and coeff[] */
- int max_nz; /* max length of arrays index[] and coeff[] */
- double *coeff; /* coefficient of each variable in the constraint */
- int *index; /* index of the variable (value in 0 ... nrow+ncol) */
- double rhs; /* rhs of the constraint */
- char sense; /* ?? is it necessary */
-
-} DGG_constraint_t;
-
-typedef struct{
- int n;
- DGG_constraint_t **c;
- int *ctype;
- double *alpha;
-} DGG_list_t;
-
-/******************** BASIS INFORMATION ADTs **********************************/
-typedef struct{
- int q_min;
- int q_max;
- int t_min;
- int t_max;
- int a_max;
- int max_elements;
-} cutParams;
-
-typedef struct
-{
- double gomory_threshold; /* factional variable must be this away from int */
- int ncol, /* number of columns in LP */
- nrow, /* number of constaints in LP */
- ninteger; /* number of integer variables in LP */
-
- int nbasic_col, /* number of basic columns in the LP */
- nbasic_row; /* number of basic rows in the LP */
-
- /* the following arrays are all of size (ncol+nrow) */
- int *info; /* description of each variable (see below) */
- double *lb; /* specifies the lower bound (if any) of each variable */
- double *ub; /* specifies the upper bound (if any) of each variable */
- double *x; /* current solution */
- double *rc; /* current reduced cost */
- double *opt_x;
-
- cutParams cparams;
-} DGG_data_t;
-
-/* the following macros allow us to decode the info of the DGG_data
- type. The encoding is as follows,
- bit 1 : if the variable is basic or not (non-basic).
- bit 2 : if the variable is integer or or not (rational).
- bit 3 : if the variable is structural or not (artifical).
- bit 4 : if the variable is non-basic and at its upper bound
- (else if non-basic at lower bound). */
-
-#define DGG_isBasic(data,idx) ((data->info[idx])&1)
-#define DGG_isInteger(data,idx) ((data->info[idx] >> 1)&1)
-#define DGG_isStructural(data,idx) ((data->info[idx] >> 2)&1)
-#define DGG_isEqualityConstraint(data,idx) ((data->info[idx] >> 3)&1)
-#define DGG_isNonBasicAtUB(data,idx) ((data->info[idx] >> 4)&1)
-#define DGG_isNonBasicAtLB(data,idx) ((data->info[idx] >> 5)&1)
-#define DGG_isConstraintBoundedAbove(data,idx) ((data->info[idx] >> 6)&1)
-#define DGG_isConstraintBoundedBelow(data,idx) ((data->info[idx] >> 7)&1)
-
-#define DGG_setIsBasic(data,idx) ((data->info[idx]) |= 1)
-#define DGG_setIsInteger(data,idx) ((data->info[idx]) |= (1<<1))
-#define DGG_setIsStructural(data,idx) ((data->info[idx]) |= (1<<2))
-#define DGG_setEqualityConstraint(data,idx) ((data->info[idx]) |= (1<<3))
-#define DGG_setIsNonBasicAtUB(data,idx) ((data->info[idx]) |= (1<<4))
-#define DGG_setIsNonBasicAtLB(data,idx) ((data->info[idx]) |= (1<<5))
-#define DGG_setIsConstraintBoundedAbove(data,idx) ((data->info[idx]) |= (1<<6))
-#define DGG_setIsConstraintBoundedBelow(data,idx) ((data->info[idx]) |= (1<<7))
-
-class CoinWarmStartBasis;
-/** Twostep MIR Cut Generator Class */
-class CglTwomir : public CglCutGenerator {
-
- friend void CglTwomirUnitTest(const OsiSolverInterface * siP,
- const std::string mpdDir );
-
-
-public:
-
- /// Problem name
- std::string probname_;
-
- /**@name Generate Cuts */
- //@{
- /** Generate Two step MIR cuts either from the tableau rows or from the
- formulation rows
- */
- virtual void generateCuts( const OsiSolverInterface & si, OsiCuts & cs,
- const CglTreeInfo info = CglTreeInfo());
- /// Return true if needs optimal basis to do cuts (will return true)
- virtual bool needsOptimalBasis() const;
-
- /**@name Change criterion on which scalings to use (default = 1,1,1,1) */
- //@{
- /// Set
- void setMirScale (int tmin, int tmax) {t_min_ = tmin; t_max_ = tmax;}
- void setTwomirScale (int qmin, int qmax) {q_min_ = qmin; q_max_ = qmax;}
- void setAMax (int a) {a_max_ = a;}
- void setMaxElements (int n) {max_elements_ = n;}
- void setMaxElementsRoot (int n) {max_elements_root_ = n;}
- void setCutTypes (bool mir, bool twomir, bool tab, bool form)
- { do_mir_ = mir; do_2mir_ = twomir; do_tab_ = tab; do_form_ = form;}
- void setFormulationRows (int n) {form_nrows_ = n;}
-
- /// Get
- int getTmin() const {return t_min_;}
- int getTmax() const {return t_max_;}
- int getQmin() const {return q_min_;}
- int getQmax() const {return q_max_;}
- int getAmax() const {return a_max_;}
- int getMaxElements() const {return max_elements_;}
- int getMaxElementsRoot() const {return max_elements_root_;}
- int getIfMir() const { return do_mir_;}
- int getIfTwomir() const { return do_2mir_;}
- int getIfTableau() const { return do_tab_;}
- int getIfFormulation() const { return do_form_;}
- //@}
-
- /**@name Change criterion on which variables to look at. All ones
- more than "away" away from integrality will be investigated
- (default 0.05) */
- //@{
- /// Set away
- void setAway(double value);
- /// Get away
- double getAway() const;
- /// Set away at root
- void setAwayAtRoot(double value);
- /// Get away at root
- double getAwayAtRoot() const;
- /// Return maximum length of cut in tree
- virtual int maximumLengthOfCutInTree() const
- { return max_elements_;}
- //@}
-
- /**@name Change way TwoMir works */
- //@{
- /// Pass in a copy of original solver (clone it)
- void passInOriginalSolver(OsiSolverInterface * solver);
- /// Returns original solver
- inline OsiSolverInterface * originalSolver() const
- { return originalSolver_;}
- /// Set type - 0 normal, 1 add original matrix one, 2 replace
- inline void setTwomirType(int type)
- { twomirType_=type;}
- /// Return type
- inline int twomirType() const
- { return twomirType_;}
- //@}
-
- /**@name Constructors and destructors */
- //@{
- /// Default constructor
- CglTwomir ();
-
- /// Copy constructor
- CglTwomir (const CglTwomir &);
-
- /// Clone
- virtual CglCutGenerator * clone() const;
-
- /// Assignment operator
- CglTwomir & operator=(const CglTwomir& rhs);
-
- /// Destructor
- virtual ~CglTwomir ();
- /// Create C++ lines to get to current state
- virtual std::string generateCpp( FILE * fp);
- /// This can be used to refresh any inforamtion
- virtual void refreshSolver(OsiSolverInterface * solver);
- //@}
-
-private:
- // Private member data
- /**@name Private member data */
- //@{
- /// Threadsafe random number generator
- CoinThreadRandom randomNumberGenerator_;
- /// Original solver
- OsiSolverInterface * originalSolver_;
- /// Only investigate if more than this away from integrality
- double away_;
- /// Only investigate if more than this away from integrality (at root)
- double awayAtRoot_;
- /// Type - 0 normal, 1 add original matrix one, 2 replace
- int twomirType_;
- bool do_mir_;
- bool do_2mir_;
- bool do_tab_;
- bool do_form_;
-
- int t_min_; /// t_min - first value of t to use for tMIR inequalities
- int t_max_; /// t_max - last value of t to use for tMIR inequalities
- int q_min_; /// q_min - first value of t to use for 2-Step tMIR inequalities
- int q_max_; /// q_max - last value of t to use for 2-Step tMIR inequalities
- int a_max_; /// a_max - maximum value of bhat/alpha
- int max_elements_; /// Maximum number of elements in cut
- int max_elements_root_; /// Maximum number of elements in cut at root
- int form_nrows_; //number of rows on which formulation cuts will be generated
- //@}
-};
-
-//#############################################################################
-
-/*
-#include <stdlib.h>
-#include <stdio.h>
-#include <stdarg.h>
-#include <math.h>
-#include <float.h>
-#include <cassert>
-#include <iostream.h>
-*/
-
-/******************** DEBUG DEFINITIONS ***************************************/
-
-#define DGG_DEBUG_DGG 1
-#define DGG_TRACE_ERRORS 0
-#define DGG_DISPLAY 0
-#define DGG_AUTO_CHECK_CUT_OFF_OPTIMAL 1
-
-/******************** CONFIGURATION DEFAULTS **********************************/
-
-#define DGG_DEFAULT_METHOD 2
-#define DGG_DEFAULT_TMIN 1
-#define DGG_DEFAULT_TMAX 1
-#define DGG_DEFAULT_TAUMIN 2
-#define DGG_DEFAULT_TAUMAX 6
-#define DGG_DEFAULT_MAX_CUTS 500
-#define DGG_DEFAULT_IMPROVEMENT_THRESH 0.001
-#define DGG_DEFAULT_NBELOW_THRESH INT_MAX
-#define DGG_DEFAULT_NROOT_ROUNDS 2
-#define DGG_DEFAULT_NEGATIVE_SCALED_TWOSTEPS 0
-#define DGG_DEFAULT_ALPHA_RULE 0
-#define DGG_DEFAULT_CUT_INC 250
-#define DGG_DEFAULT_CUT_FORM 0
-#define DGG_DEFAULT_NICEFY 0
-#define DGG_DEFAULT_ONLY_DELAYED 0
-#define DGG_DEFAULT_DELAYED_FREQ 9999999
-#define DGG_DEFAULT_LPROWS_FREQ 9999999
-#define DGG_DEFAULT_WHICH_FORMULATION_CUTS 2
-
-/******************** SOLVER CONFIGURATION DEFINITIONS ************************/
-
-#define DGG_OSI 0
-#define DGG_CPX 1
-#define DGG_QSO 2
-
-/* determines the solver to be used */
-#define DGG_SOLVER DGG_OSI
-
-/* adds checking routines to make sure solver works as expected */
-#define DGG_DEBUG_SOLVER 0
-
-/* turn off screen output from solver */
-#define DGG_SOLVER_SCREEN_FLAG 0
-
-/******************** CUT DEFINITIONS *****************************************/
-
-/* internal names for cut types */
-#define DGG_TMIR_CUT 1
-#define DGG_2STEP_CUT 2
-
-/* internal names for alpha-selection rules */
-#define DGG_ALPHA_MIN_SUM 0
-#define DGG_ALPHA_RANDOM_01 1
-#define DGG_ALPHA_RANDOM_COEFF 2
-#define DGG_ALPHA_ALL 3
-#define DGG_ALPHA_MAX_STEEP 5
-
-/******************** PRECISION & NUMERICAL ISSUES DEFINITIONS ****************/
-
-/* how steep a cut must be before adding it to the lp */
-#define DGG_MIN_STEEPNESS 1.0e-4
-#define DGG_MAX_L2NORM 1.0e7
-
-/* 0 = min steepness, 1 = max norm */
-#define DGG_NORM_CRITERIA 1
-
-/* internal representation of +infinity */
-#define UB_MAX DBL_MAX
-
-/* used to define how fractional a basic-integer variable must be
- before choosing to use it to generate a TMIR cut on.
- OSI's default is 1.0e-7 */
-#define DGG_GOMORY_THRESH 0.005
-
-#define DGG_RHS_THRESH 0.005
-
-/* used for comparing variables to their upper bounds.
- OSI's default is 1.0e-7.
- We set it to 1.0e6 because e-7 seems too sensitive.
- In fact, with e-7 the problem dsbmip.mps complains. */
-#define DGG_BOUND_THRESH 1.0e-6
-
-/* used for comparing the lhs (activity) value of a tableau row
- with the rhs. This is only used for debugging purposes. */
-#define DGG_EQUALITY_THRESH 1.0e-5
-
-/* used for comparing a variable's lower bound to 0.0
- and determining if we need to shift the variable */
-#define DGG_SHIFT_THRESH 1.0e-6
-
-/* used for determing how far from an integer is still an integer.
- This value is used for comparing coefficients to integers.
- OSI's default is 1.0e-10. */
-#define DGG_INTEGRALITY_THRESH 1.0e-10
-
-/* the min value that a coeff can have in the tableau row
- before being set to zero. */
-#define CBC_CHECK_CUT
-#ifndef CBC_CHECK_CUT
-#define DGG_MIN_TABLEAU_COEFFICIENT 1.0e-8
-#else
-#define DGG_MIN_TABLEAU_COEFFICIENT 1.0e-12
-#endif
-
-/* smallest value rho is allowed to have for a simple 2-step MIR
- (ie: not an extended two-step MIR) */
-#define DGG_MIN_RHO 1.0e-7
-#define DGG_MIN_ALPHA 1.0e-7
-
-/* when a slack is null: used to check if a cut is satisfied or not. */
-#define DGG_NULL_SLACK 1.0e-5
-
-/* nicefy constants */
-#define DGG_NICEFY_MIN_ABSVALUE 1.0e-13
-#define DGG_NICEFY_MIN_FIX 1.0e-7
-#define DGG_NICEFY_MAX_PADDING 1.0e-6
-#define DGG_NICEFY_MAX_RATIO 1.0e9
-
-
-/******************** ERROR-CATCHING MACROS ***********************************/
-#if DGG_TRACE_ERRORS > 0
-
-#define __DGG_PRINT_LOC__(F) fprintf(((F==0)?stdout:F), " in %s (%s:%d)\n", __func__, __FILE__, __LINE__)
-
-#define DGG_THROW(A,REST...) {\
- fprintf(stdout, ##REST); \
- __DGG_PRINT_LOC__(stdout); \
- return (A);}
-
-#define DGG_IF_EXIT(A,B,REST...) {\
- if(A) {\
- fprintf(stdout, ##REST); \
- __DGG_PRINT_LOC__(stdout); \
- exit(B);}}
-
-#define DGG_CHECKRVAL(A,B) {\
- if(A) {\
- __DGG_PRINT_LOC__(stdout); \
- return B; } }
-
-#define DGG_CHECKRVAL1(A,B) {\
- if(A) {\
- __DGG_PRINT_LOC__(stdout); \
- rval = B; goto CLEANUP; } }
-
-#define DGG_WARNING(A, REST...) {\
- if(A) {\
- fprintf(stdout, ##REST); \
- __DGG_PRINT_LOC__(stdout); \
- }}
-
-#define DGG_TEST(A,B,REST...) {\
- if(A) DGG_THROW(B,##REST) }
-
-#define DGG_TEST2(A,B,C,REST) {DGG_TEST(A,B,C,REST) }
-#define DGG_TEST3(A,B,C,D,REST) {DGG_TEST(A,B,C,D,REST) }
-
-#else
-
-#define DGG_IF_EXIT(A,B,REST) {if(A) {fprintf(stdout, REST);exit(B);}}
-
-#define DGG_THROW(A,B) return(A)
-
-#define DGG_CHECKRVAL(A,B) { if(A) return(B); }
-#define DGG_CHECKRVAL1(A,B){ if(A) { rval = B; goto CLEANUP; } }
-
-#define DGG_TEST(A,B,REST) { if(A) return(B);}
-#define DGG_TEST2(A,B,REST,C) { DGG_TEST(A,B,REST) }
-#define DGG_TEST3(A,B,REST,C,D) { DGG_TEST(A,B,REST) }
-
-#endif
-
-/******************** SIMPLE MACROS AND FUNCTIONS *****************************/
-
-#define DGG_MIN(a,b) ( (a<b)?a:b )
-#define DGG_MAX(a,b) ( (a>b)?a:b )
-#define KREM(vht,alpha,tau) (DGG_MIN( ceil(vht / alpha), tau ) - 1)
-#define LMIN(vht, d, bht) (DGG_MIN( floor(d*bht/bht), d))
-#define ABOV(v) (v - floor(v))
-#define QINT(vht,bht,tau) ( (int)floor( (vht*(tau-1))/bht ) )
-#define V2I(bht,tau,i) ( ((i+1)*bht / tau) )
-
-int DGG_is_even(double vht, double bht, int tau, int q);
-double frac_part(double value);
-int DGG_is_a_multiple_of_b(double a, double b);
-
-
-/* free function for DGG_data_t. Frees internal arrays and data structure */
-int DGG_freeData( DGG_data_t *data );
-
-/******************** CONSTRAINT ADTs *****************************************/
-DGG_constraint_t* DGG_newConstraint(int max_arrays);
-void DGG_freeConstraint(DGG_constraint_t *c);
-DGG_constraint_t *DGG_copyConstraint(DGG_constraint_t *c);
-void DGG_scaleConstraint(DGG_constraint_t *c, int t);
-
-/******************** CONFIGURATION *******************************************/
-void DGG_list_init (DGG_list_t *l);
-int DGG_list_addcut (DGG_list_t *l, DGG_constraint_t *cut, int ctype, double alpha);
-void DGG_list_delcut (DGG_list_t *l, int i);
-void DGG_list_free(DGG_list_t *l);
-
-/******************* SOLVER SPECIFIC METHODS **********************************/
-DGG_data_t *DGG_getData(const void *solver_ptr);
-
-/******************* CONSTRAINT MANIPULATION **********************************/
-
-/* DGG_transformConstraint: manipulates a constraint in the following way:
-
-packs everything in output
-
-1 - variables at their upper bounds are substituted for their
-complements. This is done by adjusting the coefficients and
-the right hand side (simple substitution).
-
-2 - variables with non-zero lower bounds are shifted. */
-
-int DGG_transformConstraint( DGG_data_t *data,
- double **x_out,
- double **rc_out,
- char **isint_out,
- DGG_constraint_t *constraint );
-
-/* DGG_unTransformConstraint :
-
-1 - Undoes step (1) of DGG_transformConstraint
-2 - Undoes step (2) of DGG_transformConstraint */
-
-int DGG_unTransformConstraint( DGG_data_t *data,
- DGG_constraint_t *constraint );
-
-/* substitutes each slack variable by the structural variables which
- define it. This function, hence, changes the constraint 'cut'. */
-
-int DGG_substituteSlacks( const void *solver_ptr,
- DGG_data_t *data,
- DGG_constraint_t *cut );
-
-int DGG_nicefyConstraint( const void *solver_ptr,
- DGG_data_t *data,
- DGG_constraint_t *cut);
-
-/******************* CUT GENERATION *******************************************/
-int DGG_getFormulaConstraint( int row_idx,
- const void *solver_ptr,
- DGG_data_t *data,
- DGG_constraint_t* row );
-
-int DGG_getTableauConstraint( int index,
- const void *solver_ptr,
- DGG_data_t *data,
- DGG_constraint_t* tabrow,
- const int * colIsBasic,
- const int * rowIsBasic,
- CoinFactorization & factorization,
- int mode );
-
-DGG_constraint_t* DGG_getSlackExpression(const void *solver_ptr, DGG_data_t* data, int row_index);
-
- int DGG_generateTabRowCuts( DGG_list_t *list,
- DGG_data_t *data,
- const void *solver_ptr );
-
- int DGG_generateFormulationCuts( DGG_list_t *list,
- DGG_data_t *data,
- const void *solver_ptr,
- int nrows,
- CoinThreadRandom & generator);
-
-
- int DGG_generateFormulationCutsFromBase( DGG_constraint_t *base,
- double slack,
- DGG_list_t *list,
- DGG_data_t *data,
- const void *solver_ptr,
- CoinThreadRandom & generator);
-
- int DGG_generateCutsFromBase( DGG_constraint_t *base,
- DGG_list_t *list,
- DGG_data_t *data,
- const void *solver_ptr );
-
-int DGG_buildMir( char *isint,
- DGG_constraint_t *base,
- DGG_constraint_t **cut_out );
-
-int DGG_build2step( double alpha,
- char *isint,
- DGG_constraint_t *base,
- DGG_constraint_t **cut_out );
-
- int DGG_addMirToList ( DGG_constraint_t *base,
- char *isint,
- double *x,
- DGG_list_t *list,
- DGG_data_t *data,
- DGG_constraint_t *orig_base );
-
- int DGG_add2stepToList ( DGG_constraint_t *base,
- char *isint,
- double *x,
- double *rc,
- DGG_list_t *list,
- DGG_data_t *data,
- DGG_constraint_t *orig_base );
-
-/******************* CUT INFORMATION ******************************************/
-
-double DGG_cutLHS(DGG_constraint_t *c, double *x);
-int DGG_isCutDesirable(DGG_constraint_t *c, DGG_data_t *d);
-
-/******************* TEST / DEBUGGING ROUTINES ********************************/
-
-int DGG_isConstraintViolated(DGG_data_t *d, DGG_constraint_t *c);
-
-int DGG_isBaseTrivial(DGG_data_t *d, DGG_constraint_t* c);
-int DGG_is2stepValid(double alpha, double bht);
-
-int DGG_cutsOffPoint(double *x, DGG_constraint_t *cut);
-
-//#############################################################################
-/** A function that tests the methods in the CglTwomir class. The
- only reason for it not to be a member method is that this way it doesn't
- have to be compiled into the library. And that's a gain, because the
- library should be compiled with optimization on, but this method should be
- compiled with debugging. */
-void CglTwomirUnitTest(const OsiSolverInterface * siP,
- const std::string mpdDir);
-
-
-#endif
-
-