public Experiment(XmlNode configNode, string baseDirectory, LoadOptions loadOptions) { XmlAttributeCollection attrs = configNode.Attributes; if (attrs != null) { if (attrs.GetNamedItem(XMLTags.nameAttribute) != null) { Name = attrs[XMLTags.nameAttribute].Value; } } foreach (XmlNode child in configNode.ChildNodes) { switch (child.Name) { case XMLTags.forkTag: Fork newFork = new Fork(child); Forks.Add(newFork); break; case XmlTags.Version: AppVersion appVersion = new AppVersion(child); AppVersions.Add(appVersion); break; case XMLTags.ExperimentalUnitNodeTag: if (loadOptions.Selection == LoadOptions.ExpUnitSelection.All || (ExperimentalUnit.LogFileExists(child.Attributes[XMLTags.pathAttribute].Value, baseDirectory) == (loadOptions.Selection == LoadOptions.ExpUnitSelection.OnlyFinished))) { ExperimentalUnit newExpUnit = new ExperimentalUnit(child, baseDirectory, loadOptions); if (loadOptions.LoadVariablesInLog) { //We load the list of variables from the log descriptor and add them to the global list Log.Descriptor logDescriptor = new Log.Descriptor(newExpUnit.LogDescriptorFileName); newExpUnit.Variables.AddRange(logDescriptor.StateVariables); newExpUnit.Variables.AddRange(logDescriptor.ActionVariables); newExpUnit.Variables.AddRange(logDescriptor.RewardVariables); newExpUnit.Variables.AddRange(logDescriptor.StatVariables); //these two must be added manually newExpUnit.Variables.Add(Log.Data.EpisodeRealTimeVariable); newExpUnit.Variables.Add(Log.Data.ExperimentRealTimeVariable); foreach (string variable in newExpUnit.Variables) { AddVariable(variable); } } ExperimentalUnits.Add(newExpUnit); } break; } } //set the children's AppVersions foreach (ExperimentalUnit expUnit in ExperimentalUnits) { expUnit.AppVersions = AppVersions; } //update progress loadOptions.OnExpLoaded?.Invoke(this); }