PageRenderTime 44ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/Testing/MergeExperiments.fsx

https://bitbucket.org/morellid/energonframework
F# | 309 lines | 216 code | 69 blank | 24 comment | 26 complexity | a616f98d7dde61063915bc619647ec0e MD5 | raw file
  1. #I @"C:\Users\root\Desktop\Energon\bin\Debug"
  2. #r @"Energon.Measuring.dll"
  3. open Energon.Measuring
  4. let getCorrMatrix data =
  5. let getMatrixInfo nCol (count,crossProd:float array array,sumVector:float array,sqVector:float array) (newLine:float array) =
  6. for i in 0..(nCol-1) do
  7. sumVector.[i]<-sumVector.[i]+newLine.[i]
  8. sqVector.[i]<-sqVector.[i]+(newLine.[i]*newLine.[i])
  9. for j in (i+1)..(nCol-1) do
  10. crossProd.[i].[j-(i+1)]<-crossProd.[i].[j-(i+1)]+newLine.[i]*newLine.[j]
  11. let newCount = count+1
  12. //(newCount,newMatrix,newSumVector,newSqVector)
  13. (newCount,crossProd,sumVector,sqVector)
  14. //Get number of columns
  15. let nCol = data|>Seq.head|>Seq.length
  16. //Initialize objects for the fold
  17. let matrixStart = Array.init nCol (fun i -> Array.create (nCol-i-1) 0.0)
  18. let sumVector = Array.init nCol (fun _ -> 0.0)
  19. let sqVector = Array.init nCol (fun _ -> 0.0)
  20. let init = (0,matrixStart,sumVector,sqVector)
  21. //Run the fold and obtain all the elements to build te correlation matrix
  22. let (count,crossProd,sum,sq) =
  23. data
  24. |>Seq.fold(getMatrixInfo nCol) init
  25. //Compute averages standard deviations, and finally correlations
  26. let averages = sum|>Array.map(fun s ->s/(float count))
  27. let std = Array.zip3 sum sq averages
  28. |> Array.map(fun (elemSum,elemSq,av)-> let temp = elemSq-2.0*av*elemSum+float(count)*av*av
  29. sqrt (temp/(float count-1.0)))
  30. //Map allteh elements to correlation
  31. let rec getCorr i j =
  32. if i=j then
  33. 1.0
  34. elif i<j then
  35. (crossProd.[i].[j-(i+1)]-averages.[i]*sum.[j]-averages.[j]*sum.[i]+(float count*averages.[i]*averages.[j]) )/((float count-1.0)*std.[i]*std.[j])
  36. else
  37. getCorr j i
  38. let corrMatrix = Array2D.init nCol nCol (fun i j -> getCorr i j)
  39. corrMatrix
  40. // ****************** SqlCE ***************************
  41. #r @"Energon.Storage.dll"
  42. #r @"C:\Program Files (x86)\Microsoft SQL Server Compact Edition\v4.0\Desktop\System.Data.SqlServerCe.dll"
  43. #r "Energon.SQLCE.dll"
  44. #r "System.Data.Linq.dll"
  45. #r "System.Linq.dll"
  46. #r "FSharp.PowerPack.Linq.dll"
  47. #r "FSharp.Data.TypeProviders.dll"
  48. #r "System.Data.DataSetExtensions.dll"
  49. #r "System.Core.dll"
  50. #r "SQLExpress.dll"
  51. open System
  52. open Microsoft.FSharp.Data.TypeProviders
  53. open System.Data.Linq.SqlClient
  54. open System.Linq
  55. open Microsoft.FSharp.Linq
  56. open System.Data.Linq
  57. open Energon.Measuring
  58. open System.Text
  59. open System.Data.DataSetExtensions
  60. open System.Data.SqlServerCe;
  61. //CompactSQL
  62. //Energon.CompactSQL.SaveExperiment e dbfile
  63. let dbfile = @"C:\Users\root\Desktop\Energon\Measurements.old.sdf"
  64. let dbfile = @"C:\Users\root\Desktop\Energon\Measures\Reduce.old.sdf"
  65. // example getting data from db
  66. open Energon.SQLCE
  67. open Energon.CompactSQL
  68. let db = Energon.CompactSQL.GetLinqContext dbfile
  69. let exp = db.Experiments
  70. exp.Count()
  71. exp.ToArray()
  72. exp.Where(fun (x:Energon.SQLCE.Experiments) -> x.Id = 7)
  73. open SQLExpress
  74. let server = "HPLAB\SQLEXPRESS"
  75. let database = "Measure"
  76. let getConStr =
  77. //let conStr = System.String.Format("server='{0}';database='{1}';User Id='{2}';password='{3}';", server, database, user, password) in
  78. let conStr = System.String.Format("Data Source={0};Initial Catalog={1};Integrated Security=SSPI;", server, database) in
  79. conStr;
  80. let GetLinqContext =
  81. let context = new SQLExpress.Measure(getConStr)
  82. if (context.DatabaseExists() = false) then
  83. context.CreateDatabase()
  84. context
  85. let db = GetLinqContext
  86. let expConvolution = db.Experiments.Where(fun (x:Experiments) -> x.Id = 4).First()
  87. let expReduce = db.Experiments.Where(fun (x:Experiments) -> x.Id = 11).First()
  88. let expSaxpy = db.Experiments.Where(fun (x:Experiments) -> x.Id = 7).First()
  89. let exps = [| expConvolution ; expReduce ; expSaxpy |]
  90. let expCasesConvolution = db.ExperimentCases.Where(fun (x:ExperimentCases) -> x.Experiment_id = expConvolution.Id )
  91. let expCasesReduce = db.ExperimentCases.Where(fun (x:ExperimentCases) -> x.Experiment_id = expReduce.Id )
  92. let expCasesSaxpy = db.ExperimentCases.Where(fun (x:ExperimentCases) -> x.Experiment_id = expSaxpy.Id )
  93. let exp = expReduce
  94. let expCases = expCasesReduce
  95. //let exp = expSaxpy
  96. //let expCases = expCasesSaxpy
  97. //let exp = expCasesConvolution
  98. //let expCases = expCasesConvolution
  99. let arg1 (case:ExperimentCases) =
  100. let tags = case.Args.Split([|";"|], StringSplitOptions.RemoveEmptyEntries)
  101. tags.[0]
  102. let expRuns (case:ExperimentCases) =
  103. db.ExperimentRuns.Where(fun (x:ExperimentRuns) -> x.Experiment_case_id = case.Id)
  104. let handleRun (x:ExperimentRuns) =
  105. let sensors = db.Sensors.Where(fun (s:Sensors) -> s.Experiment_run_id = x.Id).OrderBy(fun (s:Sensors) -> s.Sensor_class_id) |> Seq.toArray
  106. let getSensorClass (s:Sensors) =
  107. db.SensorClasses.First(fun (c:SensorClasses) -> c.Id = s.Sensor_class_id)
  108. let getReadings (s:Sensors) =
  109. //let measures = db.Measurements1.Where(fun (m:Measurements1) -> m.Sensor_id = s.Id )
  110. //measures |> Seq.map (fun (m:Measurements1) -> m.Value) |> Seq.average
  111. let measures = db.Measurements.Where(fun (m:Measurements) -> m.Sensor_id = s.Id )
  112. measures |> Seq.map (fun (m:Measurements) -> m.Value) |> Seq.average
  113. let vals =
  114. Seq.map getReadings sensors
  115. (sensors.ToArray(), vals)
  116. let handleCase (case:ExperimentCases) (exp:Experiments)=
  117. let run = (expRuns case).First()
  118. let s,v = handleRun run
  119. let args = case.Args.Split([|";"|], StringSplitOptions.RemoveEmptyEntries)
  120. let firstArg = match args.[0] with
  121. | "HOST_SEQ" -> 0.
  122. | "HOST_PAR" -> 1.
  123. | "OPENCL" -> 2.
  124. | _ -> -1.
  125. let argsToFloatSeq = seq {
  126. yield firstArg
  127. let argN = args.Length - 1
  128. for i in 1..argN do
  129. yield float(System.Single.Parse(args.[i]))
  130. }
  131. let nameArray = match args.[0] with
  132. | "saxpy_openCL" -> [| 0. |].ToArray()
  133. | "convolution" -> [| 1. |].ToArray()
  134. | "reduce" -> [| 2. |].ToArray()
  135. | _ -> [| 1. |].ToArray()
  136. let argArray = argsToFloatSeq.ToArray()
  137. let valArray = v.ToArray()
  138. let j = valArray.[0] * valArray.[1]
  139. let mat_size = argArray.[1] * argArray.[2]
  140. Array.concat [| nameArray; argArray; valArray; [| j ; mat_size |] |]
  141. let data cases (e:Experiments) =
  142. cases |> Seq.map (fun (c:ExperimentCases) -> (handleCase c e))
  143. let colNames (e:Experiments) (c:ExperimentCases) (r:ExperimentRuns)=
  144. let name = [| "algorithm" |]
  145. let args = e.ArgNames.Split([|";"|], StringSplitOptions.RemoveEmptyEntries)
  146. let sensors = db.Sensors.Where(fun (s:Sensors) -> s.Experiment_run_id = r.Id)
  147. let sensorName (s:Sensors) =
  148. db.SensorClasses.Where(fun (cl:SensorClasses) -> cl.Id = s.Sensor_class_id).First().SensorName
  149. let sensorsNames = (Seq.map sensorName sensors).ToArray()
  150. Array.concat [| name ; args ; sensorsNames ; [|"J"; "matrix_size"|] |]
  151. let names = colNames (exp) (expCases.First()) (Seq.head (expRuns (expCases.First())))
  152. let cols = names.Length
  153. //names.ToArray().Length
  154. //exp.First().ArgNames.Split([|";"|], StringSplitOptions.RemoveEmptyEntries).Length
  155. let colIdx name =
  156. let mutable res = -1
  157. let namesL = names.Length - 1
  158. for i in 0..namesL do
  159. if name = names.[i] then
  160. res <- i
  161. res
  162. let colName idx = names.[idx]
  163. let buildLabel primo idxsecondo =
  164. System.String.Format("{0},{1}", primo, (colName idxsecondo))
  165. let correlationsLabels = seq {
  166. let maxCols = cols - 1
  167. for i in 0..maxCols do
  168. yield buildLabel "J" i
  169. for i in 0..maxCols do
  170. yield buildLabel "extechWatt" i
  171. for i in 0..maxCols do
  172. yield buildLabel "completionTime" i
  173. for i in 0..maxCols do
  174. yield buildLabel "algorithm" i
  175. }
  176. let extendedColNames =
  177. Array.concat [| names ; correlationsLabels.ToArray() |]
  178. let sb = new System.Text.StringBuilder()
  179. //names |> Seq.iter (fun (s:string) -> sb.AppendFormat(@"{0};", s) |> ignore)
  180. correlationsLabels |> Seq.iter (fun (s:string) -> sb.AppendFormat(@"{0};", s) |> ignore)
  181. sb.AppendLine("")
  182. let sb2 = new System.Text.StringBuilder()
  183. for round in 0..22 do
  184. //for round in 0..2 do
  185. let casesSubset = expCases.Skip (round*11) |> Seq.take 11
  186. let valuesMatrix = data casesSubset exp
  187. let vals = valuesMatrix.ToArray()
  188. let corrMatr = getCorrMatrix vals
  189. let j_index = colIdx "J"
  190. let w_index = colIdx "extechWatt"
  191. let t_index = colIdx "completionTime"
  192. let a_index = colIdx "algorithm"
  193. let correlationsVals (corrMatrix:float[,]) = seq {
  194. let maxCols = cols - 1
  195. for i in 0..maxCols do
  196. yield corrMatrix.[j_index,i]
  197. for i in 0..maxCols do
  198. yield corrMatrix.[w_index,i]
  199. for i in 0..maxCols do
  200. yield corrMatrix.[t_index,i]
  201. for i in 0..maxCols do
  202. yield corrMatrix.[a_index,i]
  203. }
  204. sb.Append(casesSubset.First().Args.Replace(";", " ")) |> ignore
  205. correlationsVals corrMatr |> Seq.iter (fun f -> sb.AppendFormat(@"{0};", f) |> ignore)
  206. sb.AppendLine("") |> ignore
  207. for row in 0..(cols-1) do
  208. for i in row..(cols-1) do
  209. let value = corrMatr.[row,i]
  210. if not (row = i) then
  211. if not (Double.IsNaN(value) ) then
  212. if value > 0.4 then
  213. sb2.AppendFormat("{0},{1}:{2};", (names.[row]), (names.[i]), corrMatr.[row,i]) |> ignore
  214. if value < -0.4 then
  215. sb2.AppendFormat("{0},{1}:{2};", (names.[row]), (names.[i]), corrMatr.[row,i]) |> ignore
  216. sb2.AppendLine("") |> ignore
  217. 1+1
  218. sb.ToString()
  219. sb2.ToString()
  220. System.IO.File.WriteAllText(@"C:\Users\root\Desktop\Energon\Measures\convolution_correlations.csv", sb.ToString())
  221. System.IO.File.WriteAllText(@"C:\Users\root\Desktop\Energon\Measures\convolution_correlations_text.csv", sb2.ToString())
  222. // -------------------- print values ---------------------
  223. //let casesSubset = expCases.Skip 0 |> Seq.take 1
  224. let sb3 = new System.Text.StringBuilder()
  225. names |> Seq.iter (fun (s:string) -> sb3.AppendFormat(@"{0};", s) |> ignore)
  226. sb3.AppendLine("")
  227. for round in 0..22 do
  228. //for round in 0..2 do
  229. let casesSubset = expCases.Skip (round*11) |> Seq.take 11
  230. let valuesMatrix = data casesSubset
  231. let vals = valuesMatrix.ToArray()
  232. valuesMatrix |> Seq.iter (fun (vals:float[]) ->
  233. for f in vals do
  234. sb3.AppendFormat(@"{0};", f) |> ignore
  235. sb3.AppendLine("") |> ignore
  236. )
  237. sb3.ToString()
  238. System.IO.File.WriteAllText(@"C:\Users\root\Desktop\Energon\Measures\convolution.csv", sb3.ToString())
  239. System.IO.File.WriteAllText(@"C:\Users\root\Desktop\Energon\Measures\reduce.csv", sb3.ToString())
  240. System.IO.File.WriteAllText(@"C:\Users\root\Desktop\Energon\Measures\saxpy.csv", sb3.ToString())