private void CheckTasks()
        {
            ProcessMatrix matrix = Process.Matrix;

            this.Tasks = 0;

            foreach (Activity activity in Process.Activities)
            {
                if (activity.Type.Equals(ActivityType.Implementation))
                {
                    this.Tasks++;

                    int index = Process.GetActivityIndexById(activity.Id);

                    int taskTargets = 0;

                    for (int i = 0; i < matrix.Size; i++)
                    {
                        taskTargets += matrix.Array[index, i];
                    }

                    int taskSources = 0;

                    for (int i = 0; i < matrix.Size; i++)
                    {
                        taskSources += matrix.Array[i, index];
                    }

                    if (taskTargets == 0)
                    {
                        Issues.Add(new Issue()
                        {
                            Element = activity,
                            Message = String.Format(Messages.TARGET_TASKS, activity.Name, Process.Name)
                        });
                    }

                    if (taskSources == 0)
                    {
                        Issues.Add(new Issue()
                        {
                            Element = activity,
                            Message = String.Format(Messages.SOURCE_TASKS, activity.Name, Process.Name)
                        });
                    }
                }
            }
        }
        public void CalculateProcessMatrix()
        {
            Matrix = new ProcessMatrix()
            {
                Size = Activities.Count
            };

            Matrix.InitialFill();

            foreach (Transition transition in Transitions)
            {
                int from = GetActivityIndexById(transition.From);
                int to   = GetActivityIndexById(transition.To);

                Matrix.AddTransition(from, to);
            }
        }
        private void CheckIntermediateEvents()
        {
            ProcessMatrix matrix = Process.Matrix;

            this.IntermediateEvents = 0;

            foreach (Activity activity in Process.Activities)
            {
                if (activity.Type.Equals(ActivityType.IntermediateEvent))
                {
                    this.IntermediateEvents++;

                    int index = Process.GetActivityIndexById(activity.Id);

                    int intermediateEventTargets = 0;

                    for (int i = 0; i < matrix.Size; i++)
                    {
                        intermediateEventTargets += matrix.Array[index, i];
                    }

                    int intermediateEventSources = 0;

                    for (int i = 0; i < matrix.Size; i++)
                    {
                        intermediateEventSources += matrix.Array[i, index];
                    }

                    if (intermediateEventTargets == 0 || intermediateEventSources == 0)
                    {
                        Issues.Add(new Issue()
                        {
                            Element = activity,
                            Message = String.Format(Messages.INTERMEDIATE_EVENTS,
                                                    activity.Name, Process.Name)
                        });
                    }
                }
            }
        }
        private void CheckProcessFlow()
        {
            ProcessMatrix matrix = Process.Matrix;

            this.Gateways = 0;

            foreach (Activity activity in Process.Activities)
            {
                if (activity.Type.Equals(ActivityType.Route))
                {
                    this.Gateways++;
                }
            }

            foreach (Activity activity in Process.Activities)
            {
                if (activity.Type.Equals(ActivityType.Implementation))
                {
                    int index = Process.GetActivityIndexById(activity.Id);

                    int taskTargets = 0;

                    for (int i = 0; i < matrix.Size; i++)
                    {
                        taskTargets += matrix.Array[index, i];
                    }

                    if (taskTargets > 1)
                    {
                        Issues.Add(new Issue()
                        {
                            Element = activity,
                            Message = String.Format(Messages.PROCESS_FLOW, Process.Name)
                        });
                    }
                }
            }
        }
        private void CalculateCSC()
        {
            double startEventsAmount = 0;
            double endEventsAmount   = 0;

            foreach (Activity activity in Process.Activities)
            {
                if (activity.Type.Equals(ActivityType.StartEvent))
                {
                    startEventsAmount++;
                }

                if (activity.Type.Equals(ActivityType.EndEvent))
                {
                    endEventsAmount++;
                }
            }

            ProcessMatrix matrix = Process.Matrix;

            double intermediateEventTargets = 0;
            double intermediateEventSources = 0;
            double intermediateEventAmount  = 0;

            foreach (Activity activity in Process.Activities)
            {
                if (activity.Type.Equals(ActivityType.IntermediateEvent))
                {
                    intermediateEventAmount++;
                }
            }

            foreach (Activity activity in Process.Activities)
            {
                if (activity.Type.Equals(ActivityType.IntermediateEvent))
                {
                    double intermediateEventTargetsSum = 0;
                    double intermediateEventSourcesSum = 0;

                    int index = Process.GetActivityIndexById(activity.Id);

                    for (int i = 0; i < matrix.Size; i++)
                    {
                        intermediateEventTargetsSum += matrix.Array[index, i];
                    }

                    for (int i = 0; i < matrix.Size; i++)
                    {
                        intermediateEventSourcesSum += matrix.Array[i, index];
                    }

                    intermediateEventTargets +=
                        ((intermediateEventTargetsSum > 0 ? 1 : 0) - 1) / intermediateEventAmount;
                    intermediateEventSources +=
                        ((intermediateEventSourcesSum > 0 ? 1 : 0) - 1) / intermediateEventAmount;
                }
            }

            double taskTargets = 0;
            double taskSources = 0;
            double taskAmount  = 0;

            foreach (Activity activity in Process.Activities)
            {
                if (activity.Type.Equals(ActivityType.Implementation))
                {
                    taskAmount++;
                }
            }

            foreach (Activity activity in Process.Activities)
            {
                if (activity.Type.Equals(ActivityType.Implementation))
                {
                    double taskTargetsSum = 0;
                    double taskSourcesSum = 0;

                    int index = Process.GetActivityIndexById(activity.Id);

                    for (int i = 0; i < matrix.Size; i++)
                    {
                        taskTargetsSum += matrix.Array[index, i];
                    }

                    for (int i = 0; i < matrix.Size; i++)
                    {
                        taskSourcesSum += matrix.Array[i, index];
                    }

                    taskTargets += Math.Abs(1 - taskTargetsSum) > 0 ? 1 : 0;
                    taskSources += ((taskSourcesSum > 0 ? 1 : 0) - 1) / taskAmount;
                }
            }

            CSC = ((startEventsAmount > 0 ? 1 : 0) - 1) + ((endEventsAmount > 0 ? 1 : 0) - 1) +
                  intermediateEventTargets + intermediateEventSources + taskSources - taskTargets;
        }