Logo ROOT  
Reference Guide
TQpProbSparse.cxx
Go to the documentation of this file.
1// @(#)root/quadp:$Id$
2// Author: Eddy Offermann May 2004
3
4/*************************************************************************
5 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers. *
6 * All rights reserved. *
7 * *
8 * For the licensing terms see $ROOTSYS/LICENSE. *
9 * For the list of contributors see $ROOTSYS/README/CREDITS. *
10 *************************************************************************/
11
12/*************************************************************************
13 * Parts of this file are copied from the OOQP distribution and *
14 * are subject to the following license: *
15 * *
16 * COPYRIGHT 2001 UNIVERSITY OF CHICAGO *
17 * *
18 * The copyright holder hereby grants you royalty-free rights to use, *
19 * reproduce, prepare derivative works, and to redistribute this software*
20 * to others, provided that any changes are clearly documented. This *
21 * software was authored by: *
22 * *
23 * E. MICHAEL GERTZ gertz@mcs.anl.gov *
24 * Mathematics and Computer Science Division *
25 * Argonne National Laboratory *
26 * 9700 S. Cass Avenue *
27 * Argonne, IL 60439-4844 *
28 * *
29 * STEPHEN J. WRIGHT swright@cs.wisc.edu *
30 * Computer Sciences Department *
31 * University of Wisconsin *
32 * 1210 West Dayton Street *
33 * Madison, WI 53706 FAX: (608)262-9777 *
34 * *
35 * Any questions or comments may be directed to one of the authors. *
36 * *
37 * ARGONNE NATIONAL LABORATORY (ANL), WITH FACILITIES IN THE STATES OF *
38 * ILLINOIS AND IDAHO, IS OWNED BY THE UNITED STATES GOVERNMENT, AND *
39 * OPERATED BY THE UNIVERSITY OF CHICAGO UNDER PROVISION OF A CONTRACT *
40 * WITH THE DEPARTMENT OF ENERGY. *
41 *************************************************************************/
42
43#include "TQpProbSparse.h"
44#include "TMatrixD.h"
45#include "TQpLinSolverSparse.h"
46
47////////////////////////////////////////////////////////////////////////////////
48///
49/// \class TQpProbSparse
50///
51/// dense matrix problem formulation
52///
53////////////////////////////////////////////////////////////////////////////////
54
56
57////////////////////////////////////////////////////////////////////////////////
58/// Constructor
59
61 TQpProbBase(nx,my,mz)
62{
63 // We do not want more constrains than variables
64 R__ASSERT(nx-my-mz > 0);
65}
66
67
68////////////////////////////////////////////////////////////////////////////////
69/// Copy constructor
70
72{
73 *this = another;
74}
75
76
77////////////////////////////////////////////////////////////////////////////////
78/// Setup the data
79
81 Int_t nnzQ,Int_t *irowQ,Int_t *icolQ,Double_t *Q,
82 Double_t *xlo,Bool_t *ixlo,
83 Double_t *xup,Bool_t *ixup,
84 Int_t nnzA,Int_t *irowA,Int_t *icolA,Double_t *A,
85 Double_t *bA,
86 Int_t nnzC,Int_t *irowC,Int_t *icolC,Double_t *C,
87 Double_t *clo,Bool_t *iclo,
88 Double_t *cup,Bool_t *icup)
89{
90 TVectorD vc ; vc .Use(fNx,c);
91 TMatrixDSparse mQ ; mQ .Use(fNx,fNx,nnzQ,irowQ,icolQ,Q);
92 TVectorD vxlo; vxlo.Use(fNx,xlo);
93 TVectorD vxup; vxup.Use(fNx,xup);
95 TVectorD vbA ;
96 if (fMy > 0) {
97 mA .Use(fMy,fNx,nnzA,irowA,icolA,A);
98 vbA .Use(fMy,bA);
99 }
100 TMatrixDSparse mC ;
101 TVectorD vclo;
102 TVectorD vcup;
103 if (fMz > 0) {
104 mC .Use(fMz,fNx,nnzC,irowC,icolC,C);
105 vclo.Use(fMz,clo);
106 vcup.Use(fMz,cup);
107 }
108
109 TVectorD vixlo(fNx);
110 TVectorD vixup(fNx);
111 for (Int_t ix = 0; ix < fNx; ix++) {
112 vixlo[ix] = (ixlo[ix]) ? 1.0 : 0.0;
113 vixup[ix] = (ixup[ix]) ? 1.0 : 0.0;
114 }
115
116 TVectorD viclo(fMz);
117 TVectorD vicup(fMz);
118 for (Int_t ic = 0; ic < fMz; ic++) {
119 viclo[ic] = (iclo[ic]) ? 1.0 : 0.0;
120 vicup[ic] = (icup[ic]) ? 1.0 : 0.0;
121 }
122
123 TQpDataSparse *data = new TQpDataSparse(vc,mQ,vxlo,vixlo,vxup,vixup,mA,vbA,mC,vclo,
124 viclo,vcup,vicup);
125
126 return data;
127}
128
129
130////////////////////////////////////////////////////////////////////////////////
131/// Setup the data
132
134 TMatrixDBase &Q_in,
135 TVectorD &xlo, TVectorD &ixlo,
136 TVectorD &xup, TVectorD &ixup,
137 TMatrixDBase &A_in,TVectorD &bA,
138 TMatrixDBase &C_in,
139 TVectorD &clo, TVectorD &iclo,
140 TVectorD &cup, TVectorD &icup)
141{
142 TMatrixDSparse &mQ = (TMatrixDSparse &) Q_in;
143 TMatrixDSparse &mA = (TMatrixDSparse &) A_in;
144 TMatrixDSparse &mC = (TMatrixDSparse &) C_in;
145
146 R__ASSERT(mQ.GetNrows() == fNx && mQ.GetNcols() == fNx);
147 if (fMy > 0) R__ASSERT(mA.GetNrows() == fMy && mA.GetNcols() == fNx);
148 else R__ASSERT(mA.GetNrows() == fMy);
149 if (fMz > 0) R__ASSERT(mC.GetNrows() == fMz && mC.GetNcols() == fNx);
150 else R__ASSERT(mC.GetNrows() == fMz);
151
152 R__ASSERT(c.GetNrows() == fNx);
153 R__ASSERT(xlo.GetNrows() == fNx);
154 R__ASSERT(ixlo.GetNrows() == fNx);
155 R__ASSERT(xup.GetNrows() == fNx);
156 R__ASSERT(ixup.GetNrows() == fNx);
157
158 R__ASSERT(bA.GetNrows() == fMy);
159 R__ASSERT(clo.GetNrows() == fMz);
160 R__ASSERT(iclo.GetNrows() == fMz);
161 R__ASSERT(cup.GetNrows() == fMz);
162 R__ASSERT(icup.GetNrows() == fMz);
163
164 TQpDataSparse *data = new TQpDataSparse(c,mQ,xlo,ixlo,xup,ixup,mA,bA,mC,clo,iclo,cup,icup);
165
166 return data;
167}
168
169
170////////////////////////////////////////////////////////////////////////////////
171/// Setup the residuals
172
174{
175 TQpDataSparse *data = (TQpDataSparse *) data_in;
176 return new TQpResidual(fNx,fMy,fMz,data->fXloIndex,data->fXupIndex,data->fCloIndex,data->fCupIndex);
177}
178
179
180////////////////////////////////////////////////////////////////////////////////
181/// Setup the variables
182
184{
185 TQpDataSparse *data = (TQpDataSparse *) data_in;
186
187 return new TQpVar(fNx,fMy,fMz,data->fXloIndex,data->fXupIndex,data->fCloIndex,data->fCupIndex);
188}
189
190
191////////////////////////////////////////////////////////////////////////////////
192/// Setup the linear solver
193
195{
196 TQpDataSparse *data = (TQpDataSparse *) data_in;
197 return new TQpLinSolverSparse(this,data);
198}
199
200
201////////////////////////////////////////////////////////////////////////////////
202/// Assembles a single vector object from three given vectors .
203/// rhs_out (output) final joined vector
204/// rhs1_in (input) first part of rhs
205/// rhs2_in (input) middle part of rhs
206/// rhs3_in (input) last part of rhs .
207
208void TQpProbSparse::JoinRHS(TVectorD &rhs,TVectorD &rhs1_in,TVectorD &rhs2_in,TVectorD &rhs3_in)
209{
210 rhs.SetSub(0,rhs1_in);
211 if (fMy > 0) rhs.SetSub(fNx, rhs2_in);
212 if (fMz > 0) rhs.SetSub(fNx+fMy,rhs3_in);
213}
214
215
216////////////////////////////////////////////////////////////////////////////////
217/// Extracts three component vectors from a given aggregated vector.
218/// vars_in (input) aggregated vector
219/// x_in (output) first part of vars
220/// y_in (output) middle part of vars
221/// z_in (output) last part of vars
222
224{
225 x_in = vars_in.GetSub(0,fNx-1);
226 if (fMy > 0) y_in = vars_in.GetSub(fNx, fNx+fMy-1);
227 if (fMz > 0) z_in = vars_in.GetSub(fNx+fMy,fNx+fMy+fMz-1);
228}
229
230
231////////////////////////////////////////////////////////////////////////////////
232/// Create a random QP problem
233
235{
236 data = new TQpDataSparse(fNx,fMy,fMz);
237 soln = this->MakeVariables(data);
238 data->SetNonZeros(nnzQ,nnzA,nnzC);
239 data->DataRandom(soln->fX,soln->fY,soln->fZ,soln->fS);
240}
241
242
243////////////////////////////////////////////////////////////////////////////////
244/// Assignment operator
245
247{
248 if (this != &source) {
250 }
251 return *this;
252}
#define c(i)
Definition: RSha256.hxx:101
double Double_t
Definition: RtypesCore.h:57
#define ClassImp(name)
Definition: Rtypes.h:361
#define R__ASSERT(e)
Definition: TError.h:96
Int_t GetNrows() const
Definition: TMatrixTBase.h:124
Int_t GetNcols() const
Definition: TMatrixTBase.h:127
TMatrixTSparse< Element > & Use(Int_t row_lwb, Int_t row_upb, Int_t col_lwb, Int_t col_upb, Int_t nr_nonzeros, Int_t *pRowIndex, Int_t *pColIndex, Element *pData)
Data for the general QP formulation.
Definition: TQpDataBase.h:61
TVectorD fXupIndex
Definition: TQpDataBase.h:80
TVectorD fCloIndex
Definition: TQpDataBase.h:86
TVectorD fCupIndex
Definition: TQpDataBase.h:84
TVectorD fXloIndex
Definition: TQpDataBase.h:82
Data for the sparse QP formulation.
Definition: TQpDataSparse.h:60
void SetNonZeros(Int_t nnzQ, Int_t nnzA, Int_t nnzC)
Allocate space for the appropriate number of non-zeros in the matrices.
virtual void DataRandom(TVectorD &x, TVectorD &y, TVectorD &z, TVectorD &s)
Choose randomly a QP problem.
Implementation of main solver for linear systems.
Implements the aspects of the solvers for dense general QP formulation that are specific to the dense...
default general problem formulation:
Definition: TQpProbBase.h:89
TQpProbBase & operator=(const TQpProbBase &source)
Assignment operator.
Definition: TQpProbBase.cxx:94
dense matrix problem formulation
Definition: TQpProbSparse.h:59
virtual void SeparateVars(TVectorD &x_in, TVectorD &y_in, TVectorD &z_in, TVectorD &vars_in)
Extracts three component vectors from a given aggregated vector.
virtual TQpLinSolverBase * MakeLinSys(const TQpDataBase *data)
Setup the linear solver.
virtual TQpDataBase * MakeData(Double_t *c, Int_t nnzQ, Int_t *irowQ, Int_t *icolQ, Double_t *Q, Double_t *xlo, Bool_t *ixlo, Double_t *xup, Bool_t *ixup, Int_t nnzA, Int_t *irowA, Int_t *icolA, Double_t *A, Double_t *bA, Int_t nnzC, Int_t *irowC, Int_t *icolC, Double_t *C, Double_t *clo, Bool_t *iclo, Double_t *cup, Bool_t *icup)
Setup the data.
virtual TQpVar * MakeVariables(const TQpDataBase *data)
Setup the variables.
TQpProbSparse & operator=(const TQpProbSparse &source)
Assignment operator.
void MakeRandomData(TQpDataSparse *&data, TQpVar *&soln, Int_t nnzQ, Int_t nnzA, Int_t nnzC)
Create a random QP problem.
virtual TQpResidual * MakeResiduals(const TQpDataBase *data)
Setup the residuals.
virtual void JoinRHS(TVectorD &rhs_in, TVectorD &rhs1_in, TVectorD &rhs2_in, TVectorD &rhs3_in)
Assembles a single vector object from three given vectors .
The Residuals class calculates and stores the quantities that appear on the right-hand side of the li...
Definition: TQpResidual.h:62
Class containing the variables for the general QP formulation.
Definition: TQpVar.h:60
TVectorD fX
Definition: TQpVar.h:91
TVectorD fS
Definition: TQpVar.h:92
TVectorD fY
Definition: TQpVar.h:93
TVectorD fZ
Definition: TQpVar.h:94
TVectorT< Element > & GetSub(Int_t row_lwb, Int_t row_upb, TVectorT< Element > &target, Option_t *option="S") const
Get subvector [row_lwb..row_upb]; The indexing range of the returned vector depends on the argument o...
Definition: TVectorT.cxx:374
Int_t GetNrows() const
Definition: TVectorT.h:75
TVectorT< Element > & SetSub(Int_t row_lwb, const TVectorT< Element > &source)
Insert vector source starting at [row_lwb], thereby overwriting the part [row_lwb....
Definition: TVectorT.cxx:423
TVectorT< Element > & Use(Int_t lwb, Int_t upb, Element *data)
Use the array data to fill the vector lwb..upb].
Definition: TVectorT.cxx:350
static double Q[]
static double A[]
static double C[]