private void TrainBtn_Click(object sender, EventArgs e)
        {
            if (locked)
            {
                return;
            }

            double a;
            double t;

            try
            {
                a = Convert.ToDouble(Tb1.Text);
                t = Convert.ToDouble(Tb2.Text);
            }
            catch
            {
                ErrorAnimator.ShowSync(error);
                return;
            }

            error.Hide();
            locked = true;
            pm     = new PerceptronModel(t, a, Input1.GetArray().Length, output1.GetArray().Length, this);


            for (int i = 1; i <= MAX; i++)
            {
                double[] tmpIN  = new double[Input1.GetArray().Length];
                double[] tmpOUT = new double[output1.GetArray().Length];
                bool[]   tmp;

                DrawControl.DrawBox d1 = (DrawControl.DrawBox) this.Controls.Find("Input" + i, true)[0];
                DrawControl.DrawBox d2 = (DrawControl.DrawBox) this.Controls.Find("output" + i, true)[0];
                d1.locked = true;
                d2.locked = true;

                Log.AppendText("Pattern " + i + " \n");
                tmp = d1.GetArray();
                for (int j = 0; j < tmp.Length; j++)
                {
                    tmpIN[j] = (tmp[j]) ? 1 : 0;
                }

                tmp = d2.GetArray();

                for (int j = 0; j < tmp.Length; j++)
                {
                    tmpOUT[j] = (tmp[j]) ? 1 : -1;
                }

                Log.AppendText("(" + String.Join(",", tmpIN) + ")\n(" + String.Join(",", tmpOUT) + ")\n\n");

                Data d = new Data(tmpIN, tmpOUT);
                pm.q.Enqueue(d);
            }

            pm.GenerateWeight();
            pm.Train();
        }
        private void TrainBtn_Click(object sender, EventArgs e)
        {
            if (locked)
            {
                return;
            }

            locked = true;
            ResetBtn.ButtonText = "Stop";
            error.Hide();
            double a, t, w1, w2;
            int    m;

            try
            {
                a  = Convert.ToDouble(Tb1.Text);
                t  = Convert.ToDouble(Tb2.Text);
                w1 = Convert.ToDouble(Tb3.Text);
                w2 = Convert.ToDouble(Tb4.Text);
                m  = Convert.ToInt16(Tb5.Text);
            }
            catch
            {
                ErrorAnimator.ShowSync(error);
                return;
            }

            error.Hide();
            ShowLog("Create TLU model with\n");
            ShowLog("Max traing round:" + m);
            ShowLog("\nLearning Rate:" + a);
            ShowLog("\nThreshold:" + t);
            ShowLog("\nw1:" + w1);
            ShowLog("\nw2:" + w2);
            ShowLog("\nTraining Data:\n");
            tlu = new TLUmodel(t, a, new Data(w1, w2), m, this);

            for (int i = 0; i < XYgraph.Map.Length; i++)
            {
                if (XYgraph.Map[i] != -1)
                {
                    Point p = XYgraph.ConvertToXY(i);
                    Console.WriteLine(p.X + " " + p.Y + " v=" + XYgraph.Map[i]);
                    Data tmp = new Data(p.X * 0.5, p.Y * 0.5, XYgraph.Map[i]);
                    tlu.q.Enqueue(tmp);

                    ShowLog("( " + (p.X * 0.5) + " , " + (p.Y * 0.5) + " ) value=" + XYgraph.Map[i] + "\n");
                }
            }
            if (tlu.q.Count > 0)
            {
                tlu.Train();
            }
            else
            {
                ReleaseBtn();
            }
        }