
skunks get personal armor with government money
---
i'm still working on rep/dict.py !
for a little smidge i didn't have wifi so i made a very simple file-based backend and just now got it working
here's my current crash
File "/home/karl3/projects/rep/rep/dict.py", line 392, in <module> doc.update([[val,val]]) File "/home/karl3/projects/rep/rep/dict.py", line 347, in update super().update(keyhashitems()) File "/home/karl3/projects/rep/rep/dict.py", line 225, in update self.array[:] = IterableWithLength(content_generator(), capacity) ~~~~~~~~~~^^^ File "/home/karl3/projects/rep/rep/array.py", line 56, in __setitem__ self.doc[start * sz : stop * sz] = data ~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/karl3/projects/rep/rep/rep.py", line 167, in __setitem__ piece = prefix + data[:] + suffix[:suffixoff] ~~~~^^^ File "/home/karl3/projects/rep/rep/rep.py", line 220, in __getitem__ buf += next(self.iteration) ^^^^^^^^^^^^^^^^^^^^ File "/home/karl3/projects/rep/rep/dict.py", line 218, in content_generator assert superidx * expansion + subidx == int.from_bytes(dbg_keyhash[:hashbytes], 'big') >> hashshift ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ AssertionError
[stares blankly at crash] i wonder what all this funny text means!
(Pdb) p [superidx, expansion, subidx], [hashbytes, dbg_keyhash[:hashbytes], hashshift, int.from_bytes(dbg_keyhash[:hashbytes], 'big') >> hashshift] ([0, 8, 1], [1, b'\x0c', 5, 0])
so the superidx is 0 that means it's engaging the first item of the original array. the subidx is 8, the hashshift is 5, and the expected final index is 0.
it's another problem with my bitwise arithmetic
(Pdb) list 202 197 assert superidx == newidx >> (hashbits - self._hashbits) 198 #subidx = (newidx >> hashshift) & expansionmask 199 subidx = newidx & expansionmask 200 assert superidx * expansion + subidx == newidx# >> hashshift 201 return subidx 202 for superidx, item in enumerate(tqdm.tqdm(self.array if self._capacity else [self._sentinel], desc='growing sentinel hashtable', leave=False)): 203 update_chunk = [self._sentinel] * expansion 204 if item != self._sentinel: 205 keyhash = self._key(item) 206 newidx = int.from_bytes(keyhash[:hashbytes], 'big') >> hashshift 207 update_chunk[newidx2subidx(newidx)] = item (Pdb) list 213 208 dbg_additions = [] 209 while next_superidx == superidx: 210 item = next_item 211 newidx = next_newidx 212 dbg_additions.append([next_newidx, next_keyhash, next_item]) 213 update_chunk[newidx2subidx(newidx)] = item 214 next_newidx, next_keyhash, next_item = updates.pop() if len(updates) else [1<<hashbits,None,None] 215 next_superidx = next_newidx >> (hashbits - self._hashbits) 216 for subidx, item in enumerate(update_chunk): 217 dbg_keyhash = self._key(item) 218 -> assert superidx * expansion + subidx == int.from_bytes(dbg_keyhash[:hashbytes], 'big') >> hashshift
not sure if i posted that i separated wholeidx into byteidx and newidx because i was sometimes assuming it was downshifted and othertimes not. [i could have referenced the old code to be consistent, that might have been clearer, but it is a logical computer-checked system anyway
(Pdb) p item b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' (Pdb) p update_chunk [b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', bytearray(b'\xd6\x00\x00\x00\x00\x00\x00\x00\xd8\x00\x00\x00\x00\x00\x00\x00'), b'\xd6\x00\x00\x00\x00\x00\x00\x00\xd8\x00\x00\x00\x00\x00\x00\x00', b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'] i'm guessing all those 16-long sequences of zeros are bugs in the file backend i tried to add :D