//========================================================================
// Copyright(C): RFAI France
//
// CLR Version : 4.0.30319.18052
// NameSpace : Matching
// FileName : VectorFGME.cs
//
// Created by : JC (jiangchar@gamil.com) at 1/1/2014 10:04:19 PM
//
//========================================================================
#region Using directives

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

#endregion

namespace Matching
{
    //Cette classe est pour stocker les vecteur d'embedding
    public class VectorFMGE
    {
        /***************************************************************/
        /*************************Attributs*****************************/
        /***************************************************************/

        #region Attributs

        //Le nom de graphe
        String name; 
        //le nom d'attribut avec la valeur d'attribut
        Dictionary<string, double> fsmfv;

        #endregion

        /***************************************************************/
        /*************************Accesseurs****************************/
        /***************************************************************/

        #region Accesseurs

        public Dictionary<string, double> FSMFV
        {
            get { return fsmfv; }
            set { fsmfv = value; }
        }

        public String Name
        {
            get { return name; }
            set { name = value; }
        }

        #endregion

        /***************************************************************/
        /************************Constructeurs**************************/
        /***************************************************************/

        #region Constructeurs

        /// <summary>
        /// constructeur
        /// </summary>
        public VectorFMGE()
        {
            FSMFV = new Dictionary<string, double>();
        }

        /// <summary>
        /// constructeur avec un string qui a lu dans un fichier xml. ex: string="1,2,3,4,5".
        /// </summary>
        /// <param name="StrVector">le nom du clique</param>
        public VectorFMGE(String StrVector)
        {
            name = "";
            FSMFV = new Dictionary<string, double>();
            SetString(StrVector);
        }

        /// <summary>
        /// constructeur avec un nom et un string qui a lu dans un fichier xml. ex: string="1,2,3,4,5".
        /// </summary>
        /// <param name="StrVector">nom du clique</param>
        /// <param name="StrVector">le vecteur en forme de string</param>
        public VectorFMGE(String nameIn, String StrVector)
        {
            name = nameIn;
            FSMFV = new Dictionary<string, double>();
            SetString(StrVector);
        }

        #endregion

        /***************************************************************/
        /*********************Méthodes publics**************************/
        /***************************************************************/

        #region Méthodes publics

        /// <summary>
        /// Returner une liste de type double
        /// </summary>
        /// <returns>vecteur en forme de tableau</returns>
        public double[] GetMatrix()
        {
            List<double> LisGetVec = new List<double>();

            foreach (KeyValuePair<string, double> StrInt in fsmfv)
            {
                LisGetVec.Add(Convert.ToDouble(StrInt.Value));
            }

            return LisGetVec.ToArray();
        }

        /// <summary>
        /// Retourner une type string qui contient tous les valeurs de vecteur
        /// </summary>
        /// <returns>retourner un string qui contient tout les valeurs d'un vecteur, il peut être lu et remise dans 
        /// un VectorFGME par la méthode SetString</returns>
        public string GetString()
        {
            string LisGetVec="";

            foreach (KeyValuePair<string, double> StrInt in fsmfv)
            {
                LisGetVec+=StrInt.Value.ToString() + " ";
            }
            //supprimer la dirnier ","
            LisGetVec = LisGetVec.Substring(0, LisGetVec.LastIndexOf(" "));

            return LisGetVec;
        }

        /// <summary>
        /// lire un string crée par la méthode GetString et les remise dans vecteur
        /// le string doit respecter la formule comme : "1,2,3,4,5"
        /// </summary>
        /// <param name="StrVector">string qui crée par la méthode GetString</param>
        public void SetString(String StrVector)
        {
            String[] s = StrVector.Split(' ');
            //le numéro de chaque valeur dans le tableau
            int i = 0;
            foreach (String str in s)
            {
                try
                {
                    FSMFV.Add(i.ToString(), Convert.ToDouble(str));
                }
                catch (Exception e)
                {
                    Console.Write(e.Message);
                    throw new Exception("XML Malformed. \n", e);
                }
                i += 1;
            }
        }

        #endregion
    }
}
