#ifndef __SCIP_OBJBENDERS_H__
#define __SCIP_OBJBENDERS_H__
#include <cassert>
#include <cstring>
#include <utility>
#include "scip/scip.h"
#include "objscip/objcloneable.h"
namespace scip
{
class ObjBenders : public ObjCloneable
{
public:
SCIP* scip_;
char* scip_name_;
char* scip_desc_;
const int scip_priority_;
const SCIP_Bool scip_cutlp_;
const SCIP_Bool scip_cutpseudo_;
const SCIP_Bool scip_cutrelax_;
const SCIP_Bool scip_shareauxvars_;
ObjBenders(
SCIP* scip,
const char* name,
const char* desc,
int priority,
SCIP_Bool cutlp,
SCIP_Bool cutpseudo,
SCIP_Bool cutrelax,
SCIP_Bool shareauxvars
)
: scip_(scip),
scip_name_(0),
scip_desc_(0),
scip_priority_(priority),
scip_cutlp_(cutlp),
scip_cutpseudo_(cutpseudo),
scip_cutrelax_(cutrelax),
scip_shareauxvars_(shareauxvars)
{
SCIP_CALL_ABORT( SCIPduplicateMemoryArray(scip_, &scip_name_, name, std::strlen(name)+1) );
SCIP_CALL_ABORT( SCIPduplicateMemoryArray(scip_, &scip_desc_, desc, std::strlen(desc)+1) );
}
ObjBenders(const ObjBenders& o)
: ObjBenders(o.scip_, o.scip_name_, o.scip_desc_, o.scip_priority_, o.scip_cutlp_, o.scip_cutpseudo_,
o.scip_cutrelax_, o.scip_shareauxvars_)
{
}
ObjBenders(ObjBenders&& o)
: scip_(o.scip_),
scip_name_(0),
scip_desc_(0),
scip_priority_(o.scip_priority_),
scip_cutlp_(o.scip_cutlp_),
scip_cutpseudo_(o.scip_cutpseudo_),
scip_cutrelax_(o.scip_cutrelax_),
scip_shareauxvars_(o.scip_shareauxvars_)
{
std::swap(scip_name_, o.scip_name_);
std::swap(scip_desc_, o.scip_desc_);
}
virtual ~ObjBenders()
{
SCIPfreeMemoryArray(scip_, &scip_name_);
SCIPfreeMemoryArray(scip_, &scip_desc_);
}
ObjBenders& operator=(const ObjBenders& o) = delete;
ObjBenders& operator=(ObjBenders&& o) = delete;
virtual SCIP_DECL_BENDERSCOPY(scip_copy)
{
return SCIP_OKAY;
}
virtual SCIP_DECL_BENDERSFREE(scip_free)
{
return SCIP_OKAY;
}
virtual SCIP_DECL_BENDERSINIT(scip_init)
{
return SCIP_OKAY;
}
virtual SCIP_DECL_BENDERSEXIT(scip_exit)
{
return SCIP_OKAY;
}
virtual SCIP_DECL_BENDERSINITPRE(scip_initpre)
{
return SCIP_OKAY;
}
virtual SCIP_DECL_BENDERSEXITPRE(scip_exitpre)
{
return SCIP_OKAY;
}
virtual SCIP_DECL_BENDERSINITSOL(scip_initsol)
{
return SCIP_OKAY;
}
virtual SCIP_DECL_BENDERSEXITSOL(scip_exitsol)
{
return SCIP_OKAY;
}
virtual SCIP_DECL_BENDERSCREATESUB(scip_createsub) = 0;
virtual SCIP_DECL_BENDERSPRESUBSOLVE(scip_presubsolve)
{
return SCIP_OKAY;
}
virtual SCIP_DECL_BENDERSSOLVESUBCONVEX(scip_solvesubconvex)
{
return SCIP_OKAY;
}
virtual SCIP_DECL_BENDERSSOLVESUB(scip_solvesub)
{
return SCIP_OKAY;
}
virtual SCIP_DECL_BENDERSPOSTSOLVE(scip_postsolve)
{
return SCIP_OKAY;
}
virtual SCIP_DECL_BENDERSFREESUB(scip_freesub)
{
return SCIP_OKAY;
}
virtual SCIP_DECL_BENDERSGETVAR(scip_getvar) = 0;
};
}
SCIP_EXPORT
SCIP_RETCODE SCIPincludeObjBenders(
SCIP* scip,
scip::ObjBenders* objbenders,
SCIP_Bool deleteobject
);
SCIP_EXPORT
scip::ObjBenders* SCIPfindObjBenders(
SCIP* scip,
const char* name
);
SCIP_EXPORT
scip::ObjBenders* SCIPgetObjBenders(
SCIP* scip,
SCIP_BENDERS* benders
);
#endif