# ---
# jupyter:
#   jupytext:
#     text_representation:
#       extension: .py
#       format_name: light
#       format_version: '1.5'
#       jupytext_version: 1.14.4
#   kernelspec:
#     display_name: Python 3
#     language: python
#     name: python3
# ---

# # Primer parcial Computación blanda

# importamos las liberias para crear la red neuronal

import tensorflow as tf
import keras
from keras.models import Sequential
from keras.layers import Dense, Activation,Dropout
import numpy as np

# ### Set de datos

# Estos son los posibles estados que van a tener los sensores del robot.
#
# Orden de los sensores {0,1,2,3,4,5,6}
#
# los valores del vector se corresponden a la distncia que marcan los sensores

# +
data = np.array([[0.23,1,1,1,1,1],
                 [0.23,0.23,1,1,1,1],
                 [0.12,0.12,1,1,1,1],
                 [1,1,1,1,1,1],
                 [1,1,0.12,0.12,1,1],
                 [1,1,0.23,0.23,1,1],
                 [1,1,1,1,0.23,0.23],
                 [1,1,1,1,1,0.23],
                 [1,1,1,1,0.12,0.12],
                 [1,1,1,0.23,1,1],
                 [1,1,0.23,1,1,1],
                 [1,1,1,0.12,0.12,1]])


print(data)
print('\nCantidad de combinaciones de los sensores: ',len(data))
# -

# Estas son las posibles salidas a los estados de los sensores, es la forma en que se van  a mover los motores.
#
# Orden de los motores: {a,b}, a-> motor derecho, b->motor izquierdo 
#
# Los valores del vector se corresponden a la direccion de los motores.

# +
movMotores = np.array([
                       [1,1,0,1],#[1 , 0.5],
                       [1,1,0,1],#[1 , 0.5],
                       [1,1,0,0],#[1 , 0],
                       [1,1,1,1],#,[1 , 1],
                       [0,0,1,0],#[0 , 0.75],
                       [1,0,1,1],#[0.6 , 1],
                       [0,1,1,1],#[0.5 , 1],
                       [0,1,1,1],#[0.5 , 1],
                       [0,0,1,1],#[0 , 1],
                       [0,0,1,1],#[0 , 1],
                       [0,0,1,1],#[0 , 1],
                       [0,0,0,1]])#[0 , 0.5],])

print(movMotores)
print('\nLos movimientos de los motores: ', len(movMotores))
# -

# Creamos el modelo de la red neuronal

model = Sequential()

# Agregamos las capas 

# +
model.add(Dense(6, activation='relu', input_dim=6))

model.add(Dense(15, activation='relu'))
model.add(Dense(10, activation='relu'))
model.add(Dense(5, activation='relu'))
#model.add(Dense(15, activation='relu'))
#model.add(Dropout(0.5))
#model.add(Dense(3, activation='relu'))
model.add(Dense(4, activation='softmax'))
#model.summary()
# -

# Compilamos el modelo

ad = keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False)
model.compile(loss='categorical_crossentropy',
              optimizer = ad,
              metrics=['accuracy'])

# Ahora entrenamos el modelo

train = model.fit(data, movMotores,
          epochs=200,
          batch_size=5)#128

# Ahora hacemos una revision del modelo

score = model.evaluate(data, movMotores, batch_size=5)

print(score)

model.predict(np.array([[1,1,1,0.12,0.12,1]]))

StarcoderdataJupyterScriptsDedupFiltered