https://github.com/LiisaLoog/SpaceTime-Framework
Raw File
Tip revision: 4a56fa7f823b597dc904a666ddd9841841fd26b1 authored by LiisaLoog on 22 October 2017, 20:03:22 UTC
Update README.md
Tip revision: 4a56fa7
2D-sim-model.py
#########################
### INITIALISE PYTHON ###
#########################

#execfile('in_plots.py')					# initialise python to allow plotting
#execfile('in.py')						# initialise python

#set_printoptions(threshold='nan')
#set_printoptions(linewidth=1000)

import os
import numpy
from numpy import *

import scipy
from scipy import *

#import matplotlib
#matplotlib.use('macosx')
#from matplotlib import *
#import matplotlib.pyplot as plt

#import pylab
#from pylab import *

import random
import time


###########################
### CONSTANT PARAMETERS ###
###########################

# world parameters
x_min = -4000
x_max = 4000
y_min = -4000
y_max = 4000

# population parameters
generations = 20001											# number of steps in random walk
in_entities = 1												# initial number of entities
max_entities = 10000										# carrying capacity - maximum number of entities the modelled domain can sustain

# craniometric (CM) measurement parameters
num_CM_meas = 50											# total number of CM measurements considered

# gaussian distribution parameters - for CM measurements
CM_mu = 1000 												# mean
CM_sigma_frac = 0.05											# standard deviation of CM gaussian - proportion of mean (CM_mu): 0.005, 0.05, 0.5
CM_sigma_val = CM_mu*CM_sigma_frac							# standard deviation of CM gaussian - value (CM_mu*CM_sigma_frac)

prob_fis = 0.1 											# probability with which each entity fissions at each generation
prob_dep = 0.00001											# probability with which each entity is sampled (data recorded to output)

for taskID in range(1,2):
	
	###########################
	### VARIABLE PARAMETERS ###
	###########################
	
	# gaussian distribution parameters - for migration
	mig_mu = 0													# mean
#	mig_sigma = random.randint(1,125)	# 2.5 #					# standard deviation: 2.5, 5, 7.5, 10
	mig_sigma = random.uniform(0,100)
	
	##################################################
	### SAVE MODEL PARAMETER VALUES TO OUTPUT FILE ###
	##################################################
	
	### record parameters to file
	##q = open('sim_data_2D_mig{0}_CM{1}.txt'.format("%.2f"% round(mig_sigma/float(25),2),CM_sigma_frac),'a')
	##q.write("PARAMS VARIED BETWEEN SIMS:"+"\n"+'average distance (km/yr):     '+str(mig_sigma/float(25))+"\n"+"\n"+"PARAMS FIXED BETWEEN SIMS:"+'\n'+"generations:                  "+str(generations)+'\n'+'\n'+'number of CM measurements:    '+str(num_CM_meas)+'\n'+'initial CM measurement mean:  '+str(CM_mu)+"\n"+'CM sigma (proportion):        '+str(CM_sigma_frac)+'\n'+'CM sigma (value):             '+str(CM_sigma_val)+'\n'+'\n'+'initial number of entities:   '+str(in_entities)+'\n'+'maximum number of entities:   '+str(max_entities)+'\n'+'\n'+'probability of fission:       '+str(prob_fis)+"\n"+'probability of sampling:      '+str(prob_dep)+"\n"+'\n')
	##q.close()
	
	# initialise array for saving output to file (+3 for n, x and y values)
	final_output = zeros((1, num_CM_meas+3))
	
	
	##################
	### INITIALISE ###
	##################
	
	# initial (empty) array for storing population density values in
	entities = in_entities
	
	# initial positions
	x = numpy.random.uniform(x_min, x_max, (entities,1))	
	y = numpy.random.uniform(y_min, y_max, (entities,1))	
	
	x_original = x.copy()
	y_original = y.copy()
	
	#plot(x,y,'.k')
	#axis([x_min, x_max, y_min, y_max])
	#hold(False)
	#show()
	
	# initial CM measurements
	CM_matrix = CM_mu*ones((entities,num_CM_meas))
	CM_sigma = CM_sigma_val*ones((num_CM_meas, ))
	
	
	###########################
	### START OF SIMULATION ###
	###########################
	
	start_time_2 = time.time()
	
	for n in range(generations):
		print 'generation: ', n, '\t', 'number of entities: ', entities
		
		### walk iteration ###
		xmove = numpy.random.normal(mig_mu, mig_sigma, (entities,1))	# amount to move by in x direction
		ymove = numpy.random.normal(mig_mu, mig_sigma, (entities,1))	# amount to move by in y direction
		
		# calculate new positions and check viability (geographical)
		xnew = x + xmove												# proposed x position
		xpos = where(less(xnew,x_min)|greater(xnew,x_max), x, xnew)		# check geographical viability of proposed x position
		x = xpos														# new x position
		
		ynew = y + ymove												# proposed  y position
		ypos = where(less(ynew,y_min)|greater(ynew,y_max), y, ynew)		# check geographical viability of proposed y position
		y = ypos														# new y position
		
		
		### fission / extinction iteration ###
		# entities undergo fission with probability == prob_fis
		CM_matrix_original = CM_matrix.copy()
		fis = scipy.random.random((entities,))												# entities undergo fission if value in corresponding fis array <= prob_fis
		
		# FISSION PROCESS - duplicate data for entities that undergo fission in x, y and CM_matrix
		fis_entities_ind = where(less_equal(fis,prob_fis))									# indices of entities undergoing fission
	#	print 'fis entities:', len(fis_entities_ind[0])
		
		x = vstack((x, x[fis_entities_ind]))
		y = vstack((y, y[fis_entities_ind]))
		CM_matrix = vstack((CM_matrix, CM_matrix_original[fis_entities_ind]))
		entities = x.shape[0]
		
		# check if number of entities has reached max_entities; if so:
		# EXTINCTION PROCESS - delete data for entities that undergo extinction from x, y and CM_matrix
	#	if entities>max_entities: print 'THERE ARE MORE ENTITIES THAN MAX ENTITIES - AN EXTINCTION PROCESS SHOULD BE HAPPENING HERE!'
	
		CM_matrix_original = CM_matrix.copy()
		
		if entities>max_entities:	
			ext_entities_ind = random.sample(range(entities), entities-max_entities)		# indices of surplus # of entities selected (random sampling) to undergo extinction
	#		if len(ext_entities_ind): print 'ext entities:', len(ext_entities_ind)
			
			x = delete(x, ext_entities_ind, axis=0)
			y = delete(y, ext_entities_ind, axis=0)
			CM_matrix = delete(CM_matrix_original, ext_entities_ind, axis=0)
			entities = x.shape[0]
		
		# check if all entities extinct
		if entities == 0:
			q = open('sim_data_2D_mig{0}_cm{1}_fis{2}_{3}.txt'.format("%.6f"% round(mig_sigma,12),CM_sigma_frac,prob_fis),taskID,'a')
			q.write("All entities have gone extinct at iteration "+str(n)+'.'+'\n')
			q.close()
			break
		
		
		### mutation iteration ###
		# NOTE! each CM measurement of each entity mutates (varies slightly) between generations
		# CM measurements vary according to gaussian distribution with mean CM_matrix and s.d. CM_sigma
		CM_matrix = scipy.random.normal(CM_matrix, CM_sigma, (entities,num_CM_meas))
		CM_matrix = abs(CM_matrix)
		
		
		### feature depositing iteration ###
		# entities sampled with probability == prob_dep
		# for sampled entities, data recoded to output: 25*n, x, y, CM_matrix values
		if (n>10000):
			dep = scipy.random.binomial(1, prob_dep, (entities,))
			dep_entities_ind = where(dep==1)												# indices of entities sampled
			dep_matrix = hstack((25*n*ones((len(dep_entities_ind[0]),1)), x[dep_entities_ind], y[dep_entities_ind], CM_matrix[dep_entities_ind]))		# 25*n, x, y and CM_matrix values for entities sampled
			final_output = vstack((final_output, dep_matrix))
	
	end_time_2 = time.time()
	time_taken_2 = end_time_2 - start_time_2
	print "time taken for", n, "generations is", time_taken_2/60, "minutes"
	
	#########################
	### END OF SIMULATION ###
	#########################
	
	
	##############
	### OUTPUT ###
	##############
	
	# record output to file
	q = open('sim_data_2D_mig{0}_cm{1}_fis{2}_{3}.txt'.format("%.6f"% round(mig_sigma,12),CM_sigma_frac,prob_fis,taskID),'a')
	savetxt(q, final_output[1:])
	q.close()
	
	run_r_simdata = 'R CMD BATCH "--args ' + str("%.6f"% round(mig_sigma,12) + '-' + str(CM_sigma_frac) + '-' + str(prob_fis) + '-' + str(taskID)) + '-' + str(generations) + '" simdata_2Dmodel.R'
	os.system(run_r_simdata)
	
back to top