--- /dev/null
+#ifndef _NNC_BACKEND_INTERPRETER_BIAS_
+#define _NNC_BACKEND_INTERPRETER_BIAS_
+
+#include "OperationImpl.h"
+#include "Fill.h"
+
+namespace nncc
+{
+namespace contrib
+{
+namespace backend
+{
+namespace interpreter
+{
+namespace impl
+{
+
+class BiasAdd : public OperationImpl<float>
+{
+public:
+ BiasAdd(const TensorVariant &input, const TensorVariant &weights, const Shape &outputShape)
+ : _weights(weights), _input(input), _outputShape(outputShape)
+ {
+ assert(_weights.getShape().rank() == 1);
+ assert(_outputShape.rank() == _input.getShape().rank());
+ assert(_outputShape.dim(_outputShape.rank() - 1) == _weights.getShape().dim(0));
+ }
+
+ std::vector<TensorVariant> operator()() override
+ {
+ return Fill<float>(_outputShape, [this](const Index &idx) {
+ return _input.at(idx) + _weights.at({idx.at(idx.rank() - 1)});
+ })();
+ }
+
+private:
+ const Tensor<float> _weights;
+ const Tensor<float> _input;
+ const Shape &_outputShape;
+};
+
+} // namespace impl
+} // namespace interpreter
+} // namespace backend
+} // namespace contrib
+} // namespace nncc
+
+#endif //_NNC_BACKEND_INTERPRETER_BIAS_