gspn.java

来自「Petri网分析工具PIPE is open-source」· Java 代码 · 共 1,440 行 · 第 1/4 页

JAVA
1,440
字号
		//check if there are any potential transitions from marking 1 to marking 2 - if not return probability 0			boolean hasAChance = false;		for (int i = 0; i < transCount; i++) {				if (matchingTransition[i] == true){				hasAChance = true;				}		}		if (hasAChance == false) {			return 0.0;		}		//*****************************************************************************************************		//if a transition is needed to get to marking 2 but isn't enabled at marking 1, return probability 0		boolean enabledAndMatching = false;		for (int i = 0; i <transCount; i++) {				if ((matchingTransition[i] == true) && (marking1EnabledTransitions[i] == true)) {				enabledAndMatching  = true;				}		}		if (enabledAndMatching = false) {			return 0.0;		}		//******************************************************************************************************			//work out the sum of firing weights of input transitions		double candidateTransitionWeighting = 0.0;		for (int i = 0; i < transCount; i++) {			if((matchingTransition[i] == true) && (marking1EnabledTransitions[i] == true)){				candidateTransitionWeighting += pnmlData.getTransitions()[i].getRate(); 				}		}		//*****************************************************************************************************			//work out the sum of firing weights of enabled transitions		double enabledTransitionWeighting = 0.0;		for (int i = 0; i < transCount; i++) {			if (marking1EnabledTransitions[i] == true) {				enabledTransitionWeighting += pnmlData.getTransitions()[i].getRate();			}		}		return (candidateTransitionWeighting/enabledTransitionWeighting);				}		//######################################################################################################################	//This function is used to generate E-twiddle, the matrix specifying the rates for a specific state change leaving	//a tangible Mi and entering a vanishing state Mj.	private double getRateForSpecificStateChange(DataLayer pnmlData, int[] marking1, int[] marking2) {		int markSize = marking1.length;		int[][] incidenceMatrix = pnmlData.getIncidenceMatrix();		int transCount = pnmlData.getTransitions().length;		boolean[] marking1EnabledTransitions = new boolean[transCount];// = getTransitionEnabledStatus(pnmlData, marking1); //get list of transitions enabled at marking1		boolean[] matchingTransition = new boolean[transCount];		for (int i = 0; i <transCount; i++) {			marking1EnabledTransitions[i] = getTransitionEnabledStatus(pnmlData, marking1, i);		}				//**************************************************** *************************************************		for (int j = 0; j <transCount; j ++) {			matchingTransition[j] = true;  //initialise matrix of potential transition values to true		}		//*****************************************************************************************************		//get transition needed to fire to get from marking1 to marking2		for (int i = 0; i < transCount; i++) {			for (int k = 0; k <markSize; k++) {				//if the sum of the incidence matrix and marking 1 doesn't equal marking 2, 				//set that candidate transition possibility to be false 				if (((int)marking1[k] + (int)incidenceMatrix[k][i])!= (int)marking2[k]){					matchingTransition[i] = false;				}			}		}		//if the state is tangible, all transitions will be timed, 		//so all can be considered in the probability calculation.		//Otherwise, reset the enabled status of timed transitions to false, as immediate transitions		//will always fire first.				if (isTangibleState(pnmlData, marking1)== false) { 			for (int i = 0; i <transCount; i++) {				if (pnmlData.getTransitions()[i].getTimed() == true) {					marking1EnabledTransitions[i] = false;				}			}		}		//*****************************************************************************************************		//check if there are any potential transitions from marking 1 to marking 2 - if not return probability 0			boolean hasAChance = false;		for (int i = 0; i < transCount; i++) {				if (matchingTransition[i] == true){				hasAChance = true;				}		}		if (hasAChance == false) {			return 0.0;		}		//*****************************************************************************************************		//if a transition is needed to get to marking 2 but isn't enabled at marking 1, return probability 0		boolean enabledAndMatching = false;		for (int i = 0; i <transCount; i++) {				if ((matchingTransition[i] == true) && (marking1EnabledTransitions[i] == true)) {				enabledAndMatching  = true;				}		}		if (enabledAndMatching = false) {			return 0.0;		}		//******************************************************************************************************			//work out the sum of firing weights of input transitions		double candidateTransitionWeighting = 0.0;		for (int i = 0; i < transCount; i++) {			if((matchingTransition[i] == true) && (marking1EnabledTransitions[i] == true)){				candidateTransitionWeighting += pnmlData.getTransitions()[i].getRate(); 				}		}				return candidateTransitionWeighting;					}//######################################################################################################################	//This function generates a matrix of e-twiddles - used in calculation of throughput.	private double[][] rateMatrix(DataLayer pnmlData, StateList list1, StateList list2) {		int rows = list1.size();		int cols = list2.size();		double[][] result = new double[rows][cols];		for (int i = 0; i<rows; i++){			for (int j = 0; j < cols; j++){				result[i][j] = getRateForSpecificStateChange(pnmlData, list1.get(i),list2.get(j));			}		}		return result;	}	//######################################################################################################################	//This function works out the throughput of an immediate transition for a vanishing state.	private double getVanishingStateThroughput (DataLayer pnmldata, StateList list1, int transitionNumber, Matrix rateForSpecificState) {		int length = list1.size();		double result = 0;				for (int i = 0; i< length; i++){			double enabledTransitionRates = 0;			double specifiedTransitionRate = 0;			boolean[] transStatus = getTangibleTransitionEnabledStatusArray(pnmldata, list1.get(i));			if (transStatus[transitionNumber]==true){				int transCount = transStatus.length;				for (int j = 0; j<transCount; j++){					if (transStatus[j]==true){						enabledTransitionRates += pnmldata.getTransitions()[j].getRate();					}				}				specifiedTransitionRate = pnmldata.getTransitions()[transitionNumber].getRate();				result+= (specifiedTransitionRate/enabledTransitionRates)*rateForSpecificState.get(0,i);			}					}		return result;	}	//######################################################################################################################		private double getTransitionThroughputSPN (DataLayer pnmldata, StateList list, double[] steadyStateDistrib, int transitionNumber){		int length = list.size();		double result = 0;				for (int i = 0; i< length; i++){			double specifiedTransitionRate = 0;			boolean[] transStatus = getTransitionEnabledStatusArray(pnmldata, list.get(i));			//System.out.println(transStatus[0] + " " + transStatus[1]+ " "+ transStatus[2]+ " "+ transStatus[3]+ " "+ transStatus[4]+ " transStatuses" );			if (transStatus[transitionNumber]==true){				specifiedTransitionRate = pnmldata.getTransitions()[transitionNumber].getRate();				//System.out.println(specifiedTransitionRate +" specified transition rate");				result+= (specifiedTransitionRate*steadyStateDistrib[i]);			}		}		return result;	}	//######################################################################################################################			private double[] getTransitionThroughput(DataLayer pnmldata, StateList vanishing, StateList tangible, Matrix rateForSpecificChange, double[] steadyStateDistribution) {		Transition[] transitions = pnmldata.getTransitions();		int transCount = transitions.length;		double[] result = new double[transCount];		for (int i = 0; i<transCount; i++) {			if (transitions[i].getTimed()==true){				result[i] = getTransitionThroughputSPN(pnmldata, tangible, steadyStateDistribution, i);			}			else 				result[i] = getVanishingStateThroughput(pnmldata, vanishing, i, rateForSpecificChange);		}		return result;	}		//######################################################################################################################		/**Constructs a matrix of probabilities of changing from one marking to another.	 * Uses the reachability set to determine all markings, and applies the 	 * probMarkingAToMarkingB function to calculate probability for each pair of markings	 * @param pnmlData	 * @return	 */	private double[][]getTransitionProbabilityMatrix(DataLayer pnmlData, StateList reachabilitySet) {		int setLength = reachabilitySet.size();		double [][] transitionProbabilityMatrix = new double[setLength][setLength];		int recordSize = reachabilitySet.get(0).length;		int [] stateSpace1 = new int[recordSize];		int [] stateSpace2 = new int [recordSize];		for (int i = 0; i< setLength; i++){			stateSpace1 = reachabilitySet.get(i);			for (int j = 0; j < setLength; j++) {				stateSpace2 = reachabilitySet.get(j);				transitionProbabilityMatrix[i][j] = probMarkingAToMarkingB(pnmlData, stateSpace1, stateSpace2);			}		}		return transitionProbabilityMatrix;	}//######################################################################################################################	//This is a debugging function for viewing results in the console - not part of analysis 	private void print (boolean[] transitions) {		int size = transitions.length;		for (int i = 0; i < size ; i++) {			System.out.print( transitions[i] +" ");		}		System.out.println();	}	//######################################################################################################################	public String getName() {		return MODULE_NAME;	}		//######################################################################################################################	/*	private void runAnalysis(DataLayer pnmldata) {		Transition[] transitions = pnmldata.getTransitions();		int transCount = transitions.length;		boolean hasTimed = false; */		/*		for (int i = 0; i< length; i++) {			System.out.println("Timed attribute of transition " + transCount[i].getId());			System.out.println(transCount[i].getTimed());			if (transCount[i].getTimed()==true)				hasTimed = true;		}		*//*		if (hasTimed = false){			System.out.println("There are no timed transitions in this net.");			System.out.println("GSPN analysis cannot be performed.");			return;		}				if (testEqualConflict(pnmldata) == false) {			System.out.println("Condition equal conflict does not hold, so analysis cannot continue");			//TODO - put exit condition and apology in here			return;		}				//if (isEFCGSPN(pnmldata) )		System.out.println(isEFCGSPN(pnmldata) +" is EFCGSPN");		System.out.println("Condition equal conflict = " + testEqualConflict(pnmldata));		StateList reachSet = getReachabilitySet(pnmldata);		int reachSize = reachSet.size();				System.out.println("********************************************************");		System.out.println("********************************************************");		System.out.println("Decide whether states are vanishing or not");				for (int j = 0; j <reachSize; j ++){			int[] currentMarking = reachSet.get(j);			System.out.println(isTangibleState(pnmldata, currentMarking) + "...is tangible state");			printMarking(currentMarking);		}				getTransitionProbabilityMatrix(pnmldata, reachSet);*/					//generate matrices C, D, E, F		/*		StateList tangible = new StateList();		StateList vanishing = new StateList();				getVanishingAndTangible(pnmldata, reachSet, vanishing, tangible);*/				//MarkingProbability dummy = new MarkingProbability();/*		double[][] cMatrix, dMatrix, eMatrix, fMatrix, iMinusC, pPrime;		int cSize = vanishing.size();		int fSize = tangible.size();				cMatrix = probabilityMatrix(pnmldata, vanishing, vanishing);		dMatrix = probabilityMatrix(pnmldata, vanishing, tangible);		eMatrix = probabilityMatrix (pnmldata, tangible, vanishing);		fMatrix = probabilityMatrix (pnmldata, tangible, tangible);		iMinusC = identityMatrix(cSize);	//initialise to be the identity matrix						System.out.println("C, D, E, F matrices follow:");		printMatrix(cMatrix);		printMatrix(dMatrix);		printMatrix(eMatrix);		printMatrix(fMatrix);		printMatrix(iMinusC);						System.out.println("Generated C matrix" + cSize);				//generate P' = F + ((E x (I - C) ^-1) x D)		subtractMatrix(iMinusC, cMatrix);  //get the (I - C) term in the above expression				Matrix iMin = new Matrix(iMinusC);		Matrix f = new Matrix (fMatrix);		Matrix d = new Matrix (dMatrix);		Matrix e = new Matrix (eMatrix);		Matrix c = new Matrix (cMatrix);						Matrix iMinusCInverse = iMin.inverse();				iMinusCInverse.print(8,5);				Matrix iMinusCInverseD = new Matrix(iMinusCInverse.getRowDimension(),d.getColumnDimension());		iMinusCInverseD = iMinusCInverse.times(d);				iMinusCInverseD.print(8,5);				Matrix eIMinusCInverseD = new Matrix(e.getRowDimension(),iMinusCInverseD.getColumnDimension());				eIMinusCInverseD = e.times(iMinusCInverseD);				eIMinusCInverseD.print(8,5);				f.plusEquals(eIMinusCInverseD);				System.out.println("The answer...");		f.print(8,5);				Matrix piBarM = new Matrix(1,f.getColumnDimension());		for (int i = 0; i <f.getColumnDimension(); i++){		piBarM.set(0,i,1);			}		piBarM.print(8,5);				Matrix ps = piBarM.times(f);				System.out.println("See what this does");		ps.print(8,5);				Matrix inv = f.transpose();		System.out.println("The inverse");		inv.print(8,5);				for (int j = 0; j <inv.getRowDimension(); j ++) {			inv.set(j, j, (inv.get(j,j)) - 1);		}		inv.print (8,5);		int row = inv.getColumnDimension();				Matrix enh = new Matrix(row+1, row+1);				for (int i = 0; i <= row; i++){			enh.set(0, i, 1);		}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?