67 const SelectivityVector& rows,
68 std::vector<VectorPtr>& args,
70 exec::EvalCtx& context,
71 VectorPtr& output)
const override {
72 BaseVector::ensureWritable(rows, type, context.pool(), output);
73 output->clearNulls(rows);
74 auto arrayOutput = output->as<ArrayVector>();
75 auto sizes = arrayOutput->mutableSizes(rows.end());
76 auto rawSizes = sizes->asMutable<int32_t>();
77 auto offsets = arrayOutput->mutableOffsets(rows.end());
78 auto rawOffsets = offsets->asMutable<int32_t>();
81 std::fill(rawSizes, rawSizes + rows.end(), 0);
82 std::fill(rawOffsets, rawOffsets + rows.end(), 0);
84 auto elementsOutput = arrayOutput->elements();
85 auto elementsPool = context.pool();
87 exec::DecodedArgs decodedArgs(rows, args, context);
88 auto decodedInput = decodedArgs.at(0);
89 auto numRows = rows.size();
91 auto inputArray = decodedInput->base()->as<ArrayVector>();
92 auto inputElements = inputArray->elements();
93 float* inputValues = inputElements->values()->asMutable<
float>();
94 auto inputOffsets = inputArray->rawOffsets();
95 auto inputSizes = inputArray->rawSizes();
97 std::map<vector_size_t, vector_size_t> rowMap;
98 std::unordered_set<vector_size_t> uniqueRawIndexeSet;
99 std::vector<vector_size_t> uniqueRawIndexeVector;
100 vector_size_t numUniqueRows = 0;
101 rows.applyToSelected([&](vector_size_t row) {
102 auto mappedIndexInRowData = decodedInput->index(row);
103 if (uniqueRawIndexeSet.find(mappedIndexInRowData) ==
104 uniqueRawIndexeSet.end()) {
106 rowMap[row] = numUniqueRows;
107 uniqueRawIndexeSet.insert(mappedIndexInRowData);
108 uniqueRawIndexeVector.push_back(mappedIndexInRowData);
112 rowMap[row] = rowMap[mappedIndexInRowData];
116 int numResultMatrixRows = numUniqueRows;
117 Eigen::MatrixXf resultMatix(numResultMatrixRows,
dims[0]);
119 for (
auto rawIndex : uniqueRawIndexeVector) {
120 int numEmbeddingValues = inputSizes[rawIndex];
122 int numEmbeddingToCombie = numEmbeddingValues / embeddingDims_;
123 if (numEmbeddingToCombie == 1) {
124 Eigen::Map<const Eigen::VectorXf> rowVector(
125 inputValues + inputOffsets[rawIndex], embeddingDims_);
126 resultMatix.row(rowIndex) = rowVector;
130 Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>>
132 inputValues + inputOffsets[rawIndex],
133 numEmbeddingToCombie,
136 Eigen::VectorXf mergedValues;
137 if (mode_ ==
"MIN") {
138 mergedValues = varaidicEmbedding.colwise().minCoeff();
139 }
else if (mode_ ==
"MAX") {
140 mergedValues = varaidicEmbedding.colwise().maxCoeff();
141 }
else if (mode_ ==
"MEAN") {
142 mergedValues = varaidicEmbedding.colwise().mean();
144 resultMatix.row(rowIndex) = mergedValues;
149 auto baseOffset = elementsOutput->size();
150 elementsOutput->resize(baseOffset + rows.end() *
dims[0]);
151 float* outputValues = elementsOutput->values()->asMutable<
float>();
153 vector_size_t outputOffset = 0;
155 rows.applyToSelected([&](vector_size_t row) {
156 if (rowMap.find(row) == rowMap.end()) {
157 throw std::runtime_error(
158 "Mapped index not found for the result matrix.");
160 auto mappedIndexInResultMatrix = rowMap[row];
161 rawOffsets[row] = outputOffset;
162 rawSizes[row] =
dims[0];
165 outputValues + outputOffset,
166 resultMatix.row(mappedIndexInResultMatrix).data(),
167 dims[0] *
sizeof(
float));
169 outputOffset +=
dims[0];
171 arrayOutput->setElements(elementsOutput);