Zoltan2
Zoltan2_ColoringProblem.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_COLORINGPROBLEM_HPP_
51 #define _ZOLTAN2_COLORINGPROBLEM_HPP_
52 
53 #include <Zoltan2_Standards.hpp>
54 
55 #include <Zoltan2_Problem.hpp>
58 
59 #include <Zoltan2_GraphModel.hpp>
60 #include <string>
61 
62 #include <bitset>
63 
64 namespace Zoltan2{
65 
67 
87 template<typename Adapter>
88 class ColoringProblem : public Problem<Adapter>
89 {
90 public:
91 
92  typedef typename Adapter::scalar_t scalar_t;
93  typedef typename Adapter::gno_t gno_t;
94  typedef typename Adapter::lno_t lno_t;
95  typedef typename Adapter::user_t user_t;
97 
98 #ifdef HAVE_ZOLTAN2_MPI
99  typedef Teuchos::OpaqueWrapper<MPI_Comm> mpiWrapper_t;
100 #endif
101 
104  virtual ~ColoringProblem() {};
105 
108  ColoringProblem(Adapter *A, ParameterList *p,
109  const Teuchos::RCP<const Teuchos::Comm<int> > &comm) :
110  Problem<Adapter>(A, p, comm)
111  {
112  HELLO;
113  createColoringProblem();
114  };
115 
116 #ifdef HAVE_ZOLTAN2_MPI
117 
119  ColoringProblem(Adapter *A, ParameterList *p, MPI_Comm mpicomm) :
120  ColoringProblem(A, p,
121  rcp<const Comm<int> >(new Teuchos::MpiComm<int>(
122  Teuchos::opaqueWrapper(mpicomm))))
123  {}
124 #endif
125 
128  ColoringProblem(Adapter *A, ParameterList *p) :
129  ColoringProblem(A, p, Tpetra::getDefaultComm())
130  {}
131 
134  static void getValidParameters(ParameterList & pl)
135  {
136  RCP<Teuchos::StringValidator> color_method_Validator = Teuchos::rcp(
137  new Teuchos::StringValidator(
138  Teuchos::tuple<std::string>( "SerialGreedy","D1","D1-2GL","D2","PD2" )));
139  pl.set("color_method", "SerialGreedy", "coloring algorithm",
140  color_method_Validator);
141  pl.set("verbose", false, "print all output", Environment::getBoolValidator());
142  pl.set("timing", false, "print timing data", Environment::getBoolValidator());
143  pl.set("serial_threshold",0,"vertices to recolor in serial",Environment::getAnyIntValidator());
144  pl.set("recolor_degrees",true,"recolor based on vertex degrees",Environment::getBoolValidator());
145  }
146 
148  //
149  // \param updateInputData If true this indicates that either
150  // this is the first attempt at solution, or that we
151  // are computing a new solution and the input data has
152  // changed since the previous solution was computed.
153  // If false, this indicates that we are computing a
154  // new solution using the same input data was used for
155  // the previous solution, even though the parameters
156  // may have been changed.
157  //
158  // For the sake of performance, we ask the caller to set \c updateInputData
159  // to false if he/she is computing a new solution using the same input data,
160  // but different problem parameters, than that which was used to compute
161  // the most recent solution.
162 
163  void solve(bool updateInputData=true);
164 
166  //
167  // \return a reference to the solution to the most recent solve().
168 
170  // Get the raw ptr from the rcp
171  return solution_.getRawPtr();
172  };
173 
174 private:
175  void createColoringProblem();
176 
177  RCP<ColoringSolution<Adapter> > solution_;
178 };
179 
180 
182 template <typename Adapter>
184 {
185  HELLO;
186 
187  size_t nVtx = this->baseModel_->getLocalNumObjects();
188 
189  try
190  {
191  this->solution_ = rcp(new ColoringSolution<Adapter>(nVtx));
192  }
194 
195  // Determine which algorithm to use based on defaults and parameters.
196  // Need some exception handling here, too.
197 
198  std::string method = this->params_->template get<std::string>("color_method", "SerialGreedy");
199 
200  try
201  {
202  // TODO: Ignore case
203  if (method.compare("SerialGreedy") == 0)
204  {
205  AlgSerialGreedy<Adapter> alg(this->graphModel_, this->params_,
206  this->env_, this->comm_);
207  alg.color(this->solution_);
208  }
209  else if (method.compare("D1") == 0)
210  {
211  AlgDistance1<Adapter> alg(this->inputAdapter_, this->params_,
212  this->env_, this->comm_);
213  alg.color(this->solution_);
214  }
215  else if (method.compare("D1-2GL") == 0)
216  {
217  AlgDistance1TwoGhostLayer<Adapter> alg(this->inputAdapter_,this->params_,
218  this->env_, this->comm_);
219  alg.color(this->solution_);
220  } else if(method.compare("D2") == 0)
221  {
222  AlgDistance2<Adapter> alg(this->inputAdapter_, this->params_,
223  this->env_, this->comm_);
224  alg.color(this->solution_);
225  } else if (method.compare("PD2") == 0)
226  {
227  AlgPartialDistance2<Adapter> alg(this->inputAdapter_, this->params_,
228  this->env_, this->comm_);
229  alg.color(this->solution_);
230  }
231  }
233 }
234 
236 //template <typename Adapter>
237 //void ColoringProblem<Adapter>::redistribute()
238 //{
239 // HELLO;
240 //}
241 
244 // Method with common functionality for creating a ColoringProblem.
245 // Individual constructors do appropriate conversions of input, etc.
246 // This method does everything that all constructors must do.
247 
248 template <typename Adapter>
250 {
251  HELLO;
252  using Teuchos::ParameterList;
253 
254 // std::cout << __func__zoltan2__ << " input adapter type "
255 // << this->inputAdapter_->inputAdapterType() << " "
256 // << this->inputAdapter_->inputAdapterName() << std::endl;
257 
258  // Create a copy of the user's communicator.
259 
260  // Only graph model supported.
261  // TODO: Allow hypergraph later?
262 
263  ModelType modelType = GraphModelType;
264 
265  // Select Model based on parameters and InputAdapter type
266 
267  std::bitset<NUM_MODEL_FLAGS> graphFlags;
268  //std::bitset<NUM_MODEL_FLAGS> idFlags;
269 
270  switch (modelType) {
271 
272  case GraphModelType:
273  graphFlags.set(REMOVE_SELF_EDGES);
274  graphFlags.set(BUILD_LOCAL_GRAPH);
275  this->graphModel_ = rcp(new GraphModel<base_adapter_t>(
276  this->baseInputAdapter_, this->envConst_, this->comm_, graphFlags));
277 
278  this->baseModel_ = rcp_implicit_cast<const Model<base_adapter_t> >(
279  this->graphModel_);
280 
281  break;
282 
283 
284  case IdentifierModelType:
285  case HypergraphModelType:
286  case CoordinateModelType:
287  std::cout << __func__zoltan2__ << " Model type " << modelType
288  << " not yet supported." << std::endl;
289  break;
290 
291  default:
292  std::cout << __func__zoltan2__ << " Invalid model" << modelType
293  << std::endl;
294  break;
295  }
296 }
297 } //namespace Zoltan2
298 
299 #endif
#define HELLO
Zoltan2::BaseAdapter< userTypes_t > base_adapter_t
ColoringProblem(Adapter *A, ParameterList *p, const Teuchos::RCP< const Teuchos::Comm< int > > &comm)
Constructor that uses a Teuchos::Comm.
Created by mbenlioglu on Aug 31, 2020.
ColoringProblem sets up coloring problems for the user.
ModelType
An identifier for the general type of model.
#define Z2_FORWARD_EXCEPTIONS
Forward an exception back through call stack.
static RCP< Teuchos::BoolParameterEntryValidator > getBoolValidator()
Exists to make setting up validators less cluttered.
void solve(bool updateInputData=true)
Direct the problem to create a solution.
ColoringSolution< Adapter > * getSolution()
Get the solution to the problem.
map_t::global_ordinal_type gno_t
Definition: mapRemotes.cpp:18
Adapter::base_adapter_t base_adapter_t
void color(const RCP< ColoringSolution< Adapter > > &solution)
Coloring method.
algorithm requires no self edges
void color(const RCP< ColoringSolution< Adapter > > &solution)
Coloring method.
void color(const RCP< ColoringSolution< Adapter > > &solution)
Coloring method.
Problem base class from which other classes (PartitioningProblem, ColoringProblem, OrderingProblem, MatchingProblem, etc.) derive.
Defines the Problem base class.
map_t::local_ordinal_type lno_t
Definition: mapRemotes.cpp:17
static RCP< Teuchos::AnyNumberParameterEntryValidator > getAnyIntValidator()
Exists to make setting up validators less cluttered.
static void getValidParameters(ParameterList &pl)
Set up validators specific to this Problem.
GraphModel defines the interface required for graph models.
Gathering definitions used in software development.
The base class for all model classes.
Defines the ColoringSolution class.
ColoringProblem(Adapter *A, ParameterList *p)
Constructor that uses a default communicator.
Defines the GraphModel interface.
model represents graph within only one rank
#define __func__zoltan2__
virtual ~ColoringProblem()
Destructor.
The class containing coloring solution.
Zoltan2::BasicUserTypes< zscalar_t, zlno_t, zgno_t > user_t
Definition: Metric.cpp:74