#!/bin/python

#automatic generation of Taylor coefficients
#representation of derivations as sums
#use Runge 1924, p 287 algorithm
#g -> dg/dx + f dg/dy

#make this recursive
#we trust compiler to optimize this 
#alternative would be linear programming 

#a term is a list of factors

import string

class term:
	def __init__(self,exp,t,x,y,f):
		self.t = t
		self.x = x
		self.y = y
		self.f = f
		self.exp = exp
	def unfold(self):
		return [term(self.exp,self.t-1,self.x+1,self.y,self.f), \
			term(self.exp,self.t-1,self.x,self.y+1,self.f+1)]
	def __repr__(self):
		number = self.x+self.y+self.t
		s = "f^" + "%d" % self.f + "*"
		s = s + "[d^" + "%d" % number + "<" + self.exp + ">/"
		if self.t > 0:
			s = s + "dt^" + "%d" % self.t
		if self.x > 0:
			s = s + "dx^" + "%d" % self.x
		if self.y > 0:
			s = s + "dy^" + "%d" % self.y
		s = s + "]"
		return s

class exp:
	def __init__(self):
		self.terms = []
	def termappend(self,term):
		self.terms.append(term)
	def __repr__(self):
		s = ''
		for t in self.terms:
			s = s + ("%s" % t) + " + "
		return s
	def unfold(self):
		self.terms = [term(self.exp,self.t-1,self.x+1,self.y,self.f), \
			term(self.exp,self.t-1,self.x,self.y+1,self.f+1)]
	def hey(self):
		newterms = []
		for t in self.terms:
			print "term" + ("%s" % t)
			left,right = t.unfold()
			newterms.append(left)
			newterms.append(right)
		self.terms = newterms

t = exp()
t.termappend(term("%", 3, 0, 0, 0))
print t
t.unfold()
print t
t.unfold()
print t

