ConicBundle
PSCIPBlock.hxx
Go to the documentation of this file.
1 
2 
3 #ifndef CONICBUNDLE_PSCIPBLOCK_HXX
4 #define CONICBUNDLE_PSCIPBLOCK_HXX
5 
13 #include "InteriorPointBlock.hxx"
14 
15 namespace ConicBundle {
16 
21 
27 class PSCIPBlock: public virtual InteriorPointBlock
28 {
29 protected:
36 
42 
45 
46 
48 
52 
54 
57 
60 
65 
67  void point_changed();
68 
70  int compute_NTscaling();
71 
73  int compute_Weig_Wvec();
74 
75 public:
77  virtual void clear(CH_Matrix_Classes::Integer dim=0);
78 
80  PSCIPBlock(CH_Matrix_Classes::Integer dim=0, CBout* cb=0,int cbinc=-1);
81 
83  ~PSCIPBlock();
84 
86  virtual CH_Matrix_Classes::Integer get_vecdim() const;
87 
89  virtual int center_x(CH_Matrix_Classes::Real val,bool add=false);
90 
92  virtual int center_z(CH_Matrix_Classes::Real val,bool add=false);
93 
95  virtual int set_x(const CH_Matrix_Classes::Matrix& vec,CH_Matrix_Classes::Integer startindex,CH_Matrix_Classes::Real& add_center_value);
96 
98  virtual int set_z(const CH_Matrix_Classes::Matrix& vec,CH_Matrix_Classes::Integer startindex,CH_Matrix_Classes::Real& add_center_value);
99 
101  virtual int vecgetsax(CH_Matrix_Classes::Matrix& vec,
102  CH_Matrix_Classes::Integer startindex,
104  bool add=false);
105 
107  virtual int vecgetsaz(CH_Matrix_Classes::Matrix& vec,
108  CH_Matrix_Classes::Integer startindex,
110  bool add=false);
111 
113  virtual int get_mu_info(CH_Matrix_Classes::Integer& mudim,
115  CH_Matrix_Classes::Real& tr_xdzpdxz,
116  CH_Matrix_Classes::Real& tr_dxdz,
117  CH_Matrix_Classes::Real& min_xz,
118  CH_Matrix_Classes::Real& max_xz) const;
119 
121  virtual int get_nbh_info(CH_Matrix_Classes::Integer mudim,
123  CH_Matrix_Classes::Real tr_xdzpdxz,
124  CH_Matrix_Classes::Real tr_dxdz,
125  CH_Matrix_Classes::Real nbh_ubnd,
127  CH_Matrix_Classes::Real& max_nbh,
128  CH_Matrix_Classes::Real& nrmsqr_xz,
129  CH_Matrix_Classes::Real& nrmsqr_xdzpdxz,
130  CH_Matrix_Classes::Real& nrmsqr_dxdz,
131  CH_Matrix_Classes::Real& ip_xz_xdzpdxz,
132  CH_Matrix_Classes::Real& ip_xz_dxdz,
133  CH_Matrix_Classes::Real& ip_dxdz_xdzpdxz) const;
134 
136  virtual int linesearch(CH_Matrix_Classes::Real& alpha) const;
137 
139  virtual int add_muxinv(CH_Matrix_Classes::Matrix& rhs,
140  CH_Matrix_Classes::Integer startindex,
142  CH_Matrix_Classes::Real rhscorr,
143  bool minus=false);
144 
146  virtual int set_dx(const CH_Matrix_Classes::Matrix& rhs,CH_Matrix_Classes::Integer startindex);
147 
150 
152  virtual int apply_xizinv(CH_Matrix_Classes::Matrix& rhs,
153  CH_Matrix_Classes::Integer startindex,
154  bool minus=false);
155 
157  virtual int apply_xiz(CH_Matrix_Classes::Matrix& rhs,
158  CH_Matrix_Classes::Integer startindex,
159  bool minus=false);
160 
162  virtual int do_step(CH_Matrix_Classes::Real alpha);
163 
165  virtual int add_AxizinvAt(const CH_Matrix_Classes::Matrix& A,
166  CH_Matrix_Classes::Symmatrix& globalsys,
167  bool minus=false,
168  bool Atrans=false);
169 
171  virtual int add_xiz(CH_Matrix_Classes::Symmatrix& globalsys,CH_Matrix_Classes::Integer startindex,bool minus=false);
172 
173  //---------------------- mainly for testing
174 
177  {
178  CH_Matrix_Classes::svec(X,tmpmat);
179  CH_Matrix_Classes::mat_xey(vecdim,vecx.get_store()+startindex,tmpmat.get_store());return 0; }
180 
183  {
184  CH_Matrix_Classes::svec(Z,tmpmat);
185  CH_Matrix_Classes::mat_xey(vecdim,vecz.get_store()+startindex,tmpmat.get_store());return 0; }
186 
189  {
190  if (dX.rowdim()!=rowdim)
191  return 1;
192  CH_Matrix_Classes::svec(dX,tmpmat);
193  CH_Matrix_Classes::mat_xey(vecdim,vecdx.get_store()+startindex,tmpmat.get_store());
194  return 0;
195  }
196 
197 
200  {
201  if (dZ.rowdim()!=rowdim)
202  return 1;
203  CH_Matrix_Classes::svec(dZ,tmpmat);
204  CH_Matrix_Classes::mat_xey(vecdim,vecdz.get_store()+startindex,tmpmat.get_store());
205  return 0;
206  }
207 
208 
209 
210 };
211 
212 
214 
215 }
216 
217 #endif
218 
int Integer
all integer numbers in calculations and indexing are of this type
Definition: matop.hxx:40
int compute_NTscaling()
computes the NT scaling information for building the system matrix
virtual int set_dx(const CH_Matrix_Classes::Matrix &rhs, CH_Matrix_Classes::Integer startindex)
extract dx from rhs at startindex and compute at the same time dz (=-sys dx -z +complentarity_rhs); ...
CH_Matrix_Classes::Symmatrix tmpsym2
temporary matrices for reuse
Definition: PSCIPBlock.hxx:62
virtual int do_step(CH_Matrix_Classes::Real alpha)
move to (x+alpha*dx, z+alpha*dz)
interface for interior point variable and routines specific to primal dual complementarity conditions...
Definition: PSCIPBlock.hxx:27
virtual int get_vecx(CH_Matrix_Classes::Matrix &vecx, CH_Matrix_Classes::Integer startindex)
return the vector form of x
Definition: PSCIPBlock.hxx:176
CH_Matrix_Classes::Symmatrix Winv
inverse of NT scaling matrix
Definition: PSCIPBlock.hxx:38
double Real
all real numbers in calculations are of this type
Definition: matop.hxx:50
CH_Matrix_Classes::Symmatrix W
NT scaling matrix.
Definition: PSCIPBlock.hxx:37
Header declaring the class ConicBundle::InteriorPointBlock.
CH_Matrix_Classes::Matrix Ginv
Gram Matrix of inverse NT scaling matrix.
Definition: PSCIPBlock.hxx:40
CH_Matrix_Classes::Matrix D
Diagonal for NT scaling.
Definition: PSCIPBlock.hxx:41
CH_Matrix_Classes::Integer vecdim
dimension svec representation
Definition: PSCIPBlock.hxx:31
CH_Matrix_Classes::Real mu
in a step mu gets the value of last_rhs_mu
Definition: PSCIPBlock.hxx:50
virtual CH_Matrix_Classes::Integer get_vecdim() const
return the length of the svec reprensentation
abstract interface for interior point vector/matrix variables and routines specific to primal dual co...
Definition: InteriorPointBlock.hxx:30
CH_Matrix_Classes::Matrix tmpmat
temporary matrices for reuse
Definition: PSCIPBlock.hxx:64
Real * get_store()
returns the current address of the internal value array; use cautiously, do not use delete! ...
Definition: matrix.hxx:326
virtual int linesearch(CH_Matrix_Classes::Real &alpha) const
if necessary, reduce alpha to the biggest value so that feasibility is maintained with this step size...
Matrix class of symmetric matrices with real values of type Real
Definition: symmat.hxx:43
Integer rowdim() const
returns the row dimension
Definition: symmat.hxx:159
CH_Matrix_Classes::Symmatrix compl_rhs
rhs used in solving the complementarity line
Definition: PSCIPBlock.hxx:47
virtual int add_xiz(CH_Matrix_Classes::Symmatrix &globalsys, CH_Matrix_Classes::Integer startindex, bool minus=false)
add (or subract if minus==true) the system matrix to a big system matrix starting at startindex ...
CH_Matrix_Classes::Real old_mu
in a step old_mu gets the value of mu before this gets last_rhs_mu
Definition: PSCIPBlock.hxx:51
conic bundle method solver for sum of convex functions. See the ConicBundle_Manual for a quick introd...
Definition: CBSolver.hxx:22
CH_Matrix_Classes::Symmatrix dZ
current step for Z
Definition: PSCIPBlock.hxx:35
base class for uniform use of WARNINGS and ERRORS (at some point in time)
Definition: CBout.hxx:30
int compute_Weig_Wvec()
compute Weig and Wvec with Weig eigenvalues of W and W=Wvec*Wvec' where Wvec = P*Lambda^{.5} for W = P*Lambda*P'
virtual int set_x(const CH_Matrix_Classes::Matrix &vec, CH_Matrix_Classes::Integer startindex, CH_Matrix_Classes::Real &add_center_value)
set x to the values of vec[startindex+0,+1 ...,+(vecdim-1)] and return in add_center_value a value>=0...
CH_Matrix_Classes::Symmatrix oldX
point before x
Definition: PSCIPBlock.hxx:55
PSCIPBlock(CH_Matrix_Classes::Integer dim=0, CBout *cb=0, int cbinc=-1)
default constructor, alos allows to set the order
void point_changed()
clear variables that are no longer valid for the current point
CH_Matrix_Classes::Matrix tmpvec
temporary matrices for reuse
Definition: PSCIPBlock.hxx:63
virtual int center_z(CH_Matrix_Classes::Real val, bool add=false)
set z to value*"one" to z, or if add==true, add value*"one" to z
CH_Matrix_Classes::Symmatrix Z
"dual" point Z
Definition: PSCIPBlock.hxx:33
virtual int get_vecdz(CH_Matrix_Classes::Matrix &vecdz, CH_Matrix_Classes::Integer startindex)
return the vector form of dz, 1 if not available
Definition: PSCIPBlock.hxx:199
virtual int vecgetsaz(CH_Matrix_Classes::Matrix &vec, CH_Matrix_Classes::Integer startindex, CH_Matrix_Classes::Real a=1., bool add=false)
on vec[startindex+0,+1 ...,+(vecdim-1)] put or add a * z into vec for a real number a ...
CH_Matrix_Classes::Real last_alpha
last alpha used in do_step()
Definition: PSCIPBlock.hxx:53
virtual int get_nbh_info(CH_Matrix_Classes::Integer mudim, CH_Matrix_Classes::Real tr_xz, CH_Matrix_Classes::Real tr_xdzpdxz, CH_Matrix_Classes::Real tr_dxdz, CH_Matrix_Classes::Real nbh_ubnd, CH_Matrix_Classes::Real &alpha, CH_Matrix_Classes::Real &max_nbh, CH_Matrix_Classes::Real &nrmsqr_xz, CH_Matrix_Classes::Real &nrmsqr_xdzpdxz, CH_Matrix_Classes::Real &nrmsqr_dxdz, CH_Matrix_Classes::Real &ip_xz_xdzpdxz, CH_Matrix_Classes::Real &ip_xz_dxdz, CH_Matrix_Classes::Real &ip_dxdz_xdzpdxz) const
for limiting the stepsize with respect to the neighborhood this information about norms and inner pro...
virtual int apply_xizinv(CH_Matrix_Classes::Matrix &rhs, CH_Matrix_Classes::Integer startindex, bool minus=false)
compute sysinv*rhs into rhs, possibly with a negative sign
void mat_xey(Integer len, Val *x, const Val *y)
Copy an array of length len to destination x from source y.
Definition: matop.hxx:117
virtual int apply_xiz(CH_Matrix_Classes::Matrix &rhs, CH_Matrix_Classes::Integer startindex, bool minus=false)
compute sys*rhs into rhs, possibly with a negative sign
Matrix class for real values of type Real
Definition: matrix.hxx:74
~PSCIPBlock()
destructor
CH_Matrix_Classes::Symmatrix tmpsym
temporary matrices for reuse
Definition: PSCIPBlock.hxx:61
CH_Matrix_Classes::Matrix PX
eigenvectors of X corresponding to lamX (if computed)
Definition: PSCIPBlock.hxx:59
virtual int add_AxizinvAt(const CH_Matrix_Classes::Matrix &A, CH_Matrix_Classes::Symmatrix &globalsys, bool minus=false, bool Atrans=false)
add the Schur complement to a big system matrix
CH_Matrix_Classes::Matrix G
Gram Matrix of NT scaling matrix.
Definition: PSCIPBlock.hxx:39
CH_Matrix_Classes::Matrix lamX
eigenvalues of X corresponding to PX (if computed)
Definition: PSCIPBlock.hxx:58
CH_Matrix_Classes::Real last_rhs_mu
the last mu used in rhs computations
Definition: PSCIPBlock.hxx:49
virtual int set_z(const CH_Matrix_Classes::Matrix &vec, CH_Matrix_Classes::Integer startindex, CH_Matrix_Classes::Real &add_center_value)
set z to the values of vec[startindex+0,+1 ...,+(vecdim-1)] and add sufficient center to make z feasi...
virtual int get_vecdx(CH_Matrix_Classes::Matrix &vecdx, CH_Matrix_Classes::Integer startindex)
return the vector form of dx, 1 if not available
Definition: PSCIPBlock.hxx:188
virtual int set_dx_xizsolverhs(const CH_Matrix_Classes::Matrix &rhs, CH_Matrix_Classes::Integer startindex)
compute dx=sysinv*rhs and at the same time dz (=-rhs -z +complentarity_rhs);
CH_Matrix_Classes::Symmatrix dX
current step for X
Definition: PSCIPBlock.hxx:34
CH_Matrix_Classes::Integer rowdim
order of the symmetric matrices of the cone,
Definition: PSCIPBlock.hxx:30
CH_Matrix_Classes::Matrix Weig
eigenvalues of W (if Weig.rowdim()==rowdim(), lazy evaulation)
Definition: PSCIPBlock.hxx:43
virtual int center_x(CH_Matrix_Classes::Real val, bool add=false)
set x to value*"one" to x, or if add==true, add value*"one" to x
CH_Matrix_Classes::Symmatrix X
"primal" point X
Definition: PSCIPBlock.hxx:32
virtual void clear(CH_Matrix_Classes::Integer dim=0)
reset all point information to zero for dimension dim, the rest to zero
virtual int add_muxinv(CH_Matrix_Classes::Matrix &rhs, CH_Matrix_Classes::Integer startindex, CH_Matrix_Classes::Real rhsmu, CH_Matrix_Classes::Real rhscorr, bool minus=false)
compute the complementarity_rhs=rhsmu*xi-rhscorr*xi*dx*dz (wihtout "-z") for mu=rhsmu and for correct...
virtual int get_mu_info(CH_Matrix_Classes::Integer &mudim, CH_Matrix_Classes::Real &tr_xz, CH_Matrix_Classes::Real &tr_xdzpdxz, CH_Matrix_Classes::Real &tr_dxdz, CH_Matrix_Classes::Real &min_xz, CH_Matrix_Classes::Real &max_xz) const
add dimensions of the primal-dual pairs to mudim and add the "trace" (the inner product with center) ...
CH_Matrix_Classes::Symmatrix oldZ
point before z
Definition: PSCIPBlock.hxx:56
void svec(const Symmatrix &A, Matrix &sv, Real a=1., bool add=false, Integer startindex_vec=-1, Integer startindex_A=0, Integer blockdim=-1)
the symmetric vec operator stacks the lower triangle of A to a n*(n+1)/2 vector with the same norm2 a...
virtual int get_vecz(CH_Matrix_Classes::Matrix &vecz, CH_Matrix_Classes::Integer startindex)
return the vector form of z
Definition: PSCIPBlock.hxx:182
CH_Matrix_Classes::Matrix Wvec
W=Wvec*Wvec' where Wvec = P*Lambda^{.5} for W = P*Lambda*P' (if Weig.rowdim()==rowdim(), lazy evaulation)
Definition: PSCIPBlock.hxx:44
virtual int vecgetsax(CH_Matrix_Classes::Matrix &vec, CH_Matrix_Classes::Integer startindex, CH_Matrix_Classes::Real a=1., bool add=false)
on vec[startindex+0,+1 ...,+(vecdim-1)] put or add a * x into vec for a real number a ...