// posetlib.js v2 - exact poset toolkit: complete labeled generator + fast exact pair probabilities function transitiveClosure(n, relIn){var r=relIn.slice();for(var k=0;k>k)&1)r[u]|=r[k];return r;} function predecessorsMask(n, rel){var p=new Array(n).fill(0);for(var u=0;u>j)|(rel[j]>>i))&1))return false;return true;} function linExtCount(n, rel){var pred=predecessorsMask(n,rel);var size=1<bn*E){bn=m;bd=E;bp=[x,y];}}return{num:bn,den:bd,pair:bp,nPairs:cnt,E:E};} function deltaFast(n, rel){var t=tablesE(n,rel);var pn=pairNums(n,rel,t);return deltaFromNums(n,pn.nums,pn.E);} // brute-force reference: per-pair forced DP function deltaBrute(n, rel){var E=linExtCount(n,rel);var bn=-1,bd=1,bp=[-1,-1]; for(var x=0;x>x)&1)Eyx=null;else if((rel[x]>>y)&1)Eyx=0;else{var r=rel.slice();r[y]|=(1<bn*E){bn=m;bd=E;bp=[x,y];}}return{num:bn,den:bd,pair:bp};} // complete labeled poset generator: assign each old element as below/incomparable/above the new one function genAllLabeledPosets(n, visit){ if(n===1){visit([0]);return;} function rec(k, rel, D, U, una){ if(una===0){var chk=D,dok=true;while(chk&&dok){var cx=31-Math.clz32(chk&-chk);chk&=chk-1;var cu=U;while(cu){var cy=31-Math.clz32(cu&-cu);cu&=cu-1;if(!((rel[cx]>>cy)&1)){dok=false;break;}}}if(!dok)return;var r2=rel.slice();var d=D;while(d){var xx=31-Math.clz32(d&-d);r2[xx]|=(1<>v)|(rel[v]>>u))&1);}for(var a=0;a>b)&1)for(var c=0;c>d)&1){if(a===c&&b===d)continue;if(inc(a,c)&&inc(a,d)&&inc(b,c)&&inc(b,d))return false;}return true;} function coverEdges(n, rel){var e=[];for(var u=0;u>w)&1)&&((rel[w]>>v)&1)){between=true;break;}}if(!between)e.push([u,v]);}}return e;} function dualOf(n, rel){var r=new Array(n).fill(0);for(var u=0;u