diff --git a/blog/about.md b/blog/about.md index e7ec1b3..ce5f4cc 100644 --- a/blog/about.md +++ b/blog/about.md @@ -44,6 +44,10 @@ Friend me on [Project Euler](https://projecteuler.net/friends)! My code is `1997 * Bench press: 90kg (3RM). * Nigh-omniscient knowledge of and concern for English grammar. +## Browser tabs + + + ::: buttons ::: diff --git a/experiments/free-will/app.css b/experiments/free-will/app.css new file mode 100644 index 0000000..1c110d2 --- /dev/null +++ b/experiments/free-will/app.css @@ -0,0 +1 @@ +.buttons.svelte-e31mm4.svelte-e31mm4{display:flex}.buttons.svelte-e31mm4 button.svelte-e31mm4{border:1px solid black;border-radius:0;padding:.2em;font-size:1.2em;flex-grow:1;margin-left:-1px}#app.svelte-e31mm4.svelte-e31mm4{min-height:20em}table.svelte-e31mm4.svelte-e31mm4{border-collapse:collapse}table.svelte-e31mm4 td.svelte-e31mm4{width:1rem;height:1rem;text-align:center}table.svelte-e31mm4 td.s1.svelte-e31mm4{background:#000;color:#fff}table.svelte-e31mm4 td.s0.svelte-e31mm4{background:#fff;color:#000}table.svelte-e31mm4 td.label.svelte-e31mm4{text-align:right;padding-right:.5em;white-space:nowrap}table.accuracy.svelte-e31mm4.svelte-e31mm4{margin-top:1em}table.accuracy.svelte-e31mm4 th.svelte-e31mm4,table.accuracy.svelte-e31mm4 td.svelte-e31mm4{width:auto;height:auto;padding:.15em .75em;text-align:left}table.accuracy.svelte-e31mm4 th.svelte-e31mm4{border-bottom:1px solid black} diff --git a/experiments/free-will/app.js b/experiments/free-will/app.js new file mode 100644 index 0000000..63e0192 --- /dev/null +++ b/experiments/free-will/app.js @@ -0,0 +1 @@ +(()=>{function I(){}function _t(t){return t()}function st(){return Object.create(null)}function L(t){t.forEach(_t)}function lt(t){return typeof t=="function"}function Ft(t,e){return t!=t?e==e:t!==e||t&&typeof t=="object"||typeof t=="function"}function Et(t){return Object.keys(t).length===0}function Z(t){return t??""}var ht=typeof window<"u"?window:typeof globalThis<"u"?globalThis:global;var ct=class t{_listeners="WeakMap"in ht?new WeakMap:void 0;_observer=void 0;options;constructor(e){this.options=e}observe(e,n){return this._listeners.set(e,n),this._getObserver().observe(e,this.options),()=>{this._listeners.delete(e),this._observer.unobserve(e)}}_getObserver(){return this._observer??(this._observer=new ResizeObserver(e=>{for(let n of e)t.entries.set(n.target,n),this._listeners.get(n.target)?.(n)}))}};ct.entries="WeakMap"in ht?new WeakMap:void 0;var Mt=!1;function St(){Mt=!0}function Nt(){Mt=!1}function u(t,e){t.appendChild(e)}function j(t,e,n){t.insertBefore(e,n||null)}function A(t){t.parentNode&&t.parentNode.removeChild(t)}function Y(t,e){for(let n=0;nt.removeEventListener(e,n,r)}function g(t,e,n){n==null?t.removeAttribute(e):t.getAttribute(e)!==n&&t.setAttribute(e,n)}function Ot(t){return Array.from(t.childNodes)}function U(t,e){e=""+e,t.data!==e&&(t.data=e)}function At(t){let e={};return t.childNodes.forEach(n=>{e[n.slot||"default"]=!0}),e}var K;function G(t){K=t}var X=[];var at=[],et=[],Tt=[],be=Promise.resolve(),gt=!1;function Dt(){gt||(gt=!0,be.then(ut))}function ot(t){et.push(t)}var mt=new Set,tt=0;function ut(){if(tt!==0)return;let t=K;do{try{for(;ttt.indexOf(r)===-1?e.push(r):n.push(r)),n.forEach(r=>r()),et=e}var $e=new Set;function ft(t,e){t&&t.i&&($e.delete(t),t.i(e))}function C(t){return t?.length!==void 0?t:Array.from(t)}var ve=["allowfullscreen","allowpaymentrequest","async","autofocus","autoplay","checked","controls","default","defer","disabled","formnovalidate","hidden","inert","ismap","loop","multiple","muted","nomodule","novalidate","open","playsinline","readonly","required","reversed","selected"],ke=new Set([...ve]);function Ee(t,e,n){let{fragment:r,after_update:o}=t.$$;r&&r.m(e,n),ot(()=>{let i=t.$$.on_mount.map(_t).filter(lt);t.$$.on_destroy?t.$$.on_destroy.push(...i):L(i),t.$$.on_mount=[]}),o.forEach(ot)}function Me(t,e){let n=t.$$;n.fragment!==null&&(Lt(n.after_update),L(n.on_destroy),n.fragment&&n.fragment.d(e),n.on_destroy=n.fragment=null,n.ctx=[])}function Se(t,e){t.$$.dirty[0]===-1&&(X.push(t),Dt(),t.$$.dirty.fill(0)),t.$$.dirty[e/31|0]|=1<{let F=D.length?D[0]:x;return a.ctx&&o(a.ctx[_],a.ctx[_]=F)&&(!a.skip_bound&&a.bound[_]&&a.bound[_](F),w&&Se(t,_)),x}):[],a.update(),w=!0,L(a.before_update),a.fragment=r?r(a.ctx):!1,e.target){if(e.hydrate){St();let _=Ot(e.target);a.fragment&&a.fragment.l(_),_.forEach(A)}else a.fragment&&a.fragment.c();e.intro&&ft(t.$$.fragment),Ee(t,e.target,e.anchor),Nt(),ut()}G(c)}var Ne;typeof HTMLElement=="function"&&(Ne=class extends HTMLElement{$$ctor;$$s;$$c;$$cn=!1;$$d={};$$r=!1;$$p_d={};$$l={};$$l_u=new Map;constructor(t,e,n){super(),this.$$ctor=t,this.$$s=e,n&&this.attachShadow({mode:"open"})}addEventListener(t,e,n){if(this.$$l[t]=this.$$l[t]||[],this.$$l[t].push(e),this.$$c){let r=this.$$c.$on(t,e);this.$$l_u.set(e,r)}super.addEventListener(t,e,n)}removeEventListener(t,e,n){if(super.removeEventListener(t,e,n),this.$$c){let r=this.$$l_u.get(e);r&&(r(),this.$$l_u.delete(e))}}async connectedCallback(){if(this.$$cn=!0,!this.$$c){let t=function(o){return()=>{let i;return{c:function(){i=h("slot"),o!=="default"&&g(i,"name",o)},m:function(c,a){j(c,i,a)},d:function(c){c&&A(i)}}}};if(await Promise.resolve(),!this.$$cn||this.$$c)return;let e={},n=At(this);for(let o of this.$$s)o in n&&(e[o]=[t(o)]);for(let o of this.attributes){let i=this.$$g_p(o.name);i in this.$$d||(this.$$d[i]=xt(i,o.value,this.$$p_d,"toProp"))}for(let o in this.$$p_d)!(o in this.$$d)&&this[o]!==void 0&&(this.$$d[o]=this[o],delete this[o]);this.$$c=new this.$$ctor({target:this.shadowRoot||this,props:{...this.$$d,$$slots:e,$$scope:{ctx:[]}}});let r=()=>{this.$$r=!0;for(let o in this.$$p_d)if(this.$$d[o]=this.$$c.$$.ctx[this.$$c.$$.props[o]],this.$$p_d[o].reflect){let i=xt(o,this.$$d[o],this.$$p_d,"toAttribute");i==null?this.removeAttribute(this.$$p_d[o].attribute||o):this.setAttribute(this.$$p_d[o].attribute||o,i)}this.$$r=!1};this.$$c.$$.after_update.push(r),r();for(let o in this.$$l)for(let i of this.$$l[o]){let s=this.$$c.$on(o,i);this.$$l_u.set(i,s)}this.$$l={}}}attributeChangedCallback(t,e,n){this.$$r||(t=this.$$g_p(t),this.$$d[t]=xt(t,n,this.$$p_d,"toProp"),this.$$c?.$set({[t]:this.$$d[t]}))}disconnectedCallback(){this.$$cn=!1,Promise.resolve().then(()=>{!this.$$cn&&this.$$c&&(this.$$c.$destroy(),this.$$c=void 0)})}$$g_p(t){return Object.keys(this.$$p_d).find(e=>this.$$p_d[e].attribute===t||!this.$$p_d[e].attribute&&e.toLowerCase()===t)||t}});function xt(t,e,n,r){let o=n[t]?.type;if(e=o==="Boolean"&&typeof e!="boolean"?e!=null:e,!r||!n[t])return e;if(r==="toAttribute")switch(o){case"Object":case"Array":return e==null?null:JSON.stringify(e);case"Boolean":return e?"":null;case"Number":return e??null;default:return e}else switch(o){case"Object":case"Array":return e&&JSON.parse(e);case"Boolean":return e;case"Number":return e!=null?+e:e;default:return e}}var it=class{$$=void 0;$$set=void 0;$destroy(){Me(this,1),this.$destroy=I}$on(e,n){if(!lt(n))return I;let r=this.$$.callbacks[e]||(this.$$.callbacks[e]=[]);return r.push(n),()=>{let o=r.indexOf(n);o!==-1&&r.splice(o,1)}}$set(e){this.$$set&&!Et(e)&&(this.$$.skip_bound=!0,this.$$set(e),this.$$.skip_bound=!1)}};var Rt="4";typeof window<"u"&&(window.__svelte||(window.__svelte={v:new Set})).v.add(Rt);var Oe=(t,e)=>new Array(t).fill(e),Ae=new FinalizationRegistry(t=>{wasm_bindings.dealloc_matrix(t)}),J=(t,e,n)=>{let r={m:t,n:e,data:wasm_bindings.alloc_matrix(t,e,n)};return Ae.register(r,r.data),r},B=t=>new Float32Array(wasm_bindings.memory.buffer,wasm_bindings.matrix_buffer(t.data),t.n*t.m),wt=t=>{let e=J(t.length,1,NaN);return B(e).set(t),e},vt=t=>e=>{let[n,r]=V(e),o=J(n,r,NaN),i=B(o),s=B(e);for(let d=0;d[t,e],bt=(t,e)=>{let[n,r]=V(t),[o,i]=V(e);if(r!==o)throw"actually, mathematics forbids this.";let s=J(n,i,NaN);return wasm_bindings.gemm(t.data,e.data,s.data),s},It=(t,e)=>{let n=bt(t,e);return n.backward=r=>{e.backward(bt(Bt(t),r)),t.backward(bt(r,Bt(e)))},n},pt=t=>(e,n)=>{let[r,o]=V(e),[i,s]=V(n);if(i!==r||s!==o)throw"no.";let d=J(r,o,0),c=B(d),a=B(e),w=B(n);for(let _=0;_(t.backward=n=>{let r=B(n),o=B(t);for(let i=0;i(t.backward=()=>{},t),Bt=t=>{let[e,n]=V(t),r=J(n,e,NaN);return wasm_bindings.transpose(t.data,r.data),r},Te=(t,e,n)=>{let[r,o]=V(e),[i,s]=V(n);if(i!==r||s!==o)throw"no.";let d=J(r,o,NaN);return t(e.data,n.data,d.data),d},De=(t,e)=>Te(wasm_bindings.hadamard,t,e),zt=(t,e)=>n=>{let r=vt(t)(n);return r.backward=o=>n.backward(De(o,vt(e)(n))),r},Le=(t,e)=>{let n=pt((r,o)=>r+o)(t,e);return n.backward=r=>{t.backward(r),e.backward(r)},n},Pt=t=>Math.min(Math.max(Math.log(t),-100),100),je=zt(Math.tanh,t=>1-Math.tanh(t)**2),$t=t=>1/(Math.exp(-t)+1),Re=zt($t,t=>$t(t)*(1-$t(t))),Ie=(t,e)=>{let n=pt((r,o)=>-o*Pt(r)+-(1-o)*Pt(1-r))(t,e);return n.backward=r=>{t.backward(pt((o,i)=>o*i)(r,pt((o,i)=>-i/o+-(i-1)/(1-o))(t,e)))},n},S=32,Be=.003,Wt=t=>vt(()=>Math.random()*2*t-t),Gt=(t={})=>{let e=t.learningRate??Be,n=Math.sqrt(6/(S+S)),r=Math.sqrt(6/(S+1)),o=Oe(3,null).map(s=>({weight:yt(Wt(n)(J(S,S,NaN)),e),bias:yt(J(S,1,0),e)})),i=yt(Wt(r)(J(1,S,NaN)),e);return{layers:o,outputProjection:i,learningRate:e}},Jt=(t,e)=>{let n=Ce(wt(t));for(let r of e.layers)n=Le(It(r.weight,n),r.bias),n=je(n);return n=It(e.outputProjection,n),n=Re(n),n};var Ht=(t,e)=>{let n=Jt(e,t);return B(n)[0]},qt=(t,e,n)=>{let r=Jt(e,t),o=B(r)[0];return isNaN(o)?!1:(Ie(r,wt([n])).backward(wt([1])),!0)},Vt=(t,e,n={})=>{let r=n.replaySteps??4,o=n.replayWindow??64,i=n.random??Math.random,s=!1;for(t.training_step??=0;t.training_step{if(!Number.isInteger(t)||t<1)throw new RangeError("order must be a positive integer");return{order:t,priorOnes:e.priorOnes??1,priorTotal:e.priorTotal??2,counts:new Map}},Ut=(t,e)=>e.slice(-t.order).join(""),Xt=(t,e)=>{if(e.length{if(e.length0&&le(t);return{c(){e=h("div"),n=h("div"),r=h("button"),r.textContent="\u2190 Left",o=E(),i=h("button"),i.textContent="\u2192 Right",s=E(),d=h("br"),c=E(),a=h("table");for(let f=0;fAaronson oracle concept. Optimal free will is ~50% on all predictors.',g(r,"class","svelte-e31mm4"),g(i,"class","svelte-e31mm4"),g(n,"class","buttons svelte-e31mm4"),g(x,"class","label svelte-e31mm4"),g(P,"class","label svelte-e31mm4"),g(a,"class","sequence svelte-e31mm4"),g(e,"id","app"),g(e,"tabindex","0"),g(e,"class","svelte-e31mm4")},m(f,z){j(f,e,z),u(e,n),u(n,r),u(n,o),u(n,i),u(e,s),u(e,d),u(e,c),u(e,a);for(let l=0;l0?N?N.p(f,z):(N=le(f),N.c(),N.m(e,q)):N&&(N.d(1),N=null)},i:I,o:I,d(f){f&&A(e),Y(m,f),Y(k,f),Y(M,f),N&&N.d(),t[11](null),$=!1,L(b)}}}var dt=100,We=20;function qe(t,e,n){let r=[1,2,3,4],o=["d","ArrowLeft","1"],i=["f","ArrowRight","0"],s=[],d=r.map(()=>[]),c=[],a,w=32,_=r.map(Zt),x=[],D=v=>{if(x.length===0)return .5;let $=[];for(let p of x)$.push(Math.min(1-1e-7,Math.max(1e-7,Ht(p,v.slice(-S)))));let b=$.map(p=>Math.log(p/(1-p))).reduce((p,m)=>p+m,0)/$.length;return 1/(1+Math.exp(-b))},F=v=>{for(_.forEach((p,m)=>{d[m].push(+(Xt(p,s)>=.5)),Qt(p,s,v)}),n(1,d),c.push(+(D(s)>=.5)),n(2,c),s.push(v),n(0,s);!(s.lengthVt(m,s));if(p.length===x.length)break;console.warn(`Replaced ${x.length-p.length} NN model(s) after a non-finite update`),x=p}if(window.models=x,!a)return;let $=a.querySelector("table td.val"),b=a.querySelector("table td.label");$&&n(4,w=Math.floor((a.getBoundingClientRect().width-b.getBoundingClientRect().width)/$.getBoundingClientRect().width))},O=v=>{let $=s.slice(-dt),b=v.slice(-dt);return $.filter((p,m)=>p===b[m]).length/$.length},P=v=>{o.includes(v.key)?F(1):i.includes(v.key)&&F(0)},R=()=>F(1),W=()=>F(0);function q(v){at[v?"unshift":"push"](()=>{a=v,n(3,a)})}return[s,d,c,a,w,r,F,O,P,R,W,q]}var kt=class extends it{constructor(e){super(),jt(this,e,qe,Pe,Ft,{})}},ae=kt;var nt;function ze(t,e){let n=new Uint8Array(nt.exports.memory.buffer,t,e);console.log("WASM",new TextDecoder().decode(n))}var ue={env:{memory:new WebAssembly.Memory({initial:5,maximum:500}),console_log_ex:ze}},Ge=async()=>{if(typeof window<"u")return WebAssembly.instantiateStreaming(fetch("gemm.wasm"),ue);let t=new Function("specifier","return import(specifier)"),{readFile:e}=await t("node:fs/promises");return WebAssembly.instantiate(await e("static/gemm.wasm"),ue)},fe=Ge().then(t=>(nt=t.instance,nt.exports.init_debug(),globalThis.wasm_instance=nt,globalThis.wasm_bindings=nt.exports,nt.exports));fe.then(()=>{new ae({target:document.querySelector("#app")})});})(); diff --git a/experiments/free-will/gemm.wasm b/experiments/free-will/gemm.wasm new file mode 100755 index 0000000..6ce23d6 Binary files /dev/null and b/experiments/free-will/gemm.wasm differ diff --git a/experiments/free-will/gemm.wasm.o b/experiments/free-will/gemm.wasm.o new file mode 100644 index 0000000..3c2d863 Binary files /dev/null and b/experiments/free-will/gemm.wasm.o differ diff --git a/experiments/free-will/index.html b/experiments/free-will/index.html new file mode 100644 index 0000000..d6a45c3 --- /dev/null +++ b/experiments/free-will/index.html @@ -0,0 +1,6 @@ +--- +title: Free Will Tester +slug: oracle +description: How bound are you to the habits of the past? Find out with this test. +--- +
diff --git a/src/global.json b/src/global.json index 088770d..df61f47 100644 --- a/src/global.json +++ b/src/global.json @@ -116,7 +116,7 @@ ["aacs.png", "https://en.wikipedia.org/wiki/Illegal_number"], ["dhmo.gif", "https://www.dhmo.org/"], ["kiwix.gif", "https://a.osmarks.net"], - ["philpxa.gif", "https://philpax.me/"] + ["philpax.png", "https://philpax.me/"] ], "mycorrhiza": "https://docs.osmarks.net", "tagColors": { diff --git a/src/style.sass b/src/style.sass index 77a1012..9993b4d 100644 --- a/src/style.sass +++ b/src/style.sass @@ -10,6 +10,8 @@ $navbar-width: 20rem // worth considering: #d9facc? --box-bg: #fff --box-border: #000 + --text: #000 + --background: #fff // xkcd bluegreen --link: #048600 --visited-link: #006e2b @@ -101,6 +103,7 @@ nav display: flex align-items: center font-style: italic + color: var(--text) a, img, picture margin-right: 0.5em @@ -121,6 +124,8 @@ h1, h2, h3, h4, h5, h6 color: inherit !important text-decoration: none !important + text-shadow: 0.06em 0.06em var(--stripe) + summary h1, summary h2 display: inline @@ -163,7 +168,7 @@ ul button, select, input, textarea, .textarea border-radius: 0 !important - border: 1px solid gray + border: 1px solid var(--box-border) box-shadow: none !important .achievements @@ -218,7 +223,7 @@ button, select, input, textarea, .textarea blockquote padding-left: 0.6rem - border-left: 6px solid black + border-left: 6px solid var(--text) margin-left: 0.2rem .wider, pre @@ -312,35 +317,28 @@ $hl-border: 3px border-bottom: solid $hl-border var(--box-border) margin-top: -$hl-border +body + background: var(--background) + color: var(--text) + @media (prefers-color-scheme: dark) - body - background: black - color: white - - nav - background: #000 - .achievement color: black :root --box-bg: #000 --box-border: #888 + --text: #fff + --background: #000 // bright teal --link: #6fff6c --visited-link: #60e394 --block-lightness: 20% --overlay-opacity: 0.5 - nav .logocont - color: white - - blockquote - border-left: 6px solid white - button, select, input, textarea, .textarea background: #333 - color: white + color: var(--text) .imbox img, picture @@ -494,8 +492,8 @@ textarea.squiggle .cite-this-post display: none - img - max-width: 60% !important + .caption + max-width: 80% nav display: none