#This boring example just shows that using SigJoin and Sig
#you get the same signatures and derivatives.

import os
#os.environ["THEANO_FLAGS"]="floatX=float32,device=cpu,optimizer=fast_compile"
#os.environ["THEANO_FLAGS"]="floatX=float32,device=cpu,mode=DebugMode"
os.environ["THEANO_FLAGS"]="floatX=float32,device=cpu"

import theano, numpy, sys
import six.moves

#add the parent directory, so we find our iisignature build if it was built --inplace
sys.path.append(os.path.dirname(os.path.abspath(os.path.dirname(__file__))))
import iisignature

from iisignature_theano import Sig, SigJoin
import theano.tensor as T


#1: SETUP VARIABLES
dim=3
level=6
pathlength=4
fixed = float("nan")
fixed = 0.1

numpy.random.seed(51)
start = numpy.random.uniform(size=(pathlength,dim)).astype("float32")

#2: DEFINE THEANO STUFF

path = theano.shared(start, "path")
if not numpy.isnan(fixed):
    fixedT = theano.shared(fixed, "fixedT")
    path=theano.tensor.horizontal_stack(path[:,:-1],fixedT*T.shape_padright(T.arange(pathlength)))
cost1 = theano.tensor.mean(theano.tensor.sqr(Sig(path,level)))
grad1 = theano.grad(cost1,path)

signature = numpy.zeros((1,iisignature.siglength(dim,level))).astype("float32")
for i in six.moves.xrange(1,pathlength):
    if not numpy.isnan(fixed):
        displacement = path[i:(i+1),:-1]-path[(i-1):i,:-1]
        signature = SigJoin(signature,displacement,level,fixedT)
    else:
        displacement = path[i:(i+1),:]-path[(i-1):i,:]
        signature = SigJoin(signature,displacement,level)

cost2 = theano.tensor.mean(theano.tensor.sqr(signature))
grad2 = theano.grad(cost2,path)

#theano.printing.pydotprint(grad2,outfile="a.png")

ff = theano.function([],[grad1,grad2])
#theano.printing.pydotprint(ff,outfile="b.png")

#3: GO

numpy.set_printoptions(suppress=True)
f = ff()
if numpy.isnan(fixed):
    print (f[0]-f[1])
    print (f[0])
    print (f[1])
else:
    print ((f[0]-f[1])[:,:-1])
    print (f[0][:,:-1])
    print (f[1][:,:-1])
    ff2 = theano.function([],[theano.grad(cost1,fixedT),theano.grad(cost2,fixedT)])()
    print(ff2)




#This boring example just shows that using SigJoin and Sig
#you get the same signatures and derivatives.

import os
#os.environ["THEANO_FLAGS"]="floatX=float32,device=cpu,optimizer=fast_compile"
#os.environ["THEANO_FLAGS"]="floatX=float32,device=cpu,mode=DebugMode"
os.environ["THEANO_FLAGS"]="floatX=float32,device=cpu"

import theano, numpy, sys
import six.moves

#add the parent directory, so we find our iisignature build if it was built --inplace
sys.path.append(os.path.dirname(os.path.abspath(os.path.dirname(__file__))))
import iisignature

from iisignature_theano import Sig, SigJoin
import theano.tensor as T


#1: SETUP VARIABLES
dim=3
level=6
pathlength=4
fixed = float("nan")
fixed = 0.1

numpy.random.seed(51)
start = numpy.random.uniform(size=(pathlength,dim)).astype("float32")

#2: DEFINE THEANO STUFF

path = theano.shared(start, "path")
if not numpy.isnan(fixed):
    fixedT = theano.shared(fixed, "fixedT")
    path=theano.tensor.horizontal_stack(path[:,:-1],fixedT*T.shape_padright(T.arange(pathlength)))
cost1 = theano.tensor.mean(theano.tensor.sqr(Sig(path,level)))
grad1 = theano.grad(cost1,path)

signature = numpy.zeros((1,iisignature.siglength(dim,level))).astype("float32")
for i in six.moves.xrange(1,pathlength):
    if not numpy.isnan(fixed):
        displacement = path[i:(i+1),:-1]-path[(i-1):i,:-1]
        signature = SigJoin(signature,displacement,level,fixedT)
    else:
        displacement = path[i:(i+1),:]-path[(i-1):i,:]
        signature = SigJoin(signature,displacement,level)

cost2 = theano.tensor.mean(theano.tensor.sqr(signature))
grad2 = theano.grad(cost2,path)

#theano.printing.pydotprint(grad2,outfile="a.png")

ff = theano.function([],[grad1,grad2])
#theano.printing.pydotprint(ff,outfile="b.png")

#3: GO

numpy.set_printoptions(suppress=True)
f = ff()
if numpy.isnan(fixed):
    print (f[0]-f[1])
    print (f[0])
    print (f[1])
else:
    print ((f[0]-f[1])[:,:-1])
    print (f[0][:,:-1])
    print (f[1][:,:-1])
    ff2 = theano.function([],[theano.grad(cost1,fixedT),theano.grad(cost2,fixedT)])()
    print(ff2)




#This boring example just shows that using SigJoin and Sig #you get the same signatures and derivatives. #os.environ["THEANO_FLAGS"]="floatX=float32,device=cpu,optimizer=fast_compile" #os.environ["THEANO_FLAGS"]="floatX=float32,device=cpu,mode=DebugMode" #add the parent directory, so we find our iisignature build if it was built --inplace #1: SETUP VARIABLES #2: DEFINE THEANO STUFF #theano.printing.pydotprint(grad2,outfile="a.png") #theano.printing.pydotprint(ff,outfile="b.png") #3: GO