public void Run() { int BatchCount = 1; if (curRequest.BatchRun) { BatchCount = curRequest.RunTimes; } // First do reachable area (Dist and Diff) RtwMatrix mDistReachable; RtwMatrix mDiffReachable; if (curRequest.T < curRequest.DistMap.Rows + curRequest.DistMap.Columns) { mDistReachable = curRequest.DistMap.Clone(); mDiffReachable = curRequest.DiffMap.Clone(); if (!ComputeReachableArea(mDistReachable, mDiffReachable)) { // Cannot plan path. return; } } else { mDistReachable = curRequest.DistMap.Clone(); mDiffReachable = curRequest.DiffMap.Clone(); } // Then do mode count (If Diff map is used, multiply first) CountDistModes myCount; if (curRequest.UseTaskDifficultyMap) { RtwMatrix mRealModes = new RtwMatrix(mDistReachable.Rows, mDistReachable.Columns); for (int i = 0; i < mRealModes.Rows; i++) { for (int j = 0; j < mRealModes.Columns; j++) { mRealModes[i, j] = mDistReachable[i, j] * (float)curRequest.DiffRates[Convert.ToInt32(mDiffReachable[i, j])]; } } myCount = new CountDistModes(mRealModes); } else { myCount = new CountDistModes(mDistReachable); } int ModeCount = myCount.GetCount(); RtwMatrix mModes = myCount.GetModes(); myCount = null; //Console.WriteLine("ModeCount = " + ModeCount); // Then do efficiency lower bound ComputeEfficiencyUB myELB = new ComputeEfficiencyUB(curRequest, mDistReachable, mDiffReachable); double Efficiency_UB = myELB.GetEfficiency_UB(); myELB = null; // Set sample rate based on max value in mdistReachable. float max = mDistReachable.MinMaxValue()[1]; ProjectConstants.DownSample_Rate = max / 10f; // Do the batch run of Path Planning List<double> AllRunTimes = new List<double>(); List<double> AllEfficiencies = new List<double>(); for (int i = 0; i < BatchCount; i++) { // Run them sequencially and don't use multiple threads. PathPlanningTask curTask = new PathPlanningTask(curRequest, ModeCount, mModes, mDistReachable, mDiffReachable, Efficiency_UB); curTask.Run(); AllRunTimes.Add(curTask.GetRunTime()); AvgRunTime += curTask.GetRunTime(); AllEfficiencies.Add(curTask.GetEfficiency()); AvgEfficiency += curTask.GetEfficiency(); Path = curTask.GetPath(); curTask = null; } AvgRunTime = AvgRunTime / BatchCount; StdRunTime = ComputeStDev(AllRunTimes, AvgRunTime); AvgEfficiency = AvgEfficiency / BatchCount; StdEfficiency = ComputeStDev(AllEfficiencies, AvgEfficiency); // Log path planning activities if (ProjectConstants.DebugMode) { curRequest.SetLog("----------------------------------------------\n"); curRequest.SetLog("Average run time: " + AvgRunTime.ToString() + "\n"); curRequest.SetLog("Standard deviation: " + StdRunTime.ToString() + "\n"); curRequest.SetLog("Average efficiency: " + AvgEfficiency.ToString() + "\n"); curRequest.SetLog("Standard deviation: " + StdEfficiency.ToString() + "\n"); curRequest.SetLog("----------------------------------------------"); curRequest.SetLog("----------------------------------------------\n"); } }
// When the test button is pressed (Count how many modes) private void btnTest_Click(object sender, EventArgs e) { #region Test Mode Count //DateTime startTime = DateTime.Now; //CountDistModes myCount; //if (chkUseDiff.Checked) //{ // RtwMatrix mDistReachable = test.DistMap.Clone(); // RtwMatrix mDiffReachable = test.DiffMap.Clone(); // RtwMatrix mRealModes = new RtwMatrix(CurDiffMap.Rows, CurDiffMap.Columns); // for (int i = 0; i < mRealModes.Rows; i++) // { // for (int j = 0; j < mRealModes.Columns; j++) // { // mRealModes[i, j] = mDistReachable[i, j] * // (float)test.DiffRates[Convert.ToInt32(mDiffReachable[i, j])]; // } // } // myCount = new CountDistModes(mRealModes); // // Debug code: Showing the product of dist and diff // frmMap mapReal = new frmMap(); // Bitmap CurBMPReal = new Bitmap(mRealModes.Columns, mRealModes.Rows); // ImgLib.MatrixToImage(ref mRealModes, ref CurBMPReal); // mapReal.Text = "Real probability distribution with respect to difficulty map"; // mapReal.setImage(CurBMPReal); // mapReal.Show(); // mapReal.resetImage(); //} //else //{ // myCount = new CountDistModes(CurDistMap); //} //Log(myCount.GetCount().ToString() + "\n"); //DateTime stopTime = DateTime.Now; //TimeSpan duration = stopTime - startTime; //Log("Computation took " + duration.ToString() + " seconds.\n"); //// Show mode nodes //RtwMatrix myModes = myCount.GetModes().Clone(); //for (int i = 0; i < myModes.Rows; i++) //{ // for (int j = 0; j < myModes.Columns; j++) // { // if (myModes[i, j] > 0) // { // myModes[i, j] = 255; // } // } //} //// Convert matrix to image //Bitmap CurBMP = new Bitmap(myModes.Columns, myModes.Rows); //ImgLib.MatrixToImage(ref myModes, ref CurBMP); //// Showing map in map form //frmMap myModesForm = new frmMap(this); //myModesForm.Text = "Modes Map"; //myModesForm.setImage(CurBMP); //myModesForm.Show(); //myCount = null; #endregion #region Test permutation //int[] intInput = { 1, 2, 3, 4}; //Log(ShowPermutations<int>(intInput, 3)); //string[] stringInput = { "Hello", "World", "Foo" }; //Log(ShowPermutations<string>(stringInput, 2)); #endregion #region Test MATLAB ////////////////////// //// Input Parameters ////////////////////// //// create an array ar for the real part of "a" //System.Array ar = new double[2]; //ar.SetValue(11, 0); //ar.SetValue(12, 1); //// create an array ai for the imaginary part of "a" //System.Array ai = new double[2]; //ai.SetValue(1, 0); //ai.SetValue(2, 1); //// create an array br for the real part of "b" //System.Array br = new double[2]; //br.SetValue(21, 0); //br.SetValue(22, 1); //// create an array bi for the imaginary part of "b" //System.Array bi = new double[2]; //bi.SetValue(3, 0); //bi.SetValue(4, 1); /////////////////////// //// Output Parameters /////////////////////// //// initialize variables for return value from ML //System.Array cr = new double[2]; //System.Array ci = new double[2]; //System.Array dr = new double[2]; //System.Array di = new double[2]; ////////////////////////// //// Call MATLAB function ////////////////////////// //// call appropriate function/method based on Mode //// use MATLAB engine //UseEngine(ar, ai, br, bi, ref cr, ref ci, ref dr, ref di); //Log("ar = " + ar.GetValue(0).ToString() + " " + ar.GetValue(1).ToString() + "\n"); //Log("ai = " + ai.GetValue(0).ToString() + " " + ai.GetValue(1).ToString() + "\n"); //Log("br = " + br.GetValue(0).ToString() + " " + br.GetValue(1).ToString() + "\n"); //Log("bi = " + bi.GetValue(0).ToString() + " " + bi.GetValue(1).ToString() + "\n"); //Log("cr = " + cr.GetValue(0).ToString() + " " + cr.GetValue(1).ToString() + "\n"); //Log("ci = " + ci.GetValue(0).ToString() + " " + ci.GetValue(1).ToString() + "\n"); //Log("dr = " + dr.GetValue(0).ToString() + " " + dr.GetValue(1).ToString() + "\n"); //Log("di = " + di.GetValue(0).ToString() + " " + di.GetValue(1).ToString() + "\n"); #endregion #region Test MATH.NET EVD //DenseMatrix m = new DenseMatrix(new[,] { { 81.1887, -18.4630 }, { -18.4630, 115.9033 } }); //System.Numerics.Complex[] d = m.Evd().EigenValues().ToArray(); //double a = d[0].Real; //double b = d[1].Real; //Log(a + " " + b); #endregion #region Test Arrays //int n = 3; //Array arrModes = new double[n]; //Array arrMUs = new double[n, 2]; //Array arrSigmaXSigmaY = new double[n]; //for (int i = 0; i < n; i++) //{ // // Means // arrMUs.SetValue(21, i, 0); // arrMUs.SetValue(22, i, 1); //} #endregion #region Compute Efficiency with existing path #region Sanity Check // Make sure maps are loaded if (chkUseDist.Checked && CurDistMap == null) { System.Windows.Forms.MessageBox.Show("Please load a probability distribution map first!"); return; } if (chkUseDiff.Checked && CurDiffMap == null) { System.Windows.Forms.MessageBox.Show("Please load a task-difficulty map first!"); return; } // Make sure distribution map and task-difficulty map have same size if (chkUseDiff.Checked && chkUseDist.Checked) { if (CurDistMap.Rows != CurDiffMap.Rows || CurDistMap.Columns != CurDiffMap.Columns) { System.Windows.Forms.MessageBox.Show("Please make sure the distribution map and the " + "task-difficulty map must be the same size!"); return; } } // Use default distribution map or task-difficulty map if only one is checked if (chkUseDiff.Checked && !chkUseDist.Checked) { CurDistMap = new RtwMatrix(CurDiffMap.Rows, CurDiffMap.Columns); } if (!chkUseDiff.Checked && chkUseDist.Checked) { CurDiffMap = new RtwMatrix(CurDistMap.Rows, CurDistMap.Columns); } #endregion // Create request object PathPlanningRequest newRequest = new PathPlanningRequest(); #region Setting Request Object Properties newRequest.UseDistributionMap = chkUseDist.Checked; newRequest.UseTaskDifficultyMap = chkUseDiff.Checked; newRequest.UseHierarchy = chkHierarchy.Checked; newRequest.UseCoarseToFineSearch = chkCoaseToFine.Checked; newRequest.UseParallelProcessing = chkParallel.Checked; if (rbtnFixWing.Checked) { newRequest.VehicleType = UAVType.FixWing; } if (rbtnCopter.Checked) { newRequest.VehicleType = UAVType.Copter; } if (rbtnFixedAmount.Checked) { newRequest.DetectionType = DType.FixAmount; } if (rbtnFixedAmountPercent.Checked) { newRequest.DetectionType = DType.FixAmountInPercentage; } if (rbtnFixedPercent.Checked) { newRequest.DetectionType = DType.FixPercentage; } newRequest.DetectionRate = Convert.ToDouble(ntxtDetectionRate.Value); newRequest.DistMap = CurDistMap; newRequest.DiffMap = CurDiffMap; newRequest.UseEndPoint = chkUseEndPoint.Checked; newRequest.T = trbFlightTime.Value; newRequest.pStart.column = Convert.ToInt16(ntxtSX.Value); newRequest.pStart.row = Convert.ToInt16(ntxtSY.Value); newRequest.pEnd.column = Convert.ToInt16(ntxtEX.Value); newRequest.pEnd.row = Convert.ToInt16(ntxtEY.Value); newRequest.AlgToUse = AlgType.LHCGWCONV; newRequest.DrawPath = chkShowPath.Checked; #endregion #region Find max task-difficulty and compute diff rates only once if (chkUseDiff.Checked) { newRequest.MaxDifficulty = Convert.ToInt32(CurDiffMap.MinMaxValue()[1]); // Set task-difficulty rates double[] DiffRates = new double[newRequest.MaxDifficulty + 1]; double rate = 1.0 / (newRequest.MaxDifficulty + 1); for (int i = 0; i < newRequest.MaxDifficulty + 1; i++) { DiffRates[i] = 1 - i * rate; } newRequest.DiffRates = DiffRates; } if (!newRequest.SanityCheck()) { System.Windows.Forms.MessageBox.Show(newRequest.GetLog()); return; } #endregion // Read in existing path using hard-coded file path string BAPathFileName = @"H:\Research\20 New IPPAs for Partial Detection Conference Paper\Selected Cases Maps\BAPath.csv"; RtwMatrix BAPath = MISCLib.ReadInMap(BAPathFileName); #region First do reachable area (Dist and Diff) RtwMatrix mDistReachable; RtwMatrix mDiffReachable; if (newRequest.T < newRequest.DistMap.Rows + newRequest.DistMap.Columns) { mDistReachable = newRequest.DistMap.Clone(); mDiffReachable = newRequest.DiffMap.Clone(); if (!ComputeReachableArea(newRequest, mDistReachable, mDiffReachable)) { // Cannot plan path. return; } } else { mDistReachable = newRequest.DistMap.Clone(); mDiffReachable = newRequest.DiffMap.Clone(); } #endregion // Then do efficiency lower bound ComputeEfficiencyUB myELB = new ComputeEfficiencyUB(newRequest, mDistReachable, mDiffReachable); double Efficiency_UB = myELB.GetEfficiency_UB(); List<Point> TeleportPath = myELB.GetTeleportPath(); myELB = null; // Creating path planning object AlgPathPlanning curAlg = new AlgGlobalWarming(newRequest, 1, mDistReachable, mDiffReachable, Efficiency_UB); // Call method to compute existing path CDF List<Point> Path = new List<Point>(); for(int i=0; i<BAPath.Rows; i++) { Point p = new Point(Convert.ToInt16(BAPath[i,0]), Convert.ToInt16(BAPath[i,1])); Path.Add(p); } float CDF = curAlg.GetTrueCDF(Path); // Compute efficiency double Efficiency = 0; if (Efficiency_UB == 0) { Efficiency = 1; } else { Efficiency = CDF / Efficiency_UB; } // Compute CDF for graph Console.WriteLine("Print Existing Path CDF Graph:"); curAlg.PrintCDFGraph(TeleportPath, newRequest.DistMap); Console.WriteLine("Print BAPath CDF Graph:"); curAlg.PrintCDFGraph(Path, newRequest.DistMap); curAlg.SetPath(Path); // Show results Log("----------------------------------------------\n"); Log("Efficiency: " + Efficiency.ToString() + "\n"); Log("----------------------------------------------"); Log("----------------------------------------------\n"); #region Show path if (newRequest.DrawPath) { // Draw path with map remains Bitmap CurBMP3 = new Bitmap(mDistReachable.Columns, mDistReachable.Rows); ImgLib.MatrixToImage(ref mDistReachable, ref CurBMP3); frmMap map3 = new frmMap(); map3.Text = "UAV trajectory and coverage"; map3.setImage(CurBMP3); map3.Show(); map3.resetImage(); List<float> remains = curAlg.ShowCoverage(); Color c = Color.FromArgb(255, 0, 0); for (int i = 0; i < Path.Count; i++) { Point p = Path[i]; map3.setPointColor(p, c); map3.Refresh(); map3.setPointColor(p, remains[i]); map3.Refresh(); } // Drawing real path MISCLib.ShowImage(MISCLib.DrawPath(Path), "Real Path"); } #endregion #endregion }