From a39f3b37359464d0338d58d09fc512b385a37fdd Mon Sep 17 00:00:00 2001
From: Mauricio Zambrano-Bigiarini <hzambran@users.noreply.github.com>
Date: Tue, 25 Sep 2012 23:22:56 +0000
Subject: [PATCH] 'hydroPSO': fixed implementation of 'normalise=TRUE' argument

---
 R/PSO_v2012.R | 26 +++++++++++++++++---------
 1 file changed, 17 insertions(+), 9 deletions(-)

diff --git a/R/PSO_v2012.R b/R/PSO_v2012.R
index 3e78bd1..78ae076 100755
--- a/R/PSO_v2012.R
+++ b/R/PSO_v2012.R
@@ -1750,6 +1750,9 @@ hydroPSO <- function(
 
 	X.Boundaries <- read.ParameterRanges(ParamRanges.fname=param.ranges) 
 
+        lower <- X.Boundaries[,1]
+        upper <- X.Boundaries[,2]
+
     } else {
 	if ( (lower[1L] == -Inf) || (upper[1L] == Inf) ) {
 	  stop( "Invalid argument: 'lower' and 'upper' boundaries must be finite !!'" )
@@ -1759,11 +1762,16 @@ hydroPSO <- function(
     n <- nrow(X.Boundaries)
     
     if (normalise) {
-      X.Boundaries[,1] <- rep(0, n)
-      X.Boundaries[,2] <- rep(1, n)
+      # Backing up the orinal boundaries
+      lower.ini <- lower
+      upper.ini <- upper
+      LOWER.ini <- matrix( rep(lower.ini, npart), nrow=npart, byrow=TRUE)
+      UPPER.ini <- matrix( rep(upper.ini, npart), nrow=npart, byrow=TRUE)
       
-      lower.mat <- matrix( rep(X.Boundaries[,1], npart), nrow=npart, byrow=TRUE)
-      upper.mat <- matrix( rep(X.Boundaries[,2], npart), nrow=npart, byrow=TRUE)
+      # normalising
+      lower <- rep(0, n)
+      upper <- rep(1, n)
+      X.Boundaries <- cbind(lower, upper)
     } # IF end
 
     if (is.null(rownames(X.Boundaries))) {
@@ -2308,13 +2316,13 @@ hydroPSO <- function(
 
       ##########################################################################  
       
-      ifelse(normalise, Xn <- X * (upper.mat - lower.mat) + lower.mat, Xn <- X)
+      ifelse(normalise, Xn <- X * (UPPER.ini - LOWER.ini) + LOWER.ini, Xn <- X)
       
       # 3.a) Evaluate the particles fitness
       if ( fn.name != "hydromod" ) {
          
 	 # Evaluating an R Function 
-	 GoF <- apply(Xn, fn, MARGIN=1, ...)
+         GoF <- apply(Xn, fn, MARGIN=1, ...)
 	 
          Xt.fitness[iter, 1:npart] <- GoF
          ModelOut[1:npart]         <- GoF  ###
@@ -2328,7 +2336,7 @@ hydroPSO <- function(
 	     } else verbose.FUN <- verbose
 	     
 	     out <- lapply(1:npart, hydromod.eval,       
-                                      Particles=X, 
+                                      Particles=Xn, 
                                       iter=iter, 
                                       npart=npart, 
                                       maxit=maxit, 
@@ -2691,7 +2699,7 @@ hydroPSO <- function(
         GoF <- gbest.fit
 	if(is.finite(GoF)) {
 	
-	  ifelse(normalise, temp <- X.best.part[gbest.pos, ] * (upper - lower) + lower,
+	  ifelse(normalise, temp <- X.best.part[gbest.pos, ] * (upper.ini - lower.ini) + lower.ini,
 	                    temp <- X.best.part[gbest.pos, ] )
 	                    
 	  writeLines( as.character( c(iter,
@@ -2730,7 +2738,7 @@ hydroPSO <- function(
     } # WHILE end
     ########################## END Main Iteration Loop #########################
     
-    if (normalise) X.best.part <- X.best.part * (upper.mat - lower.mat) + lower.mat
+    if (normalise) X.best.part <- X.best.part * (UPPER.ini - LOWER.ini) + LOWER.ini
 
     if (write2disk) {
       close(OFout.Text.file)        
-- 
GitLab