#pragma once #include #include #include #include #include #include namespace operators { template T mul(T a, T b) { return a * b; // 请修改这里的return语句. } template T id(T a) { return a; // 请修改这里的return语句 } template T add(T a, T b) { return a+b; // 请修改这里的return语句 } template T neg(T a) { return -a; // 请修改这里的return语句 } template float lt(T a, T b) { return (float)(a float eq(T a, T b) { return (float)(a==b); // 请修改这里的return语句 } template T max(T a, T b) { return a>b?a:b; // 请修改这里的return语句 } template auto map(const std::vector& vec, F func) -> std::vector()))> { std::vector()))> result; result.reserve(vec.size()); std::transform(vec.begin(), vec.end(), std::back_inserter(result), func); return result; } template auto zipWith(const std::vector& vec1, const std::vector& vec2, F func) -> std::vector(), std::declval()))> { using ResultType = decltype(func(std::declval(),std::declval())); std::vector result; if (vec1.size() != vec2.size()) { // 我们已经在这里throw一个异常 throw std::invalid_argument("Vectors must have the same size"); } result.reserve(vec1.size()); for(size_t i=0;i auto reduce(const std::vector& vec, T init, F func) -> T { return std::accumulate(vec.begin(), vec.end(), init, func); } float is_close(float x, float y); float sigmoid(float x); float relu(float x); float inv(float x); float inv_back(float x, float d); float relu_back(float x, float d); auto sumList(const std::vector& vec) -> float; auto prodList(const std::vector& vec) -> float; auto addLists(const std::vector& vec1, const std::vector& vec2) -> std::vector; auto negList(const std::vector& vec) -> std::vector; }