Algorithmic changes in lookupParent

This commit is contained in:
Guilhem Lavaux 2010-09-19 10:34:01 +02:00
parent 0ca75f1846
commit 9260208edc
5 changed files with 79 additions and 60 deletions

View file

@ -35,8 +35,8 @@ const char *buildObservedVoids_info_help[] = {
" -h, --help Print help and exit",
" -V, --version Print version and exit",
" -d, --desc=STRING The description file name for the voids (jozov \n generated)",
" -a, --adj=STRING Adjacent file name (jozov generated)",
" -v, --void=STRING Void/zone bind filename (jozov generated)",
" -p, --partzone=STRING Particles/Zones bind file",
" -v, --zonevoid=STRING Void/zone bind file (jozov generated)",
" -m, --minProba=DOUBLE Minimal probability to accept (default=`0.0')",
" --densityThreshold=DOUBLE Density threshold to consider a stable void \n (default=`-0.8')",
" -b, --ramsesDir=STRING Ramses base output directory",
@ -100,8 +100,8 @@ void clear_given (struct buildObservedVoids_info *args_info)
args_info->help_given = 0 ;
args_info->version_given = 0 ;
args_info->desc_given = 0 ;
args_info->adj_given = 0 ;
args_info->void_given = 0 ;
args_info->partzone_given = 0 ;
args_info->zonevoid_given = 0 ;
args_info->minProba_given = 0 ;
args_info->densityThreshold_given = 0 ;
args_info->ramsesDir_given = 0 ;
@ -118,10 +118,10 @@ void clear_args (struct buildObservedVoids_info *args_info)
FIX_UNUSED (args_info);
args_info->desc_arg = NULL;
args_info->desc_orig = NULL;
args_info->adj_arg = NULL;
args_info->adj_orig = NULL;
args_info->void_arg = NULL;
args_info->void_orig = NULL;
args_info->partzone_arg = NULL;
args_info->partzone_orig = NULL;
args_info->zonevoid_arg = NULL;
args_info->zonevoid_orig = NULL;
args_info->minProba_arg = 0.0;
args_info->minProba_orig = NULL;
args_info->densityThreshold_arg = -0.8;
@ -147,8 +147,8 @@ void init_args_info(struct buildObservedVoids_info *args_info)
args_info->help_help = buildObservedVoids_info_help[0] ;
args_info->version_help = buildObservedVoids_info_help[1] ;
args_info->desc_help = buildObservedVoids_info_help[2] ;
args_info->adj_help = buildObservedVoids_info_help[3] ;
args_info->void_help = buildObservedVoids_info_help[4] ;
args_info->partzone_help = buildObservedVoids_info_help[3] ;
args_info->zonevoid_help = buildObservedVoids_info_help[4] ;
args_info->minProba_help = buildObservedVoids_info_help[5] ;
args_info->densityThreshold_help = buildObservedVoids_info_help[6] ;
args_info->ramsesDir_help = buildObservedVoids_info_help[7] ;
@ -239,10 +239,10 @@ buildObservedVoids_conf_release (struct buildObservedVoids_info *args_info)
free_string_field (&(args_info->desc_arg));
free_string_field (&(args_info->desc_orig));
free_string_field (&(args_info->adj_arg));
free_string_field (&(args_info->adj_orig));
free_string_field (&(args_info->void_arg));
free_string_field (&(args_info->void_orig));
free_string_field (&(args_info->partzone_arg));
free_string_field (&(args_info->partzone_orig));
free_string_field (&(args_info->zonevoid_arg));
free_string_field (&(args_info->zonevoid_orig));
free_string_field (&(args_info->minProba_orig));
free_string_field (&(args_info->densityThreshold_orig));
free_string_field (&(args_info->ramsesDir_arg));
@ -290,10 +290,10 @@ buildObservedVoids_conf_dump(FILE *outfile, struct buildObservedVoids_info *args
write_into_file(outfile, "version", 0, 0 );
if (args_info->desc_given)
write_into_file(outfile, "desc", args_info->desc_orig, 0);
if (args_info->adj_given)
write_into_file(outfile, "adj", args_info->adj_orig, 0);
if (args_info->void_given)
write_into_file(outfile, "void", args_info->void_orig, 0);
if (args_info->partzone_given)
write_into_file(outfile, "partzone", args_info->partzone_orig, 0);
if (args_info->zonevoid_given)
write_into_file(outfile, "zonevoid", args_info->zonevoid_orig, 0);
if (args_info->minProba_given)
write_into_file(outfile, "minProba", args_info->minProba_orig, 0);
if (args_info->densityThreshold_given)
@ -432,15 +432,15 @@ buildObservedVoids_conf_required2 (struct buildObservedVoids_info *args_info, co
error = 1;
}
if (! args_info->adj_given)
if (! args_info->partzone_given)
{
fprintf (stderr, "%s: '--adj' ('-a') option required%s\n", prog_name, (additional_error ? additional_error : ""));
fprintf (stderr, "%s: '--partzone' ('-p') option required%s\n", prog_name, (additional_error ? additional_error : ""));
error = 1;
}
if (! args_info->void_given)
if (! args_info->zonevoid_given)
{
fprintf (stderr, "%s: '--void' ('-v') option required%s\n", prog_name, (additional_error ? additional_error : ""));
fprintf (stderr, "%s: '--zonevoid' ('-v') option required%s\n", prog_name, (additional_error ? additional_error : ""));
error = 1;
}
@ -611,8 +611,8 @@ buildObservedVoids_conf_internal (
{ "help", 0, NULL, 'h' },
{ "version", 0, NULL, 'V' },
{ "desc", 1, NULL, 'd' },
{ "adj", 1, NULL, 'a' },
{ "void", 1, NULL, 'v' },
{ "partzone", 1, NULL, 'p' },
{ "zonevoid", 1, NULL, 'v' },
{ "minProba", 1, NULL, 'm' },
{ "densityThreshold", 1, NULL, 0 },
{ "ramsesDir", 1, NULL, 'b' },
@ -624,7 +624,7 @@ buildObservedVoids_conf_internal (
{ 0, 0, 0, 0 }
};
c = getopt_long (argc, argv, "hVd:a:v:m:b:r:f:o:g:q", long_options, &option_index);
c = getopt_long (argc, argv, "hVd:p:v:m:b:r:f:o:g:q", long_options, &option_index);
if (c == -1) break; /* Exit from `while (1)' loop. */
@ -652,26 +652,26 @@ buildObservedVoids_conf_internal (
goto failure;
break;
case 'a': /* Adjacent file name (jozov generated). */
case 'p': /* Particles/Zones bind file. */
if (update_arg( (void *)&(args_info->adj_arg),
&(args_info->adj_orig), &(args_info->adj_given),
&(local_args_info.adj_given), optarg, 0, 0, ARG_STRING,
if (update_arg( (void *)&(args_info->partzone_arg),
&(args_info->partzone_orig), &(args_info->partzone_given),
&(local_args_info.partzone_given), optarg, 0, 0, ARG_STRING,
check_ambiguity, override, 0, 0,
"adj", 'a',
"partzone", 'p',
additional_error))
goto failure;
break;
case 'v': /* Void/zone bind filename (jozov generated). */
case 'v': /* Void/zone bind file (jozov generated). */
if (update_arg( (void *)&(args_info->void_arg),
&(args_info->void_orig), &(args_info->void_given),
&(local_args_info.void_given), optarg, 0, 0, ARG_STRING,
if (update_arg( (void *)&(args_info->zonevoid_arg),
&(args_info->zonevoid_orig), &(args_info->zonevoid_given),
&(local_args_info.zonevoid_given), optarg, 0, 0, ARG_STRING,
check_ambiguity, override, 0, 0,
"void", 'v',
"zonevoid", 'v',
additional_error))
goto failure;

View file

@ -42,12 +42,12 @@ struct buildObservedVoids_info
char * desc_arg; /**< @brief The description file name for the voids (jozov generated). */
char * desc_orig; /**< @brief The description file name for the voids (jozov generated) original value given at command line. */
const char *desc_help; /**< @brief The description file name for the voids (jozov generated) help description. */
char * adj_arg; /**< @brief Adjacent file name (jozov generated). */
char * adj_orig; /**< @brief Adjacent file name (jozov generated) original value given at command line. */
const char *adj_help; /**< @brief Adjacent file name (jozov generated) help description. */
char * void_arg; /**< @brief Void/zone bind filename (jozov generated). */
char * void_orig; /**< @brief Void/zone bind filename (jozov generated) original value given at command line. */
const char *void_help; /**< @brief Void/zone bind filename (jozov generated) help description. */
char * partzone_arg; /**< @brief Particles/Zones bind file. */
char * partzone_orig; /**< @brief Particles/Zones bind file original value given at command line. */
const char *partzone_help; /**< @brief Particles/Zones bind file help description. */
char * zonevoid_arg; /**< @brief Void/zone bind file (jozov generated). */
char * zonevoid_orig; /**< @brief Void/zone bind file (jozov generated) original value given at command line. */
const char *zonevoid_help; /**< @brief Void/zone bind file (jozov generated) help description. */
double minProba_arg; /**< @brief Minimal probability to accept (default='0.0'). */
char * minProba_orig; /**< @brief Minimal probability to accept original value given at command line. */
const char *minProba_help; /**< @brief Minimal probability to accept help description. */
@ -75,8 +75,8 @@ struct buildObservedVoids_info
unsigned int help_given ; /**< @brief Whether help was given. */
unsigned int version_given ; /**< @brief Whether version was given. */
unsigned int desc_given ; /**< @brief Whether desc was given. */
unsigned int adj_given ; /**< @brief Whether adj was given. */
unsigned int void_given ; /**< @brief Whether void was given. */
unsigned int partzone_given ; /**< @brief Whether partzone was given. */
unsigned int zonevoid_given ; /**< @brief Whether zonevoid was given. */
unsigned int minProba_given ; /**< @brief Whether minProba was given. */
unsigned int densityThreshold_given ; /**< @brief Whether densityThreshold was given. */
unsigned int ramsesDir_given ; /**< @brief Whether ramsesDir was given. */

View file

@ -4,6 +4,7 @@
#include <vector>
#include <cstdlib>
#include <sstream>
#include <algorithm>
#include "loadZobov.hpp"
using namespace std;
@ -70,7 +71,8 @@ bool loadZobov(const char *descName, const char *adjName, const char *volName, Z
volFile.read((char *)zId, sizeof(int)*numZinV);
for (int k = 0; k < numZinV; k++)
z.allVoids[v].zId[k] = &z.allZones[zId[k]];
z.allVoids[v].zId[k] = zId[k];
std::sort(&z.allVoids[v].zId[0], &z.allVoids[v].zId[numZinV]);
delete[] zId;
}
@ -114,7 +116,10 @@ bool loadZobov(const char *descName, const char *adjName, const char *volName, Z
// Sanity check
int actualNumber = 0;
for (int j = 0; j < z.allVoids[volId].zId.size(); j++)
actualNumber += z.allVoids[volId].zId[j]->pId.size();
{
int zzid = z.allVoids[volId].zId[j];
actualNumber += z.allZones[zzid].pId.size();
}
if (actualNumber != numInVoid)
{

View file

@ -10,7 +10,7 @@ struct ZobovZone
struct ZobovVoid
{
std::vector<ZobovZone *> zId;
std::vector<int> zId;
float proba;
int numParticles, coreParticle;
float volume;

View file

@ -25,24 +25,26 @@ protected:
public:
typedef std::list<VoidNode *> VoidList;
int lookupParent(int voidId)
int lookupParent(int voidId, const std::vector<std::list<int> >& voids_for_zones)
{
std::set<ZobovZone *> sref;
std::set<int> sref;
sref.insert(zobov.allVoids[voidId].zId.begin(), zobov.allVoids[voidId].zId.end());
std::vector<ZobovZone *> sout(sref.size());
std::vector<int> sout(sref.size());
int lastSize = 0x7fffffff;
int goodParent = voidId;
const std::list<int>& candidateList = voids_for_zones[*zobov.allVoids[voidId].zId.begin()];
std::list<int>::const_iterator iter_candidate = candidateList.begin();
// Voids are sorted according to volume
for (int i = voidId-1; i >= 0; i--)
std::cout << "candidate list size is " << candidateList.size() << std::endl;
while (iter_candidate != candidateList.end())
{
std::set<ZobovZone *> s1;
int i = *iter_candidate;
std::set<int> s1;
int counter = 0;
s1.insert(zobov.allVoids[i].zId.begin(), zobov.allVoids[i].zId.end());
for (std::set<ZobovZone *>::iterator iter = s1.begin(), iter2 = sref.begin();
for (std::set<int>::iterator iter = s1.begin(), iter2 = sref.begin();
iter != s1.end() && iter2 != sref.end();
++iter)
{
@ -59,7 +61,9 @@ public:
{
return i;
}
++iter_candidate;
}
std::cout << "Failure to lookup parent" << std::endl;
return -1;
}
@ -67,7 +71,17 @@ public:
: zobov(rep)
{
totalNumNodes = rep.allVoids.size();
std::vector<std::list<int> > voids_for_zones;
voids_for_zones.resize(rep.allZones.size());
for (int i = 0; i < rep.allVoids.size(); i++)
{
ZobovVoid& v = rep.allVoids[i];
for (int j = 0; j < v.zId.size(); j++)
voids_for_zones[v.zId[j]].push_back(i);
}
nodes = new VoidNode[totalNumNodes];
for (int i = 0; i < rep.allVoids.size(); i++)
@ -78,13 +92,13 @@ public:
}
std::cout << "Linking voids together..." << std::endl;
double volMin = 4*M_PI/3*pow(4.*512/500.,3);
double volMin = 4*M_PI/3*pow(50.*512/500.,3);
int inserted = 0;
for (int i = rep.allVoids.size()-1; i>=0;i--)
{
if (rep.allVoids[i].volume < volMin) continue;
int p = lookupParent(i);
int p = lookupParent(i, voids_for_zones);
std::cout << i << std::endl;
@ -101,7 +115,7 @@ public:
}
rootNode = 0;
for (int i = inserted; i < totalNumNodes; i++)
for (int i = 0; i < inserted; i++)
if (nodes[i].parent == 0)
{
if (rootNode != 0)
@ -133,11 +147,11 @@ public:
template<typename T>
void walkNode(VoidNode *node, T& traverse)
{
VoidList::iterator i;
if (!traverse(node))
return;
VoidList::iterator i = node->children.begin();
while (i != node->children.end())
{
walkNode(*i, traverse);