#ifndef EVAL_CONV2D_H
#define EVAL_CONV2D_H

#include "eval_op.h"

typedef std::map<std::string, std::shared_ptr<eval_op>> eval_op_proto_map;

class eval_conv2d: public eval_op {
    tensor value_;
    std::shared_ptr<eval_op> clone(const expression &expr) override;
public:
    eval_conv2d () {}
    eval_conv2d(const expression &expr);
    void eval(vars_type &variables, const kwargs_type &kwargs) override;
    static void store_prototype(eval_op_proto_map &proto_map) {
        assert(proto_map.find("Conv2d") == proto_map.end());
        proto_map["Conv2d"] = std::make_shared<eval_conv2d>(); // where is expr?
    }
private:
    int in_channels;
    int kernel_size;
    int out_channels;
    double padding;
    tensor weight;
    tensor bias;
    int stride;
    /*
    tensor weight;
    tensor bias;
    int kernel_size;
    int stride;
    int in_channels;
    int out_channels;
    double padding;
    */
}; // class eval_conv2d

#endif