open Datapoint open Array open Printf let kernel_info = function LinearKernel -> "linear" | PolynomialKernel (a,b,d) -> "poly constant=" ^ string_of_float a ^ "coefficient=" ^ string_of_float b ^ "degree=" ^ string_of_float d | RbfKernel g -> "rbf gamma=" ^ string_of_float g | SigKernel (a,b) -> "sig constant=" ^ string_of_float a ^ "coefficient=" ^ string_of_float b | IdKernel b -> "id beta=" ^ string_of_float b let () = if length Sys.argv != 2 then ( printf "usage: %s [modelFile]\n" Sys.argv.(0) ) else ( let m = BinaryIO.loadModel Sys.argv.(1) in let reverse_vocab = Vocabulary.reverse Vocabulary.global in printf "Model parameters:\n"; for i = 0 to length m.modelParams-1 do match m.modelParams.(i) with DVP (w,k) -> printf " %d: dense , weight=%g, kernel=%s\n" i w (kernel_info k) | SVP (w,k,h) -> printf " %d: sparse , weight=%g, kernel=%s, highest=%d\n" i w (kernel_info k) h | DPP (w,l,n) -> printf " %d: dpstring, weight=%g, lambda=%g, maxn=%d\n" i w l n | DPTP (w,l,n) -> printf " %d: dptrans, weight=%g, lambda=%g, maxn=%d\n" i w l n | STP (w,f) -> printf " %d: ststring, weight=%g, %s\n" i w (match f with SuffixTreeKernel.ExpDecay l -> "expdecay " ^ string_of_float l | SuffixTreeKernel.ConstWeight -> "const" | SuffixTreeKernel.BoundedRange n -> "bounded " ^ string_of_int n) | DiscP (w,a,b)-> printf " %d: discrete, weight=%g, cardinality=%d, beta=%g\n" i w a b | MatP (w,_) -> printf " %d: matrix, weight=%g\n" i w | FVParamPlaceHolder -> printf " %d: unknown\n" i; done; printf "\nSupport vectors:\n"; for i = 0 to length m.supportVectors - 1 do printf " SV #%d:\n" i; for j = 0 to length m.supportVectors.(i) - 1 do match m.supportVectors.(i).(j) with DV v -> ( printf " "; for k = 0 to length v - 1 do printf " %g" v.(k); done ) | SV (f,v) -> ( printf " "; let hitM1 = ref false in for k = 0 to length f - 1 do if not !hitM1 then ( if f.(k) == -1 then (hitM1 := true) else printf " %d:%g" f.(k) v.(k) ); done ) | DP sa -> ( printf " " ; for k = 0 to length sa - 1 do printf " %s" reverse_vocab.(sa.(k)); done ) | ST d -> let sa = d.SuffixTreeKernel.tree_ref.SuffixTree.tree_string in ( printf " " ; for k = 0 to length sa - 1 do printf " %s" reverse_vocab.(sa.(k)); done ) | Disc k -> printf " %s" reverse_vocab.(k) | Mat k -> printf " %d" k; done; printf "\n"; done; printf "\nMultipliers (alpha values * class values):\n"; for i = 0 to length m.multipliers - 1 do printf " "; for j = 0 to length m.multipliers.(i) - 1do printf " %g" m.multipliers.(i).(j); done; printf "\n"; done; printf "\nBias(es): "; for i = 0 to length m.modelBias - 1 do printf " %g" m.modelBias.(i); done; printf "\nMulticlass: "; (match m.multiclass with None -> printf "binary\n" | Some (OVA i) -> printf "OVA, num classes=%d\n" (length i) | Some (OVN i) -> printf "OVN, num classes=%d\n" (length i) | Some (AVA i) -> printf "AVA, num classes=%d\n" (length i)); printf "Binary sigmoid parameters: "; (match m.binarySigmoid with None -> printf "none\n"; | Some (a,b) -> printf "%g %g\n" a b); )