#pragma once #include "data_math.hpp" namespace saw { namespace math { /* template data norm_2(const data& d){ return {}; } */ template data, Encoding> dot(const data, Encoding>& left, const data, Encoding>& right){ data,Encoding> val; auto& inner = val({}); for(uint64_t i = 0u; i < D; ++i){ inner = inner + left({{i}}) * right({{i}}); } return val; } template data,Encoding> sqrt(const data,Encoding>& inp){ data,Encoding> out; out.at({}).set(std::sqrt(inp.at({}).get())); return out; } template data, Encoding> normalize(const data>& input ) { auto inp_dot = dot(input,input); auto sqrt_inp_dot = sqrt(inp_dot); saw::data, Encoding> out; out.at({{0u}}).set(out.at({{0u}}).get() / sqrt_inp_dot.at({}).get()); out.at({{1u}}).set(out.at({{1u}}).get() / sqrt_inp_dot.at({}).get()); return out; } } }