FAST  3.2.0
Framework for Heterogeneous Medical Image Computing and Visualization
ProcessObject.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include "FAST/Utility.hpp"
4 #include <unordered_map>
5 #include <unordered_set>
6 #include <vector>
7 #include "FAST/Object.hpp"
9 #include "RuntimeMeasurement.hpp"
11 #include "FAST/ExecutionDevice.hpp"
12 #include "FAST/DeviceManager.hpp"
13 #include "FAST/Config.hpp"
14 #include "FAST/Attribute.hpp"
16 
17 namespace fast {
18 
19 class OpenCLProgram;
20 class ProcessObject;
21 
22 class FAST_EXPORT ProcessObject : public Object {
23  public:
24  virtual ~ProcessObject();
33  void update(int executeToken = -1);
34  typedef std::shared_ptr<ProcessObject> pointer;
35 
36  // Runtime stuff
37  RuntimeMeasurement::pointer getRuntime();
38  RuntimeMeasurement::pointer getRuntime(std::string name);
39  RuntimeMeasurementsManager::pointer getAllRuntimes();
40  void enableRuntimeMeasurements();
41  void disableRuntimeMeasurements();
42 
43  // Device stuff
44  void setMainDevice(ExecutionDevice::pointer device);
45  void setMainDeviceCriteria(const DeviceCriteria& citeria);
46  ExecutionDevice::pointer getMainDevice() const;
47  void setDevice(uint deviceNumber, ExecutionDevice::pointer device);
48  void setDeviceCriteria(uint deviceNumber, const DeviceCriteria& criteria);
49  ExecutionDevice::pointer getDevice(uint deviceNumber) const;
50 
51  virtual DataChannel::pointer getOutputPort(uint portID = 0);
52  virtual DataChannel::pointer getInputPort(uint portID = 0);
53  virtual void setInputConnection(DataChannel::pointer port);
54  virtual void setInputConnection(uint portID, DataChannel::pointer port);
55  virtual void setInputData(DataObject::pointer data);
56  virtual void setInputData(uint portID, DataObject::pointer data);
57  int getNrOfInputConnections() const;
58  int getNrOfOutputPorts() const;
59 
60  virtual std::string getNameOfClass() const = 0;
61  static std::string getStaticNameOfClass() {
62  return "ProcessObject";
63  }
64  virtual void loadAttributes();
65  std::shared_ptr<Attribute> getAttribute(std::string id);
66  std::unordered_map<std::string, std::shared_ptr<Attribute>> getAttributes();
67  void setAttributes(std::vector<std::shared_ptr<Attribute>> attributes);
68 
72  void stopPipeline();
73 
74  void setModified(bool modified);
75 
76  template <class DataType>
77  std::shared_ptr<DataType> updateAndGetOutputData(uint portID = 0);
78 
79  protected:
80  ProcessObject();
81  // Flag to indicate whether the object has been modified
82  // and should be executed again
84 
85  // An integer id which act as a token of when this PO last executed
86  int m_lastExecuteToken = -1;
87 
88  // Pure virtual method for executing the pipeline object
89  virtual void execute()=0;
90  virtual void preExecute();
91  virtual void postExecute();
92 
93  template <class DataType>
94  void createInputPort(uint portID, bool required = true);
95  template <class DataType>
96  void createOutputPort(uint portID);
97 
98  template <class DataType>
99  std::shared_ptr<DataType> getInputData(uint portID = 0);
100  template <class DataType>
101  std::shared_ptr<DataType> getOutputData(uint portID = 0);
102  void addOutputData(uint portID, DataObject::pointer data);
103 
104  bool hasNewInputData(uint portID);
105 
106  virtual void waitToFinish() {};
107 
108 
109  RuntimeMeasurementsManager::pointer mRuntimeManager;
110 
111  void createOpenCLProgram(std::string sourceFilename, std::string name = "");
112  cl::Program getOpenCLProgram(
113  std::shared_ptr<OpenCLDevice> device,
114  std::string name = "",
115  std::string buildOptions = ""
116  );
117 
118  void createFloatAttribute(std::string id, std::string name, std::string description, float initialValue);
119  void createIntegerAttribute(std::string id, std::string name, std::string description, int initialValue);
120  void createBooleanAttribute(std::string id, std::string name, std::string description, bool initialValue);
121  void createStringAttribute(std::string id, std::string name, std::string description, std::string initialValue);
122  float getFloatAttribute(std::string id);
123  int getIntegerAttribute(std::string id);
124  bool getBooleanAttribute(std::string id);
125  std::string getStringAttribute(std::string id);
126  std::vector<float> getFloatListAttribute(std::string id);
127  std::vector<int> getIntegerListAttribute(std::string id);
128  std::vector<bool> getBooleanListAttribute(std::string id);
129  std::vector<std::string> getStringListAttribute(std::string id);
130 
131  void changeDeviceOnInputs(uint deviceNumber, ExecutionDevice::pointer device);
132 
133  std::unordered_map<uint, bool> mRequiredInputs;
134  std::unordered_map<uint, std::vector<uint> > mInputDevices;
135  std::unordered_map<uint, ExecutionDevice::pointer> mDevices;
136  std::unordered_map<uint, DeviceCriteria> mDeviceCriteria;
137 
138  // New pipeline
139  std::unordered_map<uint, DataChannel::pointer> mInputConnections;
140  std::unordered_map<uint, std::vector<std::weak_ptr<DataChannel>>> mOutputConnections;
141  std::unordered_map<uint, bool> mInputPorts;
142  std::unordered_set<uint> mOutputPorts;
143  // <port id, timestep>, register the last timestep of data which this PO executed with
144  std::unordered_map<uint, std::pair<DataObject::pointer, uint64_t>> mLastProcessed;
145 
146  void validateInputPortExists(uint portID);
147  void validateOutputPortExists(uint portID);
148 
149 
150 
151  std::unordered_map<std::string, std::shared_ptr<OpenCLProgram> > mOpenCLPrograms;
152 
153  std::unordered_map<std::string, std::shared_ptr<Attribute>> mAttributes;
154 
155  // Frame data
156  // Similar to metadata, only this is transferred from input to output
157  std::unordered_map<std::string, std::string> m_frameData;
158  // Indicates whether this data object is the last frame in a stream, and if so, the name of the stream
159  std::unordered_set<std::string> m_lastFrame;
160 
161  int m_maximumNrOfFrames = -1;
162 
163 };
164 
165 
166 template<class DataType>
167 void ProcessObject::createInputPort(uint portID, bool required) {
168  mInputPorts[portID] = required;
169 }
170 
171 
172 template<class DataType>
174  mOutputPorts.insert(portID);
175 }
176 
177 template<class DataType>
178 std::shared_ptr<DataType> ProcessObject::getInputData(uint portID) {
179  validateInputPortExists(portID);
180  DataChannel::pointer port = mInputConnections.at(portID);
181  DataObject::pointer data = port->getNextFrame();
182  mLastProcessed[portID] = std::make_pair(data, data->getTimestamp());
183  auto convertedData = std::dynamic_pointer_cast<DataType>(data);
184  // Check if the conversion went ok
185  if(!convertedData)
186  throw BadCastException(data->getNameOfClass(), DataType::getStaticNameOfClass());
187 
188  // Store frame data for this input data so it can be added to output data later
189  for(auto&& lastFrame : data->getLastFrame())
190  m_lastFrame.insert(lastFrame);
191  for(auto&& frameData : data->getFrameData())
192  m_frameData[frameData.first] = frameData.second;
193 
194  return convertedData;
195 }
196 
197 template<class DataType>
198 std::shared_ptr<DataType> ProcessObject::getOutputData(uint portID) {
199  validateOutputPortExists(portID);
200  // Generate a new output data object
201  std::shared_ptr<DataType> returnData = DataType::New();
202 
203  addOutputData(portID, returnData);
204 
205  // Return it
206  return returnData;
207 }
208 
209 
210 template<class DataType>
211 std::shared_ptr<DataType> ProcessObject::updateAndGetOutputData(uint portID) {
212  auto port = getOutputPort(portID);
213  update();
214  return port->getNextFrame<DataType>();
215 }
216 
217 
218 }; // end namespace fast
fast::ProcessObject::validateInputPortExists
void validateInputPortExists(uint portID)
Object.hpp
fast::ExecutionDevice::pointer
std::shared_ptr< ExecutionDevice > pointer
Definition: ExecutionDevice.hpp:11
fast::BadCastException
Definition: Exception.hpp:105
fast::DataType
DataType
Definition: DataTypes.hpp:38
fast::DeviceCriteria
Definition: DeviceCriteria.hpp:21
fast::ProcessObject::update
void update(int executeToken=-1)
fast::ProcessObject::mDeviceCriteria
std::unordered_map< uint, DeviceCriteria > mDeviceCriteria
Definition: ProcessObject.hpp:136
fast::ProcessObject::waitToFinish
virtual void waitToFinish()
Definition: ProcessObject.hpp:106
fast::ProcessObject::getInputData
std::shared_ptr< DataType > getInputData(uint portID=0)
Definition: ProcessObject.hpp:178
fast
Definition: AffineTransformation.hpp:7
fast::ProcessObject::m_lastFrame
std::unordered_set< std::string > m_lastFrame
Definition: ProcessObject.hpp:159
fast::ProcessObject::getStaticNameOfClass
static std::string getStaticNameOfClass()
Definition: ProcessObject.hpp:61
fast::ProcessObject::createInputPort
void createInputPort(uint portID, bool required=true)
Definition: ProcessObject.hpp:167
fast::ProcessObject::mOpenCLPrograms
std::unordered_map< std::string, std::shared_ptr< OpenCLProgram > > mOpenCLPrograms
Definition: ProcessObject.hpp:151
fast::ProcessObject::validateOutputPortExists
void validateOutputPortExists(uint portID)
fast::ProcessObject::createOutputPort
void createOutputPort(uint portID)
Definition: ProcessObject.hpp:173
fast::Object
Definition: Object.hpp:34
fast::ProcessObject::mInputDevices
std::unordered_map< uint, std::vector< uint > > mInputDevices
Definition: ProcessObject.hpp:134
ExecutionDevice.hpp
fast::ProcessObject::pointer
std::shared_ptr< ProcessObject > pointer
Definition: ProcessObject.hpp:34
fast::ProcessObject::mLastProcessed
std::unordered_map< uint, std::pair< DataObject::pointer, uint64_t > > mLastProcessed
Definition: ProcessObject.hpp:144
Config.hpp
fast::ProcessObject::m_frameData
std::unordered_map< std::string, std::string > m_frameData
Definition: ProcessObject.hpp:157
fast::RuntimeMeasurement::pointer
std::shared_ptr< RuntimeMeasurement > pointer
Definition: RuntimeMeasurement.hpp:14
fast::ProcessObject::mInputConnections
std::unordered_map< uint, DataChannel::pointer > mInputConnections
Definition: ProcessObject.hpp:139
Utility.hpp
fast::DataChannel::pointer
std::shared_ptr< DataChannel > pointer
Definition: DataChannel.hpp:12
fast::ProcessObject::mOutputConnections
std::unordered_map< uint, std::vector< std::weak_ptr< DataChannel > > > mOutputConnections
Definition: ProcessObject.hpp:140
fast::Object::pointer
std::shared_ptr< Object > pointer
Definition: Object.hpp:36
fast::ProcessObject::getOutputData
std::shared_ptr< DataType > getOutputData(uint portID=0)
Definition: ProcessObject.hpp:198
fast::ProcessObject::getOutputPort
virtual DataChannel::pointer getOutputPort(uint portID=0)
fast::ProcessObject::mAttributes
std::unordered_map< std::string, std::shared_ptr< Attribute > > mAttributes
Definition: ProcessObject.hpp:153
fast::ProcessObject::mDevices
std::unordered_map< uint, ExecutionDevice::pointer > mDevices
Definition: ProcessObject.hpp:135
RuntimeMeasurementManager.hpp
DataChannel.hpp
RuntimeMeasurement.hpp
fast::DataObject::pointer
std::shared_ptr< DataObject > pointer
Definition: DataObject.hpp:16
fast::ProcessObject::mRequiredInputs
std::unordered_map< uint, bool > mRequiredInputs
Definition: ProcessObject.hpp:133
Attribute.hpp
fast::ProcessObject::mIsModified
bool mIsModified
Definition: ProcessObject.hpp:83
fast::ProcessObject::updateAndGetOutputData
std::shared_ptr< DataType > updateAndGetOutputData(uint portID=0)
Definition: ProcessObject.hpp:211
uint
unsigned int uint
Definition: DataTypes.hpp:16
DataObject.hpp
DeviceManager.hpp
fast::ProcessObject::mInputPorts
std::unordered_map< uint, bool > mInputPorts
Definition: ProcessObject.hpp:141
fast::ProcessObject
Definition: ProcessObject.hpp:22
fast::ProcessObject::mOutputPorts
std::unordered_set< uint > mOutputPorts
Definition: ProcessObject.hpp:142
fast::ProcessObject::addOutputData
void addOutputData(uint portID, DataObject::pointer data)