1 #ifndef teca_algorithm_h
2 #define teca_algorithm_h
4 #include "teca_config.h"
6 #include "teca_dataset.h"
7 #include "teca_algorithm_executive.h"
8 #include "teca_metadata.h"
15 #include <initializer_list>
18 class teca_algorithm_internals;
23 using teca_algorithm_output_port
24 = std::pair<p_teca_algorithm, unsigned int>;
28 p_teca_algorithm &
get_algorithm(teca_algorithm_output_port &op)
33 unsigned int &
get_port(teca_algorithm_output_port &op)
40 #define TECA_ALGORITHM_STATIC_NEW(T) \
45 return p_##T(new T); \
49 std::shared_ptr<T> shared_from_this() \
51 return std::static_pointer_cast<T>( \
52 teca_algorithm::shared_from_this()); \
56 std::shared_ptr<T const> shared_from_this() const \
58 return std::static_pointer_cast<T const>( \
59 teca_algorithm::shared_from_this()); \
62 #define TECA_ALGORITHM_CLASS_NAME(T) \
64 const char *get_class_name() const override \
72 #define TECA_ALGORITHM_DELETE_COPY_ASSIGN(T) \
74 T(const T &src) = delete; \
75 T(T &&src) = delete; \
77 T &operator=(const T &src) = delete; \
78 T &operator=(T &&src) = delete;
84 #define TECA_ALGORITHM_PROPERTY(T, NAME) \
87 void set_##NAME(const T &v) \
89 if (this->NAME != v) \
92 this->set_modified(); \
97 const T &get_##NAME() const \
108 #define TECA_ALGORITHM_PROPERTY_V(T, NAME) \
111 void set_##NAME(const T &v) \
113 if (this->validate_ ## NAME (v)) \
116 if (this->NAME != v) \
119 this->set_modified(); \
124 const T &get_##NAME() const \
133 #define TECA_ALGORITHM_VECTOR_PROPERTY(T, NAME) \
136 size_t get_number_of_##NAME##s () \
138 return this->NAME##s.size(); \
142 void append_##NAME(const T &v) \
144 this->NAME##s.push_back(v); \
145 this->set_modified(); \
149 void set_##NAME(const T &v) \
151 this->set_##NAME##s({v}); \
155 void set_##NAME(size_t i, const T &v) \
157 if (this->NAME##s[i] != v) \
159 this->NAME##s[i] = v; \
160 this->set_modified(); \
165 void set_##NAME##s(const std::vector<T> &v) \
167 if (this->NAME##s != v) \
170 this->set_modified(); \
175 void set_##NAME##s(const std::initializer_list<T> &&l) \
177 std::vector<T> v(l); \
178 if (this->NAME##s != v) \
181 this->set_modified(); \
186 const T &get_##NAME(size_t i) const \
188 return this->NAME##s[i]; \
192 const std::vector<T> &get_##NAME##s() const \
194 return this->NAME##s; \
198 void clear_##NAME##s() \
200 this->NAME##s.clear(); \
205 bool operator!=(
const std::function<T> &lhs,
const std::function<T> &rhs)
214 #define TECA_ALGORITHM_CALLBACK_PROPERTY(T, NAME) \
217 void set_##NAME(const T &v) \
222 this->set_modified(); \
227 const T &get_##NAME() const \
252 virtual const
char *get_class_name() const = 0;
263 void set_communicator(MPI_Comm comm);
266 MPI_Comm get_communicator();
268 #if defined(TECA_HAS_BOOST)
273 virtual void get_properties_description(
const std::string &prefix,
274 options_description &opts);
280 virtual void set_properties(
const std::string &prefix,
281 variables_map &opts);
289 TECA_ALGORITHM_PROPERTY(
int, verbose)
300 { this->set_input_connection(0, port); }
305 const teca_algorithm_output_port &port);
392 const std::vector<teca_metadata> &input_md);
401 unsigned int port,
const std::vector<teca_metadata> &input_md,
412 const_p_teca_dataset
execute(
unsigned int port,
413 const std::vector<const_p_teca_dataset> &input_data,
436 teca_algorithm_output_port ¤t);
442 const_p_teca_dataset request_data(
443 teca_algorithm_output_port &port,
494 teca_algorithm_internals *internals;
497 friend class teca_data_request;
The interface to TECA pipeline architecture.
Definition: teca_algorithm.h:244
void set_input_connection(const teca_algorithm_output_port &port)
set an input to this algorithm
Definition: teca_algorithm.h:299
void clear_cache(unsigned int port)
clear the cache on the given output port
virtual std::vector< teca_metadata > get_upstream_request(unsigned int port, const std::vector< teca_metadata > &input_md, const teca_metadata &request)
unsigned int get_number_of_input_connections()
get the number of input connections
virtual teca_metadata update_metadata(unsigned int port=0)
get meta data considering this instance up.
void set_number_of_output_ports(unsigned int n)
void clear_modified(unsigned int port)
clear the modified flag on the i'th output
int cache_output_data(unsigned int port, const teca_metadata &request, const_p_teca_dataset &data)
virtual teca_metadata get_output_metadata(teca_algorithm_output_port ¤t)
virtual void set_modified()
p_teca_algorithm_executive get_executive()
get the executive
virtual void set_input_connection(unsigned int id, const teca_algorithm_output_port &port)
set an input to this algorithm
const_p_teca_dataset get_output_data(unsigned int port, const teca_metadata &request)
virtual void to_stream(std::ostream &s) const
void set_cache_size(unsigned int n)
set the cache size. the default is 1. (threadsafe)
int get_modified(unsigned int port) const
return the output port's modified flag value
void clear_input_connections()
remove all input connections
virtual int validate_cache(teca_algorithm_output_port ¤t)
void pop_cache(unsigned int port=0, int top=0)
teca_algorithm_output_port & get_input_connection(unsigned int i)
void set_executive(p_teca_algorithm_executive exe)
set the executive
virtual void clear_modified(teca_algorithm_output_port current)
virtual void from_stream(std::istream &s)
deserialize from the stream.
const_p_teca_dataset get_output_data(unsigned int port=0)
void set_modified(unsigned int port)
an overload to set_modified by port
virtual const_p_teca_dataset execute(unsigned int port, const std::vector< const_p_teca_dataset > &input_data, const teca_metadata &request)
virtual int update(unsigned int port)
execute the pipeline from this instance up.
virtual teca_metadata get_cache_key(unsigned int port, const teca_metadata &request) const
virtual teca_metadata get_output_metadata(unsigned int port, const std::vector< teca_metadata > &input_md)
virtual int update()
execute the pipeline from this instance up.
virtual void remove_input_connection(unsigned int id)
remove input connections
virtual teca_algorithm_output_port get_output_port(unsigned int port=0)
void set_number_of_input_connections(unsigned int n)
This is the base class defining a threaded algorithm.
Definition: teca_threaded_algorithm.h:71
p_teca_error_handler error_handler TECA_EXPORT
The global error handler instance.
auto data(V &&... args)
Definition: teca_variant_array_util.h:255
p_teca_algorithm & get_algorithm(teca_algorithm_output_port &op)
get the algorithm from the output port
Definition: teca_algorithm_output_port.h:12
unsigned int & get_port(teca_algorithm_output_port &op)
get port number from the output port
Definition: teca_algorithm_output_port.h:17