def multiply_multivariate_orthonormal_polynomial_expansions( product_coefs_1d, poly_indices1, poly_coefficients1, poly_indices2, poly_coefficients2): num_indices1 = poly_indices1.shape[1] num_indices2 = poly_indices2.shape[1] assert num_indices2 <= num_indices1 assert poly_coefficients1.shape[0] == num_indices1 assert poly_coefficients2.shape[0] == num_indices2 # following assumes the max degrees were used to create product_coefs_1d max_degrees1 = poly_indices1.max(axis=1) max_degrees2 = poly_indices2.max(axis=1) basis_coefs, basis_indices = [], [] for ii in range(num_indices1): poly_index_ii = poly_indices1[:, ii] for jj in range(num_indices2): poly_index_jj = poly_indices2[:, jj] product_indices, product_coefs = \ compute_multivariate_orthonormal_basis_product( product_coefs_1d, poly_index_ii, poly_index_jj, max_degrees1, max_degrees2) # print(ii,jj,product_coefs,poly_index_ii,poly_index_jj) # TODO for unique polynomials the product_coefs and indices # of [0,1,2] is the same as [2,1,0] so perhaps store # sorted active indices and look up to reuse computations product_coefs_iijj = product_coefs*poly_coefficients1[ii, :] *\ poly_coefficients2[jj, :] basis_coefs.append(product_coefs_iijj) basis_indices.append(product_indices) assert basis_coefs[-1].shape[0] == basis_indices[-1].shape[1] indices, coefs = add_polynomials(basis_indices, basis_coefs) return indices, coefs
def __sub__(self, other): indices_list = [self.indices, other.indices] coefs_list = [self.coefficients, -other.coefficients] indices, coefs = add_polynomials(indices_list, coefs_list) poly = get_polynomial_from_variable(self.var_trans.variable) poly.set_indices(indices) poly.set_coefficients(coefs) return poly