import tensorflow as tf

# 오퍼레이션 객체를 리스트로 출력(오퍼레이션이 없다)
print(tf.get_default_graph().get_operations())
# []

# 오퍼레이션을 생성하여 그래프에 추가한 뒤, 
# 각각의 오퍼레이션 출력텐서를 'tensor_a', 'tensor_b'가 가르킴(파이썬은 모두 객체)
tensor_a = tf.constant(1.1, name="a")
tensor_b = tf.constant(2.0, name="b")

# tensor_c = tf.add(tensor_a, tensor_b) 와 같은 의미
# 앞에서 정의한 상수텐서들을 연산할 오퍼레이션 추가, 해당 오퍼레이션의 출력텐서를 'tensor_c'가 가르킴
tensor_c = tensor_a + tensor_b

# Tensor("a:0", shape=(), dtype=float32)
# 1. 'a:0'는 a의 첫번째 출력텐서
# 2. 'shape=()'는 스칼라 텐서
# 3. 'dtype=float32'는 32비트 부동소수형
print(tensor_a)
print(tensor_b)
print(tensor_c)

print(tensor_a.op)                # 텐서에 대한 오퍼레이션 정보
print(tensor_a.op.node_def)        # 텐서에 대한 오퍼레이션 정보
print(tensor_a.op.inputs)        # 상수 오퍼레이션의 입력은 출력해볼 수 없다.
print(tensor_a.op.outputs)        # 상수 오퍼레이션의 출력텐서

print(tensor_c.op.inputs)        # 연산 오퍼레이션은 상수 오퍼레이션과 달리 입력 텐서도 출력가능
print(tensor_c.op.inputs[0])    # tensor_a
print(tensor_c.op.inputs[1])    # tensor_b
print(tensor_c.op.outputs)        # 연산 오퍼레이션의 출력텐서
print(tensor_c.op)                # 텐서에 대한 오퍼레이션 정보

print(tf.get_default_graph().get_operations())

# tensor_c 변수가 가리키고있는 텐서 객체의 값을 연산한 뒤, 결과값을 정수로 출력
with tf.Session() as sess:
    print("%d" % sess.run(tensor_c))