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) + "→" + 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()
}