From 66f46b7e0b9e69c8ab2d958c5b56beb7ccb94a35 Mon Sep 17 00:00:00 2001 From: Chad Hanna <chad.hanna@ligo.org> Date: Sun, 11 Feb 2018 12:22:30 -0500 Subject: [PATCH] treebank: update --- gstlal-ugly/python/tree.py | 74 ++++++++++++++++++-------------------- 1 file changed, 35 insertions(+), 39 deletions(-) diff --git a/gstlal-ugly/python/tree.py b/gstlal-ugly/python/tree.py index 27294b42db..a43b124eea 100644 --- a/gstlal-ugly/python/tree.py +++ b/gstlal-ugly/python/tree.py @@ -68,6 +68,7 @@ def packing_density(n): # this packing density puts two in a cell, we split if there is more # than this expected in a cell # From: http://mathworld.wolfram.com/HyperspherePacking.html + return 1.0 prefactor = 1.0 if n==1: return prefactor @@ -224,6 +225,7 @@ class HyperCube(object): def dl(self, mismatch): # From Owen 1995 return mismatch**.5 + #return 2. * (mismatch/len(self.center))**.5 def volume(self, metric_tensor = None): if metric_tensor is None: @@ -272,23 +274,14 @@ class Node(object): self.on_boundary = True print "\n\non boundary!!\n\n" #self.on_boundary = numpy.any((self.cube.center + self.cube.deltas) == (self.boundary.center + self.boundary.deltas)) or numpy.any((self.cube.center - self.cube.deltas) == (self.boundary.center - self.boundary.deltas)) - def split(self, split_num_templates, mismatch, bifurcation = 0, verbose = True, vtol = 1.01, max_coord_vol = float(100)): + + def split(self, split_num_templates, mismatch, bifurcation = 0, verbose = True, metric_tol = 0.10, max_coord_vol = float(10)): size = self.cube.num_tmps_per_side(mismatch) - F = 1. / 2**.2 self.splitdim = numpy.argmax(size) - aspect_ratios = size / min(size) - #if (F*.99 < self.cube.center[0] / self.cube.center[1] <= F * 1.10): - # self.splitdim = 1 - # aspect_factor = 2.00 - aspect_factor = max(1., numpy.product(aspect_ratios[aspect_ratios>1.5]) /1.5**len(aspect_ratios[aspect_ratios>1.5])) - aspect_factor_2 = max(1., numpy.product(aspect_ratios[aspect_ratios>8.0]) / 8.**len(aspect_ratios[aspect_ratios>8.])) - aspect_ratio = max(aspect_ratios) if not self.parent: numtmps = float("inf") par_numtmps = float("inf") - sib_aspect_factor = 1.0 - parent_aspect_factor = 1.0 volume_split_condition = False metric_diff = 1.0 metric_cond = True @@ -303,43 +296,46 @@ class Node(object): numtmps = self.cube.num_templates(mismatch) - #metric_diff = max(abs(self.sibling.cube.eigv - self.cube.eigv) / abs(self.sibling.cube.eigv + self.cube.eigv) / 2) #self.cube.metric_tensor - self.sibling.cube.metric_tensor - #metric_diff2 = max(abs(self.parent.cube.eigv - self.cube.eigv) / abs(self.parent.cube.eigv + self.cube.eigv) / 2) #self.cube.metric_tensor - self.parent.cube.metric_tensor metric_diff = self.cube.metric_tensor - self.sibling.cube.metric_tensor - metric_diff2 = self.cube.metric_tensor - self.parent.cube.metric_tensor metric_diff = numpy.linalg.norm(metric_diff) / numpy.linalg.norm(self.cube.metric_tensor)**.5 / numpy.linalg.norm(self.sibling.cube.metric_tensor)**.5 + + metric_diff2 = self.cube.metric_tensor - self.parent.cube.metric_tensor metric_diff2 = numpy.linalg.norm(metric_diff2) / numpy.linalg.norm(self.cube.metric_tensor)**.5 / numpy.linalg.norm(self.parent.cube.metric_tensor)**.5 + metric_diff = max(metric_diff, metric_diff2) # take the bigger of self, sibling and parent - numtmps = max(max(numtmps, par_numtmps/2.0), sib_numtmps) * aspect_factor + numtmps = max(max(numtmps, par_numtmps/2.0), sib_numtmps) - mts = [(numtmps, self.cube), (sib_numtmps, self.sibling.cube), (par_numtmps / 2., self.parent.cube)] + #mts = [(numtmps, self.cube), (sib_numtmps, self.sibling.cube), (par_numtmps / 2., self.parent.cube)] reuse_metric = self.cube #max(mts)[1] - #if self.cube.constraint_func(self.cube.vertices + [self.cube.center]) and ((numtmps >= split_num_templates) or (numtmps >= split_num_templates/2.0 and metric_cond)): - if self.cube.constraint_func(self.cube.vertices + [self.cube.center]) and ((numtmps >= split_num_templates) or (metric_diff > 0.30 and numtmps > split_num_templates / 2**.5)) or bifurcation < 2: - bifurcation += 1 - if metric_diff <= 0.3 and (numtmps < 3**(len(size))) and self.cube.coord_volume() < 4 and aspect_factor_2 == 1.0: - self.cube.metric_tensor = reuse_metric.metric_tensor - self.cube.effective_dimension = reuse_metric.effective_dimension - self.cube.det = reuse_metric.det - self.cube.metric_is_valid = reuse_metric.metric_is_valid - self.cube.eigv = reuse_metric.eigv - left, right = self.cube.split(self.splitdim, reuse_metric = True) - #print "REUSE" + #if self.cube.constraint_func(self.cube.vertices + [self.cube.center]) and ((numtmps >= split_num_templates) or (metric_diff > metric_tol and numtmps > split_num_templates)) or bifurcation < 2: + tmps_per_side = self.cube.num_tmps_per_side(mismatch) + if self.cube.constraint_func(self.cube.vertices + [self.cube.center]): + # NOTE FIXME work out correct max templates per side + if ((numtmps >= split_num_templates) or max(tmps_per_side) > 2 * len(size)**.5 ) or bifurcation < 2: + bifurcation += 1 + if metric_diff <= metric_tol and (numtmps < 3**(len(size))) and self.cube.coord_volume() < max_coord_vol: + self.cube.metric_tensor = reuse_metric.metric_tensor + self.cube.effective_dimension = reuse_metric.effective_dimension + self.cube.det = reuse_metric.det + self.cube.metric_is_valid = reuse_metric.metric_is_valid + self.cube.eigv = reuse_metric.eigv + left, right = self.cube.split(self.splitdim, reuse_metric = True) + #print "REUSE" + else: + left, right = self.cube.split(self.splitdim) + + self.left = Node(left, self, boundary = self.boundary) + self.right = Node(right, self, boundary = self.boundary) + self.left.sibling = self.right + self.right.sibling = self.left + self.left.split(split_num_templates, mismatch = mismatch, bifurcation = bifurcation) + self.right.split(split_num_templates, mismatch = mismatch, bifurcation = bifurcation) else: - left, right = self.cube.split(self.splitdim) - - self.left = Node(left, self, boundary = self.boundary) - self.right = Node(right, self, boundary = self.boundary) - self.left.sibling = self.right - self.right.sibling = self.left - self.left.split(split_num_templates, mismatch = mismatch, bifurcation = bifurcation) - self.right.split(split_num_templates, mismatch = mismatch, bifurcation = bifurcation) - else: - self.template_count[0] = self.template_count[0] + 1 - if verbose: - print "%d tmps : level %03d @ %s : deltas %s : vol frac. %.2f : splits %s : det %.2f : size %s" % (self.template_count[0], bifurcation, self.cube.center, self.cube.deltas, numtmps, self.on_boundary, self.cube.det**.5, size) + self.template_count[0] = self.template_count[0] + 1 + if verbose: + print "%d tmps : level %03d @ %s : num tmps per side %s: deltas %s : vol frac. %.2f : splits %s : det %.2f : size %s" % (self.template_count[0], bifurcation, self.cube.center, tmps_per_side, self.cube.deltas, numtmps, self.on_boundary, self.cube.det**.5, size) # FIXME can this be made a generator? def leafnodes(self, out = set()): -- GitLab