internal static IExperimentRunner CreateExperimentRunner(IExperiment currentExperiment, TraceLab.Core.Workspaces.Workspace workspace, TraceLab.Core.Components.ComponentsLibrary library) { // Allow all nodes to send info to logs - if any targets exist. foreach (TraceLab.Core.Experiments.ExperimentNode node in currentExperiment.Vertices) { var componentNode = node as TraceLab.Core.Experiments.ComponentNode; if (componentNode != null) { foreach (TraceLab.Core.Settings.LogLevelItem item in componentNode.Data.Metadata.LogLevels) { item.IsEnabled = true; } } } RunnableNodeFactory templateGraphNodesFactory = new RunnableNodeFactory(workspace); TraceLab.Core.ExperimentExecution.RunnableExperimentBase template = GraphAdapter.Adapt(currentExperiment, templateGraphNodesFactory, library, workspace.TypeDirectories); var dispatcher = ExperimentRunnerFactory.CreateExperimentRunner(template); return(dispatcher); }
/// <summary> /// Initializes a new instance of the <see cref="ExperimentRunner"/> class. /// </summary> /// <param name="runnableExperiment">The runnable experiment.</param> /// <param name="destroyComponentsAppDomain">if set to <c>true</c> the experiment runner will destroy components app domain of this runnable experiment, once experiment is finished. /// In case of sub level experiments, the domain should not yet be destroyed. (there is one AppDomain for entire experiment, including /// subexperiments). The app domain should be destroyed only when top level experiment has been finished.</param> /// <param name="terminateExperimentResetEvent">The terminate experiment reset event of the top level experiment runner /// It allows stopping the experiment. /// Sublevel experiments need to also stop processing their nodes. /// </param> public ExperimentRunner(RunnableExperimentBase runnableExperiment, bool destroyComponentsAppDomain) { if (runnableExperiment == null) throw new ArgumentNullException("runnableExperiment"); m_runnableExperiment = runnableExperiment; m_disposeRunnableExperiment = destroyComponentsAppDomain; }
/// <summary> /// Initializes a new instance of the <see cref="ExperimentRunner"/> class. /// </summary> /// <param name="runnableExperiment">The runnable experiment.</param> /// <param name="destroyComponentsAppDomain">if set to <c>true</c> the experiment runner will destroy components app domain of this runnable experiment, once experiment is finished. /// In case of sub level experiments, the domain should not yet be destroyed. (there is one AppDomain for entire experiment, including /// subexperiments). The app domain should be destroyed only when top level experiment has been finished.</param> /// <param name="terminateExperimentResetEvent">The terminate experiment reset event of the top level experiment runner /// It allows stopping the experiment. /// Sublevel experiments need to also stop processing their nodes. /// </param> public ExperimentRunner(RunnableExperimentBase runnableExperiment, bool destroyComponentsAppDomain) { if (runnableExperiment == null) { throw new ArgumentNullException("runnableExperiment"); } m_runnableExperiment = runnableExperiment; m_disposeRunnableExperiment = destroyComponentsAppDomain; }
/// <summary> /// Initializes a new instance of the <see cref="RunnableLoopNode"/> class. /// </summary> /// <param name="id">The id.</param> /// <param name="loopDecisionModule">The loop decision module.</param> /// <param name="compositeComponentMetadata">The composite component metadata.</param> /// <param name="templateGraph">The template graph.</param> /// <param name="workspaceWrapper">The composite component workspace wrapper.</param> /// <param name="library">The library.</param> /// <param name="waitForAllPredecessors">if set to <c>true</c> [wait for all predecessors].</param> public RunnableLoopNode(String id, TraceLab.Core.Decisions.ILoopDecisionModule loopDecisionModule, CompositeComponentBaseMetadata compositeComponentMetadata, RunnableExperimentBase templateGraph, NestedWorkspaceWrapper workspaceWrapper, TraceLab.Core.Components.ComponentsLibrary library, bool waitForAllPredecessors) : base(id, compositeComponentMetadata, templateGraph, workspaceWrapper, library, waitForAllPredecessors) { m_loopDecisionModule = loopDecisionModule; }
/// <summary> /// Creates the composite component node. /// </summary> /// <param name="id">The id.</param> /// <param name="compositeComponentMetadata">The composite 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; The sublevel experiments hold the referance to the same termination event as top level experiment.</param> /// <returns> /// Created composite component node /// </returns> protected RunnableNode CreateCompositeComponentNode(string id, CompositeComponentMetadata compositeComponentMetadata, LoggerNameRoot loggerNameRoot, ComponentsLibrary library, AppDomain componentsAppDomain, System.Threading.ManualResetEvent terminateExperimentExecutionResetEvent) { NestedWorkspaceWrapper workspaceWrapper = WorkspaceWrapperFactory.CreateCompositeComponentWorkspaceWrapper(compositeComponentMetadata, Workspace, id, componentsAppDomain); NodesFactoryOfSubGraph nodesFactoryOfSubGraph = new NodesFactoryOfSubGraph(compositeComponentMetadata, workspaceWrapper); RunnableExperimentBase subExperiment = ConstructSubExperiment(compositeComponentMetadata, loggerNameRoot, library, componentsAppDomain, terminateExperimentExecutionResetEvent, nodesFactoryOfSubGraph); return(new RunnableCompositeComponentNode(id, compositeComponentMetadata, subExperiment, workspaceWrapper, library, compositeComponentMetadata.WaitsForAllPredecessors)); }
/// <summary> /// Initializes a new s_instance of the <see cref="RunnableCompositeComponentNode"/> class. /// </summary> /// <param name="id">The id.</param> /// <param name="compositeComponentMetadata">The composite component metadata.</param> /// <param name="templateGraph">The template graph.</param> /// <param name="workspaceWrapper">The composite component workspace wrapper.</param> public RunnableCompositeComponentNode(String id, CompositeComponentBaseMetadata compositeComponentMetadata, RunnableExperimentBase templateGraph, NestedWorkspaceWrapper workspaceWrapper, TraceLab.Core.Components.ComponentsLibrary library, bool waitForAllPredecessors) : base(id, compositeComponentMetadata.Label, new RunnableNodeCollection(), new RunnableNodeCollection(), library, waitForAllPredecessors) { m_compositeComponentMetadata = compositeComponentMetadata; m_subLevelExperiment = templateGraph; m_workspace = workspaceWrapper; }
/// <summary> /// Creates the scope composite component node. It actually returns the composite component, but with different nested workspace wrapper. /// </summary> /// <param name="id">The id.</param> /// <param name="scopeMetadata">The scope metadata.</param> /// <param name="loggerNameRoot">The logger name root.</param> /// <param name="library">The library.</param> /// <param name="componentsAppDomain">The components app domain.</param> /// <param name="terminateExperimentExecutionResetEvent">The terminate experiment execution reset event.</param> /// <returns></returns> protected RunnableNode CreateScopeCompositeComponentNode(string id, ScopeBaseMetadata scopeMetadata, LoggerNameRoot loggerNameRoot, ComponentsLibrary library, AppDomain componentsAppDomain, System.Threading.ManualResetEvent terminateExperimentExecutionResetEvent) { ScopeNestedWorkspaceWrapper workspaceWrapper = WorkspaceWrapperFactory.CreateCompositeComponentWorkspaceWrapper(scopeMetadata, Workspace, id, componentsAppDomain); //scope can standard runnable factory, unlike the composite component IRunnableNodeFactory nodesFactory = new RunnableNodeFactory(workspaceWrapper); RunnableExperimentBase subExperiment = ConstructSubExperiment(scopeMetadata, loggerNameRoot, library, componentsAppDomain, terminateExperimentExecutionResetEvent, nodesFactory); return(new RunnableCompositeComponentNode(id, scopeMetadata, subExperiment, workspaceWrapper, library, scopeMetadata.WaitsForAllPredecessors)); }
/// <summary> /// Constructs the sub experiment. /// </summary> /// <param name="compositeComponentMetadata">The composite component metadata.</param> /// <param name="loggerNameRoot">The logger name root.</param> /// <param name="library">The library.</param> /// <param name="componentsAppDomain">The components app domain.</param> /// <param name="terminateExperimentExecutionResetEvent">The terminate experiment execution reset event - must be the same as top level experiment termination event.</param> /// <param name="nodesFactoryOfSubGraph">The nodes factory of sub graph.</param> /// <returns></returns> private RunnableExperimentBase ConstructSubExperiment(CompositeComponentBaseMetadata compositeComponentMetadata, LoggerNameRoot loggerNameRoot, ComponentsLibrary library, AppDomain componentsAppDomain, System.Threading.ManualResetEvent terminateExperimentExecutionResetEvent, IRunnableNodeFactory nodesFactoryOfSubGraph) { //add to experiment id the owner node id to make it unique LoggerNameRoot compositeComponentNodeLoggerNameRoot = loggerNameRoot.CreateLoggerNameRootForCompositeNode(compositeComponentMetadata); RunnableExperimentBase subExperiment = GraphAdapter.Adapt(compositeComponentMetadata.ComponentGraph, compositeComponentNodeLoggerNameRoot, nodesFactoryOfSubGraph, library, Workspace.TypeDirectories, componentsAppDomain, terminateExperimentExecutionResetEvent, false); if (subExperiment.IsEmpty) { throw new TraceLab.Core.Exceptions.IncorrectSubTemplateException("Unable to execute subexperiment due to errors."); } return(subExperiment); }
/// <summary> /// Initializes a new instance of the <see cref="ExperimentRunner"/> class for the runnable experiment. /// </summary> /// <param name="runnableExperiment">The runnable experiment.</param> public ExperimentRunner(RunnableExperimentBase runnableExperiment) : this(runnableExperiment, true) { }
/// <summary> /// Creates the experiment runner for sub level experiment. /// The Experiment Runner is not destroying components app domain when this sub level experiment finishes. /// </summary> /// <param name="graph">The graph.</param> /// <returns>Experiment runner</returns> public static IExperimentRunner CreateExperimentRunnerForSubLevelExperiment(RunnableExperimentBase graph) { return(new ExperimentRunner(graph, false)); }
public static IExperimentRunner CreateExperimentRunner(RunnableExperimentBase graph) { return(new ExperimentRunner(graph)); }
/// <summary> /// Creates the experiment runner for sub level experiment. /// The Experiment Runner is not destroying components app domain when this sub level experiment finishes. /// </summary> /// <param name="graph">The graph.</param> /// <returns>Experiment runner</returns> public static IExperimentRunner CreateExperimentRunnerForSubLevelExperiment(RunnableExperimentBase graph) { return new ExperimentRunner(graph, false); }
public static IExperimentRunner CreateExperimentRunner(RunnableExperimentBase graph) { return new ExperimentRunner(graph); }