{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Jupyter Notebook for simulation and data collection only (main figures 2-4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Populating the interactive namespace from numpy and matplotlib\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import random as rd\n",
    "import functions_plant_pollinator_evolution as ppe\n",
    "import time\n",
    "%pylab inline\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "start_total_time = time.time()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1.224860760096506, 1.22497197337306] 0.5124022081433903 0.5121786393274811\n",
      "0.9031806625597399\n"
     ]
    }
   ],
   "source": [
    "c_P        = 1      # intraspecific competition of the plant [1/(time*P-Pop)]\n",
    "c_A        = 1      # intraspecific competition of the pollinator [1/(time*A-Pop)]\n",
    "gamma_A    = 1      # mutualistic gain of the plant (e.g. benefits of pollination)\n",
    "gamma_P    = 1      # mutualistic gain of the pollinator (e.g. energy gain of nectar)\n",
    "eco_parameter     = [c_P,c_A,gamma_A,gamma_P]\n",
    "\n",
    "alpha_max  = 0.8    # maxiumum value for the plant attractiveness\n",
    "s_a        = 3\n",
    "beta_max   = 0.8    # maxiumum value for the pollinator effort\n",
    "s_b        = 3\n",
    "tof_parameter = [alpha_max,s_a,beta_max,s_b]\n",
    "\n",
    "# defining evolutionary parameter\n",
    "mut_step_a = 0.016  # mutant and resident trait differ for alpha \n",
    "mut_step_b = 0.016  # mutant and resident trait differ for beta\n",
    "P_mut_prop = 1\n",
    "A_mut_prop = 1\n",
    "evo_parameter = [mut_step_a,mut_step_b,P_mut_prop,A_mut_prop]\n",
    "\n",
    "env_change = 1 # test value if environment is changing\n",
    "r_A_change = 0.001 # Amount of decrease per time step\n",
    "time_point = 0\n",
    "env_parameter = [env_change,r_A_change,time_point]\n",
    "\n",
    "\n",
    "# calculate optimal alpah and beta value and starting population for parameter setting \n",
    "\n",
    "max_num_mut = 1000\n",
    "count_mut   = 0\n",
    "alpha       = 0.5127149146621419 # using the optimal strategie of no insect decline as a beginning\n",
    "beta        = 0.5127149146621419 # using the optimal strategie of no insect declineas a beginning\n",
    "alpha_m     = alpha + mut_step_a * np.random.normal(0,1/2.5758) # initial mutant strategy\n",
    "beta_m      =  beta + mut_step_b * np.random.normal(0,1/2.5758) # initial mutant strategy\n",
    "X0          = [1.2252774066850036,1.2252774066850036] # starting population\n",
    "\n",
    "alpha_0,beta_0,X0 = ppe.starting_values(0.5,0.5,eco_parameter,tof_parameter,evo_parameter,env_parameter)\n",
    "print(X0, alpha_0, beta_0)\n",
    "r_P   = ppe.rp_parameter(alpha,tof_parameter)\n",
    "r_A   = ppe.ra_parameter( beta,tof_parameter)\n",
    "print(r_P)\n",
    "\n",
    "\n",
    "Cmap=cm.get_cmap('seismic_r')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Figure 2\n",
    "\n",
    "# 2 heatmaps with different intaction gain & competition combinations"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "start_time = time.time()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "A_ext      = 0.01\n",
    "t_limit    = 1000000\n",
    "limits = [A_ext, t_limit]\n",
    "\n",
    "num_val = 150\n",
    "\n",
    "fig_2_gain = [np.zeros((num_val,num_val))]\n",
    "gamma_list = np.linspace(0,1.5,num_val) # propability of a plant/pollinator mutation\n",
    "\n",
    "mut_prob_list = [0.1]\n",
    "\n",
    "np.random.seed(14) # select seed for random -> to achieve same results   \n",
    "\n",
    "for n, mut_prob in enumerate(mut_prob_list):\n",
    "    \n",
    "    extinction_time = np.zeros((num_val,num_val))\n",
    "\n",
    "    for i, gamma_A in enumerate(gamma_list):\n",
    "\n",
    "        for j, gamma_P in enumerate(gamma_list):\n",
    "            \n",
    "                \n",
    "            eco_parameter   = [c_P,c_A,gamma_A,gamma_P]\n",
    "            alpha_0,beta_0,x = ppe.starting_values(alpha,beta,eco_parameter,tof_parameter,evo_parameter,env_parameter)\n",
    "                \n",
    "                \n",
    "            evo_parameter = [mut_step_a,mut_step_b,0,0]\n",
    "            x,A_list,x,x,x = ppe.coevolution_seperate(alpha_0,beta_0, limits,\n",
    "                                                        eco_parameter,tof_parameter,evo_parameter,env_parameter)\n",
    "            ref_time = len(A_list)\n",
    "\n",
    "            evo_parameter = [mut_step_a,mut_step_b,mut_prob,mut_prob]\n",
    "            x,A_list,x,x,x = ppe.coevolution_seperate(alpha_0,beta_0, limits,\n",
    "                                                        eco_parameter,tof_parameter,evo_parameter,env_parameter)\n",
    "\n",
    "            extinction_time[j,i] = len(A_list)/ref_time\n",
    "                \n",
    "    fig_2_gain = np.vstack([fig_2_gain,[extinction_time]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "numpy.savetxt(\"Fig_2_hm_gain_0.1.csv\",fig_2_gain[1],delimiter=\",\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "env_change = 1 # test value if environment is changing\n",
    "r_A_change = 0.001 # Amount of decrease per time step\n",
    "time_point = 0\n",
    "env_parameter = [env_change,r_A_change,time_point]\n",
    "\n",
    "c_P        = 1      # intraspecific competition of the plant [1/(time*P-Pop)]\n",
    "c_A        = 1      # intraspecific competition of the pollinator [1/(time*A-Pop)]\n",
    "gamma_A    = 1.4      # mutualistic gain of the plant (e.g. benefits of pollination)\n",
    "gamma_P    = 1.4      # mutualistic gain of the pollinator (e.g. energy gain of nectar)\n",
    "eco_parameter     = [c_P,c_A,gamma_A,gamma_P]\n",
    "\n",
    "num_val = 150 # number of values to go through\n",
    "\n",
    "fig_2_comp = [np.zeros((num_val,num_val))] # \"Heatmap of competition\" dummy\n",
    "c_list     = np.linspace(0.92,2.5,num_val) # probability of a plant/pollinator mutation\n",
    "\n",
    "A_ext      = 0.01\n",
    "t_limit    = 1000000\n",
    "limits = [A_ext, t_limit]\n",
    "\n",
    "list_mut_prob = [0.1]\n",
    "\n",
    "np.random.seed(14) # select seed for random -> to achieve same results     \n",
    "\n",
    "for n, mut_prob in enumerate(list_mut_prob):\n",
    "    \n",
    "    extinction_time = np.zeros((num_val,num_val))\n",
    "\n",
    "    for i, c_P in enumerate(c_list):\n",
    "\n",
    "        for j, c_A in enumerate(c_list):\n",
    "            \n",
    "            #np.random.seed(1) # select seed for random -> to achieve same results  \n",
    "                \n",
    "                \n",
    "            eco_parameter   = [c_P,c_A,gamma_A,gamma_P]\n",
    "            alpha_0,beta_0,x = ppe.starting_values(alpha,beta,eco_parameter,tof_parameter,evo_parameter,env_parameter)\n",
    "                \n",
    "                \n",
    "            evo_parameter = [mut_step_a,mut_step_b,0,0]\n",
    "            x,A_list,x,x,x = ppe.coevolution_seperate(alpha_0,beta_0, limits,\n",
    "                                                        eco_parameter,tof_parameter,evo_parameter,env_parameter)\n",
    "            ref_time = len(A_list)\n",
    "                \n",
    "\n",
    "            evo_parameter = [mut_step_a,mut_step_b,mut_prob,0.5]\n",
    "            x,A_list,x,x,x = ppe.coevolution_seperate(alpha_0,beta_0, limits,\n",
    "                                                        eco_parameter,tof_parameter,evo_parameter,env_parameter)\n",
    "\n",
    "            extinction_time[j,i] = len(A_list)/ref_time\n",
    "                \n",
    "    fig_2_comp = np.vstack([fig_2_comp,[extinction_time]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "numpy.savetxt(\"Fig_2_hm_comp_0.1.csv\",fig_2_comp[1],delimiter=\",\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "It took 238.69778519471487 min to run this figure.\n"
     ]
    }
   ],
   "source": [
    "end_time = time.time()\n",
    "\n",
    "print(\"It took \"+str((end_time-start_time)/60)+\" min to run this figure.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Figure 3\n",
    "\n",
    "# 3 heatmaps with different mut probability combinations"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "start_time = time.time()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "gamma = 1.0\n",
      "gamma = 1.4\n",
      "gamma = 1.5\n"
     ]
    }
   ],
   "source": [
    "env_change = 1 # test value if environment is changing\n",
    "r_A_change = 0.001# Amount of decrease per time step\n",
    "time_point = 0\n",
    "env_parameter = [env_change,r_A_change,time_point]\n",
    "\n",
    "c_P     = 1      # intraspecific competition of the plant [1/(time*P-Pop)]\n",
    "c_A     = 1      # intraspecific competition of the pollinator [1/(time*A-Pop)]\n",
    "\n",
    "A_ext   = 0.01\n",
    "t_limit = 1000000\n",
    "limits  = [A_ext, t_limit]\n",
    "\n",
    "num_val = 150\n",
    "\n",
    "fig_3_hm      = [np.zeros((num_val,num_val))]\n",
    "mut_prob_list = np.linspace(0,1,num_val) # probability of a plant/pollinator mutation\n",
    "\n",
    "gamma_list = [1.0,1.4,1.5]\n",
    "\n",
    "for n, gamma in enumerate(gamma_list):\n",
    "    \n",
    "    extinction_time = np.zeros((num_val,num_val))\n",
    "    \n",
    "    print(r'gamma = '+str(gamma))\n",
    "\n",
    "    eco_parameter   = [c_P,c_A,gamma,gamma]\n",
    "\n",
    "    #np.random.seed(14)\n",
    "\n",
    "    alpha_0,beta_0,x = ppe.starting_values(alpha,beta,eco_parameter,tof_parameter,evo_parameter,env_parameter)\n",
    "\n",
    "    for i, P_mut_prob in enumerate(mut_prob_list):\n",
    "\n",
    "        for j, A_mut_prob in enumerate(mut_prob_list):\n",
    "\n",
    "            evo_parameter = [mut_step_a,mut_step_b,P_mut_prob,A_mut_prob]\n",
    "\n",
    "            x,A_list,x,x,x = ppe.coevolution_seperate(alpha_0,beta_0, limits,\n",
    "                                                    eco_parameter,tof_parameter,evo_parameter,env_parameter)\n",
    "\n",
    "            if P_mut_prob == 0 and A_mut_prob == 0:\n",
    "                ref_pop = A_list[-1]   \n",
    "                ref_time = len(A_list)\n",
    "\n",
    "                #print(ref_time)\n",
    "\n",
    "            extinction_time[j,i] = len(A_list)/ref_time\n",
    "\n",
    "    fig_3_hm = np.vstack([fig_3_hm,[extinction_time]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Save heatmaps:\n",
    "\n",
    "numpy.savetxt(\"Fig_3_hm_gain_prob_1.0.csv\",fig_3_hm[1],delimiter=\",\")\n",
    "numpy.savetxt(\"Fig_3_hm_gain_prob_1.4.csv\",fig_3_hm[2],delimiter=\",\")\n",
    "numpy.savetxt(\"Fig_3_hm_gain_prob_1.5.csv\",fig_3_hm[3],delimiter=\",\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "It took 21.08595624367396 min to run this figure.\n"
     ]
    }
   ],
   "source": [
    "end_time = time.time()\n",
    "\n",
    "print(\"It took \"+str((end_time-start_time)/60)+\" min to run this figure.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Figure 4\n",
    "\n",
    "# 3 heatmaps of changing environmental decay and mut. probabilities"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "start_time = time.time()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1/3 done\n",
      "2/3 done\n",
      "3/3 done\n"
     ]
    }
   ],
   "source": [
    "c_P        = 1      # intraspecific competition of the plant [1/(time*P-Pop)]\n",
    "c_A        = 1      # intraspecific competition of the pollinator [1/(time*A-Pop)]\n",
    "gamma_P    = 1.4      # mutualistic gain of the plant (e.g. benefits of pollination)\n",
    "gamma_A    = 1.4      # mutualistic gain of the pollinator (e.g. energy gain of nectar)\n",
    "eco_parameter     = [c_P,c_A,gamma_P,gamma_A]\n",
    "\n",
    "alpha_max  = 0.8    # maxiumum value for the plant attractiveness\n",
    "s_a        = 3\n",
    "beta_max   = 0.8    # maxiumum value for the pollinator effort\n",
    "s_b        = 3\n",
    "tof_parameter = [alpha_max,s_a,beta_max,s_b]\n",
    "\n",
    "# defining evolutionary parameter\n",
    "mut_step_a = 0.016  # mutant and resident trait differ for alpha \n",
    "mut_step_b = 0.016  # mutant and resident trait differ for beta\n",
    "P_mut_prob = 1\n",
    "A_mut_prob = 1\n",
    "evo_parameter = [mut_step_a,mut_step_b,P_mut_prob,A_mut_prob]\n",
    "\n",
    "P_mut_prob = 0\n",
    "A_mut_prob = 0\n",
    "evo_parameter_0 = [mut_step_a,mut_step_b,P_mut_prob,A_mut_prob]\n",
    "\n",
    "env_change = 1      # state if environment is changing\n",
    "r_A_change = 0      # value how much r_A is changing per time step \n",
    "time_point = 0      # counter for time step\n",
    "env_parameter     = [env_change,r_A_change,time_point]\n",
    "\n",
    "A_ext      = 0.01\n",
    "t_limit    = 1000000\n",
    "limits = [A_ext, t_limit]\n",
    "\n",
    "num_val = 150\n",
    "\n",
    "ref_etp = np.zeros((num_val,num_val))\n",
    "mut_etp = np.zeros((num_val,num_val))\n",
    "rel_etp = np.zeros((num_val,num_val))\n",
    "\n",
    "evo_speed = np.linspace(0,1,num_val)\n",
    "env_speed = np.geomspace(0.1,0.00001,num_val,endpoint=True)\n",
    "\n",
    "np.random.seed(14)\n",
    "\n",
    "for i, mut_prob in enumerate(evo_speed):\n",
    "    \n",
    "    evo_parameter = [mut_step_a,mut_step_b,mut_prob,mut_prob]\n",
    "    \n",
    "    for j, r_A_change in enumerate(env_speed):\n",
    "\n",
    "        env_parameter = [env_change,r_A_change,time_point]\n",
    "\n",
    "        alpha,beta,X0 = ppe.starting_values(0.5,0.5,eco_parameter,tof_parameter,evo_parameter,env_parameter)\n",
    "\n",
    "        P,A1,a,b,r = ppe.coevolution_seperate(alpha,beta,limits,eco_parameter,tof_parameter,evo_parameter_0,env_parameter)\n",
    "        ref_etp[j,i] = len(A1)\n",
    "\n",
    "        P,A2,a,b,r = ppe.coevolution_seperate(alpha,beta,limits,eco_parameter,tof_parameter,evo_parameter  ,env_parameter)\n",
    "        mut_etp[j,i] = len(A2)\n",
    "\n",
    "        rel_etp[j,i] = len(A2)/len(A1)\n",
    "        \n",
    "numpy.savetxt(\"Fig_4_hm_env_evo_speed_=_1.4.csv\",rel_etp,delimiter=\",\")\n",
    "print('1/3 done')\n",
    "\n",
    "c_P        = 1      # intraspecific competition of the plant [1/(time*P-Pop)]\n",
    "c_A        = 1      # intraspecific competition of the pollinator [1/(time*A-Pop)]\n",
    "gamma_P    = 1.5      # mutualistic gain of the plant (e.g. benefits of pollination)\n",
    "gamma_A    = 1.5      # mutualistic gain of the pollinator (e.g. energy gain of nectar)\n",
    "eco_parameter     = [c_P,c_A,gamma_P,gamma_A]\n",
    "\n",
    "for i, mut_prob in enumerate(evo_speed):\n",
    "    \n",
    "    evo_parameter = [mut_step_a,mut_step_b,mut_prob,mut_prob]\n",
    "    \n",
    "    for j, r_A_change in enumerate(env_speed):\n",
    "\n",
    "        env_parameter = [env_change,r_A_change,time_point]\n",
    "\n",
    "        alpha,beta,X0 = ppe.starting_values(0.5,0.5,eco_parameter,tof_parameter,evo_parameter,env_parameter)\n",
    "\n",
    "        P,A1,a,b,r = ppe.coevolution_seperate(alpha,beta,limits,eco_parameter,tof_parameter,evo_parameter_0,env_parameter)\n",
    "        ref_etp[j,i] = len(A1)\n",
    "\n",
    "        P,A2,a,b,r = ppe.coevolution_seperate(alpha,beta,limits,eco_parameter,tof_parameter,evo_parameter  ,env_parameter)\n",
    "        mut_etp[j,i] = len(A2)\n",
    "\n",
    "        rel_etp[j,i] = len(A2)/len(A1)\n",
    "        \n",
    "numpy.savetxt(\"Fig_4_hm_env_evo_speed_=_1.5.csv\",rel_etp,delimiter=\",\")\n",
    "print('2/3 done')\n",
    "\n",
    "for i, mut_prob in enumerate(evo_speed):\n",
    "    \n",
    "    evo_parameter = [mut_step_a,mut_step_b,mut_prob,0]\n",
    "    \n",
    "    for j, r_A_change in enumerate(env_speed):\n",
    "\n",
    "        env_parameter = [env_change,r_A_change,time_point]\n",
    "\n",
    "        alpha,beta,X0 = ppe.starting_values(0.5,0.5,eco_parameter,tof_parameter,evo_parameter,env_parameter)\n",
    "\n",
    "        P,A1,a,b,r = ppe.coevolution_seperate(alpha,beta,limits,eco_parameter,tof_parameter,evo_parameter_0,env_parameter)\n",
    "        ref_etp[j,i] = len(A1)\n",
    "\n",
    "        P,A2,a,b,r = ppe.coevolution_seperate(alpha,beta,limits,eco_parameter,tof_parameter,evo_parameter  ,env_parameter)\n",
    "        mut_etp[j,i] = len(A2)\n",
    "\n",
    "        rel_etp[j,i] = len(A2)/len(A1)\n",
    "        \n",
    "numpy.savetxt(\"Fig_4_hm_env_evo_speed_0_1.5.csv\",rel_etp,delimiter=\",\")\n",
    "print('3/3 done')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "It took 476.25492590268453 min to run this figure.\n"
     ]
    }
   ],
   "source": [
    "end_time = time.time()\n",
    "\n",
    "print(\"It took \"+str((end_time-start_time)/60)+\" min to run this figure.\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "It took 44162.52937531471 seconds to run the complete code.\n",
      "It took 736.0421562552452 minutes to run the complete code.\n",
      "It took 12.267369270920753 hours to run the complete code.\n"
     ]
    }
   ],
   "source": [
    "total_time = time.time() -start_total_time\n",
    "print(\"It took \"+str(total_time)+\" seconds to run the complete code.\")\n",
    "print(\"It took \"+str(total_time/60)+\" minutes to run the complete code.\")\n",
    "print(\"It took \"+str(total_time/3600)+\" hours to run the complete code.\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
