def compute_hyperbolic_level_indices(num_dims, level, p=1.0): if level == 0: return numpy.zeros((num_dims), numpy.int32) indices = [] for d in xrange(num_dims): index = numpy.zeros((num_dims), numpy.int32) index[d] = level indices.append(index) for d in xrange(2, min(level + 1, num_dims + 1)): level_comb = compute_hyperbolic_level_subdim_indices(num_dims, level, d, p) if level_comb.shape[0] == 0: break dim_indices = [] dims_comb = compute_combinations(num_dims, d) for i in xrange(dims_comb.shape[0]): if numpy.count_nonzero(dims_comb[i, :]) == d: dim_indices.append(dims_comb[i, :]) for dim_index in dim_indices: I = numpy.nonzero(dim_index) for level_index in level_comb: index = numpy.zeros((num_dims), numpy.int32) index[I] = level_index indices.append(index) return numpy.asarray(indices)
level = 3 print compute_combinations(num_dims, level) num_dims = 3 level = 2 print compute_combinations(num_dims, level) num_dims = 2 level = 4 p = 0.5 print compute_hyperbolic_indices(num_dims, level, p) num_dims = 3 level = 5 p = 0.5 print "a", compute_hyperbolic_level_subdim_indices(num_dims, level, 2, p) from math_tools_cpp import compute_hyperbolic_level_subdim_indices as compute_hyperbolic_level_subdim_indices_cpp print "b", compute_hyperbolic_level_subdim_indices_cpp(num_dims, level, 2, p) num_dims = 10 level = 9 p = 0.4 import time t0 = time.time() indices = compute_hyperbolic_indices(num_dims, level, p) numpy.set_printoptions(threshold=numpy.nan) print indices.shape from utilities.math_utils import unique_matrix_rows