From d7afe8df861c79fcad965141c39075d0f922b9a0 Mon Sep 17 00:00:00 2001 From: spencer kelly Date: Tue, 24 Jan 2023 15:20:18 -0500 Subject: [PATCH] slightly smaller --- scratch.js | 4 +--- src/pack/key-val.js | 25 +++++++++++++++++++++++++ src/pack/pack.js | 18 ++++++++++++++---- src/pack/unpack.js | 22 ++++++++++++++++++---- tmp2.js | 2 +- 5 files changed, 59 insertions(+), 12 deletions(-) create mode 100644 src/pack/key-val.js diff --git a/scratch.js b/scratch.js index 888fad9..c7c1145 100644 --- a/scratch.js +++ b/scratch.js @@ -2,7 +2,7 @@ import { learn, reverse, test, compress, uncompress, classify, fingerprint, tiny import data from '/Users/spencer/mountain/it-compromise/data/models/verbs/conditional.js' // let pairs = Object.keys(data).map(k => [k, data[k][0]]) -let pairs = Object.keys(data).map(k => [data[k][0], k]).slice(0, 200) +let pairs = Object.keys(data).map(k => [data[k][0], k])//.slice(0, 200) // pairs = [ // ['sottomettere', 'sottometterei'], // ['teletrasmettere', 'teletrasetterei'], @@ -12,13 +12,11 @@ let pairs = Object.keys(data).map(k => [data[k][0], k]).slice(0, 200) // console.log(compress(learn(pairs))) let res = tiny(pairs) -// res = compress(res) console.log(res) console.log('\n\n') let small = pack(res) console.log(small) let again = unpack(small) -console.log(again) test(pairs, again) // { ei: 'e' }, diff --git a/src/pack/key-val.js b/src/pack/key-val.js new file mode 100644 index 0000000..00c923c --- /dev/null +++ b/src/pack/key-val.js @@ -0,0 +1,25 @@ +// longest common prefix +const findOverlap = (from, to) => { + let all = [] + for (let i = 0; i < from.length; i += 1) { + if (from[i] === to[i]) { + all.push(from[i]) + } else { + break + } + } + return all.join('') +} + +// run-length encode any shared prefix +let compress = function (key, val) { + let prefix = findOverlap(key, val) + if (prefix.length < 1) { + return val + } + let out = prefix.length + val.substr(prefix.length) + return out +} + +export default compress +// console.log(compress('fixture', 'fixturing')) \ No newline at end of file diff --git a/src/pack/pack.js b/src/pack/pack.js index a21b575..ac9053b 100644 --- a/src/pack/pack.js +++ b/src/pack/pack.js @@ -1,18 +1,28 @@ +import keyVal from './key-val.js' + const pack = function (model) { let out = '' model.rules.forEach(obj => { let r = [] Object.keys(obj).forEach(k => { - r.push(k + '|' + obj[k] + ',') + let val = keyVal(k, obj[k])// compress any shared prefix + if (!val) { + console.log('=-=-=-= here -=-=-=-') + console.log(k, obj[k]) + } + r.push(k + ':' + val + ',') }) out += r.join('') }) out += '==' let r = [] - Object.keys(model.exceptions).forEach(k => { - r.push(k + '|' + model.exceptions[k]) + Object.keys(model.exceptions || {}).forEach(k => { + let val = keyVal(k, model.exceptions[k])// compress any shared prefix + r.push(k + ':' + val) }) out += r.join(',') return out } -export default pack \ No newline at end of file +export default pack + +// rei:ere, erei:are, rrei:nere, arei:3, herei:are, lirei:4, nirei:4, tirei:4,== \ No newline at end of file diff --git a/src/pack/unpack.js b/src/pack/unpack.js index 01832f0..8474220 100644 --- a/src/pack/unpack.js +++ b/src/pack/unpack.js @@ -1,13 +1,27 @@ +const prefix = /^([0-9]+)/ + +const expand = function (key = '', val = '') { + val = String(val) + let m = val.match(prefix) + if (m === null) { + return val + } + let num = Number(m[1]) || 0 + let pre = key.substring(0, num) + let full = pre + val.replace(prefix, '') + return full +} + const unpack = function (str) { let out = { rules: [], exceptions: {} } let [rules, exceptions] = str.split('==') // unpack rules rules.split(',').forEach(txt => { - let [a, b] = txt.split('|') + let [a, b] = txt.split(':') let len = a.length if (len) { out.rules[len] = out.rules[len] || {} - out.rules[len][a] = b + out.rules[len][a] = expand(a, b) } }) // clean empties up a bit @@ -17,8 +31,8 @@ const unpack = function (str) { // unpack exceptions exceptions.split(',').forEach(txt => { - let [a, b] = txt.split('|') - out.exceptions[a] = b + let [a, b] = txt.split(':') + out.exceptions[a] = expand(a, b) }) return out } diff --git a/tmp2.js b/tmp2.js index ecc9c9b..4337be5 100644 --- a/tmp2.js +++ b/tmp2.js @@ -1 +1 @@ -export default `erei|are,rrei|nire,irei|ire,herei|are,urrei|urre,ccerei|cciare,aderei|adere,ederei|edere,ncerei|nciare,rcerei|rciare,rgerei|rgere,ngerei|ngere,agerei|agiare,lgerei|lgere,ascerei|asciare,orrerei|orrere,escerei|escere,iggerei|iggere,oscerei|osciare,eggerei|eggiare,batterei|battere,oglierei|ogliere,scenderei|scendere,==accenderei|accendere,agerei|agiare` \ No newline at end of file +export default `rei:ere,erei:are,rrei:nere,arei:3,herei:are,lirei:4,nirei:4,tirei:4,rirei:4,direi:4,sirei:4,cirei:4,uirei:4,girei:4,birei:4,firei:4,ndrei:2are,hirei:4,zirei:4,mirei:4,oirei:4,eirei:4,virei:4,ccerei:2iare,verrei:2nire,agerei:2iare,lgerei:5,porrei:5,ocerei:2iare,rarrei:5,ucerei:2iare,lcerei:2iare,apirei:5,rpirei:5,lpirei:5,epirei:5,upirei:5,egerei:2iare,dorrei:2lere,ogerei:2iare,varrei:2lere,ugerei:2iare,parrei:3ere,opirei:5,vorrei:2lere,etterei:mettere,bdurrei:6,cederei:6,ddurrei:6,ergerei:6,iggerei:6,ancerei:3iare,oggerei:3iare,luderei:6,uncerei:3iare,aggerei:3iare,olverei:6,urgerei:6,ingerei:6,bacerei:3iare,ficerei:3iare,ercerei:3iare,bigerei:3iare,iederei:6,iuderei:6,peterei:6,iacerei:6,ndurrei:6,omperei:6,argerei:6,nquerei:6,rigerei:6,cuterei:6,erderei:6,uggerei:6,viderei:6,figerei:3iare,empirei:6,sigerei:6,ruderei:6,vaderei:6,gemerei:6,beverei:6,nicerei:3iare,odurrei:6,lederei:6,licerei:6,iscerei:3iare,arcerei:3iare,underei:6,pigerei:3iare,digerei:6,ceverei:6,idurrei:3cere,ircerei:3iare,caderei:6,uscerei:3iare,tacerei:6,adurrei:6,engerei:3iare,batterei:7,braderei:7,cascerei:4iare,cetterei:4are,concerei:4iare,corcerei:4iare,correrei:7,rescerei:7,fetterei:4are,loscerei:4iare,rangerei:7,iungerei:7,beggerei:4iare,bascerei:4iare,metterei:7,heggerei:4iare,penderei:7,renderei:7,ieggerei:4iare,meggerei:4iare,rriderei:7,criverei:7,petterei:4are,sisterei:7,getterei:4are,ssumerei:7,tenderei:7,torcerei:7,vincerei:7,betterei:4are,edicerei:7,seggerei:4iare,peggerei:4iare,cangerei:4iare,neggerei:4iare,zeggerei:4iare,cernerei:7,uetterei:4are,nciderei:7,langerei:7,noscerei:7,lliderei:7,mincerei:4iare,iangerei:7,primerei:7,pungerei:7,ponderei:7,rroderei:7,crederei:7,deggerei:4iare,eciderei:7,dedurrei:7,fungerei:7,eriderei:7,detterei:4are,fenderei:7,iligerei:7,irimerei:7,suaderei:7,eliderei:7,eroderei:7,panderei:7,tollerei:7,hetterei:4are,fascerei:4iare,ferverei:7,forgerei:4iare,fotterei:7,fremerei:7,retterei:4are,comberei:7,adicerei:4iare,ietterei:4are,sorgerei:7,udicerei:4iare,triderei:7,lascerei:4iare,lincerei:4iare,mangerei:4iare,mescerei:7,mieterei:7,morderei:7,mungerei:7,nascerei:7,gligerei:7,cciderei:7,pascerei:7,oetterei:4are,porgerei:7,premerei:7,edimerei:7,cinderei:7,iarderei:7,lenderei:7,venderei:7,vescerei:4iare,aetterei:4are,feggerei:4iare,corgerei:7,roscerei:4iare,sedurrei:7,aligerei:4iare,tangerei:7,tesserei:7,verterei:7,coglierei:8,scenderei:8,aleggerei:5iare,lletterei:5are,areggerei:5iare,anetterei:5are,oreggerei:5iare,nnetterei:8,sconderei:8,assiderei:8,tteggerei:5iare,nfonderei:8,nteggerei:5iare,tinguerei:8,rteggerei:5iare,steggerei:5iare,treggerei:5iare,desumerei:8,iletterei:5are,ioglierei:8,toglierei:8,fletterei:8,lleggerei:5iare,ncenderei:8,oleggerei:5iare,breggerei:5iare,ceglierei:8,resumerei:8,opellerei:8,oteggerei:8,epellerei:8,esetterei:5are,ileggerei:8,spegnerei:8,svellerei:8,lteggerei:5iare,orreggerei:9,iffonderei:9,divellerei:9,eccellerei:9,effonderei:9,espellerei:9,erreggerei:6iare,ieleggerei:9,asfonderei:9,veleggerei:6iare,iaccenderei:10,==accenderei:9,agerei:2iare,aleggerei:5iare,arerei:3,arderei:6,assiderei:8,bacerei:3iare,batterei:7,bigerei:3iare,cangerei:4iare,cederei:6,cernerei:7,chererei:7,chiererei:8,coglierei:8,concerei:4iare,correrei:7,crederei:7,dedurrei:7,desumerei:8,detterei:4are,direi:4,divellerei:9,dorrei:2lere,durrei:2cere,eccellerei:9,edurrei:3cere,effonderei:9,eleggerei:8,eliderei:7,empirei:6,ergerei:6,eroderei:7,espellerei:9,fascerei:4iare,fenderei:7,ferverei:7,fletterei:8,forgerei:4iare,fotterei:7,fremerei:7,fungerei:7,gemerei:6,getterei:4are,lascerei:4iare,lederei:6,leggerei:7,licerei:6,lincerei:4iare,mangerei:4iare,mescerei:7,metterei:7,mieterei:7,morderei:7,mungerei:7,nascerei:7,netterei:4are,parrei:3ere,pascerei:7,penderei:7,pigerei:3iare,porgerei:7,porrei:5,premerei:7,profonderei:10,pungerei:7,raderei:6,reggerei:7,renderei:7,riderei:6,scenderei:8,sedurrei:7,sorgerei:7,spegnerei:8,sumerei:6,svellerei:8,tacerei:6,tangerei:7,temerei:6,tenderei:7,tesserei:7,toglierei:8,torcerei:7,ungerei:6,urgerei:6,varrei:2lere,veleggerei:6iare,venderei:7,verrei:2nire,verterei:7,vincerei:7,vorrei:2lere,rei:ere` \ No newline at end of file