"""This implements a *very* rudimentary sparse vector class.  It's
probably not generally useful.

Functions:
from_array   Convert an array into a sparse vector.
to_array     Convert a sparse vector into an array.
save_str     Save a sparse vector as a string.
load_str     Load a sparse vector previously saved with save_str.

"""
import math
from Numeric import *

def to_array(sv):
    """to_array(sv) -> array"""
    veclen, sparsedict = sv
    array = zeros(veclen, Float64)
    for index, value in sparsedict.items():
        array[index] = value
    return array

def from_array(array):
    """from_array(array) -> SparseVec"""
    veclen = len(array)
    sparsedict = {}
    fabs = math.fabs
    for i in range(len(array)):
        if fabs(array[i]) >= 1E-60:
            sparsedict[i] = array[i]
    return veclen, sparsedict
    

def load_str(s):
    """load_str(s) -> SparseVec"""
    cols = s.split(" ")
    veclen = int(cols[0])
    
    cols = cols[1:]
    sparsedict = {}
    for i in range(0, len(cols), 2):
        sparsedict[int(cols[i])] = float(cols[i+1])
    return veclen, sparsedict

def save_str(sv):
    """save_str(sv) -> string"""
    veclen, sparsedict = sv
    cols = []
    cols.append(veclen)
    indexes = sparsedict.keys()
    indexes.sort()
    for index in indexes:
        cols.append(index)
        cols.append(sparsedict[index])
    cols = map(str, cols)
    return " ".join(cols)
