Skip to content

Commit e65644a

Browse files
test
1 parent 3adcc48 commit e65644a

File tree

11 files changed

+85
-47
lines changed

11 files changed

+85
-47
lines changed

include/tensor_bind.cc

+47-17
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <pybind11/pybind11.h>
44
#include <pybind11/numpy.h>
55
#include <pybind11/operators.h>
6+
#include <pybind11/stl.h>
67

78
using namespace tensor_array::value;
89
using namespace tensor_array::datatype;
@@ -35,9 +36,9 @@ pybind11::dtype get_py_type(const std::type_info& info)
3536
throw std::exception();
3637
}
3738

38-
pybind11::array convert_tensor_to_numpy(const Tensor& tensor)
39+
pybind11::array convert_tensor_to_numpy(const Tensor& self)
3940
{
40-
const TensorBase& base_tensor = tensor.get_buffer().change_device({tensor_array::devices::CPU, 0});
41+
const TensorBase& base_tensor = self.get_buffer().change_device({tensor_array::devices::CPU, 0});
4142
std::vector<pybind11::size_t> shape_vec(base_tensor.shape().size());
4243
std::transform
4344
(
@@ -54,15 +55,15 @@ pybind11::array convert_tensor_to_numpy(const Tensor& tensor)
5455
return pybind11::array(ty1, shape_vec, base_tensor.data());
5556
}
5657

57-
Tensor python_tuple_slice(const Tensor& t, pybind11::tuple tuple_slice)
58+
Tensor python_tuple_slice(const Tensor& self, pybind11::tuple tuple_slice)
5859
{
5960
std::vector<Tensor::Slice> t_slices;
6061
for (size_t i = 0; i < tuple_slice.size(); i++)
6162
{
6263
ssize_t start, stop, step;
6364
ssize_t length;
6465
pybind11::slice py_slice = tuple_slice[i].cast<pybind11::slice>();
65-
if (!py_slice.compute(t.get_buffer().shape().begin()[i], &start, &stop, &step, &length))
66+
if (!py_slice.compute(self.get_buffer().shape().begin()[i], &start, &stop, &step, &length))
6667
throw std::runtime_error("Invalid slice");
6768
t_slices.insert
6869
(
@@ -75,17 +76,17 @@ Tensor python_tuple_slice(const Tensor& t, pybind11::tuple tuple_slice)
7576
}
7677
);
7778
}
78-
return t[tensor_array::wrapper::initializer_wrapper(t_slices.begin().operator->(), t_slices.end().operator->())];
79+
return self[tensor_array::wrapper::initializer_wrapper(t_slices.begin().operator->(), t_slices.end().operator->())];
7980
}
8081

81-
Tensor python_slice(const Tensor& t, pybind11::slice py_slice)
82+
Tensor python_slice(const Tensor& self, pybind11::slice py_slice)
8283
{
8384
std::vector<Tensor::Slice> t_slices;
8485
ssize_t start, stop, step;
8586
ssize_t length;
86-
if (!py_slice.compute(t.get_buffer().shape().begin()[0], &start, &stop, &step, &length))
87+
if (!py_slice.compute(self.get_buffer().shape().begin()[0], &start, &stop, &step, &length))
8788
throw std::runtime_error("Invalid slice");
88-
return t
89+
return self
8990
[
9091
{
9192
Tensor::Slice
@@ -98,25 +99,43 @@ Tensor python_slice(const Tensor& t, pybind11::slice py_slice)
9899
];
99100
}
100101

101-
Tensor python_index(const Tensor& t, unsigned int i)
102+
Tensor python_index(const Tensor& self, unsigned int i)
102103
{
103-
return t[i];
104+
return self[i];
104105
}
105106

106-
std::size_t python_len(const Tensor& t)
107+
std::size_t python_len(const Tensor& self)
107108
{
108-
std::initializer_list<unsigned int> shape_list = t.get_buffer().shape();
109+
std::initializer_list<unsigned int> shape_list = self.get_buffer().shape();
109110
return shape_list.size() != 0 ? shape_list.begin()[0]: 1U;
110111
}
111112

112-
pybind11::str tensor_to_string(const Tensor& t)
113+
pybind11::str tensor_to_string(const Tensor& self)
113114
{
114-
return pybind11::repr(convert_tensor_to_numpy(t));
115+
return pybind11::repr(convert_tensor_to_numpy(self));
115116
}
116117

117-
Tensor tensor_cast_1(const Tensor& t, DataType dtype)
118+
Tensor tensor_cast_1(const Tensor& self, DataType dtype)
118119
{
119-
return t.tensor_cast(warp_type(dtype));
120+
return self.tensor_cast(warp_type(dtype));
121+
}
122+
123+
pybind11::tuple tensor_shape(const Tensor& self)
124+
{
125+
return pybind11::cast(std::vector(self.get_buffer().shape()));
126+
}
127+
128+
Tensor tensor_copying(const Tensor& self)
129+
{
130+
return self;
131+
}
132+
133+
Tensor py_zeros(pybind11::tuple shape_tuple, DataType dtype)
134+
{
135+
std::vector<unsigned int> shape_vec;
136+
for (auto& it: shape_tuple)
137+
shape_vec.push_back(it.cast<unsigned int>());
138+
return TensorBase(warp_type(dtype), shape_vec);
120139
}
121140

122141
PYBIND11_MODULE(tensor2, m)
@@ -136,9 +155,18 @@ PYBIND11_MODULE(tensor2, m)
136155
.value("U_INT_32", U_INT_32)
137156
.value("U_INT_64", U_INT_64)
138157
.export_values();
158+
159+
m.def
160+
(
161+
"zeros",
162+
&py_zeros,
163+
pybind11::arg("shape"),
164+
pybind11::arg("dtype") = S_INT_32
165+
);
139166

140167
pybind11::class_<Tensor>(m, "Tensor")
141168
.def(pybind11::init())
169+
.def(pybind11::init(&tensor_copying))
142170
.def(pybind11::init(&convert_numpy_to_tensor_base<float>))
143171
.def(pybind11::self + pybind11::self)
144172
.def(pybind11::self - pybind11::self)
@@ -176,11 +204,13 @@ PYBIND11_MODULE(tensor2, m)
176204
.def("matmul", &matmul)
177205
.def("condition", &condition)
178206
.def("numpy", &convert_tensor_to_numpy)
207+
.def("shape", &tensor_shape)
179208
.def("__getitem__", &python_index)
180209
.def("__getitem__", &python_slice)
181210
.def("__getitem__", &python_tuple_slice)
182211
.def("__len__", &python_len)
183212
.def("__matmul__", &matmul)
184213
.def("__rmatmul__", &matmul)
185-
.def("__repr__", &tensor_to_string);
214+
.def("__repr__", &tensor_to_string)
215+
.def("__copy__", &tensor_copying);
186216
}

src/main.py

+6
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
from tensor_array.core import Tensor
2+
from tensor_array.layers.util import Linear
23

34
print("hello")
45

56
t1 = Tensor([[1, 2, 3], [4, 5, 6]])
67
t2 = t1.clone()
78
print("tensor len", t1.__len__())
9+
print("tensor shape", t1.shape())
810
print(t1)
911
print(t1.__dir__())
1012
t1 = t1[::]
@@ -17,3 +19,7 @@
1719
print(t3)
1820

1921
print(t1 != t3)
22+
23+
layer1 = Linear(3)
24+
25+
print(layer1(Tensor([[1, 2, 3], [4, 5, 6]])))

src/tensor_array/__init__.py

Whitespace-only changes.

src/tensor_array/core/__init__.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
from tensor_array.core.tensor2 import Tensor
1+
from tensor_array.core.tensor2 import Tensor
2+
from tensor_array.core.tensor2 import zeros
-935 KB
Binary file not shown.

src/tensor_array/core/tensor2.so

160 KB
Binary file not shown.

src/tensor_array/layers/__init__.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
from layer import Layer
2-
from parameter import Parameter
1+
from .layer import Layer
2+
from .parameter import Parameter

src/tensor_array/layers/layer.py

+14-14
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from collections import OrderedDict, namedtuple
22
from typing import Union, Tuple, Any, Callable, Iterator, Set, Optional, overload, TypeVar, Mapping, Dict, List
33
from typing import Any
4-
from tensor_array.core import tensor2 as t
4+
from tensor_array.core import Tensor
55
from .parameter import Parameter
66

77
class Layer:
@@ -11,7 +11,7 @@ class Layer:
1111
is_running: bool
1212
_layers: Dict[str, Optional['Layer']]
1313
_parameters: Dict[str, Optional[Parameter]]
14-
_tensors: Dict[str, Optional[t.Tensor]]
14+
_tensors: Dict[str, Optional[Tensor]]
1515

1616
def __init__(self) -> None:
1717
super().__setattr__('is_running', False)
@@ -20,10 +20,10 @@ def __init__(self) -> None:
2020
super().__setattr__('_tensors', OrderedDict())
2121

2222
def __call__(self, *args: Any, **kwds: Any) -> Any:
23-
if not super().__getattr__('is_running'):
24-
self.init_value(args, kwds)
23+
if not self.__dict__['is_running']:
24+
self.init_value(*args, **kwds)
2525
super().__setattr__('is_running', True)
26-
self.calculate(args, kwds)
26+
self.calculate(*args, **kwds)
2727

2828
def init_value(self, *args: Any, **kwds: Any) -> Any:
2929
pass
@@ -48,7 +48,7 @@ def register_parameter(self, name: str, param: Optional[Parameter]) -> None:
4848
else:
4949
self._parameters[name] = param
5050

51-
def register_tensor(self, name: str, param: Optional[t.Tensor]) -> None:
51+
def register_tensor(self, name: str, param: Optional[Tensor]) -> None:
5252
if '_tensors' not in self.__dict__:
5353
raise AttributeError("cannot assign tensor before Module.__init__() call")
5454
elif not isinstance(name, str):
@@ -57,13 +57,13 @@ def register_tensor(self, name: str, param: Optional[t.Tensor]) -> None:
5757
raise KeyError("tensor name can't contain \".\"")
5858
elif name == '':
5959
raise KeyError("tensor name can't be empty string \"\"")
60-
elif hasattr(self, name) and name not in self._parameters:
60+
elif hasattr(self, name) and name not in self._tensors:
6161
raise KeyError(f"attribute '{name}' already exists")
62-
elif not isinstance(param, t.Tensor) and param is not None:
62+
elif not isinstance(param, Tensor) and param is not None:
6363
raise TypeError(f"cannot assign '{param}' object to parameter '{name}' "
6464
"(tensor_array.core.tensor2.Tensor or None required)")
6565
else:
66-
self._parameters[name] = param
66+
self._tensors[name] = param
6767

6868
def register_layer(self, name: str, layer: Optional['Layer']) -> None:
6969
if not isinstance(layer, Layer) and layer is not None:
@@ -97,7 +97,7 @@ def remove_from(*dicts_or_sets):
9797
raise AttributeError("cannot assign parameters before Layer.__init__() call")
9898
remove_from(self.__dict__, self._layers, self._tensors)
9999
self.register_parameter(__name, __value)
100-
elif isinstance(__value, t.Tensor):
100+
elif isinstance(__value, Tensor):
101101
if layers is None:
102102
raise AttributeError("cannot assign layers before Layer.__init__() call")
103103
remove_from(self.__dict__, self._parameters, self._layers)
@@ -128,9 +128,9 @@ def __getattr__(self, __name: str) -> Any:
128128
def __delattr__(self, __name: str) -> None:
129129
if __name in self._parameters:
130130
del self._parameters[__name]
131-
elif __name in self._buffers:
132-
del self._buffers[__name]
133-
elif __name in self._modules:
134-
del self._modules[__name]
131+
elif __name in self._tensors:
132+
del self._tensors[__name]
133+
elif __name in self._layers:
134+
del self._layers[__name]
135135
else:
136136
super().__delattr__(__name)

src/tensor_array/layers/parameter.py

+3-7
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
1-
from tensor_array.core.tensor2 import tensor2 as t
1+
from tensor_array.core import Tensor
22

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()
3+
class Parameter(Tensor):
4+
pass
+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from tensor_array.layers.util.linear import Linear
+10-6
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,22 @@
1-
from tensor_array.layers import Layer
2-
from tensor_array.layers import Parameter
1+
from .. import Layer
2+
from .. import Parameter
33
from tensor_array.core import Tensor
4+
from tensor_array.core import zeros
45
from typing import Any
56

67

78
class Linear(Layer):
89
def __init__(self, bias) -> None:
9-
super(self)
10+
super(Linear, self).__init__()
1011
self.bias_shape = bias
11-
self.b = Parameter(Tensor(shape = (bias)))
12+
self.b = Parameter(zeros(shape = (bias,)))
1213

1314
def init_value(self, t):
14-
self.w = Parameter(Tensor(shape = (t.shape(-1), self.bias_shape)))
15+
self.w = Parameter(zeros(shape = (t.shape()[-1], self.bias_shape)))
1516

1617
def calculate(self, t):
17-
return self.w @ t + self.b
18+
print("t", t)
19+
print("w", self.w)
20+
print("b", self.b)
21+
return t @ self.w + self.b
1822

0 commit comments

Comments
 (0)