1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
/* $Id: ClpPdcoBase.hpp 1665 2011-01-04 17:55:54Z lou $ */
// Copyright (C) 2003, International Business Machines
// Corporation and others. All Rights Reserved.
// This code is licensed under the terms of the Eclipse Public License (EPL).
#ifndef ClpPdcoBase_H
#define ClpPdcoBase_H
#include "CoinPragma.hpp"
#include "CoinPackedMatrix.hpp"
#include "CoinDenseVector.hpp"
class ClpInterior;
/** Abstract base class for tailoring everything for Pcdo
Since this class is abstract, no object of this type can be created.
If a derived class provides all methods then all ClpPcdo algorithms
should work.
Eventually we should be able to use ClpObjective and ClpMatrixBase.
*/
class ClpPdcoBase {
public:
/**@name Virtual methods that the derived classes must provide */
//@{
virtual void matVecMult(ClpInterior * model, int mode, double * x, double * y) const = 0;
virtual void getGrad(ClpInterior * model, CoinDenseVector<double> &x, CoinDenseVector<double> &grad) const = 0;
virtual void getHessian(ClpInterior * model, CoinDenseVector<double> &x, CoinDenseVector<double> &H) const = 0;
virtual double getObj(ClpInterior * model, CoinDenseVector<double> &x) const = 0;
virtual void matPrecon(ClpInterior * model, double delta, double * x, double * y) const = 0;
//@}
//@{
///@name Other
/// Clone
virtual ClpPdcoBase * clone() const = 0;
/// Returns type
inline int type() const {
return type_;
};
/// Sets type
inline void setType(int type) {
type_ = type;
};
/// Returns size of d1
inline int sizeD1() const {
return 1;
};
/// Returns d1 as scalar
inline double getD1() const {
return d1_;
};
/// Returns size of d2
inline int sizeD2() const {
return 1;
};
/// Returns d2 as scalar
inline double getD2() const {
return d2_;
};
//@}
protected:
/**@name Constructors, destructor<br>
<strong>NOTE</strong>: All constructors are protected. There's no need
to expose them, after all, this is an abstract class. */
//@{
/** Default constructor. */
ClpPdcoBase();
/** Destructor (has to be public) */
public:
virtual ~ClpPdcoBase();
protected:
// Copy
ClpPdcoBase(const ClpPdcoBase&);
// Assignment
ClpPdcoBase& operator=(const ClpPdcoBase&);
//@}
protected:
/**@name Data members
The data members are protected to allow access for derived classes. */
//@{
/// Should be dense vectors
double d1_;
double d2_;
/// type (may be useful)
int type_;
//@}
};
#endif
|