def induct(x): from . import cudata """Compute Copperhead type of an input, also convert data structure""" if isinstance(x, cudata.cuarray): return (conversions.back_to_front_type(x.type), x) if isinstance(x, np.ndarray): induced = cudata.cuarray(x) return (conversions.back_to_front_type(induced.type), induced) if isinstance(x, np.float32): return (coretypes.Float, x) if isinstance(x, np.float64): return (coretypes.Double, x) if isinstance(x, np.int32): return (coretypes.Int, x) if isinstance(x, np.int64): return (coretypes.Long, x) if isinstance(x, np.bool): return (coretypes.Bool, x) if isinstance(x, list): induced = cudata.cuarray(np.array(x)) return (conversions.back_to_front_type(induced.type), induced) if isinstance(x, float): #Treat Python floats as double precision return (coretypes.Double, np.float64(x)) if isinstance(x, int): #Treat Python ints as 64-bit ints (following numpy) return (coretypes.Long, np.int64(x))
def induct(x): from . import cudata """Compute Copperhead type of an input, also convert data structure""" if isinstance(x, cudata.cuarray): return (conversions.back_to_front_type(x.type), x) if isinstance(x, np.ndarray): induced = cudata.cuarray(x) return (conversions.back_to_front_type(induced.type), induced) if isinstance(x, np.float32): return (coretypes.Float, x) if isinstance(x, np.float64): return (coretypes.Double, x) if isinstance(x, np.int32): return (coretypes.Int, x) if isinstance(x, np.int64): return (coretypes.Long, x) if isinstance(x, np.bool): return (coretypes.Bool, x) if isinstance(x, list): induced = cudata.cuarray(np.array(x)) return (conversions.back_to_front_type(induced.type), induced) if isinstance(x, float): #Treat Python floats as double precision return (coretypes.Double, np.float64(x)) if isinstance(x, int): #Treat Python ints as 64-bit ints (following numpy) return (coretypes.Long, np.int64(x)) if isinstance(x, bool): return (coretypes.Bool, np.bool(x)) if isinstance(x, tuple): sub_types, sub_elements = zip(*(induct(y) for y in x)) return (coretypes.Tuple(*sub_types), tuple(sub_elements)) #Can't digest this input raise ValueError("This input is not convertible to a Copperhead data structure: %r" % x)
def to_numpy(ary): front_type = back_to_front_type(ary.type) if not isinstance(front_type, T.Seq): raise ValueError("Not convertible to numpy") sub = front_type.unbox() if str(sub) == str(T.Int): return np.fromiter(ary, dtype=np.int32, count=-1) elif str(sub) == str(T.Long): return np.fromiter(ary, dtype=np.int64, count=-1) elif str(sub) == str(T.Float): return np.fromiter(ary, dtype=np.float32, count=-1) elif str(sub) == str(T.Double): return np.fromiter(ary, dtype=np.float64, count=-1) elif str(sub) == str(T.Bool): return np.fromiter(ary, dtype=np.bool, count=-1) else: raise ValueError("Not convertible to numpy")