Elai,

Sooo maaanyy thanks... It worked, the problem was with out<- foreach I
thought foreach wouldn't need to put the results in a variable, this did my
day.

On Sat, Feb 18, 2012 at 5:57 PM, <ila...@gmail.com> wrote:

> Marcos,
> This worked for me. Can't say why it didn't for you. Did you make sure to
> source AFTER you define the variables ? Not doing so is the only reason I
> can think of why they would be "empty".
> Here I'm running your example (I called the script that needs to be
> sourced "src.R" and put it in the same working directory):
>
> library(doMC)
> registerDoMC()
>
> NsimT <- iter(1:200) #Number of iterations
> Nsim = 200 #Number of random scenarios should be equal to NsimT
> #This are sells per month in units
> MCVAMPA <- round(rnorm(Nsim, mean=350, sd=35),0) #Product A
> MCVAMPB <- round(rnorm(Nsim, mean=390, sd=39),0) #Product B
> MCVAMPC <- round(rnorm(Nsim, mean=460, sd=46),0) #Product C
> MCVAMPD <- round(rnorm(Nsim, mean=410, sd=41),0) #Product D
> #this are prices per month for each product.
> MCVAPPA <- rnorm(Nsim, mean=1750, sd=155) #Product A
> MCVAPPB <- rnorm(Nsim, mean=1700, sd=150) #Product B
> MCVAPPC <- rnorm(Nsim, mean=1570, sd=137) #Product C
> MCVAPPD <- rnorm(Nsim, mean=1635, sd=143.5) #Product D
> ## Don't need a bunch of 0 arrays
> out <- foreach (simx = NsimT) %dopar% {
>
> MCPVMPA <<- MCVAMPA[simx]
> MCPVMPB <<- MCVAMPB[simx]
> MCPVMPC <<- MCVAMPC[simx]
> MCPVMPD <<- MCVAMPD[simx]
> #With this I pass from the vector just one value to do the calculations
> MCPVPPA <<- MCVAPPA[simx]
> MCPVPPB <<- MCVAPPB[simx]
> MCPVPPC <<- MCVAPPC[simx]
> MCPVPPD <<- MCVAPPD[simx]
> source('src.R')
> c(CIFERRN,WKMTWKZ,FNMSDE,OARMTFE)
> }
> out <- do.call('rbind',out)
> colnames(out) <- c('CIFERRN','WKMTWKZ','FNMSDE','OARMTFE')
> summary(out)
>
>
> ### DID IT WORK ?
>
> #### The src.R file #####
>
>
> #We need the value of the sells per month for each variable.
> PVMA <- MCPVMPA
> PVMB <- MCPVMPB
> PVMC <- MCPVMPC
> PVMD <- MCPVMPD
>
> #We make a nice gompertz growth curve for our products.
> GOMPEXP <- as.double(c(1,1.05,1.1,1.15,1.2,1.3,1.5,1.75,1.9,2,2.25,2.5))
> #This is the factor for each month
>
> #Growth Product A.
> PVMPA = as.double(SSgompertz(GOMPEXP, PVMA, PVMA*0.25, 0.025)) #This is
> the gompertz curve.
> PVMPA = as.integer(PVMPA) #We need it to be integer, we can't sell 0.25
> units of product.
>
> #One big note: if I put as.integer(SSgompertz(GOMPEXP, PVMA, PVMA*0.25,
> 0.025))
> #The growth of the curve is very abrupt, in the way I do it, you get a
> smoother curve.
> #I don't know why, it just does.
>
> #Growth Product B.
> PVMPB = as.double(SSgompertz(GOMPEXP, PVMB, PVMB*0.25, 0.025))
> PVMPB = as.integer(PVMPB)
>
> #Growth Product C.
> PVMPC = as.double(SSgompertz(GOMPEXP, PVMC, PVMC*0.25, 0.025))
> PVMPC = as.integer(PVMPC)
>
> #Growth Product D.
> PVMPD = as.double(SSgompertz(GOMPEXP, PVMD, PVMD*0.25, 0.025))
> PVMPD = as.integer(PVMPD)
>
> #Then we need the price list of each product.
> PVPPA <- MCPVPPA
> PVPPB <- MCPVPPB
> PVPPC <- MCPVPPC
> PVPPD <- MCPVPPD
>
> #Calculate the value of the sells per month
> PVVVA <- as.double(PVPPA*PVMPA)
> PVVVB <- as.double(PVPPB*PVMPB)
> PVVVC <- as.double(PVPPC*PVMPC)
> PVVVD <- as.double(PVPPD*PVMPD)
> #Then my response variables, which are the total value of my sells in the
> year.#
>
>
> CIFERRN = sum(PVVVA)
> WKMTWKZ = sum(PVVVB)
> FNMSDE = sum(PVVVC)
> OARMTFE = sum(PVVVD)
>
>
> #### END #####
>
>
> On , Marcos Larios <mlario...@gmail.com> wrote:
> > Elai,
> >
> > The
> >
> > Lets call this script MC:
> >
> > library(foreach)
> > library(doMC)
> > registerDoMC()
> > library(iterators)
> >
> > pathglobal NsimT Nsim = 200 #Number of random scenarios should be equal
> to NsimT
>
> >
> >
> > #This are sells per month in units
> > MCVAMPA MCVAMPB MCVAMPC
> > MCVAMPD
> > #this are prices per month for each product.
> > MCVAPPA MCVAPPB
> > MCVAPPC MCVAPPD
> > #I've to set the variables first or the loop wont even start
> > #I don't know if this is my fault or not.
> >
> > MCPVMPA MCPVMPB MCPVMPC MCPVMPD MCPVPPA MCPVPPB MCPVPPC MCPVPPD
> > #I also have to set the response variables before the loop.
> > MCVRERM
> > MCVRWKM MCVRFNM MCVRFEM
> > #Here comes the loop
> > foreach (simx = NsimT, .inorder=FALSE, .verbose=TRUE, .options.smp=
> source(paste(pathglobal, "Valuation.R", sep=""))) %dopar% {
> >
> >   #With this I pass from the vector just one value to do the calculations
> >   MCPVMPA   MCPVMPB   MCPVMPC   MCPVMPD
> >
> >   #With this I pass from the vector just one value to do the calculations
> >   MCPVPPA   MCPVPPB   MCPVPPC   MCPVPPD
> >
> > #Then I set my "answers" variables
> >   MCVRERM[simx] = CIFERRN
> >   MCVRWKM[simx] = WKMTWKZ
> >   MCVRFNM[simx] = FNMSDE
> >   MCVRFEM[simx] = OARMTFE
> > }
> >
> > #This creates a histogram with all possible results for each variable
> >
> > hist(x=MCVRERM)
> > hist(x=MCVRWKM)
> > hist(x=MCVRFNM)
> > hist(x=MCVRFEM)
> >
> > This is the end of the script, now we go to another script, the one that
> is supposed to get sourced from the script above, lets call the script
> Valuation.R
> >
> >
> > #We need the value of the sells per month for each variable.
> > PVMA PVMB PVMC PVMD
> > #We make a nice gompertz growth curve for our products.
> > GOMPEXP 2,1.3,1.5,1.75,1.9,2,2.25,2.5)) #This is the factor for each
> month
>
> >
> >
> > #Growth Product A.
> > PVMPA = as.double(SSgompertz(GOMPEXP, PVMA, PVMA*0.25, 0.025)) #This is
> the gompertz curve.
> > PVMPA = as.integer(PVMPA) #We need it to be integer, we can't sell 0.25
> units of product.
> >
> >
> > #One big note: if I put as.integer(SSgompertz(GOMPEXP, PVMA, PVMA*0.25,
> 0.025))
> > #The growth of the curve is very abrupt, in the way I do it, you get a
> smoother curve.
> > #I don't know why, it just does.
> >
> > #Growth Product B.
> >
> > PVMPB = as.double(SSgompertz(GOMPEXP, PVMB, PVMB*0.25, 0.025))
> > PVMPB = as.integer(PVMPB)
> >
> > #Growth Product C.
> > PVMPC = as.double(SSgompertz(GOMPEXP, PVMC, PVMC*0.25, 0.025))
> > PVMPC = as.integer(PVMPC)
> >
> > #Growth Product D.
> >
> > PVMPD = as.double(SSgompertz(GOMPEXP, PVMD, PVMD*0.25, 0.025))
> > PVMPD = as.integer(PVMPD)
> >
> > #Then we need the price list of each product.
> > PVPPA PVPPB PVPPC PVPPD
> >
> > #Calculate the value of the sells per month
> > PVVVA PVVVB PVVVC PVVVD
> > #Then my response variables, which are the total value of my sells in
> the year.
> >
> > CIFERRN = sum(PVVVA)
> > WKMTWKZ = sum(PVVVB)
> > FNMSDE = sum(PVVVC)
> > OARMTFE = sum(PVVVD)
> >
> >
> > This is the end of the script. I really hope someone can help me.
> >
> > On Sat, Feb 18, 2012 at 1:20 PM, ilai ke...@math.montana.edu> wrote:
> >
> > Marcos,
> >
> > Untested because you didn't provide a reproducible example but my
> >
> > guess, the problem is in the local assignment of MCPVMP*. The %do%
> >
> > worked just because it operates in the same (local) environment for
> >
> > all threads. I'll try to clarify with a a self contained example of
> >
> > sourcing a script with "calculations" one some variables (take the
> >
> > sqrt):
> >
> >
> >
> > cat('sqrt(somevar)',file='myscript.R')
> >
> > library(doMC)
> >
> > registerDoMC()
> >
> > foreach(i = 1:2) %dopar% {somevar
> > # local assignment fails
> >
> > foreach(i = 1:2) %dopar% {somevar
> > # assign to the global environment works
> >
> >
> >
> > Bottom line try to change all the equal signs to "
> > script in the loop (I don't think passing it to .options.smp will work
> >
> > in this context).
> >
> >
> >
> > Two unrelated minor points
> >
> > 1) is NsimT a vector 1:2000 or of class 'iter' ? just a number like
> >
> > simx=2000 is not right
> >
> > 2) With intel's hyperthreading you may really have only 4 real cores not
> 8
> >
> >
> >
> > Hope this helps
> >
> >
> >
> > Elai
> >
> >
> >
> >
> >
> >
> >
> > On Fri, Feb 17, 2012 at 11:41 PM, Marcos Larios mlario...@gmail.com>
> wrote:
> >
> > > Hi everyone,
> >
> > >
> >
> > > I'm working on a script trying to use foreach %dopar% but without
> success,
> >
> > > so I manage to run the code with foreach %do% and looks like this:
> >
> > >
> >
> > > The code is part of a MCMC model for projects valuation, returning the
> most
> >
> > > important results (VPN, TIR, EVA, etc.) of the simulation.
> >
> > >
> >
> > > foreach (simx = NsimT, .combine=cbind, .inorder=FALSE, .verbose=TRUE)
> %do% {
> >
> > >  MCPVMPA = MCVAMPA[simx] #The *[simx] variables are vectors containing
> >
> > > 100,000 simulations of each variable.
> >
> > >  MCPVMPB = MCVAMPB[simx] #Wich then I want to parse to the script below
> >
> > >  MCPVMPC = MCVAMPC[simx] #In order for the model to take the values of
> >
> > > each variable.
> >
> > >  MCPVMPD = MCVAMPD[simx]
> >
> > >
> >
> > >  source(paste(pathglobal, "Valuation.R", sep="")) #This script does
> >
> > > everyting
> >
> > >  #Before you suggest making it a function, let me say I CAN'T.
> >
> > >  #This script is about 3000 lines long, and connects to several other
> >
> > > scripts (8), each about 300-500 lines long.
> >
> > >  #pathglobal is a string variable pointing to the working directory,
> ej.
> >
> > > ~/Documents/Valuation/
> >
> > >
> >
> > >  MCVRERM[simx]
> > >  MCVRWKM[simx]
> > >  MCVRFNM[simx]
> > > #The response variables come from another script which is call within
> >
> > > Valuation.R
> >
> > >
> >
> > > }
> >
> > >
> >
> > > As I said, the above code works flawlessly with %do%, but it takes
> about 1
> >
> > > hour just to run 2,000 simulations, so I want to make use of all the 8
> >
> > > cores of my Intel i7 machine by using %dopar%, so I changed the code to
> >
> > > something like this:
> >
> > >
> >
> > > foreach (simx = NsimT, .combine=cbind, .inorder=FALSE, .verbose=TRUE,
> >
> > > .options.smp= source(paste(pathglobal, "Valuation.R", sep="")))
> %dopar% {
> >
> > >
> >
> > >  MCPVMPA = MCVAMPA[simx]
> >
> > >  MCPVMPB = MCVAMPB[simx]
> >
> > >  MCPVMPC = MCVAMPC[simx]
> >
> > >  MCPVMPD = MCVAMPD[simx]
> >
> > >
> >
> > >  MCVRERM[simx]
> > >  MCVRWKM[simx]
> > >  MCVRFNM[simx]
> > > }
> >
> > >
> >
> > > The changes makes the script fail, saying somtehing like: abscent value
> >
> > > where TRUE/FALSE is necessary, the variables that are supposed to pass
> the
> >
> > > information to the Valuation.R script are empty, and error comes
> because it
> >
> > > does something like this at some point:
> >
> > >
> >
> > > VarX = A/B #But because the variables values are not getting into the
> >
> > > Valuation.R script then
> >
> > >                  #A = MCPVMPA = 0 and B = MCMKMPA = 0
> >
> > >
> >
> > > So VarX = NaN
> >
> > >
> >
> > > Then it does something like:
> >
> > >
> >
> > > if (VarZ>VarX) VarY = 0 else VarY = VarX-VarZ #This line generates the
> error
> >
> > >
> >
> > > I have all the libraries installed:
> >
> > > library(foreach)
> >
> > > library(doMC)
> >
> > > registerDoMC()
> >
> > >
> >
> > > It's not the installation because all the example code with %dopar%
> I've
> >
> > > tested work fine.
> >
> > > So can you help me please to make my code work?
> >
> > > Any ideas?
> >
> > >
> >
> > >
> >
> > > --
> >
> > > L.E. Marcos Larios Sata Rosa
> >
> > >
> >
> >
> >
> > >        [[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.
> >
> >
> >
> >
> > --
> > L.E. Marcos Larios Sata Rosa
> >
>



-- 
L.E. Marcos Larios Sata Rosa

        [[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.

Reply via email to