MCPcopy Create free account
hub / github.com/WinVector/Logistic / maximizeStep

Method maximizeStep

src/com/winvector/opt/impl/Newton.java:94–162  ·  view source on GitHub ↗
(final VectorFn f, final double[] x0,
			final VEval cachedEval,
			final boolean wantGrad, final boolean wantHessian)

Source from the content-addressed store, hash-verified

92
93
94 public VEval maximizeStep(final VectorFn f, final double[] x0,
95 final VEval cachedEval,
96 final boolean wantGrad, final boolean wantHessian) {
97 log.info("start Newton step: " + ((cachedEval!=null)?""+cachedEval.fx:""));
98 final VEval[] bestEval = new VEval[1]; // vector so gradient polish can alter value
99 final int dim = f.dim();
100 if(cachedEval!=null && cachedEval.gx!=null && cachedEval.hx!=null) {
101 bestEval[0] = cachedEval;
102 } else {
103 if(null==x0) {
104 bestEval[0] = f.eval(new double[dim],true,true);
105 } else {
106 bestEval[0] = f.eval(x0,true,true);
107 }
108 }
109 log.info("initial Newton v: " + bestEval[0].fx);
110 final double lastRecord = bestEval[0].fx;
111 final NewtonReturn nr = newtonStep(dim,bestEval[0]);
112 if(nr.newX!=null) {
113 final VEval newEval = f.eval(nr.newX,wantGrad,wantHessian);
114 if(newEval.fx>lastRecord) {
115 bestEval[0] = newEval;
116 } else {
117 // probe more before giving up
118 double lambda = 0.5;
119 double[] trial = new double[dim];
120 while(true) {
121 boolean didPosProbe = false;
122 {
123 double maxDiff = 0.0;
124 for(int i=0;i<dim;++i) {
125 final double nxi = (1-lambda)*x0[i] + lambda*(newEval.x[i]);
126 trial[i] = Math.min(boxBound,Math.max(-boxBound,nxi));
127 maxDiff = Math.max(maxDiff,Math.abs(trial[i]-x0[i]));
128 }
129 if(maxDiff>relImprovementTarget) {
130 didPosProbe = true;
131 final VEval cEval = f.eval(trial,false,false);
132 if(cEval.fx>lastRecord) {
133 bestEval[0] = cEval;
134 break;
135 }
136 }
137 }
138 {
139 double maxDiff = 0.0;
140 for(int i=0;i<dim;++i) {
141 final double nxi = (1-lambda)*x0[i] - lambda*(newEval.x[i]);
142 trial[i] = Math.min(boxBound,Math.max(-boxBound,nxi));
143 maxDiff = Math.max(maxDiff,Math.abs(trial[i]-x0[i]));
144 }
145 if(maxDiff>relImprovementTarget) {
146 final VEval cEval = f.eval(trial,false,false);
147 if(cEval.fx>lastRecord) {
148 bestEval[0] = cEval;
149 break;
150 }
151 }

Callers 1

maximizeMethod · 0.95

Calls 3

newtonStepMethod · 0.95
dimMethod · 0.65
evalMethod · 0.65

Tested by

no test coverage detected