## MIL 번역 예제
from coremltools.converters.mil import Builder as mb

@mb.program(input_specs=[mb.TensorSpec(shape=(1, 100, 100, 3))])
def prog(x):
	x = mb.relu(x=x, name='x')
	x = mb.transpose(x=x, perm=[0, 3, 1, 2], name='transpose')
	x = mb.reduce_mean(x=x axes=[2,3], keep_dims=False, name='reduce')
	x = mb.log(x=x, name='log')
	return x

#print(prog)
main(%x: (1, 100, 100, 3, fp32)) {
	block0() {
		%x: (1, 100, 100, 3, fp32) = relu(x%x, name="x")
		%transpose_perm_0: (4, i32)* = const(val=[0, 3, 1, 2], name="transpose_perm_0")
		%transpose: (1, 3, 100, 100, fp32) = transpose(x=%x, perm=%transpose_perm_0, name="transpose")
		%reduce_axes_0: (2, i32)* = const(val=[2, 3], name="reduce_axes_0")
		%reduce_keep_dims_0: (bool)* = const(val=False, name="reduce_keep_dims_0")
		%reduce: (1, 3, fp32) = reduce_mean(x=%transpose, axes=%reduce_axes_0, keep_dims=%reduce_keep_dims_0, name="reduce")
		%log: (1, 3, fp32) = log(x=%reduce, name="log")
	} -> (%log)
}

# builder 예제
import coremltools.converters.mil import builder as mb
import coremltools.converters.mil import register_tf_op

@register_tf_op
def Einsum(context, node):
	assert node.attr['equation'] == 'bnqd,bnkd->bnqk'
	
	a = context[node.inputs[0]]
	b = context[node.inputs[1]]
	
	x = mb.matmul(x=a, y=b, transpose_x=False, transpose_y=True, name=node.name)
	
	context.add(node.name, x)