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
60#include <string>
61
62#include <bitset>
63
64namespace Zoltan2{
65
67
87template<typename Adapter>
88class ColoringProblem : public Problem<Adapter>
89{
90public:
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
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
174private:
175 void createColoringProblem();
176
177 RCP<ColoringSolution<Adapter> > solution_;
178};
179
180
182template <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
248template <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
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
Zoltan2::BasicUserTypes< zscalar_t, zlno_t, zgno_t > user_t
Definition: Metric.cpp:74
Defines the ColoringSolution class.
#define Z2_FORWARD_EXCEPTIONS
Forward an exception back through call stack.
#define __func__zoltan2__
Defines the GraphModel interface.
Defines the Problem base class.
Gathering definitions used in software development.
#define HELLO
void color(const RCP< ColoringSolution< Adapter > > &solution)
Coloring method.
void color(const RCP< ColoringSolution< Adapter > > &solution)
Coloring method.
void color(const RCP< ColoringSolution< Adapter > > &solution)
Coloring method.
ColoringProblem sets up coloring problems for the user.
Adapter::base_adapter_t base_adapter_t
void solve(bool updateInputData=true)
Direct the problem to create a solution.
ColoringProblem(Adapter *A, ParameterList *p, const Teuchos::RCP< const Teuchos::Comm< int > > &comm)
Constructor that uses a Teuchos::Comm.
virtual ~ColoringProblem()
Destructor.
static void getValidParameters(ParameterList &pl)
Set up validators specific to this Problem.
ColoringSolution< Adapter > * getSolution()
Get the solution to the problem.
ColoringProblem(Adapter *A, ParameterList *p)
Constructor that uses a default communicator.
The class containing coloring solution.
static RCP< Teuchos::BoolParameterEntryValidator > getBoolValidator()
Exists to make setting up validators less cluttered.
static RCP< Teuchos::AnyNumberParameterEntryValidator > getAnyIntValidator()
Exists to make setting up validators less cluttered.
GraphModel defines the interface required for graph models.
Problem base class from which other classes (PartitioningProblem, ColoringProblem,...
map_t::local_ordinal_type lno_t
Definition: mapRemotes.cpp:17
map_t::global_ordinal_type gno_t
Definition: mapRemotes.cpp:18
Zoltan2::BaseAdapter< userTypes_t > base_adapter_t
Created by mbenlioglu on Aug 31, 2020.
ModelType
An identifier for the general type of model.
@ IdentifierModelType
@ HypergraphModelType
@ CoordinateModelType
@ REMOVE_SELF_EDGES
algorithm requires no self edges
@ BUILD_LOCAL_GRAPH
model represents graph within only one rank