def test_dot(self): """ test z = dot(x,y)""" cg = CGraph() D,P,N,M = 2,5,7,11 ax = UTPM(numpy.random.rand(D,P,N,M)) ay = UTPM(numpy.random.rand(D,P,M,N)) fx = Function(ax) fy = Function(ay) fz = Function.dot(fx,fy) cg.independentFunctionList = [fx,fy] cg.dependentFunctionList = [fz] ax = UTPM(numpy.random.rand(D,P,N,M)) ay = UTPM(numpy.random.rand(D,P,M,N)) azbar = UTPM(numpy.random.rand(*fz.x.data.shape)) cg.pushforward([ax,ay]) cg.pullback([azbar]) xbar_reverse = cg.independentFunctionList[0].xbar ybar_reverse = cg.independentFunctionList[1].xbar xbar_symbolic = UTPM.dot(azbar,ay.T) ybar_symbolic = UTPM.dot(ax.T,azbar) assert_array_almost_equal(xbar_reverse.data, xbar_symbolic.data) assert_array_almost_equal(ybar_reverse.data, ybar_symbolic.data)
def test_very_simple_ODOE_objective_function(self): """ compute PHI = trace( (J^T,J)^-1 ) """ D,P,N,M = 2,1,100,3 J = UTPM(numpy.random.rand(D,P,N,M)) cg = CGraph() FJ = Function(J) FJT = Function.transpose(FJ) FM = Function.dot(FJT, FJ) FC = Function.inv(FM) FPHI = Function.trace(FC) cg.independentFunctionList = [FJ] cg.dependentFunctionList = [FPHI] assert_array_equal(FPHI.shape, ()) cg.pushforward([J]) PHIbar = UTPM(numpy.random.rand(*(D,P))) # pullback using the tracer cg.pullback([PHIbar]) # verifying pullback by ybar.T ydot == xbar.T xdot const1 = UTPM.dot(FPHI.xbar, UTPM.shift(FPHI.x,-1)) const2 = UTPM.trace(UTPM.dot(FJ.xbar.T, UTPM.shift(FJ.x,-1))) # print cg # print const1 # print const2 assert_array_almost_equal(const1.data[0,:], const2.data[0,:])
def test_more_complicated_ODOE_objective_function(self): """ compute PHI = trace( (J^T,J)^-1 ) """ D,P,N,M = 2,1,100,3 MJs = [UTPM(numpy.random.rand(D,P,N,M)),UTPM(numpy.random.rand(D,P,N,M))] cg = CGraph() FJs= [Function(MJ) for MJ in MJs] FM = Function(UTPM(numpy.zeros((D,P,M,M)))) for FJ in FJs: FJT = Function.transpose(FJ) FM += Function.dot(FJT, FJ) FC = Function.inv(FM) FPHI = Function.trace(FC) cg.independentFunctionList = FJs cg.dependentFunctionList = [FPHI] assert_array_equal(FPHI.shape, ()) # cg.pushforward(MJs) # pullback using the tracer PHIbar = UTPM(numpy.ones((D,P))) cg.pullback([PHIbar]) # # compute pullback by hand # Cbar = UTPM.pb_trace(PHIbar, FC.x, FPHI.x) # assert_array_almost_equal(Cbar.data, FC.xbar.data) # Mbar = UTPM.pb_inv(Cbar, FM.x, FC.x) # assert_array_almost_equal(Mbar.data, FM.xbar.data) # for FJ in FJs: # tmpbar = UTPM.pb_dot(Mbar, FJ.T.x, FJ.x, FM.x) # assert_array_almost_equal(tmpbar[1].data , FJ.xbar.data) # verifying pullback by ybar.T ydot == xbar.T xdot const1 = UTPM.dot(FPHI.xbar, UTPM.shift(FPHI.x,-1)) const2 = UTPM(numpy.zeros((D,P))) for nFJ, FJ in enumerate(FJs): const2 += UTPM.trace(UTPM.dot(FJ.xbar.T, UTPM.shift(FJ.x,-1))) assert_array_almost_equal(const1.data[0,:], const2.data[0,:])
def test_pullback_solve(self): """ test pullback on f = solve(A,x) """ (D,P,M,N,K) = 2,7,10,10,3 A_data = numpy.random.rand(D,P,M,N) # make A_data sufficiently regular for p in range(P): for n in range(N): A_data[0,p,n,n] += (N + 1) A = UTPM(A_data) x = UTPM(numpy.random.rand(D,P,N,K)) # STEP 1: tracing cg = CGraph() fA = Function(A) fx = Function(x) fy = Function.solve(fA,fx) cg.independentFunctionList = [fA] cg.dependentFunctionList = [fy] y = fy.x # STEP 2: pullback ybar_data = numpy.random.rand(*y.data.shape) ybar = UTPM(ybar_data) cg.pullback([ybar]) Abar = fA.xbar xbar = fx.xbar assert_array_almost_equal(x.data, UTPM.dot(A,y).data) for p in range(P): Ab = Abar.data[0,p] Ad = A.data[1,p] xb = xbar.data[0,p] xd = x.data[1,p] yb = ybar.data[0,p] yd = y.data[1,p] assert_almost_equal(numpy.trace(numpy.dot(Ab.T,Ad)) + numpy.trace(numpy.dot(xb.T,xd)), numpy.trace(numpy.dot(yb.T,yd)))
def test_pushforward_of_qr(self): cg = CGraph() D,P,N,M = 1,1,3,3 x = UTPM(numpy.random.rand(D,P,N,M)) fx = Function(x) f = Function.qr(fx) fQ,fR = f cg.independentFunctionList = [fx] cg.dependentFunctionList = [fQ,fR] x = UTPM(numpy.random.rand(D,P,N,M)) cg.pushforward([x]) Q = cg.dependentFunctionList[0].x R = cg.dependentFunctionList[1].x assert_array_almost_equal(x.data,UTPM.dot(Q,R).data)
def test_dot_utpm(self): D, P, N = 3, 4, 5 x = UTPM(numpy.random.rand(D, P, N, N)) y = UTPM(numpy.random.rand(D, P, N, N)) assert_array_almost_equal(dot(x, y).data, UTPM.dot(x, y).data)
def test_binary_function_utpm(self): D, P, N, M = 3, 4, 5, 6 x = UTPM(numpy.random.rand(*(D, P, N, M))) y = UTPM(numpy.random.rand(*(D, P, M, N))) assert_array_almost_equal(dot(x, y).data, UTPM.dot(x, y).data)