########## FIGURE 1 ##########
library(ggplot2)
library(dplyr)
library(tidyr)

generate_data <- function(n, N, num_individuals) {
  data <- replicate(n, sort(rmultinom(1, num_individuals, rep(1, N)), decreasing = TRUE) / num_individuals)
  data <- as.data.frame(data)
  data <- data %>% 
    mutate(Patch_rank = row_number()) %>% 
    pivot_longer(cols = -Patch_rank, names_to = "Simulation", values_to = "Proportion")
  data$Individuals <- paste(num_individuals, "individuals")
  data$N <- paste("N =", N)
  return(data)
}

n <- 100 # number of simulations
N_values <- c(1000, 100, 10)
num_individuals <- c(100, 1000, 10000)

data_list <- lapply(N_values, function(N_val) {
  lapply(num_individuals, function(num_ind) {
    generate_data(n, N_val, num_ind)
  }) %>% bind_rows()
}) %>% bind_rows()

ggplot(data_list, aes(x = Patch_rank, y = Proportion, group = Simulation)) +
  geom_line(color = "grey26") +
  facet_grid(N ~ Individuals, scales = "free_y") +
  labs(x = "Patch rank", y = "Proportion") +
  theme_bw() +
  theme(
    strip.text = element_text(size = 12),
    axis.title = element_text(size = 14),
    axis.text = element_text(size = 12)
  ) +
  scale_x_log10()



########## FIGURE 2 ##########
     a <- 1                                        # attack rate of parasitoids
    PP <- c(500,5000)							   # number of parasitoids
    HH <- unique(round(exp(seq(1,18,length=30))))  # number of hosts
    MU <- seq(0,40,by=5)   						   # host-dependent parasitoid dispersal
    NN <- c(10,100,1000)						   # number of patches
	nsim <- 30									   # number of simulations

out <- NULL
for(i1 in 1:length(PP)){
  P0 <- PP[i1]
for(i2 in 1:length(HH)){
  H0 <- HH[i2]
for(i3 in 1:length(MU)){
  mu <- MU[i3]
for(i4 in 1:length(NN)){
N <- NN[i4]
cat(i1,i2,i3,i4,"\n")

dead <- rep(NA,nsim)  # number of hosts parasitized
ps   <- rep(NA,nsim)  # per-capita searching efficiency

for(i in 1:nsim){
      H <- rmultinom(1,H0, rep(1/N,N))
      P <- rmultinom(1,P0,(H/H0)^mu)
  H.suv <- rbinom(N,H,exp(-a*P))
 dead[i] <- sum(H - H.suv)
   ps[i] <- log(H0/(H0-dead[i]))/P0
}

out <- rbind(out,c(P0,H0,mu,N,mean(dead/H0),mean(ps)))
}}}}

###    P: number of parasitoids
###    H: number of hosts
###   mu: mu in Eq. (1)
###    N: number of patches
### risk: per-capita parasitism risk
###    s: Eq. (4)
colnames(out) <- c("P","H","mu","N","risk","s")
out <- as.data.frame(out)


library(lattice)
xyplot(risk~log(H)|N*P,group=mu,data=out,type="b")



########## FIGURE 3 ##########
      a <- 1
     PP <-  round(10^seq(0.5,2,length=20))      # number of parasitoids
     HH <- c(5000,50000,500000)                 # number of hosts
     MU <- seq(0,40,by=5)					    # host-dependent parasitoid dispersal
   nsim <- 30                                   # number of simulations
     NN <- c(10,100,1000)  					    # number of patches


out <- NULL
for(i1 in 1:length(PP)){
  P0 <- PP[i1]
for(i2 in 1:length(HH)){
  H0 <- HH[i2]
for(i3 in 1:length(MU)){
  mu <- MU[i3]
for(i4 in 1:length(NN)){
N <- NN[i4]
cat(i1,i2,i3,i4,"\n")

dead <- rep(NA,nsim)  # number of hosts parasitized
ps   <- rep(NA,nsim)  # per-capita searching efficiency

for(i in 1:nsim){
      H <- rmultinom(1,H0, rep(1/N,N))
      P <- rmultinom(1,P0,(H/H0)^mu)
  H.suv <- rbinom(N,H,exp(-a*P))
 dead[i] <- sum(H - H.suv)
   ps[i] <- log(H0/(H0-dead[i]))/P0
}

out <- rbind(out,c(P0,H0,mu,N,mean(dead/H0),mean(ps)))
}}}}
colnames(out) <- c("P","H","mu","N","risk","s")
out <- as.data.frame(out)
out[out$s==Inf,"s"] <- NA

library(ggplot2)
ggplot(out,aes(x=log(P,base=10),y=s,pch=factor(mu),col=factor(mu)))+geom_point()+facet_wrap(~N+H,scales="free_y")+ scale_shape_manual(values = 0:10)



########## FIGURE 4 ##########
AA <- 1					  # attack rate of parasitoids
LAMBDA <- seq(2,12,by=1)  # host growth rate
NN <- c(10,100,1000)      # number of patches
MU <- seq(0,40,by=4)      # host-dependent parasitoid dispersal
ngen <- 1000              # number of generations
nsim <- 5                 # number of simulations
cc   <- 1

IC <- 1.2	
out <- NULL
for(i1 in 1:length(NN)){
 N <- NN[i1]
for(i2 in 1:length(AA)){
 a <- AA[i2]
for(i3 in 1:length(LAMBDA)){
 R <- LAMBDA[i3]
for(i4 in 1:length(MU)){
 mu <- MU[i4]
 cat(i1,i2,i3,i4,"\n")

## initial densities
init.P <- ceiling((log(R)/a)*N*mu^IC)
init.H <- ceiling(init.P*(R/(R-1)))

pers <- 0
for(j in 1:nsim){
 H <- rmultinom(1,init.H, rep(1/N,N))
 P <- rmultinom(1,init.P,(H/sum(H))^mu)
for(i in 1:ngen){
#cat(sum(H),sum(P),"\n")
pers0 <- i
if(sum(H)==0|sum(P)==0) break
H.suv  <- rbinom(N,H,exp(-a*P)) # unparasitized hosts
H.par <- H - H.suv  # parasitized hosts

  H <-  rmultinom(1,rpois(1,R*sum(H.suv)), rep(1/N,N))
  if(sum(H)>0)  P <- rmultinom(1,sum(H.par)*cc,(H/mean(H))^mu)  # divide by mean to avoid being too large
  if(sum(H)==0) P <- rmultinom(1,sum(H.par)*cc,rep(1/N,N))
}
if(pers0==ngen) pers <- pers + 1
}

out <- rbind(out,c(N,a,R,mu,pers/nsim))
}}}}
colnames(out) <- c("N","a","R","mu","pers")
out <- as.data.frame(out)

library(lattice)
levelplot(pers~mu*R|N*a,data=out)



########## FIGURE 5 ##########
set.seed(201)
get.cv2 <- function(H,P){
   risk <- a*P
   z0 <-  rep(risk,H)
   risk.mean <- mean(z0)
   n <- length(z0)
   risk.var <- var(z0)*((n-1)/n)  # population variance
   risk.var/risk.mean^2
   }
   
# parameters
a <- 1         # attack rate of parasitoids
N <- 1000      # number of patches
mu <- 20       # host-dependent parasitoid dispersal
R <- 10        # host grwoth rate
cc <- 1		   # number of parasitoid per parasitized host		
ngen <- 1000   # number of generations

## initial densities
  IC <- 1.2
  init.P <- ceiling((log(R)/a)*N*mu^IC)
  init.H <- ceiling(init.P*(R/(R-1)))
  H <- rmultinom(1,init.H, rep(1/N,N))
  P <- rmultinom(1,init.P,(H/sum(H))^mu)
  cv2 <- get.cv2(H,P)
  out <- matrix(NA,ngen+1,3)

  out[1, ] <- c(init.H,init.P,cv2)

for(i in 1:ngen){
#cat(sum(H),sum(P),"\n")
if(sum(H)==0|sum(P)==0) break
H.suv  <- rbinom(N,H,exp(-a*P)) # unparasitized hosts
H.par <- H - H.suv  # parasitized hosts

  H <-  rmultinom(1,rpois(1,R*sum(H.suv)), rep(1/N,N))
  if(sum(H)>0)  P <- rmultinom(1,sum(H.par)*cc,(H/mean(H))^mu)  # divide by mean to avoid becoming too large
  if(sum(H)==0) P <- rmultinom(1,sum(H.par)*cc,rep(1/N,N))
  cv2 <- get.cv2(H,P)
out[i+1,] <- c(sum(H),sum(P),cv2)
}

par(mfrow=c(1,3),mai=c(0.7,0.7,0.13,0.1),cex.axis=1.3,cex.lab=1.8)
options(scipen=5) 
matplot(out[!is.na(out[,1]),1:2],type="l",xlab="Generation, t",ylab="Number of individuals")
legend("topleft",c("Host","Parasitoid"),lty=c(1,2),cex=1.4,col=c("black","red"))
plot(out[,1],out[,3],log="y",xlab="Number of hosts, H",ylab=expression(CV^2))
plot(out[,2],out[,3],log="y",xlab="Number of parasitoids, P",ylab=expression(CV^2))


