23template <ComputeData T = std::vector<Kakshya::DataVariant>>
28 std::unordered_map<std::string, std::any>
metadata;
29 bool b_container_processing {};
31 std::optional<std::shared_ptr<Kakshya::SignalSourceContainer>>
container;
46 auto [dims, mod] = infer_structure(d);
47 dimensions = std::move(dims);
59 Datum(
const T& d,
const std::shared_ptr<Kakshya::SignalSourceContainer>& cont)
63 auto [dims, mod] = infer_structure(d);
64 dimensions = std::move(dims);
80 auto [dims, mod] = infer_structure(data);
81 dimensions = std::move(dims);
93 Datum(T&& d,
const std::shared_ptr<Kakshya::SignalSourceContainer>& cont)
97 auto [dims, mod] = infer_structure(data);
98 dimensions = std::move(dims);
110 , dimensions(
std::move(dims))
122 Datum(T&& d,
const std::shared_ptr<Kakshya::SignalSourceContainer> container, std::vector<Kakshya::DataDimension> dims,
Kakshya::DataModality mod)
124 , container(container)
125 , dimensions(
std::move(dims))
146 void set_container(
const std::shared_ptr<Kakshya::SignalSourceContainer>& cont)
157 return container.has_value();
166 if constexpr (std::is_same_v<T, std::shared_ptr<Kakshya::SignalSourceContainer>>) {
167 return b_container_processing;
178 if constexpr (std::is_same_v<T, std::shared_ptr<Kakshya::SignalSourceContainer>>) {
179 b_container_processing = val;
181 b_container_processing =
false;
192 return modality == target_modality;
202 for (
const auto& dim : dimensions) {
215 return Kakshya::find_dimension_by_role(dimensions, role);
225 size_t min_dimensions = 1)
const
228 if (!container.has_value()) {
232 return (modality == required_modality || required_modality == Kakshya::DataModality::UNKNOWN) && dimensions.size() >= min_dimensions;
246 dimensions = std::move(new_dims);
247 modality = new_modality;
255 template <
typename ValueType>
258 metadata[key] = std::forward<ValueType>(value);
267 template <
typename ValueType>
270 auto it = metadata.find(key);
271 if (it != metadata.end()) {
273 return std::any_cast<ValueType>(it->second);
274 }
catch (
const std::bad_any_cast&) {
291template <ComputeData T = std::vector<Kakshya::DataVariant>>
307 [[nodiscard]]
virtual std::string
get_name()
const = 0;
virtual Datum< T > execute(const Datum< T > &input)=0
Execute the operation on input data.
virtual std::string get_name() const =0
Get the name/identifier of this operation.
virtual ~OpUnit()=default
const auto & get_dependencies() const
Get all dependency operations.
void add_dependency(std::shared_ptr< OpUnit< T > > dep)
Add a dependency operation unit.
std::vector< std::shared_ptr< OpUnit< T > > > dependencies
Operation dependencies.
Abstract base class for operation units in recursive processing graphs.
Concept for Eigen matrix types with double scalar.
Concept to constrain types suitable for operation units.
DataModality
Data modality types for cross-modal analysis.
Role
Semantic role of the dimension.
T & operator*()
Access underlying data (mutable)
bool has_modality(Kakshya::DataModality target_modality) const
Check if data has specific modality.
Datum(T &&d, const std::shared_ptr< Kakshya::SignalSourceContainer > &cont)
Construct from data by move with automatic structure inference.
T data
The actual computation data.
int find_dimension_by_role(Kakshya::DataDimension::Role role) const
Find dimension by semantic role.
Datum(T &&d)
Construct from data by move with automatic structure inference.
void set_metadata(const std::string &key, ValueType &&value)
Add or update metadata entry.
void set_container_processing(bool val)
Set whether processing is needed (for container types)
bool has_container() const
Check if a container reference is associated.
bool is_suitable_for_processing(Kakshya::DataModality required_modality, size_t min_dimensions=1) const
Check if data is suitable for a specific type of processing.
std::vector< Kakshya::DataDimension > dimensions
Data dimensional structure.
std::optional< ValueType > get_metadata(const std::string &key) const
Get metadata entry with type safety.
Datum(T &&d, const std::shared_ptr< Kakshya::SignalSourceContainer > container, std::vector< Kakshya::DataDimension > dims, Kakshya::DataModality mod)
Construct with move and explicit structure information.
bool needs_processig() const
Check if processing is needed (for container types)
std::optional< std::shared_ptr< Kakshya::SignalSourceContainer > > container
Optional reference to container, required for regions.
uint64_t get_total_elements() const
Get total number of elements across all dimensions.
void set_container(const std::shared_ptr< Kakshya::SignalSourceContainer > &cont)
Set or update the associated container reference.
Datum()=default
Default constructor.
const T & operator*() const
Access underlying data (const)
Datum(T &&d, std::vector< Kakshya::DataDimension > dims, Kakshya::DataModality mod)
Construct with move and explicit structure information.
std::unordered_map< std::string, std::any > metadata
Associated metadata.
void update_structure(std::vector< Kakshya::DataDimension > new_dims, Kakshya::DataModality new_modality)
Update structure information (use carefully!)
Datum(const T &d)
Construct from data by copy with automatic structure inference.
Datum(const T &d, const std::shared_ptr< Kakshya::SignalSourceContainer > &cont)
Construct from data by copy with container reference and automatic structure inference.
Input/Output container for computation pipeline data flow with structure preservation.
Helper to detect if a type is an Datum.