import {useId} from 'react'; import config from '../t5config_large.json'; import {mix, phase, segment, windowAt, residuePreviewCount, sharingState} from './dualStory'; import type {Example} from './types'; const blue = '#397cbb', orange = '#cf643e', ink = '#24364a'; const words = (s:string) => s.replace(/([.!?])(?=[A-Z])/g,'$1 ').split(/\s+/); function wrap(s:string, limit:number) { const lines:string[] = []; let line = ''; words(s).forEach(word => { if ((line+' '+word).length > limit && line) { lines.push(line); line = word; } else line += (line?' ':'')+word; }); if (line) lines.push(line); return lines; } function Node({x,y,protein,decoder,focus,context=0,sharing=0}:{x:number;y:number;protein:boolean;decoder:boolean;focus:number;context?:number;sharing?:number}) { const color = protein?orange:blue; const rows = decoder?['Masked self-attention','Cross-attention','Feed-forward']:['Self-attention','Feed-forward']; return {[12,6].map(n=>)} {decoder?'AUTOREGRESSIVE DECODER':'CONTEXTUAL ENCODER'} {protein?'Protein':'Text'} {decoder?'Decoder':'Encoder'} ×{decoder?config.num_decoder_layers:config.num_layers} {rows.map((label,i)=>{ const rowY = 73+i*(decoder?34:51); return {i===0&&} .1?color:label==='Cross-attention'&&context>0?color:'#ffffff'} fillOpacity={i===0?.8-sharing*.66:label==='Cross-attention'? .14+.5*context:.8} stroke={color} strokeOpacity={label==='Cross-attention'?.5:.14}/> .65?'#fff':color}>{label} {i===0&&TIED} ; })} Block detail · d = {config.d_model.toLocaleString('en-US')} ; } function Projection({x,y,reverse,focus}:{x:number;y:number;reverse:boolean;focus:number}) { return LINEAR PROJECTION {reverse?'Wₚ→ₜ':'Wₜ→ₚ'} {config.d_model} → {config.d_model} ; } function StatePacket({x,y,color,opacity=1}:{x:number;y:number;color:string;opacity?:number}) { return {Array.from({length:6},(_,i)=>)}; } function Lane({p,reverse,overview,id}:{p:number;reverse:boolean;overview:number;id:string}) { const encoderX=reverse?600:52, decoderX=reverse?52:600; const y=reverse?mix(230,413,overview):mix(230,119,overview); const alpha=reverse?Math.max(phase(p,.515,.54),overview):Math.max(1-phase(p,.493,.515),overview); const encoded=phase(p,reverse?.568:.072,reverse?.612:.16); const projected=phase(p,reverse?.612:.18,reverse?.666:.30); const writing=windowAt(p,reverse?.68:.32,reverse?.825:.493); const encoding=reverse?windowAt(p,.515,.61):1-phase(p,.16,.185); const projecting=reverse?windowAt(p,.61,.677):windowAt(p,.18,.315); const share=sharingState(p); const emphasis=(protein:boolean)=>Math.max(.3,protein?1-share.textFocus*.7:1-share.proteinFocus*.7); const eFocus=Math.max(encoding,overview*emphasis(reverse)),dFocus=Math.max(writing,projecting*.55,overview*emphasis(!reverse)),wFocus=Math.max(projecting,overview*(1-Math.max(share.textFocus,share.proteinFocus)*.7)); const shared=(protein:boolean)=>protein?Math.max(share.proteinFocus,share.both*.65):Math.max(share.textFocus,share.both*.65); const direction=reverse?-1:1; const start=reverse?600:280, end=reverse?280:600; return HIDDEN STATES Illustrative vectors {Array.from({length:7},(_,i)=>{ const travel=phase(p,(reverse?.612:.18)+i*.006,(reverse?.639:.255)+i*.006); const emerge=phase(p,(reverse?.575:.095)+i*.005,(reverse?.595:.14)+i*.005); const x=mix(start+direction*(12+i*9),end-direction*21,travel); return .55?(reverse?blue:orange):(reverse?orange:blue)} opacity={emerge*(1-phase(travel,.88,1))}/>; })} {Array.from({length:5},(_,i)=>)} {reverse?'02 PROTEIN → TEXT':'01 TEXT → PROTEIN'} {reverse?'Supervise with reference text':'Supervise with reference protein'} ; } function Input({p,reverse,example}:{p:number;reverse:boolean;example:Example}) { const color=reverse?orange:blue; const alpha=reverse?windowAt(p,.537,.815):1-phase(p,.477,.506); const tokens=reverse?example.protein.slice(0,16).split(''):words(example.text).slice(0,9); let wordX=52; return {reverse?'REFERENCE PROTEIN · INDEPENDENT INPUT':'REFERENCE FUNCTION · HSP20 FAMILY'} {reverse?<> {example.protein.slice(0,48)} First 48 of {example.protein.length} reference residues · not the generated sequence :wrap(example.text,79).map((line,i)=>{line})} {tokens.map((word,i)=>{ const w=reverse?37:word.length*8+18; const x=reverse?52+i*48:wordX; wordX+=w+6; const t=phase(p,(reverse?.546:.025)+i*.003,(reverse?.582:.085)+i*.003); const fade=1-phase(t,.67,1); return {word} ; })} Encoded into contextual states ; } function Output({p,reverse,example}:{p:number;reverse:boolean;example:Example}) { const start=reverse?.694:.335, end=reverse?.792:.467; const alpha=phase(p,start-.015,start)*(1-phase(p,reverse?.823:.487,reverse?.85:.514)); const items=reverse?words(example.generatedText):example.generatedProtein.slice(0,residuePreviewCount).split(''); const color=reverse?blue:orange, origin=reverse?166:714; let x=68,row=0; return RECORDED {reverse?'TEXT':'PROTEIN'} OUTPUT {items.map((item,i)=>{ const width=reverse?item.length*9+22:26, height=reverse?40:28; if (reverse && x+width>813) {x=68;row++;} const tx=reverse?x:90+(i%24)*30,ty=reverse?508+row*53:508+Math.floor(i/24)*36; x+=width+9; const t=segment(p,start+i*(end-start)/items.length,start+(i+1.9)*(end-start)/items.length); const eased=1-(1-t)**3; const lift=Math.sin(t*Math.PI)*45; return =1} opacity={phase(t,0,.18)} transform={`translate(${mix(origin-width/2,tx,eased)} ${mix(438,ty,eased)-lift}) scale(${mix(.6,1,eased)})`}> {item} ; })} {!reverse&&[0,1,2].map(row=>{String(row*24+1).padStart(3,'0')})} {reverse?'Word excerpts · archived prediction · illustrative timing':`First ${items.length} of ${example.generatedProtein.length} generated residues · complete sequence below`} ; } export function DualScene({progress:p,example}:{progress:number;example:Example}) { const id=useId().replace(/:/g,''); const overview=phase(p,.839,.894); const share=sharingState(p); return {[['blue',blue],['orange',orange]].map(([name,color])=>)} ONE PAIRED EXAMPLE · TWO TEACHER-FORCED TRAINING TASKS large-v5 ; }