from numpy import *
from pylab import *
from ForgetfulIntegrator1D import *
from OneDimMap import *

dt = .001	# more precise?
nTransients = 0.0
nIterates = 5.0
transienttimesteps = nTransients*2*pi/dt #+ nTransients	# does this mess us up?
timesteps = nIterates*2*pi/dt #+ nIterates	# add nIterates for now in case we lose a few timesteps...only length(theta_n) will count	# is int type okay? necessary?
t_0 = 0.0

def d_theta(a,b,gamma, theta,t):
	dTheta = -gamma/pi*theta + gamma*(a - b*cos(t))	# make sure this isn't returning a tuple!
	return dTheta

class SETJmapTheta0(OneDimMap):

	def __init__(self, ind_var = [-pi,pi], param = [1.77,2.0,1./3.,-pi]):
		#(self,theta_0): #,neighbors):
		#param = [1.77,2.0,1./3.]	# params = [a,b,gamma], could be ranges? maybe for specific applications?
		OneDimMap.__init__(self, ind_var = [-pi,pi], param = [1.77,2.0,1./3.,-pi])
		self.nTransients = nTransients 
		self.nIterates = nIterates
		#self.nIterates = 1.0
		self.independent_var = 'theta_0'
		self.ylabel = 'theta(t = 2 pi n), n = 1,2,3,... '
		self.name = 'Bifurcation diagram for ' + self.ylabel + ' as we vary ' + self.independent_var
		#self.neighbors = neighbors	# ...

	def maptransients(self,r):
		theta_last,theta_n,t_last,tau_i_map = ForgetfulRK1DIntegrator(self.a,self.b,self.gamma,self.current,self.ThetaMax,d_theta,dt,transienttimesteps,self.t) # only differs by transienttimesteps
		
		return theta_last,theta_n,t_last,tau_i_map


	def map(self,r):
		theta_last,theta_n,t_last,tau_i_map = ForgetfulRK1DIntegrator(self.a,self.b,self.gamma,self.current,self.ThetaMax,d_theta,dt,timesteps,self.t)
		
		return theta_last,theta_n,t_last,tau_i_map

MyMap = SETJmapTheta0()
MyMap.show()
