// @(#)root/quadp:$Id$
// Author: Eddy Offermann   May 2004

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

/*************************************************************************
 * Parts of this file are copied from the OOQP distribution and          *
 * are subject to the following license:                                 *
 *                                                                       *
 * COPYRIGHT 2001 UNIVERSITY OF CHICAGO                                  *
 *                                                                       *
 * The copyright holder hereby grants you royalty-free rights to use,    *
 * reproduce, prepare derivative works, and to redistribute this software*
 * to others, provided that any changes are clearly documented. This     *
 * software was authored by:                                             *
 *                                                                       *
 *   E. MICHAEL GERTZ      gertz@mcs.anl.gov                             *
 *   Mathematics and Computer Science Division                           *
 *   Argonne National Laboratory                                         *
 *   9700 S. Cass Avenue                                                 *
 *   Argonne, IL 60439-4844                                              *
 *                                                                       *
 *   STEPHEN J. WRIGHT     swright@cs.wisc.edu                           *
 *   Computer Sciences Department                                        *
 *   University of Wisconsin                                             *
 *   1210 West Dayton Street                                             *
 *   Madison, WI 53706   FAX: (608)262-9777                              *
 *                                                                       *
 * Any questions or comments may be directed to one of the authors.      *
 *                                                                       *
 * ARGONNE NATIONAL LABORATORY (ANL), WITH FACILITIES IN THE STATES OF   *
 * ILLINOIS AND IDAHO, IS OWNED BY THE UNITED STATES GOVERNMENT, AND     *
 * OPERATED BY THE UNIVERSITY OF CHICAGO UNDER PROVISION OF A CONTRACT   *
 * WITH THE DEPARTMENT OF ENERGY.                                        *
 *************************************************************************/

#include "TQpDataBase.h"

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TQpDataBase                                                          //
//                                                                      //
// Data for the general QP formulation                                  //
//                                                                      //
// The Data class stores the data defining the problem and provides     //
// methods for performing the operations with this data required by     //
// the interior-point algorithms. These operations include assembling   //
// the linear systems (5) or (7), performing matrix-vector operations   //
// with the data, calculating norms of the data, reading input into the //
// data structure from various sources, generating random problem       //
// instances, and printing the data.                                    //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

ClassImp(TQpDataBase)

//______________________________________________________________________________
TQpDataBase::TQpDataBase()
{
// Default constructor

   fNx = 0;
   fMy = 0;
   fMz = 0;
}


//______________________________________________________________________________
TQpDataBase::TQpDataBase(Int_t nx,Int_t my,Int_t mz)
{
// Constructor

   fNx = nx;
   fMy = my;
   fMz = mz;

   fG    .ResizeTo(fNx);

   fBa   .ResizeTo(fMy);

   fXupBound.ResizeTo(fNx);
   fXupIndex.ResizeTo(fNx);
   fXloBound.ResizeTo(fNx);
   fXloIndex.ResizeTo(fNx);

   fCupBound.ResizeTo(fMz);
   fCupIndex.ResizeTo(fMz);
   fCloBound.ResizeTo(fMz);
   fCloIndex.ResizeTo(fMz);
}


//______________________________________________________________________________
TQpDataBase::TQpDataBase(const TQpDataBase &another) : TObject(another)
{
// Copy constructor

   *this = another;
}


//______________________________________________________________________________
void TQpDataBase::RandomlyChooseBoundedVariables(
                           TVectorD &x,TVectorD &dualx,TVectorD &xlow,TVectorD &ixlow,
                           TVectorD &xupp,TVectorD &ixupp,Double_t &ix,Double_t percentLowerOnly,
                           Double_t percentUpperOnly,Double_t percentBound)
{
// Randomly choose  x and its boundaries

   const Int_t n = x.GetNrows();

   // Initialize the upper and lower bounds on x

   Int_t i;
   for (i = 0; i < n; i++) {
      const Double_t r = Drand(ix);

      if (r < percentLowerOnly) {
         ixlow[i] = 1.0;
         xlow [i] = (Drand(ix)-0.5)*3.0;
         ixupp[i] = 0.0;
         xupp [i] = 0.0;
      }
      else if (r < percentLowerOnly+percentUpperOnly) {
         ixlow[i] = 0.0;
         xlow [i] = 0.0;
         ixupp[i] = 1.0;
         xupp [i] = (Drand(ix)-0.5)*3.0;
      }
      else if (r < percentLowerOnly+percentUpperOnly+percentBound) {
         ixlow[i] = 1.0;
         xlow [i] = (Drand(ix)-0.5)*3.0;
         ixupp[i] = 1.0;
         xupp [i] = xlow[i]+Drand(ix)*10.0;
      }
      else {
         // it is free
         ixlow[i] = 0.0;
         xlow [i] = 0.0;
         ixupp[i] = 0.0;
         xupp [i] = 0.0;
      }
   }

   for (i = 0; i < n; i++) {
      if (ixlow[i] == 0.0 && ixupp[i] == 0.0 ) {
         // x[i] not bounded
         x    [i] = 20.0*Drand(ix)-10.0;
         dualx[i] = 0.0;
      }
      else if (ixlow[i] != 0.0 && ixupp[i] != 0.0) {
         // x[i] is bounded above and below
         const Double_t r = Drand(ix);
         if (r < 0.33 ) {
            // x[i] is on its lower bound
            x    [i] = xlow[i];
            dualx[i] = 10.0*Drand(ix);
         }
         else if ( r > .66 ) {
            // x[i] is on its upper bound
            x    [i] =  xupp[i];
            dualx[i] = -10.0*Drand(ix);
         }
         else {
            // x[i] is somewhere in between
            const Double_t theta = .99*Drand(ix)+.005;
            x    [i] = (1-theta)*xlow[i]+theta*xupp[i];
            dualx[i] = 0.0;
         }
      }
      else if (ixlow[i] != 0.0) {
         // x[i] is only bounded below
         if (Drand(ix) < .33 ) {
            // x[i] is on its lower bound
            x    [i] = xlow[i];
            dualx[i] = 10.0*Drand(ix);
         }
         else {
            // x[i] is somewhere above its lower bound
            x    [i] = xlow[i]+0.005+10.0*Drand(ix);
            dualx[i] = 0.0;
         }
      }                          // x[i] only has an upper bound
      else {
         if (Drand(ix) > .66 ) {
            // x[i] is on its upper bound
            x    [i] = xupp[i];
            dualx[i] = -10.0*Drand(ix);
         }
         else {
            // x[i] is somewhere below its upper bound
            x    [i] = xupp[i]-0.005-10.0*Drand(ix);
            dualx[i] = 0.0;
         }
      }
   }
}


//______________________________________________________________________________
TQpDataBase &TQpDataBase::operator=(const TQpDataBase &source)
{
// Assignment operator

   if (this != &source) {
      TObject::operator=(source);
      fNx = source.fNx;
      fMy = source.fMy;
      fMz = source.fMz;

      fG       .ResizeTo(source.fG)       ; fG        = source.fG       ;
      fBa      .ResizeTo(source.fBa)      ; fBa       = source.fBa      ;
      fXupBound.ResizeTo(source.fXupBound); fXupBound = source.fXupBound;
      fXupIndex.ResizeTo(source.fXupIndex); fXupIndex = source.fXupIndex;
      fXloBound.ResizeTo(source.fXloBound); fXloBound = source.fXloBound;
      fXloIndex.ResizeTo(source.fXloIndex); fXloIndex = source.fXloIndex;
      fCupBound.ResizeTo(source.fCupBound); fCupBound = source.fCupBound;
      fCupIndex.ResizeTo(source.fCupIndex); fCupIndex = source.fCupIndex;
      fCloBound.ResizeTo(source.fCloBound); fCloBound = source.fCloBound;
      fCloIndex.ResizeTo(source.fCloIndex); fCloIndex = source.fCloIndex;
   }
   return *this;
}
 TQpDataBase.cxx:1
 TQpDataBase.cxx:2
 TQpDataBase.cxx:3
 TQpDataBase.cxx:4
 TQpDataBase.cxx:5
 TQpDataBase.cxx:6
 TQpDataBase.cxx:7
 TQpDataBase.cxx:8
 TQpDataBase.cxx:9
 TQpDataBase.cxx:10
 TQpDataBase.cxx:11
 TQpDataBase.cxx:12
 TQpDataBase.cxx:13
 TQpDataBase.cxx:14
 TQpDataBase.cxx:15
 TQpDataBase.cxx:16
 TQpDataBase.cxx:17
 TQpDataBase.cxx:18
 TQpDataBase.cxx:19
 TQpDataBase.cxx:20
 TQpDataBase.cxx:21
 TQpDataBase.cxx:22
 TQpDataBase.cxx:23
 TQpDataBase.cxx:24
 TQpDataBase.cxx:25
 TQpDataBase.cxx:26
 TQpDataBase.cxx:27
 TQpDataBase.cxx:28
 TQpDataBase.cxx:29
 TQpDataBase.cxx:30
 TQpDataBase.cxx:31
 TQpDataBase.cxx:32
 TQpDataBase.cxx:33
 TQpDataBase.cxx:34
 TQpDataBase.cxx:35
 TQpDataBase.cxx:36
 TQpDataBase.cxx:37
 TQpDataBase.cxx:38
 TQpDataBase.cxx:39
 TQpDataBase.cxx:40
 TQpDataBase.cxx:41
 TQpDataBase.cxx:42
 TQpDataBase.cxx:43
 TQpDataBase.cxx:44
 TQpDataBase.cxx:45
 TQpDataBase.cxx:46
 TQpDataBase.cxx:47
 TQpDataBase.cxx:48
 TQpDataBase.cxx:49
 TQpDataBase.cxx:50
 TQpDataBase.cxx:51
 TQpDataBase.cxx:52
 TQpDataBase.cxx:53
 TQpDataBase.cxx:54
 TQpDataBase.cxx:55
 TQpDataBase.cxx:56
 TQpDataBase.cxx:57
 TQpDataBase.cxx:58
 TQpDataBase.cxx:59
 TQpDataBase.cxx:60
 TQpDataBase.cxx:61
 TQpDataBase.cxx:62
 TQpDataBase.cxx:63
 TQpDataBase.cxx:64
 TQpDataBase.cxx:65
 TQpDataBase.cxx:66
 TQpDataBase.cxx:67
 TQpDataBase.cxx:68
 TQpDataBase.cxx:69
 TQpDataBase.cxx:70
 TQpDataBase.cxx:71
 TQpDataBase.cxx:72
 TQpDataBase.cxx:73
 TQpDataBase.cxx:74
 TQpDataBase.cxx:75
 TQpDataBase.cxx:76
 TQpDataBase.cxx:77
 TQpDataBase.cxx:78
 TQpDataBase.cxx:79
 TQpDataBase.cxx:80
 TQpDataBase.cxx:81
 TQpDataBase.cxx:82
 TQpDataBase.cxx:83
 TQpDataBase.cxx:84
 TQpDataBase.cxx:85
 TQpDataBase.cxx:86
 TQpDataBase.cxx:87
 TQpDataBase.cxx:88
 TQpDataBase.cxx:89
 TQpDataBase.cxx:90
 TQpDataBase.cxx:91
 TQpDataBase.cxx:92
 TQpDataBase.cxx:93
 TQpDataBase.cxx:94
 TQpDataBase.cxx:95
 TQpDataBase.cxx:96
 TQpDataBase.cxx:97
 TQpDataBase.cxx:98
 TQpDataBase.cxx:99
 TQpDataBase.cxx:100
 TQpDataBase.cxx:101
 TQpDataBase.cxx:102
 TQpDataBase.cxx:103
 TQpDataBase.cxx:104
 TQpDataBase.cxx:105
 TQpDataBase.cxx:106
 TQpDataBase.cxx:107
 TQpDataBase.cxx:108
 TQpDataBase.cxx:109
 TQpDataBase.cxx:110
 TQpDataBase.cxx:111
 TQpDataBase.cxx:112
 TQpDataBase.cxx:113
 TQpDataBase.cxx:114
 TQpDataBase.cxx:115
 TQpDataBase.cxx:116
 TQpDataBase.cxx:117
 TQpDataBase.cxx:118
 TQpDataBase.cxx:119
 TQpDataBase.cxx:120
 TQpDataBase.cxx:121
 TQpDataBase.cxx:122
 TQpDataBase.cxx:123
 TQpDataBase.cxx:124
 TQpDataBase.cxx:125
 TQpDataBase.cxx:126
 TQpDataBase.cxx:127
 TQpDataBase.cxx:128
 TQpDataBase.cxx:129
 TQpDataBase.cxx:130
 TQpDataBase.cxx:131
 TQpDataBase.cxx:132
 TQpDataBase.cxx:133
 TQpDataBase.cxx:134
 TQpDataBase.cxx:135
 TQpDataBase.cxx:136
 TQpDataBase.cxx:137
 TQpDataBase.cxx:138
 TQpDataBase.cxx:139
 TQpDataBase.cxx:140
 TQpDataBase.cxx:141
 TQpDataBase.cxx:142
 TQpDataBase.cxx:143
 TQpDataBase.cxx:144
 TQpDataBase.cxx:145
 TQpDataBase.cxx:146
 TQpDataBase.cxx:147
 TQpDataBase.cxx:148
 TQpDataBase.cxx:149
 TQpDataBase.cxx:150
 TQpDataBase.cxx:151
 TQpDataBase.cxx:152
 TQpDataBase.cxx:153
 TQpDataBase.cxx:154
 TQpDataBase.cxx:155
 TQpDataBase.cxx:156
 TQpDataBase.cxx:157
 TQpDataBase.cxx:158
 TQpDataBase.cxx:159
 TQpDataBase.cxx:160
 TQpDataBase.cxx:161
 TQpDataBase.cxx:162
 TQpDataBase.cxx:163
 TQpDataBase.cxx:164
 TQpDataBase.cxx:165
 TQpDataBase.cxx:166
 TQpDataBase.cxx:167
 TQpDataBase.cxx:168
 TQpDataBase.cxx:169
 TQpDataBase.cxx:170
 TQpDataBase.cxx:171
 TQpDataBase.cxx:172
 TQpDataBase.cxx:173
 TQpDataBase.cxx:174
 TQpDataBase.cxx:175
 TQpDataBase.cxx:176
 TQpDataBase.cxx:177
 TQpDataBase.cxx:178
 TQpDataBase.cxx:179
 TQpDataBase.cxx:180
 TQpDataBase.cxx:181
 TQpDataBase.cxx:182
 TQpDataBase.cxx:183
 TQpDataBase.cxx:184
 TQpDataBase.cxx:185
 TQpDataBase.cxx:186
 TQpDataBase.cxx:187
 TQpDataBase.cxx:188
 TQpDataBase.cxx:189
 TQpDataBase.cxx:190
 TQpDataBase.cxx:191
 TQpDataBase.cxx:192
 TQpDataBase.cxx:193
 TQpDataBase.cxx:194
 TQpDataBase.cxx:195
 TQpDataBase.cxx:196
 TQpDataBase.cxx:197
 TQpDataBase.cxx:198
 TQpDataBase.cxx:199
 TQpDataBase.cxx:200
 TQpDataBase.cxx:201
 TQpDataBase.cxx:202
 TQpDataBase.cxx:203
 TQpDataBase.cxx:204
 TQpDataBase.cxx:205
 TQpDataBase.cxx:206
 TQpDataBase.cxx:207
 TQpDataBase.cxx:208
 TQpDataBase.cxx:209
 TQpDataBase.cxx:210
 TQpDataBase.cxx:211
 TQpDataBase.cxx:212
 TQpDataBase.cxx:213
 TQpDataBase.cxx:214
 TQpDataBase.cxx:215
 TQpDataBase.cxx:216
 TQpDataBase.cxx:217
 TQpDataBase.cxx:218
 TQpDataBase.cxx:219
 TQpDataBase.cxx:220
 TQpDataBase.cxx:221
 TQpDataBase.cxx:222
 TQpDataBase.cxx:223
 TQpDataBase.cxx:224
 TQpDataBase.cxx:225
 TQpDataBase.cxx:226
 TQpDataBase.cxx:227
 TQpDataBase.cxx:228
 TQpDataBase.cxx:229