47 const SelectivityVector& rows,
48 std::vector<VectorPtr>& args,
50 exec::EvalCtx& context,
51 VectorPtr& output)
const override {
52 BaseVector::ensureWritable(rows, type, context.pool(), output);
54 BaseVector* left = args[0].get();
55 BaseVector* right = args[1].get();
57 exec::LocalDecodedVector leftHolder(context, *left, rows);
58 auto decodedLeftArray = leftHolder.get();
59 auto leftInputOffset =
60 decodedLeftArray->base()->as<ArrayVector>()->rawOffsets();
62 decodedLeftArray->base()->as<ArrayVector>()->elements();
64 exec::LocalDecodedVector rightHolder(context, *right, rows);
65 auto decodedRightArray = rightHolder.get();
66 auto rightInputOffset =
67 decodedRightArray->base()->as<ArrayVector>()->rawOffsets();
69 decodedRightArray->base()->as<ArrayVector>()->elements();
70 float* input1Values = baseLeftArray->values()->asMutable<
float>();
71 float* input2Values = baseRightArray->values()->asMutable<
float>();
73 int numInput = rows.size();
75 std::vector<float> resultVector(numInput);
77 rows.applyToSelected([&](vector_size_t i) {
79 auto leftIndexInRaw = decodedLeftArray->index(i);
80 auto rightIndexInRaw = decodedRightArray->index(i);
81 Eigen::Map<Eigen::VectorXf> vec1(
82 input1Values + leftInputOffset[leftIndexInRaw], dims[0]);
83 Eigen::Map<Eigen::VectorXf> vec2(
84 input2Values + rightInputOffset[rightIndexInRaw], dims[0]);
87 float dotProduct = vec1.dot(vec2);
88 float norm1 = vec1.norm();
89 float norm2 = vec2.norm();
90 float cosineSim = dotProduct / (norm1 * norm2 + 1e-8);
93 resultVector[i] = cosineSim;
96 VectorMaker maker{context.pool()};
97 output = maker.flatVector<
float>(resultVector, REAL());