⚉

The linear assignment problem

LAP-JV

import greenlet from "npm:greenlet";
import {queue} from "../components/queue.js";
const lapjv = import.meta.resolve("../components/lap-jv.js");

const solve = queue((data) =>
  greenlet(async (data, lapjv) => {
    const {lap} = await import(lapjv);
    const n = data.length;
    const m = Math.ceil(Math.sqrt(n));
    const costs = data.map((d) =>
      data.map((_, k) => {
        const i = k % m;
        const j = (k - i) / m;
        const dx = d[0] - i - 0.5;
        const dy = d[1] - j - 0.5;
        return dx * dx + dy * dy;
      })
    );
    const t = performance.now();
    const {row} = lap(n, costs);
    console.warn("lap", n, performance.now() - t);
    return row;
  })(data, lapjv));

We’re using greenlet and a queue to make computations happen in the background with a web worker.