Cleanup in Split mask propagation transformation (#14119)
* Cleanup in Split mask propagation transformation * review comments
This commit is contained in:
1 parent
81c579fd2a
commit
47acda3476
2 files changed
+46
-73
No files matched your search
@@ -203,7 +203,7 @@ public:
|
||||
while (it != src_set.end() && *it < split_end)
|
||||
dst_set.insert(*it++ - split_start);
|
||||
at(i) = dst_set;
|
||||
} else if (!mask->at(i).empty()) {
|
||||
} else {
|
||||
at(i) = mask->at(i);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1432,6 +1432,42 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
static ngraph::Mask::Ptr create_connect_split_output_mask(ngraph::Mask::Ptr input_mask,
|
||||
const int64_t axis,
|
||||
const uint64_t split_start,
|
||||
const uint64_t split_end) {
|
||||
auto output_mask = std::make_shared<ngraph::Mask>();
|
||||
auto input_mask_raw = input_mask.get();
|
||||
output_mask->add_callback(
|
||||
[input_mask_raw, axis, split_start, split_end](ngraph::Mask::Ptr cur_mask) -> bool {
|
||||
cur_mask->copy_and_slice_mask_from(input_mask_raw, axis, split_start, split_end);
|
||||
return true;
|
||||
},
|
||||
input_mask);
|
||||
auto output_mask_raw = output_mask.get();
|
||||
input_mask->add_callback(
|
||||
[output_mask_raw, axis, split_start, split_end](ngraph::Mask::Ptr cur_mask) -> bool {
|
||||
auto& dim_mask = cur_mask->at(axis);
|
||||
auto it = dim_mask.lower_bound(split_start);
|
||||
while (it != dim_mask.end() && *it < split_end) {
|
||||
it = dim_mask.erase(it);
|
||||
}
|
||||
for (size_t j = 0; j < output_mask_raw->size(); j++) {
|
||||
const auto& dim_mask = output_mask_raw->at(j);
|
||||
if (j == axis) {
|
||||
for (auto d : dim_mask)
|
||||
cur_mask->at(j).insert(d + split_start);
|
||||
} else {
|
||||
cur_mask->at(j) = dim_mask;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
},
|
||||
output_mask);
|
||||
|
||||
return output_mask;
|
||||
}
|
||||
|
||||
class ov::pass::mask_propagation::VariadicSplit : public MatcherPass {
|
||||
public:
|
||||
VariadicSplit() {
|
||||
@@ -1484,45 +1520,14 @@ public:
|
||||
uint64_t split_start = 0;
|
||||
uint64_t split_end = 0;
|
||||
std::vector<ngraph::Mask::Ptr> output_masks;
|
||||
std::vector<ngraph::Mask*> output_masks_raw;
|
||||
auto input_mask_raw = input_mask.get();
|
||||
for (size_t i = 0; i < split->get_output_size(); i++) {
|
||||
split_end += split_lengths[i];
|
||||
auto output_mask = std::make_shared<ngraph::Mask>();
|
||||
output_mask->copy_and_slice_mask_from(input_mask_raw, axis, split_start, split_end);
|
||||
output_masks.push_back(output_mask);
|
||||
output_masks_raw.push_back(output_mask.get());
|
||||
output_mask->add_callback(
|
||||
[input_mask_raw, axis, split_start, split_end](ngraph::Mask::Ptr cur_mask) -> bool {
|
||||
cur_mask->copy_and_slice_mask_from(input_mask_raw, axis, split_start, split_end);
|
||||
return true;
|
||||
},
|
||||
input_mask);
|
||||
split_start = split_end;
|
||||
output_masks.push_back(create_connect_split_output_mask(input_mask, axis, split_start, split_end));
|
||||
ngraph::setMask(split->output(i), output_masks[i]);
|
||||
split_start = split_end;
|
||||
}
|
||||
|
||||
auto input_mask_callback = [output_masks_raw, axis, split_lengths](ngraph::Mask::Ptr cur_mask) -> bool {
|
||||
cur_mask->clean_dim_values();
|
||||
uint64_t split_start = 0;
|
||||
for (size_t i = 0; i < output_masks_raw.size(); i++) {
|
||||
auto mask = output_masks_raw[i];
|
||||
for (size_t j = 0; j < mask->size(); j++) {
|
||||
const auto& dim_mask = mask->at(j);
|
||||
if (j == axis) {
|
||||
for (auto d : dim_mask)
|
||||
cur_mask->at(j).insert(d + split_start);
|
||||
} else if (!dim_mask.empty()) {
|
||||
cur_mask->at(j) = dim_mask;
|
||||
}
|
||||
}
|
||||
split_start += split_lengths[i];
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
for (size_t i = 0; i < split->get_output_size(); i++) {
|
||||
input_mask->add_callback(input_mask_callback, output_masks[i]);
|
||||
for (const auto& output_mask : output_masks) {
|
||||
output_mask->apply_callback(input_mask);
|
||||
}
|
||||
return true;
|
||||
};
|
||||
@@ -1565,46 +1570,14 @@ public:
|
||||
auto split_step = split_dim / num_splits;
|
||||
uint64_t split_end = split_step;
|
||||
std::vector<ngraph::Mask::Ptr> output_masks;
|
||||
std::vector<ngraph::Mask*> output_masks_raw;
|
||||
auto input_mask_raw = input_mask.get();
|
||||
for (size_t i = 0; i < num_splits; i++) {
|
||||
auto output_mask = std::make_shared<ngraph::Mask>();
|
||||
output_mask->copy_and_slice_mask_from(input_mask_raw, axis, split_start, split_end);
|
||||
output_masks.push_back(output_mask);
|
||||
output_masks_raw.push_back(output_mask.get());
|
||||
output_mask->add_callback(
|
||||
[input_mask_raw, axis, split_start, split_end](ngraph::Mask::Ptr cur_mask) -> bool {
|
||||
cur_mask->copy_and_slice_mask_from(input_mask_raw, axis, split_start, split_end);
|
||||
return true;
|
||||
},
|
||||
input_mask);
|
||||
for (size_t i = 0; i < split->get_output_size(); i++) {
|
||||
output_masks.push_back(create_connect_split_output_mask(input_mask, axis, split_start, split_end));
|
||||
ngraph::setMask(split->output(i), output_masks[i]);
|
||||
split_start = split_end;
|
||||
split_end += split_step;
|
||||
ngraph::setMask(split->output(i), output_masks[i]);
|
||||
}
|
||||
|
||||
auto input_mask_callback =
|
||||
[output_masks_raw, axis, split_dim, split_step, num_splits](ngraph::Mask::Ptr cur_mask) -> bool {
|
||||
cur_mask->clean_dim_values();
|
||||
uint64_t split_start = 0;
|
||||
for (auto mask : output_masks_raw) {
|
||||
for (size_t j = 0; j < mask->size(); j++) {
|
||||
const auto& dim_mask = mask->at(j);
|
||||
if (j == axis) {
|
||||
for (auto d : dim_mask)
|
||||
cur_mask->at(j).insert(d + split_start);
|
||||
} else if (!dim_mask.empty()) {
|
||||
cur_mask->at(j) = dim_mask;
|
||||
}
|
||||
}
|
||||
split_start += split_step;
|
||||
}
|
||||
cur_mask->initialize_dependencies();
|
||||
return true;
|
||||
};
|
||||
|
||||
for (size_t i = 0; i < split->get_output_size(); i++) {
|
||||
input_mask->add_callback(input_mask_callback, output_masks[i]);
|
||||
for (const auto& output_mask : output_masks) {
|
||||
output_mask->apply_callback(input_mask);
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
Reference in new issue
Block a user