21template <
class T>
static inline T
22VolMax(
register const T x,
register const T y) {
23 return ((x) > (y)) ? (x) : (y);
26template <
class T>
static inline T
28 return ((x) > 0) ? (x) : -(x);
33#if defined(VOL_DEBUG) && (VOL_DEBUG != 0)
34#define VOL_TEST_INDEX(i, size) \
36 if ((i) < 0 || (i) >= (size)) { \
37 printf("bad VOL_?vector index\n"); \
41#define VOL_TEST_SIZE(size) \
44 printf("bad VOL_?vector size\n"); \
49#define VOL_TEST_INDEX(i, size)
50#define VOL_TEST_SIZE(size)
159 v =
new double[
sz = s];
168 std::memcpy(
v, x.
v,
sz *
sizeof(
double));
175 inline int size()
const {
return sz;}
191 inline void clear() {
200 printf(
"bad VOL_dvector sizes\n");
203 double * p_v =
v - 1;
204 const double * p_w = w.
v - 1;
205 const double *
const p_e =
v +
sz;
206 const double one_gamma = 1.0 - gamma;
207 while ( ++p_v != p_e ){
208 *p_v = one_gamma * (*p_v) + gamma * (*++p_w);
217 v =
new double[
sz = s];
261 std::memcpy(
v, x.
v,
sz *
sizeof(
int));
270 inline int size()
const {
return sz; }
285 inline void clear() {
324 VOL_primal(
const int psize,
const int dsize) :
x(psize),
v(dsize) {}
342 inline void cc(
const double alpha,
const VOL_primal& p) {
364 VOL_dual(
const int dsize) :
u(dsize) {
u = 0.0;}
377 void step(
const double target,
const double lambda,
407 const double lcost,
const double ascent,
const int iter) {
410 if (ascent > 0.0 && lcost > dual.
lcost + eps) {
416 if (ascent <= 0 && lcost > dual.
lcost) {
432 double lambdafactor = 1.0;
440 printf(
" G: Consecutive Gs = %3d\n\n", cons);
445 printf(
"\n ---- increasing lamda to %g ----\n\n",
446 lambda * lambdafactor);
453 printf(
" Y: Consecutive Ys = %3d\n\n", cons);
458 printf(
"\n **** increasing lamda to %g *****\n\n",
459 lambda * lambdafactor);
466 printf(
" R: Consecutive Rs = %3d\n\n", cons);
471 printf(
"\n **** decreasing lamda to %g *****\n\n",
472 lambda * lambdafactor);
481 printf(
"**** G= %i, Y= %i, R= %i ****\n",
ngs,
nys,
nrs);
500 const double alpha) {
503 register const double ll =
VolAbs(lcost);
525 VOL_vh(
const double alpha,
704 double readjust_target(
const double oldtarget,
const double lcost)
const;
#define VOL_TEST_INDEX(i, size)
static T VolMax(register const T x, register const T y)
static T VolAbs(register const T x)
#define VOL_TEST_SIZE(size)
double factor(const VOL_parms &parm, const double lcost, const double alpha)
VOL_alpha_factor & operator=(const VOL_alpha_factor &)
void compute_xrc(const VOL_dvector &pstarx, const VOL_dvector &primalx, const VOL_dvector &rc)
void step(const double target, const double lambda, const VOL_dvector &dual_lb, const VOL_dvector &dual_ub, const VOL_dvector &v)
double ascent(const VOL_dvector &v, const VOL_dvector &last_u) const
VOL_dual & operator=(const VOL_dual &p)
VOL_dual(const int dsize)
void cc(const double gamma, const VOL_dvector &w)
void allocate(const int s)
double & operator[](const int i)
VOL_dvector & operator=(const VOL_dvector &w)
void swap(VOL_dvector &w)
VOL_indc(const VOL_dvector &dual_lb, const VOL_dvector &dual_ub, const VOL_primal &primal, const VOL_primal &pstar, const VOL_dual &dual)
VOL_indc & operator=(const VOL_indc &)
void swap(VOL_ivector &w)
VOL_ivector & operator=(const VOL_ivector &v)
int & operator[](const int i)
void allocate(const int s)
VOL_primal(const int psize, const int dsize)
void find_max_viol(const VOL_dvector &dual_lb, const VOL_dvector &dual_ub)
VOL_primal & operator=(const VOL_primal &p)
void cc(const double alpha, const VOL_primal &p)
void print_info(const int iter, const VOL_primal &primal, const VOL_primal &pstar, const VOL_dual &dual)
void read_params(const char *filename)
VOL_problem & operator=(const VOL_problem &)
double readjust_target(const double oldtarget, const double lcost) const
int initialize(const bool use_preset_dual)
double power_heur(const VOL_primal &primal, const VOL_primal &pstar, const VOL_dual &dual) const
int solve(VOL_user_hooks &hooks, const bool use_preset_dual=false)
double lfactor(const VOL_parms &parm, const double lambda, const int iter)
enum VOL_swing::condition lastswing
VOL_swing & operator=(const VOL_swing &)
void cond(const VOL_dual &dual, const double lcost, const double ascent, const int iter)
virtual int compute_rc(const VOL_dvector &u, VOL_dvector &rc)=0
virtual ~VOL_user_hooks()
virtual int solve_subproblem(const VOL_dvector &dual, const VOL_dvector &rc, double &lcost, VOL_dvector &x, VOL_dvector &v, double &pcost)=0
virtual int heuristics(const VOL_problem &p, const VOL_dvector &x, double &heur_val)=0
VOL_vh(const double alpha, const VOL_dvector &dual_lb, const VOL_dvector &dual_ub, const VOL_dvector &v, const VOL_dvector &vstar, const VOL_dvector &u)
VOL_vh & operator=(const VOL_vh &)
double minimum_rel_ascent
double primal_abs_precision