Skip to content

Commit 142a5f4

Browse files
add layer and more
1 parent a685dcd commit 142a5f4

File tree

12 files changed

+133
-14
lines changed

12 files changed

+133
-14
lines changed

include/tensor_bind.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,5 +181,6 @@ PYBIND11_MODULE(tensor2, m)
181181
.def("__getitem__", &python_tuple_slice)
182182
.def("__len__", &python_len)
183183
.def("__matmul__", &matmul)
184+
.def("__rmatmul__", &matmul)
184185
.def("__repr__", &tensor_to_string);
185186
}

src/TensorArray/util/Layer.py

Lines changed: 0 additions & 9 deletions
This file was deleted.

src/TensorArray/util/Parameter.py

Lines changed: 0 additions & 5 deletions
This file was deleted.

src/TensorArray/util/__init__.py

Whitespace-only changes.

src/main.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
t2 = t1.clone()
77
print("tensor len", t1.__len__())
88
print(t1)
9+
print(t1.__dir__())
910
t1 = t1[::]
1011
print(t1)
1112
t1 = t1.transpose(0, 1)
File renamed without changes.
File renamed without changes.

src/tensor_array/util/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from TensorArray.util import *

src/tensor_array/util/layer.py

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
from collections import OrderedDict, namedtuple
2+
from typing import Union, Tuple, Any, Callable, Iterator, Set, Optional, overload, TypeVar, Mapping, Dict, List
3+
from typing import Any
4+
from ...tensor_array.core import tensor2 as t
5+
from .parameter import Parameter
6+
7+
class Layer:
8+
_layers = Dict[str, Optional['Layer']]
9+
_parameters = Dict[str, Optional[Parameter]]
10+
_tensors = Dict[str, Optional[t.Tensor]]
11+
12+
def __init__(self) -> None:
13+
super().__setattr__('_layers', OrderedDict())
14+
super().__setattr__('_parameters', OrderedDict())
15+
super().__setattr__('_tensors', OrderedDict())
16+
17+
def __call__(self, *args: Any, **kwds: Any) -> Any:
18+
pass
19+
20+
def register_parameter(self, name: str, param: Optional[Parameter]) -> None:
21+
if '_parameters' not in self.__dict__:
22+
raise AttributeError("cannot assign parameter before Module.__init__() call")
23+
elif not isinstance(name, str):
24+
raise TypeError(f"parameter name should be a string. Got {name}")
25+
elif '.' in name:
26+
raise KeyError("parameter name can't contain \".\"")
27+
elif name == '':
28+
raise KeyError("parameter name can't be empty string \"\"")
29+
elif hasattr(self, name) and name not in self._parameters:
30+
raise KeyError(f"attribute '{name}' already exists")
31+
elif not isinstance(param, Parameter) and param is not None:
32+
raise TypeError(f"cannot assign '{param}' object to parameter '{name}' "
33+
"(tensor_array.util.Parameter or None required)")
34+
else:
35+
self._parameters[name] = param
36+
37+
def register_tensor(self, name: str, param: Optional[t.Tensor]) -> None:
38+
if '_tensors' not in self.__dict__:
39+
raise AttributeError("cannot assign tensor before Module.__init__() call")
40+
elif not isinstance(name, str):
41+
raise TypeError(f"tensor name should be a string. Got {name}")
42+
elif '.' in name:
43+
raise KeyError("tensor name can't contain \".\"")
44+
elif name == '':
45+
raise KeyError("tensor name can't be empty string \"\"")
46+
elif hasattr(self, name) and name not in self._parameters:
47+
raise KeyError(f"attribute '{name}' already exists")
48+
elif not isinstance(param, t.Tensor) and param is not None:
49+
raise TypeError(f"cannot assign '{param}' object to parameter '{name}' "
50+
"(tensor_array.core.tensor2.Tensor or None required)")
51+
else:
52+
self._parameters[name] = param
53+
54+
def register_layer(self, name: str, layer: Optional['Layer']) -> None:
55+
if not isinstance(layer, Layer) and layer is not None:
56+
raise TypeError(f"{layer} is not a Layer subclass")
57+
elif not isinstance(name, str):
58+
raise TypeError(f"layer name should be a string. Got {name}")
59+
elif hasattr(self, name) and name not in self._layers:
60+
raise KeyError(f"attribute '{name}' already exists")
61+
elif '.' in name:
62+
raise KeyError(f"layer name can't contain \".\", got: {name}")
63+
elif name == '':
64+
raise KeyError("layer name can't be empty string \"\"")
65+
self._layers[name] = layer
66+
67+
def __setattr__(self, __name: str, __value: Any) -> None:
68+
def remove_from(*dicts_or_sets):
69+
for d in dicts_or_sets:
70+
if __name in d:
71+
if isinstance(d, dict):
72+
del d[__name]
73+
else:
74+
d.discard(__name)
75+
76+
params = self.__dict__.get('_parameters')
77+
layers = self.__dict__.get('_layers')
78+
tensors = self.__dict__.get('_tensors')
79+
if (params is not None and __name in params) or (layers is not None and __name in layers) or (tensors is not None and __name in tensors):
80+
raise TypeError(f"cannot assign '{__value}' as parameter '{__name}'")
81+
elif isinstance(__value, Parameter):
82+
if params is None:
83+
raise AttributeError("cannot assign parameters before Layer.__init__() call")
84+
remove_from(self.__dict__, self._layers, self._tensors)
85+
self.register_parameter(__name, __value)
86+
elif isinstance(__value, t.Tensor):
87+
if layers is None:
88+
raise AttributeError("cannot assign layers before Layer.__init__() call")
89+
remove_from(self.__dict__, self._parameters, self._layers)
90+
self.register_tensor(__name, __value)
91+
elif isinstance(__value, Layer):
92+
if tensors is None:
93+
raise AttributeError("cannot assign layers before Layer.__init__() call")
94+
remove_from(self.__dict__, self._parameters, self._tensors)
95+
self.register_layer(__name, __value)
96+
else:
97+
super().__setattr__(__name, __value)
98+
99+
def __getattr__(self, __name: str) -> Any:
100+
if '_parameters' in self.__dict__:
101+
_parameters = self.__dict__['_parameters']
102+
if __name in _parameters:
103+
return _parameters[__name]
104+
if '_tensors' in self.__dict__:
105+
_tensors = self.__dict__['_tensors']
106+
if __name in _tensors:
107+
return _tensors[__name]
108+
if '_layers' in self.__dict__:
109+
_layers = self.__dict__['_layers']
110+
if __name in _layers:
111+
return _layers[__name]
112+
return super().__getattr__(__name)
113+
114+
def __delattr__(self, __name: str) -> None:
115+
if __name in self._parameters:
116+
del self._parameters[__name]
117+
elif __name in self._buffers:
118+
del self._buffers[__name]
119+
elif __name in self._modules:
120+
del self._modules[__name]
121+
else:
122+
super().__delattr__(__name)

src/tensor_array/util/parameter.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from ..core.tensor2 import tensor2 as t
2+
3+
class Parameter:
4+
def __init__(self, tensor_param: t.Tensor) -> None:
5+
self.tensor_param = tensor_param
6+
7+
def update_grad(self):
8+
self.tensor_param -= self.tensor_param.get_grad().clone()

0 commit comments

Comments
 (0)