001    /**
002     * Created by IntelliJ IDEA.
003     * User: Wei Wang
004     * Date: Nov 27, 2002
005     * Time: 10:19:18 PM
006     */
007    
008    package EVolve.util.painters;
009    
010    import java.awt.Color;
011    import java.util.HashMap;
012    
013    import EVolve.Scene;
014    import EVolve.data.Entity;
015    import EVolve.visualization.AutoImage;
016    import EVolve.visualization.Predictor;
017    
018    public class PredictionPainter extends Painter{
019        protected Color colorRed = new Color(255, 0, 0);
020        protected Color colorBlue = new Color(120, 160, 255);
021        protected Predictor[] predictor; // predictors
022        protected int[] miss;
023        protected HashMap targetCheckMap;
024        protected int targetType;
025        private boolean furtherCheckNeeded = true;
026    
027        public PredictionPainter() {
028            targetCheckMap = new HashMap();
029        }
030    
031        public PredictionPainter(Predictor[] predictor, int targetType) {
032            this.predictor = predictor;
033            targetCheckMap = new HashMap();
034            this.targetType = targetType;
035            miss = new int[predictor.length];
036            for (int i = 0; i < predictor.length; i++) {
037                miss[i] = 0;
038            }
039        }
040    
041        public String getName() {
042            return "Prediction Painter";
043        }
044    
045        public void paint(AutoImage image, long x, long y, long z) {
046            predictor[(int)y].newTarget(z);
047    
048            if (validateTarget(y,z)) {
049                if (predictor[(int)y].isCorrect()) {
050                    if (image.getColor((int)x,(int)y) == null) {
051                        image.setColor((int)x,(int)y, colorBlue);
052                    }
053                } else {
054                    image.setColor((int)x, (int)y, colorRed);
055                    miss[(int)y]++;
056                }
057            } else {
058                if (image.getColor((int)x, (int)y) == null) {
059                    image.setColor((int)x, (int)y, colorBlue);
060                }
061            }
062        }
063    
064        public int[] getMiss() {
065            return miss;
066        }
067    
068        public void setPredictor(Predictor[] predictor, int targetType) {
069            this.predictor = predictor;
070            this.targetType = targetType;
071            miss = new int[predictor.length];
072            for (int i = 0; i < predictor.length; i++) {
073                miss[i] = 0;
074            }
075        }
076    
077        protected boolean validateTarget(long y, long z) {
078            String newTarget = null;
079            if (furtherCheckNeeded) {
080                newTarget = ((Entity)Scene.getDataManager().getEntity()[targetType].get(new Long(z))).getName();
081                if ((newTarget.indexOf('(') == -1) || // not a method
082                    (newTarget.indexOf('#') != -1) /*a location*/) {
083                    furtherCheckNeeded = false;
084                    return true;
085                }
086                String oldTarget = (String)targetCheckMap.get(new Long(y));
087                int index1 = newTarget.indexOf('(');
088                index1 = newTarget.substring(0,index1).lastIndexOf('.');
089                newTarget = newTarget.substring(index1+1);
090                targetCheckMap.put(new Long(y),newTarget);
091                if ((oldTarget!=null)&&(!oldTarget.equals(newTarget)))
092                    return false;
093            }
094            return true;
095        }
096    
097        public Object clone() {
098            PredictionPainter o = (PredictionPainter)super.clone();
099            o.colorRed = new Color(255,0,0);
100            o.colorBlue = new Color(120,160,255);
101            o.predictor = (predictor == null) ?  null : new Predictor[predictor.length];
102            o.miss = null;
103            if (miss != null) {
104                o.miss = new int[miss.length];
105                for (int i=0; i<miss.length; i++)
106                    o.miss[i] = miss[i];
107            }
108            return o;
109        }
110    }