charm AT lists.siebelschool.illinois.edu
Subject: Charm++ parallel programming system
List archive
[charm] Bug in charm-6.6.1's Unbalanced Tree Search example with HYBRID tree type
Chronological Thread
- From: roger golliver <roger.a.golliver AT gmail.com>
- To: charm AT cs.uiuc.edu
- Subject: [charm] Bug in charm-6.6.1's Unbalanced Tree Search example with HYBRID tree type
- Date: Mon, 9 Feb 2015 12:05:28 -0800
- List-archive: <http://lists.cs.uiuc.edu/pipermail/charm/>
- List-id: CHARM parallel programming system <charm.cs.uiuc.edu>
In charm/examples/charm++/state_space_searchengine/UnbalancedTreeSearch_SE
there is an error that only shows itself on HYBRID trees.
The variable "type" referenced in uts_gennumChildren(), uts_childType()
and createInitialChildren()
needs to be the global variable "type" (in uts.h) which has the tree's type
not the "class UtsStateBase { public: int type; ... }" which is the type of the node.
In the charm-6.6.1 release's file:
charm/examples/charm++/state_space_searchengine/UnbalencedTreeSearch_SE/searchEngineAPI.C
I made the following changes:
For uts_gennumChildren():
switch (::type) { // Tree's type
if (height == 0 && ::type == BIN) { // Tree's type
else if (::type != BALANCED) { // Tree's type
For uts_childType():
switch (::type) { // Tree's type
For createInitialChildren():
root->type = ::type; // Tree's type
You can test this with the T4 problem defined in sample_trees.sh
charm++ now gets the same answer for the T4 problem as
the uts_1.1's sequential, pthread, omp, upc and mpi implementations
Regards,
Roger
#ifndef __SEARCHENGINEAPI__
#define __SEARCHENGINEAPI__
#include "cmipool.h"
/* framework for search engine */
#include "searchEngine.h"
#include "rng/rng.h"
#include "uts.h"
#include <vector>
extern int initial_grainsize;
class UtsStateBase : public StateBase
{
public:
int type; // distribution governing number of children
int height; // depth of this node in the tree
int numChildren; // number of children, -1 => not yet determined
/* for RNG state associated with this node */
struct state_t state;
UtsStateBase()
{
type = -1;
height = -1;
numChildren = -1; // not yet determined
}
void uts_initRoot(int type)
{
this->type = type;
this->height = 0;
this->numChildren = -1; // means not yet determined
rng_init(this->state.state, rootId);
}
int uts_numChildren_bin() {
// distribution is identical everywhere below root
int v = rng_rand(state.state);
double d = rng_toProb(v);
return (d < nonLeafProb) ? nonLeafBF : 0;
}
int uts_numChildren_geo() {
double b_i = b_0;
int depth = height;
int __numChildren, h;
double p, u;
// use shape function to compute target b_i
if (depth > 0){
switch (shape_fn) {
// expected size polynomial in depth
case EXPDEC:
b_i = b_0 * pow((double) depth, -log(b_0)/log((double) gen_mx));
break;
// cyclic tree size
case CYCLIC:
if (depth > 5 * gen_mx){
b_i = 0.0;
break;
}
b_i = pow(b_0,
sin(2.0*3.141592653589793*(double) depth / (double) gen_mx));
break;
// identical distribution at all nodes up to max depth
case FIXED:
b_i = (depth < gen_mx)? b_0 : 0;
break;
// linear decrease in b_i
case LINEAR:
default:
b_i = b_0 * (1.0 - (double)depth / (double) gen_mx);
break;
}
}
// given target b_i, find prob p so expected value of
// // geometric distribution is b_i.
p = 1.0 / (1.0 + b_i);
// get uniform random number on [0,1)
h = rng_rand(state.state);
u = rng_toProb(h);
// max number of children at this cumulative probability
// // (from inverse geometric cumulative density function)
__numChildren = (int) floor(log(1 - u) / log(1 - p));
return __numChildren;
}
void uts_gennumChildren() {
/* Determine the number of children */
switch (::type) { // Tree's type
case BIN:
if (height == 0)
numChildren = (int) floor(b_0);
else
numChildren = uts_numChildren_bin();
break;
case GEO:
numChildren = uts_numChildren_geo();
break;
case HYBRID:
if (height < shiftDepth * gen_mx)
numChildren = uts_numChildren_geo();
else
numChildren = uts_numChildren_bin();
break;
case BALANCED:
if (height < gen_mx)
numChildren = (int) b_0;
break;
default:
CkPrintf("parTreeSearch(): Unknown tree type");
}
// limit number of children
// // only a BIN root can have more than MAXNUMCHILDREN
if (height == 0 && ::type == BIN) { // Tree's type
int rootBF = (int) ceil(b_0);
if (numChildren > rootBF) {
CkPrintf("*** Number of children of root truncated from %d to %d\n",
numChildren, rootBF);
numChildren = rootBF;
}
}
else if (::type != BALANCED) { // Tree's type
if (numChildren > MAXNUMCHILDREN) {
CkPrintf("*** Number of children truncated from %d to %d\n",
numChildren, MAXNUMCHILDREN);
numChildren = MAXNUMCHILDREN;
}
}
}
int uts_childType() {
switch (::type) { // Tree's type
case BIN:
return BIN;
case GEO:
return GEO;
case HYBRID:
if (height < shiftDepth * gen_mx)
return GEO;
else
return BIN;
case BALANCED:
return BALANCED;
default:
CkPrintf("uts_get_childtype(): Unknown tree type");
return -1;
}
}
};
inline void createInitialChildren(Solver *solver)
{
UtsStateBase *root = (UtsStateBase*)solver->registerRootState(sizeof(UtsStateBase), 0, 1);
root->type = ::type; // Tree's type
root->height = 0;
root->numChildren = -1; // means not yet determined
rng_init(root->state.state, rootId);
root->uts_gennumChildren();
if( root->numChildren==0)
solver->reportSolution();
solver->process(root);
}
inline void createChildren( StateBase *_base , Solver* solver, bool parallel)
{
UtsStateBase parent = *((UtsStateBase*)_base);
int childIndex = 0;
int parentHeight = parent.height;
int numChildren, childType;
numChildren = parent.numChildren;
childType = parent.uts_childType();
int i, j;
for (i = 0; i < numChildren; i++) {
UtsStateBase *child = (UtsStateBase*)solver->registerState(sizeof(UtsStateBase), i, numChildren);
child->type = childType;
child->height = parentHeight + 1;
for (j = 0; j < computeGranularity; j++) {
rng_spawn((parent.state).state, (child->state).state, i);
}
child->uts_gennumChildren();
if(child->numChildren==0)
{
solver->reportSolution();
}
if(parallel)
solver->process(child);
}
}
inline double cost( )
{
return 0;
}
double heuristic( )
{
return 0;
}
double bound( int &l )
{
return 0;
}
inline bool isGoal(StateBase *s){
return (((UtsStateBase*)s)->numChildren==0)?true:false;
}
inline bool terminate(StateBase *s){
return (((UtsStateBase*)s)->numChildren==0)?true:false;
}
//Search Engine Option
inline int parallelLevel()
{
return initial_grainsize;
}
inline int searchDepthLimit()
{
return 1;
}
int minimumLevel()
{
return 1;
}
int maximumLevel()
{
return 10;
}
inline void searchDepthChangeNotify( int ) {}
SE_Register(UtsStateBase,createInitialChildren, createChildren, parallelLevel, searchDepthLimit);
/*
void registerSE() {
SE_register(createInitialChildren, createChildren, parallelLevel, searchDepthLimit);
}
*/
#endif
- [charm] Bug in charm-6.6.1's Unbalanced Tree Search example with HYBRID tree type, roger golliver, 02/09/2015
Archive powered by MHonArc 2.6.16.