Logo
ApraPipes 1.0
Loading...
Searching...
No Matches
ModuleFactory.h
1// ============================================================
2// File: declarative/ModuleFactory.h
3// Module Factory for building PipeLine from PipelineDescription
4// Task D1: Module Factory
5// ============================================================
6
7#pragma once
8
9#include <memory>
10#include <vector>
11#include <map>
12#include <string>
13#include <algorithm>
14#include <optional>
15#include <boost/shared_ptr.hpp>
16
17#include "declarative/PipelineDescription.h"
18#include "declarative/ModuleRegistry.h"
19#include "declarative/Issue.h"
20#include "PipeLine.h"
21
22// Forward declaration
23class Module;
24
25namespace apra {
26
27// Forward declarations for auto-bridging
28struct BridgeSpec;
29enum class BridgeType;
30
31// Use PropertyAccessors from ModuleInfo for consistency
33
34// ============================================================
35// ModuleFactory - Builds PipeLine from PipelineDescription
36// ============================================================
38public:
39 // Build options
40 struct Options {
41 bool auto_insert_converters; // Future: auto-insert frame converters
42 bool strict_mode; // Fail on warnings in strict mode
43 bool collect_info_messages; // Include info messages in result
44 bool auto_bridge_enabled; // Auto-insert memory/format bridge modules
45
48 };
49
50 // Module info for external access (e.g., event callbacks, property access)
51 struct ModuleEntry {
52 boost::shared_ptr<Module> module;
53 std::string moduleType;
54 std::string instanceId;
55 DynamicPropertyAccessors propertyAccessors; // Runtime property access
56 };
57
58 // Build result
59 struct BuildResult {
60 std::unique_ptr<PipeLine> pipeline;
61 std::vector<BuildIssue> issues;
62 std::map<std::string, ModuleEntry> modules; // instanceId -> module info
63
64 // Check if build succeeded (no errors)
65 bool success() const {
66 if (!pipeline) return false;
67 return !std::any_of(issues.begin(), issues.end(),
68 [](const BuildIssue& i) { return i.level == BuildIssue::Level::Error; });
69 }
70
71 // Convenience methods
72 bool hasErrors() const {
73 return std::any_of(issues.begin(), issues.end(),
74 [](const BuildIssue& i) { return i.level == BuildIssue::Level::Error; });
75 }
76
77 bool hasWarnings() const {
78 return std::any_of(issues.begin(), issues.end(),
79 [](const BuildIssue& i) { return i.level == BuildIssue::Level::Warning; });
80 }
81
82 // Get issues filtered by level
83 std::vector<BuildIssue> getErrors() const {
84 std::vector<BuildIssue> result;
85 std::copy_if(issues.begin(), issues.end(), std::back_inserter(result),
86 [](const BuildIssue& i) { return i.level == BuildIssue::Level::Error; });
87 return result;
88 }
89
90 std::vector<BuildIssue> getWarnings() const {
91 std::vector<BuildIssue> result;
92 std::copy_if(issues.begin(), issues.end(), std::back_inserter(result),
93 [](const BuildIssue& i) { return i.level == BuildIssue::Level::Warning; });
94 return result;
95 }
96
97 // Format all issues as string for display
98 std::string formatIssues() const;
99
100 // Format pipeline graph as text for display (verbose mode)
101 // Returns a text representation showing module connections
102 std::string formatPipelineGraph(const std::vector<Connection>& connections) const;
103 };
104
105 // ============================================================
106 // ModuleContext - Stores per-instance pin mappings
107 // ============================================================
109 boost::shared_ptr<Module> module;
110 std::string moduleType; // e.g., "FileReaderModule"
111 std::string instanceId; // e.g., "source"
112 std::map<std::string, std::string> outputPinMap; // TOML name → internal pin ID
113 std::map<std::string, std::string> inputPinMap; // TOML name → internal pin ID
114 std::vector<std::string> connectedInputs; // Track which inputs are connected
115 };
116
117 // Constructor
118 explicit ModuleFactory(Options opts = Options());
119
120 // Main build method - takes PipelineDescription, returns running pipeline
122
123 // Get current options
124 const Options& options() const { return options_; }
125
126 // Set options
127 void setOptions(Options opts) { options_ = std::move(opts); }
128
129private:
131
132 // CUDA stream for modules that require it (type-erased to avoid header dependency)
133 // Actually points to a boost::shared_ptr<ApraCudaStream> when CUDA is enabled
134 void* cudaStreamPtr_ = nullptr;
135
136 // CUDA context for NVCodec modules (type-erased to avoid header dependency)
137 // Actually points to a boost::shared_ptr<ApraCUcontext> when CUDA is enabled
138 void* cuContextPtr_ = nullptr;
139
140 // Internal helpers
141
142 // Create a single module from instance description
143 // Uses cudaStreamPtr_ if the module requires CUDA stream
144 boost::shared_ptr<Module> createModule(
145 const ModuleInstance& instance,
146 std::vector<BuildIssue>& issues
147 );
148
149 // Set up output pins for a module based on registry info
150 // Returns map of TOML pin name → internal pin ID
151 // Uses outputFrameType property from instance if present to override default
152 // If selfManagedOutputPins is true and no existing pins, returns empty map
153 std::map<std::string, std::string> setupOutputPins(
154 Module* module,
155 const ModuleInfo& info,
156 const ModuleInstance& instance,
157 std::vector<BuildIssue>& issues,
158 bool selfManagedOutputPins = false
159 );
160
161 // Apply properties from description to module
162 void applyProperties(
163 Module* module,
164 const ModuleInstance& instance,
165 const ModuleInfo* info,
166 std::vector<BuildIssue>& issues
167 );
168
169 // Connect all modules according to connections list
170 // Uses ModuleContext map for pin name resolution
171 bool connectModules(
172 const std::vector<Connection>& connections,
173 std::map<std::string, ModuleContext>& contextMap,
174 std::vector<BuildIssue>& issues
175 );
176
177 // Insert bridge modules for memory/format conversion
178 // Returns modified connections list with bridge modules inserted
179 std::vector<Connection> insertBridgeModules(
180 const std::vector<Connection>& originalConnections,
181 const std::vector<BridgeSpec>& bridges,
182 std::map<std::string, ModuleContext>& contextMap,
183 std::vector<BuildIssue>& issues
184 );
185
186 // Validate that all required inputs are connected
187 // Called after connectModules() to check input satisfaction
189 const std::map<std::string, ModuleContext>& contextMap,
190 std::vector<BuildIssue>& issues
191 );
192
193public:
194 // Parse connection endpoint "instance.pin" into parts
195 // Made public for testing
196 static std::pair<std::string, std::string> parseConnectionEndpoint(
197 const std::string& endpoint
198 );
199
200private:
201
202 // Convert PropertyValue from PipelineDescription to ScalarPropertyValue
203 // (handles array types by extracting first element or using default)
204 std::optional<ScalarPropertyValue> convertPropertyValue(
205 const PropertyValue& value,
206 const ModuleInfo::PropInfo& propInfo,
207 std::vector<BuildIssue>& issues,
208 const std::string& location
209 );
210};
211
212} // namespace apra
Definition Module.h:151
Definition ModuleFactory.h:37
void setOptions(Options opts)
Definition ModuleFactory.h:127
void * cuContextPtr_
Definition ModuleFactory.h:138
void validateInputConnections(const std::map< std::string, ModuleContext > &contextMap, std::vector< BuildIssue > &issues)
Definition ModuleFactory.cpp:1195
ModuleFactory(Options opts=Options())
Definition ModuleFactory.cpp:360
const Options & options() const
Definition ModuleFactory.h:124
static std::pair< std::string, std::string > parseConnectionEndpoint(const std::string &endpoint)
Definition ModuleFactory.cpp:176
std::vector< Connection > insertBridgeModules(const std::vector< Connection > &originalConnections, const std::vector< BridgeSpec > &bridges, std::map< std::string, ModuleContext > &contextMap, std::vector< BuildIssue > &issues)
Definition ModuleFactory.cpp:810
BuildResult build(const PipelineDescription &desc)
Definition ModuleFactory.cpp:366
bool connectModules(const std::vector< Connection > &connections, std::map< std::string, ModuleContext > &contextMap, std::vector< BuildIssue > &issues)
Definition ModuleFactory.cpp:963
std::map< std::string, std::string > setupOutputPins(Module *module, const ModuleInfo &info, const ModuleInstance &instance, std::vector< BuildIssue > &issues, bool selfManagedOutputPins=false)
Definition ModuleFactory.cpp:193
boost::shared_ptr< Module > createModule(const ModuleInstance &instance, std::vector< BuildIssue > &issues)
Definition ModuleFactory.cpp:613
void * cudaStreamPtr_
Definition ModuleFactory.h:134
Options options_
Definition ModuleFactory.h:130
std::optional< ScalarPropertyValue > convertPropertyValue(const PropertyValue &value, const ModuleInfo::PropInfo &propInfo, std::vector< BuildIssue > &issues, const std::string &location)
Definition ModuleFactory.cpp:1180
void applyProperties(Module *module, const ModuleInstance &instance, const ModuleInfo *info, std::vector< BuildIssue > &issues)
Definition ModuleFactory.cpp:794
Definition FrameTypeRegistrations.h:10
std::variant< int64_t, double, bool, std::string, std::vector< int64_t >, std::vector< double >, std::vector< std::string > > PropertyValue
Definition PipelineDescription.h:22
BridgeType
Definition PipelineAnalyzer.h:23
Definition Issue.h:18
Definition ModuleFactory.h:59
std::vector< BuildIssue > issues
Definition ModuleFactory.h:61
std::string formatPipelineGraph(const std::vector< Connection > &connections) const
Definition ModuleFactory.cpp:302
std::vector< BuildIssue > getWarnings() const
Definition ModuleFactory.h:90
bool hasWarnings() const
Definition ModuleFactory.h:77
bool hasErrors() const
Definition ModuleFactory.h:72
std::unique_ptr< PipeLine > pipeline
Definition ModuleFactory.h:60
std::vector< BuildIssue > getErrors() const
Definition ModuleFactory.h:83
std::map< std::string, ModuleEntry > modules
Definition ModuleFactory.h:62
bool success() const
Definition ModuleFactory.h:65
std::string formatIssues() const
Definition ModuleFactory.cpp:283
Definition ModuleFactory.h:108
std::string instanceId
Definition ModuleFactory.h:111
boost::shared_ptr< Module > module
Definition ModuleFactory.h:109
std::string moduleType
Definition ModuleFactory.h:110
std::vector< std::string > connectedInputs
Definition ModuleFactory.h:114
std::map< std::string, std::string > inputPinMap
Definition ModuleFactory.h:113
std::map< std::string, std::string > outputPinMap
Definition ModuleFactory.h:112
Definition ModuleFactory.h:51
std::string moduleType
Definition ModuleFactory.h:53
std::string instanceId
Definition ModuleFactory.h:54
DynamicPropertyAccessors propertyAccessors
Definition ModuleFactory.h:55
boost::shared_ptr< Module > module
Definition ModuleFactory.h:52
Definition ModuleFactory.h:40
bool strict_mode
Definition ModuleFactory.h:42
bool auto_bridge_enabled
Definition ModuleFactory.h:44
bool auto_insert_converters
Definition ModuleFactory.h:41
bool collect_info_messages
Definition ModuleFactory.h:43
Options()
Definition ModuleFactory.h:46
Definition ModuleRegistry.h:59
Definition ModuleRegistry.h:106
Definition ModuleRegistry.h:41
Definition PipelineDescription.h:35
Definition PipelineDescription.h:90