LCOV - code coverage report
Current view: top level - synthesis/MeasurementEquations - IncEntropy.cc (source / functions) Hit Total Coverage
Test: casacpp_coverage.info Lines: 0 976 0.0 %
Date: 2024-10-29 13:38:20 Functions: 0 25 0.0 %

          Line data    Source code
       1             : //# IncEntropy.cc:  this implements IncEntropy
       2             : //# Copyright (C) 1996,1997,1998,1999,2000,2002
       3             : //# Associated Universities, Inc. Washington DC, USA.
       4             : //#
       5             : //# This library is free software; you can redistribute it and/or modify it
       6             : //# under the terms of the GNU Library General Public License as published by
       7             : //# the Free Software Foundation; either version 2 of the License, or (at your
       8             : //# option) any later version.
       9             : //#
      10             : //# This library is distributed in the hope that it will be useful, but WITHOUT
      11             : //# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
      12             : //# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
      13             : //# License for more details.
      14             : //#
      15             : //# You should have received a copy of the GNU Library General Public License
      16             : //# along with this library; if not, write to the Free Software Foundation,
      17             : //# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA.
      18             : //#
      19             : //# Correspondence concerning AIPS++ should be addressed as follows:
      20             : //#        Internet email: casa-feedback@nrao.edu.
      21             : //#        Postal address: AIPS++ Project Office
      22             : //#                        National Radio Astronomy Observatory
      23             : //#                        520 Edgemont Road
      24             : //#                        Charlottesville, VA 22903-2475 USA
      25             : //#
      26             : //# $Id$
      27             :  
      28             : #include <synthesis/MeasurementEquations/IncCEMemModel.h>
      29             : #include <synthesis/MeasurementEquations/CEMemProgress.h>
      30             : #include <synthesis/MeasurementEquations/IncEntropy.h>
      31             : #include <casacore/lattices/LEL/LatticeExpr.h>
      32             : #include <casacore/lattices/LEL/LatticeExprNode.h>
      33             : #include <casacore/lattices/Lattices/LatticeStepper.h>
      34             : #include <casacore/lattices/Lattices/LatticeIterator.h>
      35             : #include <casacore/casa/BasicMath/Math.h>
      36             : #include <iostream>
      37             : 
      38             : using namespace casacore;
      39             : namespace casa { //# NAMESPACE CASA - BEGIN
      40             : 
      41             : //----------------------------------------------------------------------
      42           0 : IncEntropy::IncEntropy()
      43             : {
      44           0 :   cemem_ptr = 0;
      45           0 : };
      46             : 
      47             : //----------------------------------------------------------------------
      48           0 : IncEntropy::~IncEntropy()
      49             : {
      50             :   // cemem_ptr->letEntropyDie();
      51           0 : };
      52             : 
      53             : //----------------------------------------------------------------------
      54           0 : IncEntropyI::IncEntropyI()
      55             : {
      56           0 : };
      57             : 
      58             : //----------------------------------------------------------------------
      59           0 : IncEntropyI::~IncEntropyI()
      60             : {
      61           0 : };
      62             : 
      63             : //----------------------------------------------------------------------
      64             : 
      65           0 : Float IncEntropyI::formEntropy()
      66             : {
      67           0 :   Lattice<Float> &model = *(cemem_ptr->itsModel_ptr);
      68           0 :   Lattice<Float> &delta = *(cemem_ptr->itsDeltaModel_ptr);
      69           0 :   Float flux = 0.0;
      70           0 :   if (cemem_ptr->itsMask_ptr) {
      71           0 :     Lattice<Float> &mask = *(cemem_ptr->itsMask_ptr);
      72           0 :     flux = sum((mask * (model+delta))).getFloat();
      73             :   } else {    
      74           0 :     flux = sum(model+delta).getFloat();
      75             :   }
      76             : 
      77           0 :   cemem_ptr->itsFlux = flux;
      78           0 :   Float defLev = cemem_ptr->itsDefaultLevel;
      79           0 :   LatticeExprNode myEntropyLEN;
      80           0 :   Float myEntropy = 0;
      81             : 
      82           0 :   if (cemem_ptr->itsMask_ptr) {   // Mask
      83           0 :     Lattice<Float> &mask = *(cemem_ptr->itsMask_ptr);
      84           0 :     if (cemem_ptr->itsPrior_ptr) {  // Mask and Prior
      85           0 :       Lattice<Float> &prior = *(cemem_ptr->itsPrior_ptr);
      86           0 :       myEntropyLEN = -sum(((model+delta) * log((model+delta)/prior))[mask>0.0] );
      87           0 :       myEntropy = myEntropyLEN.getFloat();
      88             :     } else {   // Mask, No Prior
      89           0 :       myEntropyLEN = - sum( ((model+delta) * log(model+delta))[mask>0.0]) ;
      90           0 :       myEntropy = myEntropyLEN.getFloat() + flux * log(defLev);
      91             :     }
      92           0 :     if (flux > 0.0) {
      93           0 :       myEntropy = myEntropy/flux + 
      94           0 :         log(cemem_ptr->itsNumberPixels);
      95             :     } else {
      96           0 :       myEntropy = 0.0;
      97             :     }
      98             :   } else { // No Mask;  Oh for the joy of LEL! 
      99           0 :     if (cemem_ptr->itsPrior_ptr) {  // No Mask, But Prior
     100           0 :       Lattice<Float> &prior = *(cemem_ptr->itsPrior_ptr);
     101           0 :       myEntropyLEN = - sum( (model+delta) * log((model+delta)/prior)) ;
     102           0 :       myEntropy = myEntropyLEN.getFloat();
     103             :     } else {   // No Mask, No Prior
     104           0 :       myEntropyLEN = - sum( (model+delta) * log(model+delta)) ;
     105           0 :       myEntropy = myEntropyLEN.getFloat() + flux * log(defLev);
     106             :     }
     107           0 :     if (flux > 0.0) {
     108           0 :       myEntropy = myEntropy/flux + 
     109           0 :         log(cemem_ptr->itsNumberPixels);
     110             :     } else {
     111           0 :       myEntropy = 0.0;
     112             :     }
     113             :   }
     114             : 
     115           0 :   return myEntropy;
     116           0 : };
     117             : 
     118             : 
     119             : //----------------------------------------------------------------------
     120           0 : void IncEntropyI::formGDG(Matrix<Double>& GDG)
     121             : {
     122           0 :   if (cemem_ptr->itsMask_ptr) {
     123           0 :     Lattice<Float> &model = *(cemem_ptr->itsModel_ptr);
     124           0 :     Lattice<Float> &delta = *(cemem_ptr->itsDeltaModel_ptr);
     125           0 :     Lattice<Float> &resid = *(cemem_ptr->itsResidual_ptr);
     126           0 :     Lattice<Float> &mask  = *(cemem_ptr->itsMask_ptr);
     127             :     
     128           0 :     GDG.resize(4,4);
     129           0 :     GDG.set(0.0);
     130           0 :     Float alpha = cemem_ptr->itsAlpha;
     131           0 :     Float beta  = cemem_ptr->itsBeta;
     132           0 :     Float defLev = cemem_ptr->itsDefaultLevel;
     133             :     
     134             :     // should not use Lattice Expression Language for efficiency
     135             :     // using it right now to get up and running
     136           0 :     Float ggc = 2 * alpha * cemem_ptr->itsQ;
     137             :     Float rHess;
     138             :     
     139             :     RO_LatticeIterator<Float> 
     140           0 :       mod( model, LatticeStepper(model.shape(), model.niceCursorShape()));
     141             :     RO_LatticeIterator<Float> 
     142           0 :       del( delta, LatticeStepper(model.shape(), model.niceCursorShape()));
     143             :     RO_LatticeIterator<Float> 
     144           0 :       res( resid, LatticeStepper(model.shape(), model.niceCursorShape()));
     145             :     RO_LatticeIterator<Float> 
     146           0 :       mas( mask, LatticeStepper(model.shape(), model.niceCursorShape()));
     147             :     uInt i;
     148             :     Bool modDeleteIt;
     149             :     Bool delDeleteIt;
     150             :     Bool resDeleteIt;
     151             :     Bool masDeleteIt; 
     152           0 :     Double GDGHH = 0.0;
     153           0 :     Double GDGHC = 0.0;
     154           0 :     Double GDGHF = 0.0;
     155           0 :     Double GDGCC = 0.0;
     156           0 :     Double GDGCF = 0.0;
     157           0 :     Double GDGFF = 0.0;
     158           0 :     Double gradH = 0.0;
     159           0 :     Double gradC = 0.0;
     160           0 :     if (cemem_ptr->itsPrior_ptr ==  0) {
     161           0 :       Float logDef = log(defLev);
     162           0 :       for (mod.reset(), del.reset(), res.reset(), mas.reset(); 
     163           0 :            !mod.atEnd(); 
     164           0 :            mod++,       del++,       res++,       mas++) {
     165           0 :         const Float *modStore = mod.cursor().getStorage(modDeleteIt);
     166           0 :         const Float *delStore = del.cursor().getStorage(delDeleteIt);
     167           0 :         const Float *resStore = res.cursor().getStorage(resDeleteIt);
     168           0 :         const Float *masStore = mas.cursor().getStorage(masDeleteIt);
     169           0 :         const Float *modIter = modStore;
     170           0 :         const Float *delIter = delStore;
     171           0 :         const Float *resIter = resStore;
     172           0 :         const Float *masIter = masStore;
     173           0 :         for (i=0;i<mod.cursor().nelements();i++,modIter++, delIter++, resIter++, masIter++) {
     174           0 :           if (*masIter > 0.0) {
     175           0 :             rHess = (*modIter + *delIter)/(1 + ggc * (*modIter + *delIter));
     176           0 :             gradH = -log(*modIter + *delIter) + logDef;
     177           0 :             gradC = -2*(*resIter);
     178           0 :             GDGHH = GDGHH + gradH * rHess * gradH;
     179           0 :             GDGHC = GDGHC + gradH * rHess * gradC;
     180           0 :             GDGHF = GDGHF + gradH * rHess;
     181           0 :             GDGCC = GDGCC + gradC * rHess * gradC;
     182           0 :             GDGCF = GDGCF + gradC * rHess;
     183           0 :             GDGFF = GDGFF + rHess;
     184             :           }
     185             :         }
     186           0 :         mod.cursor().freeStorage(modStore, modDeleteIt);
     187           0 :         del.cursor().freeStorage(delStore, delDeleteIt);
     188           0 :         res.cursor().freeStorage(resStore, resDeleteIt);
     189           0 :         mas.cursor().freeStorage(masStore, masDeleteIt);
     190             :       }
     191             :     } else {
     192           0 :       Lattice<Float> &prior = *(cemem_ptr->itsPrior_ptr);
     193             :       RO_LatticeIterator<Float> 
     194           0 :         pri( prior, LatticeStepper(prior.shape(), model.niceCursorShape()));    
     195             :       Bool priDeleteIt;
     196           0 :       for (mod.reset(), del.reset(), res.reset(), mas.reset(), pri.reset(); 
     197           0 :            !mod.atEnd(); 
     198           0 :            mod++,       del++,       res++,       mas++,       pri++) {
     199           0 :         const Float *modStore = mod.cursor().getStorage(modDeleteIt);
     200           0 :         const Float *delStore = del.cursor().getStorage(delDeleteIt);
     201           0 :         const Float *resStore = res.cursor().getStorage(resDeleteIt);
     202           0 :         const Float *masStore = mas.cursor().getStorage(masDeleteIt);
     203           0 :         const Float *priStore = pri.cursor().getStorage(priDeleteIt);
     204           0 :         const Float *modIter = modStore;
     205           0 :         const Float *delIter = delStore;
     206           0 :         const Float *resIter = resStore;
     207           0 :         const Float *masIter = masStore;
     208           0 :         const Float *priIter = priStore;
     209           0 :         for (i=0;i<mod.cursor().nelements();
     210           0 :              i++,modIter++, delIter++, resIter++, masIter++, priIter++) {
     211           0 :           if (*masIter > 0.0) {
     212           0 :             rHess = (*modIter + *delIter)/(1 + ggc* (*modIter + *delIter));
     213           0 :             gradH = -log( (*modIter + *delIter) / (*priIter));
     214           0 :             gradC = -2*(*resIter);
     215           0 :             GDGHH = GDGHH + gradH * rHess * gradH;
     216           0 :             GDGHC = GDGHC + gradH * rHess * gradC;
     217           0 :             GDGHF = GDGHF + gradH * rHess;
     218           0 :             GDGCC = GDGCC + gradC * rHess * gradC;
     219           0 :             GDGCF = GDGCF + gradC * rHess;
     220           0 :             GDGFF = GDGFF + rHess;
     221             :           }
     222             :         }
     223           0 :         mod.cursor().freeStorage(modStore, modDeleteIt);
     224           0 :         del.cursor().freeStorage(delStore, delDeleteIt);
     225           0 :         res.cursor().freeStorage(resStore, resDeleteIt);
     226           0 :         mas.cursor().freeStorage(masStore, masDeleteIt);
     227           0 :         pri.cursor().freeStorage(priStore, priDeleteIt);
     228             :       }
     229           0 :     }
     230           0 :     GDG(H,H) = GDGHH;
     231           0 :     GDG(H,C) = GDGHC;
     232           0 :     GDG(H,F) = GDGHF;
     233           0 :     GDG(C,C) = GDGCC;
     234           0 :     GDG(C,F) = GDGCF;
     235           0 :     GDG(F,F) = GDGFF;
     236           0 :     GDG(H,J) = GDGHH -  alpha * GDGHC - beta * GDGHF;
     237           0 :     GDG(C,J) = GDGHC -  alpha * GDGCC - beta * GDGCF;
     238           0 :     GDG(F,J) = GDGHF -  alpha * GDGCF - beta * GDGFF;
     239           0 :     GDG(J,J) = GDGHH +  square(alpha) * GDGCC 
     240           0 :       + square(beta)*GDGFF  + 2*alpha*beta*GDGCF  
     241           0 :       - 2*alpha*GDGHC - 2*beta*GDGHF;
     242             : 
     243           0 :   } else { // no mask
     244             : 
     245           0 :     Lattice<Float> &model = *(cemem_ptr->itsModel_ptr);
     246           0 :     Lattice<Float> &delta = *(cemem_ptr->itsDeltaModel_ptr);
     247           0 :     Lattice<Float> &resid = *(cemem_ptr->itsResidual_ptr);    
     248           0 :     GDG.resize(4,4);
     249           0 :     GDG.set(0.0);
     250           0 :     Float alpha = cemem_ptr->itsAlpha;
     251           0 :     Float beta  = cemem_ptr->itsBeta;
     252           0 :     Float defLev = cemem_ptr->itsDefaultLevel;
     253             :     
     254             :     // should not use Lattice Expression Language for efficiency
     255             :     // using it right now to get up and running
     256           0 :     Float ggc = 2 * alpha * cemem_ptr->itsQ;
     257             :     Float rHess;
     258             :     
     259             :     RO_LatticeIterator<Float> 
     260           0 :       mod( model, LatticeStepper(model.shape(), model.niceCursorShape()));
     261             :     RO_LatticeIterator<Float> 
     262           0 :       del( delta, LatticeStepper(model.shape(), model.niceCursorShape()));
     263             :     RO_LatticeIterator<Float> 
     264           0 :       res( resid, LatticeStepper(model.shape(), model.niceCursorShape()));
     265             :     uInt i;
     266             :     Bool modDeleteIt;
     267             :     Bool delDeleteIt;
     268             :     Bool resDeleteIt;
     269           0 :     Double GDGHH = 0.0;
     270           0 :     Double GDGHC = 0.0;
     271           0 :     Double GDGHF = 0.0;
     272           0 :     Double GDGCC = 0.0;
     273           0 :     Double GDGCF = 0.0;
     274           0 :     Double GDGFF = 0.0;
     275           0 :     Double gradH = 0.0;
     276           0 :     Double gradC = 0.0;
     277           0 :     if (cemem_ptr->itsPrior_ptr ==  0) {
     278           0 :       Float logDef = log(defLev);
     279           0 :       for (mod.reset(), del.reset(), res.reset(); 
     280           0 :            !mod.atEnd(); 
     281           0 :            mod++,       del++,       res++) {
     282           0 :         const Float *modStore = mod.cursor().getStorage(modDeleteIt);
     283           0 :         const Float *delStore = del.cursor().getStorage(delDeleteIt);
     284           0 :         const Float *resStore = res.cursor().getStorage(resDeleteIt);
     285           0 :         const Float *modIter = modStore;
     286           0 :         const Float *delIter = delStore;
     287           0 :         const Float *resIter = resStore;
     288           0 :         for (i=0;i<mod.cursor().nelements();i++,modIter++, delIter++, resIter++) {
     289           0 :           rHess = (*modIter + *delIter)/(1 + ggc * (*modIter + *delIter));
     290           0 :           gradH = -log(*modIter + *delIter) + logDef;
     291           0 :           gradC = -2*(*resIter);
     292           0 :           GDGHH = GDGHH + gradH * rHess * gradH;
     293           0 :           GDGHC = GDGHC + gradH * rHess * gradC;
     294           0 :           GDGHF = GDGHF + gradH * rHess;
     295           0 :           GDGCC = GDGCC + gradC * rHess * gradC;
     296           0 :           GDGCF = GDGCF + gradC * rHess;
     297           0 :           GDGFF = GDGFF + rHess;
     298             :         }
     299           0 :         mod.cursor().freeStorage(modStore, modDeleteIt);
     300           0 :         del.cursor().freeStorage(delStore, delDeleteIt);
     301           0 :         res.cursor().freeStorage(resStore, resDeleteIt);
     302             :       }
     303             :     } else {
     304           0 :       Lattice<Float> &prior = *(cemem_ptr->itsPrior_ptr);
     305             :       RO_LatticeIterator<Float> 
     306           0 :         pri( prior, LatticeStepper(prior.shape(), model.niceCursorShape()));    
     307             :       Bool priDeleteIt;
     308           0 :       for (mod.reset(), del.reset(), res.reset(), pri.reset(); !mod.atEnd(); 
     309           0 :            mod++,       del++,       res++,       pri++) {
     310           0 :         const Float *modStore = mod.cursor().getStorage(modDeleteIt);
     311           0 :         const Float *delStore = del.cursor().getStorage(delDeleteIt);
     312           0 :         const Float *resStore = res.cursor().getStorage(resDeleteIt);
     313           0 :         const Float *priStore = pri.cursor().getStorage(priDeleteIt);
     314           0 :         const Float *modIter = modStore;
     315           0 :         const Float *delIter = delStore;
     316           0 :         const Float *resIter = resStore;
     317           0 :         const Float *priIter = priStore;
     318           0 :         for (i=0;i<mod.cursor().nelements();i++,modIter++, delIter++, resIter++, priIter++) {
     319           0 :           rHess = (*modIter + *delIter)/(1 + ggc* (*modIter + *delIter));
     320           0 :           gradH = -log( (*modIter + *delIter) / (*priIter));
     321           0 :           gradC = -2*(*resIter);
     322           0 :           GDGHH = GDGHH + gradH * rHess * gradH;
     323           0 :           GDGHC = GDGHC + gradH * rHess * gradC;
     324           0 :           GDGHF = GDGHF + gradH * rHess;
     325           0 :           GDGCC = GDGCC + gradC * rHess * gradC;
     326           0 :           GDGCF = GDGCF + gradC * rHess;
     327           0 :           GDGFF = GDGFF + rHess;
     328             :         }
     329           0 :         mod.cursor().freeStorage(modStore, modDeleteIt);
     330           0 :         del.cursor().freeStorage(delStore, delDeleteIt);
     331           0 :         res.cursor().freeStorage(resStore, resDeleteIt);
     332           0 :         pri.cursor().freeStorage(priStore, priDeleteIt);
     333             :       }
     334           0 :     }
     335           0 :     GDG(H,H) = GDGHH;
     336           0 :     GDG(H,C) = GDGHC;
     337           0 :     GDG(H,F) = GDGHF;
     338           0 :     GDG(C,C) = GDGCC;
     339           0 :     GDG(C,F) = GDGCF;
     340           0 :     GDG(F,F) = GDGFF;
     341           0 :     GDG(H,J) = GDGHH -  alpha * GDGHC - beta * GDGHF;
     342           0 :     GDG(C,J) = GDGHC -  alpha * GDGCC - beta * GDGCF;
     343           0 :     GDG(F,J) = GDGHF -  alpha * GDGCF - beta * GDGFF;
     344           0 :     GDG(J,J) = GDGHH +  square(alpha) * GDGCC 
     345           0 :       + square(beta)*GDGFF  + 2*alpha*beta*GDGCF  
     346           0 :       - 2*alpha*GDGHC - 2*beta*GDGHF;
     347           0 :   }
     348           0 : };
     349             : 
     350             : 
     351             : 
     352             : //----------------------------------------------------------------------
     353           0 : void IncEntropyI::formGDGStep(Matrix<Double>& GDG)
     354             : {
     355             : 
     356           0 :   if (cemem_ptr->itsMask_ptr) {
     357             : 
     358           0 :     Lattice<Float> &model = *(cemem_ptr->itsModel_ptr);
     359           0 :     Lattice<Float> &delta = *(cemem_ptr->itsDeltaModel_ptr);
     360           0 :     Lattice<Float> &resid = *(cemem_ptr->itsResidual_ptr);
     361           0 :     Lattice<Float> &step  = *(cemem_ptr->itsStep_ptr);
     362           0 :     Lattice<Float> &mask = *(cemem_ptr->itsMask_ptr);
     363             : 
     364           0 :     GDG.resize(4,4);
     365           0 :     GDG.set(0.0);
     366           0 :     Float alpha = cemem_ptr->itsAlpha;
     367           0 :     Float beta  = cemem_ptr->itsBeta;
     368           0 :     Float defLev = cemem_ptr->itsDefaultLevel;
     369             :     
     370             :     // should not use Lattice Expression Language for efficiency
     371             :     // using it right now to get up and running
     372           0 :     Float ggc = 2 * alpha * cemem_ptr->itsQ;
     373             :     Float rHess;
     374             :     
     375             :     RO_LatticeIterator<Float> 
     376           0 :       mod( model, LatticeStepper(model.shape(), model.niceCursorShape()));
     377             :     RO_LatticeIterator<Float> 
     378           0 :       del( delta, LatticeStepper(model.shape(), model.niceCursorShape()));
     379             :     RO_LatticeIterator<Float> 
     380           0 :       res( resid, LatticeStepper(resid.shape(), model.niceCursorShape()));
     381             :     RO_LatticeIterator<Float> 
     382           0 :       mas( mask, LatticeStepper(model.shape(), model.niceCursorShape()));
     383             :     LatticeIterator<Float> 
     384           0 :       stp( step, LatticeStepper(step.shape(), model.niceCursorShape()));
     385             :     uInt i;
     386             :     Bool modDeleteIt;
     387             :     Bool delDeleteIt;
     388             :     Bool resDeleteIt;
     389             :     Bool stpDeleteIt;
     390             :     Bool masDeleteIt;
     391           0 :     Double GDGHH = 0.0;
     392           0 :     Double GDGHC = 0.0;
     393           0 :     Double GDGHF = 0.0;
     394           0 :     Double GDGCC = 0.0;
     395           0 :     Double GDGCF = 0.0;
     396           0 :     Double GDGFF = 0.0;
     397           0 :     Double gradH = 0.0;
     398           0 :     Double gradC = 0.0;
     399           0 :     Double gradJ = 0.0;
     400             :     Float stepValue;
     401           0 :     if ( cemem_ptr->itsPrior_ptr == 0) {
     402           0 :       Float logDef = log(defLev);
     403           0 :       for (mod.reset(), del.reset(), res.reset(), mas.reset(), stp.reset(); 
     404           0 :            !mod.atEnd(); 
     405           0 :            mod++,       del++,       res++,       mas++,       stp++) {
     406           0 :         const Float *modStore = mod.cursor().getStorage(modDeleteIt);
     407           0 :         const Float *delStore = del.cursor().getStorage(delDeleteIt);
     408           0 :         const Float *resStore = res.cursor().getStorage(resDeleteIt);
     409           0 :         const Float *masStore = mas.cursor().getStorage(masDeleteIt);
     410           0 :         Float *stpStore = stp.rwCursor().getStorage(stpDeleteIt);
     411           0 :         const Float *modIter = modStore;
     412           0 :         const Float *delIter = delStore;
     413           0 :         const Float *resIter = resStore;
     414           0 :         const Float *masIter = masStore;
     415           0 :         Float *stpIter = stpStore;
     416           0 :         for (i=0;i<mod.cursor().nelements();
     417           0 :              i++,modIter++, delIter++, resIter++, stpIter++, masIter++) {
     418           0 :           if (*masIter > 0.0) {
     419           0 :             rHess = (*modIter + *delIter)/(1 + ggc * (*modIter + *delIter));
     420           0 :             gradH = -log(*modIter + *delIter) + logDef;
     421           0 :             gradC = -2*(*resIter);
     422           0 :             gradJ = gradH - alpha*gradC - beta;
     423           0 :             stepValue = rHess * gradJ;
     424           0 :             (*stpIter) = stepValue;
     425           0 :             GDGHH = GDGHH + gradH * rHess * gradH;
     426           0 :             GDGHC = GDGHC + gradH * rHess * gradC;
     427           0 :             GDGHF = GDGHF + gradH * rHess;
     428           0 :             GDGCC = GDGCC + gradC * rHess * gradC;
     429           0 :             GDGCF = GDGCF + gradC * rHess;
     430           0 :             GDGFF = GDGFF + rHess;
     431             :           }
     432             :         }
     433           0 :         mod.cursor().freeStorage(modStore, modDeleteIt);
     434           0 :         del.cursor().freeStorage(delStore, delDeleteIt);
     435           0 :         res.cursor().freeStorage(resStore, resDeleteIt);
     436           0 :         mas.cursor().freeStorage(masStore, masDeleteIt);
     437           0 :         stp.rwCursor().putStorage(stpStore, stpDeleteIt);
     438             :        }
     439             :     } else {
     440           0 :       Lattice<Float> &prior = *(cemem_ptr->itsPrior_ptr);
     441             :       RO_LatticeIterator<Float> 
     442           0 :         pri( prior, LatticeStepper(prior.shape(), model.niceCursorShape()));    
     443             :       Bool priDeleteIt;
     444           0 :       for (mod.reset(), del.reset(), res.reset(), pri.reset(), mas.reset(), stp.reset(); 
     445           0 :            !mod.atEnd(); 
     446           0 :            mod++,       del++,       res++,       pri++,       mas++,       stp++) {
     447           0 :         const Float *modStore = mod.cursor().getStorage(modDeleteIt);
     448           0 :         const Float *delStore = del.cursor().getStorage(delDeleteIt);
     449           0 :         const Float *resStore = res.cursor().getStorage(resDeleteIt);
     450           0 :         const Float *priStore = pri.cursor().getStorage(priDeleteIt);
     451           0 :         const Float *masStore = mas.cursor().getStorage(masDeleteIt);
     452           0 :         Float *stpStore = stp.rwCursor().getStorage(stpDeleteIt);
     453           0 :         const Float *modIter = modStore;
     454           0 :         const Float *delIter = delStore;
     455           0 :         const Float *resIter = resStore;
     456           0 :         const Float *priIter = priStore;
     457           0 :         const Float *masIter = masStore;
     458           0 :         Float *stpIter = stpStore;
     459           0 :         for (i=0;i<mod.cursor().nelements();
     460           0 :              i++,modIter++, delIter++, resIter++, priIter++, stpIter++, masIter++) {
     461           0 :           if (*masIter > 0.0) {
     462           0 :             rHess = (*modIter + *delIter)/(1 + ggc* (*modIter + *delIter));
     463           0 :             gradH = -log( (*modIter + *delIter) / (*priIter));
     464           0 :             gradC = -2*(*resIter);
     465           0 :             gradJ = gradH - alpha*gradC - beta;
     466           0 :             stepValue = rHess * gradJ;
     467           0 :             (*stpIter) = stepValue;
     468           0 :             GDGHH = GDGHH + gradH * rHess * gradH;
     469           0 :             GDGHC = GDGHC + gradH * rHess * gradC;
     470           0 :             GDGHF = GDGHF + gradH * rHess;
     471           0 :             GDGCC = GDGCC + gradC * rHess * gradC;
     472           0 :             GDGCF = GDGCF + gradC * rHess;
     473           0 :             GDGFF = GDGFF + rHess;
     474             :           }
     475             :         }
     476           0 :         mod.cursor().freeStorage(modStore, modDeleteIt);
     477           0 :         del.cursor().freeStorage(delStore, delDeleteIt);
     478           0 :         res.cursor().freeStorage(resStore, resDeleteIt);
     479           0 :         pri.cursor().freeStorage(priStore, priDeleteIt);
     480           0 :         mas.cursor().freeStorage(masStore, masDeleteIt);
     481           0 :         stp.rwCursor().putStorage(stpStore, stpDeleteIt);
     482             :       }
     483           0 :     }
     484           0 :     GDG(H,H) = GDGHH;
     485           0 :     GDG(H,C) = GDGHC;
     486           0 :     GDG(H,F) = GDGHF;
     487           0 :     GDG(C,C) = GDGCC;
     488           0 :     GDG(C,F) = GDGCF;
     489           0 :     GDG(F,F) = GDGFF;
     490           0 :     GDG(H,J) = GDGHH -  alpha * GDGHC - beta * GDGHF;
     491           0 :     GDG(C,J) = GDGHC -  alpha * GDGCC - beta * GDGCF;
     492           0 :     GDG(F,J) = GDGHF -  alpha * GDGCF - beta * GDGFF;
     493           0 :     GDG(J,J) = GDGHH +  square(alpha) * GDGCC 
     494           0 :       + square(beta)*GDGFF  + 2*alpha*beta*GDGCF  
     495           0 :       - 2*alpha*GDGHC - 2*beta*GDGHF;
     496             : 
     497             : 
     498           0 :   } else { // no mask
     499             : 
     500             : 
     501           0 :     Lattice<Float> &model = *(cemem_ptr->itsModel_ptr);
     502           0 :     Lattice<Float> &delta = *(cemem_ptr->itsDeltaModel_ptr);
     503           0 :     Lattice<Float> &resid = *(cemem_ptr->itsResidual_ptr);
     504           0 :     Lattice<Float> &step  = *(cemem_ptr->itsStep_ptr);
     505             :     
     506           0 :     GDG.resize(4,4);
     507           0 :     GDG.set(0.0);
     508           0 :     Float alpha = cemem_ptr->itsAlpha;
     509           0 :     Float beta  = cemem_ptr->itsBeta;
     510           0 :     Float defLev = cemem_ptr->itsDefaultLevel;
     511             :     
     512           0 :     Float ggc = 2 * alpha * cemem_ptr->itsQ;
     513             :     Float rHess;
     514             :     
     515             :     RO_LatticeIterator<Float> 
     516           0 :       mod( model, LatticeStepper(model.shape(), model.niceCursorShape()));
     517             :     RO_LatticeIterator<Float> 
     518           0 :       del( delta, LatticeStepper(model.shape(), model.niceCursorShape()));
     519             :     RO_LatticeIterator<Float> 
     520           0 :       res( resid, LatticeStepper(resid.shape(), model.niceCursorShape()));
     521             :     LatticeIterator<Float> 
     522           0 :       stp( step, LatticeStepper(step.shape(), model.niceCursorShape()));
     523             :     uInt i;
     524             :     Bool modDeleteIt;
     525             :     Bool delDeleteIt;
     526             :     Bool resDeleteIt;
     527             :     Bool stpDeleteIt;
     528           0 :     Double GDGHH = 0.0;
     529           0 :     Double GDGHC = 0.0;
     530           0 :     Double GDGHF = 0.0;
     531           0 :     Double GDGCC = 0.0;
     532           0 :     Double GDGCF = 0.0;
     533           0 :     Double GDGFF = 0.0;
     534           0 :     Double gradH = 0.0;
     535           0 :     Double gradC = 0.0;
     536           0 :     Double gradJ = 0.0;
     537             :     Float stepValue;
     538           0 :     if ( cemem_ptr->itsPrior_ptr == 0) {
     539           0 :       Float logDef = log(defLev);
     540           0 :       for (mod.reset(), del.reset(), res.reset(), stp.reset(); 
     541           0 :            !mod.atEnd(); 
     542           0 :            mod++,       del++,       res++,       stp++) {
     543           0 :         const Float *modStore = mod.cursor().getStorage(modDeleteIt);
     544           0 :         const Float *delStore = del.cursor().getStorage(delDeleteIt);
     545           0 :         const Float *resStore = res.cursor().getStorage(resDeleteIt);
     546           0 :         Float *stpStore = stp.rwCursor().getStorage(stpDeleteIt);
     547           0 :         const Float *modIter = modStore;
     548           0 :         const Float *delIter = delStore;
     549           0 :         const Float *resIter = resStore;
     550           0 :         Float *stpIter = stpStore;
     551           0 :         for (i=0;i<mod.cursor().nelements();
     552           0 :              i++,modIter++, delIter++, resIter++, stpIter++) {
     553           0 :           rHess = (*modIter + *delIter)/(1 + ggc * (*modIter + *delIter));
     554           0 :           gradH = -log(*modIter + *delIter) + logDef;
     555           0 :           gradC = -2*(*resIter);
     556           0 :           gradJ = gradH - alpha*gradC - beta;
     557           0 :           stepValue = rHess * gradJ;
     558           0 :           (*stpIter) = stepValue;
     559           0 :           GDGHH = GDGHH + gradH * rHess * gradH;
     560           0 :           GDGHC = GDGHC + gradH * rHess * gradC;
     561           0 :           GDGHF = GDGHF + gradH * rHess;
     562           0 :           GDGCC = GDGCC + gradC * rHess * gradC;
     563           0 :           GDGCF = GDGCF + gradC * rHess;
     564           0 :           GDGFF = GDGFF + rHess;
     565             :         }
     566           0 :         mod.cursor().freeStorage(modStore, modDeleteIt);
     567           0 :         del.cursor().freeStorage(delStore, delDeleteIt);
     568           0 :         res.cursor().freeStorage(resStore, resDeleteIt);
     569           0 :         stp.rwCursor().putStorage(stpStore, stpDeleteIt);
     570             :       }
     571             :     } else {
     572           0 :       Lattice<Float> &prior = *(cemem_ptr->itsPrior_ptr);
     573             :       RO_LatticeIterator<Float> 
     574           0 :         pri( prior, LatticeStepper(prior.shape(), model.niceCursorShape()));    
     575             :       Bool priDeleteIt;
     576           0 :       for (mod.reset(), del.reset(), res.reset(), pri.reset(), stp.reset(); 
     577           0 :            !mod.atEnd(); 
     578           0 :            mod++,       del++,       res++,       pri++,       stp++) {
     579           0 :         const Float *modStore = mod.cursor().getStorage(modDeleteIt);
     580           0 :         const Float *delStore = del.cursor().getStorage(delDeleteIt);
     581           0 :         const Float *resStore = res.cursor().getStorage(resDeleteIt);
     582           0 :         const Float *priStore = pri.cursor().getStorage(priDeleteIt);
     583           0 :         Float *stpStore = stp.rwCursor().getStorage(stpDeleteIt);
     584           0 :         const Float *modIter = modStore;
     585           0 :         const Float *delIter = delStore;
     586           0 :         const Float *resIter = resStore;
     587           0 :         const Float *priIter = priStore;
     588           0 :         Float *stpIter = stpStore;
     589           0 :         for (i=0;i<mod.cursor().nelements();
     590           0 :              i++,modIter++, delIter++, resIter++, priIter++, stpIter++) {
     591           0 :           rHess = (*modIter + *delIter)/(1 + ggc* (*modIter + *delIter));
     592           0 :           gradH = -log( (*modIter + *delIter) / (*priIter));
     593           0 :           gradC = -2*(*resIter);
     594           0 :           gradJ = gradH - alpha*gradC - beta;
     595           0 :           stepValue = rHess * gradJ;
     596           0 :           (*stpIter) = stepValue;
     597           0 :           GDGHH = GDGHH + gradH * rHess * gradH;
     598           0 :           GDGHC = GDGHC + gradH * rHess * gradC;
     599           0 :           GDGHF = GDGHF + gradH * rHess;
     600           0 :           GDGCC = GDGCC + gradC * rHess * gradC;
     601           0 :           GDGCF = GDGCF + gradC * rHess;
     602           0 :           GDGFF = GDGFF + rHess;
     603             :         }
     604           0 :         mod.cursor().freeStorage(modStore, modDeleteIt);
     605           0 :         del.cursor().freeStorage(delStore, delDeleteIt);
     606           0 :         res.cursor().freeStorage(resStore, resDeleteIt);
     607           0 :         pri.cursor().freeStorage(priStore, priDeleteIt);
     608           0 :         stp.rwCursor().putStorage(stpStore, stpDeleteIt);
     609             :       }
     610           0 :     }
     611           0 :     GDG(H,H) = GDGHH;
     612           0 :     GDG(H,C) = GDGHC;
     613           0 :     GDG(H,F) = GDGHF;
     614           0 :     GDG(C,C) = GDGCC;
     615           0 :     GDG(C,F) = GDGCF;
     616           0 :     GDG(F,F) = GDGFF;
     617           0 :     GDG(H,J) = GDGHH -  alpha * GDGHC - beta * GDGHF;
     618           0 :     GDG(C,J) = GDGHC -  alpha * GDGCC - beta * GDGCF;
     619           0 :     GDG(F,J) = GDGHF -  alpha * GDGCF - beta * GDGFF;
     620           0 :     GDG(J,J) = GDGHH +  square(alpha) * GDGCC 
     621           0 :       + square(beta)*GDGFF  + 2*alpha*beta*GDGCF  
     622           0 :       - 2*alpha*GDGHC - 2*beta*GDGHF;
     623             : 
     624           0 :   }
     625             : 
     626           0 : };
     627             : 
     628             : 
     629             : //----------------------------------------------------------------------
     630           0 : Double IncEntropyI::formGDS()
     631             : {
     632           0 :   Lattice<Float> &model = *(cemem_ptr->itsModel_ptr);
     633           0 :   Lattice<Float> &delta = *(cemem_ptr->itsDeltaModel_ptr);
     634           0 :   Lattice<Float> &step  = *(cemem_ptr->itsStep_ptr);
     635           0 :   Lattice<Float> &resid = *(cemem_ptr->itsResidual_ptr);
     636             : 
     637           0 :   Float alpha = cemem_ptr->itsAlpha;
     638           0 :   Float beta = cemem_ptr->itsBeta;
     639           0 :   Float defLev = cemem_ptr->itsDefaultLevel;
     640             : 
     641           0 :   Double gds = 0;
     642             : 
     643           0 :   if (cemem_ptr->itsMask_ptr) { // Do Mask
     644           0 :     Lattice<Float> &mask = *(cemem_ptr->itsMask_ptr);
     645             : 
     646             :     RO_LatticeIterator<Float> 
     647           0 :       mod( model, LatticeStepper(model.shape(), model.niceCursorShape()));
     648             :     RO_LatticeIterator<Float> 
     649           0 :       del( delta, LatticeStepper(model.shape(), model.niceCursorShape()));
     650             :     LatticeIterator<Float> 
     651           0 :       stp( step, LatticeStepper(model.shape(), model.niceCursorShape()));
     652             :     RO_LatticeIterator<Float> 
     653           0 :       res( resid, LatticeStepper(resid.shape(), model.niceCursorShape()));
     654             :     RO_LatticeIterator<Float> 
     655           0 :       mas( mask, LatticeStepper(model.shape(), model.niceCursorShape()));
     656             :     Bool modDeleteIt;
     657             :     Bool delDeleteIt;
     658             :     Bool masDeleteIt;
     659             :     Bool stpDeleteIt;
     660             :     Bool resDeleteIt;
     661             :     Bool priDeleteIt;
     662             : 
     663           0 :     if (cemem_ptr->itsPrior_ptr) { // mask AND prior
     664             : 
     665           0 :       Lattice<Float> &prior = *(cemem_ptr->itsPrior_ptr);
     666             :       RO_LatticeIterator<Float> 
     667           0 :         pri( prior, LatticeStepper(model.shape(), model.niceCursorShape()));
     668             : 
     669             : 
     670           0 :       for (mod.reset(), del.reset(), mas.reset(), pri.reset(), res.reset(), stp.reset();
     671           0 :            !mod.atEnd(); 
     672           0 :            mod++,       del++,       mas++,       pri++,       res++,       stp++) {
     673           0 :         const Float *modStore = mod.cursor().getStorage(modDeleteIt);
     674           0 :         const Float *delStore = del.cursor().getStorage(delDeleteIt);
     675           0 :         const Float *masStore = mas.cursor().getStorage(masDeleteIt);
     676           0 :         const Float *priStore = pri.cursor().getStorage(priDeleteIt);
     677           0 :         const Float *stpStore = stp.cursor().getStorage(stpDeleteIt);
     678           0 :         const Float *resStore = res.cursor().getStorage(resDeleteIt);
     679           0 :         const Float *modIter = modStore;
     680           0 :         const Float *delIter = delStore;
     681           0 :         const Float *masIter = masStore;
     682           0 :         const Float *priIter = priStore;
     683           0 :         const Float *stpIter = stpStore;
     684           0 :         const Float *resIter = resStore;
     685           0 :         for (uInt i=0;i<mod.cursor().nelements();
     686           0 :              i++,modIter++, delIter++, masIter++, priIter++, stpIter++,resIter++ ) {
     687           0 :           if (*masIter > 0.0) {
     688           0 :             gds += (*stpIter) * (-log( (*modIter + *delIter)/(*priIter) ) + 2.0*alpha * (*resIter) - beta);
     689             :           }
     690             :         }
     691           0 :         mod.cursor().freeStorage(modStore, modDeleteIt);
     692           0 :         mas.cursor().freeStorage(masStore, masDeleteIt);
     693           0 :         res.cursor().freeStorage(resStore, resDeleteIt);
     694           0 :         stp.cursor().freeStorage(stpStore, stpDeleteIt);
     695           0 :         pri.cursor().freeStorage(priStore, priDeleteIt);
     696             :       }
     697             : 
     698           0 :     }  else {  // Mask, but no prior
     699             :       
     700           0 :       Float logDefLev = log(defLev);
     701           0 :       for (mod.reset(), del.reset(), mas.reset(), res.reset(), stp.reset();
     702           0 :            !mod.atEnd(); 
     703           0 :            mod++,       del++,       mas++,       res++,       stp++) {
     704           0 :         const Float *modStore = mod.cursor().getStorage(modDeleteIt);
     705           0 :         const Float *delStore = del.cursor().getStorage(delDeleteIt);
     706           0 :         const Float *masStore = mas.cursor().getStorage(masDeleteIt);
     707           0 :         const Float *stpStore = stp.cursor().getStorage(stpDeleteIt);
     708           0 :         const Float *resStore = res.cursor().getStorage(resDeleteIt);
     709           0 :         const Float *modIter = modStore;
     710           0 :         const Float *delIter = delStore;
     711           0 :         const Float *masIter = masStore;
     712           0 :         const Float *stpIter = stpStore;
     713           0 :         const Float *resIter = resStore;
     714           0 :         for (uInt i=0;i<mod.cursor().nelements();i++,modIter++, delIter++, masIter++, stpIter++, resIter++) {
     715           0 :           if (*masIter > 0.0) {
     716           0 :             gds += (*stpIter) * (-log( *modIter + *delIter) +logDefLev + 2.0*alpha * (*resIter) - beta);
     717             :           }
     718             :         }
     719           0 :         mod.cursor().freeStorage(modStore, modDeleteIt);
     720           0 :         del.cursor().freeStorage(delStore, delDeleteIt);
     721           0 :         mas.cursor().freeStorage(masStore, masDeleteIt);
     722           0 :         res.cursor().freeStorage(resStore, resDeleteIt);
     723           0 :         stp.cursor().freeStorage(stpStore, stpDeleteIt);
     724             :       }
     725             :     }
     726             : 
     727           0 :   }  else {  // No Mask
     728             : 
     729           0 :     if (cemem_ptr->itsPrior_ptr == 0) {
     730           0 :       Float logDefLev = log(defLev);
     731           0 :       gds = sum( step *
     732           0 :                  ( -log(model + delta)+logDefLev+2.0*alpha * resid -beta)).getDouble();
     733             :     } else {
     734           0 :       Lattice<Float> &prior = *(cemem_ptr->itsPrior_ptr);
     735           0 :       gds = sum( step *
     736           0 :                  ( -log((model+delta)/prior) + 2.0*alpha * resid - beta)).getDouble();
     737             :     }
     738             :   }
     739             :   
     740           0 :   return gds;
     741             : 
     742             : };
     743             : 
     744             : 
     745             : //----------------------------------------------------------------------
     746           0 : void IncEntropyI::infoBanner(){
     747           0 :   cemem_ptr->itsLog << 
     748           0 :     " I  Entropy    Flux     Fit    MaxResid   Gradient "  << LogIO::POST;
     749           0 : };
     750             : 
     751             : //----------------------------------------------------------------------
     752           0 : void IncEntropyI::infoPerIteration(uInt iteration){
     753             : 
     754           0 :   Lattice<Float> &resid = *(cemem_ptr->itsResidual_ptr);
     755           0 :   Float maxResid = (max(abs(resid))).getFloat();
     756             : 
     757           0 :   cemem_ptr->itsLog << 
     758             :     (iteration +1) << "  " <<
     759           0 :     cemem_ptr->itsEntropy << "  " <<
     760           0 :     cemem_ptr->itsFlux  << "  " <<
     761           0 :     cemem_ptr->itsFit << "  " <<
     762             :     maxResid << "  " <<
     763           0 :     cemem_ptr->itsNormGrad << "  " <<
     764           0 :     LogIO::POST;
     765             : 
     766           0 :   if (cemem_ptr->itsProgressPtr) {
     767           0 :     Lattice<Float> &model = *(cemem_ptr->itsModel_ptr);
     768             :     // Note:  posMaximumResidual is not valid! (  IPosition(4,0,0,0,0)  )
     769           0 :     cemem_ptr->itsProgressPtr->
     770           0 :       info(false, iteration, cemem_ptr->itsNumberIterations, model, resid, 
     771           0 :            maxResid, IPosition(4,0,0,0,0),
     772           0 :            cemem_ptr->itsFlux, cemem_ptr->itsFit, cemem_ptr->itsNormGrad,
     773           0 :            cemem_ptr->itsEntropy);
     774             :   }
     775           0 : };
     776             : 
     777             : 
     778             : //----------------------------------------------------------------------
     779           0 : Float IncEntropyI::relaxMin()
     780             : {
     781           0 :   Float requiredModelMin = 0.1 * cemem_ptr->itsModelMin + 1.0e-9;
     782           0 :   return requiredModelMin;
     783             : };
     784             : 
     785             : 
     786             : //----------------------------------------------------------------------
     787           0 : Bool IncEntropyI::testConvergence()
     788             : {
     789             :   Bool converged;
     790           0 :   converged = ( (cemem_ptr->itsFit < (1.0+(cemem_ptr->itsTolerance))) &&
     791           0 :                 (cemem_ptr->itsIteration != (cemem_ptr->itsFirstIteration)) &&
     792           0 :                 (cemem_ptr->itsNormGrad < (cemem_ptr->itsTolerance)) );
     793           0 :   if (cemem_ptr->itsUseFluxConstraint) {
     794           0 :     converged = (converged && 
     795           0 :                  (abs(cemem_ptr->itsFlux - cemem_ptr->itsTargetFlux) 
     796           0 :                     < cemem_ptr->itsTolerance*cemem_ptr->itsTargetFlux));
     797             :   }
     798             : 
     799           0 :   return converged;
     800             : 
     801             : };
     802             : 
     803             : 
     804             : 
     805             : 
     806             : 
     807             : //----------------------------------------------------------------------
     808           0 : IncEntropyEmptiness::IncEntropyEmptiness()
     809             : {
     810           0 : };
     811             : 
     812             : //----------------------------------------------------------------------
     813           0 : IncEntropyEmptiness::~IncEntropyEmptiness()
     814             : {
     815           0 : };
     816             : 
     817             : //----------------------------------------------------------------------
     818             : 
     819           0 : Float IncEntropyEmptiness::formEntropy()
     820             : {
     821           0 :   Lattice<Float> &model = *(cemem_ptr->itsModel_ptr);
     822           0 :   Lattice<Float> &delta = *(cemem_ptr->itsDeltaModel_ptr);
     823           0 :   Float flux = 0.0;
     824           0 :   flux = sum(model).getFloat();
     825           0 :   cemem_ptr->itsFlux = flux;
     826           0 :   LatticeExprNode myEntropyLEN;
     827           0 :   Float aFit = cemem_ptr->itsAFit;
     828           0 :   Float myEntropy = 0;
     829             : 
     830           0 :   if (cemem_ptr->itsMask_ptr) {
     831           0 :     Lattice<Float> &mask  = *(cemem_ptr->itsMask_ptr);
     832             : 
     833           0 :     if (cemem_ptr->itsPrior_ptr == 0 ) {
     834           0 :       Float defLev = cemem_ptr->itsDefaultLevel;
     835           0 :       myEntropyLEN = - sum( mask * (log(cosh(((model + delta) - defLev)/aFit))) ) ;
     836           0 :       myEntropy = -aFit * myEntropyLEN.getFloat();
     837             :     } else {
     838           0 :       Lattice<Float> &prior = *(cemem_ptr->itsPrior_ptr);
     839           0 :       myEntropyLEN = - sum( mask * (log(cosh(((model + delta) - prior)/aFit))) ) ;
     840           0 :       myEntropy = -aFit * myEntropyLEN.getFloat();
     841             :     }
     842             : 
     843             :   } else {  // No Mask
     844             : 
     845           0 :     if (cemem_ptr->itsPrior_ptr == 0 ) {
     846           0 :       Float defLev = cemem_ptr->itsDefaultLevel;
     847           0 :       myEntropyLEN = - sum( log(cosh(((model + delta) - defLev)/aFit)) ) ;
     848           0 :       myEntropy = -aFit * myEntropyLEN.getFloat();
     849             :     } else {
     850           0 :       Lattice<Float> &prior = *(cemem_ptr->itsPrior_ptr);
     851           0 :       myEntropyLEN = - sum( log(cosh(((model + delta) - prior)/aFit)) ) ;
     852           0 :       myEntropy = -aFit * myEntropyLEN.getFloat();
     853             :     }
     854             :   }
     855           0 :   return myEntropy;
     856           0 : };
     857             : 
     858             : //----------------------------------------------------------------------
     859           0 : void IncEntropyEmptiness::formGDG(Matrix<Double>& GDG)
     860             : {
     861           0 :   Lattice<Float> &delta = *(cemem_ptr->itsDeltaModel_ptr);
     862           0 :   Lattice<Float> &model = *(cemem_ptr->itsModel_ptr);
     863           0 :   Lattice<Float> &resid = *(cemem_ptr->itsResidual_ptr);
     864             : 
     865           0 :   GDG.resize(4,4);
     866           0 :   GDG.set(0.0);
     867           0 :   Float aFit = cemem_ptr->itsAFit;
     868           0 :   Float alpha = cemem_ptr->itsAlpha;
     869           0 :   Float beta  = cemem_ptr->itsBeta;
     870             : 
     871           0 :   Float ggc = 2 * alpha * cemem_ptr->itsQ;
     872             :   Float rHess;
     873             : 
     874             :   RO_LatticeIterator<Float> 
     875           0 :     mod( model, LatticeStepper(model.shape(), model.niceCursorShape()));
     876             :   RO_LatticeIterator<Float> 
     877           0 :     del( delta, LatticeStepper(model.shape(), model.niceCursorShape()));
     878             :   RO_LatticeIterator<Float> 
     879           0 :     res( resid, LatticeStepper(model.shape(), model.niceCursorShape()));
     880             :   uInt i;
     881             :   Bool modDeleteIt;
     882             :   Bool delDeleteIt;
     883             :   Bool resDeleteIt;
     884             :   Bool masDeleteIt;
     885           0 :   Double GDGHH = 0.0;
     886           0 :   Double GDGHC = 0.0;
     887           0 :   Double GDGHF = 0.0;
     888           0 :   Double GDGCC = 0.0;
     889           0 :   Double GDGCF = 0.0;
     890           0 :   Double GDGFF = 0.0;
     891           0 :   Double gradH = 0.0;
     892           0 :   Double gradC = 0.0;
     893             : 
     894           0 :   if (cemem_ptr->itsMask_ptr) { // Do MASK
     895             : 
     896           0 :     Lattice<Float> &mask = *(cemem_ptr->itsMask_ptr);
     897             :     RO_LatticeIterator<Float> 
     898           0 :       mas( mask, LatticeStepper(model.shape(), model.niceCursorShape()));
     899             : 
     900           0 :     if (cemem_ptr->itsPrior_ptr ==  0) {
     901           0 :       Float defLev = cemem_ptr->itsDefaultLevel;
     902           0 :       for (mod.reset(), del.reset(), res.reset(); 
     903           0 :            !mod.atEnd(); 
     904           0 :            mod++,       del++,       res++) {
     905           0 :         const Float *modStore = mod.cursor().getStorage(modDeleteIt);
     906           0 :         const Float *delStore = del.cursor().getStorage(delDeleteIt);
     907           0 :         const Float *resStore = res.cursor().getStorage(resDeleteIt);
     908           0 :         const Float *masStore = mas.cursor().getStorage(masDeleteIt);
     909           0 :         const Float *modIter = modStore;
     910           0 :         const Float *delIter = delStore;
     911           0 :         const Float *resIter = resStore;
     912           0 :         const Float *masIter = masStore;
     913           0 :         for (i=0;i<mod.cursor().nelements();
     914           0 :              i++,modIter++, delIter++, resIter++, masIter++) {
     915           0 :           if (*masIter > 0.0) {
     916           0 :             gradH = -tanh( (*modIter + *delIter - defLev)/aFit );
     917           0 :             rHess = 1.0/( square(1.0-gradH) /aFit + ggc) ;
     918           0 :             gradC = -2*(*resIter);
     919           0 :             GDGHH = GDGHH + gradH * rHess * gradH;
     920           0 :             GDGHC = GDGHC + gradH * rHess * gradC;
     921           0 :             GDGHF = GDGHF + gradH * rHess;
     922           0 :             GDGCC = GDGCC + gradC * rHess * gradC;
     923           0 :             GDGCF = GDGCF + gradC * rHess;
     924           0 :             GDGFF = GDGFF + rHess;
     925             :           }
     926             :         }
     927           0 :         mod.cursor().freeStorage(modStore, modDeleteIt);
     928           0 :         del.cursor().freeStorage(delStore, delDeleteIt);
     929           0 :         res.cursor().freeStorage(resStore, resDeleteIt);
     930           0 :         mas.cursor().freeStorage(masStore, masDeleteIt);
     931             :       }
     932             :     } else {
     933           0 :       Lattice<Float> &prior = *(cemem_ptr->itsPrior_ptr);
     934             :       RO_LatticeIterator<Float> 
     935           0 :         pri( prior, LatticeStepper(prior.shape(), model.niceCursorShape()));    
     936             :       Bool priDeleteIt;
     937           0 :       for (mod.reset(), del.reset(), res.reset(), pri.reset(); 
     938           0 :            !mod.atEnd(); 
     939           0 :            mod++,       del++,       res++,       pri++) {
     940           0 :         const Float *modStore = mod.cursor().getStorage(modDeleteIt);
     941           0 :         const Float *delStore = del.cursor().getStorage(delDeleteIt);
     942           0 :         const Float *resStore = res.cursor().getStorage(resDeleteIt);
     943           0 :         const Float *masStore = mas.cursor().getStorage(masDeleteIt);
     944           0 :         const Float *priStore = pri.cursor().getStorage(priDeleteIt);
     945           0 :         const Float *modIter = modStore;
     946           0 :         const Float *delIter = delStore;
     947           0 :         const Float *resIter = resStore;
     948           0 :         const Float *masIter = masStore;
     949           0 :         const Float *priIter = priStore;
     950           0 :         for (i=0;i<mod.cursor().nelements();
     951           0 :              i++,modIter++, delIter++, resIter++, masIter++, priIter++) {
     952           0 :           if (*masIter > 0.0) {
     953           0 :             gradH = -tanh( (*modIter + *delIter - *priIter)/aFit );
     954           0 :             rHess = 1.0/( square(1.0-gradH)/aFit + ggc) ;
     955           0 :             gradC = -2*(*resIter);
     956           0 :             GDGHH = GDGHH + gradH * rHess * gradH;
     957           0 :             GDGHC = GDGHC + gradH * rHess * gradC;
     958           0 :             GDGHF = GDGHF + gradH * rHess;
     959           0 :             GDGCC = GDGCC + gradC * rHess * gradC;
     960           0 :             GDGCF = GDGCF + gradC * rHess;
     961           0 :             GDGFF = GDGFF + rHess;
     962             :           }
     963             :         }
     964           0 :         mod.cursor().freeStorage(modStore, modDeleteIt);
     965           0 :         del.cursor().freeStorage(delStore, delDeleteIt);
     966           0 :         res.cursor().freeStorage(resStore, resDeleteIt);
     967           0 :         mas.cursor().freeStorage(masStore, masDeleteIt);
     968           0 :         pri.cursor().freeStorage(priStore, priDeleteIt);
     969             :       }
     970           0 :     }
     971             : 
     972           0 :   }  else {  // No Mask
     973             : 
     974           0 :     if (cemem_ptr->itsPrior_ptr ==  0) {
     975           0 :       Float defLev = cemem_ptr->itsDefaultLevel;
     976           0 :       for (mod.reset(), del.reset(), res.reset(); 
     977           0 :            !mod.atEnd(); 
     978           0 :            mod++,       del++,       res++) {
     979           0 :         const Float *modStore = mod.cursor().getStorage(modDeleteIt);
     980           0 :         const Float *delStore = del.cursor().getStorage(delDeleteIt);
     981           0 :         const Float *resStore = res.cursor().getStorage(resDeleteIt);
     982           0 :         const Float *modIter = modStore;
     983           0 :         const Float *delIter = delStore;
     984           0 :         const Float *resIter = resStore;
     985           0 :         for (i=0;i<mod.cursor().nelements();
     986           0 :              i++,modIter++, delIter++, resIter++) {
     987           0 :           gradH = -tanh( (*modIter + *delIter - defLev)/aFit );
     988           0 :           rHess = 1.0/( square(1.0-gradH) /aFit + ggc) ;
     989           0 :           gradC = -2*(*resIter);
     990           0 :           GDGHH = GDGHH + gradH * rHess * gradH;
     991           0 :           GDGHC = GDGHC + gradH * rHess * gradC;
     992           0 :           GDGHF = GDGHF + gradH * rHess;
     993           0 :           GDGCC = GDGCC + gradC * rHess * gradC;
     994           0 :           GDGCF = GDGCF + gradC * rHess;
     995           0 :           GDGFF = GDGFF + rHess;
     996             :         }
     997           0 :         mod.cursor().freeStorage(modStore, modDeleteIt);
     998           0 :         del.cursor().freeStorage(delStore, delDeleteIt);
     999           0 :         res.cursor().freeStorage(resStore, resDeleteIt);
    1000             :       }
    1001             :     } else {
    1002           0 :       Lattice<Float> &prior = *(cemem_ptr->itsPrior_ptr);
    1003             :       RO_LatticeIterator<Float> 
    1004           0 :         pri( prior, LatticeStepper(prior.shape(), model.niceCursorShape()));    
    1005             :       Bool priDeleteIt;
    1006           0 :       for (mod.reset(), del.reset(), res.reset(), pri.reset(); 
    1007           0 :            !mod.atEnd(); 
    1008           0 :            mod++,       del++,       res++,       pri++) {
    1009           0 :         const Float *modStore = mod.cursor().getStorage(modDeleteIt);
    1010           0 :         const Float *delStore = del.cursor().getStorage(delDeleteIt);
    1011           0 :         const Float *resStore = res.cursor().getStorage(resDeleteIt);
    1012           0 :         const Float *priStore = pri.cursor().getStorage(priDeleteIt);
    1013           0 :         const Float *modIter = modStore;
    1014           0 :         const Float *delIter = delStore;
    1015           0 :         const Float *resIter = resStore;
    1016           0 :         const Float *priIter = priStore;
    1017           0 :         for (i=0;i<mod.cursor().nelements();
    1018           0 :              i++, modIter++, delIter++, resIter++, priIter++) {
    1019           0 :           gradH = -tanh( (*modIter + *delIter - *priIter)/aFit );
    1020           0 :           rHess = 1.0/( square(1.0-gradH)/aFit + ggc) ;
    1021           0 :           gradC = -2*(*resIter);
    1022           0 :           GDGHH = GDGHH + gradH * rHess * gradH;
    1023           0 :           GDGHC = GDGHC + gradH * rHess * gradC;
    1024           0 :           GDGHF = GDGHF + gradH * rHess;
    1025           0 :           GDGCC = GDGCC + gradC * rHess * gradC;
    1026           0 :           GDGCF = GDGCF + gradC * rHess;
    1027           0 :           GDGFF = GDGFF + rHess;
    1028             :         }
    1029           0 :         mod.cursor().freeStorage(modStore, modDeleteIt);
    1030           0 :         del.cursor().freeStorage(delStore, delDeleteIt);
    1031           0 :         res.cursor().freeStorage(resStore, resDeleteIt);
    1032           0 :         pri.cursor().freeStorage(priStore, priDeleteIt);
    1033             :       }
    1034           0 :     }
    1035             : 
    1036             :   }
    1037           0 :   GDG(H,H) = GDGHH;
    1038           0 :   GDG(H,C) = GDGHC;
    1039           0 :   GDG(H,F) = GDGHF;
    1040           0 :   GDG(C,C) = GDGCC;
    1041           0 :   GDG(C,F) = GDGCF;
    1042           0 :   GDG(F,F) = GDGFF;
    1043           0 :   GDG(H,J) = GDGHH -  alpha * GDGHC - beta * GDGHF;
    1044           0 :   GDG(C,J) = GDGHC -  alpha * GDGCC - beta * GDGCF;
    1045           0 :   GDG(F,J) = GDGHF -  alpha * GDGCF - beta * GDGFF;
    1046           0 :   GDG(J,J) = GDGHH +  square(alpha) * GDGCC 
    1047           0 :     + square(beta)*GDGFF  + 2*alpha*beta*GDGCF  
    1048           0 :     - 2*alpha*GDGHC - 2*beta*GDGHF;
    1049           0 : };
    1050             : 
    1051             : 
    1052             : //----------------------------------------------------------------------
    1053           0 : void IncEntropyEmptiness::formGDGStep(Matrix<Double>& GDG)
    1054             : {
    1055           0 :   Lattice<Float> &model = *(cemem_ptr->itsModel_ptr);
    1056           0 :   Lattice<Float> &delta = *(cemem_ptr->itsDeltaModel_ptr);
    1057           0 :   Lattice<Float> &resid = *(cemem_ptr->itsResidual_ptr);
    1058           0 :   Lattice<Float> &step  = *(cemem_ptr->itsStep_ptr);
    1059             : 
    1060           0 :   GDG.resize(4,4);
    1061           0 :   GDG.set(0.0);
    1062           0 :   Float alpha = cemem_ptr->itsAlpha;
    1063           0 :   Float beta  = cemem_ptr->itsBeta;
    1064           0 :   Float aFit = cemem_ptr->itsAFit;
    1065             : 
    1066             :   // should not use Lattice Expression Language for efficiency
    1067             :   // using it right now to get up and running
    1068           0 :   Float ggc = 2 * alpha * cemem_ptr->itsQ;
    1069             :   Float rHess;
    1070             : 
    1071             :   RO_LatticeIterator<Float> 
    1072           0 :     mod( model, LatticeStepper(model.shape(), model.niceCursorShape()));
    1073             :   RO_LatticeIterator<Float> 
    1074           0 :     del( delta, LatticeStepper(model.shape(), model.niceCursorShape()));
    1075             :   RO_LatticeIterator<Float> 
    1076           0 :     res( resid, LatticeStepper(model.shape(), model.niceCursorShape()));
    1077             :   LatticeIterator<Float> 
    1078           0 :     stp( step, LatticeStepper(model.shape(), model.niceCursorShape()));
    1079             :   uInt i;
    1080             :   Bool modDeleteIt;
    1081             :   Bool delDeleteIt;
    1082             :   Bool resDeleteIt;
    1083             :   Bool stpDeleteIt;
    1084             :   Bool masDeleteIt;
    1085           0 :   Double GDGHH = 0.0;
    1086           0 :   Double GDGHC = 0.0;
    1087           0 :   Double GDGHF = 0.0;
    1088           0 :   Double GDGCC = 0.0;
    1089           0 :   Double GDGCF = 0.0;
    1090           0 :   Double GDGFF = 0.0;
    1091           0 :   Double gradH = 0.0;
    1092           0 :   Double gradC = 0.0;
    1093           0 :   Double gradJ = 0.0;
    1094             :   Float stepValue;
    1095             : 
    1096           0 :   if (cemem_ptr->itsMask_ptr) { // Mask
    1097           0 :     Lattice<Float> &mask  = *(cemem_ptr->itsMask_ptr);
    1098             :     RO_LatticeIterator<Float> 
    1099           0 :       mas( mask, LatticeStepper(model.shape(), model.niceCursorShape()));
    1100             : 
    1101           0 :     if ( cemem_ptr->itsPrior_ptr == 0) {
    1102           0 :       Float defLev = cemem_ptr->itsDefaultLevel;
    1103           0 :       for (mod.reset(), del.reset(), res.reset(), stp.reset(), mas.reset(); 
    1104           0 :            !mod.atEnd(); mod++, del++, res++, stp++, mas++) {
    1105           0 :         const Float *modStore = mod.cursor().getStorage(modDeleteIt);
    1106           0 :         const Float *delStore = del.cursor().getStorage(delDeleteIt);
    1107           0 :         const Float *resStore = res.cursor().getStorage(resDeleteIt);
    1108           0 :         const Float *masStore = mas.cursor().getStorage(masDeleteIt);
    1109           0 :         Float *stpStore = stp.rwCursor().getStorage(stpDeleteIt);
    1110           0 :         const Float *modIter = modStore;
    1111           0 :         const Float *delIter = delStore;
    1112           0 :         const Float *resIter = resStore;
    1113           0 :         const Float *masIter = masStore;
    1114           0 :         Float *stpIter = stpStore;
    1115           0 :         for (i=0;i<mod.cursor().nelements();
    1116           0 :              i++,modIter++, delIter++, resIter++, stpIter++, masIter++) {
    1117           0 :           if (*masIter > 0.0) {
    1118           0 :             gradH = -tanh( (*modIter + *delIter - defLev)/aFit );
    1119           0 :             rHess = 1.0/( square(1.0-gradH)/aFit + ggc) ;
    1120           0 :             gradC = -2*(*resIter);
    1121           0 :             gradJ = gradH - alpha*gradC - beta;
    1122           0 :             stepValue = rHess * gradJ;
    1123           0 :             (*stpIter) = stepValue;
    1124           0 :             GDGHH = GDGHH + gradH * rHess * gradH;
    1125           0 :             GDGHC = GDGHC + gradH * rHess * gradC;
    1126           0 :             GDGHF = GDGHF + gradH * rHess;
    1127           0 :             GDGCC = GDGCC + gradC * rHess * gradC;
    1128           0 :             GDGCF = GDGCF + gradC * rHess;
    1129           0 :             GDGFF = GDGFF + rHess;
    1130             :           }
    1131             :         }
    1132           0 :         mod.cursor().freeStorage(modStore, modDeleteIt);
    1133           0 :         del.cursor().freeStorage(delStore, delDeleteIt);
    1134           0 :         res.cursor().freeStorage(resStore, resDeleteIt);
    1135           0 :         mas.cursor().freeStorage(masStore, masDeleteIt);
    1136           0 :         stp.rwCursor().putStorage(stpStore, stpDeleteIt);
    1137             :       }
    1138             :     } else {
    1139           0 :       Lattice<Float> &prior = *(cemem_ptr->itsPrior_ptr);
    1140             :       RO_LatticeIterator<Float> 
    1141           0 :         pri( prior, LatticeStepper(prior.shape(), model.niceCursorShape()));    
    1142             :       Bool priDeleteIt;
    1143           0 :       for (mod.reset(), del.reset(), res.reset(), mas.reset(), pri.reset(), stp.reset(); 
    1144           0 :            !mod.atEnd(); mod++, del++, res++, mas++, pri++, stp++) {
    1145           0 :         const Float *modStore = mod.cursor().getStorage(modDeleteIt);
    1146           0 :         const Float *delStore = del.cursor().getStorage(delDeleteIt);
    1147           0 :         const Float *resStore = res.cursor().getStorage(resDeleteIt);
    1148           0 :         const Float *masStore = mas.cursor().getStorage(masDeleteIt);
    1149           0 :         const Float *priStore = pri.cursor().getStorage(priDeleteIt);
    1150           0 :         Float *stpStore = stp.rwCursor().getStorage(stpDeleteIt);
    1151           0 :         const Float *modIter = modStore;
    1152           0 :         const Float *delIter = delStore;
    1153           0 :         const Float *resIter = resStore;
    1154           0 :         const Float *masIter = masStore;
    1155           0 :         const Float *priIter = priStore;
    1156           0 :         Float *stpIter = stpStore;
    1157           0 :         for (i=0;i<mod.cursor().nelements();
    1158           0 :              i++,modIter++, delIter++, resIter++, masIter++, priIter++, stpIter++) {
    1159           0 :           if (*masIter > 0.0) {
    1160           0 :             gradH = -tanh( (*modIter + *delIter - *priIter)/aFit );
    1161           0 :             rHess = 1.0/( square(1.0-gradH)/aFit + ggc) ;
    1162           0 :             gradC = -2*(*resIter);
    1163           0 :             gradJ = gradH - alpha*gradC - beta;
    1164           0 :             stepValue = rHess * gradJ;
    1165           0 :             (*stpIter) = stepValue;
    1166           0 :             GDGHH = GDGHH + gradH * rHess * gradH;
    1167           0 :             GDGHC = GDGHC + gradH * rHess * gradC;
    1168           0 :             GDGHF = GDGHF + gradH * rHess;
    1169           0 :             GDGCC = GDGCC + gradC * rHess * gradC;
    1170           0 :             GDGCF = GDGCF + gradC * rHess;
    1171           0 :             GDGFF = GDGFF + rHess;
    1172             :           }
    1173             :         }
    1174           0 :         mod.cursor().freeStorage(modStore, modDeleteIt);
    1175           0 :         del.cursor().freeStorage(delStore, delDeleteIt);
    1176           0 :         res.cursor().freeStorage(resStore, resDeleteIt);
    1177           0 :         mas.cursor().freeStorage(masStore, masDeleteIt);
    1178           0 :         pri.cursor().freeStorage(priStore, priDeleteIt);
    1179           0 :         stp.rwCursor().putStorage(stpStore, stpDeleteIt);
    1180             :       }
    1181           0 :     }
    1182             : 
    1183           0 :   } else { // No Mask
    1184             : 
    1185           0 :     if ( cemem_ptr->itsPrior_ptr == 0) {
    1186           0 :       Float defLev = cemem_ptr->itsDefaultLevel;
    1187           0 :       for (mod.reset(), del.reset(), res.reset(), stp.reset(); 
    1188           0 :            !mod.atEnd(); mod++, del++, res++, stp++) {
    1189           0 :         const Float *modStore = mod.cursor().getStorage(modDeleteIt);
    1190           0 :         const Float *delStore = del.cursor().getStorage(delDeleteIt);
    1191           0 :         const Float *resStore = res.cursor().getStorage(resDeleteIt);
    1192           0 :         Float *stpStore = stp.rwCursor().getStorage(stpDeleteIt);
    1193           0 :         const Float *modIter = modStore;
    1194           0 :         const Float *delIter = delStore;
    1195           0 :         const Float *resIter = resStore;
    1196           0 :         Float *stpIter = stpStore;
    1197           0 :         for (i=0;i<mod.cursor().nelements();i++,modIter++, delIter++, resIter++, stpIter++) {
    1198           0 :           gradH = -tanh( (*modIter + *delIter - defLev)/aFit );
    1199           0 :           rHess = 1.0/( square(1.0-gradH)/aFit + ggc) ;
    1200           0 :           gradC = -2*(*resIter);
    1201           0 :           gradJ = gradH - alpha*gradC - beta;
    1202           0 :           stepValue = rHess * gradJ;
    1203           0 :           (*stpIter) = stepValue;
    1204           0 :           GDGHH = GDGHH + gradH * rHess * gradH;
    1205           0 :           GDGHC = GDGHC + gradH * rHess * gradC;
    1206           0 :           GDGHF = GDGHF + gradH * rHess;
    1207           0 :           GDGCC = GDGCC + gradC * rHess * gradC;
    1208           0 :           GDGCF = GDGCF + gradC * rHess;
    1209           0 :           GDGFF = GDGFF + rHess;
    1210             :         }
    1211           0 :         mod.cursor().freeStorage(modStore, modDeleteIt);
    1212           0 :         del.cursor().freeStorage(delStore, delDeleteIt);
    1213           0 :         res.cursor().freeStorage(resStore, resDeleteIt);
    1214           0 :         stp.rwCursor().putStorage(stpStore, stpDeleteIt);
    1215             :       }
    1216             :     } else {
    1217           0 :       Lattice<Float> &prior = *(cemem_ptr->itsPrior_ptr);
    1218             :       RO_LatticeIterator<Float> 
    1219           0 :         pri( prior, LatticeStepper(prior.shape(), model.niceCursorShape()));    
    1220             :       Bool priDeleteIt;
    1221           0 :       for (mod.reset(), del.reset(), res.reset(), pri.reset(), stp.reset(); 
    1222           0 :            !mod.atEnd(); mod++, del++, res++, pri++, stp++) {
    1223           0 :         const Float *modStore = mod.cursor().getStorage(modDeleteIt);
    1224           0 :         const Float *delStore = del.cursor().getStorage(delDeleteIt);
    1225           0 :         const Float *resStore = res.cursor().getStorage(resDeleteIt);
    1226           0 :         const Float *priStore = pri.cursor().getStorage(priDeleteIt);
    1227           0 :         Float *stpStore = stp.rwCursor().getStorage(stpDeleteIt);
    1228           0 :         const Float *modIter = modStore;
    1229           0 :         const Float *delIter = delStore;
    1230           0 :         const Float *resIter = resStore;
    1231           0 :         const Float *priIter = priStore;
    1232           0 :         Float *stpIter = stpStore;
    1233           0 :         for (i=0;i<mod.cursor().nelements();
    1234           0 :              i++,modIter++, delIter++, resIter++, priIter++, stpIter++) {
    1235           0 :           gradH = -tanh( (*modIter + *delIter - *priIter)/aFit );
    1236           0 :           rHess = 1.0/( square(1.0-gradH)/aFit + ggc) ;
    1237           0 :           gradC = -2*(*resIter);
    1238           0 :           gradJ = gradH - alpha*gradC - beta;
    1239           0 :           stepValue = rHess * gradJ;
    1240           0 :           (*stpIter) = stepValue;
    1241           0 :           GDGHH = GDGHH + gradH * rHess * gradH;
    1242           0 :           GDGHC = GDGHC + gradH * rHess * gradC;
    1243           0 :           GDGHF = GDGHF + gradH * rHess;
    1244           0 :           GDGCC = GDGCC + gradC * rHess * gradC;
    1245           0 :           GDGCF = GDGCF + gradC * rHess;
    1246           0 :           GDGFF = GDGFF + rHess;
    1247             :         }
    1248           0 :         mod.cursor().freeStorage(modStore, modDeleteIt);
    1249           0 :         del.cursor().freeStorage(delStore, delDeleteIt);
    1250           0 :         res.cursor().freeStorage(resStore, resDeleteIt);
    1251           0 :         pri.cursor().freeStorage(priStore, priDeleteIt);
    1252           0 :         stp.rwCursor().putStorage(stpStore, stpDeleteIt);
    1253             :       }
    1254           0 :     }
    1255             :   }
    1256           0 :   GDG(H,H) = GDGHH;
    1257           0 :   GDG(H,C) = GDGHC;
    1258           0 :   GDG(H,F) = GDGHF;
    1259           0 :   GDG(C,C) = GDGCC;
    1260           0 :   GDG(C,F) = GDGCF;
    1261           0 :   GDG(F,F) = GDGFF;
    1262           0 :   GDG(H,J) = GDGHH -  alpha * GDGHC - beta * GDGHF;
    1263           0 :   GDG(C,J) = GDGHC -  alpha * GDGCC - beta * GDGCF;
    1264           0 :   GDG(F,J) = GDGHF -  alpha * GDGCF - beta * GDGFF;
    1265           0 :   GDG(J,J) = GDGHH +  square(alpha) * GDGCC 
    1266           0 :     + square(beta)*GDGFF  + 2*alpha*beta*GDGCF  
    1267           0 :     - 2*alpha*GDGHC - 2*beta*GDGHF;
    1268           0 : };
    1269             : 
    1270             : //----------------------------------------------------------------------
    1271           0 : Double IncEntropyEmptiness::formGDS()
    1272             : {
    1273           0 :   Lattice<Float> &model = *(cemem_ptr->itsModel_ptr);
    1274           0 :   Lattice<Float> &delta = *(cemem_ptr->itsDeltaModel_ptr);
    1275           0 :   Lattice<Float> &step  = *(cemem_ptr->itsStep_ptr);
    1276           0 :   Lattice<Float> &resid = *(cemem_ptr->itsResidual_ptr);
    1277           0 :   Float alpha = cemem_ptr->itsAlpha;
    1278           0 :   Float beta = cemem_ptr->itsBeta;
    1279           0 :   Float aFit = cemem_ptr->itsAFit;
    1280             : 
    1281           0 :   Double gds = 0;
    1282             : 
    1283           0 :   if (cemem_ptr->itsMask_ptr) {
    1284           0 :     Lattice<Float> &mask = *(cemem_ptr->itsMask_ptr);
    1285             :  
    1286           0 :     if (cemem_ptr->itsPrior_ptr == 0) {
    1287           0 :       Float defLev = cemem_ptr->itsDefaultLevel;
    1288           0 :       gds = sum( mask * (step *
    1289           0 :                  (-tanh((model + delta - defLev)/aFit) + 2.0*alpha * resid -beta)))
    1290           0 :         .getDouble();
    1291             :     } else {
    1292           0 :       Lattice<Float> &prior = *(cemem_ptr->itsPrior_ptr);
    1293           0 :       gds = sum( mask * (step *
    1294           0 :                  (-tanh((model + delta - prior)/aFit) + 2.0*alpha * resid -beta)))
    1295           0 :         .getDouble();
    1296             :     }
    1297             :   }  else {  // no mask
    1298           0 :     if (cemem_ptr->itsPrior_ptr == 0) {
    1299           0 :       Float defLev = cemem_ptr->itsDefaultLevel;
    1300           0 :       gds = sum( step *
    1301           0 :                  (-tanh((model + delta - defLev)/aFit) + 2.0*alpha * resid -beta))
    1302           0 :         .getDouble();
    1303             :     } else {
    1304           0 :       Lattice<Float> &prior = *(cemem_ptr->itsPrior_ptr);
    1305           0 :       gds = sum( step *
    1306           0 :                  (-tanh((model + delta - prior)/aFit) + 2.0*alpha * resid -beta))
    1307           0 :         .getDouble();
    1308             :     }
    1309             :   }
    1310           0 :   return gds;
    1311             : };
    1312             : 
    1313             : 
    1314             : //----------------------------------------------------------------------
    1315           0 : void IncEntropyEmptiness::infoBanner(){
    1316           0 :   cemem_ptr->itsLog << 
    1317           0 :     " I   Flux     Fit    MaxResid    Gradient "  << LogIO::POST;
    1318           0 : };
    1319             : 
    1320             : //----------------------------------------------------------------------
    1321           0 : void IncEntropyEmptiness::infoPerIteration(uInt iteration){
    1322             : 
    1323           0 :   Lattice<Float> &resid = *(cemem_ptr->itsResidual_ptr);
    1324           0 :   Float maxResid = (max(abs(resid))).getFloat();
    1325             : 
    1326           0 :   cemem_ptr->itsLog << 
    1327             :     (iteration +1) << "  " <<
    1328           0 :     cemem_ptr->itsFlux << "  " <<
    1329           0 :     cemem_ptr->itsFit << "  " <<
    1330             :     maxResid << "  " <<
    1331           0 :     cemem_ptr->itsNormGrad << "  " <<
    1332           0 :     LogIO::POST;
    1333             : 
    1334           0 :   if (cemem_ptr->itsProgressPtr) {
    1335           0 :     Lattice<Float> &model = *(cemem_ptr->itsModel_ptr);
    1336             :     // Note:  posMaximumResidual is not valid! (  IPosition(4,0,0,0,0)  )
    1337           0 :     cemem_ptr->itsProgressPtr->
    1338           0 :       info(false, iteration, cemem_ptr->itsNumberIterations, model, resid, 
    1339           0 :            maxResid, IPosition(4,0,0,0,0),
    1340           0 :            cemem_ptr->itsFlux, cemem_ptr->itsFit, cemem_ptr->itsNormGrad,
    1341           0 :            cemem_ptr->itsEntropy);
    1342             :   }
    1343           0 : };
    1344             : 
    1345             : 
    1346             : //----------------------------------------------------------------------
    1347           0 : Float IncEntropyEmptiness::relaxMin()
    1348             : {
    1349             :   // hey, Maximum Emptiness ain't GOT no minimum!
    1350           0 :   Float requiredModelMin = -1e+20;
    1351           0 :   return requiredModelMin;
    1352             : };
    1353             : 
    1354             : 
    1355             : //----------------------------------------------------------------------
    1356           0 : Bool IncEntropyEmptiness::testConvergence()
    1357             : {
    1358             :   Bool converged;
    1359           0 :   converged = ( (cemem_ptr->itsFit < cemem_ptr->itsTolerance) &&
    1360           0 :                 (cemem_ptr->itsIteration != (cemem_ptr->itsFirstIteration)) &&
    1361           0 :                 (cemem_ptr->itsNormGrad < (cemem_ptr->itsTolerance)) );
    1362           0 :   if (cemem_ptr->itsUseFluxConstraint) {
    1363           0 :     converged = (converged && 
    1364           0 :                  (abs(cemem_ptr->itsFlux - cemem_ptr->itsTargetFlux) 
    1365           0 :                     < cemem_ptr->itsTolerance*cemem_ptr->itsTargetFlux));
    1366             :   }
    1367             : 
    1368           0 :   return converged;
    1369             : 
    1370             : };
    1371             : 
    1372             : 
    1373             : 
    1374             : } //# NAMESPACE CASA - END
    1375             : 

Generated by: LCOV version 1.16