152 lines
5.6 KiB
Python
152 lines
5.6 KiB
Python
# Copyright (C) 2018-2021 Intel Corporation
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
import unittest
|
|
|
|
import numpy as np
|
|
|
|
from extensions.ops.elementwise import Round, Elementwise
|
|
from mo.front.common.partial_infer.utils import int64_array
|
|
from mo.graph.graph import Node
|
|
from mo.middle.passes.infer import type_infer
|
|
from unit_tests.utils.graph import valued_const_with_data, result, regular_op_with_empty_data, connect, \
|
|
shaped_parameter, build_graph
|
|
|
|
|
|
def round_test_graph(nodes_attributes, value, mode: str):
|
|
graph = build_graph(nodes_attributes,
|
|
[
|
|
('node_1', 'elementwise_node'),
|
|
('elementwise_node', 'node_3')
|
|
],
|
|
{
|
|
'node_1': {
|
|
'value': value
|
|
},
|
|
'elementwise_node': {
|
|
'op': 'Round',
|
|
'mode': mode,
|
|
},
|
|
'node_3': {
|
|
'value': None
|
|
}
|
|
})
|
|
return graph
|
|
|
|
|
|
class TestElementwiseOp(unittest.TestCase):
|
|
nodes_attributes = {
|
|
'node_1': {
|
|
'shape': np.array([13]),
|
|
'value': None
|
|
},
|
|
'elementwise_node': {
|
|
'op': None,
|
|
'kind': 'op',
|
|
'operation': None
|
|
},
|
|
'node_3': {
|
|
'shape': None
|
|
}
|
|
}
|
|
|
|
value = np.array([-23.5, -22.5, -2.5, -1.5, -0.5, 0.5, 0.9, 1.5, 2.3, 2.5, 3.5, 22.5, 23.5])
|
|
|
|
def test_elementwise_round_even_infer(self):
|
|
graph = round_test_graph(self.nodes_attributes, self.value, 'half_to_even')
|
|
|
|
graph.graph['layout'] = 'NCHW'
|
|
elementwise_node = Node(graph, 'elementwise_node')
|
|
Round.infer(elementwise_node)
|
|
exp_shape = np.array([13])
|
|
res_shape = graph.node['node_3']['shape']
|
|
res_value = graph.node['node_3']['value']
|
|
exp_value = np.array([-24., -22., -2., -2., -0., 0., 1., 2., 2., 2., 4., 22., 24., ])
|
|
for i, value in enumerate(exp_shape):
|
|
self.assertEqual(res_shape[i], value)
|
|
for i, value in enumerate(exp_value):
|
|
self.assertAlmostEqual(res_value[i], value)
|
|
|
|
def test_elementwise_round_away_infer(self):
|
|
graph = round_test_graph(self.nodes_attributes, self.value, 'half_away_from_zero')
|
|
|
|
graph.graph['layout'] = 'NCHW'
|
|
elementwise_node = Node(graph, 'elementwise_node')
|
|
Round.infer(elementwise_node)
|
|
exp_shape = np.array([13])
|
|
res_shape = graph.node['node_3']['shape']
|
|
res_value = graph.node['node_3']['value']
|
|
exp_value = np.array([-24., -23., -3., -2., -1., 1., 1., 2., 2., 3., 4., 23., 24.])
|
|
for i, value in enumerate(exp_shape):
|
|
self.assertEqual(res_shape[i], value)
|
|
for i, value in enumerate(exp_value):
|
|
self.assertAlmostEqual(res_value[i], value)
|
|
|
|
|
|
class TestElementwiseTypeAlignment(unittest.TestCase):
|
|
|
|
@staticmethod
|
|
def build_graph_to_test_type_alignment(edges,
|
|
input_1_type=np.float32,
|
|
input_2_type=np.float32,
|
|
const_type=np.float32):
|
|
input_shape = int64_array([1, 3, 255, 255])
|
|
const_value = np.array([1], dtype=const_type)
|
|
|
|
nodes = {
|
|
**shaped_parameter('input_1', input_shape, {'data_type': input_1_type}),
|
|
**shaped_parameter('input_2', input_shape, {'data_type': input_2_type}),
|
|
**regular_op_with_empty_data('add', {'op': 'Add', 'type': 'Add', 'type_infer': Elementwise.type_infer}),
|
|
**valued_const_with_data('const', const_value, {'data_type': const_type}),
|
|
**result('result'),
|
|
}
|
|
graph = build_graph(nodes, edges, nodes_with_edges_only=True)
|
|
graph.stage = 'back'
|
|
return graph
|
|
|
|
def test_first_input_const(self):
|
|
edges = [
|
|
*connect('const', '0:add'),
|
|
*connect('input_1', '1:add'),
|
|
*connect('add', 'result')
|
|
]
|
|
graph = self.build_graph_to_test_type_alignment(edges, const_type=np.float16, input_1_type=np.float32)
|
|
|
|
type_infer(graph)
|
|
const_node = Node(graph, 'const')
|
|
self.assertEquals(const_node.out_port(0).get_data_type(), np.float32)
|
|
|
|
def test_second_input_const(self):
|
|
edges = [
|
|
*connect('input_1', '0:add'),
|
|
*connect('const', '1:add'),
|
|
*connect('add', 'result')
|
|
]
|
|
graph = self.build_graph_to_test_type_alignment(edges, input_1_type=np.float32, const_type=np.float16)
|
|
|
|
type_infer(graph)
|
|
const_node = Node(graph, 'const')
|
|
self.assertEquals(const_node.out_port(0).get_data_type(), np.float32)
|
|
|
|
def test_raises(self):
|
|
edges = [
|
|
*connect('input_1', '0:add'),
|
|
*connect('input_2', '1:add'),
|
|
*connect('add', 'result')
|
|
]
|
|
graph = self.build_graph_to_test_type_alignment(edges, input_1_type=np.float32, input_2_type=np.float16)
|
|
|
|
self.assertRaises(Exception, type_infer, graph)
|
|
|
|
def test_not_raises(self):
|
|
edges = [
|
|
*connect('input_1', '0:add'),
|
|
*connect('input_2', '1:add'),
|
|
*connect('add', 'result')
|
|
]
|
|
graph = self.build_graph_to_test_type_alignment(edges, input_1_type=np.float32, input_2_type=np.float32)
|
|
|
|
type_infer(graph)
|
|
add_node = Node(graph, 'add')
|
|
self.assertEquals(add_node.out_port(0).get_data_type(), np.float32)
|