Actions

CoopNetBlue.java

From Santa Fe Institute Events Wiki

Revision as of 04:00, 16 June 2006 by Seoc (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Base model


/*
 * CoopNetBlue.java
 *
 * Created on January 22, 2005, 6:11 PM
 * Modified June 14, 2006 by Jack
 */

package CoopNetBlue;
import java.awt.Color;
import java.util.ArrayList;
import java.util.List;


import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import uchicago.src.sim.engine.BasicAction;
import uchicago.src.sim.engine.Schedule;
//import uchicago.src.sim.engine.SimModelImpl;
//import uchicago.src.sim.gui.DisplaySurface;
//import uchicago.src.sim.gui.Network2DDisplay;
import uchicago.src.sim.gui.OvalNetworkItem;
//import uchicago.src.sim.network.NetworkFactory;
//import uchicago.src.sim.network.NetworkRecorder;
//import uchicago.src.sim.network.Node;
//import uchicago.src.sim.util.Random;
import uchicago.src.sim.util.SimUtilities;
//import uchicago.src.sim.network.DefaultDrawableNode;
//import uchicago.src.sim.network.DefaultDrawableEdge;
//import uchicago.src.sim.gui.CircularGraphLayout;
//import uchicago.src.sim.gui.KamadaGraphLayout;
//import uchicago.src.sim.gui.AbstractGraphLayout;
//import uchicago.src.sim.space.Object2DGrid;
//import uchicago.src.sim.gui.Object2DDisplay;
import uchicago.src.sim.util.*;

import uchicago.src.sim.network.NetUtilities;


/**
 *
 * @author Jack Waddell
 */

public class CoopNetBlue extends ModelParameters{
    
    // model variables
    public int numAgents = 16;
    public ArrayList agentList = new ArrayList (numAgents);
    public int worldXSize = 400;
    public int worldYSize = 400;


    public Schedule schedule;   // Schedules Events
    public GameMaster gm;       // Runs the games
    
    // The P parameter for regular lattice -> small world rewiring   
    // Also used as the probability in the random network
    public double reconnectProb;

    // the connection radius of the regular lattice
    public int    connectRadius;

    // selects which network type to use in Network.java
    public int    netType;

    // Stores how frequently, in units of time steps, to update...
    public int updateInterval;          // The report file
    public int pajekUpdateInterval;     // The pajek files
    public int evolveUpdateInterval;    // The evolution of the net

    Network net;   // The network class
    
    // The following class performs calculations on the network
    NetUtilities netCalculator = new NetUtilities();


    /** Creates a new instance of CoopNetBlue */
    public CoopNetBlue() {
    }
	
    /////////////////////////////////////////////////
    // begin
    // builds model-required elements
    public void begin () {
        buildModel ();
        buildSchedule ();
    }

    
    ///////////////////////////////////////////////////////
    // addModelSpecificParameters
    // Maps the input parameters.
    public void addModelSpecificParameters () {
	parametersMap.put( "size", "numAgents");	
	parametersMap.put( "ui", "updateInterval");
	parametersMap.put( "rP", "reconnectProb");
	parametersMap.put( "cR", "connectRadius");
	parametersMap.put( "nT", "netType");
	parametersMap.put( "pUI", "pajekUpdateInterval");
	parametersMap.put( "nUI", "evolveUpdateInterval");
    }
    

    //////////////////////////////////////////////////////
    // getInitParam
    // Controls what appears the the GUI parameter panel
    public String[] getInitParam () {
	String[] params = { "numAgents", "connectRadius", 
			    "reconnectProb", "netType",  
			    // these are from the super class:
			    "rDebug", "seed"};
	return params;
    }
    
    //////////////////////////////////////////////////////////
    // getters and setters
    // ********************   Note   *************************
    // Specific format required if using inputted parameters
    //  (either through batch or gui)
    public int  getWorldXSize () {return worldXSize;}
    public void setWorldXSize (int size) {worldXSize = size;}
    public int  getWorldYSize () {return worldYSize;}
    public void setWorldYSize (int size) {worldYSize = size;}
   
    public int  getNumAgents() {return numAgents;}
    public void setNumAgents(int i) {
	numAgents = i; 
    }
    public double getReconnectProb() {return reconnectProb;}
    public void   setReconnectProb(double i) {reconnectProb = i;}
    public int  getConnectRadius() {return connectRadius;}
    public void setConnectRadius(int i) {connectRadius = i;}

    public void setNetType(int i) {netType = i;}
    public int  getNetType() {return netType;}

    public int    getUpdateInterval() {return updateInterval;}
    public void  setUpdateInterval(int i) {updateInterval = i;}
    public int    getPajekUpdateInterval() {return pajekUpdateInterval;}
    public void  setPajekUpdateInterval(int i) {pajekUpdateInterval = i;}

    public int getEvolveUpdateInterval() {return evolveUpdateInterval;}
    public void setEvolveUpdateInterval(int i) {evolveUpdateInterval = i;}
    
    //////////////////////////////////////////////////////////
    // buildModel
    // Does what it says
    public void buildModel(){
	if(rDebug > 0)
	    System.out.printf("Build Model Begin\n");
        
	// CALL FIRST -- defined in super class -- it starts RNG, etc
	buildModelStart();
	
	// setup the network class
        net = new Network(numAgents, connectRadius, reconnectProb);
        net.setModel(this);

	CustomNode.setModel(this);

	// have the network class build the network
        net.buildAdjacencyMatrix(netType);  // first build the adjacency matrix

	net.buildAgentList();		    // then the agent list
        agentList = net.getAgentList();
	
	// setup the gamemaster
	gm = new GameMaster(agentList);

	// prepare pajek file
       	net.startPajekFile(0);
	
        System.out.printf("Build Model End\n");
    }
    
    //////////////////////////////////////////////////////////
    // buildSchedule
    // Sets what is to happen, when.
    public void buildSchedule () {

	// schedule the current BatchModel's step() function
	// to execute every time step starting with time  step 0
	schedule.scheduleActionBeginning( 0, this, "step" );

	// Schedule to stop at a particular time, StopT.  Rem out
	// to run indefinitely
	schedule.scheduleActionAt(getStopT(), this, "processEndOfRun");

	// Only run every updateInterval steps
	schedule.scheduleActionAtInterval(updateInterval, new BasicAction() {
		public void execute() {
		    System.gc();         // garbage collect
		    stepReport();        // write step report
		}
	    }, Schedule.LAST);

	schedule.scheduleActionAtInterval(evolveUpdateInterval, new BasicAction() {
		public void execute() {
		    gm.evolveAgents();         // evolve agents    
		}
	    }, Schedule.LAST);

	// Only run every pajekUpdateInterval steps
	schedule.scheduleActionAtInterval(pajekUpdateInterval, new BasicAction() {
		public void execute() {
		    nextPajekNetwork();  // write pajek file and open new one
		}
      }, Schedule.LAST);
					  
	// Execute at step 1 only
	schedule.scheduleActionAt(1, new BasicAction() {
		public void execute() {
		    stepReport();
		    nextPajekNetwork();
		}
	    }, Schedule.LAST);
    }
    
    /////////////////////////////////////////////////////////////////////////
    // printProjectHelp
    // this could be filled in with some help to get from running with 
    // -help parameter
    public void printProjectHelp() {
	// print project help
	
	System.out.printf( "\n%s -- \n", getName() );
	
	System.out.printf( "\n **** Add more info here!! **** \n" );
	
	
	System.out.printf( "\n" );
	
	printParametersMap();
	
	System.exit( 0 );
	
    }
    
    
    
    ////////////////////////////////////////////////////////////////
    // stepNodes
    // Steps each node.
    // Current has nodes re-draw themselves based on Utility
    public void stepNodes(){
        CustomNode node;
	int maxUtility = 0;
        for(int i = 0; i < numAgents; i++){
            node = (CustomNode) agentList.get(i);
	    if (node.getUtility() > maxUtility)
		maxUtility = node.getUtility();
        }
	for(int i = 0; i < numAgents; i++){
            node = (CustomNode) agentList.get(i);
	    node.setNodeColorFromUtility(maxUtility);
        }
    }
    
    //////////////////////////////////////////////////////////////
    // Setup
    // Prepares the model, or resets it after the reset button is pressed
    // in GUI model
    public void setup () {
	if ( rDebug > 0 )
	    System.out.printf( "<== Model setup() done.\n" );
	// Clean up previous instances
	schedule = null;
	System.gc ();
	
	// Set default values
	// These are overwritten by inputted values, if any
	numAgents              = 64;
	updateInterval         = 1000;
	pajekUpdateInterval    = 5000;
	evolveUpdateInterval   = 10;
        worldXSize             = 400;
        worldYSize             = 400;

	netType = 0;
	connectRadius = 2;
	reconnectProb = 0.1;
	
        CustomNode.resetNextID();
        agentList = new ArrayList (numAgents);

        super.setup();	// Reads in input values
	schedule = new Schedule (1);
	
	// some post-load finishing touches
        startReportFile();
	
	// you probably don't want to remove any of the following
	// calls to process parameter changes and write the
	// initial state to the report file.
	// NB -> you might remove/add more agentChange processing
        applyAnyStoredChanges();
        //stepReport();
        //getPlaintextReportFile().flush();
    }
    
    
    /////////////////////////////////////////////////////////////
    // step
    // governs what happens at each step
    public void step(){
	gm.playAll();
	stepNodes();
    }
    

    /////////////////////////////////////////////////////////////
    // addAgent
    // Input: CustomNode agent
    // Output: none
    // Adds a new agent to the agent list
    public void addAgent(CustomNode agent){
	agentList.add(agent);
    }

    /////////////////////////////////////////////////////////////
    // delAgent
    // Input: CustomNode agent
    // Output: none
    // Deletes an agent from the agent list
    public void delAgent(CustomNode agent){
	agentList.remove(agentList.indexOf(agent));
	System.gc();
    }

    //////////////////////////////////////////////////////////////////////
    // calcAvgUtility()
    public double calcAvgUtility(){
	double sum = 0;
	for(int i = 0; i < numAgents; i++){
	    CustomNode node = (CustomNode) agentList.get(i);
	    sum += (double) node.getUtility();
	}
	return sum/(double) numAgents;
    }
    


    ///////////////////////////////////////////////////////////////////////
    // stepReport
    // each step write out:
    //   time  expectivity
    //
    // Note: update the writeHeaderCommentsToReportFile() to print
    //       lines of text describing the data written to the report file.
    
    public void stepReport () {
	String s;
	s = String.format("%f",
			  schedule.getCurrentTimeDouble());

	//writeLineToReportFile ( "<stepreport>" + s + "</stepreport>" );
	writeLineToPlaintextReportFile( s );
	// flush the buffers so the data is not lost in a "crash"
	//getReportFile().flush();
	getPlaintextReportFile().flush();
    }
    
    
    /////////////////////////////////////////////////////////////////////////
    // writeHeaderCommentsToReportFile
    // customize to match what you are writing to the report files in 
    // stepReport.
    
    public void writeHeaderCommentsToReportFile () {
	writeLineToReportFile( "<comment>" );
	writeLineToReportFile( "                        " );
	writeLineToReportFile( "  time    expectivity   " );
	writeLineToReportFile( "</comment>" );
	
	writeLineToPlaintextReportFile( " #time" );
    }
    
    public Schedule getSchedule () {
        return schedule;
    }
    
    public String getName () {
        return "Network";
    }
    
    public ArrayList<CustomNode> getAgentList() {return agentList;}
    
    public static void main (String[] args) {
        uchicago.src.sim.engine.SimInit init = new uchicago.src.sim.engine.SimInit ();
        CoopNetBlue model = new CoopNetBlue ();
        init.loadModel (model, null, false);
    }
    
    
    // The following are some debugging methods
    public static void printVector(double[] vector){
        System.out.printf("\n");
        for(int i = 0; i < vector.length; i++){
            System.out.printf("%f ", vector[i]);
        }
        System.out.printf("\n");
    }
    
    public static void printVector(int[] vector){
        System.out.printf("\n");
        for(int i = 0; i < vector.length; i++){
            System.out.printf("%d ", vector[i]);
        }
        System.out.printf("\n");
    }
    
    public void printAgentList(){
        System.out.printf("Printing agentList, size = %d\n", agentList.size());
        CustomNode node;
        CustomNode inode;
        for(int i = 0; i < (agentList.size()); i++){
	    node = (CustomNode) agentList.get(i);
	    ArrayList <CustomNode> outNodes = node.getToNodes();
	    System.out.printf("Node %d points to (%d objects): ", node.getID(),
			      outNodes.size());
	    for(int j = 0; j < (outNodes.size()); j++){
		inode = (CustomNode) outNodes.get(j);
		System.out.printf(" %d ", inode.getID());
	    }
	    System.out.printf("\n");
        }
        System.out.printf("\n");
    }
    
    
    /////////////////////////////////////////////////////////
    // nextPajekNetwork
    // closes the current pajek file and opens the new one.
    public void nextPajekNetwork(){
	net.writePajekNetwork(agentList);
	net.endPajekFile();
	net.startPajekFile((int) schedule.getCurrentTime()/pajekUpdateInterval + 1);
    }


    /////////////////////////////////////////////////////////////////////
    // processEndOfRun
    // ends process
    public void processEndOfRun ( ) {
	long finalStep = (long) schedule.getCurrentTime();
	if ( rDebug > 0 )  
	    System.out.printf("\n\n===== Model processEndOfRun =====\n\n" );
	applyAnyStoredChanges();
	stepReport();
	endReportFile(finalStep);
	net.writePajekNetwork(agentList);
	net.endPajekFile();
	this.fireStopSim();
    }   
}