js/j15workerWor3.js

    const loopLimit = 3e9
    let checkAliveVal = 0, worker;
    const cPl = 1e6, tPl = 1e3
    let jump, pa, done, neighbor, rot2, rot4, stop, cnt, cNx, cMi, cMa, cTva, cTop, cnL, tSt, tNx, fnd, rsp //, trc

    console.log('worker start ' + this)

    onmessage = (e) => {
      const d = e.data
      let m = "worker onmessage" + e 
      for (const n in d)
          m += ` ${n}: ${d[n]}`
      console.log(m)
      rsp = d
      rsp.typ = 'rsp'
      if (d.cat === 'loop')
        workerLo(d)
      else if (d.cat === 'hamilton')
        hamilton(d)
      else if (d.cat === 'hamilto2')
        hamilto2(d)
      else if (d.cat === 'hamilto32')
        hamilto32(d)
      else
        postMessage(d);
    };

    function fail(m) {
      rsp.txt = 'fail: ' + m
      postMessage(rsp);
      throw new Error(rsp.txt)
    }
    function workerLo(d) {
      const st = Date.now();
      var nx = st + 1000, iN = 1e8
   
      for (var i=0; i<loopLimit; i++) {
        if ( i > iN ) {
          iN += 1e8
          if (Date.now() >= nx ) {
              d.txt = 'looping at ' + i.toExponential(2) + ' ela ' + (Date.now() - st) / 1000
              nx = Date.now()+1000
              postMessage(d);
          }
        } 
      }
      d.txt = 'loop after >ll ' + i.toExponential(2) + ' ela ' + (Date.now() - st) / 1000;;
      postMessage(d);
   }

  function i2a(i) {
    return 'ABCDEFGH'[Math.trunc(i/8)] + '12345678'[i % 8]
  }

  function msg(m1) {
    var m = m1 + ' ' + pa.length + ", top " + cTva + '*' + cTop + ", ela " + ((Date.now() - tSt) / 1000).toFixed(2) + ", fnd " + fnd.toExponential(2)+  ", cnt " + cnt.toExponential(2)
                   + ", min " + cMi + ", max " + cMa + (cnL === undefined ? '' : (', cnL ' + cnL))
    rsp.txt = m
    postMessage(rsp)
    cMa = -1
    cMi = 999
  }

  function haJump(d) {
    jump = []
    for (let i=0; i < 8; i++) 
      for (let j=0; j < 8; j++) {
          let gg = [], k = 8*i+j
          if (i < 7 && j < 6) gg.push(k+10)
          if (i < 6 && j < 7) gg.push(k+17)
          if (i < 7 && j > 1) gg.push(k+6)
          if (i < 6 && j > 0) gg.push(k+15)
          if (i > 0 && j < 6) gg.push(k-6)
          if (i > 1 && j < 7) gg.push(k-15)
          if (i > 0 && j > 1) gg.push(k-10)
          if (i > 1 && j > 0) gg.push(k-17)
          jump[i * 8 + j] = gg
      }
    let o = "<li> jump <ul>"
    for (let i=0; i < 64; i++) 
      o += (i%8===0 ? "<li>" : ", ") + i2a(i) + "&rarr;" + jump[i].map(i2a) + (i%8===7 ? "</li>" : "")
    rsp.txt = o + "</li>"
    postMessage(rsp)
  }

  function hamilton(d) {
    rsp = d
    cNx = cPl + (cnt = 0)
    tNx = tPl + (tSt = Date.now())
    cMi = 999 
    cMa = -1
    cTva = -1
    fnd = 0
    haJump()
    neighbor = []
    for (let i=0; i < 64; i++) {
        let n = 0n
        for (const t of jump[i])
            n |= 1n << BigInt(t)
        neighbor[i] = n
    }

    pa = [0,10]
    done = 1n | (1n<<10n)
    h1();
 }

  function h1() {
    const le = pa.length

    if (le >= 64) {
      msg('done')
      throw new Error('done')
    }

    if (++cnt >= cNx) {
        cNx += 1e6
        if (Date.now() > tNx) {
          tNx = Date.now() + tPl
          msg('progress')
        }
    }

    cMi = Math.min(cMi, le)
    cMa = Math.max(cMa, le)
    if (le >= cTva) {
      if (le === cTva) {
        cTop++
      } else {
        cTop = 1
        cTva = le
      }
    }

    for (const t of jump[pa[le-1]]) {
      const tM = 1n<<BigInt(t)
      if ((done & tM) === 0n) {
        done |= tM
        let hasIso = false
        for (const tE of jump[t]) {
          if (((done & (1n<<BigInt(tE))) === 0n)
                && ((done & neighbor[tE]) === neighbor[tE])) {
            hasIso = true
            break
          }
        }
        if (! hasIso) {
          pa[le] = t
          h1()
        }
        done ^= tM
      }
    }
    if (pa.length > le)
      pa.pop()
  }

  function hamilto32(d) {
    rsp = d
    // trc = 'trace32 <ul><li>'
    fnd = cnt = 0
    cNx = cPl 
    tNx = tPl + (tSt = Date.now())
    cMi = 999 
    cMa = -1
    cTva = -1
    haJump()
    rot2 = []
    let o = 'rot2 <ul><li>'
    for (let i=0; i < 8; i++) {
      o += '<li>'
      for (let j=0; j < 8; j++) {
        rot2[i*8 + j] = 1n<<BigInt(i*8 + j) | 1n<<BigInt((7-i)*8 + 7-j) 
        o += i2a(i*8+j) + '>'
        for (let k=0; k < 64; k++) 
          if ((rot2[i*8 + j] & 1n<<BigInt(k)) !== 0n)
             o+= i2a(k) + ' '
      }
      o += '</li>'
    }
    rsp.txt = o + "</ul>"
    postMessage(rsp)
    stop = 1<<(63-46) | 1<<(63-53) 
    cnL = [1,1,0,0,0,0,0,0,0,0]
    pa = [0,10]
    done = 1 | (1<<10)
    h32();
    msg('end of hamilto2')
  }

  function h32() {
    const le = pa.length

    if (++cnt >= cNx) {
        cNx += 1e6
        if (Date.now() > tNx) {
          tNx = Date.now() + tPl
          msg('progress')
        }
    }

    cMi = Math.min(cMi, le)
    cMa = Math.max(cMa, le)
    if (le < 10)
        cnL[le]++
    if (le >= cTva) {
      if (le === cTva) {
        cTop++
      } else {
        cTop = 1
        cTva = le
      }
    }

    // trc += (cnt % 10 === 0 ? '</li><li>' : ', ') + cnt +'#' + le + '#' + i2a(pa[le-1])
    for (const t of jump[pa[le-1]]) {
      const tM = 1<<(t<32 ? t : 63-t)
 //     if (cnt === 16)
   //     trc+= ' ***{ t ' + t + ' ' + i2a(t) + ', tM ' + tM.toString(16)+ ', done ' + done.toString(16) + ', d&tM ' + (done & tM).toString(16) + ', === ' + ((done & tM) === 0) + '}*** '
      if ((done & tM) === 0) {
        done |= tM
        pa[le] = t
     //   if (cnt === 16)
     //     trc+= ' ***[t ' + t + ' ' + i2a(t) + ', stop ' + stop.toString(16)+ ', done ' + done.toString(16) + ', s&d ' + (stop & done).toString(16) + ', !== ' + ((stop & done) !== stop ) + ', le ' + le + ']*** '
        if ((stop & done) !== stop ) {
          h32()
        } else if (le === 31 && (t === 46 || t === 53)) {
          fnd++
          /*
          let cb = []
          for (let i=0; i < 32; i++) {
            cb[pa[i]] = i
            cb[63-pa[i]] = i+ 32
          } 
          let m = 'done ' + pa.map(i2a) + '<table border=2 rules=all cellpadding="10%">'
          for (let i=0; i < 8; i++) {
            m += '<tr>'
            for (let j=0; j < 8; j++) 
              m+= '<td>' + cb[8*i+j]+ '</td>'
            m += '</tr>'
          }
          m += '</table>' // + trc + '</li></ul>'
          msg(m)
          throw new Error(m)
          */
        }  
        done ^= tM
      }
    }
    if (pa.length > le)
      pa.pop()
  }

  function paTo4() {
    if (pa.length !== 32)
        fail('path length not 32 ' + pa)
    if (pa[31] !== 32)
         fail('path[31] length not 32 ' + pa)
   
  }
  function hamilto2(d) {
  //  trc = 'trace2x <ul><li>'
    rsp = d
    cNx = cPl + (cnt = 0)
    tNx = tPl + (tSt = Date.now())
    cMi = 999 
    cMa = -1
    cTva = -1
    haJump()
    rot2 = []
    let o = 'rot2 <ul>'
    for (let i=0; i < 8; i++) {
      o += '<li>'
      for (let j=0; j < 8; j++) {
        rot2[i*8 + j] = 1n<<BigInt(i*8 + j) | 1n<<BigInt((7-i)*8 + 7-j) 
        o += i2a(i*8+j) + '>'
        for (let k=0; k < 64; k++) 
          if ((rot2[i*8 + j] & 1n<<BigInt(k)) !== 0n)
             o+= i2a(k) + ' '
      }
      o += '</li>'
    }
    rsp.txt = o + "</ul>"
  //  trc = o + trc
    postMessage(rsp)
    stop = 1n<<BigInt(46) | 1n<<BigInt(53) 
    cnL = [1,1,0,0,0,0,0,0,0,0]
    pa = [0,10]
    done = rot2[0] | rot2[10]
    h2();
    msg('end of hamilto2')
  }

  function h2() {
    const le = pa.length

    if (++cnt >= cNx) {
        cNx += 1e6
        if (Date.now() > tNx) {
          tNx = Date.now() + tPl
          msg('progress')
        }
    }

    cMi = Math.min(cMi, le)
    cMa = Math.max(cMa, le)
    if (le < 10)
        cnL[le]++
    if (le >= cTva) {
      if (le === cTva) {
        cTop++
      } else {
        cTop = 1
        cTva = le
      }
    }
    /* trc += (cnt % 10 === 0 ? '</li><li>' : ', ') + cnt +'#' + le + '#' + i2a(pa[le-1])
    if (cnt > 200) {
        msg(trc)
        exit
    } */
    for (const t of jump[pa[le-1]]) {
      const tM = rot2[t]
        //if (cnt === 16)
        //    trc+= ' ***{ t ' + t + ' ' + i2a(t) + ', tM ' + tM.toString(16)+ ', done ' + done.toString(16) + ', d&tM ' + (done & tM).toString(16) + ', === ' + ((done & tM) === 0n) + '}*** '
      if ((done & tM) === 0n) {
        done |= tM
        pa[le] = t
            // if (cnt === 16)
            // trc+= ' ***[t ' + t + ' ' + i2a(t) + ', stop ' + stop.toString(16)+ ', done ' + done.toString(16) + ', s&d ' + (stop & done).toString(16) + ', !== ' + ((stop & done) !== stop ) + ', le ' + le + ']*** '
        if ((stop & done) !== stop ) {
          h2()
        } else if (le === 31 && (t === 46 || t === 53)) {
          let m = 'done ' + pa.map(i2a) +': ' 
          msg(m)
          throw new Error(m)
        }  
        done ^= tM
      }
    }
    if (pa.length > le)
      pa.pop()
  }

  function hamilto4(d) {
    rsp = d
    cNx = cPl + (cnt = 0)
    tNx = tPl + (tSt = Date.now())
    cMi = 999 
    cMa = -1
    cTva = -1
    haJump()
    rot4 = []
    let o = 'rot4 <ul>'
    for (let i=0; i < 8; i++) {
      o += '<li>'
      for (let j=0; j < 8; j++) {
        rot4[i*8 + j] = 1n<<BigInt(i*8 + j) | 1n<<BigInt((7-j)*8 + i) | 1n<<BigInt((7-i)*8 + 7-j) | 1n<<BigInt(j*8 + 7-i) 
        o += i2a(i*8+j) + '>'
        for (let k=0; k < 64; k++) 
          if ((rot4[i*8 + j] & 1n<<BigInt(k)) !== 0n)
             o+= i2a(k) + ' '
      }
      o += '</li>'
    }
    rsp.txt = o + "</ul>"
    postMessage(rsp)

    pa = [0,10]
    done = 1n | (1n<<10n)
    h4();
  }

  function h4() {
    const le = pa.length

    if (le >= 16) {
      let m = 'done ' + pa.map(i2a) +': ' 
      msg(m)
      throw new Error(m)
    }

    if (++cnt >= cNx) {
        cNx += 1e6
        if (Date.now() > tNx) {
          tNx = Date.now() + tPl
          msg('progress')
        }
    }

    cMi = Math.min(cMi, le)
    cMa = Math.max(cMa, le)
    if (le >= cTva) {
      if (le === cTva) {
        cTop++
      } else {
        cTop = 1
        cTva = le
      }
    }

    for (const t of jump[pa[le-1]]) {
      const tM = rot4[t]
      if ((done & tM) === 0n) {
        done |= tM
        pa[le] = t
        h4()
        done ^= tM
      }
    }
    if (pa.length > le)
      pa.pop()
  }