class_docstr: Generic supertype for cache implementations.
  
  Defines a dict-like mapping with a maximum size, where as well as mapping
  to a value, each key also maps to a score. When a write would cause the
  dict to exceed its maximum size, it first evicts the existing key with
  the smallest score, then adds the new key to the map.
  
  A key has the following lifecycle:
  
  1. key is written for the first time, the key is given the score
     self.new_entry(key, value)
  2. whenever an existing key is read or written, self.on_access(key, value,
     score) is called. This returns a new score for the key.
  3. When a key is evicted, self.on_evict(key, value, score) is called.
  
  The cache will be in a valid state in all of these cases.
  
  Implementations are expected to implement new_entry and optionally
  on_access and on_evict to implement a specific scoring strategy.
docstr: Debugging method for use in tests.
  
  Asserts that all of the cache's invariants hold. When everything
  is working correctly this should be an expensive no-op.
docstr_tok: ["Debugging","method","for","use","in","tests",".","Asserts","that","all","of","the","cache","'s","invariants","hold",".","When","everything","is","working","correctly","this","should","be","an","expensive","no-op","."]
code: def check_valid(self):
      """Debugging method for use in tests.
  
      Asserts that all of the cache's invariants hold. When everything
      is working correctly this should be an expensive no-op.
      """
      for i, e in enumerate(self.data):
          assert self.keys_to_indices[e.key] == i
          for j in [i * 2 + 1, i * 2 + 2]:
              if j < len(self.data):
                  assert e.score <= self.data[j].score, self.data
  
imports: from __future__ import absolute_import, division, print_function
  import attr
label_desc: Use image node_id 15 for calling the GenericCache obj's underlying member method code with example usage: obj.check_valid() without return types