From 8aa23c31de6fdadde3b3f3059d411251851ebcd4 Mon Sep 17 00:00:00 2001 From: Rowan Cockett Date: Tue, 16 Feb 2016 21:53:31 -0800 Subject: [PATCH] Allow moving off bounds in projected gradient. The current implementation does not allow you to move off the bounds (lower/upper) once you have gotten on them, this allows you to move off of the bound. Please note that more testing should be done to ensure that this does not introduce oscillations into the optimization routine. --- SimPEG/Optimization.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/SimPEG/Optimization.py b/SimPEG/Optimization.py index 4f2cb062..54f6c4ff 100644 --- a/SimPEG/Optimization.py +++ b/SimPEG/Optimization.py @@ -990,4 +990,18 @@ class ProjectedGNCG(BFGS, Minimize, Remember): cgFlag = 1 # End CG Iterations + # Take a gradient step on the active cells if exist + if temp != self.xc.size: + + rhs_a = (Active) * -self.g + + dm_i = max( abs( delx ) ) + dm_a = max( abs(rhs_a) ) + + delx = delx + rhs_a * dm_i / dm_a /10. + + # Only keep gradients going in the right direction on the active set + indx = ((self.xc<=self.lower) & (delx < 0)) | ((self.xc>=self.upper) & (delx > 0)) + delx[indx] = 0. + return delx