/// <summary>
        /// Writes a collection of <see cref="IdentificationExperiment"/> to XML
        /// </summary>
        /// <param name="experimentCollection">A collection to be written to XML</param>
        /// <param name="modelDocumentRoot"><see cref="XElement"/> instance that represents root of model XML document</param>
        private static void WriteIdentificationExperiments(IdentificationExperimentCollection experimentCollection, XElement modelDocumentRoot)
        {
            XElement experimentsCollectionElement = new XElement(Elements.IdentificationExperiments);

            foreach (IdentificationExperiment experiment in experimentCollection.Values)
            {
                XElement experimentElement = new XElement(Elements.IdentificationExperiment,
                                                          new XAttribute(Attributes.Id, experiment.Id.ToString()),
                                                          new XAttribute(Attributes.Number, experiment.Number.ToString()),
                                                          new XAttribute(Attributes.RealExperimentId, experiment.RealExperimentId.ToString())
                                                          );

                XElement parameterValuesCollectionElement =
                    WriteValueCollection(experiment.IdentificationParameterValues, Elements.IdentificationParameterValues, Elements.IdentificationParameterValue);
                experimentElement.Add(parameterValuesCollectionElement);

                XElement realCriterionValuesCollectionElement =
                    WriteValueCollection(experiment.MathematicalCriterionValues, Elements.MathematicalCriterionValues, Elements.MathematicalCriterionValue);
                experimentElement.Add(realCriterionValuesCollectionElement);

                XElement adequacyCriterionValuesCollectionElement =
                    WriteValueCollection(experiment.AdequacyCriterionValues, Elements.AdequacyCriterionValues, Elements.AdequacyCriterionValue);
                experimentElement.Add(adequacyCriterionValuesCollectionElement);

                XElement constraintValuesCollectionElement =
                    WriteValueCollection(experiment.ConstraintValues, Elements.FunctionalConstraintValues, Elements.FunctionalConstraintValue);
                experimentElement.Add(constraintValuesCollectionElement);

                WritePropertyCollection(experiment.Properties, experimentElement);

                experimentsCollectionElement.Add(experimentElement);
            }

            modelDocumentRoot.Add(experimentsCollectionElement);
        }
        /// <summary>
        /// Reads a collection of <see cref="IdentificationExperiment"/> from XML
        /// </summary>
        /// <param name="experimentCollection">A collection to be read from XML</param>
        /// <param name="experimentsCollectionElement"><see cref="XElement"/> to read a collection from</param>
        private static void ReadIdentificationExperiments(IdentificationExperimentCollection experimentCollection, XElement experimentsCollectionElement)
        {
            IEnumerable <XElement> experimentElements = experimentsCollectionElement.Descendants(Elements.IdentificationExperiment);

            foreach (XElement experimentElement in experimentElements)
            {
                TId id               = TId.Parse(experimentElement.Attribute(Attributes.Id).Value);
                int number           = Convert.ToInt32(experimentElement.Attribute(Attributes.Number).Value);
                TId realExperimentId = TId.Parse(experimentElement.Attribute(Attributes.RealExperimentId).Value);

                IdentificationExperiment experiment = new IdentificationExperiment(id, number, realExperimentId);

                ReadValueCollection(experiment.IdentificationParameterValues, Elements.IdentificationParameterValues, Elements.IdentificationParameterValue, experimentElement);
                ReadValueCollection(experiment.MathematicalCriterionValues, Elements.MathematicalCriterionValues, Elements.MathematicalCriterionValue, experimentElement);
                ReadValueCollection(experiment.AdequacyCriterionValues, Elements.AdequacyCriterionValues, Elements.AdequacyCriterionValue, experimentElement);
                ReadValueCollection(experiment.ConstraintValues, Elements.FunctionalConstraintValues, Elements.FunctionalConstraintValue, experimentElement);
                ReadPropertyCollection(experiment.Properties, ReadCollectionElement(Elements.Properties, experimentElement, false));

                experimentCollection.Add(experiment);
            }
        }