#ifndef BNN_BNN_TEMPLATES_CORE_TENSOR_OPS_HPP
#define BNN_BNN_TEMPLATES_CORE_TENSOR_OPS_HPP

template TensorCPU<bool>* add<bool>(TensorCPU<bool>* x, TensorCPU<bool>* y);
template TensorCPU<short>* add<short>(TensorCPU<short>* x, TensorCPU<short>* y);
template TensorCPU<unsigned short>* add<unsigned short>(TensorCPU<unsigned short>* x, TensorCPU<unsigned short>* y);
template TensorCPU<int>* add<int>(TensorCPU<int>* x, TensorCPU<int>* y);
template TensorCPU<unsigned int>* add<unsigned int>(TensorCPU<unsigned int>* x, TensorCPU<unsigned int>* y);
template TensorCPU<long>* add<long>(TensorCPU<long>* x, TensorCPU<long>* y);
template TensorCPU<unsigned long>* add<unsigned long>(TensorCPU<unsigned long>* x, TensorCPU<unsigned long>* y);
template TensorCPU<long long>* add<long long>(TensorCPU<long long>* x, TensorCPU<long long>* y);
template TensorCPU<unsigned long long>* add<unsigned long long>(TensorCPU<unsigned long long>* x, TensorCPU<unsigned long long>* y);
template TensorCPU<float>* add<float>(TensorCPU<float>* x, TensorCPU<float>* y);
template TensorCPU<double>* add<double>(TensorCPU<double>* x, TensorCPU<double>* y);
template TensorCPU<long double>* add<long double>(TensorCPU<long double>* x, TensorCPU<long double>* y);
template TensorCPU<bool>* subtract<bool>(TensorCPU<bool>* x, TensorCPU<bool>* y);
template TensorCPU<short>* subtract<short>(TensorCPU<short>* x, TensorCPU<short>* y);
template TensorCPU<unsigned short>* subtract<unsigned short>(TensorCPU<unsigned short>* x, TensorCPU<unsigned short>* y);
template TensorCPU<int>* subtract<int>(TensorCPU<int>* x, TensorCPU<int>* y);
template TensorCPU<unsigned int>* subtract<unsigned int>(TensorCPU<unsigned int>* x, TensorCPU<unsigned int>* y);
template TensorCPU<long>* subtract<long>(TensorCPU<long>* x, TensorCPU<long>* y);
template TensorCPU<unsigned long>* subtract<unsigned long>(TensorCPU<unsigned long>* x, TensorCPU<unsigned long>* y);
template TensorCPU<long long>* subtract<long long>(TensorCPU<long long>* x, TensorCPU<long long>* y);
template TensorCPU<unsigned long long>* subtract<unsigned long long>(TensorCPU<unsigned long long>* x, TensorCPU<unsigned long long>* y);
template TensorCPU<float>* subtract<float>(TensorCPU<float>* x, TensorCPU<float>* y);
template TensorCPU<double>* subtract<double>(TensorCPU<double>* x, TensorCPU<double>* y);
template TensorCPU<long double>* subtract<long double>(TensorCPU<long double>* x, TensorCPU<long double>* y);
template TensorCPU<bool>* multiply<bool>(TensorCPU<bool>* x, TensorCPU<bool>* y);
template TensorCPU<short>* multiply<short>(TensorCPU<short>* x, TensorCPU<short>* y);
template TensorCPU<unsigned short>* multiply<unsigned short>(TensorCPU<unsigned short>* x, TensorCPU<unsigned short>* y);
template TensorCPU<int>* multiply<int>(TensorCPU<int>* x, TensorCPU<int>* y);
template TensorCPU<unsigned int>* multiply<unsigned int>(TensorCPU<unsigned int>* x, TensorCPU<unsigned int>* y);
template TensorCPU<long>* multiply<long>(TensorCPU<long>* x, TensorCPU<long>* y);
template TensorCPU<unsigned long>* multiply<unsigned long>(TensorCPU<unsigned long>* x, TensorCPU<unsigned long>* y);
template TensorCPU<long long>* multiply<long long>(TensorCPU<long long>* x, TensorCPU<long long>* y);
template TensorCPU<unsigned long long>* multiply<unsigned long long>(TensorCPU<unsigned long long>* x, TensorCPU<unsigned long long>* y);
template TensorCPU<float>* multiply<float>(TensorCPU<float>* x, TensorCPU<float>* y);
template TensorCPU<double>* multiply<double>(TensorCPU<double>* x, TensorCPU<double>* y);
template TensorCPU<long double>* multiply<long double>(TensorCPU<long double>* x, TensorCPU<long double>* y);
template TensorCPU<bool>* exp<bool>(TensorCPU<bool>* x);
template TensorCPU<short>* exp<short>(TensorCPU<short>* x);
template TensorCPU<unsigned short>* exp<unsigned short>(TensorCPU<unsigned short>* x);
template TensorCPU<int>* exp<int>(TensorCPU<int>* x);
template TensorCPU<unsigned int>* exp<unsigned int>(TensorCPU<unsigned int>* x);
template TensorCPU<long>* exp<long>(TensorCPU<long>* x);
template TensorCPU<unsigned long>* exp<unsigned long>(TensorCPU<unsigned long>* x);
template TensorCPU<long long>* exp<long long>(TensorCPU<long long>* x);
template TensorCPU<unsigned long long>* exp<unsigned long long>(TensorCPU<unsigned long long>* x);
template TensorCPU<float>* exp<float>(TensorCPU<float>* x);
template TensorCPU<double>* exp<double>(TensorCPU<double>* x);
template TensorCPU<long double>* exp<long double>(TensorCPU<long double>* x);
template TensorCPU<bool>* log<bool>(TensorCPU<bool>* x);
template TensorCPU<short>* log<short>(TensorCPU<short>* x);
template TensorCPU<unsigned short>* log<unsigned short>(TensorCPU<unsigned short>* x);
template TensorCPU<int>* log<int>(TensorCPU<int>* x);
template TensorCPU<unsigned int>* log<unsigned int>(TensorCPU<unsigned int>* x);
template TensorCPU<long>* log<long>(TensorCPU<long>* x);
template TensorCPU<unsigned long>* log<unsigned long>(TensorCPU<unsigned long>* x);
template TensorCPU<long long>* log<long long>(TensorCPU<long long>* x);
template TensorCPU<unsigned long long>* log<unsigned long long>(TensorCPU<unsigned long long>* x);
template TensorCPU<float>* log<float>(TensorCPU<float>* x);
template TensorCPU<double>* log<double>(TensorCPU<double>* x);
template TensorCPU<long double>* log<long double>(TensorCPU<long double>* x);
template TensorCPU<bool>* rectifier<bool>(TensorCPU<bool>* x);
template TensorCPU<short>* rectifier<short>(TensorCPU<short>* x);
template TensorCPU<unsigned short>* rectifier<unsigned short>(TensorCPU<unsigned short>* x);
template TensorCPU<int>* rectifier<int>(TensorCPU<int>* x);
template TensorCPU<unsigned int>* rectifier<unsigned int>(TensorCPU<unsigned int>* x);
template TensorCPU<long>* rectifier<long>(TensorCPU<long>* x);
template TensorCPU<unsigned long>* rectifier<unsigned long>(TensorCPU<unsigned long>* x);
template TensorCPU<long long>* rectifier<long long>(TensorCPU<long long>* x);
template TensorCPU<unsigned long long>* rectifier<unsigned long long>(TensorCPU<unsigned long long>* x);
template TensorCPU<float>* rectifier<float>(TensorCPU<float>* x);
template TensorCPU<double>* rectifier<double>(TensorCPU<double>* x);
template TensorCPU<long double>* rectifier<long double>(TensorCPU<long double>* x);
template TensorCPU<bool>* heaviside<bool>(TensorCPU<bool>* x);
template TensorCPU<short>* heaviside<short>(TensorCPU<short>* x);
template TensorCPU<unsigned short>* heaviside<unsigned short>(TensorCPU<unsigned short>* x);
template TensorCPU<int>* heaviside<int>(TensorCPU<int>* x);
template TensorCPU<unsigned int>* heaviside<unsigned int>(TensorCPU<unsigned int>* x);
template TensorCPU<long>* heaviside<long>(TensorCPU<long>* x);
template TensorCPU<unsigned long>* heaviside<unsigned long>(TensorCPU<unsigned long>* x);
template TensorCPU<long long>* heaviside<long long>(TensorCPU<long long>* x);
template TensorCPU<unsigned long long>* heaviside<unsigned long long>(TensorCPU<unsigned long long>* x);
template TensorCPU<float>* heaviside<float>(TensorCPU<float>* x);
template TensorCPU<double>* heaviside<double>(TensorCPU<double>* x);
template TensorCPU<long double>* heaviside<long double>(TensorCPU<long double>* x);
template void fill<bool>(TensorCPU<bool>* x, bool val);
template void fill<short>(TensorCPU<short>* x, short val);
template void fill<unsigned short>(TensorCPU<unsigned short>* x, unsigned short val);
template void fill<int>(TensorCPU<int>* x, int val);
template void fill<unsigned int>(TensorCPU<unsigned int>* x, unsigned int val);
template void fill<long>(TensorCPU<long>* x, long val);
template void fill<unsigned long>(TensorCPU<unsigned long>* x, unsigned long val);
template void fill<long long>(TensorCPU<long long>* x, long long val);
template void fill<unsigned long long>(TensorCPU<unsigned long long>* x, unsigned long long val);
template void fill<float>(TensorCPU<float>* x, float val);
template void fill<double>(TensorCPU<double>* x, double val);
template void fill<long double>(TensorCPU<long double>* x, long double val);
template void copy<bool>(TensorCPU<bool>* dest, TensorCPU<bool>* src);
template void copy<short>(TensorCPU<short>* dest, TensorCPU<short>* src);
template void copy<unsigned short>(TensorCPU<unsigned short>* dest, TensorCPU<unsigned short>* src);
template void copy<int>(TensorCPU<int>* dest, TensorCPU<int>* src);
template void copy<unsigned int>(TensorCPU<unsigned int>* dest, TensorCPU<unsigned int>* src);
template void copy<long>(TensorCPU<long>* dest, TensorCPU<long>* src);
template void copy<unsigned long>(TensorCPU<unsigned long>* dest, TensorCPU<unsigned long>* src);
template void copy<long long>(TensorCPU<long long>* dest, TensorCPU<long long>* src);
template void copy<unsigned long long>(TensorCPU<unsigned long long>* dest, TensorCPU<unsigned long long>* src);
template void copy<float>(TensorCPU<float>* dest, TensorCPU<float>* src);
template void copy<double>(TensorCPU<double>* dest, TensorCPU<double>* src);
template void copy<long double>(TensorCPU<long double>* dest, TensorCPU<long double>* src);
template TensorCPU<bool>* sum<bool>(TensorCPU<bool>* x, int axis);
template TensorCPU<short>* sum<short>(TensorCPU<short>* x, int axis);
template TensorCPU<unsigned short>* sum<unsigned short>(TensorCPU<unsigned short>* x, int axis);
template TensorCPU<int>* sum<int>(TensorCPU<int>* x, int axis);
template TensorCPU<unsigned int>* sum<unsigned int>(TensorCPU<unsigned int>* x, int axis);
template TensorCPU<long>* sum<long>(TensorCPU<long>* x, int axis);
template TensorCPU<unsigned long>* sum<unsigned long>(TensorCPU<unsigned long>* x, int axis);
template TensorCPU<long long>* sum<long long>(TensorCPU<long long>* x, int axis);
template TensorCPU<unsigned long long>* sum<unsigned long long>(TensorCPU<unsigned long long>* x, int axis);
template TensorCPU<float>* sum<float>(TensorCPU<float>* x, int axis);
template TensorCPU<double>* sum<double>(TensorCPU<double>* x, int axis);
template TensorCPU<long double>* sum<long double>(TensorCPU<long double>* x, int axis);
template TensorCPU<bool>* divide<bool>(TensorCPU<bool>* x, bool divisor);
template TensorCPU<short>* divide<short>(TensorCPU<short>* x, short divisor);
template TensorCPU<unsigned short>* divide<unsigned short>(TensorCPU<unsigned short>* x, unsigned short divisor);
template TensorCPU<int>* divide<int>(TensorCPU<int>* x, int divisor);
template TensorCPU<unsigned int>* divide<unsigned int>(TensorCPU<unsigned int>* x, unsigned int divisor);
template TensorCPU<long>* divide<long>(TensorCPU<long>* x, long divisor);
template TensorCPU<unsigned long>* divide<unsigned long>(TensorCPU<unsigned long>* x, unsigned long divisor);
template TensorCPU<long long>* divide<long long>(TensorCPU<long long>* x, long long divisor);
template TensorCPU<unsigned long long>* divide<unsigned long long>(TensorCPU<unsigned long long>* x, unsigned long long divisor);
template TensorCPU<float>* divide<float>(TensorCPU<float>* x, float divisor);
template TensorCPU<double>* divide<double>(TensorCPU<double>* x, double divisor);
template TensorCPU<long double>* divide<long double>(TensorCPU<long double>* x, long double divisor);
template TensorCPU<bool>* divide<bool>(TensorCPU<bool>* x, TensorCPU<bool>* y);
template TensorCPU<short>* divide<short>(TensorCPU<short>* x, TensorCPU<short>* y);
template TensorCPU<unsigned short>* divide<unsigned short>(TensorCPU<unsigned short>* x, TensorCPU<unsigned short>* y);
template TensorCPU<int>* divide<int>(TensorCPU<int>* x, TensorCPU<int>* y);
template TensorCPU<unsigned int>* divide<unsigned int>(TensorCPU<unsigned int>* x, TensorCPU<unsigned int>* y);
template TensorCPU<long>* divide<long>(TensorCPU<long>* x, TensorCPU<long>* y);
template TensorCPU<unsigned long>* divide<unsigned long>(TensorCPU<unsigned long>* x, TensorCPU<unsigned long>* y);
template TensorCPU<long long>* divide<long long>(TensorCPU<long long>* x, TensorCPU<long long>* y);
template TensorCPU<unsigned long long>* divide<unsigned long long>(TensorCPU<unsigned long long>* x, TensorCPU<unsigned long long>* y);
template TensorCPU<float>* divide<float>(TensorCPU<float>* x, TensorCPU<float>* y);
template TensorCPU<double>* divide<double>(TensorCPU<double>* x, TensorCPU<double>* y);
template TensorCPU<long double>* divide<long double>(TensorCPU<long double>* x, TensorCPU<long double>* y);
template TensorCPU<bool>* one_hot<bool>(TensorCPU<bool>* x, bool on_value, bool off_value, unsigned depth);
template TensorCPU<short>* one_hot<short>(TensorCPU<short>* x, short on_value, short off_value, unsigned depth);
template TensorCPU<unsigned short>* one_hot<unsigned short>(TensorCPU<unsigned short>* x, unsigned short on_value, unsigned short off_value, unsigned depth);
template TensorCPU<int>* one_hot<int>(TensorCPU<int>* x, int on_value, int off_value, unsigned depth);
template TensorCPU<unsigned int>* one_hot<unsigned int>(TensorCPU<unsigned int>* x, unsigned int on_value, unsigned int off_value, unsigned depth);
template TensorCPU<long>* one_hot<long>(TensorCPU<long>* x, long on_value, long off_value, unsigned depth);
template TensorCPU<unsigned long>* one_hot<unsigned long>(TensorCPU<unsigned long>* x, unsigned long on_value, unsigned long off_value, unsigned depth);
template TensorCPU<long long>* one_hot<long long>(TensorCPU<long long>* x, long long on_value, long long off_value, unsigned depth);
template TensorCPU<unsigned long long>* one_hot<unsigned long long>(TensorCPU<unsigned long long>* x, unsigned long long on_value, unsigned long long off_value, unsigned depth);
template TensorCPU<float>* one_hot<float>(TensorCPU<float>* x, float on_value, float off_value, unsigned depth);
template TensorCPU<double>* one_hot<double>(TensorCPU<double>* x, double on_value, double off_value, unsigned depth);
template TensorCPU<long double>* one_hot<long double>(TensorCPU<long double>* x, long double on_value, long double off_value, unsigned depth);
template TensorCPU<bool>* matmul<bool>(TensorCPU<bool>* x, TensorCPU<bool>* y, bool transpose_x, bool transpose_y);
template TensorCPU<short>* matmul<short>(TensorCPU<short>* x, TensorCPU<short>* y, bool transpose_x, bool transpose_y);
template TensorCPU<unsigned short>* matmul<unsigned short>(TensorCPU<unsigned short>* x, TensorCPU<unsigned short>* y, bool transpose_x, bool transpose_y);
template TensorCPU<int>* matmul<int>(TensorCPU<int>* x, TensorCPU<int>* y, bool transpose_x, bool transpose_y);
template TensorCPU<unsigned int>* matmul<unsigned int>(TensorCPU<unsigned int>* x, TensorCPU<unsigned int>* y, bool transpose_x, bool transpose_y);
template TensorCPU<long>* matmul<long>(TensorCPU<long>* x, TensorCPU<long>* y, bool transpose_x, bool transpose_y);
template TensorCPU<unsigned long>* matmul<unsigned long>(TensorCPU<unsigned long>* x, TensorCPU<unsigned long>* y, bool transpose_x, bool transpose_y);
template TensorCPU<long long>* matmul<long long>(TensorCPU<long long>* x, TensorCPU<long long>* y, bool transpose_x, bool transpose_y);
template TensorCPU<unsigned long long>* matmul<unsigned long long>(TensorCPU<unsigned long long>* x, TensorCPU<unsigned long long>* y, bool transpose_x, bool transpose_y);
template TensorCPU<float>* matmul<float>(TensorCPU<float>* x, TensorCPU<float>* y, bool transpose_x, bool transpose_y);
template TensorCPU<double>* matmul<double>(TensorCPU<double>* x, TensorCPU<double>* y, bool transpose_x, bool transpose_y);
template TensorCPU<long double>* matmul<long double>(TensorCPU<long double>* x, TensorCPU<long double>* y, bool transpose_x, bool transpose_y);

#endif
#ifndef BNN_BNN_TEMPLATES_CORE_TENSOR_OPS_HPP
#define BNN_BNN_TEMPLATES_CORE_TENSOR_OPS_HPP

template TensorCPU<bool>* add<bool>(TensorCPU<bool>* x, TensorCPU<bool>* y);
template TensorCPU<short>* add<short>(TensorCPU<short>* x, TensorCPU<short>* y);
template TensorCPU<unsigned short>* add<unsigned short>(TensorCPU<unsigned short>* x, TensorCPU<unsigned short>* y);
template TensorCPU<int>* add<int>(TensorCPU<int>* x, TensorCPU<int>* y);
template TensorCPU<unsigned int>* add<unsigned int>(TensorCPU<unsigned int>* x, TensorCPU<unsigned int>* y);
template TensorCPU<long>* add<long>(TensorCPU<long>* x, TensorCPU<long>* y);
template TensorCPU<unsigned long>* add<unsigned long>(TensorCPU<unsigned long>* x, TensorCPU<unsigned long>* y);
template TensorCPU<long long>* add<long long>(TensorCPU<long long>* x, TensorCPU<long long>* y);
template TensorCPU<unsigned long long>* add<unsigned long long>(TensorCPU<unsigned long long>* x, TensorCPU<unsigned long long>* y);
template TensorCPU<float>* add<float>(TensorCPU<float>* x, TensorCPU<float>* y);
template TensorCPU<double>* add<double>(TensorCPU<double>* x, TensorCPU<double>* y);
template TensorCPU<long double>* add<long double>(TensorCPU<long double>* x, TensorCPU<long double>* y);
template TensorCPU<bool>* subtract<bool>(TensorCPU<bool>* x, TensorCPU<bool>* y);
template TensorCPU<short>* subtract<short>(TensorCPU<short>* x, TensorCPU<short>* y);
template TensorCPU<unsigned short>* subtract<unsigned short>(TensorCPU<unsigned short>* x, TensorCPU<unsigned short>* y);
template TensorCPU<int>* subtract<int>(TensorCPU<int>* x, TensorCPU<int>* y);
template TensorCPU<unsigned int>* subtract<unsigned int>(TensorCPU<unsigned int>* x, TensorCPU<unsigned int>* y);
template TensorCPU<long>* subtract<long>(TensorCPU<long>* x, TensorCPU<long>* y);
template TensorCPU<unsigned long>* subtract<unsigned long>(TensorCPU<unsigned long>* x, TensorCPU<unsigned long>* y);
template TensorCPU<long long>* subtract<long long>(TensorCPU<long long>* x, TensorCPU<long long>* y);
template TensorCPU<unsigned long long>* subtract<unsigned long long>(TensorCPU<unsigned long long>* x, TensorCPU<unsigned long long>* y);
template TensorCPU<float>* subtract<float>(TensorCPU<float>* x, TensorCPU<float>* y);
template TensorCPU<double>* subtract<double>(TensorCPU<double>* x, TensorCPU<double>* y);
template TensorCPU<long double>* subtract<long double>(TensorCPU<long double>* x, TensorCPU<long double>* y);
template TensorCPU<bool>* multiply<bool>(TensorCPU<bool>* x, TensorCPU<bool>* y);
template TensorCPU<short>* multiply<short>(TensorCPU<short>* x, TensorCPU<short>* y);
template TensorCPU<unsigned short>* multiply<unsigned short>(TensorCPU<unsigned short>* x, TensorCPU<unsigned short>* y);
template TensorCPU<int>* multiply<int>(TensorCPU<int>* x, TensorCPU<int>* y);
template TensorCPU<unsigned int>* multiply<unsigned int>(TensorCPU<unsigned int>* x, TensorCPU<unsigned int>* y);
template TensorCPU<long>* multiply<long>(TensorCPU<long>* x, TensorCPU<long>* y);
template TensorCPU<unsigned long>* multiply<unsigned long>(TensorCPU<unsigned long>* x, TensorCPU<unsigned long>* y);
template TensorCPU<long long>* multiply<long long>(TensorCPU<long long>* x, TensorCPU<long long>* y);
template TensorCPU<unsigned long long>* multiply<unsigned long long>(TensorCPU<unsigned long long>* x, TensorCPU<unsigned long long>* y);
template TensorCPU<float>* multiply<float>(TensorCPU<float>* x, TensorCPU<float>* y);
template TensorCPU<double>* multiply<double>(TensorCPU<double>* x, TensorCPU<double>* y);
template TensorCPU<long double>* multiply<long double>(TensorCPU<long double>* x, TensorCPU<long double>* y);
template TensorCPU<bool>* exp<bool>(TensorCPU<bool>* x);
template TensorCPU<short>* exp<short>(TensorCPU<short>* x);
template TensorCPU<unsigned short>* exp<unsigned short>(TensorCPU<unsigned short>* x);
template TensorCPU<int>* exp<int>(TensorCPU<int>* x);
template TensorCPU<unsigned int>* exp<unsigned int>(TensorCPU<unsigned int>* x);
template TensorCPU<long>* exp<long>(TensorCPU<long>* x);
template TensorCPU<unsigned long>* exp<unsigned long>(TensorCPU<unsigned long>* x);
template TensorCPU<long long>* exp<long long>(TensorCPU<long long>* x);
template TensorCPU<unsigned long long>* exp<unsigned long long>(TensorCPU<unsigned long long>* x);
template TensorCPU<float>* exp<float>(TensorCPU<float>* x);
template TensorCPU<double>* exp<double>(TensorCPU<double>* x);
template TensorCPU<long double>* exp<long double>(TensorCPU<long double>* x);
template TensorCPU<bool>* log<bool>(TensorCPU<bool>* x);
template TensorCPU<short>* log<short>(TensorCPU<short>* x);
template TensorCPU<unsigned short>* log<unsigned short>(TensorCPU<unsigned short>* x);
template TensorCPU<int>* log<int>(TensorCPU<int>* x);
template TensorCPU<unsigned int>* log<unsigned int>(TensorCPU<unsigned int>* x);
template TensorCPU<long>* log<long>(TensorCPU<long>* x);
template TensorCPU<unsigned long>* log<unsigned long>(TensorCPU<unsigned long>* x);
template TensorCPU<long long>* log<long long>(TensorCPU<long long>* x);
template TensorCPU<unsigned long long>* log<unsigned long long>(TensorCPU<unsigned long long>* x);
template TensorCPU<float>* log<float>(TensorCPU<float>* x);
template TensorCPU<double>* log<double>(TensorCPU<double>* x);
template TensorCPU<long double>* log<long double>(TensorCPU<long double>* x);
template TensorCPU<bool>* rectifier<bool>(TensorCPU<bool>* x);
template TensorCPU<short>* rectifier<short>(TensorCPU<short>* x);
template TensorCPU<unsigned short>* rectifier<unsigned short>(TensorCPU<unsigned short>* x);
template TensorCPU<int>* rectifier<int>(TensorCPU<int>* x);
template TensorCPU<unsigned int>* rectifier<unsigned int>(TensorCPU<unsigned int>* x);
template TensorCPU<long>* rectifier<long>(TensorCPU<long>* x);
template TensorCPU<unsigned long>* rectifier<unsigned long>(TensorCPU<unsigned long>* x);
template TensorCPU<long long>* rectifier<long long>(TensorCPU<long long>* x);
template TensorCPU<unsigned long long>* rectifier<unsigned long long>(TensorCPU<unsigned long long>* x);
template TensorCPU<float>* rectifier<float>(TensorCPU<float>* x);
template TensorCPU<double>* rectifier<double>(TensorCPU<double>* x);
template TensorCPU<long double>* rectifier<long double>(TensorCPU<long double>* x);
template TensorCPU<bool>* heaviside<bool>(TensorCPU<bool>* x);
template TensorCPU<short>* heaviside<short>(TensorCPU<short>* x);
template TensorCPU<unsigned short>* heaviside<unsigned short>(TensorCPU<unsigned short>* x);
template TensorCPU<int>* heaviside<int>(TensorCPU<int>* x);
template TensorCPU<unsigned int>* heaviside<unsigned int>(TensorCPU<unsigned int>* x);
template TensorCPU<long>* heaviside<long>(TensorCPU<long>* x);
template TensorCPU<unsigned long>* heaviside<unsigned long>(TensorCPU<unsigned long>* x);
template TensorCPU<long long>* heaviside<long long>(TensorCPU<long long>* x);
template TensorCPU<unsigned long long>* heaviside<unsigned long long>(TensorCPU<unsigned long long>* x);
template TensorCPU<float>* heaviside<float>(TensorCPU<float>* x);
template TensorCPU<double>* heaviside<double>(TensorCPU<double>* x);
template TensorCPU<long double>* heaviside<long double>(TensorCPU<long double>* x);
template void fill<bool>(TensorCPU<bool>* x, bool val);
template void fill<short>(TensorCPU<short>* x, short val);
template void fill<unsigned short>(TensorCPU<unsigned short>* x, unsigned short val);
template void fill<int>(TensorCPU<int>* x, int val);
template void fill<unsigned int>(TensorCPU<unsigned int>* x, unsigned int val);
template void fill<long>(TensorCPU<long>* x, long val);
template void fill<unsigned long>(TensorCPU<unsigned long>* x, unsigned long val);
template void fill<long long>(TensorCPU<long long>* x, long long val);
template void fill<unsigned long long>(TensorCPU<unsigned long long>* x, unsigned long long val);
template void fill<float>(TensorCPU<float>* x, float val);
template void fill<double>(TensorCPU<double>* x, double val);
template void fill<long double>(TensorCPU<long double>* x, long double val);
template void copy<bool>(TensorCPU<bool>* dest, TensorCPU<bool>* src);
template void copy<short>(TensorCPU<short>* dest, TensorCPU<short>* src);
template void copy<unsigned short>(TensorCPU<unsigned short>* dest, TensorCPU<unsigned short>* src);
template void copy<int>(TensorCPU<int>* dest, TensorCPU<int>* src);
template void copy<unsigned int>(TensorCPU<unsigned int>* dest, TensorCPU<unsigned int>* src);
template void copy<long>(TensorCPU<long>* dest, TensorCPU<long>* src);
template void copy<unsigned long>(TensorCPU<unsigned long>* dest, TensorCPU<unsigned long>* src);
template void copy<long long>(TensorCPU<long long>* dest, TensorCPU<long long>* src);
template void copy<unsigned long long>(TensorCPU<unsigned long long>* dest, TensorCPU<unsigned long long>* src);
template void copy<float>(TensorCPU<float>* dest, TensorCPU<float>* src);
template void copy<double>(TensorCPU<double>* dest, TensorCPU<double>* src);
template void copy<long double>(TensorCPU<long double>* dest, TensorCPU<long double>* src);
template TensorCPU<bool>* sum<bool>(TensorCPU<bool>* x, int axis);
template TensorCPU<short>* sum<short>(TensorCPU<short>* x, int axis);
template TensorCPU<unsigned short>* sum<unsigned short>(TensorCPU<unsigned short>* x, int axis);
template TensorCPU<int>* sum<int>(TensorCPU<int>* x, int axis);
template TensorCPU<unsigned int>* sum<unsigned int>(TensorCPU<unsigned int>* x, int axis);
template TensorCPU<long>* sum<long>(TensorCPU<long>* x, int axis);
template TensorCPU<unsigned long>* sum<unsigned long>(TensorCPU<unsigned long>* x, int axis);
template TensorCPU<long long>* sum<long long>(TensorCPU<long long>* x, int axis);
template TensorCPU<unsigned long long>* sum<unsigned long long>(TensorCPU<unsigned long long>* x, int axis);
template TensorCPU<float>* sum<float>(TensorCPU<float>* x, int axis);
template TensorCPU<double>* sum<double>(TensorCPU<double>* x, int axis);
template TensorCPU<long double>* sum<long double>(TensorCPU<long double>* x, int axis);
template TensorCPU<bool>* divide<bool>(TensorCPU<bool>* x, bool divisor);
template TensorCPU<short>* divide<short>(TensorCPU<short>* x, short divisor);
template TensorCPU<unsigned short>* divide<unsigned short>(TensorCPU<unsigned short>* x, unsigned short divisor);
template TensorCPU<int>* divide<int>(TensorCPU<int>* x, int divisor);
template TensorCPU<unsigned int>* divide<unsigned int>(TensorCPU<unsigned int>* x, unsigned int divisor);
template TensorCPU<long>* divide<long>(TensorCPU<long>* x, long divisor);
template TensorCPU<unsigned long>* divide<unsigned long>(TensorCPU<unsigned long>* x, unsigned long divisor);
template TensorCPU<long long>* divide<long long>(TensorCPU<long long>* x, long long divisor);
template TensorCPU<unsigned long long>* divide<unsigned long long>(TensorCPU<unsigned long long>* x, unsigned long long divisor);
template TensorCPU<float>* divide<float>(TensorCPU<float>* x, float divisor);
template TensorCPU<double>* divide<double>(TensorCPU<double>* x, double divisor);
template TensorCPU<long double>* divide<long double>(TensorCPU<long double>* x, long double divisor);
template TensorCPU<bool>* divide<bool>(TensorCPU<bool>* x, TensorCPU<bool>* y);
template TensorCPU<short>* divide<short>(TensorCPU<short>* x, TensorCPU<short>* y);
template TensorCPU<unsigned short>* divide<unsigned short>(TensorCPU<unsigned short>* x, TensorCPU<unsigned short>* y);
template TensorCPU<int>* divide<int>(TensorCPU<int>* x, TensorCPU<int>* y);
template TensorCPU<unsigned int>* divide<unsigned int>(TensorCPU<unsigned int>* x, TensorCPU<unsigned int>* y);
template TensorCPU<long>* divide<long>(TensorCPU<long>* x, TensorCPU<long>* y);
template TensorCPU<unsigned long>* divide<unsigned long>(TensorCPU<unsigned long>* x, TensorCPU<unsigned long>* y);
template TensorCPU<long long>* divide<long long>(TensorCPU<long long>* x, TensorCPU<long long>* y);
template TensorCPU<unsigned long long>* divide<unsigned long long>(TensorCPU<unsigned long long>* x, TensorCPU<unsigned long long>* y);
template TensorCPU<float>* divide<float>(TensorCPU<float>* x, TensorCPU<float>* y);
template TensorCPU<double>* divide<double>(TensorCPU<double>* x, TensorCPU<double>* y);
template TensorCPU<long double>* divide<long double>(TensorCPU<long double>* x, TensorCPU<long double>* y);
template TensorCPU<bool>* one_hot<bool>(TensorCPU<bool>* x, bool on_value, bool off_value, unsigned depth);
template TensorCPU<short>* one_hot<short>(TensorCPU<short>* x, short on_value, short off_value, unsigned depth);
template TensorCPU<unsigned short>* one_hot<unsigned short>(TensorCPU<unsigned short>* x, unsigned short on_value, unsigned short off_value, unsigned depth);
template TensorCPU<int>* one_hot<int>(TensorCPU<int>* x, int on_value, int off_value, unsigned depth);
template TensorCPU<unsigned int>* one_hot<unsigned int>(TensorCPU<unsigned int>* x, unsigned int on_value, unsigned int off_value, unsigned depth);
template TensorCPU<long>* one_hot<long>(TensorCPU<long>* x, long on_value, long off_value, unsigned depth);
template TensorCPU<unsigned long>* one_hot<unsigned long>(TensorCPU<unsigned long>* x, unsigned long on_value, unsigned long off_value, unsigned depth);
template TensorCPU<long long>* one_hot<long long>(TensorCPU<long long>* x, long long on_value, long long off_value, unsigned depth);
template TensorCPU<unsigned long long>* one_hot<unsigned long long>(TensorCPU<unsigned long long>* x, unsigned long long on_value, unsigned long long off_value, unsigned depth);
template TensorCPU<float>* one_hot<float>(TensorCPU<float>* x, float on_value, float off_value, unsigned depth);
template TensorCPU<double>* one_hot<double>(TensorCPU<double>* x, double on_value, double off_value, unsigned depth);
template TensorCPU<long double>* one_hot<long double>(TensorCPU<long double>* x, long double on_value, long double off_value, unsigned depth);
template TensorCPU<bool>* matmul<bool>(TensorCPU<bool>* x, TensorCPU<bool>* y, bool transpose_x, bool transpose_y);
template TensorCPU<short>* matmul<short>(TensorCPU<short>* x, TensorCPU<short>* y, bool transpose_x, bool transpose_y);
template TensorCPU<unsigned short>* matmul<unsigned short>(TensorCPU<unsigned short>* x, TensorCPU<unsigned short>* y, bool transpose_x, bool transpose_y);
template TensorCPU<int>* matmul<int>(TensorCPU<int>* x, TensorCPU<int>* y, bool transpose_x, bool transpose_y);
template TensorCPU<unsigned int>* matmul<unsigned int>(TensorCPU<unsigned int>* x, TensorCPU<unsigned int>* y, bool transpose_x, bool transpose_y);
template TensorCPU<long>* matmul<long>(TensorCPU<long>* x, TensorCPU<long>* y, bool transpose_x, bool transpose_y);
template TensorCPU<unsigned long>* matmul<unsigned long>(TensorCPU<unsigned long>* x, TensorCPU<unsigned long>* y, bool transpose_x, bool transpose_y);
template TensorCPU<long long>* matmul<long long>(TensorCPU<long long>* x, TensorCPU<long long>* y, bool transpose_x, bool transpose_y);
template TensorCPU<unsigned long long>* matmul<unsigned long long>(TensorCPU<unsigned long long>* x, TensorCPU<unsigned long long>* y, bool transpose_x, bool transpose_y);
template TensorCPU<float>* matmul<float>(TensorCPU<float>* x, TensorCPU<float>* y, bool transpose_x, bool transpose_y);
template TensorCPU<double>* matmul<double>(TensorCPU<double>* x, TensorCPU<double>* y, bool transpose_x, bool transpose_y);
template TensorCPU<long double>* matmul<long double>(TensorCPU<long double>* x, TensorCPU<long double>* y, bool transpose_x, bool transpose_y);

#endif
