Home Manual Reference Source

src/forwardStep.js

import assert from 'assert';

/**
 * Diagonal forward step.
 *
 * @param {{[x: number]: number}} V
 * @param {number} cMin
 * @param {number} cMax
 * @param {number} cpD
 */
export default function forwardStep(V, cMin, cMax, cpD) {
	assert(cMin < cMax);
	// Assert(ri < rj && li < lj);
	// assert(LB <= UB);
	// assert(LB !== D);
	// assert(UB !== -D);

	// const yp = V[cMin + 1];
	// assert(LB === -D || V[cMin - 1] < V[cMin + 1]); // LB === -D || xp < yp
	// const x = yp;
	// Const y = x - (k + Delta);

	// assert(x <= lj); // Always true
	// Assert(y <= rj); // False sometimes
	// assert(x >= li); // Always true
	// assert(y >= ri); // Always true
	V[cMin] = V[(cMin + 1) | 0];

	for (let c = (cMin + 2) | 0; c < cMax; c = (c + 2) | 0) {
		// Assert(c - center !== -D && c - center !== D);

		// Assert(x <= lj); // False sometimes
		// assert(y <= rj); // False sometimes
		// assert(x >= li); // Always true
		// assert(y >= ri); // Always true
		V[c] = Math.max(V[(c + 1) | 0], (V[(c - 1) | 0] + 1) | 0);
	}

	// Assert(UB !== LB);

	// Assert(x <= lj); // False sometimes
	// assert(y <= rj); // Always true
	// assert(x >= li); // Always true
	// assert(y >= ri); // Always true
	V[cMax] =
		cMax === cpD
			? (V[(cMax - 1) | 0] + 1) | 0
			: Math.max(V[(cMax + 1) | 0], (V[(cMax - 1) | 0] + 1) | 0);
}