package main

import (
	"./neuralnetwork"
	"./remotecontrol"
)

func main() {
	rc := remotecontrol.NewRemoteControl()
	sizes := []int{13, 8, 12, 3}
	nn, _ := neuralnetwork.NewNeuralNetwork(sizes, neuralnetwork.NewRPropInitializer(neuralnetwork.RPropConfig{
		NuPlus:   1.2,
		NuMinus:  0.5,
		DeltaMax: 50.0,
		DeltaMin: 0.000001,
	}))

	nn.SetStateWatcher(rc)
	rc.Run()

	// inFile, err := os.Open("./networkstate")
	// if err != nil {
	// 	log.Fatal(err)
	// }
	// defer inFile.Close()
	// nn.LoadState(inFile)

	// nn, _ := neuralnetwork.NewNeuralNetwork(sizes, neuralnetwork.NewBackPropInitializer(0.1))

	// for i := 0; i < nn.Count; i++ {
	// 	if i > 0 {
	// 		fmt.Printf("Weights before:\n%v\n\n", mat.Formatted(nn.Weights[i], mat.Prefix(""), mat.Excerpt(0)))
	// 		fmt.Printf("Biases before:\n%v\n\n", mat.Formatted(nn.Biases[i], mat.Prefix(""), mat.Excerpt(0)))
	// 		fmt.Printf("Z before:\n%v\n\n", mat.Formatted(nn.Z[i], mat.Prefix(""), mat.Excerpt(0)))
	// 	}
	// 	fmt.Printf("A before:\n%v\n\n", mat.Formatted(nn.A[i], mat.Prefix(""), mat.Excerpt(0)))
	// }

	// nn = &neuralnetwork.NeuralNetwork{}
	// inFile, err := os.Open("./data")
	// if err != nil {
	// 	log.Fatal(err)
	// }
	// defer inFile.Close()
	// nn.LoadState(inFile)
	// inFile.Close()

	// failCount = 0
	// training.Reset()
	// for training.NextValidator() {
	// 	dataSet, expect := training.GetValidator()
	// 	index, _ := nn.Predict(dataSet)
	// 	if expect.At(index, 0) != 1.0 {
	// 		failCount++
	// 		// fmt.Printf("Fail: %v, %v\n\n", training.ValidationIndex(), expect.At(index, 0))
	// 	}
	// }

	// fmt.Printf("Fail count: %v\n\n", failCount)

}