载入中...
搜索中...
未找到
TensorBackend.cpp
浏览该文件的文档.
2#include "agent/Agent.h"
3#include "tensor/CpuKernels.h"
4#include "tensor/Tensor.h"
5
6#include <algorithm>
7#include <cmath>
8#include <limits>
9
10namespace eve::agent {
11namespace {
12class TensorBackend final : public IPolicyBackend {
13public:
14 std::string name() const override { return "tensor-cpu"; }
15 Result<std::vector<double>> evaluate(const Policy& p, const Observation& o) override {
16 // The public dispatcher validates shape, finiteness and legal masks first.
17 tensor::Tensor x(1, int(p.featureCount));
18 for (std::size_t i = 0; i < o.features.size(); ++i) x.set(int(i), o.features[i]);
19 std::size_t offset = 0;
20 auto layer = [&](const tensor::Tensor& input, std::uint32_t outputs, bool activate) {
21 const int inputs = input.getDim1();
22 tensor::Tensor weights(inputs, int(outputs));
23 for (std::uint32_t j = 0; j < outputs; ++j)
24 for (int i = 0; i < inputs; ++i)
25 weights.set2(i, int(j), float(p.weights[offset + j * (inputs + 1) + i]));
26 std::unique_ptr<tensor::Tensor> out(input.matmul(&weights));
27 for (std::uint32_t j = 0; j < outputs; ++j)
28 out->set(int(j), out->get(int(j)) + float(p.weights[offset + j * (inputs + 1) + inputs]));
29 offset += outputs * (inputs + 1);
30 if (activate) {
31 std::unique_ptr<tensor::Tensor> activated(out->tanh());
32 return activated;
33 }
34 return out;
35 };
36 auto h1 = layer(x, p.hiddenWidth, true);
37 auto h2 = layer(*h1, p.hiddenWidth, true);
38 auto logits = layer(*h2, p.actionCount, false);
39 std::vector<float> masked(p.actionCount, -std::numeric_limits<float>::infinity()), probabilities(p.actionCount);
40 for (auto action : o.legalActions) masked[action] = logits->get(int(action));
41 const int dims[] = {1, int(p.actionCount)};
42 tensor::kernels::softmax(masked.data(), dims, 2, 1, false, probabilities.data());
43 return Result<std::vector<double>>::success({probabilities.begin(), probabilities.end()});
44 }
45};
46} // namespace
48 return Result<std::unique_ptr<IPolicyBackend>>::success(std::make_unique<TensorBackend>());
49}
50} // namespace eve::agent
float x
Definition AnimClip.cpp:738
glm::vec4 p[6]
EvpackChunkInput input
Definition Evpack.cpp:170
int inputs
Definition GridGraph.cpp:23
size_t offset
std::string name
TileLayer * layer
std::string action
Definition PlayHost.cpp:117
float weights[3]
Move-only operation result carrying either a value or Status.
Definition Result.h:155
Result< std::unique_ptr< IPolicyBackend > > makeTensorBackend()
Create an owning tensor eager CPU inference provider; caller owns registration.
void softmax(const float *in, const int *dims, int rank, int axis, bool logMode, float *out)
Softmax.
std::vector< OnnxNamedTensor > evaluate(const ModelData &, std::span< const OnnxNamedTensor >, const std::vector< std::string > &, OnnxCompute *, OnnxRunOptions options)
Evaluate.