summaryrefslogtreecommitdiff
path: root/modules/codec/c++/data_math.hpp
blob: efdca7d4ccea64519f47a9a7a1ea7a0e08640662 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#pragma once

#include "data.hpp"
#include "schema_math.hpp"
#include "iterator.hpp"

#include <cmath>

namespace saw {
/*
template<typename T>
class data<schema::Quaternion<T>,encode::Native> {
public:
	using Schema = schema::Quaternion<T>;
private:
	data<schema::FixedArray<T,4u>,encode::Native> vals_;

	using NativeType = typename native_data_type<T>::type;
public:
	data() = default;

	data(data<T,encode::Native> i__, data<T,encode::Native> j__, data<T,encode::Native> k__, data<T,encode::Native> w__):
		vals_{i__,j__,k__,w__}
	{}

	constexpr void normalize() {
		data<T,encode::Native> norm{};

		for(data<schema::UInt64,encode::Native> i = 0u; i < vals_.size(); ++i){
			norm += vals_.at(i) * vals_.at(i);
		}

		norm.set(std::sqrt(norm.get()));

		for(data<schema::UInt64,encode::Native> i = 0u; i < vals_.size(); ++i){
			vals_.at(i) = vals_.at(i) / norm;
		}
	}

	constexpr data<T,encode::Native>& at(data<schema::UInt64,encode::Native> i){
		return vals_.at(i);
	}

	constexpr const data<T,encode::Native>& at(data<schema::UInt64,encode::Native> i) const {
		return vals_.at(i);
	}

	constexpr data<Schema, encode::Native> operator*(const data<schema::Quaternion,encode::Native>& rhs) const {
		data<Schema,encode::Native> mult;

		data<schema::UInt64,encode::Native> i_i{0u};
		data<schema::UInt64,encode::Native> j_i{1u};
		data<schema::UInt64,encode::Native> k_i{2u};
		data<schema::UInt64,encode::Native> w_i{3u};

		mult.at(i_i) = at(w_i) * rhs.at(i_i) + at(i_i) * rhs.at(w_i) + at(j_i) * rhs.at(k_i) - at(k_i) * rhs.at(j_i);
		
		mult.at(j_i) = at(w_i) * rhs.at(j_i) + at(j_i) * rhs.at(w_i) - at(i_i) * rhs.at(k_i) + at(k_i) * rhs.at(i_i);
		
		mult.at(k_i) = at(w_i) * rhs.at(k_i) + at(k_i) * rhs.at(w_i) + at(i_i) * rhs.at(j_i) - at(j_i) * rhs.at(i_i);

		mult.at(w_i) = at(w_i) * rhs.at(w_i) - at(i_i) * rhs.at(i_i) - at(j_i) * rhs.at(j_i) - at(k_i) * rhs.at(k_i);

		return mult;
	}
};
*/

template<typename Inner, uint64_t... Dims>
class data<schema::Tensor<Inner, Dims...>, encode::Native> {
public:
	using Schema = schema::Tensor<Inner, Dims...>;
	static constexpr uint64_t Rank = sizeof...(Dims);
private:
	data<schema::FixedArray<Inner, Dims...>, encode::Native> values_;
	//data<schema::Array<Inner,Schema::Rank>, encode::Native> values_;

public:
	/*
	data():
		values_{data<schema::FixedArray<schema::UInt64,sizeof...(Dims)>>{{data<schema::UInt64, encode::Native>{Dims}...}}}
	{}
	*/
	data() = default;

	data<Inner, encode::Native>& at(const data<schema::FixedArray<schema::UInt64, sizeof...(Dims)>, encode::Native>& index){
		return values_.at(index);
	}

	const data<Inner, encode::Native>& at(const data<schema::FixedArray<schema::UInt64, sizeof...(Dims)>, encode::Native>& index) const {
		return values_.at(index);
	}

	data<Inner, encode::Native>& operator()(const data<schema::FixedArray<schema::UInt64, sizeof...(Dims)>, encode::Native>& index){
		return values_.at(index);
	}

	const data<Inner, encode::Native>& operator()(const data<schema::FixedArray<schema::UInt64, sizeof...(Dims)>, encode::Native>& index) const {
		return values_.at(index);
	}

	data<schema::Tensor<Inner, Dims...>, encode::Native> operator+(const data<schema::Tensor<Inner, Dims...>, encode::Native>& rhs) {
		data<schema::Tensor<Inner, Dims...>, encode::Native> c;

		rank_iterator<Dims...>::in_fixed_bounds([&](const data<schema::FixedArray<schema::UInt64, sizeof...(Dims)>, encode::Native>& index) -> error_or<void>{
			c.at(index) = at(index) + rhs.at(index);
			return make_void();
		});

		return c;
	}

	data<schema::Tensor<Inner, Dims...>, encode::Native> operator-(const data<schema::Tensor<Inner, Dims...>, encode::Native>& rhs) {
		data<schema::Tensor<Inner, Dims...>, encode::Native> c;

		rank_iterator<Dims...>::in_fixed_bounds([&](const data<schema::FixedArray<schema::UInt64, sizeof...(Dims)>, encode::Native>& index) -> error_or<void>{
			c.at(index) = at(index) - rhs.at(index);
			return make_void();
		});

		return c;
	}
};

}