# coding=utf-8

import tensorflow as tf

#========================================================================
#  Перестановка элементов тензора

ab = (1, 3, 4, 4)
bc = (0, 0, 0, 1, 3, 3)

# Так нельзя!
# ttt = tf.constant([
#     [1, 2, 3, 4, 5],
#     [6, 7],
#     [8, 9, 10]
# ])

a = tf.constant([7, 6, 5, 4, 3, 2, 1])
b = tf.gather(a, ab)
c = tf.gather(b, bc)

print(tf.Session().run(b))
print(tf.Session().run(c))

# tf.zeros()

# результат:
#   [6 4 3 3]
#   [6 6 6 4 3 3]

#========================================================================
# склейка тензоров

# a = tf.constant([1, 2, 3])
# b = tf.constant([5, 6, 7, 8, 9])
# i = [tf.constant([0, 2, 1]), tf.constant([0, 4, 3, 2, 1])]

# можно использовать обычные питоновские списки

a = [1, 2, 3]
b = [5, 6, 7, 8, 9]

# так нельзя! Размерности i[0] и a должны совпадать (аналогично i[1] и b)
# i = [[0, 1, 2, 1], [0, 3, 3, 3, 2, 1]]

i = [[0, 1, 2], [3, 4, 5, 6, 7]]
c = tf.dynamic_stitch(i, [a, b])
print(tf.Session().run(c))
# результат:
#   [1 2 3 5 6 7 8 9]

i = [[6, 2, 1], [3, 4, 5, 7, 0]]
c = tf.dynamic_stitch(i, [a, b])
print(tf.Session().run(c))
# результат:
#   [9 3 2 5 6 7 1 8]


i = [[0, 0, 0], [0, 0, 0, 0, 9]]
c = tf.dynamic_stitch(i, [a, b])
print(tf.Session().run(c))
# результат:
#   [         8  443839342 1862666767 1970304117 1678058100 1701869940 84545314 1970037110 1946554981          9]

#========================================================================
#  суммирование (рассеянное)
# Note: tf.constant использовать нельзя, т.к. tf.scatter_add изменяет содержимое первого параметра!

a = tf.Variable([5, 6, 7, 8, 9])
u = [1, 2, 3]

i = [3, 1, 0]
c = tf.scatter_add(a, i, u)

# придется создать сессию, т.к. необходимо инициализацию переменных и вычисления
# производить в рамках одной сессии
sess = tf.Session()
sess.run(tf.global_variables_initializer())
print(sess.run(c))
print(sess.run(a))
# результат:
#   [8 8 7 9 9]
#   [8 8 7 9 9]

i = [0, 0, 0]
c = tf.scatter_add(a, i, u)
sess.run(tf.global_variables_initializer())
print(sess.run(c))
# результат:
#   [11  6  7  8  9]

#========================================================================
#  суммирование (простое)
a = tf.constant([1, 2, 3])
b = tf.constant([5, 6, 7])
c = a + b
print(sess.run(c))

#========================================================================
#  рассеянное сууммирование
a = tf.Variable([1, 2, 3, 4, 5])
b = tf.constant([5, 6, 7, 8, 9])
c = a + b
u = [1, 2, 3]

i = [3, 1, 0]
d = tf.scatter_add(c, i, u)

sess = tf.Session()
#sess.run(tf.global_variables_initializer())
print(sess.run(d))
print(sess.run(c))

#========================================================================
#

#========================================================================
#

#========================================================================
#