00001 // @(#)root/quadp:$Id: TQpDataSparse.h 20882 2007-11-19 11:31:26Z rdm $ 00002 // Author: Eddy Offermann May 2004 00003 00004 /************************************************************************* 00005 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers. * 00006 * All rights reserved. * 00007 * * 00008 * For the licensing terms see $ROOTSYS/LICENSE. * 00009 * For the list of contributors see $ROOTSYS/README/CREDITS. * 00010 *************************************************************************/ 00011 00012 /************************************************************************* 00013 * Parts of this file are copied from the OOQP distribution and * 00014 * are subject to the following license: * 00015 * * 00016 * COPYRIGHT 2001 UNIVERSITY OF CHICAGO * 00017 * * 00018 * The copyright holder hereby grants you royalty-free rights to use, * 00019 * reproduce, prepare derivative works, and to redistribute this software* 00020 * to others, provided that any changes are clearly documented. This * 00021 * software was authored by: * 00022 * * 00023 * E. MICHAEL GERTZ gertz@mcs.anl.gov * 00024 * Mathematics and Computer Science Division * 00025 * Argonne National Laboratory * 00026 * 9700 S. Cass Avenue * 00027 * Argonne, IL 60439-4844 * 00028 * * 00029 * STEPHEN J. WRIGHT swright@cs.wisc.edu * 00030 * Computer Sciences Department * 00031 * University of Wisconsin * 00032 * 1210 West Dayton Street * 00033 * Madison, WI 53706 FAX: (608)262-9777 * 00034 * * 00035 * Any questions or comments may be directed to one of the authors. * 00036 * * 00037 * ARGONNE NATIONAL LABORATORY (ANL), WITH FACILITIES IN THE STATES OF * 00038 * ILLINOIS AND IDAHO, IS OWNED BY THE UNITED STATES GOVERNMENT, AND * 00039 * OPERATED BY THE UNIVERSITY OF CHICAGO UNDER PROVISION OF A CONTRACT * 00040 * WITH THE DEPARTMENT OF ENERGY. * 00041 *************************************************************************/ 00042 00043 #ifndef ROOT_TQpDataSparse 00044 #define ROOT_TQpDataSparse 00045 00046 #ifndef ROOT_TQpDataBase 00047 #include "TQpDataBase.h" 00048 #endif 00049 #ifndef ROOT_TQpVar 00050 #include "TQpVar.h" 00051 #endif 00052 00053 #ifndef ROOT_TMatrixDSparse 00054 #include "TMatrixDSparse.h" 00055 #endif 00056 00057 ////////////////////////////////////////////////////////////////////////// 00058 // // 00059 // TQpDataSparse // 00060 // // 00061 // Data for the dense QP formulation // 00062 // // 00063 ////////////////////////////////////////////////////////////////////////// 00064 00065 class TQpDataSparse : public TQpDataBase 00066 { 00067 00068 protected: 00069 00070 // these variables will be "Used" not copied 00071 TMatrixDSparse fQ; // quadratic part of Objective function 00072 TMatrixDSparse fA; // Equality constraints 00073 TMatrixDSparse fC; // Inequality constraints 00074 00075 public: 00076 00077 TQpDataSparse() {} 00078 // data objects of the specified dimensions 00079 TQpDataSparse(Int_t nx,Int_t my,Int_t mz); 00080 00081 // sets up pointers to the data objects that are passed as arguments 00082 TQpDataSparse(TVectorD &c,TMatrixDSparse &Q,TVectorD &xlow,TVectorD &ixlow,TVectorD &xupp, 00083 TVectorD &ixupp,TMatrixDSparse &A,TVectorD &bA,TMatrixDSparse &C,TVectorD &clow, 00084 TVectorD &iclow,TVectorD &cupp,TVectorD &icupp); 00085 TQpDataSparse(const TQpDataSparse &another); 00086 00087 virtual ~TQpDataSparse() {} 00088 00089 void SetNonZeros(Int_t nnzQ,Int_t nnzA,Int_t nnzC); 00090 00091 virtual void PutQIntoAt(TMatrixDBase &M,Int_t row,Int_t col); 00092 // insert the Hessian Q into the matrix M for the fundamental 00093 // linear system, where M is stored as a TMatrixDSparse 00094 virtual void PutAIntoAt(TMatrixDBase &M,Int_t row,Int_t col); 00095 // insert the constraint matrix A into the matrix M for the 00096 // fundamental linear system, where M is stored as a TMatrixDSparse 00097 virtual void PutCIntoAt(TMatrixDBase &M,Int_t row,Int_t col); 00098 // insert the constraint matrix C into the matrix M for the 00099 // fundamental linear system, where M is stored as a 00100 // TMatrixDSparse 00101 00102 virtual void Qmult (Double_t beta,TVectorD& y,Double_t alpha,const TVectorD& x); 00103 // y = beta * y + alpha * Q * x 00104 virtual void Amult (Double_t beta,TVectorD& y,Double_t alpha,const TVectorD& x); 00105 // y = beta * y + alpha * A * x 00106 virtual void Cmult (Double_t beta,TVectorD& y,Double_t alpha,const TVectorD& x); 00107 // y = beta * y + alpha * C * x 00108 virtual void ATransmult(Double_t beta,TVectorD& y,Double_t alpha,const TVectorD& x); 00109 // y = beta * y + alpha * A^T * x 00110 virtual void CTransmult(Double_t beta,TVectorD& y,Double_t alpha,const TVectorD& x); 00111 // y = beta * y + alpha * C^T * x 00112 00113 virtual void GetDiagonalOfQ(TVectorD &dQ); // extract the diagonal of Q and put it in the vector dQ 00114 00115 virtual Double_t DataNorm(); 00116 virtual void DataRandom(TVectorD &x,TVectorD &y,TVectorD &z,TVectorD &s); 00117 // Create a random problem (x,y,z,s) 00118 // the solution to the random problem 00119 virtual void Print(Option_t *opt="") const; 00120 00121 virtual Double_t ObjectiveValue(TQpVar *vars); 00122 00123 TQpDataSparse &operator= (const TQpDataSparse &source); 00124 00125 ClassDef(TQpDataSparse,1) // Qp Data class for Sparse formulation 00126 }; 00127 #endif