diff --git a/cpp/oneapi/dal/algo/linear_regression/test/spmd.cpp b/cpp/oneapi/dal/algo/linear_regression/test/spmd.cpp index f220de2e19e..51262cca9db 100644 --- a/cpp/oneapi/dal/algo/linear_regression/test/spmd.cpp +++ b/cpp/oneapi/dal/algo/linear_regression/test/spmd.cpp @@ -27,4 +27,13 @@ TEMPLATE_LIST_TEST_M(lr_spmd_test, "LR common flow", "[lr][spmd]", lr_types) { this->run_and_check_linear(); } +TEMPLATE_LIST_TEST_M(lr_spmd_test, "RR common flow", "[rr][spmd]", lr_types) { + SKIP_IF(this->not_float64_friendly()); + + this->generate(777); + this->set_rank_count(GENERATE(2, 3)); + + this->run_and_check_ridge(); +} + } // namespace oneapi::dal::linear_regression::test diff --git a/samples/oneapi/cpp/ccl/sources/ridge_regression_distr_ccl.cpp b/samples/oneapi/cpp/ccl/sources/ridge_regression_distr_ccl.cpp new file mode 100644 index 00000000000..f950c2caf15 --- /dev/null +++ b/samples/oneapi/cpp/ccl/sources/ridge_regression_distr_ccl.cpp @@ -0,0 +1,82 @@ +/******************************************************************************* +* Copyright contributors to the oneDAL project +* +* 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 +#include + +#include "oneapi/dal/algo/linear_regression.hpp" +#include "oneapi/dal/io/csv.hpp" +#include "oneapi/dal/spmd/ccl/communicator.hpp" + +#include "utils.hpp" + +namespace dal = oneapi::dal; +namespace lr = dal::linear_regression; + +void run() { + const auto train_data_file_name = get_data_path("data/linear_regression_train_data.csv"); + const auto train_response_file_name = + get_data_path("data/linear_regression_train_responses.csv"); + const auto test_data_file_name = get_data_path("data/linear_regression_test_data.csv"); + const auto test_response_file_name = get_data_path("data/linear_regression_test_responses.csv"); + + const auto x_train = dal::read(dal::csv::data_source{ train_data_file_name }); + const auto y_train = dal::read(dal::csv::data_source{ train_response_file_name }); + const auto x_test = dal::read(dal::csv::data_source{ test_data_file_name }); + const auto y_test = dal::read(dal::csv::data_source{ test_response_file_name }); + + auto comm = dal::preview::spmd::make_communicator(); + auto rank_id = comm.get_rank(); + auto rank_count = comm.get_rank_count(); + + auto x_train_vec = split_table_by_rows(x_train, rank_count); + auto y_train_vec = split_table_by_rows(y_train, rank_count); + auto x_test_vec = split_table_by_rows(x_test, rank_count); + auto y_test_vec = split_table_by_rows(y_test, rank_count); + + const double alpha = 1.0; + const auto rr_desc = lr::descriptor{ true, alpha }; + + const auto result_train = + dal::preview::train(comm, rr_desc, x_train_vec.at(rank_id), y_train_vec.at(rank_id)); + + const auto result_infer = + dal::preview::infer(comm, rr_desc, x_test_vec.at(rank_id), result_train.get_model()); + + if (comm.get_rank() == 0) { + std::cout << "Ridge regression alpha: " << alpha << std::endl; + + std::cout << "Prediction results:\n" << result_infer.get_responses() << std::endl; + + std::cout << "Ground truth:\n" << y_test_vec.at(rank_id) << std::endl; + } +} + +int main(int argc, char const *argv[]) { + ccl::init(); + int status = MPI_Init(nullptr, nullptr); + if (status != MPI_SUCCESS) { + throw std::runtime_error{ "Problem occurred during MPI init" }; + } + + run(); + + status = MPI_Finalize(); + if (status != MPI_SUCCESS) { + throw std::runtime_error{ "Problem occurred during MPI finalize" }; + } + return 0; +} diff --git a/samples/oneapi/cpp/mpi/sources/ridge_regression_distr_mpi.cpp b/samples/oneapi/cpp/mpi/sources/ridge_regression_distr_mpi.cpp new file mode 100644 index 00000000000..9a1bb95031f --- /dev/null +++ b/samples/oneapi/cpp/mpi/sources/ridge_regression_distr_mpi.cpp @@ -0,0 +1,81 @@ +/******************************************************************************* +* Copyright contributors to the oneDAL project +* +* 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 +#include + +#include "oneapi/dal/algo/linear_regression.hpp" +#include "oneapi/dal/io/csv.hpp" +#include "oneapi/dal/spmd/mpi/communicator.hpp" + +#include "utils.hpp" + +namespace dal = oneapi::dal; +namespace lr = dal::linear_regression; + +void run() { + const auto train_data_file_name = get_data_path("data/linear_regression_train_data.csv"); + const auto train_response_file_name = + get_data_path("data/linear_regression_train_responses.csv"); + const auto test_data_file_name = get_data_path("data/linear_regression_test_data.csv"); + const auto test_response_file_name = get_data_path("data/linear_regression_test_responses.csv"); + + const auto x_train = dal::read(dal::csv::data_source{ train_data_file_name }); + const auto y_train = dal::read(dal::csv::data_source{ train_response_file_name }); + const auto x_test = dal::read(dal::csv::data_source{ test_data_file_name }); + const auto y_test = dal::read(dal::csv::data_source{ test_response_file_name }); + + auto comm = dal::preview::spmd::make_communicator(); + auto rank_id = comm.get_rank(); + auto rank_count = comm.get_rank_count(); + + auto x_train_vec = split_table_by_rows(x_train, rank_count); + auto y_train_vec = split_table_by_rows(y_train, rank_count); + auto x_test_vec = split_table_by_rows(x_test, rank_count); + auto y_test_vec = split_table_by_rows(y_test, rank_count); + + const double alpha = 1.0; + const auto rr_desc = lr::descriptor{ true, alpha }; + + const auto result_train = + dal::preview::train(comm, rr_desc, x_train_vec.at(rank_id), y_train_vec.at(rank_id)); + + const auto result_infer = + dal::preview::infer(comm, rr_desc, x_test_vec.at(rank_id), result_train.get_model()); + + if (comm.get_rank() == 0) { + std::cout << "Ridge regression alpha: " << alpha << std::endl; + + std::cout << "Prediction results:\n" << result_infer.get_responses() << std::endl; + + std::cout << "Ground truth:\n" << y_test_vec.at(rank_id) << std::endl; + } +} + +int main(int argc, char const *argv[]) { + int status = MPI_Init(nullptr, nullptr); + if (status != MPI_SUCCESS) { + throw std::runtime_error{ "Problem occurred during MPI init" }; + } + + run(); + + status = MPI_Finalize(); + if (status != MPI_SUCCESS) { + throw std::runtime_error{ "Problem occurred during MPI finalize" }; + } + return 0; +}