Ejemplo n.º 1
0
        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;
        }
Ejemplo n.º 3
0
        /// <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;
        }
Ejemplo n.º 4
0
 /// <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>
 /// 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;
 }
Ejemplo n.º 6
0
        /// <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>
 /// 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;
 }
Ejemplo n.º 9
0
        /// <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));
        }
Ejemplo n.º 10
0
        /// <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);
        }
Ejemplo n.º 11
0
 /// <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)
 {
 }
Ejemplo n.º 12
0
 /// <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));
 }
Ejemplo n.º 13
0
 public static IExperimentRunner CreateExperimentRunner(RunnableExperimentBase graph)
 {
     return(new ExperimentRunner(graph));
 }
 /// <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);
 }