From 2fddf87e8742d303cf28e54c17e0e75c5599302c Mon Sep 17 00:00:00 2001
From: "Anmulwar, Sweta V (PG/R - Elec Electronic Eng)" <sa02405@surrey.ac.uk>
Date: Sun, 19 Mar 2023 13:17:50 +0000
Subject: [PATCH] FPS to be set by user

---
 .vs/QLearningApp/v16/.suo                     | Bin 94208 -> 96256 bytes
 .../MachineLearning/Models/QLearning.cs       |  40 ++++++++++++------
 QLearningApp/Program.cs                       |  11 +++--
 QLearningApp/RLsync.cs                        |  21 ++++++---
 QLearningApp/bin/Debug/QLearningApp.exe       | Bin 11776 -> 12800 bytes
 QLearningApp/bin/Debug/QLearningApp.pdb       | Bin 44544 -> 44544 bytes
 ...QLearningApp.csprojAssemblyReference.cache | Bin 1887 -> 424 bytes
 QLearningApp/obj/Debug/QLearningApp.exe       | Bin 11776 -> 12800 bytes
 QLearningApp/obj/Debug/QLearningApp.pdb       | Bin 44544 -> 44544 bytes
 9 files changed, 47 insertions(+), 25 deletions(-)

diff --git a/.vs/QLearningApp/v16/.suo b/.vs/QLearningApp/v16/.suo
index c11f9588c5155375b9b6326e09a8499ec865b4e8..2c923d19ec055f7212ed0a292944aa1c237b41c9 100644
GIT binary patch
delta 6119
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

delta 5050
zcmd^D3s98T75>l9E-bK%tnw<tvb<jlEGrmPgykWwLWD)4j1Lfysu2(o98rW-j1M#@
zdox~5Y+8vyJ9d2VQ)n79V$}|#(~x93nTa;3PG=g^nYPBEGh(guoS$9Um_D3lGRaIY
z^X<9!p8MZ>&-u@H?)|adSK96<k7W9L34-8;crr0DfkLi_UbOxlK+D3#FrPcOcGbS~
z(kHMGb;B>Q?cySq=avd)_BXLpG$`42k9Kjun>}*VX=dXPoMj>xWn_;vTX`NUgFV(6
z^OGH#2$Tv$6e7{lmxEG;NI=9Q!Vq&2G!vDd_E^KTo-Q5KS%9-f=Q%p#Q7%BlAhHo;
zN<K;p;vfqTTMnH))_r!d2-LDk_t&QESiAfa(4k&7X}gO#Zj<JCMAXhe^-Kh<=Z#W{
z&>(ye(-8p(+PE*m51~c`Awm#Zgg+t>@djcLL0g=L_y^9XM@de3nd~rNg%+VgULZ+c
zAen?R1<}FY(alVH!O@$6at>miqn(LzJ|YWYM$nU$Oq&?U@B6@7*5(=KOHSE{syakH
zf(>}avEPM-DC4kUV<&Ypn6H-ta+tr@AAGZ6(u?#^F4mdKyR2vJDZAS5zYOrPsK_m}
zKC{k=V$D7!YVz4E*UmBQBxjLBr$$b*G4pMOO2keocAq?rfJ@7+bdHjmeQZF(q=#BB
zk%>i3aEP@;ELBkiI|te4D%it_n=CJQK0BrJWxhIJ6~zx3!{T&p3i7dZM%M<GF037N
zs7T$7^}~oGh#rI;!4R(@jw6mDIN}(B#=q{6Qk`B8L0@1?fm{9~%Fi7ddC^nhRu60w
zzu4n&i<&6lx??ybwL~ldb~R!((+8j7m0Q7|Rm=%QOQeUvDzHbPFMfaz5r3R!vgW8_
z4N&Ymqkudv8y|(nyQQ+RXp<BZ&<iReh4V4xJ#47hcx<7X_B7i?B{j#DfSO{7Ligzd
zH?VP<jjt<KMZ0vf=ByGm#bKmt=UCPrc%QXq7plXtn?lq%jrs~Uh@n*MxmPuih83cq
zbHrO?xuTNDlEB9EZ>otNL@lS<>s4%QmBWKQNn9XX*u3lmHR<&(<5+W&&6{>QK)XYa
zPo%eim(<cU3W`u{KlQHETu==1G)7SYA<}rt4bT8FlvwLrR!J)cv2kk$SXgUmp@OLX
zbPn0wrG@OOn97=$9%4-i)7hPRcPS|C9=JdGI5F9+j(wQ!FU?Fi2KwED+5orMkY615
zEOx}=H_%k}8||`yxcrg9&<C9!@Z|*>$?hcv*@H$@3thIr#)3xK)rG0*1sGhnP(h`C
zaUSlL5(4EL=Wb~~+Y0x4?!vy^2;O5|nnaOH11N$>o<R8{#E%{ApP)R6=tTtgSc~my
z#SrEVU+8J{>t9g>Nw2<_-SuwyvfsaUHY+!6e`n0uj>o&ZvA(~t1VYDa%~UV0*id_M
zSLyX0*1B?EuUUj#2CK3IamT`f7YoYf4C{&qb?M`$e|caJcCqnO(NgBBJz&@Azk700
zb|-QYS?$5sWPZ9+9~K9xz5x%_n{ldA1eM+ju|H(w8&Xm&Q*v@be8puDz^co2?6}3-
z%aCSjE2yg5Qd`H)TTHwo1$OmY6kuO(`9|!Gx`L}Y*=uwuJKKx~<J5|A@id4yM8|-&
zsJ5!9VMD{ZoW{mgrA1p>8)}kkw&;XU@f50MJ^KPB+Y%f6%VZ#p<*K2#T466Yv)Of-
ziZqkKB-zSs(7VUIw_EJByW8`}<ZKZyXA62&uGzwSDq9Gws-aW*wbZV(8}ik}82NoW
z-YxsLIb;!zbmoxM1KCp6o4@j~&u*4;$w6TKho`d(QUE(~Hl+WROJFa^|5|#%Y)bp0
zOhytzDGox|c;M*Q=&b=-&6UYtA$#v)vEO+0KV+vFizic%Uzuw0)M`;|%&$aIh#gN8
z7Hjq|V-`1qvJ9E|_H(AS|1AkTX9nnPSIaL{$8z6zAe}o{s_3_`pC<k6QW>z})#m;O
zW$udllBP}U*saECEnCnSysuczfG_b&)_yrelfR*+dBdiLs;1U8rj?R;d{|_L+x{&6
zcAzYcqQ{WM7v^est_HIBa43AFqyPn0vLaAR`H4VB@&!a5zpR6JentmDiaURqnBbcu
zA%L5gLku^Efgkg!4Z;I}&H%c>kfduOI@lHlsbMseODV=#X(@RLz*EF{KFG~|Qu6EJ
z5Wz3&p@P>(LNKq4fQTV%j)>x3;8hV&;awwa!mC<6{x)!%9zyxPNVuy_5{!<&$(q1Z
zq9Bl$M1h|lUIl9K^1MoD5w-}mLKFV3Iz1c(;%Rd%05eqw^CdB$=Z|6_6VLd0LK^OE
zhme52Br_DkIljpX>4WhwEOKo%EaD%pfm9fw-X5M}0uBEn4i~$h1b#d{2}a>OsoMF9
zYA{Vh>%r-P4Q6?&dQfmkfo#qD4p(>zUcyE;A5&A~3*gCbt%ew%oo(qEhFKYtS>%AM
z>?nijeMSI&eGTM-2mdq~BKxe^#yz~QN_P&W6!+H@aOdV(FbpCRESqmOK`l?74SAG-
zo)&6&BJ$;JwUb@*_=nYCl=lG%Tw4WmcxM$pMw#DPg0Vu^^ZY40$Gn_MeCw$zp_Sb@
zr<0Ceco_^ta%Xu3N6}4xFUoz0{fGmIE(D!3+~5O-aJop+6LgUz`KCisoyuGIeZXx#
zpwPaJnm)v7#2G{!JE;#0rz4%h_9CJmAt443KS$8spIoeph5r5lFK+XKY98PQfBIHP
zr2(_M%!v6zl{Ih;Omu~sEXLs$tjt9aW9ZuZw5-5d3_@1$$Dwfad%#S8H;iF+#iHjJ
zgrSrd1iq^ZGPBD^9dEvj`s5Nb{6my<iG9|#Nev}*r-ol%j2}<ta<jkl_}tlMG8yJf
z#`0b~t`p%X%Sq_y(}Q?)3B>Wc8Q`yYv8u*@C}%w^RC2K#T8AJ4_JT7-gt(*#Wc@tB
zDik5_tC0DEH_urD(ac<tHFT#O?kaf4GNf;1Jm|Qg5_X3)2pfb3VI4kZ6{6p5?;cwD
zXlwVT%8lM>4IaF!5~9>iI8i-*rq*B@;ZO*rnpC67Fw5n*cVV%1XWJ~J!DLFEw5P$N
ziRG{qX0GoGPEPGIU)eKy+&o>^Ju9*Jw-%H2qpr*_%Z?1bEfVg38yPMB|1zW951{`$
zOcvi^;=cjmn!Bd-sG!Jn@OAEU@m2T=Vex4?I=>sLaN9aK^DIM#kRg|q-^W1jtH9&e
zR<~I{o?nm=`6Q~P?eovB-MnOYFQn>--|Yu~R;F*;d-(W?>|*)`<m<QMf2xv2AKzzr
J$v#+V{3oNZ)vN#j

diff --git a/QLearningApp/MachineLearning/Models/QLearning.cs b/QLearningApp/MachineLearning/Models/QLearning.cs
index 2939919..852a0c8 100644
--- a/QLearningApp/MachineLearning/Models/QLearning.cs
+++ b/QLearningApp/MachineLearning/Models/QLearning.cs
@@ -17,18 +17,23 @@ namespace QLearningApp.MachineLearning
 
         private RLSync _qLearningProblem;
 
-        public QLearning(double gamma, RLSync qLearningProblem)
+        public QLearning(double gamma, RLSync qLearningProblem, double TargetFPS)
         {
             _qLearningProblem = qLearningProblem;
             _gamma = gamma; // discount factor 
             _qTable = new double[qLearningProblem.NumberOfStates][];
+            /* Need to convert it in the 3-D array */
             for (int i = 0; i < qLearningProblem.NumberOfStates; i++)
                 _qTable[i] = new double[qLearningProblem.NumberOfActions];
             for (int i = 0; i < qLearningProblem.NumberOfStates; i++)
             {
                 for (int j = 0; j < qLearningProblem.NumberOfActions; j++)
-                         _qTable[i][j] = 0;
+                    _qTable[i][j] = 0;
             }
+            qLearningProblem.Target_fps = TargetFPS;
+            /*I can add PE and APL here*/
+            Console.WriteLine("In QLearning, qLearningProblem.Target_fps = TargetFPS"+TargetFPS);
+
         }
 
         public void TrainAgent(int numberOfIterations)
@@ -40,7 +45,7 @@ namespace QLearningApp.MachineLearning
             }
         }
 
-        public QLearningStats Run(int initialStateIndex)
+        public QLearningStats Run(int initialStateIndex)//returning an object
         {
             if (initialStateIndex < 0 || initialStateIndex > _qLearningProblem.NumberOfStates) throw new ArgumentException($"The initial state can be between [0-{_qLearningProblem.NumberOfStates}", nameof(initialStateIndex));
 
@@ -58,21 +63,23 @@ namespace QLearningApp.MachineLearning
                 int actionIndex = _qTable[stateIndex].ToList().IndexOf(_qTable[stateIndex].Max());
                 //state = action;
                 double state = _qLearningProblem.SimulatedFPSValues(actionIndex, 4);
-                
+
                 double statefps_space = _qLearningProblem.fps_space.OrderBy(x => Math.Abs((long)x - state)).First();
                 stateIndex = _qLearningProblem.fps_spaceIndex(statefps_space);
                 double gamma_action = _qLearningProblem.gamma_space[actionIndex];
-                Console.WriteLine("Current state: " + prev_state + ", Action: " + gamma_action + ", Next state: " + state);
+                Console.WriteLine("Current FPS state: " + prev_state + ", Action: " + gamma_action + ", Next FPS state: " + state);
                 prev_state = state;
                 actions.Add(gamma_action);
                 stateFPS.Add(state);
-                /*if (_qLearningProblem.GoalStateIsReached(action))
+                /* Newly added code to make it finite loop */
+                if (_qLearningProblem.GoalStateIsReached(state))
                 {
-                    result.EndState = action;
+                    result.EndState = state;
+                    //need to write code here to end a timer
                     break;
-                }*/
-                if (counter == 50)
-                { break; }
+                }
+                /*if (counter == 50)
+                { break; }*/
             }
             result.Actions = actions.ToArray();
             return result;
@@ -81,14 +88,18 @@ namespace QLearningApp.MachineLearning
         private void InitializeEpisode(double initialState)
         {
             //int currentStateIndex = _qLearningProblem.fps_spaceIndex(initialState);
+
+            //Console.WriteLine("Enter targetted FPS value ={0}",targetFPS);
             double currentState = initialState;//FPS value
             int counter = 0;
             while (true)
             {
                 currentState = TakeAction(currentState);//currentState= FPS, return should be FPS value
                 counter++;
-                if (counter == 500)
-                    break;//will run 500 times
+                /*if (counter == 500)
+                    break;//will run 500 times*/
+                if (_qLearningProblem.GoalStateIsReached(currentState))
+                    break;
             }
         }
 
@@ -98,14 +109,14 @@ namespace QLearningApp.MachineLearning
             int randomIndexActionGamma = _random.Next(0, _qLearningProblem.NumberOfActions);
             //int randomIndexActionDelta = _random.Next(0, _qLearningProblem.NumberOfActions);//choosing a random action from number of actions defined
             double gamma_action = _qLearningProblem.gamma_space[randomIndexActionGamma];//retrieving gamma value form randomIndexAction
-           // double delta_action = _qLearningProblem.delta_space[randomIndexActionGamma];
+                                                                                        // double delta_action = _qLearningProblem.delta_space[randomIndexActionGamma];
             double delta_action = 20; //fixed for now, can be changed in the future
             int delta_actionIndex = 0;
             double rho = 0.4;
 
             double saReward = _qLearningProblem.GetReward(currentState, gamma_action, delta_action);
             // Use rho to have a slowly & smoothly changing FPS value after an action is taken
-            double nextState = rho * currentState + (1-rho) * _qLearningProblem.SimulatedFPSValues(randomIndexActionGamma, delta_actionIndex); // FPS for time t+1, delta_actionIndex changes to 4 in the RLSync as it is hardcoded
+            double nextState = rho * currentState + (1 - rho) * _qLearningProblem.SimulatedFPSValues(randomIndexActionGamma, delta_actionIndex); // FPS for time t+1, delta_actionIndex changes to 4 in the RLSync as it is hardcoded
             double nextStatefps_space = _qLearningProblem.fps_space.OrderBy(x => Math.Abs((long)x - nextState)).First();//need to test first, looking for the closet value of the FPS
             int nextStateIndex = _qLearningProblem.fps_spaceIndex(nextStatefps_space);
             double nsReward = _qTable[nextStateIndex].Max();
@@ -122,5 +133,6 @@ namespace QLearningApp.MachineLearning
             return initialState;
 
         }
+
     }
 }
diff --git a/QLearningApp/Program.cs b/QLearningApp/Program.cs
index 4f2299b..597ca94 100644
--- a/QLearningApp/Program.cs
+++ b/QLearningApp/Program.cs
@@ -10,17 +10,20 @@ namespace QLearningApp
         static void Main()
         {
             Console.WriteLine("step 1");
-            var qLearning = new QLearning(0.8, new RLSync());
+            /* Setting the parameters - To set the target FPS */
+            double targetFPS = 0;
+            Console.WriteLine("Enter target FPS value");
+            targetFPS= Convert.ToDouble(Console.ReadLine());
+            Console.WriteLine("targetFPS from main="+targetFPS);
+          
+            var qLearning = new QLearning(0.8, new RLSync(),targetFPS);
             Console.WriteLine("Training Agent...");
             qLearning.TrainAgent(2000);
 
             Console.WriteLine("step 2");
-
             Console.WriteLine("Training is Done!");
             Console.WriteLine("Press any key to continue...");
-
             Console.WriteLine("step 3");
-
             Console.ReadLine();
             do
             {
diff --git a/QLearningApp/RLsync.cs b/QLearningApp/RLsync.cs
index 53bd0f8..5287ef0 100644
--- a/QLearningApp/RLsync.cs
+++ b/QLearningApp/RLsync.cs
@@ -8,18 +8,18 @@ namespace QLearningApp
     {
         private Random _random = new Random();
         // Actions
-        public double[] gamma_space = { 10, 20, 30, 40, 50, 100 }; // the possible values of gamma
-        // private double[] delta_space = { 10, 20, 30, 40, 50, 100 }; // possible values of delta
-        public double[] delta_space = { 20 };
+        public double[] gamma_space = { 10, 20, 30, 40, 50, 100 };//{ 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30};// the possible values of gamma
+        public double[] delta_space = { 10, 20, 30, 40, 50, 100 }; // possible values of delta- 6 values
+        //public double[] delta_space = { 20 };
 
         public double alpha = 0.2; //original value
         public double beta = 0.2;//original value
         // State space
 
-        public double[] fps_space = { 10, 12, 15, 17, 20, 22, 25, 27, 30 };//PE, APL 0-30 read it form file 
+        public double[] fps_space = { 10, 12, 15, 17, 20, 22, 25, 27, 30 };//PE, APL 0-30 read it form file-9 states
  
         private double[][] rewards = new double[5][];
-        public double target_fps = 30;
+        public double Target_fps { get; set;}//made it a proerty 
         /*
          target for syn window if it is 100ms, target should be given by user not hard-coded
          ini satse: 20 FPS, 100ms latency 
@@ -30,13 +30,13 @@ namespace QLearningApp
 
         public int NumberOfStates => fps_space.Length;
 
-        public int NumberOfActions => gamma_space.Length * delta_space.Length;
+        public int NumberOfActions => gamma_space.Length * delta_space.Length;//6*6=36
 
         public double GetReward(double currentState, double action_gamma, double action_delta)
         {
             //double reward = 1 / (System.Math.Abs(currentState - target_fps)) - alpha * action_gamma - beta * action_delta;
             //double reward = 1 / (1+System.Math.Abs(currentState - target_fps)) - alpha * action_gamma/100 - beta * action_delta/100; // gamma nand delta are normalized to [0, 1]; does not perform well when fps is very low
-            double reward = 1 / (1 + System.Math.Abs(currentState - target_fps)) * (1 - alpha * action_gamma / 100 - beta * action_delta / 100); // gamma nand delta are normalized to [0, 1]
+            double reward = 1 / (1 + System.Math.Abs(currentState - Target_fps)) * (1 - alpha * action_gamma / 100 - beta * action_delta / 100); // gamma nand delta are normalized to [0, 1]
             return reward;
         }
 
@@ -64,7 +64,14 @@ namespace QLearningApp
             }
             return fps_Index;
         }
+
+        public bool GoalStateIsReached(double CurrentState)
+        {
+           // Console.WriteLine("target FPS="+target_fps);
+            return CurrentState >= Target_fps;
+        }
             
+
     }
     
     
diff --git a/QLearningApp/bin/Debug/QLearningApp.exe b/QLearningApp/bin/Debug/QLearningApp.exe
index e4f4aa93e341dc975f26aaa27d9d8eea57239c6a..0251b165b78624be1647a5e81810119edd4a5a8a 100644
GIT binary patch
delta 4623
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

delta 4016
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

diff --git a/QLearningApp/bin/Debug/QLearningApp.pdb b/QLearningApp/bin/Debug/QLearningApp.pdb
index 9d44aaa90b958891a04c1091fe1a6b715ea4889a..ff74b3d8ed7901b7810459b8e1eab4d326b71edd 100644
GIT binary patch
delta 6712
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
EF9Sufq5uE@

delta 5644
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
UPv`Figt@))*zJIy1s_xX1N#j|8~^|S

diff --git a/QLearningApp/obj/Debug/QLearningApp.csprojAssemblyReference.cache b/QLearningApp/obj/Debug/QLearningApp.csprojAssemblyReference.cache
index 61c22a8f31600f3266c789c4539e43982ba04598..b9971596f5ab326a4ea03dc9bc7679cfb48bb94b 100644
GIT binary patch
delta 29
fcmcc5w}N?tKO>V8<K#d_Pd)}95MTq5K)?+EUzP+L

literal 1887
zcmcIk-EPw`7<Jkt>(7AlH~t1>cc4{Ps!|w86@s#95@T$%nz$%TZu6y!>LkT>#>O-7
zD7*{eikILWz+YB%C<@#qQcs-pIOjXZ_D2jt$Zvh&9k1n*hL3N8v4~~tEBZ1CxJL&}
zP9^Qd0-DYN2pPmtx7DF7>QcAq^b)QT0o@1^B^Ylyd&!6g<JWLHh^G*BM{e8i_)q*+
z%j>wT%`6mK%h%|iN(EtGF$Kt~`T>XZsl0mjm#%_y7%N?Zq}xm$DK_GORaeUzOoabZ
zZB3}{#LU}bV-<^~xu3c&w-<*qCO}m1yZzt`nEIu(4;W8C5>h6XRj;hf>v$`?AYyzm
z=hyzm^B-7-so^pXECiG@@zp=(q09PVFo|@yJtlz|MkAf5-`h(X{NA(So`@%ch0c~v
zLpl#mHXc75z5^cwL}PGXNC}}%9OQ5j>TpZ*;d3meL%O>;IDa~RL_5Q|g<Vi|Td5iK
zIJYZWYgC*TZk|-9s&zgTr-N2%T0#{k@ro%%5&EDuPZUIW9%O2+UhIOs4>{clqED&T
za<L1Ry2LauXr03X(hTJ|7CacGW-e+GR)ENSr(<yF<&u_}6d<!WceK|(Vj?|J4Ltg|
z+p7(Pv?W}@(N%<N2-gu-5N;sc)L<cb{rr1>H{dffX**oUR*;UcN0h_ZGxcv;Vv*^=
zOxh9~r?iAR22t`OLQ18QL8=u4J0<!0bMh_tUcuf|tJUmVc-M`=rERy}dP)qe73;_n
zZ)b_<Cy#h1OGM9k#MLYjbIBv#%@Q%YJmS495%bL>-p>+o4f2RimWb<=M_kJg>wf_6
Cx*PTY

diff --git a/QLearningApp/obj/Debug/QLearningApp.exe b/QLearningApp/obj/Debug/QLearningApp.exe
index e4f4aa93e341dc975f26aaa27d9d8eea57239c6a..0251b165b78624be1647a5e81810119edd4a5a8a 100644
GIT binary patch
delta 4623
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

delta 4016
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

diff --git a/QLearningApp/obj/Debug/QLearningApp.pdb b/QLearningApp/obj/Debug/QLearningApp.pdb
index 9d44aaa90b958891a04c1091fe1a6b715ea4889a..ff74b3d8ed7901b7810459b8e1eab4d326b71edd 100644
GIT binary patch
delta 6712
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
EF9Sufq5uE@

delta 5644
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
UPv`Figt@))*zJIy1s_xX1N#j|8~^|S

-- 
GitLab