#!/usr/bin/python
# -*- coding: utf-8 -*-

# --------------------------------------------------
# File Name: dtw_mesh.py
# Purpose:
# Creation Date: 24-03-2017
# Last Modified: Fri, Mar 24, 2017  3:30:06 PM
# Author(s): Mike Stout 
# Copyright 2017 The Author(s) All Rights Reserved
# Credits: 
# --------------------------------------------------


from visual import *
import numpy as np

# Map values tp rgb ...
def rgbs(x):
        def f(y): return min(max(0, 1-abs(1-3*(x-y))), 1)
        r,g,b = map(f, [.5,.25,0])
        return r,g,b


w=256

# Read text from file ...
def read(a):
    with open(a) as f:
     #s= f.readlines()
     s= f.read()
    return s

x = read("Ham_F1.html.txt")
y = read("Ham_Q1.html.txt")

# Codecs char <--> ascii values
def enc(xs): return map(ord, xs[:w])
def dec(xs): return ''.join(map(chr, xs[:w]))

x_ = enc(x)
y_ = enc(y)

print dec(x_)
print dec(y_)

from mlpy import dtw_subsequence
dist, cost, path = dtw_subsequence(x_ ,y_)


h = w/2.

# Calc elevation from cost matrix ....
def toZ((x,y)):
    return (x-h, y-h, -h + 2*np.sqrt(cost[x][y])) 

# Calc color value from cost matrix ....
def toCol((x,y)):
    return rgbs(cost[x][y]/10000.)

# Setup mesh ...
grid = [ [ (x,y) for x in xrange(w) ] for y in xrange(w) ] 
grid_ = [ [ (x,y) for y in xrange(w) ] for x in xrange(w) ] 

# Render the mesh ...
for row in grid:
    #points(pos=map(toZ, row), color=map(toCol, row), size=5 )
    curve(pos=map(toZ, row), color=map(toCol, row)) # , radius=1 )
for row in grid_:
    curve(pos=map(toZ, row), color=map(toCol, row)) # , radius=1 )

# Render the DTW Path ...
points( pos=[ toZ((x,y)) for x,y in zip(path[0],path[1])] , color=(1,1,1), size=20 )

# Add text ....
def txt(s,ps):
 label(text=s
    , height=24
    , pos=ps
    , align='center'
    , depth=-.003
    #, axis=ax
    , box=0 
    # , linecolor=(0,0,0)
    , opacity=0
    , color=color.white)

# Add Axis Labels and Title ...
k = -h/2
txt("Hamlet",(0,h,k))
txt("F1",(0,-h,k))
txt("Q1",(-h,0,k))