예제 #1
0
        private void CaculateCriticalTransitionOperationPlaces()
        {
            List <int> operationPlaces = this.m_Reachability.GetOperationPlaceNames();

            foreach (KeyValuePair <int, HashSet <int> > item in this.m_MinimalTCriticalMTSIs)
            {
                this.m_CriticalTransitionOperationPlaces.Add(item.Key, new List <int>());
                foreach (int operationPlace in operationPlaces)
                {
                    if (this.m_Reachability.IncidenceMatrix.GetValueFromMarkingNameAndTransitionName(item.Key, operationPlace) > 0)
                    {
                        this.m_CriticalTransitionOperationPlaces[item.Key].Add(operationPlace);
                        continue;
                    }
                    bool check = true;
                    foreach (int markingName in item.Value)
                    {
                        Marking m = this.m_Reachability.GetMarkingFromMarkingName(markingName);
                        if (m.GetMarkingValueFromPlaceName(operationPlace) != 0)
                        {
                            check = false;
                            break;
                        }
                    }
                    if (!check)
                    {
                        this.m_CriticalTransitionOperationPlaces[item.Key].Add(operationPlace);
                    }
                }
            }
        }
예제 #2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="m1Name"></param>
        /// <param name="m2Name"></param>
        /// <param name="coverPlaceNames"></param>
        /// <returns>
        /// return 1: Marking 1 > Marking 2
        /// return 0: Can not compare Marking 1 with Marking 2
        /// return -1: Marking 1 < Marking 2
        /// </returns>
        private int CompareTwoMarking(int m1Name, int m2Name, ref List <int> coverPlaceNames)
        {
            bool    isGreater = true;
            bool    isLess    = true;
            Marking m1        = this.m_Reachability.GetMarkingFromMarkingName(m1Name);
            Marking m2        = this.m_Reachability.GetMarkingFromMarkingName(m2Name);

            foreach (int p in coverPlaceNames)
            {
                int value1 = m1.GetMarkingValueFromPlaceName(p);
                int value2 = m2.GetMarkingValueFromPlaceName(p);
                if (value1 > value2)
                {
                    isLess = false;
                }
                else
                {
                    isGreater = false;
                }
            }
            if (isGreater)
            {
                return(1);
            }
            else if (isLess)
            {
                return(-1);
            }
            else
            {
                return(0);
            }
        }
예제 #3
0
        public MathematicalTool.ILPDataFormat GetMMPILPFormatData(int criticalTransitionName, bool isMM)
        {
            List <string>      variables       = new List <string>();
            List <int>         objectFunction  = new List <int>();
            List <List <int> > leftMatrix      = new List <List <int> >();
            List <int>         leftConstValues = new List <int>();
            List <MathematicalTool.LimitedConditionSign> signs = new List <MathematicalTool.LimitedConditionSign>();
            List <List <int> > rightMatrix      = new List <List <int> >();
            List <int>         rightConstValues = new List <int>();
            List <bool>        gin        = new List <bool>();
            List <bool>        bin        = new List <bool>();
            List <string>      annotation = new List <string>();

            annotation.Add(string.Empty);
            annotation.Add(string.Empty);

            List <int> operatorMarkings = this.m_Reachability.GetOperationPlaceNames();

            foreach (int m in operatorMarkings)
            {
                variables.Add("l" + m.ToString());
                objectFunction.Add(0);

                gin.Add(true);
                bin.Add(false);
            }

            foreach (int m in this.m_MinimalTCriticalMTSIs[criticalTransitionName])
            {
                variables.Add("f" + m.ToString());
                objectFunction.Add(1);

                gin.Add(false);
                bin.Add(true);
            }

            //Belta
            variables.Add("Belta");
            objectFunction.Add(0);
            gin.Add(true);
            bin.Add(false);

            //Omega
            variables.Add("Omega");
            objectFunction.Add(0);
            gin.Add(true);
            bin.Add(false);

            foreach (int markingName in this.m_MinimalLegalMarkings)
            {
                Marking    m        = this.m_Reachability.GetMarkingFromMarkingName(markingName);
                List <int> leftRow  = new List <int>();
                List <int> rightRow = new List <int>();

                //p_i
                foreach (int operatorMarkingName in operatorMarkings)
                {
                    int value = m.GetMarkingValueFromPlaceName(operatorMarkingName);
                    leftRow.Add(value);
                    rightRow.Add(0);
                }

                //f_j
                foreach (int criticalMarking in this.m_MinimalTCriticalMTSIs[criticalTransitionName])
                {
                    leftRow.Add(0);
                    rightRow.Add(0);
                }

                //Belta
                leftRow.Add(0);
                rightRow.Add(1);

                //Omega
                leftRow.Add(0);
                rightRow.Add(0);

                leftMatrix.Add(leftRow);
                signs.Add(MathematicalTool.LimitedConditionSign.LessOrEqual);
                leftConstValues.Add(0);
                rightMatrix.Add(rightRow);
                rightConstValues.Add(0);
                annotation.Add("Legal marking* : " + markingName);
            }

            if (isMM)
            {
                foreach (int markingName in this.m_MMinimalTEnabledGoodMarkings[criticalTransitionName])
                {
                    Marking    m        = this.m_Reachability.GetMarkingFromMarkingName(markingName);
                    List <int> leftRow  = new List <int>();
                    List <int> rightRow = new List <int>();

                    //p_i
                    foreach (int operatorMarkingName in operatorMarkings)
                    {
                        int value = m.GetMarkingValueFromPlaceName(operatorMarkingName) +
                                    this.m_Reachability.IncidenceMatrix.GetValueFromMarkingNameAndTransitionName(operatorMarkingName, criticalTransitionName);
                        leftRow.Add(value);
                        rightRow.Add(0);
                    }

                    //f_j
                    foreach (int criticalMarking in this.m_MinimalTCriticalMTSIs[criticalTransitionName])
                    {
                        leftRow.Add(0);
                        rightRow.Add(0);
                    }

                    //Belta
                    leftRow.Add(0);
                    rightRow.Add(1);

                    //Omega
                    leftRow.Add(0);
                    rightRow.Add(-1);

                    leftMatrix.Add(leftRow);
                    signs.Add(MathematicalTool.LimitedConditionSign.LessOrEqual);
                    leftConstValues.Add(0);
                    rightMatrix.Add(rightRow);
                    rightConstValues.Add(0);
                    annotation.Add("t" + criticalTransitionName + "-enabled good marking** : " + markingName);
                }
            }
            else
            {
                foreach (int markingName in this.m_MinimalTEnabledGoodMarkings[criticalTransitionName])
                {
                    Marking    m        = this.m_Reachability.GetMarkingFromMarkingName(markingName);
                    List <int> leftRow  = new List <int>();
                    List <int> rightRow = new List <int>();

                    //p_i
                    foreach (int operatorMarkingName in operatorMarkings)
                    {
                        int value = m.GetMarkingValueFromPlaceName(operatorMarkingName) +
                                    this.m_Reachability.IncidenceMatrix.GetValueFromMarkingNameAndTransitionName(operatorMarkingName, criticalTransitionName);
                        leftRow.Add(value);
                        rightRow.Add(0);
                    }

                    //f_j
                    foreach (int criticalMarking in this.m_MinimalTCriticalMTSIs[criticalTransitionName])
                    {
                        leftRow.Add(0);
                        rightRow.Add(0);
                    }

                    //Belta
                    leftRow.Add(0);
                    rightRow.Add(1);

                    //Omega
                    leftRow.Add(0);
                    rightRow.Add(-1);

                    leftMatrix.Add(leftRow);
                    signs.Add(MathematicalTool.LimitedConditionSign.LessOrEqual);
                    leftConstValues.Add(0);
                    rightMatrix.Add(rightRow);
                    rightConstValues.Add(0);
                    annotation.Add("t" + criticalTransitionName + "-enabled good marking* : " + markingName);
                }
            }

            foreach (int markingName in this.m_MinimalTCriticalMTSIs[criticalTransitionName])
            {
                Marking    m        = this.m_Reachability.GetMarkingFromMarkingName(markingName);
                List <int> leftRow  = new List <int>();
                List <int> rightRow = new List <int>();

                //p_i
                foreach (int operatorMarkingName in operatorMarkings)
                {
                    int value = m.GetMarkingValueFromPlaceName(operatorMarkingName) +
                                this.m_Reachability.IncidenceMatrix.GetValueFromMarkingNameAndTransitionName(operatorMarkingName, criticalTransitionName);
                    leftRow.Add(value);
                    rightRow.Add(0);
                }

                //f_j
                foreach (int criticalMarking in this.m_MinimalTCriticalMTSIs[criticalTransitionName])
                {
                    leftRow.Add(0);
                    if (criticalMarking == markingName)
                    {
                        rightRow.Add(MathematicalTool.ILP.ILPMaxNum);
                    }
                    else
                    {
                        rightRow.Add(0);
                    }
                }

                //Belta
                leftRow.Add(0);
                rightRow.Add(1);

                //Omega
                leftRow.Add(0);
                rightRow.Add(-1);

                leftMatrix.Add(leftRow);
                rightMatrix.Add(rightRow);
                signs.Add(MathematicalTool.LimitedConditionSign.GreaterOrEqual);
                leftConstValues.Add(0);
                rightConstValues.Add(1 - MathematicalTool.ILP.ILPMaxNum);
                annotation.Add("MTSIs* : (" + markingName + " , t" + criticalTransitionName + ")");
            }

            return(new MathematicalTool.ILPDataFormat(variables, objectFunction, true, leftMatrix, leftConstValues,
                                                      signs, rightMatrix, rightConstValues, gin, bin, annotation));
        }
예제 #4
0
        public MathematicalTool.ILPDataFormat GetNMMPILPFormatData(int criticalMarkingName)
        {
            List <string>      variables       = new List <string>();
            List <int>         objectFunction  = new List <int>();
            List <List <int> > leftMatrix      = new List <List <int> >();
            List <int>         leftConstValues = new List <int>();
            List <MathematicalTool.LimitedConditionSign> signs = new List <MathematicalTool.LimitedConditionSign>();
            List <List <int> > rightMatrix      = new List <List <int> >();
            List <int>         rightConstValues = new List <int>();
            List <bool>        gin        = new List <bool>();
            List <bool>        bin        = new List <bool>();
            List <string>      annotation = new List <string>();

            annotation.Add(string.Empty);
            annotation.Add(string.Empty);

            List <int> operatorMarkings = this.m_Reachability.GetOperationPlaceNames();

            #region Add Variables

            //Add variables: operationMarkings
            foreach (int m in operatorMarkings)
            {
                variables.Add("l" + m.ToString());
                objectFunction.Add(-1);

                gin.Add(true);
                bin.Add(false);
            }

            //Add variables: f_kj
            foreach (int m in this.m_MinimalCriticalMarkingNames)
            {
                variables.Add("f" + criticalMarkingName.ToString() + "_" + m.ToString());
                objectFunction.Add(1);

                gin.Add(false);
                bin.Add(true);
            }

            //Add variables: Belta
            variables.Add("Belta");
            objectFunction.Add(-1);
            gin.Add(true);
            bin.Add(false);

            //Add variables: Omega
            foreach (int t in this.m_Reachability.CriticalTransitions)
            {
                variables.Add("Omega" + t.ToString());
                objectFunction.Add(-1);
                gin.Add(true);
                bin.Add(false);
            }

            #endregion

            #region Add Constraints

            foreach (int markingName in this.m_MinimalLegalMarkings)
            {
                Marking    m        = this.m_Reachability.GetMarkingFromMarkingName(markingName);
                List <int> leftRow  = new List <int>();
                List <int> rightRow = new List <int>();

                //p_i
                foreach (int operatorMarkingName in operatorMarkings)
                {
                    int value = m.GetMarkingValueFromPlaceName(operatorMarkingName);
                    leftRow.Add(value);
                    rightRow.Add(0);
                }

                //f_kj
                foreach (int mm in this.m_MinimalCriticalMarkingNames)
                {
                    leftRow.Add(0);
                    rightRow.Add(0);
                }

                //Belta
                leftRow.Add(0);
                rightRow.Add(1);

                //Omega
                foreach (int t in this.m_Reachability.CriticalTransitions)
                {
                    leftRow.Add(0);
                    rightRow.Add(0);
                }


                leftMatrix.Add(leftRow);
                signs.Add(MathematicalTool.LimitedConditionSign.LessOrEqual);
                leftConstValues.Add(0);
                rightMatrix.Add(rightRow);
                rightConstValues.Add(0);
                annotation.Add("legal marking*: " + markingName.ToString());
            }

            foreach (KeyValuePair <int, HashSet <int> > item in this.m_MMinimalTEnabledGoodMarkings)
            {
                foreach (int markingName in item.Value)
                {
                    List <int> leftRow  = new List <int>();
                    List <int> rightRow = new List <int>();
                    Marking    m        = this.m_Reachability.GetMarkingFromMarkingName(markingName);
                    foreach (int operatorPlace in operatorMarkings)
                    {
                        int value = m.GetMarkingValueFromPlaceName(operatorPlace) +
                                    this.m_Reachability.IncidenceMatrix.GetValueFromMarkingNameAndTransitionName(operatorPlace, item.Key);
                        leftRow.Add(value);
                        rightRow.Add(0);
                    }

                    foreach (int mm in this.m_MinimalCriticalMarkingNames)
                    {
                        leftRow.Add(0);
                        rightRow.Add(0);
                    }

                    //Belta
                    leftRow.Add(0);
                    rightRow.Add(1);

                    //Omega
                    foreach (int t in this.m_Reachability.CriticalTransitions)
                    {
                        leftRow.Add(0);
                        if (t == item.Key)
                        {
                            rightRow.Add(-1);
                        }
                        else
                        {
                            rightRow.Add(0);
                        }
                    }

                    leftMatrix.Add(leftRow);
                    leftConstValues.Add(0);
                    signs.Add(MathematicalTool.LimitedConditionSign.LessOrEqual);
                    rightMatrix.Add(rightRow);
                    rightConstValues.Add(0);
                    annotation.Add("t" + item.Key + "-enabled good marking** : " + markingName.ToString());
                }
            }

            foreach (KeyValuePair <int, HashSet <int> > item in this.m_MinimalTCriticalMTSIs)
            {
                foreach (int markingName in item.Value)
                {
                    List <int> leftRow  = new List <int>();
                    List <int> rightRow = new List <int>();
                    Marking    m        = this.m_Reachability.GetMarkingFromMarkingName(markingName);
                    foreach (int operatorPlace in operatorMarkings)
                    {
                        int value = m.GetMarkingValueFromPlaceName(operatorPlace) +
                                    this.m_Reachability.IncidenceMatrix.GetValueFromMarkingNameAndTransitionName(operatorPlace, item.Key);
                        leftRow.Add(value);
                        rightRow.Add(0);
                    }

                    foreach (int mm in this.m_MinimalCriticalMarkingNames)
                    {
                        leftRow.Add(0);
                        if (mm == markingName)
                        {
                            rightRow.Add(MathematicalTool.ILP.ILPMaxNum);
                        }
                        else
                        {
                            rightRow.Add(0);
                        }
                    }

                    //Belta
                    leftRow.Add(0);
                    rightRow.Add(1);

                    //Omega
                    foreach (int t in this.m_Reachability.CriticalTransitions)
                    {
                        leftRow.Add(0);
                        if (t == item.Key)
                        {
                            rightRow.Add(-1);
                        }
                        else
                        {
                            rightRow.Add(0);
                        }
                    }

                    leftMatrix.Add(leftRow);
                    leftConstValues.Add(0);
                    signs.Add(MathematicalTool.LimitedConditionSign.GreaterOrEqual);
                    rightMatrix.Add(rightRow);
                    rightConstValues.Add(1 - MathematicalTool.ILP.ILPMaxNum);
                    annotation.Add("MTSIs*: (" + markingName + " , t" + item.Key + ")");
                }
            }

            List <int> lastLeftRow  = new List <int>();
            List <int> lastRightRow = new List <int>();

            //p_i
            foreach (int operatorMarkingName in operatorMarkings)
            {
                lastLeftRow.Add(0);
                lastRightRow.Add(0);
            }

            //f_kj
            foreach (int mm in this.m_MinimalCriticalMarkingNames)
            {
                if (mm == criticalMarkingName)
                {
                    lastLeftRow.Add(1);
                }
                else
                {
                    lastLeftRow.Add(0);
                }
                lastRightRow.Add(0);
            }

            //Belta
            lastLeftRow.Add(0);
            lastRightRow.Add(0);

            //Omega
            foreach (int t in this.m_Reachability.CriticalTransitions)
            {
                lastLeftRow.Add(0);
                lastRightRow.Add(0);
            }

            leftMatrix.Add(lastLeftRow);
            signs.Add(MathematicalTool.LimitedConditionSign.Equal);
            leftConstValues.Add(0);
            rightMatrix.Add(lastRightRow);
            rightConstValues.Add(1);

            #endregion

            return(new MathematicalTool.ILPDataFormat(variables, objectFunction, true, leftMatrix, leftConstValues,
                                                      signs, rightMatrix, rightConstValues, gin, bin, annotation));
        }