public void RunCompile()
        {
            lock (m_Lock)
            {
                UpdateActivitiesTargetResourceDependencies();

                var availableResources = new List <IResource <int> >();
                if (!ResourceSettings.AreDisabled)
                {
                    availableResources.AddRange(m_Mapper.Map <IEnumerable <ResourceModel>, IEnumerable <Resource <int> > >(ResourceSettings.Resources));
                }

                GraphCompilation = m_VertexGraphCompiler.Compile(availableResources);

                Duration = m_VertexGraphCompiler.Duration;

                UpdateActivitiesAllocatedToResources();

                CalculateResourceSeriesSet();

                SetCompilationOutput();

                CalculateCosts();

                IsProjectUpdated = true;

                // Cyclomatic complexity is calculated against the vertex graph without resource dependencies.
                CyclomaticComplexity = null;

                if (!HasCompilationErrors)
                {
                    IList <IDependentActivity <int, int> > dependentActivities =
                        GraphCompilation.DependentActivities
                        .Select(x => (IDependentActivity <int, int>)x.CloneObject())
                        .ToList();

                    if (dependentActivities.Any())
                    {
                        var vertexGraphCompiler = new VertexGraphCompiler <int, int, IDependentActivity <int, int> >();
                        foreach (DependentActivity <int, int> dependentActivity in dependentActivities)
                        {
                            dependentActivity.ResourceDependencies.Clear();
                            vertexGraphCompiler.AddActivity(dependentActivity);
                        }

                        vertexGraphCompiler.TransitiveReduction();
                        CyclomaticComplexity = vertexGraphCompiler.CyclomaticComplexity;
                    }
                }

                HasStaleOutputs = false;
            }

            PublishGraphCompiledPayload();
            PublishGraphCompilationUpdatedPayload();
        }
        public CoreViewModel(
            IProjectManager projectManager,
            ISettingManager settingManager,
            IDateTimeCalculator dateTimeCalculator,
            IEventAggregator eventService)
            : base(eventService)
        {
            m_Lock               = new object();
            m_ProjectManager     = projectManager ?? throw new ArgumentNullException(nameof(projectManager));
            m_SettingManager     = settingManager ?? throw new ArgumentNullException(nameof(settingManager));
            m_DateTimeCalculator = dateTimeCalculator ?? throw new ArgumentNullException(nameof(dateTimeCalculator));
            m_EventService       = eventService ?? throw new ArgumentNullException(nameof(eventService));

            m_VertexGraphCompiler = VertexGraphCompiler <int, IDependentActivity <int> > .Create();

            Activities        = new ObservableCollection <ManagedActivityViewModel>();
            ResourceSeriesSet = new List <ResourceSeriesDto>();
            ClearSettings();
        }
        public int RunCalculateResourcedCyclomaticComplexity()
        {
            lock (m_Lock)
            {
                int resourcedCyclomaticComplexity = 0;

                // Cyclomatic complexity is calculated against the transitively reduced
                // vertex graph, where resource dependencies are taken into account along
                // with regular dependencies.
                if (GraphCompilation != null &&
                    !HasCompilationErrors &&
                    !HasStaleOutputs &&
                    !ResourceSettingsDto.AreDisabled)
                {
                    IList <IDependentActivity <int> > dependentActivities =
                        GraphCompilation.DependentActivities
                        .Select(x => (IDependentActivity <int>)x.WorkingCopy())
                        .ToList();

                    if (dependentActivities.Any())
                    {
                        var vertexGraphCompiler = VertexGraphCompiler <int, IDependentActivity <int> > .Create();

                        foreach (DependentActivity <int> dependentActivity in dependentActivities)
                        {
                            dependentActivity.Dependencies.UnionWith(dependentActivity.ResourceDependencies);
                            dependentActivity.ResourceDependencies.Clear();
                            vertexGraphCompiler.AddActivity(dependentActivity);
                        }

                        vertexGraphCompiler.TransitiveReduction();
                        resourcedCyclomaticComplexity = vertexGraphCompiler.CyclomaticComplexity;
                    }
                }

                return(resourcedCyclomaticComplexity);
            }
        }
        public CoreViewModel(
            IProjectService projectService,
            ISettingService settingService,
            IApplicationCommands applicationCommands,
            IDateTimeCalculator dateTimeCalculator,
            IMapper mapper,
            IEventAggregator eventService)
            : base(eventService)
        {
            m_Lock               = new object();
            m_UndoStack          = new LimitedSizeStack <UndoRedoCommandPair>(c_MaxUndoRedoStackSize);
            m_RedoStack          = new LimitedSizeStack <UndoRedoCommandPair>(c_MaxUndoRedoStackSize);
            m_ProjectService     = projectService ?? throw new ArgumentNullException(nameof(projectService));
            m_SettingService     = settingService ?? throw new ArgumentNullException(nameof(settingService));
            ApplicationCommands  = applicationCommands ?? throw new ArgumentNullException(nameof(applicationCommands));
            m_DateTimeCalculator = dateTimeCalculator ?? throw new ArgumentNullException(nameof(dateTimeCalculator));
            m_Mapper             = mapper ?? throw new ArgumentNullException(nameof(mapper));
            m_EventService       = eventService ?? throw new ArgumentNullException(nameof(eventService));

            m_VertexGraphCompiler = new VertexGraphCompiler <int, int, IDependentActivity <int, int> >();
            Activities            = new ObservableCollection <IManagedActivityViewModel>();
            InitializeCommands();
            ClearSettings();
        }