2003-01-07    <pauljohn@46.81.cm.sunflower.com>

	* Dancer.m ([Dancer -planStep:stepNumber:Rep:rep]): Found a big
	dynamic scheduling mistake that was causing repeat steps to build
	up in the schedule. The problem was that this command:
	 [modelSwarm scheduleStepAt: timeNow+(duration[nextStep]*nextReps)
	For: self]; was being called for each move in planStep:Dir:Rep:
	EVEN IF the agent did not end up using that step.  *([Dancer
	-updateTime]): Part of previous bug. Time was being updated at top
	of step method, even if the move did not end up in use because of
	collision avoidance. So a separate method updateTime is needed to
	make sure the agent does not update its sense of time except when
	it is actually initiating a step. An IVAR "internalTime" is used
	to keep track. That represents the "time when the currentStep was
	initiated"

	
2003-01-06    <pauljohn@46.81.cm.sunflower.com>

	* Dancer.m ([Dancer -Setmodelswarm:]): new method to get ID number.
	User for error checking in the "checkOpenSpaceXY" method.
	([Dancer -createEnd]): override createEnd method in order to set
	values of various variables.
	([Dancer +createBegin:]): override to create probes for dancers,
	ease interaction with them through the interface.
	
	([Dancer -step]): movedAlready is an IVAR, which gets set to NO at
	the end of the step method.  If the user uses the GUI interface to
	change the plannedStep, then movedAlready changes to a YES and so
	when the simulation starts up again, that dancer is skipped in the
	next run through.
	
	* ModelSwarm.m: buildObjects now creates an output file
	and supplies a name.

	* ModelSwarm.h: output file defined

	* ModelSwarm.m ([ModelSwarm -writeReportDataHeader]): writes
	variable lsit to the output file
	([ModelSwarm -writeReportData]): write out a line showing positions
	and other information for each agent

	* ObserverSwarm.m ([ObserverSwarm -checkToStop]): fiddled canvas
	creation to make dancers "look right" within it. Now the displayed
	canvas is deep enough so dancers always are in it and wide enough
	to have off stage on both sides, where 1/2 of a dancer is
	displayed.

	* Dancer.m ([Dancer -chooseNextStep:aStep]): new method to select
	dance step.
	([Dancer -chooseNextDirection:aStep]): choose a direction, given a
	new step.
	([Dancer -chooseNextReps:aStep]): choose number of times to repeat
	that new step.
	([Dancer -alter8DirectionsX: Y: Dir: Rep: hh). For steps that can
	go all 8 directions, this calculates the new change of position an
	passes back by reference in the first 2 variables.
	([Dancer -randInt:n]): Convenient to get random integer between 0
	and n
	([Dancer -planMoveX:xx:]): renamed old moveXY: method. This one
	plans the move and only executes it if nobody else is already
	planning to go there.
	([Dancer -checkOpenSpaceX:xx:yy]): this cycles through the list
	of other dancers and if it finds one at the plannedX and plannedY
	positions, then it reports back a NO. Otherwise YES.

2003-01-02    <pauljohn@46.81.cm.sunflower.com>

	* Dancer.m ([Dancer -step:stepNumber:Rep:rep]): Add number of
	repetitions as an argument for dance steps.  Sometimes it is
	necessary to say "do three pirouettes" or "run 5 units worth".

	* ModelSwarm.h (STAGEDEPTH): introduce macro variables STAGEWIDTH,
	STAGEHEIGHT, ZOOMFACTORX, ZOOMFACTORY.

	* ObserverSwarm.m ([ObserverSwarm -checkToStop]): introduce
	ZOOMFACTORX and ZOOMFACTORY to control the scaling of the
	displayed canvas.  Now agents move "1 step" but on the canvas they
	move 1*ZOOMFACTOR pixels.

	* Dancer.m ([Dancer -changeLabel:str]): change label to a given
	string. Needed because we need to update both the nodeItem's label
	and also the DiGraphNode's label ivar. 

2003-01-01    <pauljohn@46.81.cm.sunflower.com>

	* ModelSwarm.m ([ModelSwarm -hideDiGraph]): GUI access to hide the
	DiGraph's display of the canvas
	([ModelSwarm -showDiGraph]): GUI access to show updated canvas
	using coordinates from objects.

	* DiGraph.m ([DiGraph -showCanvasUseNodeInfo:]): New method that
	shows canvas, after grabbing coordinates from objects.  The old
	showCanvas method uses random positions to show objects.

2002-12-31    <pauljohn@46.81.cm.sunflower.com>

	* ModelSwarm.m ([ModelSwarm -buildObjects]): note we specify
	starting conditions for dancers now.

	* DiGraphNode.m ([DiGraphNode -setCanvas:atX:Y:]): New method that
	can control where the Node is created and put into the canvas. The
	addNode:atX:Y: method in DiGraph.m does not do any work. It just
	tells this method to do the work of creating a node and passing it
	back.

	* DiGraph.m ([DiGraph -addNode:atX:x:y]): new method needed if you
	want to specify where a node is added. I don't understand why the
	designers of this library did not do that before. I don't want
	random positions.

2002-12-30    <pauljohn@46.81.cm.sunflower.com>

	* ModelSwarm.m ([ModelSwarm -getTime]): new method to return Time to other
	agents that want time. Use ivar currentTime to keep track.

	* Dancer.m ([Dancer -setModelSwarm:]): This method lets the Dancer
	know where the model is, so it can ask what time it or schedule
	actions at future times.

	* ObserverSwarm.m ([ObserverSwarm -checkToStop]): Apparently the
	Canvas is not created correctly unless this syntax is used:
	[graphCanvas packFillLeft: YES]; It is that way in the original
	Dynamic Graph and it fixes many problems I'm seeing with agent
	placement.

	* ModelSwarm.m: step method now just steps through the list of
	graph objects (dancers)
	
	* Dancer.m: New class, Dancer, subclassed from DiGraphNode.

	* ObserverSwarm.h ([-boingDistribute]): add ivar experimentDuration.

	* ObserverSwarm.m ([ObserverSwarm -checkToStop]): added method,
	schedueled it to stop sim after "experimentDuration" steps.

