> > > > > > > here's the crash now:
> > > > > > >
> > > > > > > Traceback (most recent call last):
> > > > > > > File 
> > > > > > > "/nix/store/f2krmq3iv5nibcvn4rw7nrnrciqprdkh-python3-3.12.9/lib/python3.12/pdb.py",
> > > > > > > line 1960, in main
> > > > > > >     pdb._run(target)
> > > > > > >   File 
> > > > > > > "/nix/store/f2krmq3iv5nibcvn4rw7nrnrciqprdkh-python3-3.12.9/lib/python3.12/pdb.py",
> > > > > > > line 1754, in _run
> > > > > > >     self.run(target.code)
> > > > > > >   File 
> > > > > > > "/nix/store/f2krmq3iv5nibcvn4rw7nrnrciqprdkh-python3-3.12.9/lib/python3.12/bdb.py",
> > > > > > > line 627, in run
> > > > > > >     exec(cmd, globals, locals)
> > > > > > >   File "/home/karl3/projects/rep/rep/dict.py", line 394, in 
> > > > > > > <module>
> > > > > > >     doc.update([[val,val]])
> > > > > > >   File "/home/karl3/projects/rep/rep/dict.py", line 349, in update
> > > > > > >     super().update(keyhashitems())
> > > > > > >   File "/home/karl3/projects/rep/rep/dict.py", line 164, in update
> > > > > > >     assert int.from_bytes(keyhash[:hashbytes], 'big') >> 
> > > > > > > hashshift == newidx
> > > > > > >            
> > > > > > > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> > > > > > > AssertionError
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > >         for keyhash, item in keyhashitems:
> > > > > > >
> > > > > > >                                                           assert 
> > > > > > > item
> > > > > > > != self._sentinel
> > > > > > >
> > > > > > >                                   byteidx =
> > > > > > > int.from_bytes(keyhash[:hashbytes], 'big')
> > > > > > >
> > > > > > >                                     newidx = byteidx >> hashshift
> > > > > > >
> > > > > > >
> > > > > > >            if self._capacity > 0:
> > > > > > >
> > > > > > >                                                              # 
> > > > > > > this
> > > > > > > block checks for collision with previous stored values
> > > > > > >
> > > > > > >                                        if capacity > 
> > > > > > > self._capacity:
> > > > > > >
> > > > > > >
> > > > > > >                   superidx = 
> > > > > > > int.from_bytes(keyhash[:self._hashbytes],
> > > > > > > 'big') >> self._hashshift
> > > > > > >                                                             else:
> > > > > > >
> > > > > > >
> > > > > > >                                        superidx = newidx
> > > > > > >
> > > > > > >
> > > > > > >           place = self.array[superidx]
> > > > > > >
> > > > > > >                                                         if place 
> > > > > > > !=
> > > > > > > self._sentinel:
> > > > > > >
> > > > > > >                                       collision = self._key(place)
> > > > > > >
> > > > > > >
> > > > > > >              if collision != keyhash:
> > > > > > >
> > > > > > >                                                                
> > > > > > > assert
> > > > > > > superidx == int.from_bytes(collision[:self._hashbytes], 'big') >>
> > > > > > > self._hashshift
> > > > > > >                                             updates[newidx] =
> > > > > > > [collision, place, False]
> > > > > > >
> > > > > > >                 # this separated approach to checking for 
> > > > > > > collisions
> > > > > > > allows for accepting
> > > > > > >                                                                 #
> > > > > > > batched data that ends up containing hash collisions solely within
> > > > > > > itself
> > > > > > >                                                 placing =
> > > > > > > updates.get(newidx)
> > > > > > >             if placing is not None:
> > > > > > >                 collision, place, is_new = placing
> > > > > > >                 while newidx == 
> > > > > > > int.from_bytes(collision[:hashbytes],
> > > > > > > 'big') >> hashshift:
> > > > > > >                     capacity <<= 1
> > > > > > >                     expansion <<= 1
> > > > > > >                     #spread += 1
> > > > > > >                     #hashbits = self._hashbits + spread
> > > > > > >                     hashbits += 1
> > > > > > >                     hashbytes = (hashbits+7) >> 3
> > > > > > >                     hashshift = (hashbytes << 3) - hashbits
> > > > > > >                     byteidx = int.from_bytes(keyhash[:hashbytes], 
> > > > > > > 'big')
> > > > > > >                     newidx = byteidx >> hashshift
> > > > > > >                     assert capacity == (1 << hashbits)
> > > > > > >                 new_updates = {}
> > > > > > >                 for keyhash, item, is_new in updates.values():
> > > > > > >                     if is_new:
> > > > > > >                         newnewidx =
> > > > > > > int.from_bytes(keyhash[:hashbytes], 'big') >> hashshift
> > > > > > >                         assert newnewidx not in new_updates
> > > > > > >                         new_updates[newnewidx] = [keyhash, item, 
> > > > > > > True]
> > > > > > >
> > > > > > >                                                               
> > > > > > > updates
> > > > > > > = new_updates
> > > > > > >             assert newidx not in updates
> > > > > > >             assert int.from_bytes(keyhash[:hashbytes], 'big') >>
> > > > > > > hashshift == newidx
> > > > > > >             updates[newidx] = [keyhash, item, True]
> > > > > > >
> > > > > > >
> > > > > > > it looks like the problem is that keyhash is shadowed in the loop 
> > > > > > > at the end :D
> > > > >
> > > > > shadowing is when a variable is used in an inner scope with the same
> > > > > name as an outer scope. many languages have strictly scoped blocks but
> > > > > python is not one of those languages allowing occasional mistakes like
> > > > > this. keyhash is used in an outer scope. i then use it as a loop
> > > > > variable, which changes its value in the outer scope.
> > > >
> > > > gotta acknowledge here that the source paste is illegible because of
> > > > all the wrapping and whitespace !
> > > >
> > > > also, how is this like use of the word "shadow" in corruption? the
> > > > people causing the corruption are (a) _hidden_ like the old value of
> > > > the variable, where people see the one that is presented rather than
> > > > the one acted and (b) cause _wrong events_ like the new value of the
> > > > variable overridding its correct one
> > >
> > > it's because shadowed objects aren't lit because light is cast on the
> > > object shadowing them instead
> > > and then they are less noticed from something else receiving the light
> > > cast on them, and so people don't include them and anything they do in
> > > their decisions as much :/
> >
> > industrialized humans are rare in that we basically just cast light
> > everywhere, with flashlights and streetlights and infrared cameras and
> > sleeping at night and locking doors at night
> >
> > most living beings just learn to see in the dark and treat incidental
> > weirdnesses as serious each time

[OOPS OOPS ..]
but anyway we are huge visual creatures! only other creatures with
huge eyes have vision like we do

>
> it's funny
>
> y'know white people stick out like a sore thumb at night the moon
> glances off their skin almost like glow-in-the-dark . i like to think
> it relates to industrialization somehow
>
> > >
> > > >
> > > > >
> > > > > usually a shadowed variable would make the opposite crash -- where in
> > > > > the inner loop, the inner value is used as if it were the outer. here,
> > > > > since it's python, the crash is from the outer value being used after
> > > > > the inner loop has finished. [...
> > > > >
> > > > > >
> > > > > > now i've got this:
> > > > > >   File "/home/karl3/projects/rep/rep/dict.py", line 220, in 
> > > > > > content_generator
> > > > > >     assert superidx * expansion + subidx ==
> > > > > > int.from_bytes(dbg_keyhash[:hashbytes], 'big') >> hashshift
> > > > > >            
> > > > > > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> > > > > > AssertionError
> > > > > > Uncaught exception. Entering post mortem debugging
> > > > > > Running 'cont' or 'step' will restart the program
> > > > > > > /home/karl3/projects/rep/rep/dict.py(220)content_generator()
> > > > > > -> assert superidx * expansion + subidx ==
> > > > > > int.from_bytes(dbg_keyhash[:hashbytes], 'big') >> hashshift
> > > > > > (Pdb) p item
> > > > > > b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
> > > > > >
> > > > > > but it's just because item is a sentinel which shouldn't hash to its
> > > > > > index, can check for that

Reply via email to