Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Kernel PCA: C++ Algorithm Implementation #5987

Open
wants to merge 3 commits into
base: branch-24.10
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions cpp/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -469,6 +469,12 @@ if(BUILD_CUML_CPP_LIBRARY)
src/pca/pca.cu)
endif()

if(all_algo OR kpca_algo)
target_sources(${CUML_CPP_TARGET}
PRIVATE
src/kpca/kpca.cu)
endif()

if(all_algo OR randomforest_algo)
target_sources(${CUML_CPP_TARGET}
PRIVATE
Expand Down
3 changes: 2 additions & 1 deletion cpp/cmake/modules/ConfigureAlgorithms.cmake
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#=============================================================================
# Copyright (c) 2022-2023, NVIDIA CORPORATION.
# Copyright (c) 2022-2024, NVIDIA CORPORATION.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -52,6 +52,7 @@ else()
if(decomposition_algo)
set(pca_algo ON)
set(tsvd_algo ON)
set(kpca_algo ON)
endif()

if(ensemble_algo)
Expand Down
69 changes: 69 additions & 0 deletions cpp/include/cuml/decomposition/kpca.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
/*
* Copyright (c) 2024, NVIDIA CORPORATION.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

#pragma once

#include "params.hpp"

namespace raft {
class handle_t;
}

namespace ML {

void kpcaFit(raft::handle_t& handle,
float* input,
float* eigenvectors,
float* eigenvalues,
int* n_components,
const paramsKPCA& prms);

void kpcaFit(raft::handle_t& handle,
double* input,
double* eigenvectors,
double* eigenvalues,
int* n_components,
const paramsKPCA& prms);

void kpcaTransformWithFitData(raft::handle_t& handle,
float* eigenvectors,
float* eigenvalues,
float* trans_input,
const paramsKPCA& prms);

void kpcaTransformWithFitData(raft::handle_t& handle,
double* eigenvectors,
double* eigenvalues,
double* trans_input,
const paramsKPCA& prms);

void kpcaTransform(const raft::handle_t& handle,
float* fit_input,
float* input,
float* eigenvectors,
float* eigenvalues,
float* trans_input,
const paramsKPCA& prms);

void kpcaTransform(const raft::handle_t& handle,
double* fit_input,
double* input,
double* eigenvectors,
double* eigenvalues,
double* trans_input,
const paramsKPCA& prms);

}; // end namespace ML
14 changes: 13 additions & 1 deletion cpp/include/cuml/decomposition/params.hpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2018-2022, NVIDIA CORPORATION.
* Copyright (c) 2018-2024, NVIDIA CORPORATION.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand All @@ -15,6 +15,7 @@
*/

#pragma once
#include <cuml/matrix/kernelparams.h>

#include <cstdint>

Expand Down Expand Up @@ -78,8 +79,19 @@ class paramsPCATemplate : public paramsTSVDTemplate<enum_solver> {
bool whiten = false;
};

template <typename enum_solver = solver>
class paramsKPCATemplate : public paramsTSVDTemplate<enum_solver> {
public:
MLCommon::Matrix::KernelParams kernel;
size_t n_training_samples = 0;
bool copy = true; // TODO unused
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Left these TODO's in here for future compatability and since paramsPCATemplate does the same for copy.

bool remove_zero_eig = false;
bool fit_inverse_transform = false; // TODO unused
};

typedef paramsTSVDTemplate<> paramsTSVD;
typedef paramsPCATemplate<> paramsPCA;
typedef paramsKPCATemplate<> paramsKPCA;

enum class mg_solver { COV_EIG_DQ, COV_EIG_JACOBI, QR };

Expand Down
86 changes: 86 additions & 0 deletions cpp/src/kpca/kpca.cu
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
/*
* Copyright (c) 2024, NVIDIA CORPORATION.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

#include "kpca.cuh"

#include <cuml/decomposition/kpca.hpp>
namespace ML {

void kpcaFit(raft::handle_t& handle,
float* input,
float* eigenvectors,
float* eigenvalues,
int* n_components,
const ML::paramsKPCA& prms)
{
kpcaFit(handle, input, eigenvectors, eigenvalues, n_components, prms, handle.get_stream());
}

void kpcaFit(raft::handle_t& handle,
double* input,
double* eigenvectors,
double* eigenvalues,
int* n_components,
const ML::paramsKPCA& prms)
{
kpcaFit(handle, input, eigenvectors, eigenvalues, n_components, prms, handle.get_stream());
}

void kpcaTransformWithFitData(raft::handle_t& handle,
float* eigenvectors,
float* eigenvalues,
float* trans_input,
const ML::paramsKPCA& prms)
{
kpcaTransformWithFitData(
handle, eigenvectors, eigenvalues, trans_input, prms, handle.get_stream());
}

void kpcaTransformWithFitData(raft::handle_t& handle,
double* eigenvectors,
double* eigenvalues,
double* trans_input,
const paramsKPCA& prms)
{
kpcaTransformWithFitData(
handle, eigenvectors, eigenvalues, trans_input, prms, handle.get_stream());
}

void kpcaTransform(const raft::handle_t& handle,
float* fit_input,
float* input,
float* eigenvectors,
float* eigenvalues,
float* trans_input,
const ML::paramsKPCA& prms)
{
kpcaTransform(
handle, fit_input, input, eigenvectors, eigenvalues, trans_input, prms, handle.get_stream());
}

void kpcaTransform(const raft::handle_t& handle,
double* fit_input,
double* input,
double* eigenvectors,
double* eigenvalues,
double* trans_input,
const ML::paramsKPCA& prms)
{
kpcaTransform(
handle, fit_input, input, eigenvectors, eigenvalues, trans_input, prms, handle.get_stream());
}

} // namespace ML
Loading
Loading