#lang scheme/gui

;;;;;;;;;;PARA HACER DIBUJOS
(define x-ancho 600)
(define y-alto 300)
(define offset 40)
(define voffset 8)
;;;;;;;;;
(define ventana2
  (make-object frame% 
    "" 
    #f 
    (+ 10 x-ancho) (+ 10 (* y-alto 2))
    1300 0))

(define lienzo1
  (instantiate canvas% 
    (ventana2) 
    (style '(border)) ))

(define dc1 (send lienzo1 get-dc))

(define lienzo2
  (instantiate canvas% 
    (ventana2) 
    (style '(border)) ))

(define dc2 (send lienzo2 get-dc))
;;;;;;;;;
(define ventana1
  (make-object frame% 
    "" 
    #f 
    (+ 15 (* voffset 9)) 1200;(+ (* voffset 100) 150) 
    1800 0))

(define lienzo3
  (instantiate canvas% 
    (ventana1) 
    (style '(border)) ))

(define dc3 (send lienzo3 get-dc))
;;;;;;;;;;;
;;;;;ENTRENAMIENTO
;;;
(require "Graficos.rkt")
(require "Tablas-estimulos.rkt")
(require "ART-5-version.rkt")

;;;LOS DATOS
(define training_set
  (list
   ;;cuadradas
   '(1 1 1 1 0 1 1 1 1)
   ;;triangulares
   '(1 1 1 1 1 0 1 0 0)
   '(1 1 1 0 1 1 0 0 1)
   '(1 0 0 1 1 0 1 1 1)
   '(0 0 1 0 1 1 1 1 1)
   ;;líneas verticales simples
   '(1 0 0 1 0 0 1 0 0)
   '(0 1 0 0 1 0 0 1 0)
   '(0 0 1 0 0 1 0 0 1)
   ;;líneas horizontales simples
   '(1 1 1 0 0 0 0 0 0)
   '(0 0 0 0 0 0 1 1 1)
   '(0 0 0 1 1 1 0 0 0)
   ))
(define working_subset_estimulos
  (list
   ;;cuadradas
   '(1 1 1 1 1 1 1 1 1)
   '(1 1 1 1 0 1 1 1 1)
   ;;en u
   '(1 0 1 1 0 1 1 1 1)
   '(1 1 1 1 0 1 1 0 1)
   '(1 1 1 1 0 0 1 1 1)
   '(1 1 1 0 0 1 1 1 1)
   ;;triangulares
   '(1 1 1 1 1 0 1 0 0)
   '(1 1 1 0 1 1 0 0 1)
   '(1 0 0 1 1 0 1 1 1)
   '(0 0 1 0 1 1 1 1 1)
   ;;una cruz
   '(0 1 0 1 1 1 0 1 0)
   ;;líneas verticales simples
   '(1 0 0 1 0 0 1 0 0)
   '(0 1 0 0 1 0 0 1 0)
   '(0 0 1 0 0 1 0 0 1)
   ;;líneas horizontales simples
   '(1 1 1 0 0 0 0 0 0)
   '(0 0 0 0 0 0 1 1 1)
   '(0 0 0 1 1 1 0 0 0)
   ;;diagonales
   '(1 0 0 0 1 0 0 0 1)
   '(0 0 1 0 1 0 1 0 0)
   ;;un punto central
   '(0 0 0 0 1 0 0 0 0)
   ;;sin estímulos
   '(0 0 0 0 0 0 0 0 0)
   ))
(define training (genera-tabla-estimulos '(1 2 3 4 5 6 7 8 9) '(0 1)))
;;
;;;;;;;;;EJECUCIÓN
;;;Las Ventanas
(send ventana2 show #t)
;(send ventana1 show #t)
(sleep/yield 1)

;;;;

(define procesar-conjunto_estimulos
  (lambda (estimulos)
    (let go ((i 0)
             (j (length estimulos))
             )
      (if (= i j)
          #t
          (let ((input (list-ref estimulos i)))
            (sleep/yield 0.5)
            (send dc1 clear)
            (send dc1 draw-text "Estímulo" 240 20)
            (grid dc1 3 x-ancho y-alto offset)
            (pintar input x-ancho y-alto 3 3 offset dc1)
            (sleep/yield 0.5)
            (send dc2 clear)
            ;            (send dc2 draw-text "Clasificado en la Categoría" 240 20)
            (grid dc2 3 x-ancho y-alto offset)
            (let*-values ([(salida neuron_resp RS) (send art proceso! input)]
                          [(mensaje1) 
                           (string-append 
                            "Clasificado en la Categoría: " 
                            (number->string (send neuron_resp get-id)))]
                          [(mensaje2) 
                           (string-append 
                            "RS: " 
                            (number->string (exact->inexact RS)))]
                          [(mensaje3) "Parámetro de vigilancia = 3/4"]
                          )
              (sleep/yield 0.5)
              (send dc2 draw-text mensaje1 240 20)
              (send dc2 draw-text mensaje3 240 40)
              (send dc2 draw-text mensaje2 240 60)
              (pintar salida x-ancho y-alto 3 3 offset dc2)
              (send dc2 draw-text mensaje2 240 60)
              )
            (sleep/yield 2)
            ;(read);-char)
            (go (add1 i) j)
            )
          )
      )
    ))

;(procesar-conjunto_estimulos working_subset_estimulos)
(procesar-conjunto_estimulos 
 (cdr (genera-tabla-estimulos '(1 2 3 4 5 6 7 8 9) '(0 1))))