ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

/* $Id: AliRun.cxx 30859 2009-02-02 16:24:37Z fca $ */

#include <string.h>
#include "AliVectorSparse.h"
#include <TString.h>

/**********************************************************************************************/
/* Sparse vector class, used as row of the AliMatrixSparse class                              */
/*                                                                                            */ 
/* Author: ruben.shahoyan@cern.ch                                                             */
/*                                                                                            */ 
/**********************************************************************************************/

ClassImp(AliVectorSparse)

//___________________________________________________________
AliVectorSparse::AliVectorSparse()
  : fNElems(0),fIndex(0),fElems(0) {}

//___________________________________________________________
AliVectorSparse::AliVectorSparse(const AliVectorSparse& src)
  : TObject(src),fNElems(src.fNElems),fIndex(0),fElems(0)
{
  // copy c-tor
  fIndex = new UShort_t[fNElems];
  fElems = new Double_t[fNElems];
  memcpy(fIndex,src.fIndex,fNElems*sizeof(UShort_t));
  memcpy(fElems,src.fElems,fNElems*sizeof(Double_t));
}

//___________________________________________________________
void AliVectorSparse::Clear(Option_t*)
{
  // clear all
  delete[] fIndex; fIndex = 0;
  delete[] fElems; fElems = 0;
  fNElems = 0;
}

//___________________________________________________________
AliVectorSparse& AliVectorSparse::operator=(const AliVectorSparse& src)
{
  // assignment op-tor
  if (&src==this) return *this;
  Clear();
  TObject::operator=(src);
  fNElems = src.fNElems;
  fIndex = new UShort_t[fNElems];
  fElems = new Double_t[fNElems];
  memcpy(fIndex,src.fIndex,fNElems*sizeof(UShort_t));
  memcpy(fElems,src.fElems,fNElems*sizeof(Double_t));
  //
  return *this;
}

//___________________________________________________________
Double_t AliVectorSparse::FindIndex(Int_t ind) const
{
  // return an element with given index
  //printf("V: findindex\n");
  int first = 0;
  int last = fNElems-1;
  while (first<=last) {
    int mid = (first+last)>>1;
    if (ind>fIndex[mid]) first = mid+1;
    else if (ind<fIndex[mid]) last = mid-1;
    else return fElems[mid];
  }
  return 0.0;
}

//___________________________________________________________
void AliVectorSparse::SetToZero(Int_t ind)
{
  // set element to 0 if it was already defined
  int first = 0;
  int last = fNElems-1;
  while (first<=last) {
    int mid = (first+last)>>1;
    if (ind>fIndex[mid]) first = mid+1;
    else if (ind<fIndex[mid]) last = mid-1;
    else {fElems[mid] = 0.; return;}
  }
}

//___________________________________________________________
Double_t& AliVectorSparse::FindIndexAdd(Int_t ind)
{
  // increment an element with given index
  //printf("V: findindexAdd\n");
  int first = 0;
  int last = fNElems-1;
  while (first<=last) {
    int mid = (first+last)>>1;
    if (ind>fIndex[mid]) first = mid+1;
    else if (ind<fIndex[mid]) last = mid-1;
    else return fElems[mid];
  }
  // need to insert a new element
  UShort_t *arrI = new UShort_t[fNElems+1];
  memcpy(arrI,fIndex,first*sizeof(UShort_t));
  arrI[first] = ind;
  memcpy(arrI+first+1,fIndex+first,(fNElems-first)*sizeof(UShort_t));
  delete[] fIndex;
  fIndex = arrI;
  //
  Double_t   *arrE = new Double_t[fNElems+1];
  memcpy(arrE,fElems,first*sizeof(Double_t));
  arrE[first] = 0;
  memcpy(arrE+first+1,fElems+first,(fNElems-first)*sizeof(Double_t));
  delete[] fElems;
  fElems = arrE;
  //
  fNElems++;
  return fElems[first];
  //
}

//__________________________________________________________
void AliVectorSparse::ReSize(Int_t sz,Bool_t copy)
{
  // change the size
  if (sz<1) {Clear(); return;}
    // need to insert a new element
  UShort_t *arrI = new UShort_t[sz];
  Double_t *arrE = new Double_t[sz];
  memset(arrI,0,sz*sizeof(UShort_t));
  memset(arrE,0,sz*sizeof(Double_t));
  //
  if (copy && fIndex) {
    int cpsz = TMath::Min(fNElems,sz);
    memcpy(arrI,fIndex,cpsz*sizeof(UShort_t));
    memcpy(arrE,fElems,cpsz*sizeof(Double_t));
  }
  delete[] fIndex;
  delete[] fElems;
  fIndex = arrI;
  fElems = arrE;
  fNElems = sz;
  //
}

//__________________________________________________________
void AliVectorSparse::SortIndices(Bool_t valuesToo)
{
  // sort indices in increasing order. Used to fix the row after ILUk decomposition
  for (int i=fNElems;i--;) for (int j=i;j--;) if (fIndex[i]<fIndex[j]) { //swap
	UShort_t tmpI = fIndex[i]; fIndex[i] = fIndex[j]; fIndex[j]=tmpI;
	if (valuesToo) {Double_t tmpV = fElems[i];fElems[i]=fElems[j];fElems[j]=tmpV;}
      }
}

//__________________________________________________________
void AliVectorSparse::Print(Option_t* opt)  const
{
  // print itself
  TString sopt = opt; sopt.ToLower();
  int ndig = sopt.Atoi();
  if (ndig<=1) ndig = 2;
  sopt = "%2d:%+.";
  sopt += ndig;
  sopt += "e |";
  printf("|");
  for (int i=0;i<fNElems;i++) printf(sopt.Data(),fIndex[i],fElems[i]);
  printf("\n");
}

//___________________________________________________________
void AliVectorSparse::Add(Double_t *valc,Int_t *indc,Int_t n)
{
  // add indiced array to row. Indices must be in increasing order
  int indx;
  int nadd = 0;
  //
  int last = fNElems-1;
  int mid = 0;
  for (int i=n;i--;) {
    // if the element with this index is already defined, just add the value
    int first = 0;
    Bool_t toAdd = kTRUE;
    indx = indc[i];
    while (first<=last) {
      mid = (first+last)>>1;
      if (indx>fIndex[mid]) first = mid+1;
      else if (indx<fIndex[mid]) last = mid-1;
      else {
	fElems[mid] += valc[i];
	indc[i] = -1;
	toAdd = kFALSE;
	last = mid-1;   // profit from the indices being ordered
	break;
      }
    }
    if (toAdd) nadd++;
  }
  //
  if (nadd<1) return; // nothing to do anymore
  // 
  // need to expand the row
  UShort_t *arrI = new UShort_t[fNElems+nadd];
  Double_t *arrE = new Double_t[fNElems+nadd];
  // copy old elems embedding the new ones
  int inew=0,iold=0;
  for (int i=0;i<n;i++) {  
    if ( (indx=indc[i])<0) continue;
    while (iold<fNElems && fIndex[iold]<indx) {
      arrI[inew]   = fIndex[iold];
      arrE[inew++] = fElems[iold++];
    }
    arrI[inew] = indx;
    arrE[inew++] = valc[i];
  }
  // copy the rest
  while (iold<fNElems) {
    arrI[inew]   = fIndex[iold];
    arrE[inew++] = fElems[iold++];
  }
  //
  delete[] fIndex;
  delete[] fElems;
  fIndex = arrI;
  fElems = arrE;
  //
  fNElems += nadd;
  //
}

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