23template <ComputeData T = std::vector<Kakshya::DataVariant>>
24struct MAYAFLUX_API
IO {
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 IO(
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 IO(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 IO(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 std::string get_name() const =0
Get the name/identifier of this operation.
virtual IO< T > execute(const IO< T > &input)=0
Execute the operation on input data.
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.
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.
void set_metadata(const std::string &key, ValueType &&value)
Add or update metadata entry.
const T & operator*() const
Access underlying data (const)
bool needs_processig() const
Check if processing is needed (for container types)
IO()=default
Default constructor.
T data
The actual computation data.
std::unordered_map< std::string, std::any > metadata
Associated metadata.
std::optional< ValueType > get_metadata(const std::string &key) const
Get metadata entry with type safety.
std::optional< std::shared_ptr< Kakshya::SignalSourceContainer > > container
Optional reference to container, required for regions.
IO(T &&d, std::vector< Kakshya::DataDimension > dims, Kakshya::DataModality mod)
Construct with move and explicit structure information.
T & operator*()
Access underlying data (mutable)
bool has_modality(Kakshya::DataModality target_modality) const
Check if data has specific modality.
IO(const T &d, const std::shared_ptr< Kakshya::SignalSourceContainer > &cont)
Construct from data by copy with container reference and automatic structure inference.
IO(T &&d)
Construct from data by move with automatic structure inference.
IO(const T &d)
Construct from data by copy with automatic structure inference.
void update_structure(std::vector< Kakshya::DataDimension > new_dims, Kakshya::DataModality new_modality)
Update structure information (use carefully!)
uint64_t get_total_elements() const
Get total number of elements across all dimensions.
IO(T &&d, const std::shared_ptr< Kakshya::SignalSourceContainer > &cont)
Construct from data by move with automatic structure inference.
int find_dimension_by_role(Kakshya::DataDimension::Role role) const
Find dimension by semantic role.
std::vector< Kakshya::DataDimension > dimensions
Data dimensional structure.
IO(T &&d, const std::shared_ptr< Kakshya::SignalSourceContainer > container, std::vector< Kakshya::DataDimension > dims, Kakshya::DataModality mod)
Construct with move and explicit structure information.
void set_container_processing(bool val)
Set whether processing is needed (for container types)
void set_container(const std::shared_ptr< Kakshya::SignalSourceContainer > &cont)
Set or update the associated container reference.
Input/Output container for computation pipeline data flow with structure preservation.
Helper to detect if a type is an IO.