Skylark (Sketching Library)
0.1
|
00001 #ifndef SKYLARK_DENSE_TRANSFORM_ELEMENTAL_MC_MR_STAR_STAR_HPP 00002 #define SKYLARK_DENSE_TRANSFORM_ELEMENTAL_MC_MR_STAR_STAR_HPP 00003 00004 #include "../base/base.hpp" 00005 00006 #include "transforms.hpp" 00007 #include "dense_transform_data.hpp" 00008 #include "../utility/comm.hpp" 00009 #include "../utility/get_communicator.hpp" 00010 00011 #include "sketch_params.hpp" 00012 #include "dense_transform_Elemental_mc_mr.hpp" 00013 00014 namespace skylark { namespace sketch { 00018 template <typename ValueType, 00019 template <typename> class ValueDistribution> 00020 struct dense_transform_t < 00021 elem::DistMatrix<ValueType>, 00022 elem::DistMatrix<ValueType, elem::STAR, elem::STAR>, 00023 ValueDistribution> : 00024 public dense_transform_data_t<ValueDistribution> { 00025 00026 // Typedef matrix and distribution types so that we can use them regularly 00027 typedef ValueType value_type; 00028 typedef elem::DistMatrix<value_type> matrix_type; 00029 typedef elem::DistMatrix<value_type, elem::STAR, elem::STAR> 00030 output_matrix_type; 00031 typedef ValueDistribution<value_type> value_distribution_type; 00032 typedef dense_transform_data_t<ValueDistribution> data_type; 00033 00034 00038 dense_transform_t (int N, int S, double scale, base::context_t& context) 00039 : data_type (N, S, scale, context) { 00040 00041 } 00042 00046 dense_transform_t (dense_transform_t<matrix_type, 00047 output_matrix_type, 00048 ValueDistribution>& other) 00049 : data_type(other) {} 00050 00054 dense_transform_t(const dense_transform_data_t<ValueDistribution>& other_data) 00055 : data_type(other_data) {} 00056 00060 template <typename Dimension> 00061 void apply (const matrix_type& A, 00062 output_matrix_type& sketch_of_A, 00063 Dimension dimension) const { 00064 try { 00065 apply_impl_dist(A, sketch_of_A, dimension); 00066 } catch (std::logic_error e) { 00067 SKYLARK_THROW_EXCEPTION ( 00068 base::elemental_exception() 00069 << base::error_msg(e.what()) ); 00070 } catch(boost::mpi::exception e) { 00071 SKYLARK_THROW_EXCEPTION ( 00072 base::mpi_exception() 00073 << base::error_msg(e.what()) ); 00074 } 00075 } 00076 00077 int get_N() const { return this->_N; } 00078 int get_S() const { return this->_S; } 00080 const sketch_transform_data_t* get_data() const { return this; } 00081 00082 private: 00083 00084 00089 void apply_impl_dist(const matrix_type& A, 00090 output_matrix_type& sketch_of_A, 00091 skylark::sketch::rowwise_tag tag) const { 00092 00093 00094 matrix_type sketch_of_A_MC_MR(A.Height(), 00095 data_type::_S); 00096 00097 dense_transform_t<matrix_type, matrix_type, ValueDistribution> 00098 transform(*this); 00099 00100 transform.apply(A, sketch_of_A_MC_MR, tag); 00101 00102 sketch_of_A = sketch_of_A_MC_MR; 00103 } 00104 00105 00106 void apply_impl_dist(const matrix_type& A, 00107 output_matrix_type& sketch_of_A, 00108 skylark::sketch::columnwise_tag tag) const { 00109 00110 00111 matrix_type sketch_of_A_MC_MR(data_type::_S, 00112 A.Width()); 00113 00114 dense_transform_t<matrix_type, matrix_type, ValueDistribution> 00115 transform(*this); 00116 00117 transform.apply(A, sketch_of_A_MC_MR, tag); 00118 00119 sketch_of_A = sketch_of_A_MC_MR; 00120 } 00121 }; 00122 00123 } } 00125 #endif // SKYLARK_DENSE_TRANSFORM_ELEMENTAL_MC_MR_STAR_STAR_HPP