www.pudn.com > geosteiner-3.1.zip > constrnt.h
/***********************************************************************
File: constrnt.h
Rev: b-1
Date: 02/28/2001
Copyright (c) 1996, 2001 by David M. Warme
************************************************************************
Data structures for describing constraints.
************************************************************************
Modification Log:
a-1: 07/17/96 warme
: Created.
b-1: 02/28/2001 warme
: Changes for 3.1 release.
: Made add_constraint_to_pool and expand_constraint
: be global.
************************************************************************/
#ifndef CONSTRNT_H
#define CONSTRNT_H
#include "steiner.h"
/*
* The following structures represent "raw" (or physical) constraints.
* These constraints are expressed using the actual row of coefficients,
* operator and right-hand-side.
*
* Negative values of var represent the constraint's OPERATOR and rhs,
* as well as marking the end.
*/
#define RC_OP_LE 0
#define RC_OP_EQ 1
#define RC_OP_GE 2
#define RC_VAR_BASE 3
struct rcoef {
int16u var; /* variable (var>=0) or operator (var<0) */
short val; /* coefficient value */
};
struct rcon {
int len; /* length of constraint LHS */
struct rcoef * coefs; /* the actual coefficients of the row */
int next; /* next rcon number in hash bucket chain */
int lprow; /* not in LP if <0, current row if >=0 */
int biter; /* most recent iteration during which this */
/* constraint was binding */
short hval; /* hash value for this entry */
short flags; /* various flags for entry */
int uid; /* unique ID */
int refc; /* reference count: number of *suspended* */
/* nodes for which this constraint is */
/* binding */
};
/* flags */
#define RCON_FLAG_DISCARD 0x0001 /* Discard at next opportunity. */
/*
* Structures used to store "logical" constraints, which are expressed
* in terms of their significance to the problem, not their coefficients.
*/
enum ctype {
CT_CUTSET,
CT_SUBTOUR
};
struct constraint {
struct constraint * next;
int iteration;
enum ctype type;
bitmap_t * mask;
};
/*
* The constraint pool. We maintain all constraints that have ever
* been generated in the pool, along with the hash table, freelists
* and scratch buffers.
*/
#define CPOOL_HASH_SIZE 1009
struct cpool {
int uid; /* Bumped when pool changes */
struct rcon * rows; /* All constraints, in sequence */
int nrows; /* Number of constraints in the pool */
int maxrows; /* Allocated size of pool */
int num_nz; /* Number of non-zeros in the pool */
int * lprows; /* maps LP row # to constraint # */
int nlprows; /* number of LP rows */
int npend; /* # rows pending addition to LP */
struct rblk * blocks; /* List of rcon allocation blocks */
struct rcoef * cbuf; /* Scratch constraint buffer */
int iter; /* LP iteration count - a timestamp */
/* used to find constraints that */
/* haven't been useful in a while */
int initrows; /* number of initial rows */
int nvars; /* Number of variables - LP columns */
int hwmrow; /* High water mark for LP rows */
int hwmnz; /* High water mark for LP non-zeros */
int hash [CPOOL_HASH_SIZE];
};
/*
* This structure maintains a single block of free rcoef's, from which
* we allocate sequentially. To maintain better cache behavior when
* scanning all constraints for violations, we always begin a new block
* whenever the constraint we are adding does not fit in the current
* block.
*/
struct rblk {
struct rblk * next; /* next rblk in pool */
struct rcoef * base; /* base of array of rcons */
struct rcoef * ptr; /* allocation pointer */
int nfree; /* number of free rcons remaining */
};
/*
* Function Prototypes
*/
struct bbinfo;
extern bool add_constraint_to_pool (struct cpool *,
struct rcoef *,
bool);
extern int add_constraints (struct bbinfo *, struct constraint *);
extern void add_pending_rows_to_LP (struct bbinfo *);
extern LP_t * build_initial_formulation (struct cpool *,
bitmap_t *,
bitmap_t *,
struct cinfo *,
struct lpmem *);
extern void debug_print_constraint (char *,
char *,
struct constraint *,
double *,
bitmap_t *,
struct cinfo *);
extern void delete_slack_rows_from_LP (struct bbinfo *);
extern void destroy_initial_formulation (struct bbinfo *);
extern void destroy_node_basis (struct bbnode *, struct bbinfo *);
extern struct rcoef * expand_constraint (struct constraint *,
struct rcoef *,
bitmap_t *,
struct cinfo *);
extern void free_constraint_pool (struct cpool *);
extern void initialize_constraint_pool (struct cpool *,
bitmap_t *,
bitmap_t *,
struct cinfo *);
extern bool is_violation (struct rcoef *, double *);
extern void mark_row_pending_to_LP (struct cpool *, int);
extern void restore_node_basis (struct bbnode *, struct bbinfo *);
extern void save_node_basis (struct bbnode *, struct bbinfo *);
extern int solve_LP_over_constraint_pool (struct bbinfo *);
#endif