#include "ops.h"

namespace operators {
static float epsilon = 1e-6;

float is_close(float x, float y) {
    // 请修改这里的return语句
    return (float)(abs(x-y)<epsilon);
}

float sigmoid(float x) {
    // 请修改这里的return语句
    if(x>=0) return 1.0/(1.0+exp(-x));
    else return exp(x)/(1.0+exp(x));
}

float relu(float x) {
    // 请修改这里的return语句
    return x>0.0?x:0.0;
}

float inv(float x) {
    // 请修改这里的return语句
    return 1.0/x;
}

float inv_back(float x, float d) {
    // 请修改这里的return语句
    return -d/(x*x);
}

float relu_back(float x, float d) {
    // 请修改这里的return语句
    return x>0.0?d*1.0:0.0;
}

auto sumList(const std::vector<float>& vec) -> float {
    return reduce(vec, 0.0f, add<float>);
}

auto prodList(const std::vector<float>& vec) -> float {
    // 请修改这里的return语句
    return reduce(vec, 1.0f, mul<float>);
}

auto addLists(const std::vector<float>& vec1, const std::vector<float>& vec2) -> std::vector<float> {
    // 请修改这里的return语句
     return zipWith(vec1, vec2, add<float>);
}

auto negList(const std::vector<float>& vec) -> std::vector<float> {
    // 请修改这里的return语句
    return map(vec,neg<float>);
}
}

