bert.js 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. try { module.exports = {dec:dec,enc:enc}; } catch (e) { }
  2. // BERT Encoder
  3. function uc(u1,u2) { if (u1.byteLength == 0) return u2; if (u2.byteLength == 0) return u1;
  4. var a = new Uint8Array(u1.byteLength + u2.byteLength);
  5. a.set(u1, 0); a.set(u2, u1.byteLength); return a; };
  6. function ar(o) { return o.v instanceof ArrayBuffer ? new Uint8Array(o.v) : o.v instanceof Uint8Array ? o.v :
  7. Array.isArray(o.v) ? new Uint8Array(o.v) : new Uint8Array(utf8_toByteArray(o.v).v);}
  8. function fl(a) { return a.reduce(function(f,t){ return uc(f, t instanceof Uint8Array ? t :
  9. Array.isArray(t) ? fl(t) : new Uint8Array([t]) ); }, new Uint8Array()); }
  10. function atom(o) { return {t:100,v:utf8_toByteArray(o).v}; }
  11. function bin(o) { return {t:109,v:o instanceof ArrayBuffer ? new Uint8Array(o) : o instanceof Uint8Array ? o : utf8_toByteArray(o).v}; }
  12. function tuple() { return {t:104,v:Array.apply(null,arguments)}; }
  13. function list() { return {t:108,v:Array.apply(null,arguments)}; }
  14. function number(o) { return {t:98,v:o}; }
  15. function enc(o) { return fl([131,ein(o)]); }
  16. function ein(o) { return Array.isArray(o)?en_108({t:108,v:o}):eval('en_'+o.t)(o); }
  17. function en_undefined(o) {
  18. if(window.debug){ console.log("from bert.js:20\n", o); }
  19. return [106];
  20. }
  21. function en_98(o) { return [98,o.v>>>24,(o.v>>>16)&255,(o.v>>>8)&255,o.v&255]; }
  22. function en_97(o) { return [97,o.v];}
  23. function en_106(o) { return [106];}
  24. function en_100(o) { return [100,o.v.length>>>8,o.v.length&255,ar(o)]; }
  25. function en_107(o) { return [107,o.v.length>>>8,o.v.length&255,ar(o)];}
  26. function en_104(o) { var l=o.v.length,r=[]; for(var i=0;i<l;i++)r[i]=ein(o.v[i]); return [104,l,r]; }
  27. function en_109(o) { var l=o.v instanceof ArrayBuffer ? o.v.byteLength : o.v.length;
  28. return[109,l>>>24,(l>>>16)&255,(l>>>8)&255,l&255,ar(o)]; }
  29. function en_108(o) { var l=o.v.length,r=[]; for(var i=0;i<l;i++)r.push(ein(o.v[i]));
  30. return o.v.length==0?[106]:[108,l>>>24,(l>>>16)&255,(l>>>8)&255,l&255,r,106]; }
  31. // BERT Decoder
  32. function nop(b) { return []; };
  33. function big(b) { var sk=b==1?sx.getUint8(ix++):sx.getInt32((a=ix,ix+=4,a));
  34. var ret=0, sig=sx.getUint8(ix++), count=sk;
  35. while (count-->0) {
  36. ret = 256 * ret + sx.getUint8(ix+count)
  37. }
  38. ix += sk;
  39. return ret*(sig==0?1:-1);
  40. }
  41. function int(b) { return b==1?sx.getUint8(ix++):sx.getInt32((a=ix,ix+=4,a)); };
  42. function dec(d) { sx=new DataView(d);ix=0; if(sx.getUint8(ix++)!==131)throw("BERT?"); return din(); };
  43. function str(b) { var dv,sz=(b==2?sx.getUint16(ix):sx.getInt32(ix));ix+=b;
  44. var r=sx.buffer.slice(ix,ix+=sz); return b==2?utf8_dec(r):r; };
  45. function run(b) { var sz=(b==1?sx.getUint8(ix):sx.getUint32(ix)),r=[]; ix+=b;
  46. for(var i=0;i<sz;i++) r.push(din()); if(b==4)ix++; return r; };
  47. function din() { var c=sx.getUint8(ix++),x; switch(c) { case 97: x=[int,1];break;
  48. case 98: x=[int,4]; break; case 100: x=[str,2]; break;
  49. case 110: x=[big,1]; break; case 111: x=[big,4]; break;
  50. case 104: x=[run,1]; break; case 107: x=[str,2]; break;
  51. case 108: x=[run,4]; break; case 109: x=[str,4]; break;
  52. default: x=[nop,0]; } return {t:c,v:x[0](x[1])};};