From 9260208edc6f7d56c1d81c2751a389a38a925469 Mon Sep 17 00:00:00 2001 From: Guilhem Lavaux Date: Sun, 19 Sep 2010 10:34:01 +0200 Subject: [PATCH] Algorithmic changes in lookupParent --- mytools/buildObservedVoids_conf.c | 70 +++++++++++++++---------------- mytools/buildObservedVoids_conf.h | 16 +++---- mytools/loadZobov.cpp | 9 +++- mytools/loadZobov.hpp | 2 +- mytools/voidTree.hpp | 42 ++++++++++++------- 5 files changed, 79 insertions(+), 60 deletions(-) diff --git a/mytools/buildObservedVoids_conf.c b/mytools/buildObservedVoids_conf.c index f763f3e..bd615d9 100644 --- a/mytools/buildObservedVoids_conf.c +++ b/mytools/buildObservedVoids_conf.c @@ -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; diff --git a/mytools/buildObservedVoids_conf.h b/mytools/buildObservedVoids_conf.h index e73705b..38d91d5 100644 --- a/mytools/buildObservedVoids_conf.h +++ b/mytools/buildObservedVoids_conf.h @@ -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. */ diff --git a/mytools/loadZobov.cpp b/mytools/loadZobov.cpp index 521c0a8..e2da368 100644 --- a/mytools/loadZobov.cpp +++ b/mytools/loadZobov.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #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) { diff --git a/mytools/loadZobov.hpp b/mytools/loadZobov.hpp index f660558..e53dd44 100644 --- a/mytools/loadZobov.hpp +++ b/mytools/loadZobov.hpp @@ -10,7 +10,7 @@ struct ZobovZone struct ZobovVoid { - std::vector zId; + std::vector zId; float proba; int numParticles, coreParticle; float volume; diff --git a/mytools/voidTree.hpp b/mytools/voidTree.hpp index 9b15ec6..8c55d15 100644 --- a/mytools/voidTree.hpp +++ b/mytools/voidTree.hpp @@ -25,24 +25,26 @@ protected: public: typedef std::list VoidList; - int lookupParent(int voidId) + int lookupParent(int voidId, const std::vector >& voids_for_zones) { - std::set sref; + std::set sref; sref.insert(zobov.allVoids[voidId].zId.begin(), zobov.allVoids[voidId].zId.end()); - - std::vector sout(sref.size()); + std::vector sout(sref.size()); int lastSize = 0x7fffffff; int goodParent = voidId; + const std::list& candidateList = voids_for_zones[*zobov.allVoids[voidId].zId.begin()]; + std::list::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 s1; + int i = *iter_candidate; + std::set s1; int counter = 0; s1.insert(zobov.allVoids[i].zId.begin(), zobov.allVoids[i].zId.end()); - for (std::set::iterator iter = s1.begin(), iter2 = sref.begin(); + for (std::set::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 > 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 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);