def _hypervolume_couboid(self, cuboid):
"""Computes the hypervolume of a single fuzzified cuboid."""
all_dims = [dim for domain in self._core._domains.values() for dim in domain]
n = len(all_dims)
# calculating the factor in front of the sum
weight_product = 1.0
for (dom, dom_weight) in self._weights._domain_weights.items():
for (dim, dim_weight) in self._weights._dimension_weights[dom].items():
weight_product *= dom_weight * sqrt(dim_weight)
factor = self._mu / (self._c**n * weight_product)
# outer sum
outer_sum = 0.0
for i in range(0, n+1):
# inner sum
inner_sum = 0.0
subsets = list(itertools.combinations(all_dims, i))
for subset in subsets:
# first product
first_product = 1.0
for dim in set(all_dims) - set(subset):
dom = filter(lambda (x,y): dim in y, self._core._domains.items())[0][0]
w_dom = self._weights._domain_weights[dom]
w_dim = self._weights._dimension_weights[dom][dim]
b = cuboid._p_max[dim] - cuboid._p_min[dim]
first_product *= w_dom * sqrt(w_dim) * b * self._c
# second product
second_product = 1.0
reduced_domain_structure = self._reduce_domains(self._core._domains, subset)
for (dom, dims) in reduced_domain_structure.items():
n_domain = len(dims)
second_product *= factorial(n_domain) * (pi ** (n_domain/2.0))/(gamma((n_domain/2.0) + 1))
inner_sum += first_product * second_product
outer_sum += inner_sum
return factor * outer_sum
评论列表
文章目录