void KPCA::compPrimalAdd(const float* feature,size_t featureDim_,size_t firstEigen_,size_t eigenCount_) { if (featureDim == 0) compPrimalBegin(featureDim_,firstEigen_,eigenCount_); if (featureDim != featureDim_) retinThrowException2("Bad featureDim %d != %d",featureDim_,featureDim); if (firstEigen != firstEigen_) retinThrowException2("Bad firstEigen %d != %d",firstEigen_,firstEigen); if (eigenCount != eigenCount_) retinThrowException2("Bad eigenCount %d != %d",eigenCount_,eigenCount); if (featureCount > dim) retinThrowException1("Wrong number of features (%ld expected)",dim); vector_add_float(&primalMean[0],feature,featureDim_); for (size_t j=0;j<eigenCount;j++) { double eig = 1.0 / sqrt(eigens[firstEigen+j].getValue()); const double* eigv = eigens[firstEigen+j].getVector(); vector_addm_float(&primalVectors[j*featureDim],eigv[featureCount] * eig,feature,featureDim); } featureCount ++; }
size_t SparseVlatCluster::getVlat(float* buf,const std::string& format) const{ size_t featureDim = getTensorDim(1); size_t vlatDim = getTensorDim(mainOrder); vector<float> sparseVlat(vlatDim); vector<int> sparseMask; if (buf){ memcpy(&sparseVlat[0], &vlat[0], vlatDim*sizeof(float)); vector<pair<size_t, float> > sortTable; if(mainOrder == 1 || sparsityOn == SparseVlatCluster::sparsityOnDiag){ sortTable.reserve(featureDim); sparseMask.reserve(featureDim); for(size_t i = 0 ; i < featureDim ; i++){ sortTable[i].first = i; sortTable[i].second = varDual[i]; } sort(sortTable.begin(), sortTable.end(), myfunction); } else if(sparsityOn == SparseVlatCluster::sparsityOnFull){ sortTable.reserve(featureDim*featureDim); sparseMask.reserve(featureDim*featureDim); for(size_t i = 0 ; i < featureDim*featureDim ; i++){ sortTable[i].first = i; sortTable[i].second = varDual[i]; } sort(sortTable.begin(), sortTable.end(), myfunction); } if(sparsityStrategy == SparseVlatCluster::sparsityStrategyDim){ for(size_t i = 0 ; i < sparsityDim ; i++) sparseMask[sortTable[i].first] = 1; for(size_t i = sparsityDim ; i < sortTable.size() ; i++) sparseMask[sortTable[i].first] = 0; } else if(sparsityStrategy == SparseVlatCluster::sparsityStrategyEnergy){ float sumVar = 0; for(size_t i = 0 ; i < sortTable.size() ; i++) sumVar += varDual[i]; size_t i; float sum; for(i=0, sum = 0; i < sortTable.size() && sum<sumVar*sparsityEnergy ; i++){ sparseMask[sortTable[i].first] = 1; sum += sortTable[i].second; } for( ; i < sortTable.size() ; i++) sparseMask[sortTable[i].first] = 0; } } if (mainOrder == 1) { if (buf){ memcpy(&sparseVlat[0], &vlat[0], featureDim*sizeof(float)); for(size_t i = 0 ; i < featureDim; i++){ if(sparseMask[i] == 0){ sparseVlat[i] = 0.0f; } } memcpy(buf, &sparseVlat[0], featureDim*sizeof(float)); } return featureDim; } else if (mainOrder == 2) { if (buf){ if(sparsityOn == SparseVlatCluster::sparsityOnDiag){ memcpy(&sparseVlat[0], &vlat[0], vlatDim*sizeof(float)); for(size_t i = 0 ; i < featureDim; i++){ if(sparseMask[i] == 0){ for(size_t j = 0 ; j < featureDim ; j++){ sparseVlat[j+featureDim*i] = 0.0f; sparseVlat[i+featureDim*j] = 0.0f; } } } } else if(sparsityOn == SparseVlatCluster::sparsityOnFull){ memcpy(&sparseVlat[0], &vlat[0], vlatDim*sizeof(float)); for(size_t i = 0 ; i < vlatDim; i++){ if(sparseMask[i] == 0){ sparseVlat[i] = 0.0f; } } } for(size_t i = 0; i < featureDim ; i++) sparseVlat[i*featureDim + i] -= counter*L[i]; } if (format == "full") { if (buf) memcpy(buf,&sparseVlat[0],featureDim*featureDim*sizeof(float)); return featureDim*featureDim; } else if (format == "LD") { if (buf) { for (size_t i=0;i<featureDim;i++) { for (size_t j=i;j<featureDim;j++) *buf++ = sparseVlat[i+j*featureDim]; } } return (featureDim*(featureDim+1))/2; } else if (format == "L") { if (buf) { for (size_t i=0;i<featureDim;i++) { for (size_t j=i+1;j<featureDim;j++) *buf++ = sparseVlat[i+j*featureDim]; } } return (featureDim*(featureDim-1))/2; } else { retinThrowException1("Unsupported format %s", format.c_str()); } } else { retinThrowException1("Unsupported order %d", mainOrder); } }
PackedVlatBuilder::PackedVlatBuilder(size_t order,size_t dictSize,size_t featureDim) : VlatBuilder<PackedVlatCluster>(order,dictSize,featureDim) { if (order != 2) retinThrowException1("Invalid order %d for PackedVlat",order); }