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); } } } }
/// <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); } }
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)); }
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)); }