#r @"..\packages\FSharp.Charting.0.90.14\lib\net40\FSharp.Charting.dll"
#r @"..\packages\System.Reactive.Core.3.0.0\lib\net45\System.Reactive.Core.dll"
#r @"..\packages\System.Reactive.Linq.3.0.0\lib\net45\System.Reactive.Linq.dll"
#r @"..\packages\System.Reactive.Interfaces.3.0.0\lib\net45\System.Reactive.Interfaces.dll"
#r @"..\packages\FSharp.Control.Reactive.3.5.0\lib\net45\FSharp.Control.Reactive.dll"
#r @"System.Windows.Forms.DataVisualization"
#load "ObservableExtensions.fs" // http://fssnip.net/nC
#load "CNTLLogParser.fs"        // http://fssnip.net/7Rm
open CNTLLogParser
open System
open FSharp.Control.Reactive
open System.Windows.Forms
open FSharp.Charting
open System.IO
open FSharp.Control

module FsiAutoShow = 
    fsi.AddPrinter(fun (ch:FSharp.Charting.ChartTypes.GenericChart) -> ch.ShowChart() |> ignore; "(Chart)")

let private containerize ch = new ChartTypes.ChartControl(ch,Dock=DockStyle.Fill)

let show chlist =
    let form = new Form()
    form.Width  <- 400
    form.Height <- 300
    form.Visible <- true 
    form.Text <- "CNTK Charts"
    let grid = new TableLayoutPanel()
    grid.AutoSize <- true
//    grid.ColumnCount <- 2
//    grid.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50.f)) |> ignore
//    grid.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50.f)) |> ignore
    grid.RowCount <- 2
    grid.RowStyles.Add(new RowStyle(SizeType.Percent,50.f)) |> ignore
    grid.RowStyles.Add(new RowStyle(SizeType.Percent,50.f)) |> ignore
    grid.GrowStyle <-  TableLayoutPanelGrowStyle.AddRows
    grid.Dock <- DockStyle.Fill
    chlist |> List.map containerize |> List.iter grid.Controls.Add
    form.Controls.Add(grid)
    form.Show()

let track file =
    let cts = new System.Threading.CancellationTokenSource()
    let obs,fPost = Observable.createObservableAgent 100 cts.Token
    do tail tailFilterWihoutMB cts file fPost
    let obsCntk = obs |> Observable.map cntkParse |> Observable.choose excludeUnk
    let obsEE = obsCntk |> Observable.choose chooseEE
    obsEE |> Observable.subscribe (printfn "%A") |> ignore 
    let c1 = 
        LiveChart.FastLineIncremental(obsEE |> Observable.map (fun x->x.Epoch,x.CE),Title="Epoch CE")
        |> Chart.WithXAxis(Title="Epoch")
    let c2 =  
        LiveChart.FastLineIncremental(obsEE |> Observable.map (fun x->x.Epoch,x.Err),Title="Epoch Err")
        |> Chart.WithXAxis(Title="Epoch")
    show [c1;c2]
    cts
;;
(*
let ct1 = track @"C:\CNTK\Models\M1\err"
ct1.Cancel() 

let ct2 = track @" track @"C:\CNTK\Models\M2\err"
ct2.Cancel() 

*)

(* minibatch error rate display chart note use the 'tailFilterWithMB' filter to include data for this chart

let pctArray() = [|for i in 0 .. 9 -> i,0.|]
let collectMB (acc:(int*float)array) m1 = let i = int ((m1.Percent - 1. |> max 0.) * 0.1) % 10 in acc.[i] <- i,m1.CE; acc
let majorPctChanged (m1,m2) = floor (m1.Percent / 10.) <> floor (m2.Percent / 10.)

let obsMBP = obsCntk |> Observable.choose chooseMB 
let obsMB = obsMBP |> Observable.scan collectMB (pctArray())

let every x i _ = i % !x = 0 //every 10th item
let updateEvery = ref 100 //updateEvery := 300

let obsMBCE = obsMB |> Observable.filteri (every updateEvery) |> Observable.map Array.copy
;;
LiveChart.FastLine (obsMBCE,Title="MB CE");;
*)