001 import swarm.simtoolsgui.*;
002 import swarm.gui.*;
003 import swarm.space.*;
004 import swarm.activity.*;
005 import swarm.defobj.*;
006 import swarm.objectbase.*;
007 import swarm.*;
008 import swarm.analysis.*;
009 import java.util.*;
010
011
012 public class ObserverSwarm extends GUISwarmImpl{
013 public int graphInterval;
014
015 ActionGroup displayActions,statActions;
016 Schedule displaySchedule,statSchedule;
017 ModelSwarm modelSwarm;
018 Colormap colorMap;
019 ZoomRaster patternRaster;
020 Value2dDisplay patternDisplay;
021 EZGraph resultGraph;
022 EZBin clusterSizeHist;
023 LinkedList clusterSizeData;
024
025 public ObserverSwarm(Zone aZone){
026 super(aZone);
027 graphInterval=10;
028 }
029
030 public Object buildObjects(){
031 super.buildObjects();
032 Globals.env.createArchivedProbeDisplay (this, "observerSwarm");
033
034 resultGraph=new EZGraphImpl(
035 this,"Percolation Probability","points","P(points)","resultGraph");
036 try {
037 resultGraph.enableDestroyNotification$notificationMethod
038 (this, new Selector(getClass(),"_resultGraphDeath_",false));
039 resultGraph.createSequence$withFeedFrom$andSelector(
040 "P",this,new Selector(this.getClass(),"getPercolationProb", false));
041 resultGraph.createSequence$withFeedFrom$andSelector(
042 "cluster num / 0.15 N^2",this,new Selector(this.getClass(),"getRelativeClusterNum", false));
043 } catch (Exception e) {
044 System.err.println ("Exception: " + e.getMessage());
045 }
046
047 modelSwarm = (ModelSwarm)
048 Globals.env.lispAppArchiver.getWithZone$key(Globals.env.globalZone,"modelSwarm");
049 Globals.env.createArchivedProbeDisplay (modelSwarm,"modelSwarm");
050 if(modelSwarm==null){
051 System.out.println("Can't find the modelSwarm parameters.");
052 System.exit(1);
053 }
054 getControlPanel().setStateStopped();
055
056 modelSwarm.buildObjects();
057
058 clusterSizeData = new LinkedList ();
059 clusterSizeData.add (new Double(0));
060 EZBinC ezbinCreating = new EZBinCImpl (new EZBinImpl ());
061 ezbinCreating.createBegin (getZone());
062 ezbinCreating.setCollection (clusterSizeData);
063 Class memberClass= clusterSizeData.get (0).getClass ();
064 try{
065 ezbinCreating.setProbedSelector(new Selector (memberClass, "doubleValue", false));
066 } catch (Exception e) {
067 e.printStackTrace (System.err);
068 }
069 ezbinCreating.setTitle ("Histgram of Cluster Size");
070 ezbinCreating.setBinCount (10);
071 ezbinCreating.setLowerBound (0);
072 ezbinCreating.setUpperBound (modelSwarm.getWidth()*modelSwarm.getHeight()/200);
073 clusterSizeHist = (EZBin) ezbinCreating.createEnd ();
074
075 colorMap=new ColormapImpl(this);
076 colorMap.setColor$ToName((byte)0,"white");
077 colorMap.setColor$ToName((byte)1,"black");
078 colorMap.setColor$ToName((byte)2,"red");
079
080 patternRaster=new ZoomRasterImpl(this);
081 patternRaster.setColormap(colorMap);
082 patternRaster.setZoomFactor(1);
083 patternRaster.setWidth$Height(
084 modelSwarm.getWidth(),
085 modelSwarm.getHeight());
086 patternRaster.setWindowTitle("Generated Pattern");
087 patternRaster.pack();
088
089 patternDisplay=new Value2dDisplayImpl(
090 this,patternRaster,colorMap,modelSwarm.getPattern());
091
092 return this;
093 }
094
095 /**
096 * 浸透確率の問い合わせる。
097 */
098 public double getPercolationProb(){
099 return modelSwarm.getPattern().getPercolationProb();
100 }
101
102 /**
103 * クラスタ数の問い合わせ
104 */
105 public double getRelativeClusterNum(){
106 return modelSwarm.getPattern().getClusterNum()
107 /(0.15*modelSwarm.getHeight()*modelSwarm.getWidth());
108 }
109
110 /**
111 * 2つのスケジュールを用いる。ひとつは画面の更新、
112 * 統計データ(クラスタの判定も含む)の更新<BR>
113 * クラスタリングの計算は重いことが予想されるから、
114 * graphIntervalの間隔で行う(初期値は10だが、Probeから変更できる)。
115 */
116 public Object buildActions(){
117 super.buildActions();
118 modelSwarm.buildActions();
119
120 displayActions=new ActionGroupImpl(this);
121 try {
122 displayActions.createActionTo$message(patternDisplay,
123 new Selector(patternDisplay.getClass(),"display",false));
124 displayActions.createActionTo$message(patternRaster,
125 new Selector(patternRaster.getClass(),"drawSelf",false));
126 displayActions.createActionTo$message(getActionCache(),
127 new Selector(getActionCache().getClass(),"doTkEvents",true));
128 displayActions.createActionTo$message(this,
129 new Selector(getClass(),"checkToStop",false));
130 } catch (Exception e) {
131 System.out.println ("Exception: " + e.getMessage ());
132 System.exit(1);
133 }
134 displaySchedule = new ScheduleImpl(this,1);
135 displaySchedule.at$createAction(0,displayActions);
136
137 statActions=new ActionGroupImpl(this);
138 try {
139 statActions.createActionTo$message(this,new Selector(getClass(),"showStats",false));
140 statActions.createActionTo$message(this,new Selector(getClass(),"showHist",false));
141 statActions.createActionTo$message(getActionCache(),
142 new Selector(getActionCache().getClass(),"doTkEvents",true));
143 } catch (Exception e) {
144 System.out.println ("Exception: " + e.getMessage ());
145 System.exit(1);
146 }
147 statSchedule = new ScheduleImpl(this,graphInterval);
148 statSchedule.at$createAction(0,statActions);
149
150 return this;
151 }
152
153 public Activity activateIn(Swarm context){
154 super.activateIn(context);
155 modelSwarm.activateIn(this);
156 displaySchedule.activateIn(this);
157 statSchedule.activateIn(this);
158 return getActivity();
159 }
160
161 public Object _resultGraphDeath_(Object caller){
162 resultGraph.drop();
163 resultGraph = null;
164 return this;
165 }
166
167 /**
168 * 統計データ(クラスタリングも含む)の更新<BR>
169 */
170 public Object showStats(){
171 if(resultGraph!=null)
172 resultGraph.step();
173 return this;
174 }
175
176 /**
177 * ヒストグラムの更新
178 */
179 public Object showHist(){
180 //clusterSizeData=modelSwarm.getPattern().getClusterSizeData();
181 //これではうまくいかない。仕方なく、
182 updateClusterSizeData();
183 if(clusterSizeHist!=null){
184 clusterSizeHist.reset();
185 clusterSizeHist.update();
186 clusterSizeHist.output();
187 }
188 return this;
189 }
190
191 /**
192 * showHistの補助メソッド
193 */
194 void updateClusterSizeData(){
195 clusterSizeData.clear();
196 Iterator it=modelSwarm.getPattern().getClusterSizeData().iterator();
197 while(it.hasNext()){
198 clusterSizeData.add(new
199 Double(((Integer)it.next()).intValue() //このままだとすごく遅い
200 //同じ値のデータがたくさんあるとだめらしい
201 //Quick Sortしているわけでもないだろうに
202 //仕方ないから、少しノイズを加えておく
203 +Globals.env.uniformDblRand.getDoubleWithMin$withMax(0.0,0.01)));
204 }
205 }
206
207 /**
208 * 終了の判定<BR>
209 * ModelSwarmが停止していたら、最終処理をして停止。
210 */
211 public void checkToStop(){
212 if(modelSwarm.stopQ()){
213 showStats();
214 getActionCache().doTkEvents();
215 System.out.println("Simulation is over.");
216 getControlPanel().setStateStopped();
217 }
218 }
219 }