MayaFlux 0.1.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
OperationHelper.cpp
Go to the documentation of this file.
1#include "OperationHelper.hpp"
2
3namespace MayaFlux::Yantra {
4
6 const std::vector<std::vector<double>>& columns,
7 const DataStructureInfo& structure_info)
8{
9 if (columns.empty()) {
10 return {};
11 }
12
13 if (structure_info.dimensions.size() >= 2) {
14 int expected_rows = structure_info.dimensions[0].size;
15 int expected_cols = structure_info.dimensions[1].size;
16
17 if (columns.size() != expected_cols) {
18 throw std::invalid_argument("Column count doesn't match dimension info");
19 }
20 if (!columns.empty() && columns[0].size() != expected_rows) {
21 throw std::invalid_argument("Row count doesn't match dimension info");
22 }
23
24 return create_eigen_matrix(columns);
25 }
26
27 return create_eigen_matrix(columns);
28}
29
31 const std::vector<std::span<const double>>& spans,
32 const DataStructureInfo& structure_info)
33{
34 if (spans.empty()) {
35 return {};
36 }
37
38 if (structure_info.dimensions.size() >= 2) {
39 int expected_rows = structure_info.dimensions[0].size;
40 int expected_cols = structure_info.dimensions[1].size;
41
42 if (spans.size() != expected_cols) {
43 throw std::invalid_argument("Span count doesn't match dimension info");
44 }
45 if (!spans.empty() && spans[0].size() != expected_rows) {
46 throw std::invalid_argument("Span size doesn't match dimension info");
47 }
48 }
49
50 return create_eigen_matrix(spans);
51}
52
54 const DataStructureInfo& structure_info)
55{
56 if (structure_info.original_type == std::type_index(typeid(std::vector<double>))) {
57 return Kakshya::DataVariant { double_data };
58 }
59
60 if (structure_info.original_type == std::type_index(typeid(std::vector<float>))) {
61 std::vector<float> float_data;
62 float_data.reserve(double_data.size());
63 std::ranges::transform(double_data, std::back_inserter(float_data),
64 [](double val) { return static_cast<float>(val); });
65 return Kakshya::DataVariant { float_data };
66 }
67
68 if (structure_info.original_type == std::type_index(typeid(std::vector<uint16_t>))) {
69 std::vector<uint16_t> uint16_data;
70 uint16_data.reserve(double_data.size());
71 std::ranges::transform(double_data, std::back_inserter(uint16_data),
72 [](double val) { return static_cast<uint16_t>(std::clamp(val, 0.0, 65535.0)); });
73 return Kakshya::DataVariant { uint16_data };
74 }
75 if (structure_info.original_type == std::type_index(typeid(std::vector<uint8_t>))) {
76 std::vector<uint8_t> uint8_data;
77 uint8_data.reserve(double_data.size());
78 std::ranges::transform(double_data, std::back_inserter(uint8_data),
79 [](double val) { return static_cast<uint8_t>(std::clamp(val, 0.0, 255.0)); });
80 return Kakshya::DataVariant { uint8_data };
81 }
82
83 return Kakshya::DataVariant { double_data };
84}
85}
static Kakshya::DataVariant reconstruct_data_variant_from_double(const std::vector< double > &double_data, const DataStructureInfo &structure_info)
Reconstruct DataVariant from double data and structure info.
static Eigen::MatrixXd create_eigen_matrix(const std::vector< std::vector< T > > &columns)
Infer data structure from ComputeData type.
static Eigen::MatrixXd recreate_eigen_matrix(const std::vector< std::vector< double > > &columns, const DataStructureInfo &structure_info)
Infer data structure from ComputeData type.
std::variant< std::vector< double >, std::vector< float >, std::vector< uint8_t >, std::vector< uint16_t >, std::vector< uint32_t >, std::vector< std::complex< float > >, std::vector< std::complex< double > >, std::vector< glm::vec2 >, std::vector< glm::vec3 >, std::vector< glm::vec4 >, std::vector< glm::mat4 > > DataVariant
Multi-type data storage for different precision needs.
Definition NDData.hpp:73
std::vector< Kakshya::DataDimension > dimensions
Metadata about data structure for reconstruction.