0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031 function isOk=checkGradFun(obj,funCheck,funName)
0032
0033 isOk=true;
0034 if nargin<3;funName='';end
0035
0036 lim=1e-5;
0037
0038 XminSpace=obj.xMin;
0039 XmaxSpace=obj.xMax;
0040
0041 if exist('lhsdesign','file')
0042 Xsample=lhsdesign(obj.nSCheck,obj.dim);
0043 else
0044 Xsample=rand(obj.nSCheck,obj.dim);
0045 end
0046
0047 Xsample=Xsample.*repmat(XmaxSpace-XminSpace,obj.nSCheck,1)+repmat(XminSpace,obj.nSCheck,1);
0048
0049 [~,~,GZactual]=funCheck(Xsample);
0050
0051 if exist('gradFD','class')
0052 FDclass=gradFD(obj.FDtype,Xsample,obj.FDstep,funCheck);
0053 GZapprox=FDclass.GZeval;
0054
0055 diffG=abs((GZactual-GZapprox)./GZactual);
0056 diffGB=abs((GZactual-GZapprox)./(1+abs(GZactual)));
0057
0058 diffGtest=diffG(~isinf(diffG));
0059
0060 critCheckA=(any(diffGtest(:)>lim)...
0061 ||any(diffGB(:)>lim))...
0062 &&obj.paranoidCheck;
0063 critCheckB=(sum(diffGtest(:)>lim)>floor(numel(diffGtest(:))/3)...
0064 ||sum(diffGB(:)>lim)>floor(numel(diffGB(:))/3))...
0065 &&~obj.paranoidCheck;
0066 if critCheckA||critCheckB
0067 Ofprintf('Issue with the gradients of the %s function\n',funName);
0068 isOk=false;
0069 end
0070 if any(diffGtest(:)>lim)||any(diffGB(:)>lim)||obj.forceDisplayGrad
0071 Ofprintf(' >> %s function\n',funName);
0072 Ofprintf('Exact\n');
0073 for it=1:obj.nSCheck
0074 Ofprintf('%+7.3e ',GZactual(it,:));
0075 fprintf('\n');
0076 end
0077 fprintf('\n');
0078 Ofprintf('Finite Difference (%s, %7.3e)\n',obj.FDtype,obj.FDstep);
0079 for it=1:obj.nSCheck
0080 Ofprintf('%+7.3e ',GZapprox(it,:));
0081 fprintf('\n');
0082 end
0083 fprintf('\n');
0084 Ofprintf('Difference\n');
0085 for it=1:obj.nSCheck
0086 Ofprintf('%+7.3e ',diffG(it,:));
0087 fprintf('\n');
0088 end
0089 fprintf('\n');
0090 Ofprintf('DifferenceB\n');
0091 for it=1:obj.nSCheck
0092 Ofprintf('%+7.3e ',diffGB(it,:));
0093 fprintf('\n');
0094 end
0095 fprintf('\n');
0096 Ofprintf('Checking points\n');
0097 for it=1:obj.nSCheck
0098 Ofprintf('%+7.3e ',Xsample(it,:));
0099 fprintf('\n');
0100 end
0101 end
0102 else
0103 Ofprintf(' Unable to check the gradients because the class gradFD is not available\n');
0104 end
0105 end