File size: 1,831 Bytes
da49047
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
"""Direct UTF-8 bytes. Special IDs match BET, not the old Cortex tokenizer."""
from dataclasses import dataclass
PAD,BOS,EOS=256,257,258

class Oversize(ValueError):pass
class InvalidRecord(ValueError):pass

def ids(text):return list(text.encode('utf-8'))
def decode(tokens):return bytes(t for t in tokens if 0<=t<256).decode('utf-8',errors='replace')

def record(prefix,answer,source,limit=1024,supervise_all=False,meta=None):
    p,a=ids(prefix),ids(answer)
    if not a:raise InvalidRecord('Empty target: '+source)
    tokens=[BOS]+p+a+[EOS]
    if len(tokens)>limit+1:raise Oversize(f'{source}: {len(tokens)} IDs exceeds {limit+1}; no truncation')
    weights=[0]+([1]*len(p) if supervise_all else [0]*len(p))+[1]*(len(a)+1)
    return dict(ids=tokens,weights=weights,source=source,prompt_len=1+len(p),meta=meta or {})

def plain_chunks(text,source,limit=1024):
    # Lossless bytes, including split UTF-8 sequences: decoder assembles the byte stream.
    # No false EOS at chunk boundaries. One-token overlap predicts each byte once.
    if not isinstance(text,str) or not text.strip():raise InvalidRecord('Empty/non-string text: '+source)
    raw_bytes=text.encode('utf-8')
    if len(raw_bytes)>1024*1024:raise Oversize('Document exceeds the 1 MiB bounded-buffer limit; rejected intact')
    raw=[BOS]+list(raw_bytes)+[EOS];out=[]
    for offset in range(0,len(raw)-1,limit):
        chunk=raw[offset:offset+limit+1]
        out.append(dict(ids=chunk,weights=[0]+[1]*(len(chunk)-1),source=source,prompt_len=1,meta={}))
    return out

def validate(r,limit=1024):
    assert 2<=len(r['ids'])<=limit+1
    assert len(r['ids'])==len(r['weights'])
    assert all(type(x)==int and 0<=x<259 for x in r['ids'])
    assert all(x in (0,1) for x in r['weights']) and sum(r['weights'][1:])>0
    assert r['weights'][0]==0
    return r