// END HERZUM 1.0 internal void DisplaySubgraph(CompositeComponentMetadata metadata) { /* * //always clear crumbs * m_experimentCanvasWidget.ExperimentCrumbs.RemoveAll(); * * List<Crumb> crumbs = ExperimentCrumbGatherer.GatherCrumbs(metadata); * * m_experimentCanvasWidget.ExperimentCrumbs.ShowAll(); * * foreach(Crumb crumb in crumbs) * { * m_experimentCanvasWidget.ExperimentCrumbs.Append(crumb); * crumb.Clicked += Redraw; * } * * //set last one active (triggers clicked event) * m_experimentCanvasWidget.ExperimentCrumbs.Active = crumbs[crumbs.Count - 1]; * * //attach handler to the first element so that it hides and removes all crumbs * crumbs[0].Clicked += (object sender, EventArgs e) => * { * m_experimentCanvasWidget.ExperimentCrumbs.HideAll(); * }; */ }
/// <summary> /// Creates the Runnable node with a specific id based on the given metadata. /// Uses Composite Component Metadata config values to override Components config values in subgraph. /// </summary> /// <param name="id">The id of the node.</param> /// <param name="metadata">The component metadata.</param> /// <param name="loggerNameRoot">The logger name root - needed so that the logs are specific per experiment and experiment window.</param> /// <param name="library">The library of components.</param> /// <param name="componentsAppDomain">The components app domain is the app domain which components assemblies are going to be loaded into.</param> /// <param name="terminateExperimentExecutionResetEvent">The event that allows signalling termination of the experiment; /// Needed for the composite components sublevel experiments, so that they hold the referance to the same termination event as top level experiment</param> /// <returns> /// Created node /// </returns> public override RunnableNode CreateNode(String id, Metadata metadata, LoggerNameRoot loggerNameRoot, ComponentsLibrary library, AppDomain componentsAppDomain, System.Threading.ManualResetEvent terminateExperimentExecutionResetEvent) { RunnableNode retNode; ComponentMetadata originalComponentMetadata = metadata as ComponentMetadata; CompositeComponentMetadata compositeComponentMetadata = metadata as CompositeComponentMetadata; if (originalComponentMetadata != null) { ComponentMetadata overrideComponentMetadata = (ComponentMetadata)originalComponentMetadata.Clone(); OverrideConfigValues(id, overrideComponentMetadata); retNode = base.CreateNode(id, overrideComponentMetadata, loggerNameRoot, library, componentsAppDomain, terminateExperimentExecutionResetEvent); } else if (compositeComponentMetadata != null) { OverrideConfigValues(id, compositeComponentMetadata); retNode = base.CreateCompositeComponentNode(id, compositeComponentMetadata, loggerNameRoot, library, componentsAppDomain, terminateExperimentExecutionResetEvent); } else { retNode = base.CreateNode(id, metadata, loggerNameRoot, library, componentsAppDomain, terminateExperimentExecutionResetEvent); } return(retNode); }
public static List <Crumb> GatherCrumbs(CompositeComponentMetadata metadata) { List <Crumb> crumbs = new List <Crumb>(); PushParents(metadata.ComponentGraph, crumbs); crumbs.Add(new ExperimentCrumb(metadata.Label, metadata.ComponentGraph)); return(crumbs); }
/// <summary> /// Creates the Runnable node with a specific id based on the given metadata. /// </summary> /// <param name="nodeId">The node id.</param> /// <param name="metadata">The component metadata.</param> /// <param name="loggerNameRoot">The logger name root - needed so that the logs are specific per experiment and experiment window.</param> /// <param name="library">The library of components.</param> /// <param name="componentsAppDomain">The components app domain is the app domain which components assemblies are going to be loaded into.</param> /// <param name="terminateExperimentExecutionResetEvent">The event that allows signalling termination of the experiment; /// Needed for the composite components sublevel experiments, so that they hold the referance to the same termination event as top level experiment.</param> /// <returns> /// Created node /// </returns> public virtual RunnableNode CreateNode(String nodeId, Metadata metadata, LoggerNameRoot loggerNameRoot, ComponentsLibrary library, AppDomain componentsAppDomain, System.Threading.ManualResetEvent terminateExperimentExecutionResetEvent) { RunnableNode retNode; ComponentMetadata componentMetadata = metadata as ComponentMetadata; DecisionMetadata decisionMetadata = metadata as DecisionMetadata; StartNodeMetadata startNodeMetadata = metadata as StartNodeMetadata; EndNodeMetadata endNodeMetadata = metadata as EndNodeMetadata; ScopeBaseMetadata scopeMetadata = metadata as ScopeBaseMetadata; LoopScopeMetadata loopMetadata = metadata as LoopScopeMetadata; CompositeComponentMetadata compositeComponentMetadata = metadata as CompositeComponentMetadata; ExitDecisionMetadata exitDecisionMetadata = metadata as ExitDecisionMetadata; if (componentMetadata != null) { TraceLabSDK.ComponentLogger logger = TraceLab.Core.Components.LoggerFactory.CreateLogger(loggerNameRoot, nodeId, componentMetadata); IComponent component = library.LoadComponent(componentMetadata, Workspace, logger, componentsAppDomain); retNode = new RunnableComponentNode(nodeId, componentMetadata.Label, component, logger, library, componentMetadata.WaitsForAllPredecessors); } else if (decisionMetadata != null) { IDecisionModule decisionModule = DecisionModuleFactory.LoadDecisionModule(decisionMetadata, Workspace, componentsAppDomain); retNode = new RunnableDecisionNode(nodeId, decisionMetadata.Label, decisionModule, library, decisionMetadata.WaitsForAllPredecessors); } else if (startNodeMetadata != null) { retNode = new RunnableStartNode(nodeId); } else if (endNodeMetadata != null) { retNode = new RunnableEndNode(nodeId, endNodeMetadata.WaitsForAllPredecessors); } else if (loopMetadata != null) { retNode = CreateLoopNode(nodeId, loopMetadata, loggerNameRoot, library, componentsAppDomain, terminateExperimentExecutionResetEvent); } else if (scopeMetadata != null) { retNode = CreateScopeCompositeComponentNode(nodeId, scopeMetadata, loggerNameRoot, library, componentsAppDomain, terminateExperimentExecutionResetEvent); } else if (compositeComponentMetadata != null) { retNode = CreateCompositeComponentNode(nodeId, compositeComponentMetadata, loggerNameRoot, library, componentsAppDomain, terminateExperimentExecutionResetEvent); } else if (exitDecisionMetadata != null) { retNode = new RunnablePrimitiveNode(nodeId, exitDecisionMetadata.WaitsForAllPredecessors); } else { throw new Exceptions.InconsistentTemplateException("Could not identify node type."); } return(retNode); }
public void RefreshError() { if (Data != null) { CompositeComponentMetadata metadata = Data.Metadata as CompositeComponentMetadata; if (metadata != null && metadata.ComponentGraph != null) { SetSubExperimentError(metadata.ComponentGraph); } } }
private void RemoveSubLevels(IExperiment experiment) { if (experiment == null) { throw new ArgumentNullException("experiment"); } foreach (ExperimentNode node in experiment.Vertices) { CompositeComponentNode compositeNode = node as CompositeComponentNode; if (compositeNode != null && m_subLevels.ContainsKey(compositeNode.ID)) { CompositeComponentMetadata data = compositeNode.Data.Metadata as CompositeComponentMetadata; var subLevel = m_subLevels[compositeNode.ID]; if (subLevel != null) { RemoveSubLevels(subLevel); } m_subLevels.Remove(compositeNode.ID); } } }
/// <summary> /// Initializes a new s_instance of the <see cref="NodesFactoryOfSubGraph"/> class. /// </summary> /// <param name="compositeComponentMetadata">The composite component metadata, which is going to be used to override config values in subgraph.</param> /// <param name="workspaceWrapper">The workspace wrapper.</param> /// <param name="experimentReverseLookup">The experiment reverse lookup holds information of all predecessor experiments in the path - used to prevent recursion in case subexperiment refers back to any of the previous experiments.</param> public NodesFactoryOfSubGraph(CompositeComponentMetadata compositeComponentMetadata, IWorkspaceInternal workspaceWrapper) : base(workspaceWrapper) //compositeComponentMetadata.SubExperimentFile { m_compositeComponentMetadata = compositeComponentMetadata; }
protected virtual void InitializeComponentGraph(TraceLab.Core.Settings.Settings settings) { CompositeComponentMetadata.InitializeComponentGraph(this, settings); }
/// <summary> /// Creates the composite component workspace wrapper. /// It is specifc workspace wrapper, that uses the composite node namespace to store and load items. It pass loading and storing to its /// workspace instance, but with added namespace. /// It also has method to setup and teardown iospec and config before executing composite node. /// </summary> /// <param name="compositeComponentMetadata">The composite component metadata.</param> /// <param name="workspaceInstance">The workspace instance.</param> /// <param name="workspaceNamespaceId">The workspace namespace id.</param> /// <returns></returns> public static NestedWorkspaceWrapper CreateCompositeComponentWorkspaceWrapper(CompositeComponentMetadata compositeComponentMetadata, IWorkspaceInternal workspaceInstance, string workspaceNamespaceId, AppDomain componentsAppDomain) { var type = typeof(NestedWorkspaceWrapper); var nestedWorkspaceWrapper = (NestedWorkspaceWrapper)componentsAppDomain.CreateInstanceAndUnwrap( type.Assembly.FullName, type.FullName, false, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.CreateInstance | BindingFlags.Instance, null, new object[] { compositeComponentMetadata.IOSpec, workspaceInstance, workspaceNamespaceId }, System.Globalization.CultureInfo.CurrentCulture, new object[] { }); return(nestedWorkspaceWrapper); }
/// <summary> /// Prepares the benchmark experiment. /// </summary> /// <param name="experimentToBeBenchmarked">The experiment to be benchmarked.</param> /// <exception cref="TraceLab.Core.Exceptions.ExperimentLoadException">throws if experiment load fails</exception> /// <param name="library">The library.</param> public void PrepareBenchmarkExperiment(Experiment experimentToBeBenchmarked, ComponentsLibrary library) { //load benchmark experiment Experiment benchmarkExperiment = ExperimentManager.Load(BenchmarkInfo.FilePath, library); //update benchmark experiment info, so that it refers to the same benchmark info (LoadExperiment would not read BenchmarkInfo, as it only reads ExperimentInfo) benchmarkExperiment.ExperimentInfo = BenchmarkInfo; //2. find template node to be replaced ExperimentNode templateNode = null; foreach (ExperimentNode node in benchmarkExperiment.Vertices) { if (node.Data.Metadata is ComponentTemplateMetadata) { templateNode = node; break; } } if (templateNode == null) { throw new TraceLab.Core.Exceptions.BenchmarkException("Template node has not been found in the benchmark experiment. The benchmark experiment is corrupted."); } //3. export current experiment into composite component foreach (BenchmarkItemSetting <IOItem> item in BenchmarkInputSetting) { item.SelectedSetting.Include = true; } foreach (BenchmarkItemSetting <IOItem> item in BenchmarkOutputsSetting) { item.SelectedSetting.Include = true; } //create temporary component source - note it is just a assembly source name file to satisfy Metadata Assembly requirement //the file is not going to be created (this is UGLY - do refactoring) string tempSource = System.IO.Path.Combine(BenchmarkInfo.FilePath, "temporary"); m_setup.CompositeComponentLocationFilePath = tempSource; CompositeComponentMetadataDefinition definition = m_setup.GenerateCompositeComponentDefinition(); //4. Replace template node by removing it from graph, adding the new node, and reconnecting new not //Add composite component node ExperimentNode replacementNode = benchmarkExperiment.AddComponentFromDefinition(definition, templateNode.Data.X, templateNode.Data.Y); //connect replacement node to the same outgoing nodes as template node foreach (ExperimentNodeConnection nodeConnection in benchmarkExperiment.OutEdges(templateNode)) { benchmarkExperiment.AddConnection(replacementNode, nodeConnection.Target); } //connect replacement node to the same incoming nodes as template node foreach (ExperimentNodeConnection nodeConnection in benchmarkExperiment.InEdges(templateNode)) { benchmarkExperiment.AddConnection(nodeConnection.Source, replacementNode); //if the predecessor is a decision node update its decision code so that it matches new label FixDecisionCode(templateNode.Data.Metadata.Label, replacementNode.Data.Metadata.Label, nodeConnection.Source as ExperimentDecisionNode); } //finally remove the template node benchmarkExperiment.RemoveVertex(templateNode); //now remap io according to settings CompositeComponentMetadata compositeComponentDefinition = (CompositeComponentMetadata)replacementNode.Data.Metadata; foreach (BenchmarkItemSetting <IOItem> item in BenchmarkInputSetting) { item.SelectedSetting.Include = true; compositeComponentDefinition.IOSpec.Input[item.SelectedSetting.ItemSettingName].MappedTo = item.Item.MappedTo; } foreach (BenchmarkItemSetting <IOItem> item in BenchmarkOutputsSetting) { item.SelectedSetting.Include = true; compositeComponentDefinition.IOSpec.Output[item.SelectedSetting.ItemSettingName].MappedTo = item.Item.MappedTo; } BenchmarkExperiment = benchmarkExperiment; }