anchor.diff:          trainable.InitOptState ()
           trainable.PrintInfo ()
   
  +        // dumping helpers
  +        let origDumpPrefix = Dump.prefix
  +        let setDumpPrefix iter partition =
  +            match cfg.DumpPrefix with
  +            | Some dp -> Dump.prefix <- sprintf "%s/%d/%s" dp iter partition
  +            | None -> ()            
  +
           /// training function
           let rec doTrain iter learningRate log =
   
               if not Console.IsInputRedirected then printf "%6d \r" iter
   
  -            /// set dump prefix
  -            match cfg.DumpPrefix with
  -            | Some dp -> Dump.prefix <- sprintf "%s%d" dp iter
  -            | None -> ()
  -
               // execute training
               trainable.ResetModelState ()
  +            setDumpPrefix iter "trn"
               let trnLosses = trnBatches |> Seq.map (trainable.Optimize learningRate) |> Seq.toList
   
               // record loss
  
positive.code:         | None ->
              printfn "No training was performed."
  
          {
              History             = List.rev log.History
              Best                = log |> TrainingLog.best |> Option.map fst
  
negative.code: 
                  let multiTrnLosses = trnLosses |> List.map (fun v -> v.Force()) |> multiAvg
                  trainable.ResetModelState ()
                  setDumpPrefix iter "val"
                  let multiValLosses = valBatches |> Seq.map trainable.Losses |> multiAvg
                  trainable.ResetModelState ()
                  setDumpPrefix iter "tst"
                  let multiTstLosses = tstBatches |> Seq.map trainable.Losses |> multiAvg
  
                  // compute and log primary validation & test loss
  