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
@@ -126,6 +126,9 @@ struct Context {
|
||||
XrayRowModel rows;
|
||||
std::vector<std::complex<float>> fcalc, fmask;
|
||||
double k_sol = 0, b_sol = 0;
|
||||
// where the last Refit()'s solvent grid ended (before MoveOverallB()): the next one's fine pass is around it
|
||||
// (negative: the next one searches the whole box)
|
||||
double grid_k_sol = -1, grid_b_sol = -1;
|
||||
double k_overall = 0;
|
||||
gemmi::SMat33<double> b_star{0, 0, 0, 0, 0, 0};
|
||||
double b_floor = B_FLOOR; // the cycle's lowest allowed B
|
||||
@@ -189,8 +192,9 @@ struct Context {
|
||||
double k_sol = 0, b_sol = 0, k_overall = 0;
|
||||
gemmi::SMat33<double> b_star{0, 0, 0, 0, 0, 0};
|
||||
XrayRowModel rows;
|
||||
double grid_k_sol = -1, grid_b_sol = -1;
|
||||
};
|
||||
Fit Fitted() const { return {b_floor, k_sol, b_sol, k_overall, b_star, rows}; }
|
||||
Fit Fitted() const { return {b_floor, k_sol, b_sol, k_overall, b_star, rows, grid_k_sol, grid_b_sol}; }
|
||||
// Refit() as it was where `fit` was taken, for the atoms as they were there.
|
||||
void Restore(const Fit &fit) {
|
||||
b_floor = fit.b_floor;
|
||||
@@ -200,8 +204,15 @@ struct Context {
|
||||
k_overall = fit.k_overall;
|
||||
b_star = fit.b_star;
|
||||
rows = fit.rows;
|
||||
grid_k_sol = fit.grid_k_sol;
|
||||
grid_b_sol = fit.grid_b_sol;
|
||||
engine->SetRowModel(rows);
|
||||
}
|
||||
// The next Refit() from nothing an earlier one found: the whole solvent box, the likelihood from the moments.
|
||||
void ForgetStarts() {
|
||||
grid_k_sol = grid_b_sol = -1;
|
||||
rows.bin_d.clear();
|
||||
}
|
||||
|
||||
// A new macro-cycle: the blur for the B the cycle may reach, the bulk-solvent mask of the model as it is,
|
||||
// the scale and the solvent fitted to the working set, and the likelihood's parameters from the free set.
|
||||
@@ -244,13 +255,14 @@ struct Context {
|
||||
// the scale of the score: by robust least squares (ModelScaleBox::robust)
|
||||
#ifdef JFJOCH_USE_CUDA
|
||||
if (scale_gpu)
|
||||
scale_gpu->Fit(scaling, SolventBMax(Model()), nthreads, true);
|
||||
scale_gpu->Fit(scaling, SolventBMax(Model()), nthreads, true, grid_k_sol, grid_b_sol);
|
||||
else
|
||||
#endif
|
||||
FitModelScale(scaling, {.b_hi = SolventBMax(Model()), .robust = true}, nthreads);
|
||||
FitModelScale(scaling, {.b_hi = SolventBMax(Model()), .robust = true, .k_start = grid_k_sol,
|
||||
.b_start = grid_b_sol}, nthreads);
|
||||
s3.reset();
|
||||
k_sol = scaling.k_sol;
|
||||
b_sol = scaling.b_sol;
|
||||
k_sol = grid_k_sol = scaling.k_sol;
|
||||
b_sol = grid_b_sol = scaling.b_sol;
|
||||
k_overall = scaling.k_overall;
|
||||
b_star = scaling.b_star;
|
||||
rows.k_total.resize(refl.Size());
|
||||
@@ -1053,9 +1065,9 @@ TrialOutcome RunTrial(TrialSlot slot, const std::vector<int> &refinable, const s
|
||||
if (cycle == 0 && fit != nullptr)
|
||||
ctx.Restore(*fit);
|
||||
else {
|
||||
// a trial's likelihood fit starts from nothing the slot's previous trial left
|
||||
// a trial starts from nothing the slot's previous trial left
|
||||
if (cycle == 0)
|
||||
ctx.rows.bin_d.clear();
|
||||
ctx.ForgetStarts();
|
||||
ctx.Refit();
|
||||
}
|
||||
if (adp_w > 0)
|
||||
|
||||
Reference in new issue
Block a user