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,:])