⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 datalayer.java

📁 Petri网分析工具PIPE is open-source
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
  	arcPoint.setAttribute("xCoord", x);
  	arcPoint.setAttribute("yCoord", y);
  	arcPoint.setAttribute("arcPointType", type);
  	
  	return arcPoint;
  }

  /**
   * Creates all Petri-Net Matrixes from current Petri-Net
   *
   */
  private void createMatrixes(){
    createFowardIncidenceMatrix();
    createBackwardsIncidenceMatrix();
    createIncidenceMatrix();
    createInitialMarkupMatrix();
    createCurrentMarkupMatrix();
  }

  /**
   * Creates Foward Incidence Matrix from current Petri-Net
   *
   */
  private void createFowardIncidenceMatrix(){//m
    int placeNo = 0, transitionNo = 0;
    int placeSize = placesArray.size();
    int transitionSize = transitionsArray.size();

    Arc arc = null;
    Place place = null;
    Transition transition = null;

    fowardsIncidenceMatrix = new PNMatrix(placeSize, transitionSize);

    fowardsIncidenceMatrix.setToZero();

    for(int i = 0 ; i < arcsArray.size() ; i++) {
      arc = (Arc)arcsArray.get(i);
      if(arc != null) {
        PetriNetObject pnObject = arc.getTarget();
        if(pnObject != null){
          if(pnObject instanceof Place) {
            place = (Place)pnObject;
            pnObject = arc.getSource();
            if(pnObject != null){
              if(pnObject instanceof Transition){
                transition = (Transition)pnObject;
                transitionNo = getListPosition(transition);
                placeNo = getListPosition(place);
                fowardsIncidenceMatrix.set(placeNo, transitionNo, arc.getWeight());
              }
            }
          }
        }
      }
    }
  }

  /**
   * Creates Backwards Incidence Matrix from current Petri-Net
   *
   */
  private void createBackwardsIncidenceMatrix(){//Matthew
    int placeNo = 0, transitionNo = 0;
    int placeSize = placesArray.size();
    int transitionSize = transitionsArray.size();

    Arc arc = null;
    Place place = null;
    Transition transition = null;

    backwardsIncidenceMatrix = new PNMatrix(placeSize, transitionSize);

    backwardsIncidenceMatrix.setToZero();

    for(int i = 0 ; i < arcsArray.size() ; i++) {
      arc = (Arc)arcsArray.get(i);
      if(arc != null) {
        PetriNetObject pnObject = arc.getSource();
        if(pnObject != null){
          if(pnObject instanceof Place) {
            place = (Place)pnObject;
            pnObject = arc.getTarget();
            if(pnObject != null){
              if(pnObject instanceof Transition){
                transition = (Transition)pnObject;
                transitionNo = getListPosition(transition);
                placeNo = getListPosition(place);
                backwardsIncidenceMatrix.set(placeNo, transitionNo, arc.getWeight());
              }
            }
          }
        }
      }
    }
  }

  /**
   * Creates Incidence Matrix from current Petri-Net
   *
   */
  private void createIncidenceMatrix(){
    createFowardIncidenceMatrix();
    createBackwardsIncidenceMatrix();
    incidenceMatrix = new PNMatrix(fowardsIncidenceMatrix.getArrayCopy());   
    incidenceMatrix = incidenceMatrix.minus(backwardsIncidenceMatrix);
  }

  /**
   * Creates Initial Markup Matrix from current Petri-Net
   *
   */
  private void createInitialMarkupMatrix(){
    int placeNo = 0;
    int placeSize = placesArray.size();
    initialMarkupMatrix = new int[placeSize];
    for( ; placeNo < placeSize ; placeNo++)
      initialMarkupMatrix[placeNo] = ((Place)placesArray.get(placeNo)).getInitialMarking();
  }

  /**
   * Creates Initial Markup Matrix from current Petri-Net
   *
   */
  private void createCurrentMarkupMatrix(){
    int placeNo = 0;
    int placeSize = placesArray.size();
    currentMarkupMatrix = new int[placeSize];
    for( ; placeNo < placeSize ; placeNo++)
      currentMarkupMatrix[placeNo] = ((Place)placesArray.get(placeNo)).getCurrentMarking();
  }

  /**
   * Stores Initial Markup Matrix from current Petri-Net Markup
   *
   */
  public void storeInitialMarking(){
    createMatrixes();
    int placeNo = 0;
    int placeSize = placesArray.size();
    initialMarkupMatrix = new int[placeSize];
    for( ; placeNo < placeSize ; placeNo++)
      initialMarkupMatrix[placeNo] = ((Place)placesArray.get(placeNo)).getCurrentMarking();
  }

  /**
   * Restores Initial Markup Matrix to current Petri-Net Markup
   *
   */
  public void restoreInitialMarking(){
    createMatrixes();
    int placeNo = 0;
    int placeSize = placesArray.size();
    for( ; placeNo < placeSize ; placeNo++) {
      Place place = ((Place)placesArray.get(placeNo));
      if(place != null) {
        place.setCurrentMarking(initialMarkupMatrix[placeNo]);
        setChanged();
        notifyObservers(place);
      }
    }
  }

  /**
   * Stores Current Markup
   *
   */
  public void storeState(){
    int placeNo = 0;
    int placeSize = placesArray.size();
    markupMatrixAnimationStorage = new int[placeSize];
    for( ; placeNo < placeSize ; placeNo++)
      markupMatrixAnimationStorage[placeNo] = ((Place)placesArray.get(placeNo)).getCurrentMarking();
  }

  /**
   * Restores To previous Stored Markup
   */
  public void restoreState(){
    if(markupMatrixAnimationStorage != null) {
      int placeNo = 0;
      int placeSize = placesArray.size();
      for( ; placeNo < placeSize ; placeNo++) {
        Place place = ((Place)placesArray.get(placeNo));
        if(place != null) {
          place.setCurrentMarking(markupMatrixAnimationStorage[placeNo]);
          setChanged();
          notifyObservers(place);
        }
      }
    }
  }

  /**
   * Fire a specified transition, no affect if transtions not enabled
   * @param transition Reference of specifiec Transition
   */
  public void fireTransition(Transition transition) {
    if(transition != null) {
      setEnabledTransitions();
      if(transition.isEnabled() && placesArray != null){
        int transitionNo = transitionsArray.indexOf(transition);
        for(int placeNo = 0 ; placeNo < placesArray.size() ; placeNo++) {
          ((Place)placesArray.get(placeNo)).setCurrentMarking((currentMarkupMatrix[placeNo] + incidenceMatrix.get(placeNo, transitionNo)));
        }
      }
    }
  }

  /**
   * Fire a specified transition, no affect if transtions not enabled
   * @param transitionNo Position of Transition in internal ArrayList
   */
  private void fireTransition(int transitionNo) {
    setEnabledTransitions();
    if(((Transition)transitionsArray.get(transitionNo)).isEnabled() && placesArray != null){
      for(int placeNo = 0 ; placeNo < placesArray.size() ; placeNo++) {
        ((Place)placesArray.get(placeNo)).setCurrentMarking((currentMarkupMatrix[placeNo] + incidenceMatrix.get(placeNo, transitionNo)));
      }
    }
  }

  /**
   * Fire a random transition, takes rate (probability) of Transitions into account
   */
  public Transition fireRandomTransition() {
    Transition result=null;
    setEnabledTransitions();
//    int transitionsSize = transitionsArray.size()*transitionsArray.size()*transitionsArray.size();
    int randomTransition = 0;
    int transitionNo = 0;
    double rate = 0;
    ArrayList enabledTransitions = new ArrayList();

    for(transitionNo = 0 ; transitionNo < transitionsArray.size() ; transitionNo++) {
      if(((Transition)transitionsArray.get(transitionNo)).isEnabled()) {
        rate = ((Transition)transitionsArray.get(transitionNo)).getRate();
        for(int i = 0 ; i < rate ; i++ ) {
          enabledTransitions.add(new Integer(transitionNo));
        }
      }
    }
    randomTransition = randomNumber.nextInt((enabledTransitions.size() > 0 ? enabledTransitions.size() : 1 ));
    if(randomTransition < enabledTransitions.size()) {
      if(enabledTransitions.get(randomTransition) != null) {
        int n=((Integer)enabledTransitions.get(randomTransition)).intValue();
        result=(Transition)(transitionsArray.get(n));
        fireTransition(n);
      }
    }
    resetEnabledTransitions();
    return result;
  }

  public void fireTransitionBackwards(Transition transition) {
    if(transition != null) {
      setEnabledTransitionsBackwards();
      if(transition.isEnabled() && placesArray != null){
        int transitionNo = transitionsArray.indexOf(transition);
        for(int placeNo = 0 ; placeNo < placesArray.size() ; placeNo++) {
          ((Place)placesArray.get(placeNo)).setCurrentMarking((currentMarkupMatrix[placeNo] - incidenceMatrix.get(placeNo, transitionNo)));
        }
      }
    }
  }

  private void fireTransitionBackwards(int transitionNo) {
    setEnabledTransitionsBackwards();
    if(((Transition)transitionsArray.get(transitionNo)).isEnabled() && placesArray != null){
      for(int placeNo = 0 ; placeNo < placesArray.size() ; placeNo++) {
        ((Place)placesArray.get(placeNo)).setCurrentMarking((currentMarkupMatrix[placeNo] - incidenceMatrix.get(placeNo, transitionNo)));
      }
    }
  }

  public void fireRandomTransitionBackwards() {
    setEnabledTransitionsBackwards();
    int transitionsSize = transitionsArray.size()*transitionsArray.size()*transitionsArray.size();
    int randonTransition = 0;
    do {
      randonTransition = randomNumber.nextInt(transitionsArray.size());
      transitionsSize--;
      if(transitionsSize <= 0) break;
    } while(!((Transition)transitionsArray.get(randonTransition)).isEnabled());
    fireTransitionBackwards(randonTransition);
//    System.out.println("Random Fired Transition Backwards" + ((Transition)transitionsArray.get(randonTransition)).getId());
  }

  /**
   * Determines whether all transitions are enabled and sets
   * the correct value of the enabled boolean
   */
  public void setEnabledTransitions() {
    createMatrixes();
    if(transitionsArray != null && placesArray != null) {
      for(int transitionNo = 0 ; transitionNo < transitionsArray.size() ; transitionNo++) {
        Transition transition = (Transition)transitionsArray.get(transitionNo);
        if(transition != null) {
          int test = placesArray.size();
          for(int placeNo = 0 ; placeNo < placesArray.size() ; placeNo++) {
            if(backwardsIncidenceMatrix.get(placeNo, transitionNo) <= currentMarkupMatrix[placeNo]) {
              test--;
            }
          }
          if(test <= 0) {
            transition.setEnabled(true);
            setChanged();
            notifyObservers(transition);
          } else {
            transition.setEnabled(false);
            setChanged();
            notifyObservers(transition);
          }
        }
      }
    }
  }

  public void resetEnabledTransitions() {
    createMatrixes();
    if(transitionsArray != null && placesArray != null) {
      for(int transitionNo = 0 ; transitionNo < transitionsArray.size() ; transitionNo++) {
        Transition transition = (Transition)transitionsArray.get(transitionNo);
        if(transition != null) {
          int test = placesArray.size();
          for(int placeNo = 0 ; placeNo < placesArray.size() ; placeNo++) {
            if(backwardsIncidenceMatrix.get(placeNo, transitionNo) <= currentMarkupMatrix[placeNo]) {
              test--;
            }
          }
          if(test <= 0) {
            transition.setEnabled(false);
          } else {
            transition.setEnabled(false);
          }
          setChanged();
          notifyObservers(transition);
        }
      }
    }
  }

  /**
   * Determines whether all transitions are enabled and sets
   * the correct value of the enabled boolean
   */
  public void setEnabledTransitionsBackwards() {

⌨️ 快捷键说明

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