31 template<
typename T1,
typename T2 = T1>
38 using size_type = size_t;
39 using iterator =
typename std::vector<Type>::iterator;
40 using const_iterator =
typename std::vector<Type>::const_iterator;
47 Base_iterable(
size_t N)
54 Base_iterable(std::vector<Type>
const& t_elements)
59 Base_iterable(std::vector<Type>&& t_elements)
60 :elements(
std::move(t_elements))
67 Base_iterable(Base_iterable<T1, T2>
const&) =
default;
68 Base_iterable(Base_iterable<T1, T2>&&) =
default;
69 Base_iterable& operator=(Base_iterable<T1, T2>
const&) =
default;
70 Base_iterable& operator=(Base_iterable<T1, T2>&&) =
default;
77 return elements.empty();
81 return elements.size();
85 return elements.begin();
88 const_iterator begin()
const {
89 return elements.begin();
93 return elements.end();
96 const_iterator end()
const {
97 return elements.end();
100 Type& operator[](
size_t pos) {
101 return elements[pos];
104 Type operator[](
size_t pos)
const {
105 return elements[pos];
110 std::vector<Type> elements;
113 template<
typename T1,
typename T2 = T1>
114 class Vector:
public Base_iterable<T1, T2> {
118 using Type =
typename Base_iterable<T1, T2>::Type;
119 using size_type =
typename Base_iterable<T1, T2>::size_type;
120 using iterator =
typename Base_iterable<T1, T2>::iterator;
121 using const_iterator =
typename Base_iterable<T1, T2>::const_iterator;
124 :Base_iterable<T1, T2>(N)
127 Vector(std::vector<Type>
const& t_containor)
128 :Base_iterable<T1, T2>(t_containor)
131 Vector(std::vector<Type>&& t_containor)
132 :Base_iterable<T1, T2>(
std::move(t_containor))
138 Vector(Vector<T1, T2>
const&) =
default;
139 Vector(Vector<T1, T2>&&) =
default;
140 Vector& operator=(Vector<T1, T2>
const&) =
default;
141 Vector& operator=(Vector<T1, T2>&&) =
default;
143 int find(T1
const el)
const {
144 for (
auto iter = Base_iterable<T1, T2>::begin();
145 iter != Base_iterable<T1, T2>::end();
148 return std::distance(iter, Base_iterable<T1, T2>::begin());
152 Type& operator()(
size_t i) {
153 return this->elements[i];
156 Type operator()(
size_t i)
const {
157 return this->elements[i];
160 template<
class U1,
class U2>
163 Vector<U1, U2>
const& vec);
166 template<
class U1,
class U2>
168 Vector<U1, U2>
const& vec)
170 for (
const auto& el : vec)
171 if constexpr (std::is_same<U1, U2>::value)
174 out << U2(el) <<
'\n';
178 template<
typename T1,
typename T2 = T1>
179 class Matrix:
public Base_iterable<T1, T2> {
183 using Type =
typename Base_iterable<T1, T2>::Type;
184 using size_type =
typename Base_iterable<T1, T2>::size_type;
185 using iterator =
typename Base_iterable<T1, T2>::iterator;
186 using const_iterator =
typename Base_iterable<T1, T2>::const_iterator;
189 :Base_iterable<T1, T2>(M * M),
193 Matrix(std::vector<Type>
const& t_containor)
194 :Base_iterable<T1, T2>(t_containor),
195 N(t_containor.size())
198 Matrix(std::vector<Type>&& t_containor)
199 :Base_iterable<T1, T2>(
std::move(t_containor)),
200 N(t_containor.size())
206 Matrix(Matrix<T1, T2>
const&) =
default;
207 Matrix(Matrix<T1, T2>&&) =
default;
208 Matrix& operator=(Matrix<T1, T2>
const&) =
default;
209 Matrix& operator=(Matrix<T1, T2>&&) =
default;
212 Base_iterable<T1, T2>::clear();
216 size_type size()
const {
220 Type& operator()(
size_t i,
size_t j) {
221 return this->elements[this->size()*i + j];
224 Type operator()(
size_t i,
size_t j)
const {
225 return this->elements[this->size()*i + j];
228 template<
class U1,
typename U2>
231 Matrix<U1, U2>
const& mat);
238 template<
class U1,
typename U2>
240 Matrix<U1, U2>
const& mat)
242 for (
size_t i = 0; i != mat.size(); ++i) {
243 for (
size_t j = 0; j != mat.size(); ++j)
244 if constexpr (std::is_same<U1, U2>::value)
245 out << mat(i, j) <<
" ";
247 out << U2(mat(i, j)) <<
" ";
253 template<
class T1,
class T2,
class T3>
254 Vector<T1, T2>
operator+(Vector<T1, T2>
const& vec,
257 Vector<T1, T2> copy(vec);
258 for (
auto icopy = copy.begin(), ivec = vec.begin();
266 template<
class T1,
class T2,
class T3>
268 Vector<T1, T2>
const& vec)
270 Vector<T1, T2> copy(vec);
271 for (
auto icopy = copy.begin(), ivec = vec.begin();
279 template<
class T1,
class T2,
class T3>
280 Vector<T1, T2>
operator*(Vector<T1, T2>
const& vec,
283 Vector<T1, T2> copy(vec);
284 for (
auto icopy = copy.begin(), ivec = vec.begin();
292 template<
class T1,
class T2,
class T3>
294 Vector<T1, T2>
const& vec)
296 Vector<T1, T2> copy(vec);
297 for (
auto icopy = copy.begin(), ivec = vec.begin();
306 template<
class T1,
class T2,
class T3>
307 Matrix<T1, T2>
operator+(Matrix<T1, T2>
const& vec,
310 Matrix<T1, T2> copy(vec);
311 for (
auto icopy = copy.begin(), ivec = vec.begin();
319 template<
class T1,
class T2,
class T3>
321 Matrix<T1, T2>
const& vec)
323 Matrix<T1, T2> copy(vec);
324 for (
auto icopy = copy.begin(), ivec = vec.begin();
332 template<
class T1,
class T2,
class T3>
333 Matrix<T1, T2>
operator*(Matrix<T1, T2>
const& vec,
336 Matrix<T1, T2> copy(vec);
337 for (
auto icopy = copy.begin(), ivec = vec.begin();
345 template<
class T1,
class T2,
class T3>
347 Matrix<T1, T2>
const& vec)
349 Matrix<T1, T2> copy(vec);
350 for (
auto icopy = copy.begin(), ivec = vec.begin();
358 template<
class T1,
class T2,
class T3,
class T4>
360 Vector<T3, T4>
const& right)
362 assert(left.size() == right.size());
364 for (
auto ileft = left.begin(), iright = right.begin();
367 init += (*ileft) * (*iright);
372 template<
class T1,
class T2,
class T3,
class T4>
373 Vector<T1, T2>
operator*(Vector<T1, T2>
const& left,
374 Matrix<T3, T4>
const& right)
376 assert(left.size() == right.size());
377 Vector<T1, T2> init(left.size());
378 auto imat = right.begin();
380 for (
auto ivec = left.begin(); ivec != left.end(); ++ivec)
381 for (
auto ires = init.begin(); ires != init.end(); ++ires, ++imat)
382 *ires += (*imat) * (*ivec);
387 template<
class T1,
class T2,
class T3,
class T4>
388 Vector<T1, T2>
operator*(Matrix<T1, T2>
const& left,
389 Vector<T3, T4>
const& right)
391 assert(left.size() == right.size());
392 Vector<T1, T2> init(right.size());
393 auto imat = left.begin();
395 for (
auto ires = init.begin(); ires != init.end(); ++ires)
396 for (
auto ivec = right.begin(); ivec != right.end(); ++ivec, ++imat)
397 *ires += (*imat) * (*ivec);
402 template<
class U1,
class U2>
403 Matrix<U1, U2>
operator*(Matrix<U1, U2>
const& A,
404 Matrix<U1, U2>
const& B)
406 assert(A.size() == B.size());
407 const size_t s = A.size();
409 for (
size_t i = 0; i != s; ++i)
410 for (
size_t j = 0; j != s; ++j)
411 for (
size_t k = 0; k != s; ++k)
412 C(i, j) += A(i, k) * B(k, j);
417 template<
class U1,
class U2>
418 Matrix<U1, U2>& operator*=(Matrix<U1, U2>& A,
419 Matrix<U1, U2>
const& B)
421 return A = std::move(A * B);
424 template<
class U1,
class U2,
class Int_type>
425 Matrix<U1, U2> pow(Matrix<U1, U2>
const& mat, Int_type value)
428 Matrix<U1, U2> res = mat;
429 for (
size_t i = 1; i < value; ++i)
std::ostream & operator<<(std::ostream &fout, csl::Type type)
Expr operator+(const Expr &a, const Expr &b)
Expr operator*(const Expr &a, const Expr &b)