Commit 3302c69d authored by Jan Hönig's avatar Jan Hönig
Browse files

Documentation. Cleaning up TODOs. Fixing flake8

parent 89fe68a6
......@@ -38,8 +38,7 @@ def numpy_name_to_c(name: str) -> str:
class AbstractType(sp.Atom):
# TODO: inherits from sp.Atom because of cast function (and maybe others)
# TODO: is this necessary?
# TODO: Is it necessary to ineherit from sp.Atom?
def __new__(cls, *args, **kwargs):
return sp.Basic.__new__(cls)
......@@ -58,13 +57,16 @@ class AbstractType(sp.Atom):
def item_size(self) -> int:
Returns: WHO THE FUCK KNOWS!??!!?
Returns: Number of items.
E.g. width * item_size(basic_type) in vector's case, or simple numpy itemsize in Struct's case.
class BasicType(AbstractType):
# TODO: should be a sensible interface to np.dtype
BasicType is defined with a const qualifier and a np.dtype.
def __init__(self, dtype: Union[np.dtype, 'BasicType', str], const: bool = False):
if isinstance(dtype, BasicType):
......@@ -86,7 +88,7 @@ class BasicType(AbstractType):
return None
def item_size(self): # TODO: what is this? Do we want self.numpy_type.itemsize????
def item_size(self): # TODO: Do we want self.numpy_type.itemsize????
return 1
def is_float(self):
......@@ -128,7 +130,9 @@ class BasicType(AbstractType):
class VectorType(AbstractType):
# TODO: check with rest
VectorType consists of a BasicType and a width.
instruction_set = None
def __init__(self, base_type: BasicType, width: int):
......@@ -153,8 +157,8 @@ class VectorType(AbstractType):
if self.instruction_set is None:
return f"{self.base_type}[{self.width}]"
# TODO this seems super weird. the instruction_set should know how to print a type out!!!
# TODO this is error prone. base_type could be cons=True. Use dtype instead
# TODO VectorizationRevamp: this seems super weird. the instruction_set should know how to print a type out!
# TODO VectorizationRevamp: this is error prone. base_type could be cons=True. Use dtype instead
if self.base_type == create_type("int64") or self.base_type == create_type("int32"):
return self.instruction_set['int']
elif self.base_type == create_type("float64"):
......@@ -217,9 +221,10 @@ class PointerType(AbstractType):
class StructType(AbstractType):
# TODO: Docs. This is a struct. A list of types (with C offsets)
# TODO StructType didn't inherit from AbstractType.....
# TODO: This is basically like a BasicType... only as struct
A list of types (with C offsets).
It is implemented with uint8_t and casts to the correct datatype.
def __init__(self, numpy_type, const=False):
self.const = const
self._dtype = np.dtype(numpy_type)
......@@ -260,7 +265,6 @@ class StructType(AbstractType):
def __str__(self):
# structs are handled byte-wise
# TODO structs are weird
result = "uint8_t"
if self.const:
result += " const"
......@@ -274,9 +278,7 @@ class StructType(AbstractType):
def create_type(specification: Union[np.dtype, AbstractType, str]) -> AbstractType:
# TODO: Ok, this is basically useless. Except for it can differentiate between BasicType and StructType
# TODO: Everything else is already implemented inside BasicType
# TODO: Also why don't we support Vector and Pointer types???
# TODO: Deprecated Use the constructor of BasicType or StructType instead
"""Creates a subclass of Type according to a string or an object of subclass Type.
......@@ -4,20 +4,28 @@ from typing import Tuple, Union, Sequence
import numpy as np
import sympy as sp
# from pystencils.typing.leaf_typing import TypeAdder # TODO this should be leaf_typing
from sympy.logic.boolalg import Boolean, BooleanFunction
import pystencils
from pystencils.cache import memorycache_if_hashable
from pystencils.typing.types import BasicType, VectorType, PointerType, create_type
from pystencils.typing.cast_functions import CastFunc, PointerArithmeticFunc
from pystencils.typing.cast_functions import CastFunc
from pystencils.typing.typed_sympy import TypedSymbol
from pystencils.utils import all_equal
def typed_symbols(names, dtype, *args):
# TODO docs, type hints
symbols = sp.symbols(names, *args)
def typed_symbols(names, dtype, **kwargs):
Creates TypedSymbols with the same functionality as sympy.symbols
names: See sympy.symbols
dtype: The data type all symbols will have
**kwargs: Key value arguments passed to sympy.symbols
symbols = sp.symbols(names, **kwargs)
if isinstance(symbols, Tuple):
return tuple(TypedSymbol(str(s), dtype) for s in symbols)
......@@ -25,16 +33,17 @@ def typed_symbols(names, dtype, *args):
def get_base_type(data_type):
# TODO: WTF is this?? DOCS!!!
# TODO: This is unsafe.
# TODO: remove
# Pointer(Pointer(int))
Returns the BasicType of a Pointer or a Vector
while data_type.base_type is not None:
data_type = data_type.base_type
return data_type
def result_type(*args: np.dtype):
"""Returns the type of the result if the np.dtype arguments would be collated.
We can't use numpy functionality, because numpy casts don't behave exactly like C casts"""
s = sorted(args, key=lambda x: x.itemsize)
def kind_to_value(kind: str) -> int:
......@@ -96,13 +105,11 @@ def collate_types(types: Sequence[Union[BasicType, VectorType]]):
return result
# TODO get_type_of_expression should be used after leaf_typing. So no defaults should be necessary
def get_type_of_expression(expr,
# TODO: we shouldn't need to have default. AST leaves should have a type
# TODO: we shouldn't need to have default. AST leaves should have a type
# TODO: we shouldn't need to have default. AST leaves should have a type
from pystencils.astnodes import ResolvedFieldAccess
from pystencils.cpu.vectorization import vec_all, vec_any
......@@ -180,7 +187,7 @@ def get_type_of_expression(expr,
raise NotImplementedError("Could not determine type for", expr, type(expr))
# TODO this seems quite wrong...
# Fix for sympy versions from 1.9
sympy_version = sp.__version__.split('.')
if int(sympy_version[0]) * 100 + int(sympy_version[1]) >= 109:
# __setstate__ would bypass the contructor, so we remove it
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment