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);
61 output->clearNulls(rows);
62 auto arrayOutput = output->as<ArrayVector>();
63 auto sizes = arrayOutput->mutableSizes(rows.end());
64 auto rawSizes = sizes->asMutable<int32_t>();
65 auto offsets = arrayOutput->mutableOffsets(rows.end());
66 auto rawOffsets = offsets->asMutable<int32_t>();
69 std::fill(rawSizes, rawSizes + rows.end(), 0);
70 std::fill(rawOffsets, rawOffsets + rows.end(), 0);
72 auto elementsOutput = arrayOutput->elements();
73 auto elementsPool = context.pool();
75 exec::DecodedArgs decodedArgs(rows, args, context);
76 auto decodedInput = decodedArgs.at(0);
77 auto numRows = rows.size();
79 auto inputArray = decodedInput->base()->as<ArrayVector>();
80 auto inputElements = inputArray->elements();
81 float* inputValues = inputElements->values()->asMutable<
float>();
82 auto inputOffsets = inputArray->rawOffsets();
83 auto inputSizes = inputArray->rawSizes();
85 std::map<vector_size_t, vector_size_t> rowMap;
86 std::unordered_set<vector_size_t> uniqueRawIndexeSet;
87 std::vector<vector_size_t> uniqueRawIndexeVector;
88 vector_size_t numUniqueRows = 0;
89 int numCols =
dims[0];
90 rows.applyToSelected([&](vector_size_t row) {
91 auto mappedIndexInRowData = decodedInput->index(row);
92 if (uniqueRawIndexeSet.find(mappedIndexInRowData) ==
93 uniqueRawIndexeSet.end()) {
95 rowMap[row] = numUniqueRows;
96 uniqueRawIndexeSet.insert(mappedIndexInRowData);
97 uniqueRawIndexeVector.push_back(mappedIndexInRowData);
101 rowMap[row] = rowMap[mappedIndexInRowData];
105 int numInputMatrixRows = numUniqueRows;
106 Eigen::MatrixXf inputMatrix(numInputMatrixRows, numCols);
108 for (
auto rawIndex : uniqueRawIndexeVector) {
109 Eigen::Map<const Eigen::VectorXf> rowVector(
110 inputValues + inputOffsets[rawIndex], numCols);
111 inputMatrix.row(rowIndex++) = rowVector;
114 Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>
115 resultMatrix(numInputMatrixRows, numCols);
116 for (
int i = 0; i < numCols; i++) {
117 Eigen::VectorXf colData = inputMatrix.col(i);
118 float colMean = colData.mean();
120 (colData.array() - colMean).square().sum() / (numInputMatrixRows - 1);
122 resultMatrix.col(i) =
123 (colData.array() - colMean) / sqrt(colVariance + eps_) * weights_[i] +
127 auto baseOffset = elementsOutput->size();
128 elementsOutput->resize(baseOffset + rows.end() * numCols);
129 float* outputValues = elementsOutput->values()->asMutable<
float>();
130 vector_size_t outputOffset = 0;
131 rows.applyToSelected([&](vector_size_t row) {
132 if (rowMap.find(row) == rowMap.end()) {
133 throw std::runtime_error(
134 "Mapped index not found for the result matrix.");
136 auto mappedIndexInResultMatrix = rowMap[row];
137 rawOffsets[row] = outputOffset;
138 rawSizes[row] = numCols;
140 outputValues + outputOffset,
141 resultMatrix.row(mappedIndexInResultMatrix).data(),
142 numCols *
sizeof(
float));
145 arrayOutput->setElements(elementsOutput);