1#ifndef KMEANS_SIMPLE_MATRIX_HPP
2#define KMEANS_SIMPLE_MATRIX_HPP
7#include "sanisizer/sanisizer.hpp"
21template<
typename Index_,
typename Data_>
24#ifdef KMEANS_DEBUG_POINTER_USAGE
55template<
typename Data_>
58 Buffer(std::size_t n) : my_buffer(n * MULT), my_n(n), my_eng(n + 1) {}
61 static constexpr std::size_t MULT = 5;
62 std::vector<Data_> my_buffer;
64 std::mt19937_64 my_eng;
67 const Data_* update(
const Data_*
const ptr) {
68 std::fill(my_buffer.begin(), my_buffer.end(), std::numeric_limits<Data_>::quiet_NaN());
69 auto host = (my_eng() % MULT) * my_n;
70 std::copy_n(ptr, my_n, host);
76template<
typename Index_,
typename Data_>
77class SimpleMatrixRandomAccessExtractor final :
public RandomAccessExtractor<Index_, Data_> {
79 SimpleMatrixRandomAccessExtractor(
const SimpleMatrix<Index_, Data_>& parent) :
81#ifdef KMEANS_DEBUG_POINTER
82 , my_buffer(my_parent.num_dimensions())
87 const SimpleMatrix<Index_, Data_>& my_parent;
88#ifdef KMEANS_DEBUG_POINTER
89 Buffer<Data_> my_buffer;
93 const Data_* get_observation(
const Index_ i) {
94 const auto output = my_parent.my_data + sanisizer::product_unsafe<std::size_t>(i, my_parent.my_num_dim);
95#ifndef KMEANS_DEBUG_POINTER
98 return my_buffer.update(output);
103template<
typename Index_,
typename Data_>
104class SimpleMatrixConsecutiveAccessExtractor final :
public ConsecutiveAccessExtractor<Index_, Data_> {
106 SimpleMatrixConsecutiveAccessExtractor(
const SimpleMatrix<Index_, Data_>& parent,
const Index_ start) :
109#ifdef KMEANS_DEBUG_POINTER
110 , my_buffer(my_parent.num_dimensions())
115 const SimpleMatrix<Index_, Data_>& my_parent;
117#ifdef KMEANS_DEBUG_POINTER
118 Buffer<Data_> my_buffer;
122 const Data_* get_observation() {
123 const auto output = my_parent.my_data + sanisizer::product_unsafe<std::size_t>(my_position++, my_parent.my_num_dim);
124#ifndef KMEANS_DEBUG_POINTER
127 return my_buffer.update(output);
132template<
typename Index_,
typename Data_>
133class SimpleMatrixIndexedAccessExtractor final :
public IndexedAccessExtractor<Index_, Data_> {
135 SimpleMatrixIndexedAccessExtractor(
const SimpleMatrix<Index_, Data_>& parent,
const Index_*
const sequence) :
137 my_sequence(sequence)
138#ifdef KMEANS_DEBUG_POINTER
139 , my_buffer(my_parent.num_dimensions())
144 const SimpleMatrix<Index_, Data_>& my_parent;
145 const Index_* my_sequence;
146 std::size_t my_position = 0;
147#ifdef KMEANS_DEBUG_POINTER
148 Buffer<Data_> my_buffer;
152 const Data_* get_observation() {
153 const auto output = my_parent.my_data + sanisizer::product_unsafe<std::size_t>(my_sequence[my_position++], my_parent.my_num_dim);
154#ifndef KMEANS_DEBUG_POINTER
157 return my_buffer.update(output);
173template<
typename Index_,
typename Data_>
186 std::size_t my_num_dim;
188 const Data_* my_data;
189 friend class SimpleMatrixRandomAccessExtractor<Index_, Data_>;
190 friend class SimpleMatrixConsecutiveAccessExtractor<Index_, Data_>;
191 friend class SimpleMatrixIndexedAccessExtractor<Index_, Data_>;
206 std::unique_ptr<RandomAccessExtractor<Index_, Data_> >
new_extractor()
const {
207 return std::make_unique<SimpleMatrixRandomAccessExtractor<Index_, Data_> >(*this);
210 std::unique_ptr<ConsecutiveAccessExtractor<Index_, Data_> >
new_extractor(
const Index_ start,
const Index_)
const {
211 return std::make_unique<SimpleMatrixConsecutiveAccessExtractor<Index_, Data_> >(*
this, start);
214 std::unique_ptr<IndexedAccessExtractor<Index_, Data_> >
new_extractor(
const Index_* sequence,
const std::size_t)
const {
215 return std::make_unique<SimpleMatrixIndexedAccessExtractor<Index_, Data_> >(*
this, sequence);
Interface for matrix inputs.
Interface for matrix data.
Definition Matrix.hpp:142
virtual std::size_t num_dimensions() const =0
virtual std::unique_ptr< RandomAccessExtractor< Index_, Data_ > > new_extractor() const =0
virtual Index_ num_observations() const =0
A simple matrix of observations.
Definition SimpleMatrix.hpp:174
SimpleMatrix(const std::size_t num_dimensions, const Index_ num_observations, const Data_ *const data)
Definition SimpleMatrix.hpp:182
Perform k-means clustering.
Definition compute_wcss.hpp:16