/*
         *  Recognize a Mouse_Data type gesture
         */
        public string Recognize(ref Mouse_Data s, bool Consider_Stroke = true)
        {
            Penny_Pincher_Data P = new Penny_Pincher_Data(s);

            s.Label = Recognize(ref P, Consider_Stroke);
            return(s.Label);
        }
        /*
         * The loading of the collected data from the data file
         */
        public void Construct_From_Stream(BinaryReader sr)
        {
            Loaded = true;
            int cnt = sr.ReadInt32();
            Penny_Pincher_Data s;

            for (int i = 0; i < cnt; i++)
            {
                s = new Penny_Pincher_Data();
                s.Construct_From_Stream(sr);
                Datas.Add(s);
            }
        }
        /*
         *  Recognize a Penny_Pincher_Data type Gesture
         */

        public string Recognize(ref Penny_Pincher_Data Data, bool Consider_Stroke = true)
        {
            double MaxS = double.MinValue;
            double T;
            string L = "";

            foreach (Penny_Pincher_Data D in Datas)
            {
                if (MaxS < (T = Calculate_Score(Data, D, Consider_Stroke)))
                {
                    MaxS = T;
                    L    = D.Get_Label();
                }
            }
            return(L);
        }
        private double Calculate_Score(Penny_Pincher_Data G, Penny_Pincher_Data D, bool Consider_Stroke = true)
        {
            double        S = 0;
            List <Vector> V1 = G.Get_Vectors(), V2 = D.Get_Vectors();

            if (V1.Count != 0 && V2.Count != 0 && (!Consider_Stroke || G.Strokes == D.Strokes))
            {
                for (int i = 0; i < MainWindow.DIVISION - 1; i++)
                {
                    S += V1[i] * V2[i];
                }
            }
            else
            {
                return(double.MinValue);
            }
            return(S);
        }