In [25]:
import OVFM.Model as mdl
import OVFM.FeatureMap as fm
import OVFM.DataGeneration as dg
import OVFM.Risk as rsk
import OVFM.LearningRate as lr
import OVFM.SGD as sgd
import OVFM.FISTA as fista

import numpy as np
import scipy

In [26]:
def grad_model_coord( feature, model, coord ):
    return model.Jacobian( feature.reshape( ( 1, feature.shape[ 0 ] ) ) )[ :, coord, : ]

def model_coord( feature, model, coord ):
    return model( feature.reshape( ( 1, feature.shape[ 0 ] ) ) )[ :, coord ]

In [31]:
n = 1
d = 4
D = 1000
p = 7

A = np.random.rand( p, p )
A = np.dot( A, A.T ) / np.linalg.norm( A ) ** 2

features = dg.generate_inputs( n, d, 'cube' )
model    = mdl.Model( fm.DecomposableFF( 1.0 / d, d, D, A ) )
targets  = dg.generate_outputs( features, model )

print 'Decomposable'
print 'x0 =', features[ 0, : ]
for i in xrange( 0, p ):
    print 'dh_%s/dx (x0) = ' % i, scipy.optimize.check_grad( model_coord, grad_model_coord, features[ 0, : ], model, i )


Decomposable
x0 = [-0.51723564 -0.82943712 -0.90967223  0.53078886]
dh_0/dx (x0) =  [  1.97729178e-07   3.00905250e-08   7.66758081e-08   1.89413624e-07]
dh_1/dx (x0) =  [  3.97874481e-09   3.76344928e-08   9.91947002e-09   3.31467827e-08]
dh_2/dx (x0) =  [  3.99644687e-08   5.12965126e-08   3.36974721e-08   4.96764617e-08]
dh_3/dx (x0) =  [  2.73913296e-08   2.05666659e-09   4.24841287e-08   2.30533835e-08]
dh_4/dx (x0) =  [  1.08853289e-08   7.82079041e-09   2.50658319e-08   2.54421617e-08]
dh_5/dx (x0) =  [  4.98411359e-09   1.47719687e-08   1.98981325e-08   3.23247851e-09]
dh_6/dx (x0) =  [  5.27084136e-09   2.18079383e-10   5.95640541e-09   2.53063702e-09]

In [32]:
n = 1
d = 4
D = 1000
p = d

features = dg.generate_inputs( n, d, 'cube' )
model    = mdl.Model( fm.CurlFreeFF( 1.0 / d, d, D ) )
targets  = dg.generate_outputs( features, model )

print 'Curl Free'
print 'x0 =', features[ 0, : ]
for i in xrange( 0, p ):
    print 'dh_%s/dx (x0) = ' % i, scipy.optimize.check_grad( model_coord, grad_model_coord, features[ 0, : ], model, i )


Curl Free
x0 = [-0.58752583 -0.46407557  0.76291503 -0.89351397]
dh_0/dx (x0) =  [  4.62826095e-08   1.12843846e-08   3.07931532e-08   2.17954124e-08]
dh_1/dx (x0) =  [  4.85372873e-08   1.04709011e-07   1.85921650e-07   8.91253242e-08]
dh_2/dx (x0) =  [  1.20200120e-07   7.79344575e-09   3.42792039e-08   9.45339702e-08]
dh_3/dx (x0) =  [  7.13368452e-08   2.81642792e-10   6.19282221e-08   1.04681697e-09]

In [33]:
n = 1
d = 4
D = 1000
p = d

features = dg.generate_inputs( n, d, 'cube' )
model    = mdl.Model( fm.DivFreeFF( 1.0 / d, d, D ) )
targets  = dg.generate_outputs( features, model )

print 'Divergence Free'
print 'x0 =', features[ 0, : ]
for i in xrange( 0, p ):
    print 'dh_%s/dx (x0) = ' % i, scipy.optimize.check_grad( model_coord, grad_model_coord, features[ 0, : ], model, i )


Divergence Free
x0 = [ 0.73713546  0.74628677  0.70911176  0.44816926]
dh_0/dx (x0) =  [  2.57188157e-08   7.88691765e-08   9.84274174e-08   7.74698192e-08]
dh_1/dx (x0) =  [  1.29653555e-07   1.33265781e-07   1.21716060e-07   1.40857731e-07]
dh_2/dx (x0) =  [  4.40699268e-08   4.35430714e-09   1.11642846e-07   8.56255720e-08]
dh_3/dx (x0) =  [  5.50414605e-08   4.93413802e-08   1.37930308e-07   4.09588441e-09]

In [35]:
n = 1
d = 4
D = 1000
p = d

features = dg.generate_inputs( n, d, 'cube' )
model    = mdl.Model( fm.TransformableFF( 1.0 / d, d, D ) )
targets  = dg.generate_outputs( features, model )

print 'Transformable'
print 'x0 =', features[ 0, : ]
for i in xrange( 0, p ):
    print 'dh_%s/dx (x0) = ' % i, scipy.optimize.check_grad( model_coord, grad_model_coord, features[ 0, : ], model, i )


Transformable
x0 = [-0.00416541 -0.77111657  0.21789173 -0.58658865]
dh_0/dx (x0) =  [  5.97588135e-09   0.00000000e+00   0.00000000e+00   0.00000000e+00]
dh_1/dx (x0) =  [  0.00000000e+00   1.56810344e-07   0.00000000e+00   0.00000000e+00]
dh_2/dx (x0) =  [  0.00000000e+00   0.00000000e+00   1.06401664e-07   0.00000000e+00]
dh_3/dx (x0) =  [  0.00000000e+00   0.00000000e+00   0.00000000e+00   1.45219197e-07]

In [51]:
n = 1
d = 4
D = 1000
p = 4

A = 2 * np.random.rand( p, p ) - 1
A = np.dot( A, A.T ) / np.linalg.norm( A ) ** 2

P = np.zeros( ( p, d, d ) )
for i in xrange( 0, p ):
    P[ i, :, : ] = 2 * np.random.rand( d, d ) - 1

features = dg.generate_inputs( n, d, 'cube' )
model    = mdl.Model( fm.DeepTransformableFF( 1.0 / d, d, D, P, A ) )
targets  = dg.generate_outputs( features, model )

print 'Deep Transformable'
print 'x0 =', features[ 0, : ]
for i in xrange( 0, p ):
    print 'dh_%s/dx (x0) = ' % i, scipy.optimize.check_grad( model_coord, grad_model_coord, features[ 0, : ], model, i )


Deep Transformable
x0 = [ 0.64506345  0.75460047 -0.45470496 -0.74532745]
dh_0/dx (x0) =  [  2.44566346e-08   3.17016745e-08   9.90245860e-08   8.54463623e-08]
dh_1/dx (x0) =  [  1.89386472e-07   1.61370175e-07   2.52219699e-07   1.07899089e-07]
dh_2/dx (x0) =  [  1.24320227e-07   1.88782816e-07   7.46649232e-08   1.12910433e-07]
dh_3/dx (x0) =  [  2.39363359e-08   1.68870702e-08   5.03953286e-08   6.11821988e-08]

In [51]:


In [ ]: