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