📄 bankobserverswarm.m
字号:
#import "BankObserverSwarm.h"#import "BankModelSwarm.h"#import <collections.h>#import <objectbase.h>#import <gui.h>@implementation BankObserverSwarm// createBegin: here we set up the default observation parameters.+ createBegin: aZone{ BankObserverSwarm *obj; id <ProbeMap> probeMap; obj = [super createBegin: aZone]; obj->displayFrequency = 1; obj->interactiveGraph = 1; probeMap = [EmptyProbeMap createBegin: aZone]; [probeMap setProbedClass: [self class]]; probeMap = [probeMap createEnd]; [probeMap addProbe: [probeLibrary getProbeForVariable: "displayFrequency" inClass: [self class]]]; [probeMap addProbe: [probeLibrary getProbeForVariable: "interactiveGraph" inClass: [self class]]]; [probeMap addProbe: [[probeLibrary getProbeForMessage: "redistribute" inClass: [self class]] setHideResult: 1]]; [probeLibrary setProbeMap: probeMap For: [self class]]; return obj;}- createEnd{ return [super createEnd];}- _graphCanvasDeath_: caller{ [graphCanvas drop]; graphCanvas = nil; [bankModelSwarm setGraphCanvas: nil]; return self;}- _investorGraphDeath_ : caller{ [investorGraph drop]; investorGraph = nil; return self;}- buildObjects{ id modelZone; [super buildObjects]; modelZone = [Zone create: [self getZone]]; bankModelSwarm = [BankModelSwarm create: modelZone]; // Now create probe objects on the model and ourselves. This gives a // simple user interface to let the user change parameters. CREATE_ARCHIVED_PROBE_DISPLAY (bankModelSwarm); CREATE_ARCHIVED_PROBE_DISPLAY (self); [actionCache waitForControlEvent]; if ([controlPanel getState] == ControlStateQuit) return self; if (interactiveGraph) { graphCanvas = [Canvas createBegin: [self getZone]]; SET_WINDOW_GEOMETRY_RECORD_NAME (graphCanvas); graphCanvas = [graphCanvas createEnd]; [graphCanvas enableDestroyNotification: self notificationMethod: @selector(_graphCanvasDeath_:)]; [[graphCanvas setHeight: 500] setWidth: 500]; [graphCanvas setWindowTitle: "The Emergence Of Banking"]; [graphCanvas packFillLeft: 1]; GUI_UPDATE_IDLE_TASKS(); } [bankModelSwarm setGraphCanvas: graphCanvas]; [bankModelSwarm buildObjects]; activeBanks = [EZGraph createBegin: [self getZone]]; SET_WINDOW_GEOMETRY_RECORD_NAME (activeBanks); [activeBanks setTitle: "Active Banks"]; [activeBanks setAxisLabelsX: "Time" Y: "Banks"]; activeBanks = [activeBanks createEnd]; [activeBanks createTotalSequence: "Survivors" withFeedFrom: [bankModelSwarm getEntityList] andSelector: M(incident)]; investorGraph = [Graph createBegin: self]; SET_WINDOW_GEOMETRY_RECORD_NAME (investorGraph); investorGraph = [investorGraph createEnd]; [investorGraph setTitle: "Entropy of investor link distribution"]; [investorGraph setAxisLabelsX: "time" Y: "prop. of Max. Entropy"]; [investorGraph pack]; investorData = [investorGraph createElement]; [investorData setLabel: "H(investors)"]; investorEntropy = [Entropy createBegin: [self getZone]]; [investorEntropy setCollection: [bankModelSwarm getEntityList]]; [investorEntropy setProbedSelector: M(getInvestorLinkProbability)]; investorEntropy = [investorEntropy createEnd]; investorGrapher = [ActiveGraph createBegin: [self getZone]]; [investorGrapher setElement: investorData]; [investorGrapher setDataFeed: investorEntropy]; // chain them up [investorGrapher setProbedSelector: M(getEntropy)]; investorGrapher = [investorGrapher createEnd]; borrowerData = [investorGraph createElement]; [borrowerData setLabel: "H(borrowers)"]; borrowerEntropy = [Entropy createBegin: [self getZone]]; [borrowerEntropy setCollection: [bankModelSwarm getEntityList]]; [borrowerEntropy setProbedSelector: M(getBorrowLinkProbability)]; borrowerEntropy = [borrowerEntropy createEnd]; borrowerGrapher = [ActiveGraph createBegin: [self getZone]]; [borrowerGrapher setElement: borrowerData]; [borrowerGrapher setDataFeed: borrowerEntropy]; // chain them up [borrowerGrapher setProbedSelector: M(getEntropy)]; borrowerGrapher = [borrowerGrapher createEnd];/* colormap = [XColormap create: [self getZone]]; // Colours [0,64) are assigned to the range Red [0, 1), for heat display. for (i = 0; i < 64; i++) [colormap setColor: i ToRed: (double)i / 63.0 Green: 0 Blue: 0]; // Colour 64 is set to green, to display heatbugs [colormap setColor: 64 ToName: "green"]; // Colour 65 is set to white, used in this case below on probed heatbug. [colormap setColor: 65 ToName: "white"]; // Now go in to the heatbugs in the model and set their colours to green (64) [[heatbugModelSwarm getHeatbugList] forEach: M(setBugColor:) : (void *) 64]; // Next, create a 2d window for display, set its size, zoom factor, title. worldRaster = [ZoomRaster create: [self getZone]]; [worldRaster setColormap: colormap]; [worldRaster setZoomFactor: 4]; [worldRaster setWidth: [[heatbugModelSwarm getWorld] getSizeX] Height: [[heatbugModelSwarm getWorld] getSizeY]]; [worldRaster setWindowTitle: "Heat World"]; [worldRaster pack]; // draw the window. // Now create a Value2dDisplay: this is a special object that will // display arbitrary 2d value arrays on a given Raster widget. heatDisplay = [Value2dDisplay createBegin: [self getZone]]; [heatDisplay setDisplayWidget: worldRaster Colormap: colormap]; [heatDisplay setDiscrete2dToDisplay: [heatbugModelSwarm getHeat]]; [heatDisplay setDisplayMappingM: 512 C: 0]; // turn [0,32768) -> [0,64) heatDisplay = [heatDisplay createEnd]; // And also create an Object2dDisplay: this object draws heatbugs on // the worldRaster widget for us, and also receives probes. heatbugDisplay = [Object2dDisplay createBegin: [self getZone]]; [heatbugDisplay setDisplayWidget: worldRaster]; [heatbugDisplay setDiscrete2dToDisplay: [heatbugModelSwarm getWorld]]; [heatbugDisplay setObjectCollection: [heatbugModelSwarm getHeatbugList]]; [heatbugDisplay setDisplayMessage: M(drawSelfOn:)]; // draw method heatbugDisplay = [heatbugDisplay createEnd]; // Also, tell the world raster to send mouse clicks to the heatbugDisplay // this allows the user to right-click on the display to probe the bugs. [worldRaster setButton: ButtonRight Client: heatbugDisplay Message: M(makeProbeAtX:Y:)]; // Finally, we create a Probe display to probe a particular heatbug. // Probes can also be created on the fly, we just do this here for demo. heatbugToProbe = [[heatbugModelSwarm getHeatbugList] first]; [heatbugToProbe setBugColor: 65]; [probeDisplayManager createProbeDisplayFor: heatbugToProbe]; // All done - we're ready to build a schedule and go.*/ return self;} - redistribute{ [[bankModelSwarm getTheFNet] redistribute]; return self;}- buildActions{ [super buildActions]; [bankModelSwarm buildActions]; displayActions = [ActionGroup create: [self getZone]];/* // Schedule up the methods to draw the display of the world [displayActions createActionTo: heatDisplay message: M(display)]; [displayActions createActionTo: heatbugDisplay message: M(display)]; [displayActions createActionTo: worldRaster message: M(drawSelf)]; // Now schedule the update of the unhappiness graph // Schedule the update of the probe displays*/ [displayActions createActionTo: activeBanks message: M(step)]; [displayActions createActionTo: investorEntropy message: M(update)]; [displayActions createActionTo: investorGrapher message: M(step)]; [displayActions createActionTo: borrowerEntropy message: M(update)]; [displayActions createActionTo: borrowerGrapher message: M(step)]; [displayActions createActionTo: probeDisplayManager message: M(update)]; [displayActions createActionTo: actionCache message: M(doTkEvents)]; displaySchedule = [Schedule createBegin: [self getZone]]; [displaySchedule setRepeatInterval: displayFrequency]; displaySchedule = [displaySchedule createEnd]; [displaySchedule at: 0 createAction: displayActions]; return self;} - activateIn: swarmContext{ [super activateIn: swarmContext]; [bankModelSwarm activateIn: self]; [displaySchedule activateIn: self]; return [self getActivity];}// You could override the "go" method here if you want something special// to happen when the model and observer actually start running. But// the default GUISwarm go is probably good enough.@end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -