1e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/* 2e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Copyright (C) 2011 The Android Open Source Project 3e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * 4e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Licensed under the Apache License, Version 2.0 (the "License"); 5e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * you may not use this file except in compliance with the License. 6e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * You may obtain a copy of the License at 7e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * 8e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * http://www.apache.org/licenses/LICENSE-2.0 9e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * 10e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Unless required by applicable law or agreed to in writing, software 11e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * distributed under the License is distributed on an "AS IS" BASIS, 12e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * See the License for the specific language governing permissions and 14e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * limitations under the License. 15e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */ 16e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 17e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/* $Id: db_utilities_indexing.h,v 1.3 2011/06/17 14:03:31 mbansal Exp $ */ 18e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 19e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#ifndef DB_UTILITIES_INDEXING 20e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#define DB_UTILITIES_INDEXING 21e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 22e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 23e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 24e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/***************************************************************** 25e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen* Lean and mean begins here * 26e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen*****************************************************************/ 27e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 28e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#include "db_utilities.h" 29e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 30e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*! 31e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \defgroup LMIndexing (LM) Indexing Utilities (Order Statistics, Matrix Operations) 32e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */ 33e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*\{*/ 34e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 35e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline void db_SetupMatrixRefs(double **ar,long rows,long cols,double *a) 36e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{ 37e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen long i; 38e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen for(i=0;i<rows;i++) ar[i]=&a[i*cols]; 39e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen} 40e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 41e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline void db_SymmetricExtendUpperToLower(double **A,int rows,int cols) 42e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{ 43e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int i,j; 44e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen for(i=1;i<rows;i++) for(j=0;j<i;j++) A[i][j]=A[j][i]; 45e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen} 46e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 47e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenvoid inline db_MultiplyMatrixVectorAtb(double *c,const double * const *At,const double *b,int arows,int acols) 48e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{ 49e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int i,j; 50e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen double acc; 51e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 52e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen for(i=0;i<arows;i++) 53e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen { 54e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen acc=0; 55e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen for(j=0;j<acols;j++) acc+=At[j][i]*b[j]; 56e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen c[i]=acc; 57e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen } 58e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen} 59e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 60e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline void db_MultiplyMatricesAB(double **C,const double * const *A,const double * const *B,int arows,int acols,int bcols) 61e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{ 62e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int i,j,k; 63e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen double acc; 64e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 65e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen for(i=0;i<arows;i++) for(j=0;j<bcols;j++) 66e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen { 67e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen acc=0; 68e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen for(k=0;k<acols;k++) acc+=A[i][k]*B[k][j]; 69e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen C[i][j]=acc; 70e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen } 71e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen} 72e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 73e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline void db_UpperMultiplyMatricesAtB(double **Cu,const double * const *At,const double * const *B,int arows,int acols,int bcols) 74e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{ 75e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int i,j,k; 76e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen double acc; 77e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 78e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen for(i=0;i<arows;i++) for(j=i;j<bcols;j++) 79e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen { 80e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen acc=0; 81e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen for(k=0;k<acols;k++) acc+=At[k][i]*B[k][j]; 82e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen Cu[i][j]=acc; 83e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen } 84e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen} 85e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 86e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta ChenDB_API void db_Zero(double *d,long nr); 87e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 88e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline int db_MaxIndex2(double s[2]) 89e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{ 90e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if(s[0]>=s[1]) return(0); 91e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen return(1); 92e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen} 93e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 94e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline int db_MaxIndex3(const double s[3]) 95e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{ 96e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen double best; 97e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int pos; 98e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 99e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen best=s[0];pos=0; 100e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if(s[1]>best){best=s[1];pos=1;} 101e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if(s[2]>best){best=s[2];pos=2;} 102e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen return(pos); 103e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen} 104e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 105e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline int db_MaxIndex4(const double s[4]) 106e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{ 107e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen double best; 108e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int pos; 109e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 110e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen best=s[0];pos=0; 111e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if(s[1]>best){best=s[1];pos=1;} 112e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if(s[2]>best){best=s[2];pos=2;} 113e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if(s[3]>best){best=s[3];pos=3;} 114e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen return(pos); 115e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen} 116e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 117e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline int db_MaxIndex5(const double s[5]) 118e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{ 119e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen double best; 120e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int pos; 121e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 122e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen best=s[0];pos=0; 123e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if(s[1]>best){best=s[1];pos=1;} 124e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if(s[2]>best){best=s[2];pos=2;} 125e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if(s[3]>best){best=s[3];pos=3;} 126e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if(s[4]>best){best=s[4];pos=4;} 127e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen return(pos); 128e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen} 129e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 130e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline int db_MaxIndex6(const double s[6]) 131e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{ 132e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen double best; 133e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int pos; 134e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 135e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen best=s[0];pos=0; 136e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if(s[1]>best){best=s[1];pos=1;} 137e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if(s[2]>best){best=s[2];pos=2;} 138e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if(s[3]>best){best=s[3];pos=3;} 139e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if(s[4]>best){best=s[4];pos=4;} 140e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if(s[5]>best){best=s[5];pos=5;} 141e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen return(pos); 142e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen} 143e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 144e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline int db_MaxIndex7(const double s[7]) 145e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{ 146e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen double best; 147e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int pos; 148e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 149e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen best=s[0];pos=0; 150e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if(s[1]>best){best=s[1];pos=1;} 151e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if(s[2]>best){best=s[2];pos=2;} 152e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if(s[3]>best){best=s[3];pos=3;} 153e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if(s[4]>best){best=s[4];pos=4;} 154e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if(s[5]>best){best=s[5];pos=5;} 155e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if(s[6]>best){best=s[6];pos=6;} 156e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen return(pos); 157e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen} 158e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 159e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline int db_MinIndex7(const double s[7]) 160e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{ 161e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen double best; 162e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int pos; 163e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 164e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen best=s[0];pos=0; 165e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if(s[1]<best){best=s[1];pos=1;} 166e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if(s[2]<best){best=s[2];pos=2;} 167e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if(s[3]<best){best=s[3];pos=3;} 168e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if(s[4]<best){best=s[4];pos=4;} 169e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if(s[5]<best){best=s[5];pos=5;} 170e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if(s[6]<best){best=s[6];pos=6;} 171e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen return(pos); 172e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen} 173e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 174e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline int db_MinIndex9(const double s[9]) 175e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{ 176e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen double best; 177e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int pos; 178e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 179e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen best=s[0];pos=0; 180e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if(s[1]<best){best=s[1];pos=1;} 181e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if(s[2]<best){best=s[2];pos=2;} 182e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if(s[3]<best){best=s[3];pos=3;} 183e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if(s[4]<best){best=s[4];pos=4;} 184e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if(s[5]<best){best=s[5];pos=5;} 185e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if(s[6]<best){best=s[6];pos=6;} 186e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if(s[7]<best){best=s[7];pos=7;} 187e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if(s[8]<best){best=s[8];pos=8;} 188e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen return(pos); 189e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen} 190e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 191e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline int db_MaxAbsIndex3(const double *s) 192e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{ 193e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen double t,best; 194e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int pos; 195e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 196e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen best=fabs(s[0]);pos=0; 197e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen t=fabs(s[1]);if(t>best){best=t;pos=1;} 198e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen t=fabs(s[2]);if(t>best){pos=2;} 199e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen return(pos); 200e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen} 201e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 202e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline int db_MaxAbsIndex9(const double *s) 203e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{ 204e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen double t,best; 205e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int pos; 206e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 207e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen best=fabs(s[0]);pos=0; 208e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen t=fabs(s[1]);if(t>best){best=t;pos=1;} 209e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen t=fabs(s[2]);if(t>best){best=t;pos=2;} 210e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen t=fabs(s[3]);if(t>best){best=t;pos=3;} 211e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen t=fabs(s[4]);if(t>best){best=t;pos=4;} 212e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen t=fabs(s[5]);if(t>best){best=t;pos=5;} 213e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen t=fabs(s[6]);if(t>best){best=t;pos=6;} 214e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen t=fabs(s[7]);if(t>best){best=t;pos=7;} 215e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen t=fabs(s[8]);if(t>best){best=t;pos=8;} 216e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen return(pos); 217e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen} 218e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 219e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 220e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*! 221e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta ChenSelect ordinal pos (zero based) out of nr_elements in s. 222e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chentemp should point to alloced memory of at least nr_elements*2 223e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta ChenOptimized runtimes on 450MHz: 224e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen\code 225e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 30 with 3 microsecs 226e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 100 with 11 microsecs 227e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 300 with 30 microsecs 228e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 500 with 40 microsecs 229e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen1000 with 100 microsecs 230e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen5000 with 540 microsecs 231e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen\endcode 232e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenso the expected runtime is around 233e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen(nr_elements/10) microseconds 234e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta ChenThe total quickselect cost of splitting 500 hypotheses recursively 235e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenis thus around 100 microseconds 236e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 237e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta ChenDoes the same operation as std::nth_element(). 238e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen*/ 239e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta ChenDB_API double db_LeanQuickSelect(const double *s,long nr_elements,long pos,double *temp); 240e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 241e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*! 242e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen Median of 3 doubles 243e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */ 244e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Cheninline double db_TripleMedian(double a,double b,double c) 245e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{ 246e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if(a>b) 247e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen { 248e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if(c>a) return(a); 249e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen else if(c>b) return(c); 250e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen else return(b); 251e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen } 252e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen else 253e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen { 254e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen if(c>b) return(b); 255e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen else if(c>a) return(c); 256e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen else return(a); 257e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen } 258e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen} 259e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 260e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*! 261e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta ChenAlign float pointer to nr_bytes by moving forward 262e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen*/ 263e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta ChenDB_API float* db_AlignPointer_f(float *p,unsigned long nr_bytes); 264e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 265e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*! 266e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta ChenAlign short pointer to nr_bytes by moving forward 267e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen*/ 268e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta ChenDB_API short* db_AlignPointer_s(short *p,unsigned long nr_bytes); 269e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 270e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#endif /* DB_UTILITIES_INDEXING */ 271