#---------------------------------------------------------------#
## inferencia reglas difusas conjuntos difusos ##

rm(list =ls()) # esta instrucción vacía el entorno
# ¡esto suele ser útil!

#------------------------------------------------- --------------#
library(conjuntos) # para manejar conjuntos difusos e inferencia
#------------------------------------------------- --------------#
#manipulación de conjuntos difusos#

# manipulación de conjuntos generalizados
XY_univers <- c("a","b","c","d","e","f","g")

X_crisp   <- c("a","b","c","d" )
X_member  <- c(0.1,0.3,0.6, 0.8)
X <- gset( support    = X_crisp,
           membership = X_member, 
           universe   = XY_univers)

Y_crisp   <- c("c","d","e","f" )
Y_member  <- c(0.9,0.3,0.6, 1.0)
Y <- gset( support    = Y_crisp,
           membership = Y_member, 
           universe   = XY_univers)

X
Y

# lógica por defecto: "Zadeh"
fuzzy_logic("Zadeh")
!X
X & Y
X | Y

# cambio de lógica
fuzzy_logic("product")
!X
X & Y
X | Y

#---------------------------------------------------------------#
# inferenceia                                                    #
#---------------------------------------------------------------#
# normalizaremos los valores del 1 al 100
sets_options("universo", seq(1, 100, 0.5)) # universo del 1 al 100

# muy variables explicativas, una respuesta

individuos_optimistas  = fuzzy_partition (varnames = 
                                            c(no  = 30, 
                                              si  = 65, 
                                              muy = 90),
                                              sd   = 10.0)
empresas_optimistas= fuzzy_partition(varnames = 
                                            c(no  = 30, 
                                              si  = 60,
                                              muy = 80), 
                                              sd   = 5.0)
acciones_a_la_baja      = fuzzy_partition(varnames = 
                                            c(bajo   = 10, 
                                              normal   = 50,
                                              mucho = 90), 
                                              sd = 7.5)
compra                 = fuzzy_partition(varnames = 
                                            c(no     = 18, 
                                              prudente = 50, 
                                              si     = 95),
                             FUN = fuzzy_cone, radius = 35)

# creación de un conjunto de variables
variables <- set(
  individuos_optimistas,
  empresas_optimistas, 
  acciones_a_la_baja,
  compra)

# creación de las reglas, las habríamos posido nombrar
reglas <- set(
  fuzzy_rule(individuos_optimistas  %is% si && 
             empresas_optimistas%is% muy &&
             acciones_a_la_baja      %is% bajo, 
             compra                  %is% si),
  fuzzy_rule(individuos_optimistas  %is% muy &&
             empresas_optimistas%is% si &&
             acciones_a_la_baja      %is% mucho, 
             compra                  %is% no),
  fuzzy_rule(empresas_optimistas%is% no, 
             compra                  %is% no),
  fuzzy_rule(( individuos_optimistas  %is% si || 
               empresas_optimistas%is% si   ) &&
             acciones_a_la_baja      %is% normal, 
             compra                  %is% prudente),
  fuzzy_rule(individuos_optimistas  %is% muy && 
             acciones_a_la_baja      %is% normal,
             compra %is% prudente),
  fuzzy_rule(individuos_optimistas  %is% muy && 
             empresas_optimistas%is% muy &&
             acciones_a_la_baja      %is% mucho, 
             compra %is% si)
  )

# creación del modelo
model <- fuzzy_system(variables, reglas)

# A qué se parecen las variables del modelo

op <- par()
par(mfrow = c(2,2)) # dispone de 2 plots en 2 líneas
plot(individuos_optimistas, 
     xlab = "universo individuos", 
     ylab = "optimistas -- membership")
plot(empresas_optimistas, 
     xlab = "universo empresa",
     ylab = "optimistas -- membership")
plot(acciones_a_la_baja, 
     xlab = "universo acciones a la baja",
     ylab = "baja -- membership")
plot(compra, 
     xlab = "universo compra",
     ylab = "compra -- membership")
par(op)

# ejemplo de inferencia con este modelo
hay_que_comprar_1 <- fuzzy_inference(model,list(
                       individuos_optimistas  = 70,
                       empresas_optimistas= 35,
                       acciones_a_la_baja      = 70)
                       )

# salir del aspecto difuso, obtener un valor de referencia
# saber en qué caso estamos
r <- gset_defuzzify(debería_comprar_1, "centroide")

# visualizar el valor de referencia en su
# contexto para poder decidir
plot(hay_que_comprar_1, col = 2,lwd = 3)
lines(compra, lty = 2, col = 3)
abline(v=r, lty = 3)
text(r,1,round(r), cex =1.5, pos =4)
text(18,0.8,"zona compra = no", cex =1.2, pos = 1)

# si quisiéramos decidirlo automáticamente
# debería haber trabajado en los resultados numéricos
# para acceder a los valores si los necesita
compra # compra se define a sí mismo
hay_que_comprar_1[24] # legible pero no utilizable
compra[[1]][24] # legible pero no utilizable
atributos(compra) # la estructura del objeto
attr(compra,"names") # "no" "cauteloso" "si"
atributos(compra[[1]][24])# la estructura del objeto
attr(compra[[1]][24],"memberships") # da 0.828
atributos(hay_que_comprar_1[24]) # mismo método
attr(hay_que_comprar_1[24],"memberships") # da 0.606


