SCIRun  5.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
AlgorithmBase.h
Go to the documentation of this file.
1 /*
2  For more information, please see: http://software.sci.utah.edu
3 
4  The MIT License
5 
6  Copyright (c) 2012 Scientific Computing and Imaging Institute,
7  University of Utah.
8 
9  License for the specific language governing rights and limitations under
10  Permission is hereby granted, free of charge, to any person obtaining a
11  copy of this software and associated documentation files (the "Software"),
12  to deal in the Software without restriction, including without limitation
13  the rights to use, copy, modify, merge, publish, distribute, sublicense,
14  and/or sell copies of the Software, and to permit persons to whom the
15  Software is furnished to do so, subject to the following conditions:
16 
17  The above copyright notice and this permission notice shall be included
18  in all copies or substantial portions of the Software.
19 
20  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
21  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
23  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
25  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
26  DEALINGS IN THE SOFTWARE.
27 */
28 
29 #ifndef ALGORITHMS_BASE_ALGORITHMBASE_H
30 #define ALGORITHMS_BASE_ALGORITHMBASE_H
31 
32 #include <string>
33 #include <set>
34 #include <stdexcept>
35 #include <iosfwd>
36 #include <boost/variant.hpp>
37 #include <boost/function.hpp>
38 #include <boost/noncopyable.hpp>
40 #include <Core/Utils/Exception.h>
43 #include <Core/Datatypes/HasId.h>
45 #include <Core/Utils/StringUtil.h>
47 
48 namespace SCIRun {
49 namespace Core {
50 namespace Algorithms {
51 
52  struct SCISHARE Name
53  {
54  Name() : name_("_unspecified_") {}
55  explicit Name(const std::string& name);
56 
57  std::string name() const { return name_; }
58 
59  bool operator<(const Name& rhs) const
60  {
61  return name_ < rhs.name_;
62  }
63 
64  std::string name_;
65  };
66 
67  SCISHARE bool operator==(const Name& lhs, const Name& rhs);
68  SCISHARE std::ostream& operator<<(std::ostream& out, const Name& name);
69 
73 
75  {
76  public:
78  AlgoOption(const std::string& option, const std::set<std::string>& options)
79  : option_(option), options_(options) {}
80 
81  std::string option_;
82  std::set<std::string> options_;
83  };
84 
85  SCISHARE bool operator==(const AlgoOption& lhs, const AlgoOption& rhs);
86  SCISHARE std::ostream& operator<<(std::ostream& out, const AlgoOption& op);
87 
89  {
90  public:
91  /// @todo: expand this
92  typedef boost::variant<
93  int,
94  double,
95  std::string,
96  bool,
97  AlgoOption,
98  std::vector<Variable>
99  > Value;
100 
101  Variable() {}
102  Variable(const Name& name, const Value& value) : name_(name), value_(value) {}
103  Variable(const Name& name, const Datatypes::DatatypeHandle& value) : name_(name), data_(value) {}
104 
108 
109  int getInt() const;
110  double getDouble() const;
111  std::string getString() const;
112  bool getBool() const;
113  Datatypes::DatatypeHandle getDatatype() const;
114  std::vector<Variable> getList() const;
115  AlgoOption getOption() const;
116  };
117 
118  SCISHARE bool operator==(const Variable& lhs, const Variable& rhs);
119  SCISHARE std::ostream& operator<<(std::ostream& out, const Variable& var);
120 
122 
124  {
125  public:
126  AlgorithmLogger();
127  ~AlgorithmLogger();
128  void setLogger(Core::Logging::LoggerHandle logger);
129 
130  /// functions for the algorithm, so it can forward errors if needed
131  virtual void error(const std::string& error) const;
132  virtual void warning(const std::string& warning) const;
133  virtual void remark(const std::string& remark) const;
134  virtual void status(const std::string& status) const;
135  private:
137  Core::Logging::LoggerHandle defaultLogger_;
138  };
139 
140  /// @todo: integrate with logger type above
142  {
143  public:
145  {
146  setUpdaterFunc(defaultUpdaterFunc_);
147  }
149 
150  virtual void report_start(const std::string& tag) const {}
151  virtual void report_end() const {}
152 
153  virtual void update_progress(double percent) const { updaterFunc_(percent); }
154 
155  typedef boost::function<void(double)> UpdaterFunc;
156  void setUpdaterFunc(UpdaterFunc func) { updaterFunc_ = func; }
157  UpdaterFunc getUpdaterFunc() const { return updaterFunc_; }
158  private:
159  UpdaterFunc updaterFunc_;
160  static UpdaterFunc defaultUpdaterFunc_;
161  };
162 
163  class SCISHARE ScopedAlgorithmStatusReporter : boost::noncopyable
164  {
165  public:
166  ScopedAlgorithmStatusReporter(const AlgorithmStatusReporter* asr, const std::string& tag);
168  private:
169  const AlgorithmStatusReporter* asr_;
170  };
171 
173  {
174  public:
175  typedef std::map<Name, std::vector<Datatypes::DatatypeHandle>> Map;
177  explicit AlgorithmData(const Map& m) : data_(m) {}
178 
179  Datatypes::DatatypeHandle& operator[](const Name& name);
180 
181  template <typename T>
182  boost::shared_ptr<T> get(const Name& name) const
183  {
184  auto it = data_.find(name);
185  /// @todo: log incorrect type if present but wrong type
186  return it == data_.end() ? boost::shared_ptr<T>() : boost::dynamic_pointer_cast<T>(it->second[0]);
187  }
188 
189  template <typename T>
190  std::vector<boost::shared_ptr<T>> getList(const Name& name) const
191  {
192  auto it = data_.find(name);
193  /// @todo: log incorrect type if present but wrong type
194  return it == data_.end() ? std::vector<boost::shared_ptr<T>>() : downcast_range<T>(it->second);
195  }
196 
197  template <typename T>
198  void setList(const Name& name, const std::vector<boost::shared_ptr<T>>& list)
199  {
200  data_[name] = upcast_range<Datatypes::Datatype>(list);
201  }
202 
203  /// @todo: lame
204  void setTransient(boost::any t) { transient_ = t; }
205  boost::any getTransient() const { return transient_; }
206 
207  private:
208  Map data_;
209  boost::any transient_;
210  };
211 
213  {
214  public:
216  AlgorithmInput(const Map& m) : AlgorithmData(m) {}
217  };
218 
220 
221  typedef boost::shared_ptr<AlgorithmInput> AlgorithmInputHandle;
222  typedef boost::shared_ptr<AlgorithmOutput> AlgorithmOutputHandle;
223 
225  {
226  public:
227  virtual ~AlgorithmInterface() {}
228 
229  /*
230  @todo idea: make it mockable
231 
232  virtual OutputDatatypeHandleOptions run(InputDatatypeHandleOptions, ModuleParameterState) = 0;
233 
234  ModuleParameterState: essentially a map of GuiVars. but need hooks for undo/redo and serialization
235  Input: tuple/heterogeneous vector of Datatypes
236  Output: tuple of Datatypes, possibly delay-executed
237  */
238 
239  virtual AlgorithmOutput run_generic(const AlgorithmInput& input) const = 0;
240  virtual bool set(const AlgorithmParameterName& key, const AlgorithmParameter::Value& value) = 0;
241  virtual const AlgorithmParameter& get(const AlgorithmParameterName& key) const = 0;
242  };
243 
244  /// @todo: link this to ModuleState via meeting discussion
246  {
247  public:
249  bool set(const AlgorithmParameterName& key, const AlgorithmParameter::Value& value);
250  const AlgorithmParameter& get(const AlgorithmParameterName& key) const;
251 
252  bool set_option(const AlgorithmParameterName& key, const std::string& value);
253  bool get_option(const AlgorithmParameterName& key, std::string& value) const;
254  std::string get_option(const AlgorithmParameterName& key) const;
255  bool check_option(const AlgorithmParameterName& key, const std::string& value) const;
256 
257  virtual bool keyNotFoundPolicy(const AlgorithmParameterName& key);
258 
259  protected:
260  void dumpAlgoState() const;
261  void addParameter(const AlgorithmParameterName& key, const AlgorithmParameter::Value& defaultValue);
262  void add_option(const AlgorithmParameterName& key, const std::string& defval, const std::string& options);
263  private:
264  typedef std::map<AlgorithmParameterName, AlgorithmParameter> ParameterMap;
265  ParameterMap parameters_;
266  };
267 
269  {
270  public:
272  AlgoInputBuilder& operator()(const std::string& name, Datatypes::DatatypeHandle d);
274  {
275  return operator()(name.name(), d);
276  }
277  template <typename T>
278  AlgoInputBuilder& operator()(const std::string& name, const std::vector<T>& vec)
279  {
280  //BOOST_STATIC_ASSERT(boost::is_base_of<Datatypes::Datatype,T>::value);
281  map_[Name(name)] = upcast_range<Datatypes::Datatype>(vec);
282  return *this;
283  }
284  template <typename T>
285  AlgoInputBuilder& operator()(const AlgorithmParameterName& name, const std::vector<T>& vec)
286  {
287  return operator()(name.name(), vec);
288  }
289  AlgorithmInput build() const;
290  private:
291  AlgorithmData::Map map_;
292  };
293 
294  SCISHARE AlgorithmInput makeNullInput();
295 
297  {
298  public:
299  virtual ~AlgorithmBase();
300  };
301 
303  {
304  public:
306  virtual Logging::LoggerHandle getLogger() const = 0;
307  virtual AlgorithmStatusReporter::UpdaterFunc getUpdaterFunc() const = 0;
308  };
309 
311  {
312  public:
313  virtual ~AlgorithmFactory() {}
314  virtual AlgorithmHandle create(const std::string& name, const AlgorithmCollaborator* algoCollaborator) const = 0;
315  };
316 
317  template <typename T>
318  boost::shared_ptr<T> optionalAlgoInput(boost::optional<boost::shared_ptr<T>> opt)
319  {
320  return opt.get_value_or(boost::shared_ptr<T>());
321  }
322 
323 }}}
324 
325 #define make_input(list) SCIRun::Core::Algorithms::AlgoInputBuilder() list .build()
326 #define make_output(portName) SCIRun::Core::Algorithms::AlgorithmParameterName(#portName)
327 #define get_output(outputObj, portName, type) boost::dynamic_pointer_cast<type>(outputObj[make_output(portName)]);
328 #define ALGORITHM_PARAMETER_DECL(name) namespace Parameters { SCISHARE extern const SCIRun::Core::Algorithms::AlgorithmParameterName name; }
329 #define ALGORITHM_PARAMETER_DEF(ns, name) const SCIRun::Core::Algorithms::AlgorithmParameterName SCIRun::Core::Algorithms::ns::Parameters::name(#name);
330 
331 #endif
Value value_
Definition: AlgorithmBase.h:106
Name AlgorithmInputName
Definition: AlgorithmBase.h:71
Name()
Definition: AlgorithmBase.h:54
boost::shared_ptr< LegacyLoggerInterface > LoggerHandle
Definition: LoggerFwd.h:42
Definition: AlgorithmBase.h:52
AlgorithmInput(const Map &m)
Definition: AlgorithmBase.h:216
boost::shared_ptr< AlgorithmInput > AlgorithmInputHandle
Definition: AlgorithmBase.h:221
Definition: AlgorithmBase.h:296
Definition: LoggerInterface.h:43
AlgorithmInput()
Definition: AlgorithmBase.h:215
Definition: AlgorithmBase.h:224
AlgorithmData(const Map &m)
Definition: AlgorithmBase.h:177
virtual void update_progress(double percent) const
Definition: AlgorithmBase.h:153
AlgoOption()
Definition: AlgorithmBase.h:77
virtual ~AlgorithmFactory()
Definition: AlgorithmBase.h:313
Variable(const Name &name, const Value &value)
Definition: AlgorithmBase.h:102
boost::variant< int, double, std::string, bool, AlgoOption, std::vector< Variable > > Value
Definition: AlgorithmBase.h:99
Definition: AlgorithmBase.h:219
void setUpdaterFunc(UpdaterFunc func)
Definition: AlgorithmBase.h:156
boost::function< void(double)> UpdaterFunc
Definition: AlgorithmBase.h:155
#define SCISHARE
Definition: share.h:39
void setList(const Name &name, const std::vector< boost::shared_ptr< T >> &list)
Definition: AlgorithmBase.h:198
bool operator<(const Name &rhs) const
Definition: AlgorithmBase.h:59
AlgorithmStatusReporter()
Definition: AlgorithmBase.h:144
std::map< Name, std::vector< Datatypes::DatatypeHandle > > Map
Definition: AlgorithmBase.h:175
virtual ~AlgorithmCollaborator()
Definition: AlgorithmBase.h:305
AlgoOption(const std::string &option, const std::set< std::string > &options)
Definition: AlgorithmBase.h:78
std::vector< boost::shared_ptr< T > > getList(const Name &name) const
Definition: AlgorithmBase.h:190
Definition: AlgorithmBase.h:268
virtual void report_start(const std::string &tag) const
Definition: AlgorithmBase.h:150
boost::shared_ptr< T > optionalAlgoInput(boost::optional< boost::shared_ptr< T >> opt)
Definition: AlgorithmBase.h:318
UpdaterFunc getUpdaterFunc() const
Definition: AlgorithmBase.h:157
const char * name[]
Definition: BoostGraphExampleTests.cc:87
Definition: AlgorithmBase.h:123
Definition: HasId.h:40
std::set< std::string > options_
Definition: AlgorithmBase.h:82
Variable AlgorithmParameter
Definition: AlgorithmBase.h:121
std::string name() const
Definition: AlgorithmBase.h:57
SCISHARE bool operator==(const Name &lhs, const Name &rhs)
Definition: AlgorithmBase.cc:269
Variable(const Name &name, const Datatypes::DatatypeHandle &value)
Definition: AlgorithmBase.h:103
std::string name_
Definition: AlgorithmBase.h:64
Definition: AlgorithmBase.h:74
void setTransient(boost::any t)
Definition: AlgorithmBase.h:204
SCISHARE AlgorithmInput makeNullInput()
Definition: AlgorithmBase.cc:279
Definition: AlgorithmBase.h:212
AlgoInputBuilder & operator()(const std::string &name, const std::vector< T > &vec)
Definition: AlgorithmBase.h:278
AlgorithmData()
Definition: AlgorithmBase.h:176
virtual ~AlgorithmInterface()
Definition: AlgorithmBase.h:227
Variable()
Definition: AlgorithmBase.h:101
Definition: AlgorithmBase.h:88
boost::shared_ptr< AlgorithmBase > AlgorithmHandle
Definition: AlgorithmFwd.h:39
Definition: AlgorithmBase.h:310
Definition: AlgorithmBase.h:172
Name AlgorithmParameterName
Definition: AlgorithmBase.h:70
AlgoInputBuilder & operator()(const AlgorithmParameterName &name, const std::vector< T > &vec)
Definition: AlgorithmBase.h:285
virtual void report_end() const
Definition: AlgorithmBase.h:151
SCISHARE std::ostream & operator<<(std::ostream &out, const Name &name)
Definition: AlgorithmBase.cc:274
std::string option_
Definition: AlgorithmBase.h:81
Datatypes::DatatypeHandle data_
Definition: AlgorithmBase.h:107
~AlgorithmStatusReporter()
Definition: AlgorithmBase.h:148
Definition: ProgressReporter.h:54
boost::shared_ptr< Datatype > DatatypeHandle
Definition: DatatypeFwd.h:44
Name name_
Definition: AlgorithmBase.h:105
Name AlgorithmOutputName
Definition: AlgorithmBase.h:72
AlgoInputBuilder & operator()(const AlgorithmParameterName &name, Datatypes::DatatypeHandle d)
Definition: AlgorithmBase.h:273
boost::shared_ptr< AlgorithmOutput > AlgorithmOutputHandle
Definition: AlgorithmBase.h:222
boost::any getTransient() const
Definition: AlgorithmBase.h:205