You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

276 lines
11 KiB

/* prob.h (LP/MIP problem object) */
/***********************************************************************
* This code is part of GLPK (GNU Linear Programming Kit).
*
* Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
* 2009, 2010, 2011, 2013 Andrew Makhorin, Department for Applied
* Informatics, Moscow Aviation Institute, Moscow, Russia. All rights
* reserved. E-mail: <mao@gnu.org>.
*
* GLPK is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* GLPK is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
* License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GLPK. If not, see <http://www.gnu.org/licenses/>.
***********************************************************************/
#ifndef PROB_H
#define PROB_H
#include "avl.h"
#include "bfd.h"
#include "dmp.h"
#include "glpk.h"
typedef struct GLPROW GLPROW;
typedef struct GLPCOL GLPCOL;
typedef struct GLPAIJ GLPAIJ;
#define GLP_PROB_MAGIC 0xD7D9D6C2
struct glp_prob
{ /* LP/MIP problem object */
unsigned magic;
/* magic value used for debugging */
DMP *pool;
/* memory pool to store problem object components */
glp_tree *tree;
/* pointer to the search tree; set by the MIP solver when this
object is used in the tree as a core MIP object */
void *parms;
/* reserved for backward compatibility */
/*--------------------------------------------------------------*/
/* LP/MIP data */
char *name;
/* problem name (1 to 255 chars); NULL means no name is assigned
to the problem */
char *obj;
/* objective function name (1 to 255 chars); NULL means no name
is assigned to the objective function */
int dir;
/* optimization direction flag (objective "sense"):
GLP_MIN - minimization
GLP_MAX - maximization */
double c0;
/* constant term of the objective function ("shift") */
int m_max;
/* length of the array of rows (enlarged automatically) */
int n_max;
/* length of the array of columns (enlarged automatically) */
int m;
/* number of rows, 0 <= m <= m_max */
int n;
/* number of columns, 0 <= n <= n_max */
int nnz;
/* number of non-zero constraint coefficients, nnz >= 0 */
GLPROW **row; /* GLPROW *row[1+m_max]; */
/* row[i], 1 <= i <= m, is a pointer to i-th row */
GLPCOL **col; /* GLPCOL *col[1+n_max]; */
/* col[j], 1 <= j <= n, is a pointer to j-th column */
AVL *r_tree;
/* row index to find rows by their names; NULL means this index
does not exist */
AVL *c_tree;
/* column index to find columns by their names; NULL means this
index does not exist */
/*--------------------------------------------------------------*/
/* basis factorization (LP) */
int valid;
/* the factorization is valid only if this flag is set */
int *head; /* int head[1+m_max]; */
/* basis header (valid only if the factorization is valid);
head[i] = k is the ordinal number of auxiliary (1 <= k <= m)
or structural (m+1 <= k <= m+n) variable which corresponds to
i-th basic variable xB[i], 1 <= i <= m */
glp_bfcp *bfcp;
/* basis factorization control parameters; may be NULL */
BFD *bfd; /* BFD bfd[1:m,1:m]; */
/* basis factorization driver; may be NULL */
/*--------------------------------------------------------------*/
/* basic solution (LP) */
int pbs_stat;
/* primal basic solution status:
GLP_UNDEF - primal solution is undefined
GLP_FEAS - primal solution is feasible
GLP_INFEAS - primal solution is infeasible
GLP_NOFEAS - no primal feasible solution exists */
int dbs_stat;
/* dual basic solution status:
GLP_UNDEF - dual solution is undefined
GLP_FEAS - dual solution is feasible
GLP_INFEAS - dual solution is infeasible
GLP_NOFEAS - no dual feasible solution exists */
double obj_val;
/* objective function value */
int it_cnt;
/* simplex method iteration count; increased by one on performing
one simplex iteration */
int some;
/* ordinal number of some auxiliary or structural variable having
certain property, 0 <= some <= m+n */
/*--------------------------------------------------------------*/
/* interior-point solution (LP) */
int ipt_stat;
/* interior-point solution status:
GLP_UNDEF - interior solution is undefined
GLP_OPT - interior solution is optimal
GLP_INFEAS - interior solution is infeasible
GLP_NOFEAS - no feasible solution exists */
double ipt_obj;
/* objective function value */
/*--------------------------------------------------------------*/
/* integer solution (MIP) */
int mip_stat;
/* integer solution status:
GLP_UNDEF - integer solution is undefined
GLP_OPT - integer solution is optimal
GLP_FEAS - integer solution is feasible
GLP_NOFEAS - no integer solution exists */
double mip_obj;
/* objective function value */
};
struct GLPROW
{ /* LP/MIP row (auxiliary variable) */
int i;
/* ordinal number (1 to m) assigned to this row */
char *name;
/* row name (1 to 255 chars); NULL means no name is assigned to
this row */
AVLNODE *node;
/* pointer to corresponding node in the row index; NULL means
that either the row index does not exist or this row has no
name assigned */
#if 1 /* 20/IX-2008 */
int level;
unsigned char origin;
unsigned char klass;
#endif
int type;
/* type of the auxiliary variable:
GLP_FR - free variable
GLP_LO - variable with lower bound
GLP_UP - variable with upper bound
GLP_DB - double-bounded variable
GLP_FX - fixed variable */
double lb; /* non-scaled */
/* lower bound; if the row has no lower bound, lb is zero */
double ub; /* non-scaled */
/* upper bound; if the row has no upper bound, ub is zero */
/* if the row type is GLP_FX, ub is equal to lb */
GLPAIJ *ptr; /* non-scaled */
/* pointer to doubly linked list of constraint coefficients which
are placed in this row */
double rii;
/* diagonal element r[i,i] of scaling matrix R for this row;
if the scaling is not used, r[i,i] is 1 */
int stat;
/* status of the auxiliary variable:
GLP_BS - basic variable
GLP_NL - non-basic variable on lower bound
GLP_NU - non-basic variable on upper bound
GLP_NF - non-basic free variable
GLP_NS - non-basic fixed variable */
int bind;
/* if the auxiliary variable is basic, head[bind] refers to this
row, otherwise, bind is 0; this attribute is valid only if the
basis factorization is valid */
double prim; /* non-scaled */
/* primal value of the auxiliary variable in basic solution */
double dual; /* non-scaled */
/* dual value of the auxiliary variable in basic solution */
double pval; /* non-scaled */
/* primal value of the auxiliary variable in interior solution */
double dval; /* non-scaled */
/* dual value of the auxiliary variable in interior solution */
double mipx; /* non-scaled */
/* primal value of the auxiliary variable in integer solution */
};
struct GLPCOL
{ /* LP/MIP column (structural variable) */
int j;
/* ordinal number (1 to n) assigned to this column */
char *name;
/* column name (1 to 255 chars); NULL means no name is assigned
to this column */
AVLNODE *node;
/* pointer to corresponding node in the column index; NULL means
that either the column index does not exist or the column has
no name assigned */
int kind;
/* kind of the structural variable:
GLP_CV - continuous variable
GLP_IV - integer or binary variable */
int type;
/* type of the structural variable:
GLP_FR - free variable
GLP_LO - variable with lower bound
GLP_UP - variable with upper bound
GLP_DB - double-bounded variable
GLP_FX - fixed variable */
double lb; /* non-scaled */
/* lower bound; if the column has no lower bound, lb is zero */
double ub; /* non-scaled */
/* upper bound; if the column has no upper bound, ub is zero */
/* if the column type is GLP_FX, ub is equal to lb */
double coef; /* non-scaled */
/* objective coefficient at the structural variable */
GLPAIJ *ptr; /* non-scaled */
/* pointer to doubly linked list of constraint coefficients which
are placed in this column */
double sjj;
/* diagonal element s[j,j] of scaling matrix S for this column;
if the scaling is not used, s[j,j] is 1 */
int stat;
/* status of the structural variable:
GLP_BS - basic variable
GLP_NL - non-basic variable on lower bound
GLP_NU - non-basic variable on upper bound
GLP_NF - non-basic free variable
GLP_NS - non-basic fixed variable */
int bind;
/* if the structural variable is basic, head[bind] refers to
this column; otherwise, bind is 0; this attribute is valid only
if the basis factorization is valid */
double prim; /* non-scaled */
/* primal value of the structural variable in basic solution */
double dual; /* non-scaled */
/* dual value of the structural variable in basic solution */
double pval; /* non-scaled */
/* primal value of the structural variable in interior solution */
double dval; /* non-scaled */
/* dual value of the structural variable in interior solution */
double mipx; /* non-scaled */
/* primal value of the structural variable in integer solution */
};
struct GLPAIJ
{ /* constraint coefficient a[i,j] */
GLPROW *row;
/* pointer to row, where this coefficient is placed */
GLPCOL *col;
/* pointer to column, where this coefficient is placed */
double val;
/* numeric (non-zero) value of this coefficient */
GLPAIJ *r_prev;
/* pointer to previous coefficient in the same row */
GLPAIJ *r_next;
/* pointer to next coefficient in the same row */
GLPAIJ *c_prev;
/* pointer to previous coefficient in the same column */
GLPAIJ *c_next;
/* pointer to next coefficient in the same column */
};
#endif
/* eof */