def Compute(self): n = 1 m = max(self.power, 3) + 7 manage.config.N, manage.config.M = n, m impl = manage.config.EXPR_IMPL manage.config.MAXPOWER = np.array([self.power]) self.SetStartSymbols(1) target = None for h_iter in itertools.combinations(xrange(m), self.power): small_target = None expr_vector = np.zeros((1, m)) for h in h_iter: expr_vector[0, h] = 1 expr = impl([1], expr_vector) if target is None: target = expr else: target = target + expr target = np.array([[target]]) matlab = '''n = 1; m = 18; A = randn(1, m); sub = nchoosek(1:m, %s); original = 0; for i = 1:size(sub, 1) original = original + prod(A(sub(i, :))); end ''' % self.power target = ExprMatrix(comp={THIS: ""}, expressions=target, powers=manage.config.MAXPOWER) target = target.ElementwiseMultiply(120) target.comp[MATLAB] = matlab self.target_mat = target
def testFindLinearCombinationBroadcasting(self): manage.config.MAXPOWER = np.array([10]) # mat1 mat2 target # x1 | x1x2 x1 3x1 | 2x1x2 + x1 # 2x3 | x2^2 x3 5x3 | 2x2^2 + x3 mat1_11 = ExprSymbolic([1], np.array([[1, 0, 0]])) mat1_12 = ExprSymbolic([1], np.array([[1, 1, 0]])) mat1_21 = ExprSymbolic([2], np.array([[0, 0, 1]])) mat1_22 = ExprSymbolic([1], np.array([[0, 2, 0]])) mat2_11 = ExprSymbolic([1], np.array([[1, 0, 0]])) mat2_21 = ExprSymbolic([1], np.array([[0, 0, 1]])) target_11 = ExprSymbolic([3], np.array([[1, 0, 0]])) target_12 = ExprSymbolic([2, 1], np.array([[1, 1, 0], [1, 0, 0]])) target_21 = ExprSymbolic([5], np.array([[0, 0, 1]])) target_22 = ExprSymbolic([2, 1], np.array([[0, 2, 0], [0, 0, 1]])) mat1 = ExprMatrix("a", np.array([[mat1_11, mat1_12], [mat1_21, mat1_22]]), np.array([1])) mat2 = ExprMatrix("b", np.array([[mat2_11], [mat2_21]]), np.array([1])) target = ExprMatrix( "target", np.array([[target_11, target_12], [target_21, target_22]]), np.array([1])) expressions_list = [mat1, mat2] weights = ExprSymbolic.FindLinearCombination(expressions_list, target)[0] self.assertEquals(2, len(weights)) self.assertAlmostEqual(2.0, weights[0]) self.assertAlmostEqual(1.0, weights[1])
def GetMatricesSumMul(n, m, expr_impl): manage.config.MAXPOWER = np.array([10, 10]) mat_a = [] for r in xrange(n): row = [] for c in xrange(m): vec = [0] * (2 * n * m) vec[r * m + c] = 1 row.append(expr_impl([1], np.array([vec]))) mat_a.append(row) mat_b = [] for r in xrange(n): row = [] for c in xrange(m): vec = [0] * (2 * n * m) vec[n * m + r * n + c] = 1 row.append(expr_impl([1], np.array([vec]))) mat_b.append(row) A = ExprMatrix(comp='A', expressions=np.array(mat_a), powers=np.array([1, 0])) B = ExprMatrix(comp='B', expressions=np.array(mat_b), powers=np.array([0, 1])) return A, B
def testElementwiseMultiply(self): manage.config.MAXPOWER = np.array([10, 10]) # a = x1 * x3 # b = x1 * x2^2 # c = x2^3 + x3^4 a = ExprSymbolic([1], np.array([[1, 0, 1]])) b = ExprSymbolic([1], np.array([[1, 2, 0]])) c = ExprSymbolic([1, 1], np.array([[0, 3, 0], [0, 0, 4]])) expressions1 = np.array([[a, b], [c, a]]) expressions2 = np.array([[a, a], [a, a]]) # mat1: # x1x3 | x1 * x2^2 # x2^3 + x3^4 | x1x3 mat1 = ExprMatrix('M1', expressions1, powers=np.array([1, 0])) mat2 = ExprMatrix('M2', expressions2, powers=np.array([0, 1])) mat1 = mat1.ElementwiseMultiply(mat2) self.assertEquals((2, 2), mat1.expressions.shape) elem = mat1.expressions[0, 0] self.assertEquals(1, elem.expr_vectors.shape[0]) self.assertEquals(1, elem.quants[0]) self.assertTrue((np.array([2, 0, 2]) == elem.expr_vectors).all()) elem2 = mat1.expressions[1, 0] # x1x3 * (x2^3 + x3^4) self.assertEquals(2, elem2.expr_vectors.shape[0]) self.assertTrue((np.array([1, 3, 1]) == elem2.expr_vectors).any()) self.assertTrue((np.array([1, 0, 5]) == elem2.expr_vectors).any()) self.assertTrue((np.array([1, 1]) == elem2.quants).any())
def testHashImmuneToConst(self): manage.config.MAXPOWER = np.array([10]) a = ExprSymbolic([2, 3], np.array([[1, 2, 3], [4, 5, 6]])) b = ExprSymbolic([4, 6], np.array([[1, 2, 3], [4, 5, 6]])) self.assertNotEquals(a, b) a = ExprMatrix("a", np.array([[a]]), np.array([1])) b = ExprMatrix("b", np.array([[b]]), np.array([1])) self.assertEquals(a, b)
def testMarginalizeBothAxis(self): manage.config.MAXPOWER = np.array([10]) a = ExprZp([1], np.array([[1, 0, 0]])) b = ExprZp([1], np.array([[0, 1, 0]])) c = ExprZp([2], np.array([[0, 0, 1]])) expressions = np.array([[a, b, c], [a, b, c]], dtype=np.object) matrix = ExprMatrix('A', expressions, powers=np.array([1])) matrix = matrix.Marginalize(axis=None) self.assertEquals((1, 1), matrix.expressions.shape)
def testMarginalizeBothAxis(self): a = ExprSymbolic([1], np.array([[1, 0, 0]])) b = ExprSymbolic([1], np.array([[0, 1, 0]])) c = ExprSymbolic([2], np.array([[0, 0, 1]])) expressions = np.array([[a, b, c], [a, b, c]], dtype=np.object) matrix = ExprMatrix('A', expressions, powers=np.array([1])) matrix = matrix.Marginalize(axis=None) self.assertEquals((1, 1), matrix.expressions.shape) self.assertEquals(3, len(matrix.expressions.item(0, 0).quants)) self.assertEquals([2, 2, 4], sorted(matrix.expressions.item(0, 0).quants))
def testSameHash(self): manage.config.MAXPOWER = np.array([10]) a = ExprSymbolic([1], np.array([[1, 0, 0, 0]])) b = ExprSymbolic([1], np.array([[0, 1, 0, 0]])) c = ExprSymbolic([1], np.array([[0, 0, 1, 0]])) d = ExprSymbolic([1], np.array([[0, 0, 0, 1]])) expressions = np.array([[a, b], [c, d]], dtype=np.object) matrix = ExprMatrix('A', expressions, powers=np.array([1])) Q = matrix.Marginalize(axis=0).Marginalize(axis=1) W = matrix.Marginalize(axis=1).Marginalize(axis=0) self.assertEquals(Q, W)
def testHashIsComputed(self): manage.config.MAXPOWER = np.array([10]) a = ExprZp( [2, 3], np.array([[1, 2, 3], [4, 5, 6]])) b = ExprZp( [2, 2], np.array([[1, 2, 3], [4, 5, 6]])) self.assertNotEquals(a, b) a = ExprMatrix("a", np.array([[a]]), np.array([1])) b = ExprMatrix("b", np.array([[b]]), np.array([1])) self.assertNotEquals(a, b)
def Compute(self): n = 1 m = max(self.power, 2) + 1 manage.config.N, manage.config.M = n, m impl = manage.config.EXPR_IMPL manage.config.MAXPOWER = np.array([self.power]) W = self.SetStartSymbols(1)[0] zeros = np.array([0] * (n * m)) powers = [0] # Target expression: sum (v^T W)^k singles = [] for h_iter in range(0, pow(2, m)): row = [] for mm in range(0, m): if h_iter & pow(2, mm): row.append([impl([1], np.array([zeros]))]) else: row.append([impl([0], np.array([zeros]))]) h = ExprMatrix(comp="", \ expressions=np.array(row), powers=powers) singles.append(W.Multiply(h).Power(self.power)) target = ExprAbstract.AddManyExpressions(singles) matlab = '''n = 14; m = 1; A = randn(1, n); nset = dec2bin(0:(2^(n) - 1)); original = 0; for i = 1:size(nset, 1) v = logical(nset(i, :) - '0'); original = original + (v * A') ^ %d; end ''' % self.power target.comp[MATLAB] = matlab self.target_mat = target
def testElementwiseMultiply(self): manage.config.MAXPOWER = np.array([10, 10]) # a = x1 * x3 # b = x1 * x2^2 # c = x2^3 + x3^4 a = ExprZp([1], np.array([[1, 0, 1]])) b = ExprZp([1], np.array([[1, 2, 0]])) c = ExprZp([1, 1], np.array([[0, 3, 0], [0, 0, 4]])) expressions1 = np.array([[a, b], [c, a]]) expressions2 = np.array([[a, a], [a, a]]) # mat1: # x1x3 | x1 * x2^2 # x2^3 + x3^4 | x1x3 mat1 = ExprMatrix('M1', expressions1, powers=np.array([1, 0])) mat2 = ExprMatrix('M2', expressions2, powers=np.array([0, 1])) mat1.ElementwiseMultiply(mat2) self.assertEquals((2, 2), mat1.expressions.shape)
def testShapesAfterSumAreCorrec(self): a = ExprSymbolic([1], np.array([[1, 0, 0]])) b = ExprSymbolic([1], np.array([[0, 1, 0]])) expressions = np.array([[a, a, a], [b, b, b]]) matrix = ExprMatrix('M', expressions, powers=np.array([1])) # Exp matrix test self.assertEquals((2, 3), matrix.expressions.shape) m0 = copy.copy(matrix) m0 = m0.Marginalize(axis=0) self.assertEquals((1, 3), m0.expressions.shape) self.assertEquals(a + b, m0.expressions[0, 0]) self.assertEquals(a + b, m0.expressions[0, 1]) m1 = copy.copy(matrix) m1 = m1.Marginalize(axis=1) self.assertEquals((2, 1), m1.expressions.shape) self.assertEquals(a + a + a, m1.expressions[0, 0]) self.assertEquals(b + b + b, m1.expressions[1, 0])
def SetStartSymbols(self, nr): n, m = manage.config.N, manage.config.M self.start_symbols = [] for k in range(nr): mat = [] for r in xrange(n): row = [] for c in xrange(m): vec = np.array([0] * nr * (n * m)) vec[k * n * m + r * m + c] = 1 row.append(manage.config.EXPR_IMPL([1], np.array([vec]))) mat.append(row) powers = np.array([0] * nr) powers[k] = 1 expr_mat = ExprMatrix(comp=chr(ord('A') + k), expressions=np.array(mat), powers=powers) self.start_symbols.append(expr_mat) return self.start_symbols
def SetStartSymbolsWithShapes(self, mat_shapes): self.start_symbols = [] total_variables = sum(n * m for n, m in mat_shapes) variables_so_far = 0 for k, (n, m) in enumerate(mat_shapes): mat = [] for r in xrange(n): row = [] for c in xrange(m): vec = np.array([0] * total_variables) vec[variables_so_far + r * m + c] = 1 row.append(manage.config.EXPR_IMPL([1], np.array([vec]))) mat.append(row) powers = np.array([0] * len(mat_shapes)) powers[k] = 1 expr_mat = ExprMatrix(comp=chr(ord('A') + k), expressions=np.array(mat), powers=powers) self.start_symbols.append(expr_mat) variables_so_far += n * m assert variables_so_far == total_variables return self.start_symbols
def Compute(self): n = max(self.power, 2) m = n + 1 manage.config.N, manage.config.M = n, m impl = manage.config.EXPR_IMPL manage.config.MAXPOWER = np.array([self.power]) W = self.SetStartSymbols(1)[0] zeros = np.array([0] * (n * m)) powers = [0] # Target expression: sum (v^T W h)^k singles = [] vs = [] vWs = [] hs = [] for v_iter in range(0, pow(2, n)): col = [] col01 = [] for nn in range(0, n): if v_iter & pow(2, nn): col.append(impl([1], np.array([zeros]))) col01.append(1) else: col.append(impl([0], np.array([zeros]))) col01.append(0) v = ExprMatrix(comp="np.array([%s])" % str(col01), \ expressions=np.array([col]), powers=powers) vs.append(v) vWs.append(v.Multiply(W)) for h_iter in range(0, pow(2, m)): row = [] row01 = [] for mm in range(0, m): if h_iter & pow(2, mm): row.append([impl([1], np.array([zeros]))]) row01.append(1) else: row.append([impl([0], np.array([zeros]))]) row01.append(0) hs.append(ExprMatrix(comp="np.array([%s]).transpose()" % str(row01), \ expressions=np.array(row), powers=powers)) for v_iter in range(0, pow(2, n)): v = vs[v_iter] vW = vWs[v_iter] for h_iter in range(0, pow(2, m)): h = hs[h_iter] singles.append(vW.Multiply(h).Power(self.power)) target = ExprAbstract.AddManyExpressions(singles) matlab = '''n = 7; m = 8; A = randn(n, m); nset = dec2bin(0:(2^(n) - 1)); mset = dec2bin(0:(2^(m) - 1)); original = 0; for i = 1:size(nset, 1) for j = 1:size(mset, 1) v = logical(nset(i, :) - '0'); h = logical(mset(j, :) - '0'); original = original + (v * A * h') ^ %d; end end ''' % self.power target.comp[MATLAB] = matlab self.target_mat = target
def testAddOne(self): manage.config.MAXPOWER = np.array([10]) a = ExprSymbolic([5], np.array([[0, 0, 0, 0]])) expressions = np.array([[a]], dtype=np.object) matrix = ExprMatrix('A', expressions, powers=np.array([1])) self.assertTrue(matrix.Add(4).expressions[0, 0].quants.shape[0] == 1)