Zoltan2
Zoltan2_Problem.hpp
Go to the documentation of this file.
1 // @HEADER
2 //
3 // ***********************************************************************
4 //
5 // Zoltan2: A package of combinatorial algorithms for scientific computing
6 // Copyright 2012 Sandia Corporation
7 //
8 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
9 // the U.S. Government retains certain rights in this software.
10 //
11 // Redistribution and use in source and binary forms, with or without
12 // modification, are permitted provided that the following conditions are
13 // met:
14 //
15 // 1. Redistributions of source code must retain the above copyright
16 // notice, this list of conditions and the following disclaimer.
17 //
18 // 2. Redistributions in binary form must reproduce the above copyright
19 // notice, this list of conditions and the following disclaimer in the
20 // documentation and/or other materials provided with the distribution.
21 //
22 // 3. Neither the name of the Corporation nor the names of the
23 // contributors may be used to endorse or promote products derived from
24 // this software without specific prior written permission.
25 //
26 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
27 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
30 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 //
38 // Questions? Contact Karen Devine (kddevin@sandia.gov)
39 // Erik Boman (egboman@sandia.gov)
40 // Siva Rajamanickam (srajama@sandia.gov)
41 //
42 // ***********************************************************************
43 //
44 // @HEADER
45 
50 #ifndef _ZOLTAN2_PROBLEM_HPP_
51 #define _ZOLTAN2_PROBLEM_HPP_
52 
53 #include <Zoltan2_Standards.hpp>
54 #include <Zoltan2_GraphModel.hpp>
57 #include <Zoltan2_Algorithm.hpp>
58 #include <Zoltan2_TimerManager.hpp>
59 #include <Teuchos_StandardParameterEntryValidators.hpp>
60 #include <Teuchos_Tuple.hpp>
62 
63 namespace Zoltan2{
64 
67 // problem types.
68 
69 class ProblemRoot {
70  public:
71  virtual ~ProblemRoot() {} // required virtual declaration
72 
73  // could consider storing comm_ here...
74  // this accessor means we can get comm without template upcast first
75  virtual RCP<const Comm<int> > getComm() = 0;
76 
79  virtual void solve(bool updateInputData = true) = 0;
80 };
81 
85 
86 template<typename Adapter>
87 class Problem : public ProblemRoot {
88 public:
89 
92  Problem(const Adapter *input, ParameterList *params,
93  const RCP<const Comm<int> > &comm):
94  inputAdapter_(rcp(input,false)),
95  baseInputAdapter_(rcp(dynamic_cast<const base_adapter_t *>(input), false)),
96  graphModel_(),
98  baseModel_(),
99  algorithm_(),
100  params_(),
101  comm_(),
102  env_(rcp(new Environment(*params, comm))),
103  envConst_(rcp_const_cast<const Environment>(env_)),
104  timer_()
105  {
106  comm_ = comm->duplicate();
107  setupProblemEnvironment(params);
108  }
109 
112  virtual ~Problem() {};
113 
116  RCP<const Comm<int> > getComm() { return comm_; }
117 
120  void resetParameters(ParameterList *params);
121 
138 #ifdef Z2_OMIT_ALL_ERROR_CHECKING
139  void printTimers() const {return;}
140 #else
141  void printTimers() const
142  {
143  if (!timer_.is_null())
144  timer_->printAndResetToZero();
145  }
146 #endif
147 
148  // Set up validators which are general to all probloems
149  static void getValidParameters(ParameterList & pl)
150  {
151  // bool parameter
152  pl.set("compute_metrics", false, "Compute metrics after computing solution",
154 
155  RCP<Teuchos::StringValidator> hypergraph_model_type_Validator =
156  Teuchos::rcp( new Teuchos::StringValidator(
157  Teuchos::tuple<std::string>( "traditional", "ghosting" )));
158  pl.set("hypergraph_model_type", "traditional", "construction type when "
159  "creating a hypergraph model", hypergraph_model_type_Validator);
160 
161  // bool parameter
162  pl.set("subset_graph", false, "If \"true\", the graph input is to be "
163  "subsetted. If a vertex neighbor is not a valid vertex, it will be "
164  "omitted from the pList. Otherwise, an invalid neighbor identifier "
165  "is considered an error.", Environment::getBoolValidator());
166 
167  RCP<Teuchos::StringValidator> symmetrize_input_Validator = Teuchos::rcp(
168  new Teuchos::StringValidator(
169  Teuchos::tuple<std::string>( "no", "transpose", "bipartite" )));
170  pl.set("symmetrize_input", "no", "Symmetrize input prior to pList. "
171  "If \"transpose\", symmetrize A by computing A plus ATranspose. "
172  "If \"bipartite\", A becomes [[0 A][ATranspose 0]].",
173  symmetrize_input_Validator);
174 
175  // these sublists are used for parameters which do not get validated
176  pl.sublist("zoltan_parameters");
177  pl.sublist("parma_parameters");
178  }
179 
183  const RCP<const Environment> & getEnvironment() const
184  {
185  return this->envConst_;
186  }
187 
188 protected:
189 
190  // The Problem is templated on the input adapter. We interact
191  // with the input adapter through the base class interface.
192  // The Model objects are also templated on the input adapter and
193  // are explicitly instantiated for each base input type (vector,
194  // graph, matrix, mesh, identifier list, and coordinate list).
195 
197 
198  RCP<const Adapter> inputAdapter_;
199  RCP<const base_adapter_t> baseInputAdapter_;
200 
201  RCP<GraphModel<base_adapter_t> > graphModel_;
202  RCP<IdentifierModel<base_adapter_t> > identifierModel_;
203  RCP<CoordinateModel<base_adapter_t> > coordinateModel_;
204 
205  // Algorithms are passed a base model class, and query
206  // the model through the base class interface (graph, hypergraph,
207  // identifiers, or coordinates).
208 
209  RCP<const Model<base_adapter_t> > baseModel_;
210 
211  // Every problem needs an algorithm, right?
212  RCP<Algorithm<Adapter> > algorithm_;
213 
214  RCP<ParameterList> params_;
215  RCP<const Comm<int> > comm_;
216 
217  // The Problem has a non const Environment object. This is because
218  // the Problem creates the Environment and may update it before
219  // finally calling the algorithm.
220 
221  RCP<Environment> env_;
222 
223  // The Problem needs a const version of the Environment. No other
224  // methods are permitted to change the Environment.
225 
226  RCP<const Environment> envConst_;
227 
228  // If the user requested timing, this is the TimerManager.
229 
230  RCP<TimerManager> timer_;
231 
232 private:
233  void setupProblemEnvironment(ParameterList *pl);
234 
235 };
236 
237 template <typename Adapter>
238  void Problem<Adapter>::setupProblemEnvironment(ParameterList * /* params */)
239 {
240  ParameterList &processedParameters = env_->getParametersNonConst();
241  params_ = rcp<ParameterList>(&processedParameters, false);
242 
243 #ifndef Z2_OMIT_ALL_PROFILING
244  ParameterList pl = *params_;
245 
246  // Give a timer to the Environment if requested.
247  bool haveType=false, haveStream=false, haveFile=false;
248  int choice = MACRO_TIMERS; // default timer type
249 
250  const Teuchos::ParameterEntry *pe = pl.getEntryPtr("timer_type");
251 
252  if (pe){
253  choice = pe->getValue<int>(&choice);
254  haveType = true;
255  }
256 
257  TimerType tt = static_cast<TimerType>(choice);
258 
259  std::string fname;
260  pe = pl.getEntryPtr("timer_output_file");
261  if (pe){
262  haveFile = true;
263  fname = pe->getValue<std::string>(&fname);
264  std::ofstream *dbgFile = new std::ofstream;
265  if (comm_->getRank()==0){
266  // Using Teuchos::TimeMonitor, node 0 prints global timing info.
267  try{
268  dbgFile->open(fname.c_str(), std::ios::out|std::ios::trunc);
269  }
270  catch(std::exception &e){
271  throw std::runtime_error(e.what());
272  }
273  }
274  timer_ = rcp(new TimerManager(comm_, dbgFile, tt));
275  }
276  else{
277  choice = COUT_STREAM; // default output stream
278  pe = pl.getEntryPtr("timer_output_stream");
279  if (pe){
280  choice = pe->getValue<int>(&choice);
281  haveStream = true;
282  }
283 
284  OSType outputStream = static_cast<OSType>(choice);
285 
286  if (haveStream || haveType){
287  if (outputStream == COUT_STREAM)
288  timer_ = rcp(new TimerManager(comm_, &std::cout, tt));
289  else if (outputStream == CERR_STREAM)
290  timer_ = rcp(new TimerManager(comm_, &std::cerr, tt));
291  else if (outputStream == NULL_STREAM){
292  std::ofstream *of = NULL;
293  timer_ = rcp(new TimerManager(comm_, of, tt));
294  }
295  }
296  }
297 
298  if (haveType || haveStream || haveFile)
299  env_->setTimer(timer_);
300 
301 #endif
302 
303 }
304 
305 template <typename Adapter>
306  void Problem<Adapter>::resetParameters(ParameterList *params)
307 {
308  env_->resetParameters(*params);
309  setupProblemEnvironment(params);
310 
311  // We assume the timing output parameters have not changed,
312  // and carry on with the same timer.
313 
314  if (!timer_.is_null())
315  env_->setTimer(timer_);
316 }
317 
318 } // namespace Zoltan2
319 
320 #endif
Defines the CoordinateModel classes.
Defines the GraphModel interface.
Defines the IdentifierModel interface.
Define IntegerRangeList validator.
Gathering definitions used in software development.
Declarations for TimerManager.
The user parameters, debug, timing and memory profiling output objects, and error checking methods.
static RCP< Teuchos::BoolParameterEntryValidator > getBoolValidator()
Exists to make setting up validators less cluttered.
ProblemRoot allows ptr storage and safe dynamic_cast of all.
virtual RCP< const Comm< int > > getComm()=0
virtual void solve(bool updateInputData=true)=0
Method that creates a solution.
Problem base class from which other classes (PartitioningProblem, ColoringProblem,...
const RCP< const Environment > & getEnvironment() const
Get the current Environment. Useful for testing.
RCP< const Environment > envConst_
RCP< IdentifierModel< base_adapter_t > > identifierModel_
void resetParameters(ParameterList *params)
Reset the list of parameters.
RCP< const Adapter > inputAdapter_
RCP< Environment > env_
Adapter::base_adapter_t base_adapter_t
virtual ~Problem()
Destructor.
RCP< TimerManager > timer_
RCP< const base_adapter_t > baseInputAdapter_
Problem(const Adapter *input, ParameterList *params, const RCP< const Comm< int > > &comm)
Constructor where Teuchos communicator is specified.
RCP< const Model< base_adapter_t > > baseModel_
void printTimers() const
Return the communicator passed to the problem.
RCP< ParameterList > params_
static void getValidParameters(ParameterList &pl)
RCP< GraphModel< base_adapter_t > > graphModel_
RCP< const Comm< int > > comm_
RCP< CoordinateModel< base_adapter_t > > coordinateModel_
RCP< Algorithm< Adapter > > algorithm_
RCP< const Comm< int > > getComm()
Return the communicator used by the problem.
Zoltan2::BaseAdapter< userTypes_t > base_adapter_t
TimerType
The type of timers which should be active.
@ MACRO_TIMERS
Time an algorithm (or other entity) as a whole.
OSType
Output stream types.
@ CERR_STREAM
std::cerr
@ NULL_STREAM
/dev/null: do actions but don't output results
@ COUT_STREAM
std::cout