gspn.java

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

JAVA
1,440
字号
/* * Created on Feb 6, 2004 * * To change the template for this generated file go to * Window - Preferences - Java - Code Generation - Code and Comments */package pipe.modules.gspn;//import java.applet.AudioClip;//import java.applet.Applet.*;import jama.Matrix;import java.awt.Container;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.text.DecimalFormat;import java.util.ArrayList;import javax.swing.BoxLayout;import javax.swing.JDialog;import pipe.dataLayer.Arc;import pipe.dataLayer.DataLayer;import pipe.dataLayer.PNMatrix;import pipe.dataLayer.Place;import pipe.dataLayer.PlaceTransitionObject;import pipe.dataLayer.Transition;import pipe.dataLayer.calculations.StateList;import pipe.dataLayer.calculations.TreeTooBigException;import pipe.dataLayer.calculations.myTree;import pipe.gui.CreateGui;import pipe.gui.widgets.ButtonBar;import pipe.gui.widgets.PetriNetChooserPanel;import pipe.gui.widgets.ResultsHTMLPane;import pipe.modules.Module;import pipe.modules.classification.Classification;/** * @author Matthew Cook * *  */public class GSPN extends Classification implements Module{		private static final String MODULE_NAME = "GSPN Analysis";	private PetriNetChooserPanel sourceFilePanel;	private ResultsHTMLPane results;  //######################################################################################################################		public void run(DataLayer pnmlData) {		// Build interface		JDialog guiDialog = new JDialog(CreateGui.getApp(),MODULE_NAME,true);				// 1 Set layout		Container contentPane=guiDialog.getContentPane();		contentPane.setLayout(new BoxLayout(contentPane,BoxLayout.PAGE_AXIS));				// 2 Add file browser		contentPane.add(sourceFilePanel=new PetriNetChooserPanel("Source net",pnmlData));				// 3 Add results pane		contentPane.add(results=new ResultsHTMLPane());				// 4 Add button		contentPane.add(new ButtonBar("Analyse GSPN",runAnalysis));		//contentPane.add(new ButtonBar("Play a tune!",playMidi));		// 5 Make window fit contents' preferred size		guiDialog.pack();				// 6 Move window to the middle of the screen		guiDialog.setLocationRelativeTo(null);				guiDialog.setVisible(true);	}//######################################################################################################################		/**	 * Analyse button click handler	 */	ActionListener runAnalysis=new ActionListener() {		public void actionPerformed(ActionEvent arg0) {			DataLayer sourceDataLayer=sourceFilePanel.getDataLayer();			String s="<h2>GSPN analysis results</h2>";			if(sourceDataLayer==null) return;			if (!hasTimedTransitions(sourceDataLayer)){				s+= "This Petri net has no timed transitions, so GSPN analysis cannot be performed.";							}			else if (!hasImmediateTransitions(sourceDataLayer)){				s+= "This Petri net has no immediate transitions, so GSPN analysis cannot be performed.";							}									else if (!testEqualConflict(sourceDataLayer)) {				s+= "Condition Equal Conflict is not satisfied.  GSPN analysis cannot continue.";							}						else {							//set up data for display				try {				StateList reachSet = getReachabilitySet(sourceDataLayer);				int reachSize = reachSet.size();				getTransitionProbabilityMatrix(sourceDataLayer, reachSet);				//int placeCount = sourceDataLayer.getPlaces().length;								StateList vanishing = new StateList();								StateList tangible = new StateList();				getVanishingAndTangible (sourceDataLayer, reachSet, vanishing, tangible);				if (tangible.size() == 0) {					s+= "This petri net has no tangible states.  GSPN analysis cannot continue";				}				else  if (vanishing.size() == 0) {					s+= "This petri net has no vanishing states.  GSPN analysis cannot continue";				}				else {					double[][] c = new double [vanishing.size()][vanishing.size()];					double[][] d = new double [vanishing.size()][tangible.size()];					double[][] e = new double [tangible.size()][vanishing.size()];					double[][] f = new double [tangible.size()][tangible.size()];					c = probabilityMatrix(sourceDataLayer, vanishing, vanishing);					d = probabilityMatrix(sourceDataLayer, vanishing, tangible);					e = probabilityMatrix(sourceDataLayer, tangible, vanishing);					f = probabilityMatrix(sourceDataLayer, tangible, tangible);					Matrix cM = new Matrix(c);					Matrix dM = new Matrix(d);					Matrix eM = new Matrix(e);					Matrix fM = new Matrix(f);					int cSize = cM.getColumnDimension();					Matrix iD = new Matrix (cSize, cSize);					for (int i = 0; i<cSize; i++){						for (int j = 0; j < cSize; j++){							if (i==j) iD.set(i,j,1.0);							else iD.set(i,j,0.0);						}					}					Matrix iMinusCInverse = new Matrix(cSize, cSize);					iMinusCInverse = iD.minus(cM);					iMinusCInverse = iMinusCInverse.inverse();					double[] sojournTimes = calcSojournTime(sourceDataLayer, tangible);					double[] embeddedMarkovChainDist = getEmbeddedMarkovChainSteadyStateDistribution(cM,dM,eM,fM);					Matrix meanVisits = calcMeanNumVisits(embeddedMarkovChainDist);					double xHat = xHat(sojournTimes, embeddedMarkovChainDist);					double[] meanCycleTimes = calcMeanCycleTimes(embeddedMarkovChainDist, xHat);					int meanCycleLength = meanCycleTimes.length;					double[] steadyStateDistribution = getSteadyStateDistribution(meanCycleTimes, sojournTimes);					double[][] rates = rateMatrix(sourceDataLayer, tangible, vanishing);					Matrix eTwiddle = new Matrix(rates);					Matrix eTwiddleIMinusCInverse = eTwiddle.times(iMinusCInverse);					Matrix steadyStateDistrib = new Matrix(1,meanCycleLength);					for (int i=0; i< meanCycleLength; i++) {						steadyStateDistrib.set(0,i,steadyStateDistribution[i]);					}					Matrix vanishingSteadyState = steadyStateDistrib.times(eTwiddleIMinusCInverse);					double[] throughput = getTransitionThroughput(sourceDataLayer ,vanishing, tangible, vanishingSteadyState, steadyStateDistribution);										s+=ResultsHTMLPane.makeTable(new String[]{							"Entire reachability set",							renderStateSpaceLinked(sourceDataLayer, reachSet)						},1,false,false,true,false);										s+=ResultsHTMLPane.makeTable(new String[]{							"Set of vanishing markings",							renderStateSpace(sourceDataLayer, vanishing)					},1, false,false,true,false);										s+=ResultsHTMLPane.makeTable(new String[]{							"Set of tangible markings",							renderStateSpace(sourceDataLayer, tangible)					},1, false,false,true,false);										s+=ResultsHTMLPane.makeTable(new String[]{							"Probability of transition between two vanishing states",							renderProbabilities(c, vanishing, vanishing)					},1,false,false,true,false);																s+=ResultsHTMLPane.makeTable(new String[]{							"Probability of transition from a vanishing state to a tangible state",							renderProbabilities(d, vanishing, tangible)					},1,false,false,true,false);										s+=ResultsHTMLPane.makeTable(new String[]{							"Probability of transition from a tangible state to a vanishing state",							renderProbabilities(e, tangible, vanishing)					},1,false,false,true,false);										s+=ResultsHTMLPane.makeTable(new String[]{							"Probability of transition from a tangible state to a tangible state",							renderProbabilities(f, tangible, tangible)					},1,false,false,true,false);										s+=ResultsHTMLPane.makeTable(new String[]{							"Steady state distribution  of the embedded Markov chain",							renderLists(embeddedMarkovChainDist, tangible)					},1,false,false,true,false);										s+=ResultsHTMLPane.makeTable(new String[]{							"Mean number of visits between tangible states",							renderProbabilities(meanVisits.getArrayCopy(), tangible, tangible)					},1,false,false,true,false);										s+=ResultsHTMLPane.makeTable(new String[]{							"Sojourn times for tangible states",							renderLists(sojournTimes, tangible)					},1,false,false,true,false);										s+=ResultsHTMLPane.makeTable(new String[]{							"Mean cycle times for tangible states",							renderLists(meanCycleTimes, tangible)					},1,false,false,true,false);										s+=ResultsHTMLPane.makeTable(new String[]{							"Steady state distribution for tangible states",							renderLists(steadyStateDistribution, tangible)					},1,false,false,true,false);													s+=ResultsHTMLPane.makeTable(new String[]{							"Throughput",							renderThroughput(sourceDataLayer, throughput)					},1,false,false,true,false);							}			} 	catch (TreeTooBigException e) {				s+= e.getMessage();				}			}			results.setText(s);		}											};	/*	ActionListener playMidi = new ActionListener() {		public void actionPerformed(ActionEvent arg0) {			// TODO Auto-generated method stub			AudioClip midi = new AudioClip(CreateGui.imgPath+"FANTASY.mid");		}			};	*///######################################################################################################################		//Format StateList data nicely.	private String renderStateSpace(DataLayer pnmldata, StateList data) {		if((data.size()==0)||(data.get(0).length==0)) return "n/a";		int markSize = data.get(0).length;		ArrayList result=new ArrayList();		// add headers to table		result.add("");		for (int i=0;i<markSize;i++) 			{result.add(pnmldata.getPlaces()[i].getName());			//result.add("<A NAME= 'M" + i + "'></A>");			}				for (int i=0; i<data.size(); i++) {			result.add(data.getID(i));			for (int j=0; j<markSize; j++)				result.add(Integer.toString(data.get(i)[j]));		}				return ResultsHTMLPane.makeTable(result.toArray(),markSize + 1,false,true,true,true);	}			//######################################################################################################################		//Format StateList data nicely.	private String renderStateSpaceLinked(DataLayer pnmldata, StateList data) {		if((data.size()==0)||(data.get(0).length==0)) return "n/a";		int markSize = data.get(0).length;		ArrayList result=new ArrayList();		// add headers to table		result.add("");		for (int i=0;i<markSize;i++) 		{result.add(pnmldata.getPlaces()[i].getName());		//result.add("<A NAME= 'M" + i + "'></A>");		}				for (int i=0; i<data.size(); i++) {			result.add(data.getID(i)+ "<A NAME= 'M" + i + "'></A>");			for (int j=0; j<markSize; j++)				result.add(Integer.toString(data.get(i)[j]));		}				return ResultsHTMLPane.makeTable(result.toArray(),markSize + 1,false,true,true,true);	}	//######################################################################################################################		//Format throughput data nicely.	private String renderThroughput(DataLayer pnmldata, double[] data) {		if((data.length)==0) return "n/a";		int transCount = data.length;		ArrayList result=new ArrayList();		// add headers to table		result.add("Transition");		result.add("Throughput");    DecimalFormat f=new DecimalFormat();    f.setMaximumFractionDigits(5);		for (int i=0;i<transCount;i++) {			result.add(pnmldata.getTransitions()[i].getName());			result.add(f.format(data[i]));		}				return ResultsHTMLPane.makeTable(result.toArray(),2,false,true,true,true);	}	//######################################################################################################################			//Format probability matrices nicely	private String renderProbabilities(double[][] probabilities, StateList list1, StateList list2) {		if((list1.size()==0)||(list2.get(0).length==0)) return "n/a";		int rows = list1.size();		int cols = list2.size();		ArrayList result=new ArrayList();		// add headers to table		result.add("");		for (int i=0;i<cols;i++) result.add("<A HREF='#M" + i + "'>" + list2.getID(i)+ "</A>");		    DecimalFormat f=new DecimalFormat();    f.setMaximumFractionDigits(5);		for (int i=0; i<rows; i++) {			result.add("<A HREF='#M" + i + "'>" + list1.getID(i)+ "</A>");			for (int j=0; j<cols; j++)				result.add(f.format(probabilities[i][j]));		}				return ResultsHTMLPane.makeTable(result.toArray(),cols + 1,false,true,true,true);	}	//######################################################################################################################			//Format lists of doubles nicely	private String renderLists(double[] data, StateList list) {		if((list.size()==0)) return "n/a";		int rows = list.size();				ArrayList result=new ArrayList();		// add headers to table		result.add("Marking");		result.add("Value");    DecimalFormat f=new DecimalFormat();    f.setMaximumFractionDigits(5);		for (int i=0; i<rows; i++) {			result.add("<A HREF='#" + list.getID(i) + "'>" + list.getID(i).toString().toUpperCase()+ "</A>");			result.add(f.format(data[i]));		}				return ResultsHTMLPane.makeTable(result.toArray(),2,false,true,true,true);	}	//######################################################################################################################	/**Qualitative analysis - see if the supplied GSPN is an EFC-GSPN.  This is a necessary precondition

⌨️ 快捷键说明

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