root/server/Detector.java

Revision 72, 3.7 kB (checked in by kbarnes3, 2 years ago)

Made the server into an Eclipse project and turned off the bit flipping
in the second octet.

Line 
1 import java.lang.Math;
2 import java.util.ArrayList;
3
4 public class Detector implements Runnable {
5         enum Mode {
6                 NORMAL,
7                 SUSPECT,
8                 FC
9         }
10        
11         private class PeriodInfo {
12                 int dx;
13                 int d2x;
14         }
15        
16
17         private Mode mode;
18
19         private int period;
20
21         private int step;
22        
23         private ArrayList<Integer> sessWindow = new ArrayList<Integer>();
24         private ArrayList<Integer> dxWindow = new ArrayList<Integer>();
25        
26         Detector(int period, int step) {
27                 this.period = period;
28                 this.step = step;
29        
30         }
31        
32         static double ema(double oldEma, double observation, double weight) {
33                 return ((1-weight) * oldEma) + (weight * observation);
34         }
35        
36         static double emsd(double oldEmsd, double ema, double observation, double weight) {
37                  return ((1 - weight) * Math.pow(oldEmsd, 2.0)) + (weight * Math.pow(observation - ema, 2.0));
38         }
39
40         public boolean isFlashcrowd() {
41                 synchronized(mode) {
42                         return (mode == Mode.FC);       
43                 }
44         }
45        
46         public boolean isSuspect() {
47                 synchronized(mode) {
48                         return (mode == Mode.SUSPECT); 
49                 }
50         }
51        
52         public void run() {
53
54                 double sessEma=0;
55                 double d2xEma=0;
56                 double d2xEmsd=0;
57                
58                 /* ramp up */
59         /*      int rampLength = 10;
60                 try {
61                         Thread.sleep(step * rampLength * 1000);
62                 } catch (InterruptedException e) {
63                 
64                         e.printStackTrace();
65                 }
66 */
67                 //double tOff;
68                 int dx=0, d2x=0;
69                 //int prevSess, prevDx;
70         
71                
72                 while(true) {
73                        
74                         long startTime = System.currentTimeMillis();
75                        
76                         int sess = WebServer.getSessionCount();
77                         double prevSessEma = sessEma;
78                         double prevD2xEma = d2xEma;
79                         double prevD2xEmsd = d2xEmsd;
80                        
81                        
82                         PeriodInfo info = insData(sess);
83                         dx = info.dx;
84                         d2x = info.d2x;
85                        
86                         if (mode != Mode.FC) {
87                                 sessEma = ema(sessEma, sess, 0.001);
88                                 d2xEma = ema(d2xEma, d2x, 0.005);
89                                 d2xEmsd = emsd(d2xEmsd, d2xEma, d2x, 0.005);
90                         } else {
91                                 if (sessWindow.isEmpty()) {
92                                         dx = sess;
93                                         d2x = 0;
94                                 } else {
95                                         dx = sess - sessWindow.get(0);
96                                         d2x = dx - dxWindow.get(0);
97                                 }
98                                
99                         }
100                        
101                         double tOn = calcTOn(prevSessEma, prevD2xEma, prevD2xEmsd);
102                                                
103                         if (mode == Mode.NORMAL) {
104                         if (d2x >= tOn) {
105                             mode = Mode.FC;
106                             d2xEma = prevD2xEma;
107                             d2xEmsd = prevD2xEmsd;
108                            
109                                         //tOff = prevSessEma;
110                         } else if (d2x >= tOn/2) {
111                                   mode = Mode.SUSPECT;
112                         }
113
114                         } else if (mode == Mode.SUSPECT) {
115                                 if (d2x >= tOn) {
116                                         mode = Mode.FC;
117                             d2xEma = prevD2xEma;
118                             d2xEmsd = prevD2xEmsd;
119                            
120                                         //tOff = prevSessEma;
121                             
122                         } else if (d2x < tOn/2) {
123                                   mode = Mode.NORMAL;
124                         }
125
126                         } else if (mode == Mode.FC) {
127                         if (sess <= sessEma) {
128                             mode = Mode.NORMAL;
129                    
130                         }
131                     }
132                         //prevDx = dx;
133                         //prevSess = sess;
134 //                      System.out.println(isFlashcrowd() + " " + myHits + " " + stEma + " " + ltEma + " " + ltEmsd);
135                         long delay = System.currentTimeMillis() - startTime;
136                         try {
137                                 Thread.sleep(step * 1000 - delay);
138                         } catch (InterruptedException e) {
139                                 // TODO Auto-generated catch block
140                                 e.printStackTrace();
141                         }
142        
143                 }
144         }
145        
146         private PeriodInfo insData(int mySess) {
147                 if (sessWindow.size() >= period/step) {
148                         sessWindow.remove(0);
149                         dxWindow.remove(0);             
150                 }
151                
152                 PeriodInfo info = new PeriodInfo();
153                 info.dx = mySess - sessWindow.get(0);
154                 info.d2x = info.dx - dxWindow.get(0);
155                
156                 sessWindow.add(mySess);
157                 dxWindow.add(info.dx);
158                
159                 return info;
160                  
161         }
162
163         private double calcTOn(double sessEma, double d2xEma, double d2xEmsd) {
164                         double ans;
165                     double mult = 12 - Math.log(sessEma)/Math.log(2.5);
166                     ans = d2xEma + mult * d2xEmsd;
167                     return ans;
168
169         }
170 }
Note: See TracBrowser for help on using the browser.