openvino/model-optimizer/extensions/middle/split_tdnn_memoryoffset.py

36 lines
1.8 KiB
Python

# Copyright (C) 2018-2021 Intel Corporation
# SPDX-License-Identifier: Apache-2.0
from mo.graph.graph import Graph
from mo.middle.replacement import MiddleReplacementPattern
from mo.ops.memoryoffset import MemoryOffset
from mo.ops.result import Result
class SplitTdnnMemoryOffset(MiddleReplacementPattern):
'''
Splits MemoryOffsets in TDNN blocks into 2 parts. These parts then will be converted to ReadValue and Assign.
'''
enabled = True
run_not_recursively = True
def run_before(self):
from extensions.middle.ReplaceMemoryOffsetWithSplice import ReplaceMemoryOffsetWithMemoryNodePattern, ReplaceMemoryOffsetNodePattern
return [ReplaceMemoryOffsetNodePattern, ReplaceMemoryOffsetWithMemoryNodePattern]
def find_and_replace_pattern(self, graph: Graph):
for offset_node in graph.get_op_nodes(op='MemoryOffset', splitted=False):
paired_node = MemoryOffset(graph, {'name': offset_node.pair_name, 'splitted': True, 'pair_name': offset_node.id,
't': offset_node.t, 'has_default': offset_node.has_default}).create_node()
offset_node['splitted'] = True
offset_node.out_port(0).get_connection().set_source(paired_node.out_port(0))
res_node = Result(graph, {'name': offset_node.id + "_output"}).create_node()
offset_node.out_port(0).connect(res_node.in_port(0))
# If 'element_size' is previously copied from Parameter of from node with defined dim
if offset_node.has_valid('element_size'):
paired_node['element_size'] = offset_node['element_size']
# Copy shape from previous node. Typically (but not always) for TDNN blocks this is the case
else:
paired_node['element_size'] = offset_node.in_port(0).data.get_shape()