Zoltan2
Loading...
Searching...
No Matches
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;
96 typedef typename Adapter::base_adapter_t base_adapter_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
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.
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,...
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