Refinement: a Refit's solvent grid starts around where the context's last one ended
Logic change (deterministic), kept on evidence. Every Refit searched the whole k_sol/b_sol box - an 88-point coarse pass of plain least squares, then the robust fine pass around its winner. ModelScaleBox (and ModelScaleGPUPool::Fit / ModelScaleGPU::FitSolvent) take an optional start; with one, the coarse pass is skipped and the fine pass is laid around it. Refinement passes the grid winner of the context's previous Refit (before MoveOverallB moves the overall B into b_sol); it travels with a trial's fit, and a trial's first Refit without one (Context::ForgetStarts, which also clears the likelihood's D start) searches the whole box, so a trial still depends on nothing its slot ran before (side by side = one at a time, md5). Evidence (GPU, -N 8): full refinement of the 14 parity sets from their placed models - 12 refined CIFs identical (md5), 9ig7 and 6iu9 differ, final R-work/R-free equal to 4 digits but 6iu9 R-work 0.2911 -> 0.2910; of the 5 timing cases 4 identical, 7d98 (cif start) R-free 0.3096 -> 0.3095; 5f6m MD starts 01-04 median R-free 0.1692 -> 0.1692; 6o2h on the CPU engine identical (md5). The score-only parity table is not touched (one Refit, no start). refit.scale (TIMING sum): 5f6m 1.52 -> 1.10 s. Wall: 5reo 1.68 -> 1.53, 5f6m 2.43 -> 2.24, 9yl4 7.19 -> 7.02, 7d98 3.70 -> 3.65, 5f6m MD start 4.57 -> 4.22 s. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015CeEGgpKdfkCTJb3YNMJcu (cherry picked from commit ff285fb525ecf4b480698d4aafe212a34301a8fe)
This commit is contained in:
1 parent
1f1aa18b67
commit
1f8b5b1986
5 files changed
+53
-25
No files matched your search
@@ -597,7 +597,8 @@ ModelScaleParams ModelScaleGPU::Fit(const float2 *d_fcmol, const float2 *d_fmask
|
||||
// FitModelScale's grid (ModelScaling.cpp, default ModelScaleBox with b_sol up to b_hi): a coarse pass
|
||||
// over the box and a finer one around its winner, every grid point its own fit, the winner the lowest
|
||||
// finite R in grid order. The fits of a pass run together, one launch per Levenberg-Marquardt step.
|
||||
ModelSolventFit ModelScaleGPU::FitSolvent(const float2 *d_fcmol, const float2 *d_fmask, double b_hi, bool robust) {
|
||||
ModelSolventFit ModelScaleGPU::FitSolvent(const float2 *d_fcmol, const float2 *d_fmask, double b_hi, bool robust,
|
||||
double k_start, double b_start) {
|
||||
ModelSolventFit out;
|
||||
if (n_ < 20)
|
||||
return out;
|
||||
@@ -631,12 +632,16 @@ ModelSolventFit ModelScaleGPU::FitSolvent(const float2 *d_fcmol, const float2 *d
|
||||
return ModelScaleFitState{1.0, {0, 0, 0, 0, 0, 0}, ks, bs, 0, 0};
|
||||
};
|
||||
|
||||
std::vector<ModelScaleFitState> coarse;
|
||||
for (double ks = k_lo; ks <= k_hi + 1e-9; ks += 0.05)
|
||||
for (double bs = b_lo; bs <= b_hi + 1e-9; bs += b_step)
|
||||
coarse.push_back(point(ks, bs));
|
||||
try_points(coarse, false);
|
||||
const double k0 = out.k_sol, b0 = out.b_sol;
|
||||
double k0 = k_start, b0 = b_start;
|
||||
if (k0 < 0) {
|
||||
std::vector<ModelScaleFitState> coarse;
|
||||
for (double ks = k_lo; ks <= k_hi + 1e-9; ks += 0.05)
|
||||
for (double bs = b_lo; bs <= b_hi + 1e-9; bs += b_step)
|
||||
coarse.push_back(point(ks, bs));
|
||||
try_points(coarse, false);
|
||||
k0 = out.k_sol;
|
||||
b0 = out.b_sol;
|
||||
}
|
||||
const double k_hi2 = std::min(k_hi, k0 + 0.05);
|
||||
const double b_hi2 = std::min(b_hi, b0 + b_step);
|
||||
std::vector<ModelScaleFitState> fine;
|
||||
|
||||
Reference in new issue
Block a user