2020-07-31 11:31:32 +08:00
|
|
|
//===============================================================================
|
|
|
|
// Copyright (c) 2007-2016 Advanced Micro Devices, Inc. All rights reserved.
|
|
|
|
// Copyright (c) 2004-2006 ATI Technologies Inc.
|
|
|
|
//===============================================================================
|
|
|
|
//
|
|
|
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
|
|
// of this software and associated documentation files(the "Software"), to deal
|
|
|
|
// in the Software without restriction, including without limitation the rights
|
|
|
|
// to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
|
|
|
|
// copies of the Software, and to permit persons to whom the Software is
|
|
|
|
// furnished to do so, subject to the following conditions :
|
2021-09-08 10:54:22 +08:00
|
|
|
//
|
2020-07-31 11:31:32 +08:00
|
|
|
// The above copyright notice and this permission notice shall be included in
|
|
|
|
// all copies or substantial portions of the Software.
|
2021-09-08 10:54:22 +08:00
|
|
|
//
|
2020-07-31 11:31:32 +08:00
|
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
|
|
|
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
|
|
// THE SOFTWARE.
|
|
|
|
|
|
|
|
#ifndef _3DQUANT_H_INCLUDED
|
|
|
|
|
|
|
|
#define _3DQUANT_H_INCLUDED
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
double d;
|
|
|
|
int i;
|
|
|
|
} a;
|
|
|
|
|
|
|
|
void sortProjection(double projection[MAX_ENTRIES], int order[MAX_ENTRIES], int numEntries);
|
2021-09-08 10:54:22 +08:00
|
|
|
void covariance(double data[][DIMENSION], int numEntries, double cov[DIMENSION][DIMENSION]);
|
2020-07-31 11:31:32 +08:00
|
|
|
void centerInPlace(double data[][DIMENSION], int numEntries, double mean[DIMENSION]);
|
|
|
|
void project(double data[][DIMENSION], int numEntries, double vector[DIMENSION], double projection[MAX_ENTRIES]);
|
|
|
|
void sortProjection(double projection[MAX_ENTRIES], int order[MAX_ENTRIES], int numEntries);
|
|
|
|
void eigenVector(double cov[DIMENSION][DIMENSION], double vector[DIMENSION]);
|
|
|
|
double partition2 (double data[][DIMENSION], int numEntries,int index[]);
|
|
|
|
|
|
|
|
double optQuantEven(
|
2021-09-08 10:54:22 +08:00
|
|
|
double data[MAX_ENTRIES][DIMENSION],
|
2020-07-31 11:31:32 +08:00
|
|
|
int numEntries, int numClusters, int index[MAX_ENTRIES],
|
|
|
|
double out[MAX_ENTRIES][DIMENSION],
|
|
|
|
double direction [DIMENSION],double *step
|
2021-09-08 10:54:22 +08:00
|
|
|
) ;
|
|
|
|
|
2020-07-31 11:31:32 +08:00
|
|
|
double totalError(double data[MAX_ENTRIES][DIMENSION],double data2[MAX_ENTRIES][DIMENSION],int numEntries);
|
|
|
|
double totalError_d(double data[MAX_ENTRIES][MAX_DIMENSION_BIG],double data2[MAX_ENTRIES][MAX_DIMENSION_BIG],int numEntries, int dimension);
|
|
|
|
|
|
|
|
/****************************************************/
|
|
|
|
/****************************************************/
|
|
|
|
//
|
2021-09-08 10:54:22 +08:00
|
|
|
// Trace dirven continious quntizer
|
2020-07-31 11:31:32 +08:00
|
|
|
// traceBuilder/ allTrace builder should be called once first to initilize static trace (file static)
|
|
|
|
//
|
|
|
|
// returns resulting error
|
|
|
|
//
|
|
|
|
double optQuantTrace(
|
2021-09-08 10:54:22 +08:00
|
|
|
double data[MAX_ENTRIES][DIMENSION], // input data
|
|
|
|
int numEntries, // number of input points above (not clear about 1, better to avoid)
|
|
|
|
int numClusters, // number of clusters on the ramp, max 8 (not clear about 1, better to avoid)
|
2020-07-31 11:31:32 +08:00
|
|
|
int index[MAX_ENTRIES], // output index, if not all points of the ramp used, 0 may not be assigned
|
|
|
|
double out[MAX_ENTRIES][DIMENSION], // resulting quantization
|
2021-09-08 10:54:22 +08:00
|
|
|
double direction [DIMENSION], // direction vector of the ramp (check normalization)
|
|
|
|
double *step // step size (check normalization)
|
|
|
|
);
|
2020-07-31 11:31:32 +08:00
|
|
|
|
|
|
|
double optQuantTrace_d(
|
2021-09-08 10:54:22 +08:00
|
|
|
double data[MAX_ENTRIES][MAX_DIMENSION_BIG], // input data
|
|
|
|
int numEntries, // number of input points above (not clear about 1, better to avoid)
|
|
|
|
int numClusters, // number of clusters on the ramp, max 8 (not clear about 1, better to avoid)
|
2020-07-31 11:31:32 +08:00
|
|
|
int index[MAX_ENTRIES], // output index, if not all points of the ramp used, 0 may not be assigned
|
|
|
|
double out[MAX_ENTRIES][MAX_DIMENSION_BIG], // resulting quantization
|
2021-09-08 10:54:22 +08:00
|
|
|
double direction [MAX_DIMENSION_BIG], // direction vector of the ramp (check normalization)
|
|
|
|
double *step, // step size (check normalization)
|
2020-07-31 11:31:32 +08:00
|
|
|
int dimension);
|
|
|
|
|
|
|
|
/****************************************************/
|
|
|
|
/****************************************************/
|
|
|
|
/****************************************************/
|
|
|
|
|
|
|
|
//
|
2021-09-08 10:54:22 +08:00
|
|
|
// ping-pong style KATC type (but for RGB x 2) trace (with fallback to quantAnD (?) driven "continius" quantizer
|
2020-07-31 11:31:32 +08:00
|
|
|
//
|
|
|
|
double optQuant2Trace(
|
2021-09-08 10:54:22 +08:00
|
|
|
double data[MAX_ENTRIES][DIMENSION],
|
2020-07-31 11:31:32 +08:00
|
|
|
int numEntries, int numClusters, int index_[MAX_ENTRIES],
|
|
|
|
double out_[MAX_ENTRIES][DIMENSION],
|
|
|
|
double direction [DIMENSION],double *step
|
2021-09-08 10:54:22 +08:00
|
|
|
);
|
2020-07-31 11:31:32 +08:00
|
|
|
|
|
|
|
void printStep (void);
|
|
|
|
|
|
|
|
/********************************************/
|
|
|
|
// continious quantizer for 16 clusters, could use bette testing
|
|
|
|
double optQuantAnD(
|
|
|
|
double data[MAX_ENTRIES][DIMENSION], // 0-255
|
|
|
|
int numEntries, int numClusters, int index[MAX_ENTRIES],
|
|
|
|
double out[MAX_ENTRIES][DIMENSION],
|
|
|
|
double direction [DIMENSION],double *step
|
2021-09-08 10:54:22 +08:00
|
|
|
);
|
2020-07-31 11:31:32 +08:00
|
|
|
|
|
|
|
|
|
|
|
double optQuantAnD_d(
|
|
|
|
double data[MAX_ENTRIES][MAX_DIMENSION_BIG], // 0-255
|
|
|
|
int numEntries, int numClusters, int index[MAX_ENTRIES],
|
|
|
|
double out[MAX_ENTRIES][MAX_DIMENSION_BIG],
|
|
|
|
double direction [MAX_DIMENSION_BIG],double *step,
|
|
|
|
int dimension
|
2021-09-08 10:54:22 +08:00
|
|
|
);
|
2020-07-31 11:31:32 +08:00
|
|
|
|
|
|
|
/********************************************/
|
|
|
|
|
|
|
|
|
|
|
|
double superQuantAnD(
|
2021-09-08 10:54:22 +08:00
|
|
|
double data[MAX_ENTRIES][DIMENSION],
|
2020-07-31 11:31:32 +08:00
|
|
|
int numEntries, int numClusters, int index[MAX_ENTRIES],
|
|
|
|
double out[MAX_ENTRIES][DIMENSION],
|
|
|
|
double direction [DIMENSION],double *step
|
2021-09-08 10:54:22 +08:00
|
|
|
);
|
2020-07-31 11:31:32 +08:00
|
|
|
|
|
|
|
int reconstructGetDirConstr (
|
2021-09-08 10:54:22 +08:00
|
|
|
double data[MAX_ENTRIES][DIMENSION],
|
|
|
|
double mean[DIMENSION],
|
|
|
|
int numEntries,
|
2020-07-31 11:31:32 +08:00
|
|
|
int numClusters,
|
|
|
|
int index[MAX_ENTRIES],
|
|
|
|
double direction [DIMENSION],
|
|
|
|
double *step,
|
|
|
|
double *idxmean,
|
|
|
|
int clump
|
2021-09-08 10:54:22 +08:00
|
|
|
);
|
2020-07-31 11:31:32 +08:00
|
|
|
|
|
|
|
// New
|
|
|
|
void Quant_Init();
|
|
|
|
void Quant_DeInit();
|
|
|
|
|
2021-09-08 10:54:22 +08:00
|
|
|
// Externs
|
|
|
|
extern void init_ramps(void);
|
|
|
|
|
2020-07-31 11:31:32 +08:00
|
|
|
#endif
|
|
|
|
|
2021-09-08 10:54:22 +08:00
|
|
|
|
2020-07-31 11:31:32 +08:00
|
|
|
|