/*
         * METHODES
         */

        /// <summary>
        /// Retourne une string contenant la signature du modèle de calcul
        /// </summary>
        /// <param name="outputName"></param>
        /// <returns>
        /// </returns>
        private string modelSignature(string outputName)
        {
            // Recherche du nom du modèle dans la liste dataModels
            PerfPile p = this.dataModels.Find(x => x.outputName.Equals(outputName));

            if (p != null)
            {
                List <String> factorList = new List <string>();
                string        factors    = "";
                foreach (string word in factorsSignature(outputName).Split(AeroCalcCommand.CMD_SEPARATOR))
                {
                    if (!string.IsNullOrEmpty(word) && factorList.Find(x => x.Equals(word)) == null)
                    {
                        // On ajoute que les noms distincts des différents facteurs
                        factorList.Add(word);
                    }
                }
                foreach (string word in factorList)
                {
                    factors += word + " ";
                }
                return(p.outputName + " " + factors);
            }
            else
            {
                // Aucun modèle de donnée ne correspond à ce nom
                return("");
            }
            // Suppression des doublons dans les facteurs
        }
예제 #2
0
        /*
         *  SERVICES
         */

        /// <summary>
        /// Sauvegarde un objet PerfPile dans un fichier XML
        /// </summary>
        /// <param name="pp">Objet PerfPile à sauvegarder</param>
        /// <param name="xmlFileAbsolutePath">Chemin complet vers le fichier XML à créer</param>
        /// <returns>Entier signalant la réussite ou l'échec de l'opération
        ///     XMLConnector.FILEOP_SUCCESSFUL : réussite
        ///     XMLConnector.FILEOP_UNABLE_TO_CREATE_OUTPUT_FILE : Impossible de créer le fichier XML
        ///     XMLConnector.FILEOP_UNKNOWN_ERROR : Erreur non identifiable
        /// </returns>
        /// <remarks>
        /// TODO: A DEVELOPPER
        /// </remarks>
        public int savePerfPileToXML(PerfPile pp, string xmlFileAbsolutePath)
        {
            XDocument xmlPerfDoc = new XDocument();

            xmlPerfDoc.AddFirst(xmlPerfPile(pp));
            xmlPerfDoc.Save(xmlFileAbsolutePath);
            return(XMLFile.FILEOP_SUCCESSFUL);
        }
        /// <summary>
        /// Retourne une string contenant les noms des facteurs d'un modèle de calcul
        /// </summary>
        /// <param name="outputName">Nom du modèle de calcul</param>
        /// <returns>
        /// </returns>
        private string factorsSignature(string outputName)
        {
            PerfPile p = this.dataModels.Find(x => x.outputName == outputName);
            string   signature;

            if (p != null)
            {
                // Le modèle existe
                signature  = factorsSignature(p.discretName) + " ";
                signature += factorsSignature(p.layerFactorName) + " ";
                signature += factorsSignature(p.serieFactorName) + " ";
                signature += factorsSignature(p.pointFactorName) + " ";
                return(signature);
            }
            else
            {
                return(outputName);
            }
        }
예제 #4
0
        /// <summary>
        /// Formate un élément XML pour refléter un objet PerfPile
        /// </summary>
        /// <param name="pp">Objet PerfPile</param>
        /// <returns>Un élément XML</returns>
        private XElement xmlPerfPile(PerfPile pp)
        {
            XElement xElem = new XElement("Pile", new XAttribute("Name", pp.outputName),
                                          new XAttribute("Key", pp.dataBaseKey),
                                          new XAttribute("Hidden", (pp.hidden == true ? "1" : "0")),
                                          new XAttribute("Factor", pp.factorValue),
                                          new XAttribute("DiscretName", pp.discretName),
                                          new XAttribute("DiscretValue", pp.discretValue),
                                          new XAttribute("PointFactorName", pp.pointFactorName),
                                          new XAttribute("PointFactorUnitCode", pp.pointFactorUnitCode),
                                          new XAttribute("SerieFactorName", pp.serieFactorName),
                                          new XAttribute("SerieFactorUnitCode", pp.serieFactorUnitCode),
                                          new XAttribute("LayerFactorName", pp.layerFactorName),
                                          new XAttribute("LayerFactorUnitCode", pp.layerFactorUnitCode));
            XElement xColElem = new XElement("Layers");

            // Ajout de chaque layer de la pile
            for (int count = 0; count < pp.count; count++)
            {
                xColElem.Add(xmlPerfLayer(pp.layerAt(count)));
            }
            xElem.Add(xColElem);
            return(xElem);
        }
        /*
         * /// <summary>
         * /// Retourne le dictionnaire des unités
         * /// </summary>
         * /// <returns>UnitDictionnary, le dictionnaire des unités</returns>
         * ///
         * public UnitDictionary unitDictionary() {
         *  return dataUnits;
         * }
         */



        /// <summary>
        /// Retourne le résultat d'un calcul multi-dimensionnel
        /// </summary>
        /// <param name="dataModelName">Nom du modèle à utiliser</param>
        /// <param name="factors">Liste des facteurs passés en argument</param>
        /// <returns>
        /// double, résultat du calcul
        /// </returns>
        /// <remarks>
        /// Fontion récursive
        /// </remarks>
        public double compute(string dataModelName, List <CommandFactor> factors)
        {
            // Recherche du modèle de performances permettant le traitement (nom + discret)
            //PerfPile Pile = dataModels.ElementAt(dataModelIndex(dataModelName, factors));
            PerfPile Pile   = dataModels.Find(x => x.outputName == dataModelName);
            double   result = double.NaN;

            //int commandIndex = container.dataModelIndex(Cmd.subs[0], Cmd.Factors);
            if (Pile == null)
            {
                // Aucun modèle ne répond aux critères de sélection
                return(double.NaN);
            }


            // Recherche de la valeur des différents facteurs nécessaires aux calculs
            if (Pile != null)
            {
                // Le modèle est identifié
                //pp = container.dataModelByIndex(commandIndex);
                // Analyse des facteurs, paramètres et options de la commande

                //double pointFactorValue = factors.Find(x => x.name.Equals(Pile.pointFactorName)).value;
                double pointFactorValue = valueFromFactor(factors, Pile.pointFactorName);
                if (double.IsNaN(pointFactorValue))
                {
                    // serieFactorValue n'est pas disponible dans les facteurs, on tente de le calculer
                    pointFactorValue = compute(Pile.pointFactorName, factors);
                    if (double.IsNaN(pointFactorValue))
                    {
                        // Echec de la tentative du calcul
                        return(double.NaN);
                    }
                }

                //double serieFactorValue = factors.Find(x => x.name.Equals(Pile.serieFactorName)).value;
                double serieFactorValue = valueFromFactor(factors, Pile.serieFactorName);
                if (double.IsNaN(serieFactorValue))
                {
                    // serieFactorValue n'est pas disponible dans les facteurs, on tente de le calculer
                    serieFactorValue = compute(Pile.serieFactorName, factors);
                    if (double.IsNaN(serieFactorValue))
                    {
                        // Echec de la tentative du calcul
                        return(double.NaN);
                    }
                }

                //double layerFactorValue = factors.Find(x => x.name.Equals(Pile.layerFactorName)).value;
                double layerFactorValue = valueFromFactor(factors, Pile.layerFactorName);
                if (double.IsNaN(layerFactorValue))
                {
                    // layerFactorValue n'est pas disponible dans les facteurs, on tente de le calculer
                    serieFactorValue = compute(Pile.layerFactorName, factors);
                    if (double.IsNaN(layerFactorValue))
                    {
                        // Echec de la tentative du calcul
                        return(double.NaN);
                    }
                }

                try
                {
                    result = Pile.predict(pointFactorValue, serieFactorValue, layerFactorValue);
                }
                catch (ModelException e)
                {
                    // On récupère d'une exception ou un paramètre est hors du range ou il peut être utilisé
                    // TODO les infos de l'exception sont générées directement dans predict()
                    throw e;
                }
            }
            return(result);
        }