Dear R-users, I would like to maximize the function g above which depends on 4 parameters (2 vectors, 1 real number, and 1 matrix) using optim() and BFGS method. Here is my code: # fonction to maximize g=function(x) { x1 = x[1:ncol(X)] x2 = x[(ncol(X)+1)] x3 = matrix(x[(ncol(X)+2):(ncol(X)+1+ncol(X)*ncol(Y))],nrow=ncol(X),ncol=ncol(Y)) x4 = x[(ncol(X)+1+ncol(X)*ncol(Y)+1):length(x)] res1=rep(0,nrow(X)) res2=matrix(0,nrow=nrow(X),ncol=ncol(Y)) log.res2=matrix(0,nrow=nrow(X),ncol=ncol(Y)) res2.b=rep(0,nrow(X)) res3 = rep(0,nrow(X)) res3.b = rep(0,nrow(X)) for (i in 1:nrow(X)) { res1[i]=1/(1+exp(-t(x1)%*%X[i,]-x2)) for (t in 1:ncol(Y)) { res2[i,t] = ((1-(1+exp(-t(x3[,t])%*%X[i,]-x4[t]))^(-1))^(abs(Y[i,t]-Yb[i])))*(((1+exp(-t(x3[,t])%*%X[i,]-x4[t]))^(-1))^(1-abs(Y[i,t]-Yb[i]))) log.res2[i,t]=log(res2[i,t]) res2.b[i]=res2.b[i]+log.res2[i,t] } res3[i] = p_tilde[i]*log(res1[i]) res3.b[i] = p_tilde[i]*(res2.b[i]) } -(ncol(Y)*sum(res3)+sum(res3.b)) } $B!!(B ##### Gradiants: gr=function(x) { x1 = x[1:ncol(X)] x2 = x[(ncol(X)+1)] x3 = matrix(x[(ncol(X)+2):(ncol(X)+1+ncol(X)*ncol(Y))],nrow=ncol(X),ncol=ncol(Y)) x4 = x[(ncol(X)+1+ncol(X)*ncol(Y)+1):length(x)] gr1 = rep(0,ncol(X)) gr4 = rep(0,ncol(Y)) gr3 = matrix(0,nrow=ncol(X),ncol=ncol(Y)) gr1.b = matrix(0,nrow=nrow(X),ncol=ncol(X)) gr2.b = rep(0,nrow(X)) eta = matrix(0,nrow=nrow(X),ncol=ncol(Y)) d.eta.3 = array(0,dim=c(nrow(X),ncol(X),ncol(Y))) d.eta.4 = matrix(0,nrow=nrow(X),ncol=ncol(Y)) gr3.b1 = array(0,dim=c(nrow(X),ncol(X),ncol(Y))) gr4.b1 = matrix(0,nrow=nrow(X),ncol=ncol(Y)) $B!!(B #Gradiant of alpha and beta for (i in 1:nrow(X)) { gr1.b[i,] = (2*p_tilde[i]-1)*((exp(-t(x1)%*%X[i,]-x2)*X[i,])/(1+exp(-t(x1)%*%X[i,]-x2))^2) gr2.b[i] = (2*p_tilde[i]-1)*((exp(-t(x1)%*%X[i,]-x2))/(1+exp(-t(x1)%*%X[i,]-x2))^2) } for (j in 1:ncol(X)) { gr1[j] = sum(gr1.b[,j]) } gr2 = sum(gr2.b) #Gradiant de w et gamma for (i in 1:nrow(X)) { for (t in 1:ncol(Y)) { eta[i,t] = 1/(1+exp(-t(x3[,t])%*%X[i,]-x4[t])) d.eta.3[i,,t] = eta[i,t]*(1-eta[i,t])*X[i,] d.eta.4[i,t] = eta[i,t]*(1-eta[i,t]) gr3.b1[i,,t] = p_tilde[i]*((-abs(Y[i,t]-Yb[i]))*(1-eta[i,t])^(-1)+(1-abs(Y[i,t]-Yb[i]))* (eta[i,t])^(-1))*d.eta.3[i,,t] gr4.b1[i,t] = p_tilde[i]*((-abs(Y[i,t]-Yb[i]))*(1-eta[i,t])^(-1)+(1-abs(Y[i,t]-Yb[i]))* (eta[i,t])^(-1))*d.eta.4[i,t] } } for (t in 1:ncol(Y)) { for (j in 1:ncol(X)) { gr3[j,t] = sum(gr3.b1[,j,t]) } gr4[t] = sum(gr4.b1[,t]) } c(-gr1,-gr2,-gr3,-gr4) } opt = optim(c(alpha[,c+1],beta[c+1],w,gamma),g,gr,method="BFGS") The problem is that it gives me wrong results, and I have noticed that if I change my function to maximize (for example if, instead of -(ncol(Y)*sum(res3)+sum(res3.b)), I try to maximise -(ncol(Y)*sum(res3)), it gives me the exactly same results...which is not possible! So maybe I am using optim() in a wrong way...Does someone have an idea what could be wrong in my code ? Thank you very much in advance [[alternative HTML version deleted]]
What do you mean when you say "wrong results"? What do you expect for the output? Your code doesn't work for me because it references X in places and X is not defined. Have you tested your functions to make sure they return reasonable values? On Thu, May 19, 2011 at 9:17 AM, chirine wolley <wolley.chirine at hotmail.com> wrote:> > Dear R-users, > > I would like to maximize the function g above which depends on 4 parameters (2 vectors, 1 real number, and 1 matrix) ?using optim() and BFGS method. Here is my code: > > # fonction to maximize > > g=function(x) > { > x1 = x[1:ncol(X)] > x2 = x[(ncol(X)+1)] > x3 = matrix(x[(ncol(X)+2):(ncol(X)+1+ncol(X)*ncol(Y))],nrow=ncol(X),ncol=ncol(Y)) > x4 = x[(ncol(X)+1+ncol(X)*ncol(Y)+1):length(x)] > res1=rep(0,nrow(X)) > res2=matrix(0,nrow=nrow(X),ncol=ncol(Y)) > log.res2=matrix(0,nrow=nrow(X),ncol=ncol(Y)) > res2.b=rep(0,nrow(X)) > res3 = rep(0,nrow(X)) > res3.b = rep(0,nrow(X)) > for (i in 1:nrow(X)) > { > res1[i]=1/(1+exp(-t(x1)%*%X[i,]-x2)) > for (t in 1:ncol(Y)) > { > res2[i,t] = ((1-(1+exp(-t(x3[,t])%*%X[i,]-x4[t]))^(-1))^(abs(Y[i,t]-Yb[i])))*(((1+exp(-t(x3[,t])%*%X[i,]-x4[t]))^(-1))^(1-abs(Y[i,t]-Yb[i]))) > log.res2[i,t]=log(res2[i,t]) > res2.b[i]=res2.b[i]+log.res2[i,t] > } > res3[i] = p_tilde[i]*log(res1[i]) > res3.b[i] = p_tilde[i]*(res2.b[i]) > } > -(ncol(Y)*sum(res3)+sum(res3.b)) > > } > > ##### Gradiants: > > gr=function(x) > { > x1 = x[1:ncol(X)] > x2 = x[(ncol(X)+1)] > x3 = matrix(x[(ncol(X)+2):(ncol(X)+1+ncol(X)*ncol(Y))],nrow=ncol(X),ncol=ncol(Y)) > x4 = x[(ncol(X)+1+ncol(X)*ncol(Y)+1):length(x)] > gr1 = rep(0,ncol(X)) > gr4 = rep(0,ncol(Y)) > gr3 = matrix(0,nrow=ncol(X),ncol=ncol(Y)) > gr1.b = matrix(0,nrow=nrow(X),ncol=ncol(X)) > gr2.b = rep(0,nrow(X)) > eta = matrix(0,nrow=nrow(X),ncol=ncol(Y)) > d.eta.3 = array(0,dim=c(nrow(X),ncol(X),ncol(Y))) > d.eta.4 = matrix(0,nrow=nrow(X),ncol=ncol(Y)) > gr3.b1 = array(0,dim=c(nrow(X),ncol(X),ncol(Y))) > gr4.b1 = matrix(0,nrow=nrow(X),ncol=ncol(Y)) > > #Gradiant of alpha and beta > > for (i in 1:nrow(X)) > { > gr1.b[i,] = (2*p_tilde[i]-1)*((exp(-t(x1)%*%X[i,]-x2)*X[i,])/(1+exp(-t(x1)%*%X[i,]-x2))^2) > gr2.b[i] = (2*p_tilde[i]-1)*((exp(-t(x1)%*%X[i,]-x2))/(1+exp(-t(x1)%*%X[i,]-x2))^2) > } > for (j in 1:ncol(X)) > { > gr1[j] = sum(gr1.b[,j]) > } > gr2 = sum(gr2.b) > > > #Gradiant de w et gamma > for (i in 1:nrow(X)) > { > for (t in 1:ncol(Y)) > { > eta[i,t] = 1/(1+exp(-t(x3[,t])%*%X[i,]-x4[t])) > d.eta.3[i,,t] = eta[i,t]*(1-eta[i,t])*X[i,] > d.eta.4[i,t] = eta[i,t]*(1-eta[i,t]) > gr3.b1[i,,t] = p_tilde[i]*((-abs(Y[i,t]-Yb[i]))*(1-eta[i,t])^(-1)+(1-abs(Y[i,t]-Yb[i]))* > (eta[i,t])^(-1))*d.eta.3[i,,t] > gr4.b1[i,t] = p_tilde[i]*((-abs(Y[i,t]-Yb[i]))*(1-eta[i,t])^(-1)+(1-abs(Y[i,t]-Yb[i]))* > (eta[i,t])^(-1))*d.eta.4[i,t] > } > } > for (t in 1:ncol(Y)) > { > for (j in 1:ncol(X)) > { > gr3[j,t] = sum(gr3.b1[,j,t]) > } > gr4[t] = sum(gr4.b1[,t]) > } > c(-gr1,-gr2,-gr3,-gr4) > } > > opt = optim(c(alpha[,c+1],beta[c+1],w,gamma),g,gr,method="BFGS") > > The problem is that it gives me wrong results, and I have noticed that if I change my function to maximize (for example if, instead of -(ncol(Y)*sum(res3)+sum(res3.b)), I try to maximise -(ncol(Y)*sum(res3)), it gives me the exactly same results...which is not possible! > So maybe I am using optim() in a wrong way...Does someone have an idea what could be wrong in my code ? > > Thank you very much in advance > ? ? ? ?[[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >-- ==============================================Jon Daily Technician ==============================================#!/usr/bin/env outside # It's great, trust me.
From: wolley.chirine@hotmail.com To: biomathjdaily@gmail.com Subject: RE: [R] problem with optim() Date: Thu, 19 May 2011 15:45:15 +0200 First, thank you for ur response... Actually I didn't write the entire code ...X, Y and p_tilde are of course all defined at the beginning of my code. Normally the optimal values that I get should let me create a model for prediction. However the model currently obtained is not good at all.... And I think that the fact it gives me the exactly same values if I change the function to maximize shows that there's a problem in my code....> Date: Thu, 19 May 2011 09:29:02 -0400 > Subject: Re: [R] problem with optim() > From: biomathjdaily@gmail.com > To: wolley.chirine@hotmail.com > CC: r-help@r-project.org > > What do you mean when you say "wrong results"? What do you expect for > the output? Your code doesn't work for me because it references X in > places and X is not defined. > > Have you tested your functions to make sure they return reasonable values? > > On Thu, May 19, 2011 at 9:17 AM, chirine wolley > <wolley.chirine@hotmail.com> wrote: > > > > Dear R-users, > > > > I would like to maximize the function g above which depends on 4 parameters (2 vectors, 1 real number, and 1 matrix) using optim() and BFGS method. Here is my code: > > > > # fonction to maximize > > > > g=function(x) > > { > > x1 = x[1:ncol(X)] > > x2 = x[(ncol(X)+1)] > > x3 = matrix(x[(ncol(X)+2):(ncol(X)+1+ncol(X)*ncol(Y))],nrow=ncol(X),ncol=ncol(Y)) > > x4 = x[(ncol(X)+1+ncol(X)*ncol(Y)+1):length(x)] > > res1=rep(0,nrow(X)) > > res2=matrix(0,nrow=nrow(X),ncol=ncol(Y)) > > log.res2=matrix(0,nrow=nrow(X),ncol=ncol(Y)) > > res2.b=rep(0,nrow(X)) > > res3 = rep(0,nrow(X)) > > res3.b = rep(0,nrow(X)) > > for (i in 1:nrow(X)) > > { > > res1[i]=1/(1+exp(-t(x1)%*%X[i,]-x2)) > > for (t in 1:ncol(Y)) > > { > > res2[i,t] = ((1-(1+exp(-t(x3[,t])%*%X[i,]-x4[t]))^(-1))^(abs(Y[i,t]-Yb[i])))*(((1+exp(-t(x3[,t])%*%X[i,]-x4[t]))^(-1))^(1-abs(Y[i,t]-Yb[i]))) > > log.res2[i,t]=log(res2[i,t]) > > res2.b[i]=res2.b[i]+log.res2[i,t] > > } > > res3[i] = p_tilde[i]*log(res1[i]) > > res3.b[i] = p_tilde[i]*(res2.b[i]) > > } > > -(ncol(Y)*sum(res3)+sum(res3.b)) > > > > } > > > > ##### Gradiants: > > > > gr=function(x) > > { > > x1 = x[1:ncol(X)] > > x2 = x[(ncol(X)+1)] > > x3 = matrix(x[(ncol(X)+2):(ncol(X)+1+ncol(X)*ncol(Y))],nrow=ncol(X),ncol=ncol(Y)) > > x4 = x[(ncol(X)+1+ncol(X)*ncol(Y)+1):length(x)] > > gr1 = rep(0,ncol(X)) > > gr4 = rep(0,ncol(Y)) > > gr3 = matrix(0,nrow=ncol(X),ncol=ncol(Y)) > > gr1.b = matrix(0,nrow=nrow(X),ncol=ncol(X)) > > gr2.b = rep(0,nrow(X)) > > eta = matrix(0,nrow=nrow(X),ncol=ncol(Y)) > > d.eta.3 = array(0,dim=c(nrow(X),ncol(X),ncol(Y))) > > d.eta.4 = matrix(0,nrow=nrow(X),ncol=ncol(Y)) > > gr3.b1 = array(0,dim=c(nrow(X),ncol(X),ncol(Y))) > > gr4.b1 = matrix(0,nrow=nrow(X),ncol=ncol(Y)) > > > > #Gradiant of alpha and beta > > > > for (i in 1:nrow(X)) > > { > > gr1.b[i,] = (2*p_tilde[i]-1)*((exp(-t(x1)%*%X[i,]-x2)*X[i,])/(1+exp(-t(x1)%*%X[i,]-x2))^2) > > gr2.b[i] = (2*p_tilde[i]-1)*((exp(-t(x1)%*%X[i,]-x2))/(1+exp(-t(x1)%*%X[i,]-x2))^2) > > } > > for (j in 1:ncol(X)) > > { > > gr1[j] = sum(gr1.b[,j]) > > } > > gr2 = sum(gr2.b) > > > > > > #Gradiant de w et gamma > > for (i in 1:nrow(X)) > > { > > for (t in 1:ncol(Y)) > > { > > eta[i,t] = 1/(1+exp(-t(x3[,t])%*%X[i,]-x4[t])) > > d.eta.3[i,,t] = eta[i,t]*(1-eta[i,t])*X[i,] > > d.eta.4[i,t] = eta[i,t]*(1-eta[i,t]) > > gr3.b1[i,,t] = p_tilde[i]*((-abs(Y[i,t]-Yb[i]))*(1-eta[i,t])^(-1)+(1-abs(Y[i,t]-Yb[i]))* > > (eta[i,t])^(-1))*d.eta.3[i,,t] > > gr4.b1[i,t] = p_tilde[i]*((-abs(Y[i,t]-Yb[i]))*(1-eta[i,t])^(-1)+(1-abs(Y[i,t]-Yb[i]))* > > (eta[i,t])^(-1))*d.eta.4[i,t] > > } > > } > > for (t in 1:ncol(Y)) > > { > > for (j in 1:ncol(X)) > > { > > gr3[j,t] = sum(gr3.b1[,j,t]) > > } > > gr4[t] = sum(gr4.b1[,t]) > > } > > c(-gr1,-gr2,-gr3,-gr4) > > } > > > > opt = optim(c(alpha[,c+1],beta[c+1],w,gamma),g,gr,method="BFGS") > > > > The problem is that it gives me wrong results, and I have noticed that if I change my function to maximize (for example if, instead of -(ncol(Y)*sum(res3)+sum(res3.b)), I try to maximise -(ncol(Y)*sum(res3)), it gives me the exactly same results...which is not possible! > > So maybe I am using optim() in a wrong way...Does someone have an idea what could be wrong in my code ? > > > > Thank you very much in advance > > [[alternative HTML version deleted]] > > > > ______________________________________________ > > R-help@r-project.org mailing list > > https://stat.ethz.ch/mailman/listinfo/r-help > > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > > and provide commented, minimal, self-contained, reproducible code. > > > > > > -- > ==============================================> Jon Daily > Technician > ==============================================> #!/usr/bin/env outside > # It's great, trust me.[[alternative HTML version deleted]]
I cc'd r-help to get this message back on the board. Again, you haven't really answered my questions. Comments inline. On Thu, May 19, 2011 at 9:45 AM, chirine wolley <wolley.chirine at hotmail.com> wrote:> First, thank you for ur response... > Actually I didn't write the entire code ...X, Y and p_tilde are of > course?all defined?at the beginning of my?code.And without them, your code example is not very enlightening, since it doesn't run.> Normally?the optimal values that?I get should?let me?create a model for > prediction. However?the model currently obtained is not good at all....You still have provided neither a) what you expect nor b) what optim() is returning. What context is normal?> And?I think that the fact? it gives me the exactly same values if?I > change?the function to maximize?shows that there's a problem in my code....While I can't say if this makes a difference or if you accounted for it, optim minimizes by default as outlined in the ?optim page.> >> Date: Thu, 19 May 2011 09:29:02 -0400 >> Subject: Re: [R] problem with optim() >> From: biomathjdaily at gmail.com >> To: wolley.chirine at hotmail.com >> CC: r-help at r-project.org >> >> What do you mean when you say "wrong results"? What do you expect for >> the output? Your code doesn't work for me because it references X in >> places and X is not defined. >> >> Have you tested your functions to make sure they return reasonable values? >> >> On Thu, May 19, 2011 at 9:17 AM, chirine wolley >> <wolley.chirine at hotmail.com> wrote: >> > >> > Dear R-users, >> > >> > I would like to maximize the function g above which depends on 4 >> > parameters (2 vectors, 1 real number, and 1 matrix) ?using optim() and BFGS >> > method. Here is my code: >> > >> > # fonction to maximize >> > >> > g=function(x) >> > { >> > x1 = x[1:ncol(X)] >> > x2 = x[(ncol(X)+1)] >> > x3 >> > matrix(x[(ncol(X)+2):(ncol(X)+1+ncol(X)*ncol(Y))],nrow=ncol(X),ncol=ncol(Y)) >> > x4 = x[(ncol(X)+1+ncol(X)*ncol(Y)+1):length(x)] >> > res1=rep(0,nrow(X)) >> > res2=matrix(0,nrow=nrow(X),ncol=ncol(Y)) >> > log.res2=matrix(0,nrow=nrow(X),ncol=ncol(Y)) >> > res2.b=rep(0,nrow(X)) >> > res3 = rep(0,nrow(X)) >> > res3.b = rep(0,nrow(X)) >> > for (i in 1:nrow(X)) >> > { >> > res1[i]=1/(1+exp(-t(x1)%*%X[i,]-x2)) >> > for (t in 1:ncol(Y)) >> > { >> > res2[i,t] >> > ((1-(1+exp(-t(x3[,t])%*%X[i,]-x4[t]))^(-1))^(abs(Y[i,t]-Yb[i])))*(((1+exp(-t(x3[,t])%*%X[i,]-x4[t]))^(-1))^(1-abs(Y[i,t]-Yb[i]))) >> > log.res2[i,t]=log(res2[i,t]) >> > res2.b[i]=res2.b[i]+log.res2[i,t] >> > } >> > res3[i] = p_tilde[i]*log(res1[i]) >> > res3.b[i] = p_tilde[i]*(res2.b[i]) >> > } >> > -(ncol(Y)*sum(res3)+sum(res3.b)) >> > >> > } >> > >> > ##### Gradiants: >> > >> > gr=function(x) >> > { >> > x1 = x[1:ncol(X)] >> > x2 = x[(ncol(X)+1)] >> > x3 >> > matrix(x[(ncol(X)+2):(ncol(X)+1+ncol(X)*ncol(Y))],nrow=ncol(X),ncol=ncol(Y)) >> > x4 = x[(ncol(X)+1+ncol(X)*ncol(Y)+1):length(x)] >> > gr1 = rep(0,ncol(X)) >> > gr4 = rep(0,ncol(Y)) >> > gr3 = matrix(0,nrow=ncol(X),ncol=ncol(Y)) >> > gr1.b = matrix(0,nrow=nrow(X),ncol=ncol(X)) >> > gr2.b = rep(0,nrow(X)) >> > eta = matrix(0,nrow=nrow(X),ncol=ncol(Y)) >> > d.eta.3 = array(0,dim=c(nrow(X),ncol(X),ncol(Y))) >> > d.eta.4 = matrix(0,nrow=nrow(X),ncol=ncol(Y)) >> > gr3.b1 = array(0,dim=c(nrow(X),ncol(X),ncol(Y))) >> > gr4.b1 = matrix(0,nrow=nrow(X),ncol=ncol(Y)) >> > >> > #Gradiant of alpha and beta >> > >> > for (i in 1:nrow(X)) >> > { >> > gr1.b[i,] >> > (2*p_tilde[i]-1)*((exp(-t(x1)%*%X[i,]-x2)*X[i,])/(1+exp(-t(x1)%*%X[i,]-x2))^2) >> > gr2.b[i] >> > (2*p_tilde[i]-1)*((exp(-t(x1)%*%X[i,]-x2))/(1+exp(-t(x1)%*%X[i,]-x2))^2) >> > } >> > for (j in 1:ncol(X)) >> > { >> > gr1[j] = sum(gr1.b[,j]) >> > } >> > gr2 = sum(gr2.b) >> > >> > >> > #Gradiant de w et gamma >> > for (i in 1:nrow(X)) >> > { >> > for (t in 1:ncol(Y)) >> > { >> > eta[i,t] = 1/(1+exp(-t(x3[,t])%*%X[i,]-x4[t])) >> > d.eta.3[i,,t] = eta[i,t]*(1-eta[i,t])*X[i,] >> > d.eta.4[i,t] = eta[i,t]*(1-eta[i,t]) >> > gr3.b1[i,,t] >> > p_tilde[i]*((-abs(Y[i,t]-Yb[i]))*(1-eta[i,t])^(-1)+(1-abs(Y[i,t]-Yb[i]))* >> > (eta[i,t])^(-1))*d.eta.3[i,,t] >> > gr4.b1[i,t] >> > p_tilde[i]*((-abs(Y[i,t]-Yb[i]))*(1-eta[i,t])^(-1)+(1-abs(Y[i,t]-Yb[i]))* >> > (eta[i,t])^(-1))*d.eta.4[i,t] >> > } >> > } >> > for (t in 1:ncol(Y)) >> > { >> > for (j in 1:ncol(X)) >> > { >> > gr3[j,t] = sum(gr3.b1[,j,t]) >> > } >> > gr4[t] = sum(gr4.b1[,t]) >> > } >> > c(-gr1,-gr2,-gr3,-gr4) >> > } >> > >> > opt = optim(c(alpha[,c+1],beta[c+1],w,gamma),g,gr,method="BFGS") >> > >> > The problem is that it gives me wrong results, and I have noticed that >> > if I change my function to maximize (for example if, instead of >> > -(ncol(Y)*sum(res3)+sum(res3.b)), I try to maximise -(ncol(Y)*sum(res3)), it >> > gives me the exactly same results...which is not possible! >> > So maybe I am using optim() in a wrong way...Does someone have an idea >> > what could be wrong in my code ? >> > >> > Thank you very much in advance >> > ? ? ? ?[[alternative HTML version deleted]] >> > >> > ______________________________________________ >> > R-help at r-project.org mailing list >> > https://stat.ethz.ch/mailman/listinfo/r-help >> > PLEASE do read the posting guide >> > http://www.R-project.org/posting-guide.html >> > and provide commented, minimal, self-contained, reproducible code. >> > >> >> >> >> -- >> ==============================================>> Jon Daily >> Technician >> ==============================================>> #!/usr/bin/env outside >> # It's great, trust me. >-- ==============================================Jon Daily Technician ==============================================#!/usr/bin/env outside # It's great, trust me.