def requantize_pattern() -> tvm.relay.dataflow_pattern.DFPattern: """ This function creates the pattern for qnn.requantize. """ return is_op("qnn.requantize")( wildcard(), is_constant(), is_constant(), is_constant(), is_constant() )
def concat_pattern(): """Create pattern for concat""" tensors = is_tuple(None) scales = is_tuple(None) zero_points = is_tuple(None) concat = is_op("qnn.concatenate")(tensors, scales, zero_points, is_constant(), is_constant()) return concat
def resize2d_pattern() -> tvm.relay.dataflow_pattern.DFPattern: """ This function creates the pattern for image.resize2d. """ dequant = is_op("qnn.dequantize")(wildcard(), is_constant(), is_constant()) resize_2d = is_op("image.resize2d")(dequant).has_attr({"method": "linear"}) quant = is_op("qnn.quantize")(resize_2d, is_constant(), is_constant()) return quant | is_op("image.resize2d")(wildcard()).has_attr({"method": "nearest_neighbor"})
def mean_pattern() -> tvm.relay.dataflow_pattern.DFPattern: """ This function creates the pattern for mean. """ pattern = is_op("cast")(wildcard()) pattern = is_op("mean")(pattern) pattern = is_op("qnn.requantize")(pattern, is_constant(), is_constant(), is_constant(), is_constant()) return pattern
def qnn_conv2d_pattern() -> tvm.relay.dataflow_pattern.DFPattern: """ This function creates the pattern for qnn.conv2D with optional fused RELU activation. """ qnn_conv2d = is_op("qnn.conv2d")( wildcard(), is_constant(), is_constant(), is_constant(), is_constant(), is_constant()).has_attr({"kernel_layout": "HWIO"}) bias_add = is_op("nn.bias_add")(qnn_conv2d, is_constant()) req = is_op("qnn.requantize")(qnn_conv2d | bias_add, is_constant(), is_constant(), is_constant(), is_constant()) clip_or_req = req.optional(is_op("clip")) return clip_or_req
def qnn_mul_pattern() -> tvm.relay.dataflow_pattern.DFPattern: """ This function creates the pattern for qnn.mul with optional fused RELU activation. """ pattern = is_op("qnn.mul")( wildcard(), wildcard(), is_constant(), is_constant(), is_constant(), is_constant(), is_constant(), is_constant(), ) pattern = pattern.optional(is_op("clip")) return pattern
def proj_five_op_pattern_with_const( op: relay.expr.Expr) -> relay.dataflow_pattern.DFPattern: return is_tuple_get_item( is_op(op)(wildcard(), is_constant(), is_constant(), is_constant(), is_constant()), 0)
def binary_op_pattern_with_const( op: relay.expr.Expr) -> relay.dataflow_pattern.DFPattern: """Matches binary operation with rhs arg a constant""" return is_op(op)(wildcard(), is_constant())
def sigmoid_pattern(): """Create pattern for sigmoid""" dequant = is_op("qnn.dequantize")(wildcard(), is_constant(), is_constant()) sigmoid = is_op("sigmoid")(dequant) quant = is_op("qnn.quantize")(sigmoid, is_constant(), is_constant()) return quant
def tanh_pattern(): """Create pattern for tanh""" dequant = is_op("qnn.dequantize")(wildcard(), is_constant(), is_constant()) tanh = is_op("tanh")(dequant) quant = is_op("qnn.quantize")(tanh, is_constant(), is_constant()) return quant
def abs_pattern() -> tvm.relay.dataflow_pattern.DFPattern: """Create pattern for abs""" pattern = is_op("qnn.dequantize")(wildcard(), is_constant(), is_constant()) pattern = is_op("abs")(pattern) pattern = is_op("qnn.quantize")(pattern, is_constant(), is_constant()) return pattern
def binary_op_pattern_with_const(op): """Matches binary operation with rhs arg a constant""" return is_op(op)(wildcard(), is_constant())