Repository: openvinotoolkit/nncf

Issue:
Add support of the nn.LeakyReLU()
I hazard a guess that nn.LeakyReLU() is not supporting now in nncf.
I tried to make quantization of https://github.com/seungwonpark/melgan but got a performance drop due to not quantized activation:
![image](https://user-images.githubusercontent.com/8265023/99795951-b5524800-2b3d-11eb-8735-ac5170a5115e.png)



Discussion:

Resolving patch:
diff --git a/nncf/dynamic_graph/operator_metatypes.py b/nncf/dynamic_graph/operator_metatypes.py
--- a/nncf/dynamic_graph/operator_metatypes.py
+++ b/nncf/dynamic_graph/operator_metatypes.py
@@ -187,7 +187,6 @@ class DepthwiseConv2dSubtype(OperatorSubtype):
     def matches(cls, containing_module: Optional[torch.nn.Module] = None,
                 function_args=None,
                 functions_kwargs=None) -> bool:
-
         if containing_module.groups == containing_module.in_channels and containing_module.in_channels > 1:
             return True
         return False
@@ -209,7 +208,6 @@ class DepthwiseConv3dSubtype(OperatorSubtype):
     def matches(cls, containing_module: Optional[torch.nn.Module] = None,
                 function_args=None,
                 functions_kwargs=None) -> bool:
-
         if containing_module.groups == containing_module.in_channels and containing_module.in_channels > 1:
             return True
         return False
@@ -270,6 +268,12 @@ class PRELUMetatype(OperatorMetatype):
     torch_nn_functional_patch_spec = PatchSpec([name])
 
 
+@OPERATOR_METATYPES.register()
+class LeakyRELUMetatype(OperatorMetatype):
+    name = "leaky_relu"
+    torch_nn_functional_patch_spec = PatchSpec([name])
+
+
 @OPERATOR_METATYPES.register()
 class LayerNormMetatype(OperatorMetatype):
     name = "layer_norm"
@@ -351,7 +355,6 @@ class MatMulMetatype(OperatorMetatype):
     hw_config_names = [HWConfigOpName.MATMUL]
 
 
-
 @OPERATOR_METATYPES.register()
 class MeanMetatype(OperatorMetatype):
     name = "mean"
@@ -624,6 +627,7 @@ class CloneMetatype(OperatorMetatype):
     name = "clone"
     torch_tensor_patch_spec = PatchSpec([name], ForwardTraceOnly())
 
+
 @OPERATOR_METATYPES.register()
 class PixelShuffleMetatype(OperatorMetatype):
     name = "pixel_shuffle"
diff --git a/nncf/quantization/quantizer_propagation.py b/nncf/quantization/quantizer_propagation.py
--- a/nncf/quantization/quantizer_propagation.py
+++ b/nncf/quantization/quantizer_propagation.py
@@ -55,6 +55,7 @@ class QuantizationTrait(Enum):
         TanhMetatype,
         ELUMetatype,
         PRELUMetatype,
+        LeakyRELUMetatype,
         LayerNormMetatype,
         GELUMetatype,
         SigmoidMetatype,


Test patch:
diff --git a/tests/data/reference_graphs/quantized/asymmetric/many_non_eval_modules.dot b/tests/data/reference_graphs/quantized/asymmetric/many_non_eval_modules.dot
deleted file mode 100644
--- a/tests/data/reference_graphs/quantized/asymmetric/many_non_eval_modules.dot
+++ /dev/null
@@ -1,31 +0,0 @@
-strict digraph  {
-"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
-"1 AsymmetricQuantizer/asymmetric_quantize" [id=1, scope=AsymmetricQuantizer, type=asymmetric_quantize];
-"2 ManyNonEvalModules/AvgPool2d[avg_pool]/avg_pool2d" [id=2, scope="ManyNonEvalModules/AvgPool2d[avg_pool]", type=avg_pool2d];
-"3 ManyNonEvalModules/AvgPool2d[avg_pool]/AsymmetricQuantizer/asymmetric_quantize" [id=3, scope="ManyNonEvalModules/AvgPool2d[avg_pool]/AsymmetricQuantizer", type=asymmetric_quantize];
-"4 ManyNonEvalModules/ModuleWithMixedModules[mixed_modules]/Dropout/dropout" [id=4, scope="ManyNonEvalModules/ModuleWithMixedModules[mixed_modules]/Dropout", type=dropout];
-"5 ManyNonEvalModules/ModuleWithMixedModules[mixed_modules]/AsymmetricQuantizer/asymmetric_quantize" [id=5, scope="ManyNonEvalModules/ModuleWithMixedModules[mixed_modules]/AsymmetricQuantizer", type=asymmetric_quantize];
-"6 ManyNonEvalModules/ModuleWithMixedModules[mixed_modules]/AsymmetricQuantizer/asymmetric_quantize" [id=6, scope="ManyNonEvalModules/ModuleWithMixedModules[mixed_modules]/AsymmetricQuantizer", type=asymmetric_quantize];
-"7 ManyNonEvalModules/ModuleWithMixedModules[mixed_modules]/linear" [id=7, scope="ManyNonEvalModules/ModuleWithMixedModules[mixed_modules]", type=linear];
-"8 ManyNonEvalModules/ModuleWithMixedModules[mixed_modules]/AsymmetricQuantizer/asymmetric_quantize" [id=8, scope="ManyNonEvalModules/ModuleWithMixedModules[mixed_modules]/AsymmetricQuantizer", type=asymmetric_quantize];
-"9 ManyNonEvalModules/ModuleWithMixedModules[mixed_modules]/Dropout/dropout" [id=9, scope="ManyNonEvalModules/ModuleWithMixedModules[mixed_modules]/Dropout", type=dropout];
-"10 ManyNonEvalModules/ModuleWithMixedModules[mixed_modules]/NNCFLinear[called_linear]/ModuleDict[pre_ops]/UpdateWeight[0]/AsymmetricQuantizer[op]/asymmetric_quantize" [id=10, scope="ManyNonEvalModules/ModuleWithMixedModules[mixed_modules]/NNCFLinear[called_linear]/ModuleDict[pre_ops]/UpdateWeight[0]/AsymmetricQuantizer[op]", type=asymmetric_quantize];
-"11 ManyNonEvalModules/ModuleWithMixedModules[mixed_modules]/NNCFLinear[called_linear]/linear" [id=11, scope="ManyNonEvalModules/ModuleWithMixedModules[mixed_modules]/NNCFLinear[called_linear]", type=linear];
-"12 ManyNonEvalModules/AuxBranch[aux_branch]/linear" [id=12, scope="ManyNonEvalModules/AuxBranch[aux_branch]", type=linear];
-"13 ManyNonEvalModules/AuxBranch[aux_branch]/Linear[linear]/linear" [id=13, scope="ManyNonEvalModules/AuxBranch[aux_branch]/Linear[linear]", type=linear];
-"14 ManyNonEvalModules/AuxBranch[aux_branch]/RELU" [id=14, scope="ManyNonEvalModules/AuxBranch[aux_branch]", type=RELU];
-"0 /nncf_model_input" -> "1 AsymmetricQuantizer/asymmetric_quantize";
-"1 AsymmetricQuantizer/asymmetric_quantize" -> "2 ManyNonEvalModules/AvgPool2d[avg_pool]/avg_pool2d";
-"2 ManyNonEvalModules/AvgPool2d[avg_pool]/avg_pool2d" -> "3 ManyNonEvalModules/AvgPool2d[avg_pool]/AsymmetricQuantizer/asymmetric_quantize";
-"3 ManyNonEvalModules/AvgPool2d[avg_pool]/AsymmetricQuantizer/asymmetric_quantize" -> "4 ManyNonEvalModules/ModuleWithMixedModules[mixed_modules]/Dropout/dropout";
-"4 ManyNonEvalModules/ModuleWithMixedModules[mixed_modules]/Dropout/dropout" -> "5 ManyNonEvalModules/ModuleWithMixedModules[mixed_modules]/AsymmetricQuantizer/asymmetric_quantize";
-"5 ManyNonEvalModules/ModuleWithMixedModules[mixed_modules]/AsymmetricQuantizer/asymmetric_quantize" -> "7 ManyNonEvalModules/ModuleWithMixedModules[mixed_modules]/linear";
-"6 ManyNonEvalModules/ModuleWithMixedModules[mixed_modules]/AsymmetricQuantizer/asymmetric_quantize" -> "7 ManyNonEvalModules/ModuleWithMixedModules[mixed_modules]/linear";
-"7 ManyNonEvalModules/ModuleWithMixedModules[mixed_modules]/linear" -> "8 ManyNonEvalModules/ModuleWithMixedModules[mixed_modules]/AsymmetricQuantizer/asymmetric_quantize";
-"8 ManyNonEvalModules/ModuleWithMixedModules[mixed_modules]/AsymmetricQuantizer/asymmetric_quantize" -> "9 ManyNonEvalModules/ModuleWithMixedModules[mixed_modules]/Dropout/dropout";
-"3 ManyNonEvalModules/AvgPool2d[avg_pool]/AsymmetricQuantizer/asymmetric_quantize" -> "12 ManyNonEvalModules/AuxBranch[aux_branch]/linear";
-"9 ManyNonEvalModules/ModuleWithMixedModules[mixed_modules]/Dropout/dropout" -> "11 ManyNonEvalModules/ModuleWithMixedModules[mixed_modules]/NNCFLinear[called_linear]/linear";
-"10 ManyNonEvalModules/ModuleWithMixedModules[mixed_modules]/NNCFLinear[called_linear]/ModuleDict[pre_ops]/UpdateWeight[0]/AsymmetricQuantizer[op]/asymmetric_quantize" -> "11 ManyNonEvalModules/ModuleWithMixedModules[mixed_modules]/NNCFLinear[called_linear]/linear";
-"12 ManyNonEvalModules/AuxBranch[aux_branch]/linear" -> "13 ManyNonEvalModules/AuxBranch[aux_branch]/Linear[linear]/linear";
-"13 ManyNonEvalModules/AuxBranch[aux_branch]/Linear[linear]/linear" -> "14 ManyNonEvalModules/AuxBranch[aux_branch]/RELU";
-}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/AdaptiveAvgPool2d.dot b/tests/data/reference_graphs/quantized/synthetic_model/AdaptiveAvgPool2d.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/AdaptiveAvgPool2d.dot
@@ -0,0 +1,7 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 TestModel/AdaptiveAvgPool2d[_layer]/adaptive_avg_pool2d" [id=2, scope="TestModel/AdaptiveAvgPool2d[_layer]", type=adaptive_avg_pool2d];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "2 TestModel/AdaptiveAvgPool2d[_layer]/adaptive_avg_pool2d";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/AdaptiveAvgPool3d.dot b/tests/data/reference_graphs/quantized/synthetic_model/AdaptiveAvgPool3d.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/AdaptiveAvgPool3d.dot
@@ -0,0 +1,7 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 TestModel/AdaptiveAvgPool3d[_layer]/adaptive_avg_pool3d" [id=2, scope="TestModel/AdaptiveAvgPool3d[_layer]", type=adaptive_avg_pool3d];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "2 TestModel/AdaptiveAvgPool3d[_layer]/adaptive_avg_pool3d";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/Add.dot b/tests/data/reference_graphs/quantized/synthetic_model/Add.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/Add.dot
@@ -0,0 +1,11 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 /nncf_model_input" [id=2, scope="", type=nncf_model_input];
+"3 SymmetricQuantizer/symmetric_quantize" [id=3, scope=SymmetricQuantizer, type=symmetric_quantize];
+"4 TestModel/add" [id=4, scope=TestModel, type=add];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/add";
+"2 /nncf_model_input" -> "3 SymmetricQuantizer/symmetric_quantize";
+"3 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/add";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/ArangeModel.dot b/tests/data/reference_graphs/quantized/synthetic_model/ArangeModel.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/ArangeModel.dot
@@ -0,0 +1,3 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/AvgPool2d.dot b/tests/data/reference_graphs/quantized/synthetic_model/AvgPool2d.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/AvgPool2d.dot
@@ -0,0 +1,7 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 TestModel/AvgPool2d[_layer]/avg_pool2d" [id=2, scope="TestModel/AvgPool2d[_layer]", type=avg_pool2d];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "2 TestModel/AvgPool2d[_layer]/avg_pool2d";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/AvgPool3d.dot b/tests/data/reference_graphs/quantized/synthetic_model/AvgPool3d.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/AvgPool3d.dot
@@ -0,0 +1,7 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 TestModel/AvgPool3d[_layer]/avg_pool3d" [id=2, scope="TestModel/AvgPool3d[_layer]", type=avg_pool3d];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "2 TestModel/AvgPool3d[_layer]/avg_pool3d";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/BMM.dot b/tests/data/reference_graphs/quantized/synthetic_model/BMM.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/BMM.dot
@@ -0,0 +1,11 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 /nncf_model_input" [id=2, scope="", type=nncf_model_input];
+"3 SymmetricQuantizer/symmetric_quantize" [id=3, scope=SymmetricQuantizer, type=symmetric_quantize];
+"4 TestModel/bmm" [id=4, scope=TestModel, type=bmm];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/bmm";
+"2 /nncf_model_input" -> "3 SymmetricQuantizer/symmetric_quantize";
+"3 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/bmm";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/BatchNorm1d.dot b/tests/data/reference_graphs/quantized/synthetic_model/BatchNorm1d.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/BatchNorm1d.dot
@@ -0,0 +1,7 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 TestModel/BatchNorm1d[_layer]/batch_norm" [id=2, scope="TestModel/BatchNorm1d[_layer]", type=batch_norm];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "2 TestModel/BatchNorm1d[_layer]/batch_norm";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/BatchNorm2d.dot b/tests/data/reference_graphs/quantized/synthetic_model/BatchNorm2d.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/BatchNorm2d.dot
@@ -0,0 +1,7 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 TestModel/BatchNorm2d[_layer]/batch_norm" [id=2, scope="TestModel/BatchNorm2d[_layer]", type=batch_norm];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "2 TestModel/BatchNorm2d[_layer]/batch_norm";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/BatchNorm3d.dot b/tests/data/reference_graphs/quantized/synthetic_model/BatchNorm3d.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/BatchNorm3d.dot
@@ -0,0 +1,7 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 TestModel/BatchNorm3d[_layer]/batch_norm" [id=2, scope="TestModel/BatchNorm3d[_layer]", type=batch_norm];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "2 TestModel/BatchNorm3d[_layer]/batch_norm";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/Conv1d.dot b/tests/data/reference_graphs/quantized/synthetic_model/Conv1d.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/Conv1d.dot
@@ -0,0 +1,9 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 TestModel/NNCFConv1d[_layer]/ModuleDict[pre_ops]/UpdateWeight[0]/SymmetricQuantizer[op]/symmetric_quantize" [id=2, scope="TestModel/NNCFConv1d[_layer]/ModuleDict[pre_ops]/UpdateWeight[0]/SymmetricQuantizer[op]", type=symmetric_quantize];
+"3 TestModel/NNCFConv1d[_layer]/conv1d" [id=3, scope="TestModel/NNCFConv1d[_layer]", type=conv1d];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "3 TestModel/NNCFConv1d[_layer]/conv1d";
+"2 TestModel/NNCFConv1d[_layer]/ModuleDict[pre_ops]/UpdateWeight[0]/SymmetricQuantizer[op]/symmetric_quantize" -> "3 TestModel/NNCFConv1d[_layer]/conv1d";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/Conv2d.dot b/tests/data/reference_graphs/quantized/synthetic_model/Conv2d.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/Conv2d.dot
@@ -0,0 +1,9 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 TestModel/NNCFConv2d[_layer]/ModuleDict[pre_ops]/UpdateWeight[0]/SymmetricQuantizer[op]/symmetric_quantize" [id=2, scope="TestModel/NNCFConv2d[_layer]/ModuleDict[pre_ops]/UpdateWeight[0]/SymmetricQuantizer[op]", type=symmetric_quantize];
+"3 TestModel/NNCFConv2d[_layer]/conv2d" [id=3, scope="TestModel/NNCFConv2d[_layer]", type=conv2d];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "3 TestModel/NNCFConv2d[_layer]/conv2d";
+"2 TestModel/NNCFConv2d[_layer]/ModuleDict[pre_ops]/UpdateWeight[0]/SymmetricQuantizer[op]/symmetric_quantize" -> "3 TestModel/NNCFConv2d[_layer]/conv2d";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/Conv3d.dot b/tests/data/reference_graphs/quantized/synthetic_model/Conv3d.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/Conv3d.dot
@@ -0,0 +1,9 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 TestModel/NNCFConv3d[_layer]/ModuleDict[pre_ops]/UpdateWeight[0]/SymmetricQuantizer[op]/symmetric_quantize" [id=2, scope="TestModel/NNCFConv3d[_layer]/ModuleDict[pre_ops]/UpdateWeight[0]/SymmetricQuantizer[op]", type=symmetric_quantize];
+"3 TestModel/NNCFConv3d[_layer]/conv3d" [id=3, scope="TestModel/NNCFConv3d[_layer]", type=conv3d];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "3 TestModel/NNCFConv3d[_layer]/conv3d";
+"2 TestModel/NNCFConv3d[_layer]/ModuleDict[pre_ops]/UpdateWeight[0]/SymmetricQuantizer[op]/symmetric_quantize" -> "3 TestModel/NNCFConv3d[_layer]/conv3d";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/ConvTranspose2d.dot b/tests/data/reference_graphs/quantized/synthetic_model/ConvTranspose2d.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/ConvTranspose2d.dot
@@ -0,0 +1,9 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 TestModel/NNCFConvTranspose2d[_layer]/ModuleDict[pre_ops]/UpdateWeight[0]/SymmetricQuantizer[op]/symmetric_quantize" [id=2, scope="TestModel/NNCFConvTranspose2d[_layer]/ModuleDict[pre_ops]/UpdateWeight[0]/SymmetricQuantizer[op]", type=symmetric_quantize];
+"3 TestModel/NNCFConvTranspose2d[_layer]/conv_transpose2d" [id=3, scope="TestModel/NNCFConvTranspose2d[_layer]", type=conv_transpose2d];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "3 TestModel/NNCFConvTranspose2d[_layer]/conv_transpose2d";
+"2 TestModel/NNCFConvTranspose2d[_layer]/ModuleDict[pre_ops]/UpdateWeight[0]/SymmetricQuantizer[op]/symmetric_quantize" -> "3 TestModel/NNCFConvTranspose2d[_layer]/conv_transpose2d";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/ConvTranspose3d.dot b/tests/data/reference_graphs/quantized/synthetic_model/ConvTranspose3d.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/ConvTranspose3d.dot
@@ -0,0 +1,9 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 TestModel/NNCFConvTranspose3d[_layer]/ModuleDict[pre_ops]/UpdateWeight[0]/SymmetricQuantizer[op]/symmetric_quantize" [id=2, scope="TestModel/NNCFConvTranspose3d[_layer]/ModuleDict[pre_ops]/UpdateWeight[0]/SymmetricQuantizer[op]", type=symmetric_quantize];
+"3 TestModel/NNCFConvTranspose3d[_layer]/conv_transpose3d" [id=3, scope="TestModel/NNCFConvTranspose3d[_layer]", type=conv_transpose3d];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "3 TestModel/NNCFConvTranspose3d[_layer]/conv_transpose3d";
+"2 TestModel/NNCFConvTranspose3d[_layer]/ModuleDict[pre_ops]/UpdateWeight[0]/SymmetricQuantizer[op]/symmetric_quantize" -> "3 TestModel/NNCFConvTranspose3d[_layer]/conv_transpose3d";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/Div.dot b/tests/data/reference_graphs/quantized/synthetic_model/Div.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/Div.dot
@@ -0,0 +1,11 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 /nncf_model_input" [id=2, scope="", type=nncf_model_input];
+"3 SymmetricQuantizer/symmetric_quantize" [id=3, scope=SymmetricQuantizer, type=symmetric_quantize];
+"4 TestModel/div" [id=4, scope=TestModel, type=div];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/div";
+"2 /nncf_model_input" -> "3 SymmetricQuantizer/symmetric_quantize";
+"3 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/div";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/Dropout.dot b/tests/data/reference_graphs/quantized/synthetic_model/Dropout.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/Dropout.dot
@@ -0,0 +1,5 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 TestModel/Dropout[_layer]/dropout" [id=1, scope="TestModel/Dropout[_layer]", type=dropout];
+"0 /nncf_model_input" -> "1 TestModel/Dropout[_layer]/dropout";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/ELU.dot b/tests/data/reference_graphs/quantized/synthetic_model/ELU.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/ELU.dot
@@ -0,0 +1,7 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 TestModel/ELU[_layer]/elu" [id=2, scope="TestModel/ELU[_layer]", type=elu];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "2 TestModel/ELU[_layer]/elu";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/Erf.dot b/tests/data/reference_graphs/quantized/synthetic_model/Erf.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/Erf.dot
@@ -0,0 +1,7 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 TestModel/erf" [id=2, scope=TestModel, type=erf];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "2 TestModel/erf";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/Exp.dot b/tests/data/reference_graphs/quantized/synthetic_model/Exp.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/Exp.dot
@@ -0,0 +1,7 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 TestModel/exp" [id=2, scope=TestModel, type=exp];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "2 TestModel/exp";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/GELU.dot b/tests/data/reference_graphs/quantized/synthetic_model/GELU.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/GELU.dot
@@ -0,0 +1,7 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 TestModel/GELU[_layer]/gelu" [id=2, scope="TestModel/GELU[_layer]", type=gelu];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "2 TestModel/GELU[_layer]/gelu";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/GatherModel.dot b/tests/data/reference_graphs/quantized/synthetic_model/GatherModel.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/GatherModel.dot
@@ -0,0 +1,3 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/Hardtanh.dot b/tests/data/reference_graphs/quantized/synthetic_model/Hardtanh.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/Hardtanh.dot
@@ -0,0 +1,7 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 TestModel/Hardtanh[_layer]/hardtanh" [id=2, scope="TestModel/Hardtanh[_layer]", type=hardtanh];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "2 TestModel/Hardtanh[_layer]/hardtanh";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/LayerNorm.dot b/tests/data/reference_graphs/quantized/synthetic_model/LayerNorm.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/LayerNorm.dot
@@ -0,0 +1,7 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 TestModel/LayerNorm[_layer]/layer_norm" [id=2, scope="TestModel/LayerNorm[_layer]", type=layer_norm];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "2 TestModel/LayerNorm[_layer]/layer_norm";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/LeakyReLU.dot b/tests/data/reference_graphs/quantized/synthetic_model/LeakyReLU.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/LeakyReLU.dot
@@ -0,0 +1,7 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 TestModel/LeakyReLU[_layer]/leaky_relu" [id=2, scope="TestModel/LeakyReLU[_layer]", type=leaky_relu];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "2 TestModel/LeakyReLU[_layer]/leaky_relu";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/Linear.dot b/tests/data/reference_graphs/quantized/synthetic_model/Linear.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/Linear.dot
@@ -0,0 +1,9 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 TestModel/NNCFLinear[_layer]/ModuleDict[pre_ops]/UpdateWeight[0]/SymmetricQuantizer[op]/symmetric_quantize" [id=2, scope="TestModel/NNCFLinear[_layer]/ModuleDict[pre_ops]/UpdateWeight[0]/SymmetricQuantizer[op]", type=symmetric_quantize];
+"3 TestModel/NNCFLinear[_layer]/linear" [id=3, scope="TestModel/NNCFLinear[_layer]", type=linear];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "3 TestModel/NNCFLinear[_layer]/linear";
+"2 TestModel/NNCFLinear[_layer]/ModuleDict[pre_ops]/UpdateWeight[0]/SymmetricQuantizer[op]/symmetric_quantize" -> "3 TestModel/NNCFLinear[_layer]/linear";
+}
diff --git a/tests/data/reference_graphs/quantized/symmetric/many_non_eval_modules.dot b/tests/data/reference_graphs/quantized/synthetic_model/ManyNonEvalModules.dot
similarity index 100%
rename from tests/data/reference_graphs/quantized/symmetric/many_non_eval_modules.dot
rename to tests/data/reference_graphs/quantized/synthetic_model/ManyNonEvalModules.dot
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/MaskedFillModel.dot b/tests/data/reference_graphs/quantized/synthetic_model/MaskedFillModel.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/MaskedFillModel.dot
@@ -0,0 +1,7 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 MaskedFillModel/masked_fill_" [id=1, scope=MaskedFillModel, type=masked_fill_];
+"2 MaskedFillModel/masked_fill" [id=2, scope=MaskedFillModel, type=masked_fill];
+"0 /nncf_model_input" -> "1 MaskedFillModel/masked_fill_";
+"1 MaskedFillModel/masked_fill_" -> "2 MaskedFillModel/masked_fill";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/MatMul.dot b/tests/data/reference_graphs/quantized/synthetic_model/MatMul.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/MatMul.dot
@@ -0,0 +1,11 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 /nncf_model_input" [id=2, scope="", type=nncf_model_input];
+"3 SymmetricQuantizer/symmetric_quantize" [id=3, scope=SymmetricQuantizer, type=symmetric_quantize];
+"4 TestModel/matmul" [id=4, scope=TestModel, type=matmul];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/matmul";
+"2 /nncf_model_input" -> "3 SymmetricQuantizer/symmetric_quantize";
+"3 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/matmul";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/MaxPool1d.dot b/tests/data/reference_graphs/quantized/synthetic_model/MaxPool1d.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/MaxPool1d.dot
@@ -0,0 +1,3 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/MaxPool2d.dot b/tests/data/reference_graphs/quantized/synthetic_model/MaxPool2d.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/MaxPool2d.dot
@@ -0,0 +1,5 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 TestModel/MaxPool2d[_layer]/max_pool2d" [id=1, scope="TestModel/MaxPool2d[_layer]", type=max_pool2d];
+"0 /nncf_model_input" -> "1 TestModel/MaxPool2d[_layer]/max_pool2d";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/MaxPool3d.dot b/tests/data/reference_graphs/quantized/synthetic_model/MaxPool3d.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/MaxPool3d.dot
@@ -0,0 +1,5 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 TestModel/MaxPool3d[_layer]/max_pool3d" [id=1, scope="TestModel/MaxPool3d[_layer]", type=max_pool3d];
+"0 /nncf_model_input" -> "1 TestModel/MaxPool3d[_layer]/max_pool3d";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/MaxUnpool3d.dot b/tests/data/reference_graphs/quantized/synthetic_model/MaxUnpool3d.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/MaxUnpool3d.dot
@@ -0,0 +1,7 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 PoolUnPool/MaxPool3d[pool]/max_pool3d" [id=1, scope="PoolUnPool/MaxPool3d[pool]", type=max_pool3d];
+"2 PoolUnPool/MaxUnpool3d[unpool]/max_unpool3d" [id=2, scope="PoolUnPool/MaxUnpool3d[unpool]", type=max_unpool3d];
+"0 /nncf_model_input" -> "1 PoolUnPool/MaxPool3d[pool]/max_pool3d";
+"1 PoolUnPool/MaxPool3d[pool]/max_pool3d" -> "2 PoolUnPool/MaxUnpool3d[unpool]/max_unpool3d";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/Mean.dot b/tests/data/reference_graphs/quantized/synthetic_model/Mean.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/Mean.dot
@@ -0,0 +1,3 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/PReLU.dot b/tests/data/reference_graphs/quantized/synthetic_model/PReLU.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/PReLU.dot
@@ -0,0 +1,7 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 TestModel/PReLU[_layer]/prelu" [id=2, scope="TestModel/PReLU[_layer]", type=prelu];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "2 TestModel/PReLU[_layer]/prelu";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/PermuteModel.dot b/tests/data/reference_graphs/quantized/synthetic_model/PermuteModel.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/PermuteModel.dot
@@ -0,0 +1,3 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/ReshapeModel.dot b/tests/data/reference_graphs/quantized/synthetic_model/ReshapeModel.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/ReshapeModel.dot
@@ -0,0 +1,3 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/Sigmoid.dot b/tests/data/reference_graphs/quantized/synthetic_model/Sigmoid.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/Sigmoid.dot
@@ -0,0 +1,7 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 TestModel/Sigmoid[_layer]/sigmoid" [id=2, scope="TestModel/Sigmoid[_layer]", type=sigmoid];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "2 TestModel/Sigmoid[_layer]/sigmoid";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/Sub.dot b/tests/data/reference_graphs/quantized/synthetic_model/Sub.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/Sub.dot
@@ -0,0 +1,4 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 /nncf_model_input" [id=1, scope="", type=nncf_model_input];
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/Tanh.dot b/tests/data/reference_graphs/quantized/synthetic_model/Tanh.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/Tanh.dot
@@ -0,0 +1,7 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 TestModel/Tanh[_layer]/tanh" [id=2, scope="TestModel/Tanh[_layer]", type=tanh];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "2 TestModel/Tanh[_layer]/tanh";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/Threshold.dot b/tests/data/reference_graphs/quantized/synthetic_model/Threshold.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/Threshold.dot
@@ -0,0 +1,5 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 TestModel/Threshold[_layer]/threshold" [id=1, scope="TestModel/Threshold[_layer]", type=threshold];
+"0 /nncf_model_input" -> "1 TestModel/Threshold[_layer]/threshold";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/TransposeModel.dot b/tests/data/reference_graphs/quantized/synthetic_model/TransposeModel.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/TransposeModel.dot
@@ -0,0 +1,3 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/__add__.dot b/tests/data/reference_graphs/quantized/synthetic_model/__add__.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/__add__.dot
@@ -0,0 +1,11 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 /nncf_model_input" [id=2, scope="", type=nncf_model_input];
+"3 SymmetricQuantizer/symmetric_quantize" [id=3, scope=SymmetricQuantizer, type=symmetric_quantize];
+"4 TestModel/__add__" [id=4, scope=TestModel, type=__add__];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/__add__";
+"2 /nncf_model_input" -> "3 SymmetricQuantizer/symmetric_quantize";
+"3 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/__add__";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/__and__.dot b/tests/data/reference_graphs/quantized/synthetic_model/__and__.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/__and__.dot
@@ -0,0 +1,7 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 /nncf_model_input" [id=1, scope="", type=nncf_model_input];
+"2 TestModel/__and__" [id=2, scope=TestModel, type=__and__];
+"0 /nncf_model_input" -> "2 TestModel/__and__";
+"1 /nncf_model_input" -> "2 TestModel/__and__";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/__div__.dot b/tests/data/reference_graphs/quantized/synthetic_model/__div__.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/__div__.dot
@@ -0,0 +1,11 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 /nncf_model_input" [id=2, scope="", type=nncf_model_input];
+"3 SymmetricQuantizer/symmetric_quantize" [id=3, scope=SymmetricQuantizer, type=symmetric_quantize];
+"4 TestModel/__div__" [id=4, scope=TestModel, type=__div__];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/__div__";
+"2 /nncf_model_input" -> "3 SymmetricQuantizer/symmetric_quantize";
+"3 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/__div__";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/__eq__.dot b/tests/data/reference_graphs/quantized/synthetic_model/__eq__.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/__eq__.dot
@@ -0,0 +1,11 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 /nncf_model_input" [id=2, scope="", type=nncf_model_input];
+"3 SymmetricQuantizer/symmetric_quantize" [id=3, scope=SymmetricQuantizer, type=symmetric_quantize];
+"4 TestModel/__eq__" [id=4, scope=TestModel, type=__eq__];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/__eq__";
+"2 /nncf_model_input" -> "3 SymmetricQuantizer/symmetric_quantize";
+"3 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/__eq__";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/__gt__.dot b/tests/data/reference_graphs/quantized/synthetic_model/__gt__.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/__gt__.dot
@@ -0,0 +1,11 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 /nncf_model_input" [id=2, scope="", type=nncf_model_input];
+"3 SymmetricQuantizer/symmetric_quantize" [id=3, scope=SymmetricQuantizer, type=symmetric_quantize];
+"4 TestModel/__gt__" [id=4, scope=TestModel, type=__gt__];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/__gt__";
+"2 /nncf_model_input" -> "3 SymmetricQuantizer/symmetric_quantize";
+"3 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/__gt__";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/__iadd__.dot b/tests/data/reference_graphs/quantized/synthetic_model/__iadd__.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/__iadd__.dot
@@ -0,0 +1,11 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 /nncf_model_input" [id=2, scope="", type=nncf_model_input];
+"3 SymmetricQuantizer/symmetric_quantize" [id=3, scope=SymmetricQuantizer, type=symmetric_quantize];
+"4 TestModel/__iadd__" [id=4, scope=TestModel, type=__iadd__];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/__iadd__";
+"2 /nncf_model_input" -> "3 SymmetricQuantizer/symmetric_quantize";
+"3 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/__iadd__";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/__idiv__.dot b/tests/data/reference_graphs/quantized/synthetic_model/__idiv__.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/__idiv__.dot
@@ -0,0 +1,11 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 /nncf_model_input" [id=2, scope="", type=nncf_model_input];
+"3 SymmetricQuantizer/symmetric_quantize" [id=3, scope=SymmetricQuantizer, type=symmetric_quantize];
+"4 TestModel/__idiv__" [id=4, scope=TestModel, type=__idiv__];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/__idiv__";
+"2 /nncf_model_input" -> "3 SymmetricQuantizer/symmetric_quantize";
+"3 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/__idiv__";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/__imul__.dot b/tests/data/reference_graphs/quantized/synthetic_model/__imul__.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/__imul__.dot
@@ -0,0 +1,11 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 /nncf_model_input" [id=2, scope="", type=nncf_model_input];
+"3 SymmetricQuantizer/symmetric_quantize" [id=3, scope=SymmetricQuantizer, type=symmetric_quantize];
+"4 TestModel/__imul__" [id=4, scope=TestModel, type=__imul__];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/__imul__";
+"2 /nncf_model_input" -> "3 SymmetricQuantizer/symmetric_quantize";
+"3 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/__imul__";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/__isub__.dot b/tests/data/reference_graphs/quantized/synthetic_model/__isub__.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/__isub__.dot
@@ -0,0 +1,11 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 /nncf_model_input" [id=2, scope="", type=nncf_model_input];
+"3 SymmetricQuantizer/symmetric_quantize" [id=3, scope=SymmetricQuantizer, type=symmetric_quantize];
+"4 TestModel/__isub__" [id=4, scope=TestModel, type=__isub__];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/__isub__";
+"2 /nncf_model_input" -> "3 SymmetricQuantizer/symmetric_quantize";
+"3 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/__isub__";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/__le__.dot b/tests/data/reference_graphs/quantized/synthetic_model/__le__.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/__le__.dot
@@ -0,0 +1,11 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 /nncf_model_input" [id=2, scope="", type=nncf_model_input];
+"3 SymmetricQuantizer/symmetric_quantize" [id=3, scope=SymmetricQuantizer, type=symmetric_quantize];
+"4 TestModel/__le__" [id=4, scope=TestModel, type=__le__];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/__le__";
+"2 /nncf_model_input" -> "3 SymmetricQuantizer/symmetric_quantize";
+"3 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/__le__";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/__lt__.dot b/tests/data/reference_graphs/quantized/synthetic_model/__lt__.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/__lt__.dot
@@ -0,0 +1,11 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 /nncf_model_input" [id=2, scope="", type=nncf_model_input];
+"3 SymmetricQuantizer/symmetric_quantize" [id=3, scope=SymmetricQuantizer, type=symmetric_quantize];
+"4 TestModel/__lt__" [id=4, scope=TestModel, type=__lt__];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/__lt__";
+"2 /nncf_model_input" -> "3 SymmetricQuantizer/symmetric_quantize";
+"3 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/__lt__";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/__mod__.dot b/tests/data/reference_graphs/quantized/synthetic_model/__mod__.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/__mod__.dot
@@ -0,0 +1,11 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 /nncf_model_input" [id=2, scope="", type=nncf_model_input];
+"3 SymmetricQuantizer/symmetric_quantize" [id=3, scope=SymmetricQuantizer, type=symmetric_quantize];
+"4 TestModel/__mod__" [id=4, scope=TestModel, type=__mod__];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/__mod__";
+"2 /nncf_model_input" -> "3 SymmetricQuantizer/symmetric_quantize";
+"3 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/__mod__";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/__mul__.dot b/tests/data/reference_graphs/quantized/synthetic_model/__mul__.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/__mul__.dot
@@ -0,0 +1,11 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 /nncf_model_input" [id=2, scope="", type=nncf_model_input];
+"3 SymmetricQuantizer/symmetric_quantize" [id=3, scope=SymmetricQuantizer, type=symmetric_quantize];
+"4 TestModel/__mul__" [id=4, scope=TestModel, type=__mul__];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/__mul__";
+"2 /nncf_model_input" -> "3 SymmetricQuantizer/symmetric_quantize";
+"3 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/__mul__";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/__ne__.dot b/tests/data/reference_graphs/quantized/synthetic_model/__ne__.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/__ne__.dot
@@ -0,0 +1,11 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 /nncf_model_input" [id=2, scope="", type=nncf_model_input];
+"3 SymmetricQuantizer/symmetric_quantize" [id=3, scope=SymmetricQuantizer, type=symmetric_quantize];
+"4 TestModel/__ne__" [id=4, scope=TestModel, type=__ne__];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/__ne__";
+"2 /nncf_model_input" -> "3 SymmetricQuantizer/symmetric_quantize";
+"3 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/__ne__";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/__or__.dot b/tests/data/reference_graphs/quantized/synthetic_model/__or__.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/__or__.dot
@@ -0,0 +1,7 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 /nncf_model_input" [id=1, scope="", type=nncf_model_input];
+"2 TestModel/__or__" [id=2, scope=TestModel, type=__or__];
+"0 /nncf_model_input" -> "2 TestModel/__or__";
+"1 /nncf_model_input" -> "2 TestModel/__or__";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/__pow__.dot b/tests/data/reference_graphs/quantized/synthetic_model/__pow__.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/__pow__.dot
@@ -0,0 +1,11 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 /nncf_model_input" [id=2, scope="", type=nncf_model_input];
+"3 SymmetricQuantizer/symmetric_quantize" [id=3, scope=SymmetricQuantizer, type=symmetric_quantize];
+"4 TestModel/__pow__" [id=4, scope=TestModel, type=__pow__];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/__pow__";
+"2 /nncf_model_input" -> "3 SymmetricQuantizer/symmetric_quantize";
+"3 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/__pow__";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/__radd__.dot b/tests/data/reference_graphs/quantized/synthetic_model/__radd__.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/__radd__.dot
@@ -0,0 +1,11 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 /nncf_model_input" [id=2, scope="", type=nncf_model_input];
+"3 SymmetricQuantizer/symmetric_quantize" [id=3, scope=SymmetricQuantizer, type=symmetric_quantize];
+"4 TestModel/__radd__" [id=4, scope=TestModel, type=__radd__];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/__radd__";
+"2 /nncf_model_input" -> "3 SymmetricQuantizer/symmetric_quantize";
+"3 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/__radd__";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/__rmul__.dot b/tests/data/reference_graphs/quantized/synthetic_model/__rmul__.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/__rmul__.dot
@@ -0,0 +1,11 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 /nncf_model_input" [id=2, scope="", type=nncf_model_input];
+"3 SymmetricQuantizer/symmetric_quantize" [id=3, scope=SymmetricQuantizer, type=symmetric_quantize];
+"4 TestModel/__rmul__" [id=4, scope=TestModel, type=__rmul__];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/__rmul__";
+"2 /nncf_model_input" -> "3 SymmetricQuantizer/symmetric_quantize";
+"3 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/__rmul__";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/__rsub__.dot b/tests/data/reference_graphs/quantized/synthetic_model/__rsub__.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/__rsub__.dot
@@ -0,0 +1,11 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 /nncf_model_input" [id=2, scope="", type=nncf_model_input];
+"3 SymmetricQuantizer/symmetric_quantize" [id=3, scope=SymmetricQuantizer, type=symmetric_quantize];
+"4 TestModel/__rsub__" [id=4, scope=TestModel, type=__rsub__];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/__rsub__";
+"2 /nncf_model_input" -> "3 SymmetricQuantizer/symmetric_quantize";
+"3 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/__rsub__";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/__sub__.dot b/tests/data/reference_graphs/quantized/synthetic_model/__sub__.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/__sub__.dot
@@ -0,0 +1,11 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 /nncf_model_input" [id=2, scope="", type=nncf_model_input];
+"3 SymmetricQuantizer/symmetric_quantize" [id=3, scope=SymmetricQuantizer, type=symmetric_quantize];
+"4 TestModel/__sub__" [id=4, scope=TestModel, type=__sub__];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/__sub__";
+"2 /nncf_model_input" -> "3 SymmetricQuantizer/symmetric_quantize";
+"3 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/__sub__";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/__truediv__.dot b/tests/data/reference_graphs/quantized/synthetic_model/__truediv__.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/__truediv__.dot
@@ -0,0 +1,11 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 /nncf_model_input" [id=2, scope="", type=nncf_model_input];
+"3 SymmetricQuantizer/symmetric_quantize" [id=3, scope=SymmetricQuantizer, type=symmetric_quantize];
+"4 TestModel/__truediv__" [id=4, scope=TestModel, type=__truediv__];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/__truediv__";
+"2 /nncf_model_input" -> "3 SymmetricQuantizer/symmetric_quantize";
+"3 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/__truediv__";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/__xor__.dot b/tests/data/reference_graphs/quantized/synthetic_model/__xor__.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/__xor__.dot
@@ -0,0 +1,7 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 /nncf_model_input" [id=1, scope="", type=nncf_model_input];
+"2 TestModel/__xor__" [id=2, scope=TestModel, type=__xor__];
+"0 /nncf_model_input" -> "2 TestModel/__xor__";
+"1 /nncf_model_input" -> "2 TestModel/__xor__";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/cat.dot b/tests/data/reference_graphs/quantized/synthetic_model/cat.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/cat.dot
@@ -0,0 +1,7 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 /nncf_model_input" [id=1, scope="", type=nncf_model_input];
+"2 TestModel/cat" [id=2, scope=TestModel, type=cat];
+"0 /nncf_model_input" -> "2 TestModel/cat";
+"1 /nncf_model_input" -> "2 TestModel/cat";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/chunk.dot b/tests/data/reference_graphs/quantized/synthetic_model/chunk.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/chunk.dot
@@ -0,0 +1,3 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/clone.dot b/tests/data/reference_graphs/quantized/synthetic_model/clone.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/clone.dot
@@ -0,0 +1,3 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/contiguous.dot b/tests/data/reference_graphs/quantized/synthetic_model/contiguous.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/contiguous.dot
@@ -0,0 +1,3 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/embedding.dot b/tests/data/reference_graphs/quantized/synthetic_model/embedding.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/embedding.dot
@@ -0,0 +1,7 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 /nncf_model_input" [id=1, scope="", type=nncf_model_input];
+"2 TestModel/embedding" [id=2, scope=TestModel, type=embedding];
+"0 /nncf_model_input" -> "2 TestModel/embedding";
+"1 /nncf_model_input" -> "2 TestModel/embedding";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/expand.dot b/tests/data/reference_graphs/quantized/synthetic_model/expand.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/expand.dot
@@ -0,0 +1,3 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/interpolate.dot b/tests/data/reference_graphs/quantized/synthetic_model/interpolate.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/interpolate.dot
@@ -0,0 +1,5 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 TestModel/interpolate" [id=1, scope=TestModel, type=interpolate];
+"0 /nncf_model_input" -> "1 TestModel/interpolate";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/logical_not_.dot b/tests/data/reference_graphs/quantized/synthetic_model/logical_not_.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/logical_not_.dot
@@ -0,0 +1,7 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 TestModel/logical_not_" [id=2, scope=TestModel, type=logical_not_];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "2 TestModel/logical_not_";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/max.dot b/tests/data/reference_graphs/quantized/synthetic_model/max.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/max.dot
@@ -0,0 +1,5 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 TestModel/max" [id=1, scope=TestModel, type=max];
+"0 /nncf_model_input" -> "1 TestModel/max";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/min.dot b/tests/data/reference_graphs/quantized/synthetic_model/min.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/min.dot
@@ -0,0 +1,7 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 TestModel/min" [id=2, scope=TestModel, type=min];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "2 TestModel/min";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/pad.dot b/tests/data/reference_graphs/quantized/synthetic_model/pad.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/pad.dot
@@ -0,0 +1,3 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/pixel_shuffle.dot b/tests/data/reference_graphs/quantized/synthetic_model/pixel_shuffle.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/pixel_shuffle.dot
@@ -0,0 +1,7 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 TestModel/pixel_shuffle" [id=2, scope=TestModel, type=pixel_shuffle];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "2 TestModel/pixel_shuffle";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/relu.dot b/tests/data/reference_graphs/quantized/synthetic_model/relu.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/relu.dot
@@ -0,0 +1,5 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 TestModel/RELU" [id=1, scope=TestModel, type=RELU];
+"0 /nncf_model_input" -> "1 TestModel/RELU";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/relu_.dot b/tests/data/reference_graphs/quantized/synthetic_model/relu_.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/relu_.dot
@@ -0,0 +1,5 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 TestModel/RELU" [id=1, scope=TestModel, type=RELU];
+"0 /nncf_model_input" -> "1 TestModel/RELU";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/repeat_interleave.dot b/tests/data/reference_graphs/quantized/synthetic_model/repeat_interleave.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/repeat_interleave.dot
@@ -0,0 +1,5 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 TestModel/repeat_interleave" [id=1, scope=TestModel, type=repeat_interleave];
+"0 /nncf_model_input" -> "1 TestModel/repeat_interleave";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/round.dot b/tests/data/reference_graphs/quantized/synthetic_model/round.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/round.dot
@@ -0,0 +1,7 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 TestModel/round" [id=2, scope=TestModel, type=round];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "2 TestModel/round";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/softmax.dot b/tests/data/reference_graphs/quantized/synthetic_model/softmax.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/softmax.dot
@@ -0,0 +1,5 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 TestModel/softmax" [id=1, scope=TestModel, type=softmax];
+"0 /nncf_model_input" -> "1 TestModel/softmax";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/split.dot b/tests/data/reference_graphs/quantized/synthetic_model/split.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/split.dot
@@ -0,0 +1,3 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/stack.dot b/tests/data/reference_graphs/quantized/synthetic_model/stack.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/stack.dot
@@ -0,0 +1,7 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 /nncf_model_input" [id=1, scope="", type=nncf_model_input];
+"2 TestModel/stack" [id=2, scope=TestModel, type=stack];
+"0 /nncf_model_input" -> "2 TestModel/stack";
+"1 /nncf_model_input" -> "2 TestModel/stack";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/tensor_mul.dot b/tests/data/reference_graphs/quantized/synthetic_model/tensor_mul.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/tensor_mul.dot
@@ -0,0 +1,11 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 SymmetricQuantizer/symmetric_quantize" [id=1, scope=SymmetricQuantizer, type=symmetric_quantize];
+"2 /nncf_model_input" [id=2, scope="", type=nncf_model_input];
+"3 SymmetricQuantizer/symmetric_quantize" [id=3, scope=SymmetricQuantizer, type=symmetric_quantize];
+"4 TestModel/mul" [id=4, scope=TestModel, type=mul];
+"0 /nncf_model_input" -> "1 SymmetricQuantizer/symmetric_quantize";
+"1 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/mul";
+"2 /nncf_model_input" -> "3 SymmetricQuantizer/symmetric_quantize";
+"3 SymmetricQuantizer/symmetric_quantize" -> "4 TestModel/mul";
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/torch_mul.dot b/tests/data/reference_graphs/quantized/synthetic_model/torch_mul.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/torch_mul.dot
@@ -0,0 +1,4 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+"1 /nncf_model_input" [id=1, scope="", type=nncf_model_input];
+}
diff --git a/tests/data/reference_graphs/quantized/synthetic_model/transpose.dot b/tests/data/reference_graphs/quantized/synthetic_model/transpose.dot
new file mode 100644
--- /dev/null
+++ b/tests/data/reference_graphs/quantized/synthetic_model/transpose.dot
@@ -0,0 +1,3 @@
+strict digraph  {
+"0 /nncf_model_input" [id=0, scope="", type=nncf_model_input];
+}
diff --git a/tests/helpers.py b/tests/helpers.py
--- a/tests/helpers.py
+++ b/tests/helpers.py
@@ -129,7 +129,8 @@ def nz_bias_num(self):
         return 2
 
 
-def get_empty_config(model_size=4, input_sample_sizes: Union[Tuple[List[int]], List[int]] = None):
+def get_empty_config(model_size=4, input_sample_sizes: Union[Tuple[List[int]], List[int]] = None,
+                     input_info=None):
     if input_sample_sizes is None:
         input_sample_sizes = [1, 1, 4, 4]
 
@@ -142,7 +143,7 @@ def _create_input_info():
     config.update({
         "model": "basic_sparse_conv",
         "model_size": model_size,
-        "input_info": _create_input_info()
+        "input_info": input_info if input_info else _create_input_info()
     })
     return config
 
diff --git a/tests/test_compressed_graph.py b/tests/test_compressed_graph.py
--- a/tests/test_compressed_graph.py
+++ b/tests/test_compressed_graph.py
@@ -10,13 +10,15 @@
  See the License for the specific language governing permissions and
  limitations under the License.
 """
-from typing import List, Tuple, Dict, Optional
+from abc import abstractmethod, ABC
+from typing import List, Tuple, Dict, Optional, Callable, Union
 
 import networkx as nx
 import os
 import pytest
 import torch
 import torch.nn as nn
+import torch.nn.functional as F
 import torchvision
 from functools import partial
 from copy import deepcopy
@@ -38,11 +40,12 @@
 from nncf.quantization.quantizer_propagation import QuantizerPropagationSolver
 from nncf.quantization.layers import QuantizerConfig
 from nncf.hw_config import HWConfig, HWConfigType
-from tests.test_models.synthetic import ManyNonEvalModules
+from tests.test_models.synthetic import ManyNonEvalModules, PoolUnPool, ArangeModel, TransposeModel, \
+    GatherModel, MaskedFillModel, ReshapeModel, ModelWithDummyParameter
 
 
-def get_basic_quantization_config(quantization_type, input_sample_sizes=None):
-    config = get_empty_config(input_sample_sizes=input_sample_sizes)
+def get_basic_quantization_config(quantization_type='symmetric', input_sample_sizes=None, input_info=None):
+    config = get_empty_config(input_sample_sizes=input_sample_sizes, input_info=input_info)
     config["compression"] = {"algorithm": "quantization",
                              "activations": {
                                  "mode": quantization_type
@@ -183,11 +186,10 @@ def gen_packed_sequence():
 
 
 class ModelDesc:
-    def __init__(self, dot_filename: str, model_builder, input_sample_sizes, dummy_forward_fn=None,
+    def __init__(self, model_name: str, model_builder, input_sample_sizes, dummy_forward_fn=None,
                  wrap_inputs_fn=None):
-        self.model_name = self._get_model_name(dot_filename)
+        self.model_name = model_name
         self.model_builder = model_builder
-        self.dot_filename = dot_filename
         self.input_sample_sizes = input_sample_sizes
 
         def dummy_forward_wrapper(model_):
@@ -199,11 +201,9 @@ def dummy_forward_wrapper(model_):
 
         self.wrap_inputs_fn = wrap_inputs_fn
 
-    @staticmethod
-    def _get_model_name(dot_filename):
-        if isinstance(dot_filename, tuple):
-            dot_filename = dot_filename[0]
-        return dot_filename[:dot_filename.find('.dot')]
+    @property
+    def dot_filename(self):
+        return self.model_name + '.dot'
 
 
 def sr_wrap_inputs_fn(model_args, model_kwargs):
@@ -224,33 +224,33 @@ def sr_dummy_forward_fn(model_, input_sample_sizes: Tuple[List[int]]):
 
 
 TEST_MODELS_DESC = [
-    ModelDesc("alexnet.dot", test_models.AlexNet, [1, 3, 32, 32]),
-    ModelDesc("lenet.dot", test_models.LeNet, [1, 3, 32, 32]),
-    ModelDesc("resnet18.dot", test_models.ResNet18, [1, 3, 32, 32]),
-    ModelDesc("resnet50.dot", test_models.ResNet50, [1, 3, 32, 32]),
-    ModelDesc("vgg16.dot", partial(test_models.VGG, 'VGG16'), [1, 3, 32, 32]),
-    ModelDesc("inception.dot", test_models.GoogLeNet, [1, 3, 32, 32]),
-    ModelDesc("densenet121.dot", test_models.DenseNet121, [1, 3, 32, 32]),
-    ModelDesc("inception_v3.dot", partial(test_models.Inception3, aux_logits=True, transform_input=True),
+    ModelDesc("alexnet", test_models.AlexNet, [1, 3, 32, 32]),
+    ModelDesc("lenet", test_models.LeNet, [1, 3, 32, 32]),
+    ModelDesc("resnet18", test_models.ResNet18, [1, 3, 32, 32]),
+    ModelDesc("resnet50", test_models.ResNet50, [1, 3, 32, 32]),
+    ModelDesc("vgg16", partial(test_models.VGG, 'VGG16'), [1, 3, 32, 32]),
+    ModelDesc("inception", test_models.GoogLeNet, [1, 3, 32, 32]),
+    ModelDesc("densenet121", test_models.DenseNet121, [1, 3, 32, 32]),
+    ModelDesc("inception_v3", partial(test_models.Inception3, aux_logits=True, transform_input=True),
               [2, 3, 299, 299]),
-    ModelDesc("squeezenet1_0.dot", test_models.squeezenet1_0, [1, 3, 32, 32]),
-    ModelDesc("squeezenet1_1.dot", test_models.squeezenet1_1, [1, 3, 32, 32]),
-    ModelDesc("shufflenetv2.dot", partial(test_models.ShuffleNetV2, net_size=0.5), [1, 3, 32, 32]),
-    ModelDesc("shuflenet_g2.dot", test_models.ShuffleNetG2, [1, 3, 32, 32]),
-    ModelDesc("ssd_vgg.dot", test_models.ssd_vgg300, [2, 3, 300, 300]),
-    ModelDesc("ssd_mobilenet.dot", test_models.ssd_mobilenet, [2, 3, 300, 300]),
-    ModelDesc("mobilenet_v2.dot", torchvision.models.MobileNetV2, [2, 3, 32, 32]),
-    ModelDesc("resnext29_32x4d.dot", test_models.ResNeXt29_32x4d, [1, 3, 32, 32]),
-    ModelDesc("pnasnetb.dot", test_models.PNASNetB, [1, 3, 32, 32]),
-    ModelDesc("senet18.dot", test_models.SENet18, [1, 3, 32, 32]),
-    ModelDesc("preresnet50.dot", test_models.PreActResNet50, [1, 3, 32, 32]),
-    ModelDesc("unet.dot", test_models.UNet, [1, 3, 360, 480]),
-    ModelDesc("lstm_cell.dot", LSTMCellNNCF, [1, 1]),
-    ModelDesc("lstm_uni_seq.dot", partial(NNCF_RNN, num_layers=1, bidirectional=False), [3, 1, 1]),
-    ModelDesc("lstm_uni_stacked.dot", partial(NNCF_RNN, num_layers=2, bidirectional=False), [3, 1, 1]),
-    ModelDesc("lstm_bi_seq.dot", partial(NNCF_RNN, num_layers=1, bidirectional=True), [3, 1, 1]),
-    ModelDesc("lstm_bi_stacked.dot", partial(NNCF_RNN, num_layers=2, bidirectional=True), [3, 1, 1]),
-    ModelDesc("sr_small_model.dot", test_models.SmallModel, ([1, 3, 32, 32], [1, 3, 96, 96]),
+    ModelDesc("squeezenet1_0", test_models.squeezenet1_0, [1, 3, 32, 32]),
+    ModelDesc("squeezenet1_1", test_models.squeezenet1_1, [1, 3, 32, 32]),
+    ModelDesc("shufflenetv2", partial(test_models.ShuffleNetV2, net_size=0.5), [1, 3, 32, 32]),
+    ModelDesc("shuflenet_g2", test_models.ShuffleNetG2, [1, 3, 32, 32]),
+    ModelDesc("ssd_vgg", test_models.ssd_vgg300, [2, 3, 300, 300]),
+    ModelDesc("ssd_mobilenet", test_models.ssd_mobilenet, [2, 3, 300, 300]),
+    ModelDesc("mobilenet_v2", torchvision.models.MobileNetV2, [2, 3, 32, 32]),
+    ModelDesc("resnext29_32x4d", test_models.ResNeXt29_32x4d, [1, 3, 32, 32]),
+    ModelDesc("pnasnetb", test_models.PNASNetB, [1, 3, 32, 32]),
+    ModelDesc("senet18", test_models.SENet18, [1, 3, 32, 32]),
+    ModelDesc("preresnet50", test_models.PreActResNet50, [1, 3, 32, 32]),
+    ModelDesc("unet", test_models.UNet, [1, 3, 360, 480]),
+    ModelDesc("lstm_cell", LSTMCellNNCF, [1, 1]),
+    ModelDesc("lstm_uni_seq", partial(NNCF_RNN, num_layers=1, bidirectional=False), [3, 1, 1]),
+    ModelDesc("lstm_uni_stacked", partial(NNCF_RNN, num_layers=2, bidirectional=False), [3, 1, 1]),
+    ModelDesc("lstm_bi_seq", partial(NNCF_RNN, num_layers=1, bidirectional=True), [3, 1, 1]),
+    ModelDesc("lstm_bi_stacked", partial(NNCF_RNN, num_layers=2, bidirectional=True), [3, 1, 1]),
+    ModelDesc("sr_small_model", test_models.SmallModel, ([1, 3, 32, 32], [1, 3, 96, 96]),
               dummy_forward_fn=sr_dummy_forward_fn,
               wrap_inputs_fn=sr_wrap_inputs_fn)
 ]
@@ -381,15 +381,6 @@ def test_resnet18__with_not_qinput(_case_config):
     check_model_graph(compressed_model, 'resnet18_no_qinput.dot', _case_config.graph_dir)
 
 
-def test_module_with_many_non_eval_modules(_case_config, tmp_path):
-    model = ManyNonEvalModules()
-    config = get_basic_quantization_config(_case_config.quant_type, input_sample_sizes=[1, 1, 1, 1])
-
-    compressed_model, _ = create_compressed_model_and_algo_for_test(model, config)
-
-    check_model_graph(compressed_model, 'many_non_eval_modules.dot', _case_config.graph_dir)
-
-
 def test_resnet18__with_ignore(_case_config):
     model = test_models.ResNet18()
     input_shape = [1, 3, 32, 32]
@@ -403,6 +394,304 @@ def test_resnet18__with_ignore(_case_config):
     check_model_graph(compressed_model, 'resnet18_ignore.dot', _case_config.graph_dir)
 
 
+def n_inputs_fn(model_args, model_kwargs, nargs=2):
+    model_args = tuple(nncf_model_input(model_args[i]) for i in range(nargs))
+    return model_args, model_kwargs
+
+
+def cat_two_inputs_fn(model_args, model_kwargs):
+    model_args = tuple(nncf_model_input(model_args[i]) for i in range(2))
+    return (model_args,), model_kwargs
+
+
+class IModelDesc(ABC):
+
+    @abstractmethod
+    def get_input_sample_sizes(self):
+        pass
+
+    @abstractmethod
+    def get_input_info(self):
+        pass
+
+    @abstractmethod
+    def get_model(self):
+        pass
+
+    @abstractmethod
+    def get_dot_filename(self):
+        pass
+
+    @abstractmethod
+    def get_wrap_inputs_fn(self):
+        pass
+
+
+class BaseDesc(IModelDesc):
+    def __init__(self, input_sample_sizes: Union[Tuple[List[int], ...], List[int]] = None,
+                 model_name: str = None, wrap_inputs_fn: Callable = None, input_info=None,
+                 dummy_forward_fn=None):
+        self.input_sample_sizes = input_sample_sizes
+        self.input_info = input_info
+        self.model_name = model_name
+        self.wrap_inputs_fn = wrap_inputs_fn
+        self.dummy_forward_fn = dummy_forward_fn
+
+    def get_input_sample_sizes(self):
+        return self.input_sample_sizes
+
+    def get_input_info(self):
+        return self.input_info
+
+    def get_dot_filename(self):
+        return self.model_name + '.dot'
+
+    def get_wrap_inputs_fn(self):
+        return self.wrap_inputs_fn
+
+    def get_dummy_forward_fn(self):
+        return self.dummy_forward_fn
+
+    @abstractmethod
+    def get_model(self):
+        pass
+
+
+class GeneralModelDesc(BaseDesc):
+    def __init__(self,
+                 input_sample_sizes: Union[Tuple[List[int], ...], List[int]] = None,
+                 model_name: str = None, wrap_inputs_fn: Callable = None, model_builder=None, input_info=None):
+        super().__init__(input_sample_sizes, model_name, wrap_inputs_fn, input_info)
+        if not model_name and hasattr(model_builder, '__name__'):
+            self.model_name = model_builder.__name__
+        self.model_builder = model_builder
+
+    def get_model(self):
+        return self.model_builder()
+
+
+class SingleLayerModelDesc(BaseDesc):
+    def __init__(self, layer: nn.Module,
+                 input_sample_sizes: Union[Tuple[List[int], ...], List[int]] = None, model_name: str = None,
+                 wrap_inputs_fn: Callable = None, input_info=None):
+        super().__init__(input_sample_sizes, model_name, wrap_inputs_fn, input_info)
+
+        self.model_name = model_name
+        if model_name is None:
+            self.model_name = layer.__class__.__name__
+
+        self.layer = layer
+        self.input_sample_sizes = input_sample_sizes if input_sample_sizes else [1]
+        self.wrap_inputs_fn = wrap_inputs_fn
+        if wrap_inputs_fn is None:
+            self.wrap_inputs_fn = partial(n_inputs_fn, nargs=1)
+
+    def get_model(self):
+        class TestModel(ModelWithDummyParameter):
+            def __init__(self, layer):
+                super().__init__()
+                self._layer = layer
+
+            def forward(self, *args, **kwargs):
+                return self._layer(*args, **kwargs)
+
+        return TestModel(self.layer)
+
+
+class TorchBinaryMethodDesc(SingleLayerModelDesc):
+    def __init__(self, model_name: str, torch_method: Callable, input_info=None):
+        super().__init__(layer=torch_method, model_name=model_name, input_sample_sizes=([1], [1]),
+                         wrap_inputs_fn=n_inputs_fn, input_info=input_info)
+
+
+class TensorBinaryMethodsDesc(BaseDesc):
+    def __init__(self, tensor_method: str, model_name: str = None, input_info=None):
+        super().__init__(input_sample_sizes=([1], [1]), wrap_inputs_fn=n_inputs_fn, model_name=model_name,
+                         input_info=input_info)
+
+        self.model_name = model_name
+        if model_name is None:
+            self.model_name = tensor_method
+        self.tensor_method = tensor_method
+
+    def get_model(self):
+        class TestModel(ModelWithDummyParameter):
+            def __init__(self, tensor_method):
+                super().__init__()
+                self._tensor_method = tensor_method
+
+            def forward(self, t1, t2):
+                return getattr(t1, self._tensor_method)(t2)
+
+        return TestModel(self.tensor_method)
+
+
+class TensorUnaryMethodsDesc(BaseDesc):
+    def __init__(self, tensor_method: str, model_name: str = None, input_info=None, **model_kwargs):
+        super().__init__(input_sample_sizes=([1]), wrap_inputs_fn=partial(n_inputs_fn, nargs=1), model_name=model_name,
+                         input_info=input_info)
+        self.model_name = model_name
+        if model_name is None:
+            self.model_name = tensor_method
+        self.tensor_method = tensor_method
+        self.model_kwargs = model_kwargs
+
+    def get_model(self):
+        class TestModel(ModelWithDummyParameter):
+            def __init__(self, tensor_method, **model_kwargs):
+                super().__init__()
+                self._tensor_method = tensor_method
+                self.model_kwargs = model_kwargs
+
+            def forward(self, x):
+                if self.model_kwargs:
+                    return getattr(x, self._tensor_method)(**self.model_kwargs)
+                return getattr(x, self._tensor_method)()
+
+        return TestModel(self.tensor_method, **self.model_kwargs)
+
+
+TWO_INT_INPUTS_INFO = [{"sample_size": [1], "type": "long"}, {"sample_size": [1], "type": "long"}]
+SYNTHETIC_MODEL_DESC_LIST = [
+    SingleLayerModelDesc(layer=nn.Conv1d(1, 1, 1), input_sample_sizes=[1, 1, 1]),
+    SingleLayerModelDesc(layer=nn.Conv2d(1, 1, 1), input_sample_sizes=[1, 1, 1, 1]),
+    SingleLayerModelDesc(layer=nn.ConvTranspose2d(1, 1, 1), input_sample_sizes=[1, 1, 1, 1]),
+    SingleLayerModelDesc(layer=nn.Conv3d(1, 1, 1), input_sample_sizes=[1, 1, 1, 1, 1]),
+    SingleLayerModelDesc(layer=nn.ConvTranspose3d(1, 1, 1), input_sample_sizes=[1, 1, 1, 1, 1]),
+
+    SingleLayerModelDesc(layer=nn.Linear(1, 1)),
+
+    SingleLayerModelDesc(layer=nn.Hardtanh()),
+    SingleLayerModelDesc(layer=nn.Tanh()),
+    SingleLayerModelDesc(layer=nn.ELU()),
+    SingleLayerModelDesc(layer=nn.PReLU()),
+    SingleLayerModelDesc(layer=nn.LeakyReLU()),
+    SingleLayerModelDesc(layer=nn.LayerNorm(normalized_shape=[1])),
+    SingleLayerModelDesc(layer=nn.GELU()),
+    SingleLayerModelDesc(layer=nn.Sigmoid()),
+
+    TorchBinaryMethodDesc('Add', torch.add),
+    TensorBinaryMethodsDesc('__add__'),
+    TensorBinaryMethodsDesc('__radd__'),
+    TensorBinaryMethodsDesc('__iadd__'),
+
+    TorchBinaryMethodDesc('Sub', torch.sub),
+    TensorBinaryMethodsDesc('__sub__'),
+    TensorBinaryMethodsDesc('__rsub__'),
+    TensorBinaryMethodsDesc('__isub__'),
+
+    TorchBinaryMethodDesc('torch_mul', torch.mul),
+    TensorBinaryMethodsDesc('mul', model_name='tensor_mul'),
+    TensorBinaryMethodsDesc('__mul__'),
+    TensorBinaryMethodsDesc('__rmul__'),
+    TensorBinaryMethodsDesc('__imul__'),
+
+    TorchBinaryMethodDesc('Div', torch.div),
+    TensorBinaryMethodsDesc('__div__'),
+    TensorBinaryMethodsDesc('__idiv__'),
+    TensorBinaryMethodsDesc('__truediv__'),
+
+    SingleLayerModelDesc(model_name='Exp', layer=torch.exp),
+    SingleLayerModelDesc(model_name='Erf', layer=torch.erf),
+
+    TorchBinaryMethodDesc(model_name='MatMul', torch_method=torch.matmul),
+    SingleLayerModelDesc(model_name='BMM', layer=torch.bmm, input_sample_sizes=([1, 1, 1], [1, 1, 1]),
+                         wrap_inputs_fn=n_inputs_fn),
+    TensorBinaryMethodsDesc(model_name='MatMul', tensor_method='matmul'),
+
+    SingleLayerModelDesc(model_name='Mean', layer=torch.mean),
+
+    TensorUnaryMethodsDesc(tensor_method='round'),
+
+    SingleLayerModelDesc(layer=nn.Dropout()),
+    SingleLayerModelDesc(layer=nn.Threshold(0.1, 20)),
+
+    SingleLayerModelDesc(layer=nn.BatchNorm1d(1), input_sample_sizes=([2, 1, 1])),
+    SingleLayerModelDesc(layer=nn.BatchNorm2d(1), input_sample_sizes=([2, 1, 1, 1])),
+    SingleLayerModelDesc(layer=nn.BatchNorm3d(1), input_sample_sizes=([2, 1, 1, 1, 1])),
+
+    SingleLayerModelDesc(layer=nn.AvgPool2d(1), input_sample_sizes=[1, 1, 1]),
+    SingleLayerModelDesc(layer=nn.AdaptiveAvgPool2d(1), input_sample_sizes=[1, 1, 1]),
+    SingleLayerModelDesc(layer=nn.AvgPool3d(1), input_sample_sizes=[1, 1, 1, 1]),
+    SingleLayerModelDesc(layer=nn.AdaptiveAvgPool3d(1), input_sample_sizes=[1, 1, 1, 1]),
+
+    SingleLayerModelDesc(layer=nn.MaxPool1d(1), input_sample_sizes=[1, 1, 1]),
+    SingleLayerModelDesc(layer=nn.MaxPool2d(1), input_sample_sizes=[1, 1, 1]),
+    SingleLayerModelDesc(layer=nn.MaxPool3d(1), input_sample_sizes=[1, 1, 1, 1]),
+
+    GeneralModelDesc(model_name='MaxUnpool3d', model_builder=PoolUnPool,
+                     input_info={"sample_size": [1, 1, 3, 3, 3], "type": "float", "filler": "random"}),
+
+    SingleLayerModelDesc(model_name='pad', layer=partial(F.pad, pad=[1, 1]), input_sample_sizes=([2, 2])),
+    SingleLayerModelDesc(model_name='cat', layer=partial(torch.cat, dim=0), wrap_inputs_fn=cat_two_inputs_fn,
+                         input_sample_sizes=([1], [1])),
+    SingleLayerModelDesc(model_name='stack', layer=partial(torch.stack, dim=0), wrap_inputs_fn=cat_two_inputs_fn,
+                         input_sample_sizes=([1], [1])),
+
+    SingleLayerModelDesc(model_name='relu', layer=torch.relu),
+    SingleLayerModelDesc(model_name='relu_', layer=torch.relu_),
+
+    SingleLayerModelDesc(model_name='max', layer=torch.max),
+    SingleLayerModelDesc(model_name='min', layer=torch.min),
+
+    GeneralModelDesc(model_builder=ArangeModel),
+
+    SingleLayerModelDesc(model_name='transpose', layer=partial(torch.transpose, dim0=0, dim1=0)),
+    GeneralModelDesc(model_builder=TransposeModel, input_sample_sizes=([1])),
+
+    GeneralModelDesc(model_builder=GatherModel),
+
+    GeneralModelDesc(model_builder=MaskedFillModel),
+    GeneralModelDesc(model_builder=ReshapeModel, input_sample_sizes=([1])),
+
+    TensorUnaryMethodsDesc(tensor_method='contiguous'),
+    TensorUnaryMethodsDesc(tensor_method='split', split_size=(1,)),
+    TensorUnaryMethodsDesc(tensor_method='chunk', chunks=1),
+    TensorUnaryMethodsDesc(tensor_method='expand', size=(1,)),
+
+    TorchBinaryMethodDesc(model_name='embedding', torch_method=F.embedding,
+                          input_info=[{"sample_size": [1], "type": "long"}, {"sample_size": [2]}]),
+    SingleLayerModelDesc(model_name='softmax', layer=F.softmax),
+
+    TensorBinaryMethodsDesc(tensor_method='__lt__'),
+    TensorBinaryMethodsDesc(tensor_method='__le__'),
+    TensorBinaryMethodsDesc(tensor_method='__gt__'),
+    TensorBinaryMethodsDesc(tensor_method='__mod__'),
+    TensorBinaryMethodsDesc(tensor_method='__eq__'),
+    TensorBinaryMethodsDesc(tensor_method='__ne__'),
+    TensorBinaryMethodsDesc(tensor_method='__or__', input_info=TWO_INT_INPUTS_INFO),
+    TensorBinaryMethodsDesc(tensor_method='__xor__', input_info=TWO_INT_INPUTS_INFO),
+    TensorBinaryMethodsDesc(tensor_method='__and__', input_info=TWO_INT_INPUTS_INFO),
+    TensorUnaryMethodsDesc(tensor_method='logical_not_'),
+    TensorBinaryMethodsDesc(tensor_method='__pow__'),
+    SingleLayerModelDesc(model_name='interpolate', layer=partial(F.interpolate, size=1),
+                         input_sample_sizes=([1, 1, 1])),
+
+    SingleLayerModelDesc(model_name='repeat_interleave', layer=partial(torch.repeat_interleave, repeats=2)),
+    TensorUnaryMethodsDesc(tensor_method='clone'),
+
+    SingleLayerModelDesc(model_name='pixel_shuffle', layer=partial(F.pixel_shuffle, upscale_factor=1),
+                         input_sample_sizes=([1, 1, 1, 1])),
+
+    GeneralModelDesc(model_builder=ManyNonEvalModules, input_sample_sizes=([1, 1, 1, 1]))
+]
+
+
+@pytest.mark.parametrize(
+    "synthetic_model_desc", SYNTHETIC_MODEL_DESC_LIST, ids=[m.model_name for m in SYNTHETIC_MODEL_DESC_LIST]
+)
+def test_synthetic_model_quantization(synthetic_model_desc: IModelDesc):
+    config = get_basic_quantization_config(input_sample_sizes=synthetic_model_desc.get_input_sample_sizes(),
+                                           input_info=synthetic_model_desc.get_input_info())
+
+    model = synthetic_model_desc.get_model()
+    compressed_model, _ = create_compressed_model_and_algo_for_test(
+        model, config, wrap_inputs_fn=synthetic_model_desc.get_wrap_inputs_fn())
+
+    check_model_graph(compressed_model, synthetic_model_desc.get_dot_filename(),
+                      os.path.join('quantized', 'synthetic_model'))
+
+
 def test_iterate_module_list():
     class Net(nn.Module):
         def __init__(self):
diff --git a/tests/test_models/synthetic.py b/tests/test_models/synthetic.py
--- a/tests/test_models/synthetic.py
+++ b/tests/test_models/synthetic.py
@@ -10,13 +10,25 @@
  See the License for the specific language governing permissions and
  limitations under the License.
 """
+from abc import abstractmethod
+
 import torch
 from torch import nn
 import torch.nn.functional as F
 from torch.nn import Parameter, Dropout
 
 
-class ManyNonEvalModules(nn.Module):
+class ModelWithDummyParameter(nn.Module):
+    def __init__(self):
+        super().__init__()
+        self.dummy_param = Parameter(torch.zeros(1))
+
+    @abstractmethod
+    def forward(self, x):
+        pass
+
+
+class ManyNonEvalModules(ModelWithDummyParameter):
     class AuxBranch(nn.Module):
         def __init__(self):
             super().__init__()
@@ -45,7 +57,6 @@ def forward(self, x):
 
     def __init__(self):
         super().__init__()
-        self.dummy = Parameter(torch.ones([1]))
         self.aux_branch = self.AuxBranch()
         self.mixed_modules = self.ModuleWithMixedModules()
         self.avg_pool = nn.AvgPool2d(1)
@@ -56,3 +67,51 @@ def forward(self, x):
             aux = self.aux_branch(x)
         x = self.mixed_modules(x)
         return x, aux if self.training else x
+
+
+class PoolUnPool(ModelWithDummyParameter):
+    def __init__(self):
+        super().__init__()
+        self.pool = nn.MaxPool3d(3, stride=2, return_indices=True)
+        self.unpool = nn.MaxUnpool3d(3, stride=2)
+
+    def forward(self, input_):
+        output, indices = self.pool(input_)
+        return self.unpool(output, indices)
+
+
+class ArangeModel(ModelWithDummyParameter):
+    def forward(self, dummy_x):
+        return torch.arange(0, dummy_x.size(0), dtype=torch.int64)
+
+
+class TransposeModel(ModelWithDummyParameter):
+    def forward(self, x):
+        o1 = x.transpose(dim0=0, dim1=0)
+        o2 = x.permute(dims=[0])
+        return o1, o2
+
+
+class GatherModel(ModelWithDummyParameter):
+    def forward(self, x):
+        index = torch.zeros(1, dtype=torch.int64).to(x.device)
+        o1 = torch.where(self.dummy_param > 0, x, self.dummy_param)
+        o2 = torch.index_select(x, dim=0, index=index)
+        o3 = x.index_select(dim=0, index=index)
+        o4 = x[0]
+        return o1, o2, o3, o4
+
+
+class MaskedFillModel(ModelWithDummyParameter):
+    def forward(self, x):
+        o1 = x.masked_fill_(self.dummy_param > 0, 1.0)
+        o2 = x.masked_fill(self.dummy_param > 0, 1.0)
+        return o1, o2
+
+
+class ReshapeModel(ModelWithDummyParameter):
+    def forward(self, x):
+        torch.squeeze(x)
+        torch.unsqueeze(x, dim=0)
+        torch.flatten(x)
+        return x.reshape([1]), x.squeeze(), x.flatten(), x.unsqueeze(dim=0), x.view([1])