"""Sparse vector representation and explicit raw-array byte arithmetic."""
import json,math
def unpack(size,pairs):
    if type(size) is not int or size<1:raise ValueError('positive integer dimension')
    out=[0.]*size;seen=set()
    for index,value in pairs:
        if type(index) is not int or not 0<=index<size or index in seen:raise ValueError('unique in-range integer indices')
        if not math.isfinite(value):raise ValueError('finite values')
        seen.add(index);out[index]=value
    return out
if __name__=='__main__':
    size=5;pairs=[(1,3.),(3,-1.)];dense=unpack(size,pairs);query=[1,2,3,4,5]
    assert dense==[0,3,0,-1,0]
    assert sum(d*q for d,q in zip(dense,query))==sum(v*query[i] for i,v in pairs)==2
    assert size*4==20 and len(pairs)*(4+4)==16 and len(pairs)*4+len(pairs)*4+2*4==24
    assert unpack(size,[])==[0.]*5
    for bad in [[(5,1.)],[(1,1.),(1,2.)],[(True,1.)],[(1,float('nan'))]]:
        try:unpack(5,bad)
        except ValueError:continue
        raise AssertionError('bad sparse record accepted')
    print(json.dumps({'dimension':size,'pairs_zero_based':pairs,'dense':dense,'dot_with_query':2,'assumed_value_bytes':4,'assumed_index_bytes':4,'raw_dense_bytes':20,'raw_index_value_pairs_bytes':16,'raw_single_row_CSR_array_bytes':24,'python_object_memory_measured':False},indent=2))
