55 const SelectivityVector& rows,
56 std::vector<VectorPtr>& args,
58 exec::EvalCtx& context,
59 VectorPtr& output)
const override {
60 BaseVector::ensureWritable(rows, type, context.pool(), output);
64 BaseVector* left = args[0].get();
65 BaseVector* right = args[1].get();
67 exec::LocalDecodedVector leftHolder(context, *left, rows);
68 auto decodedLeftArray = leftHolder.get();
70 decodedLeftArray->base()->as<ArrayVector>()->elements();
72 exec::LocalDecodedVector rightHolder(context, *right, rows);
73 auto decodedRightArray = rightHolder.get();
74 auto baseRightArray = rightHolder->base()->as<ArrayVector>()->elements();
76 float* input1Values = baseLeftArray->values()->asMutable<
float>();
77 float* input2Values = baseRightArray->values()->asMutable<
float>();
79 auto numInput = rows.size();
82 Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>>
83 input1Matrix(input1Values, numInput, inputDims_);
85 Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>>
86 input2Matrix(input2Values, numInput, inputDims_);
88 std::vector<std::vector<float>> results;
90 for (
int i = 0; i < rows.size(); i++) {
92 float dotProduct = input1Matrix.row(i).dot(input2Matrix.row(i));
93 r.push_back(dotProduct);
97 VectorMaker maker{context.pool()};
98 output = maker.arrayVector<
float>(results, REAL());