From 417ba0263bf9f039a4024083e7b78c283c788cbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20de=20Souza?= <43355143+de-souza@users.noreply.github.com> Date: Wed, 1 Mar 2023 14:24:16 +0100 Subject: [PATCH 01/66] Use tb_chart_type in docs (#118) --- docs/src/explicit_interface.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/explicit_interface.md b/docs/src/explicit_interface.md index 2a00c4b..28d73b9 100644 --- a/docs/src/explicit_interface.md +++ b/docs/src/explicit_interface.md @@ -44,7 +44,7 @@ See [TensorBoard Custom Scalar page](https://github.com/tensorflow/tensorboard/t For example, to combine in the same plot panel the two curves logged under tags `"Curve/1"` and `"Curve/2"` you can run once the command: ```julia -layout = Dict("Cat" => Dict("Curve" => ("Multiline", ["Curve/1", "Curve/2"]))) +layout = Dict("Cat" => Dict("Curve" => (tb_multiline, ["Curve/1", "Curve/2"]))) log_custom_scalar(lg, layout) From 45f831e21570870e11825f34b5b2aeeebc456f15 Mon Sep 17 00:00:00 2001 From: Lior Blech Date: Tue, 20 Jun 2023 22:00:09 +0300 Subject: [PATCH 02/66] Upgrade to ProtoBuf v1.0.11 --- Project.toml | 6 +- gen/compile_proto.jl | 56 +- src/Deserialization/deserialization.jl | 37 +- src/Deserialization/histograms.jl | 9 +- src/Deserialization/images.jl | 6 +- src/Deserialization/lookahead.jl | 8 +- src/Deserialization/tensor.jl | 6 +- src/Loggers/LogAudio.jl | 6 +- src/Loggers/LogHistograms.jl | 37 +- src/Loggers/LogImage.jl | 12 +- src/Loggers/LogText.jl | 36 +- src/Loggers/LogValue.jl | 2 +- src/Optional/LogGraph.jl | 61 +- src/Optional/ValueHistories.jl | 1 - src/TBLogger.jl | 18 +- src/TensorBoardLogger.jl | 22 +- src/event.jl | 14 +- .../tensorboard/allocation_description_pb.jl | 52 - src/protojl/tensorboard/any_pb.jl | 44 - src/protojl/tensorboard/api_def_pb.jl | 237 ---- src/protojl/tensorboard/attr_value_pb.jl | 195 --- src/protojl/tensorboard/cluster_pb.jl | 121 -- src/protojl/tensorboard/config_pb.jl | 959 --------------- src/protojl/tensorboard/cost_graph_pb.jl | 234 ---- .../tensorboard/cpp_shape_inference_pb.jl | 165 --- src/protojl/tensorboard/debug_pb.jl | 174 --- src/protojl/tensorboard/event_pb.jl | 365 ------ src/protojl/tensorboard/function_pb.jl | 405 ------ src/protojl/tensorboard/google.jl | 7 - src/protojl/tensorboard/google/google.jl | 5 + .../tensorboard/google/protobuf/any_pb.jl | 44 + .../tensorboard/google/protobuf/protobuf.jl | 6 + .../google/protobuf/wrappers_pb.jl | 279 +++++ src/protojl/tensorboard/graph_pb.jl | 49 - src/protojl/tensorboard/meta_graph_pb.jl | 613 ---------- src/protojl/tensorboard/node_def_pb.jl | 131 -- src/protojl/tensorboard/op_def_pb.jl | 240 ---- .../plugins/custom_scalar/layout_pb.jl | 243 ---- .../plugins/custom_scalar/tensorboard.jl | 4 - .../custom_scalar/tensorboard/layout_pb.jl | 240 ++++ .../custom_scalar/tensorboard/tensorboard.jl | 5 + .../tensorboard/plugins/hparams/api_pb.jl | 659 ---------- .../tensorboard/plugins/hparams/google.jl | 7 - .../plugins/hparams/google/google.jl | 5 + .../hparams/google/protobuf/protobuf.jl | 5 + .../hparams/google/protobuf/struct_pb.jl | 145 +++ .../plugins/hparams/hparams_util_pb.jl | 157 --- .../plugins/hparams/plugin_data_pb.jl | 175 --- .../tensorboard/plugins/hparams/struct_pb.jl | 172 --- .../plugins/hparams/tensorboard.jl | 9 - .../hparams/tensorboard/hparams/api_pb.jl | 700 +++++++++++ .../hparams/tensorboard/hparams/hparams.jl | 9 + .../tensorboard/hparams/hparams_util_pb.jl | 98 ++ .../tensorboard/hparams/plugin_data_pb.jl | 155 +++ .../hparams/tensorboard/tensorboard.jl | 7 + .../plugins/text/plugin_data_pb.jl | 42 - .../tensorboard/plugins/text/tensorboard.jl | 4 - .../text/tensorboard/plugin_data_pb.jl | 38 + .../plugins/text/tensorboard/tensorboard.jl | 5 + src/protojl/tensorboard/resource_handle_pb.jl | 91 -- src/protojl/tensorboard/rewriter_config_pb.jl | 287 ----- .../tensorboard/saved_object_graph_pb.jl | 599 --------- src/protojl/tensorboard/saver_pb.jl | 60 - src/protojl/tensorboard/step_stats_pb.jl | 368 ------ src/protojl/tensorboard/struct_tb_pb.jl | 473 ------- src/protojl/tensorboard/summary_pb.jl | 362 ------ .../tensorboard/tensor_description_pb.jl | 47 - src/protojl/tensorboard/tensor_pb.jl | 117 -- src/protojl/tensorboard/tensor_shape_pb.jl | 84 -- src/protojl/tensorboard/tensorboard.jl | 39 - .../tensorboard/allocation_description_pb.jl | 68 ++ .../tensorboard/tensorboard/api_def_pb.jl | 275 +++++ .../tensorboard/tensorboard/attr_value_pb.jl | 216 ++++ .../tensorboard/tensorboard/cluster_pb.jl | 74 ++ .../tensorboard/tensorboard/config_pb.jl | 1083 +++++++++++++++++ .../tensorboard/coordination_config_pb.jl | 129 ++ .../tensorboard/tensorboard/cost_graph_pb.jl | 285 +++++ .../tensorboard/cpp_shape_inference_pb.jl | 161 +++ .../tensorboard/tensorboard/debug_pb.jl | 188 +++ .../tensorboard/tensorboard/event_pb.jl | 401 ++++++ .../tensorboard/tensorboard/full_type_pb.jl | 71 ++ .../tensorboard/tensorboard/function_pb.jl | 220 ++++ .../tensorboard/graph_debug_info_pb.jl | 128 ++ .../tensorboard/tensorboard/graph_pb.jl | 62 + .../tensorboard/tensorboard/histogram_pb.jl | 74 ++ .../tensorboard/tensorboard/meta_graph_pb.jl | 590 +++++++++ .../tensorboard/tensorboard/node_def_pb.jl | 110 ++ .../tensorboard/tensorboard/op_def_pb.jl | 320 +++++ .../tensorboard/resource_handle_pb.jl | 105 ++ .../tensorboard/rewriter_config_pb.jl | 361 ++++++ .../tensorboard/tensorboard/rpc_options_pb.jl | 68 ++ .../tensorboard/saved_object_graph_pb.jl | 630 ++++++++++ .../tensorboard/tensorboard/saver_pb.jl | 76 ++ .../tensorboard/tensorboard/step_stats_pb.jl | 399 ++++++ .../tensorboard/tensorboard/struct_tb_pb.jl | 471 +++++++ .../tensorboard/tensorboard/summary_pb.jl | 344 ++++++ .../tensorboard/tensor_description_pb.jl | 50 + .../tensorboard/tensorboard/tensor_pb.jl | 187 +++ .../tensorboard/tensor_shape_pb.jl | 80 ++ .../tensorboard/tensorboard/tensorboard.jl | 41 + .../tensorboard/tensorboard/tfprof_log_pb.jl | 627 ++++++++++ .../tensorboard/trackable_object_graph_pb.jl | 252 ++++ .../tensorboard/tensorboard/types_pb.jl | 40 + .../tensorboard/tensorboard/variable_pb.jl | 138 +++ .../tensorboard/verifier_config_pb.jl | 46 + .../tensorboard/tensorboard/versions_pb.jl | 50 + src/protojl/tensorboard/tfprof_log_pb.jl | 1023 ---------------- .../tensorboard/trackable_object_graph_pb.jl | 206 ---- src/protojl/tensorboard/types_pb.jl | 60 - src/protojl/tensorboard/variable_pb.jl | 117 -- src/protojl/tensorboard/verifier_config_pb.jl | 50 - src/protojl/tensorboard/versions_pb.jl | 47 - src/utils.jl | 10 +- test/runtests.jl | 20 +- 114 files changed, 10370 insertions(+), 9656 deletions(-) delete mode 100644 src/protojl/tensorboard/allocation_description_pb.jl delete mode 100644 src/protojl/tensorboard/any_pb.jl delete mode 100644 src/protojl/tensorboard/api_def_pb.jl delete mode 100644 src/protojl/tensorboard/attr_value_pb.jl delete mode 100644 src/protojl/tensorboard/cluster_pb.jl delete mode 100644 src/protojl/tensorboard/config_pb.jl delete mode 100644 src/protojl/tensorboard/cost_graph_pb.jl delete mode 100644 src/protojl/tensorboard/cpp_shape_inference_pb.jl delete mode 100644 src/protojl/tensorboard/debug_pb.jl delete mode 100644 src/protojl/tensorboard/event_pb.jl delete mode 100644 src/protojl/tensorboard/function_pb.jl delete mode 100644 src/protojl/tensorboard/google.jl create mode 100644 src/protojl/tensorboard/google/google.jl create mode 100644 src/protojl/tensorboard/google/protobuf/any_pb.jl create mode 100644 src/protojl/tensorboard/google/protobuf/protobuf.jl create mode 100644 src/protojl/tensorboard/google/protobuf/wrappers_pb.jl delete mode 100644 src/protojl/tensorboard/graph_pb.jl delete mode 100644 src/protojl/tensorboard/meta_graph_pb.jl delete mode 100644 src/protojl/tensorboard/node_def_pb.jl delete mode 100644 src/protojl/tensorboard/op_def_pb.jl delete mode 100644 src/protojl/tensorboard/plugins/custom_scalar/layout_pb.jl delete mode 100644 src/protojl/tensorboard/plugins/custom_scalar/tensorboard.jl create mode 100644 src/protojl/tensorboard/plugins/custom_scalar/tensorboard/layout_pb.jl create mode 100644 src/protojl/tensorboard/plugins/custom_scalar/tensorboard/tensorboard.jl delete mode 100644 src/protojl/tensorboard/plugins/hparams/api_pb.jl delete mode 100644 src/protojl/tensorboard/plugins/hparams/google.jl create mode 100644 src/protojl/tensorboard/plugins/hparams/google/google.jl create mode 100644 src/protojl/tensorboard/plugins/hparams/google/protobuf/protobuf.jl create mode 100644 src/protojl/tensorboard/plugins/hparams/google/protobuf/struct_pb.jl delete mode 100644 src/protojl/tensorboard/plugins/hparams/hparams_util_pb.jl delete mode 100644 src/protojl/tensorboard/plugins/hparams/plugin_data_pb.jl delete mode 100644 src/protojl/tensorboard/plugins/hparams/struct_pb.jl delete mode 100644 src/protojl/tensorboard/plugins/hparams/tensorboard.jl create mode 100644 src/protojl/tensorboard/plugins/hparams/tensorboard/hparams/api_pb.jl create mode 100644 src/protojl/tensorboard/plugins/hparams/tensorboard/hparams/hparams.jl create mode 100644 src/protojl/tensorboard/plugins/hparams/tensorboard/hparams/hparams_util_pb.jl create mode 100644 src/protojl/tensorboard/plugins/hparams/tensorboard/hparams/plugin_data_pb.jl create mode 100644 src/protojl/tensorboard/plugins/hparams/tensorboard/tensorboard.jl delete mode 100644 src/protojl/tensorboard/plugins/text/plugin_data_pb.jl delete mode 100644 src/protojl/tensorboard/plugins/text/tensorboard.jl create mode 100644 src/protojl/tensorboard/plugins/text/tensorboard/plugin_data_pb.jl create mode 100644 src/protojl/tensorboard/plugins/text/tensorboard/tensorboard.jl delete mode 100644 src/protojl/tensorboard/resource_handle_pb.jl delete mode 100644 src/protojl/tensorboard/rewriter_config_pb.jl delete mode 100644 src/protojl/tensorboard/saved_object_graph_pb.jl delete mode 100644 src/protojl/tensorboard/saver_pb.jl delete mode 100644 src/protojl/tensorboard/step_stats_pb.jl delete mode 100644 src/protojl/tensorboard/struct_tb_pb.jl delete mode 100644 src/protojl/tensorboard/summary_pb.jl delete mode 100644 src/protojl/tensorboard/tensor_description_pb.jl delete mode 100644 src/protojl/tensorboard/tensor_pb.jl delete mode 100644 src/protojl/tensorboard/tensor_shape_pb.jl delete mode 100644 src/protojl/tensorboard/tensorboard.jl create mode 100644 src/protojl/tensorboard/tensorboard/allocation_description_pb.jl create mode 100644 src/protojl/tensorboard/tensorboard/api_def_pb.jl create mode 100644 src/protojl/tensorboard/tensorboard/attr_value_pb.jl create mode 100644 src/protojl/tensorboard/tensorboard/cluster_pb.jl create mode 100644 src/protojl/tensorboard/tensorboard/config_pb.jl create mode 100644 src/protojl/tensorboard/tensorboard/coordination_config_pb.jl create mode 100644 src/protojl/tensorboard/tensorboard/cost_graph_pb.jl create mode 100644 src/protojl/tensorboard/tensorboard/cpp_shape_inference_pb.jl create mode 100644 src/protojl/tensorboard/tensorboard/debug_pb.jl create mode 100644 src/protojl/tensorboard/tensorboard/event_pb.jl create mode 100644 src/protojl/tensorboard/tensorboard/full_type_pb.jl create mode 100644 src/protojl/tensorboard/tensorboard/function_pb.jl create mode 100644 src/protojl/tensorboard/tensorboard/graph_debug_info_pb.jl create mode 100644 src/protojl/tensorboard/tensorboard/graph_pb.jl create mode 100644 src/protojl/tensorboard/tensorboard/histogram_pb.jl create mode 100644 src/protojl/tensorboard/tensorboard/meta_graph_pb.jl create mode 100644 src/protojl/tensorboard/tensorboard/node_def_pb.jl create mode 100644 src/protojl/tensorboard/tensorboard/op_def_pb.jl create mode 100644 src/protojl/tensorboard/tensorboard/resource_handle_pb.jl create mode 100644 src/protojl/tensorboard/tensorboard/rewriter_config_pb.jl create mode 100644 src/protojl/tensorboard/tensorboard/rpc_options_pb.jl create mode 100644 src/protojl/tensorboard/tensorboard/saved_object_graph_pb.jl create mode 100644 src/protojl/tensorboard/tensorboard/saver_pb.jl create mode 100644 src/protojl/tensorboard/tensorboard/step_stats_pb.jl create mode 100644 src/protojl/tensorboard/tensorboard/struct_tb_pb.jl create mode 100644 src/protojl/tensorboard/tensorboard/summary_pb.jl create mode 100644 src/protojl/tensorboard/tensorboard/tensor_description_pb.jl create mode 100644 src/protojl/tensorboard/tensorboard/tensor_pb.jl create mode 100644 src/protojl/tensorboard/tensorboard/tensor_shape_pb.jl create mode 100644 src/protojl/tensorboard/tensorboard/tensorboard.jl create mode 100644 src/protojl/tensorboard/tensorboard/tfprof_log_pb.jl create mode 100644 src/protojl/tensorboard/tensorboard/trackable_object_graph_pb.jl create mode 100644 src/protojl/tensorboard/tensorboard/types_pb.jl create mode 100644 src/protojl/tensorboard/tensorboard/variable_pb.jl create mode 100644 src/protojl/tensorboard/tensorboard/verifier_config_pb.jl create mode 100644 src/protojl/tensorboard/tensorboard/versions_pb.jl delete mode 100644 src/protojl/tensorboard/tfprof_log_pb.jl delete mode 100644 src/protojl/tensorboard/trackable_object_graph_pb.jl delete mode 100644 src/protojl/tensorboard/types_pb.jl delete mode 100644 src/protojl/tensorboard/variable_pb.jl delete mode 100644 src/protojl/tensorboard/verifier_config_pb.jl delete mode 100644 src/protojl/tensorboard/versions_pb.jl diff --git a/Project.toml b/Project.toml index f736e5f..2de19ca 100644 --- a/Project.toml +++ b/Project.toml @@ -14,10 +14,10 @@ StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" [compat] FileIO = "1.2.3" ImageCore = "0.8.1, 0.9" -ProtoBuf = "0.10, 0.11" +ProtoBuf = "0.10, 0.11, 1.0.11" Requires = "0.5, 1" -StatsBase = "0.27, 0.28, 0.29, 0.30, 0.31, 0.32, 0.33" -julia = "1.3" +StatsBase = "0.27, 0.28, 0.29, 0.30, 0.31, 0.32, 0.33, 0.34" +julia = "1.3, 1.9" [extras] Minio = "4281f0d9-7ae0-406e-9172-b7277c1efa20" diff --git a/gen/compile_proto.jl b/gen/compile_proto.jl index 15363d9..b1df237 100644 --- a/gen/compile_proto.jl +++ b/gen/compile_proto.jl @@ -21,63 +21,47 @@ pbpath =dirname(dirname(PosixPath(pathof(ProtoBuf))))/p"gen" cur_path = cwd() TBL_root = dirname(cur_path) -src_dir = cur_path/"proto" -out_dir = cur_path/"protojl" +# src_dir = cur_path/"proto" +src_dir = PosixPath(".")/"proto" +out_dir = cur_path/"protojl" ## Clean the output directory rm(out_dir, force=true, recursive=true) ## First module function process_module(cur_module::AbstractString; base_module::AbstractString=cur_module, input_path=cur_module) - # Include search paths - includes = [src_dir, src_dir/base_module] # Output folder - module_out_dir = out_dir/cur_module + module_out_dir = out_dir/cur_module # Input files - infiles = glob("*.proto", src_dir/input_path) + infiles = split.(string.(glob("*.proto", src_dir/input_path)), '/') .|> (a -> a[3:end]) .|> a -> joinpath(a...) mkpath(module_out_dir) - includes_str=["--proto_path=$path" for path=includes] - run(ProtoBuf.protoc(`$includes_str --julia_out=$module_out_dir $infiles`)) - - nothing + strip_currdir(str::String) = string(strip(str, ['.','/'])) + # relative_paths = string.(infiles) .|> strip_currdir + relative_paths = string.(infiles) + search_directories = joinpath(@__DIR__, "proto") + output_directory = string(module_out_dir) + # println("relative_paths=$relative_paths") + # println("search_directories=$search_directories") + # println("output_directory=$output_directory") + ProtoBuf.protojl(relative_paths ,search_directories ,output_directory) + files_to_include = [string(module_out_dir/basename(file)) for file in infiles] + return files_to_include end #process_module("tensorflow", input_path="tensorflow/core/protobuf") -process_module("tensorboard", input_path="tensorboard/compat/proto") +files_to_include = process_module("tensorboard", input_path="tensorboard/compat/proto") #plugins = ["audio", "custom_scalar", "hparams", "histogram", "image", "scalar", "text"] plugins = ["custom_scalar", "hparams", "text"] -for plugin in plugins - process_module("tensorboard/plugins/$plugin", base_module="tensorboard") -end +append!(files_to_include, (process_module("tensorboard/plugins/$plugin", base_module="tensorboard") for plugin in plugins)...) -## this fails but would be better -#cur_module = "tensorboard" -#base_module = cur_module -# -## Include search paths -#includes = [src_dir, src_dir/base_module] -# -## Output folder -#module_out_dir = out_dir/("$cur_module"*"2") -# -## Input files -#infiles = glob("*.proto", src_dir/cur_module/"compat/proto") -# -#for plugin in plugins -# plugin_proto_files = glob("*.proto", src_dir/cur_module/"plugins/$plugin") -# append!(infiles, plugin_proto_files) -#end -# -#mkpath(module_out_dir) -#includes_str=["--proto_path=$path" for path=includes] -#run(ProtoBuf.protoc(`$includes_str --julia_out=$module_out_dir $infiles`)) - +# files_to_include contains all the proto files, can be used for printing and inspection +println("generated code for \n$files_to_include") # Finally move the output directory to the src folder mv(out_dir, TBL_root/"src"/"protojl") diff --git a/src/Deserialization/deserialization.jl b/src/Deserialization/deserialization.jl index 146ae28..0d87795 100644 --- a/src/Deserialization/deserialization.jl +++ b/src/Deserialization/deserialization.jl @@ -49,7 +49,7 @@ function read_event(f::IO) @assert crc_data == crc_data_ck pb = PipeBuffer(data) - ev = readproto(pb, Event()) + ev = decode(ProtoDecoder(pb), Event) return ev end @@ -137,19 +137,9 @@ end Returns the type of a summary """ -function summary_type(summary) - if hasproperty(summary, :histo) - return :histo - elseif hasproperty(summary, :image) - return :image - elseif hasproperty(summary, :audio) - return :audio - elseif hasproperty(summary, :tensor) - return :tensor - #elseif hasproperty(summary, :simple_value) - end - # always defined - return :simple_value +function summary_type(summary::Summary_Value) + summary.value isa Nothing && error("Summary value of Nothing while deserializing") + return summary.value.name end """ @@ -193,24 +183,23 @@ SummaryDeserializingIterator(summ; smart=true) = function Base.iterate(iter::SummaryDeserializingIterator, state=1) evs = iter.summary res = iterate(evs, state) - res == nothing && return nothing + res isa Nothing && return nothing (tag, summary), i_state = res typ = summary_type(summary) - if typ === :histo val = deserialize_histogram_summary(summary) tag, val, state = lookahead_deserialize(tag, val, evs, state, :histo) elseif typ === :image val = deserialize_image_summary(summary) - tag, val, state = lookahead_deserialize(tag, val, evs, state, :image) + tag, val, state = lookahead_deserialize(tag, val, evs, state, :image) ## ??? ### The lookahead deserializer for images is broken. It is also not clear where this will actually be useful or intuitive for users elseif typ === :audio val = deserialize_audio_summary(summary) elseif typ === :tensor val = deserialize_tensor_summary(summary) elseif typ === :simple_value - val = summary.simple_value + val = summary.value tag, val, state = lookahead_deserialize(tag, val, evs, state, :simple_value) else @error "Event with unknown field" summary=summary @@ -254,16 +243,18 @@ function map_summaries(fun::Function, logdir; purge=true, tags=nothing, steps=no for event_file in TBEventFileCollectionIterator(logdir, purge=purge) for event in event_file - # if event.summary is not defined, don't bother processing this event, - # as it's probably a "start file" event or a graph event. - !hasproperty(event, :summary) && continue - + # if event.what contains no summary, don't bother processing this event + event.what isa Nothing && continue + !(event.what.value isa Summary) && continue step = event.step steps !== nothing && step ∉ steps && continue - iter = SummaryDeserializingIterator(event.summary, smart) + iter = SummaryDeserializingIterator(event.what.value, smart) + # fullnames = String[] for (name, val) in iter tags !== nothing && name ∉ tags && continue + # fullname = "$(name)_$(step)" + # fullname in fullnames ? continue : push!(fullnames, fullname) fun(name, step, val) end diff --git a/src/Deserialization/histograms.jl b/src/Deserialization/histograms.jl index b7b95f4..3126524 100644 --- a/src/Deserialization/histograms.jl +++ b/src/Deserialization/histograms.jl @@ -1,8 +1,9 @@ -function deserialize_histogram_summary(summary) +function deserialize_histogram_summary(summary::Summary_Value) # custom deserialization if hasproperty(summary, :metadata) + histo = summary.value.value if summary.metadata.plugin_data.plugin_name == TB_PLUGIN_JLARRAY_NAME - val = reshape(summary.histo.bucket, + val = reshape(histo.bucket, reinterpret(Int, summary.metadata.plugin_data.content)...) @@ -11,7 +12,7 @@ function deserialize_histogram_summary(summary) end # deserialize histogramproto - hist_proto = summary.histo + hist_proto = summary.value.value bin_edges = similar(hist_proto.bucket_limit, length(hist_proto.bucket_limit)+1) bin_edges[1] = hist_proto.min bin_edges[2:end] .= hist_proto.bucket_limit @@ -27,7 +28,7 @@ function lookahead_deserialize_histogram_summary(old_tag, old_val, evs::Summary, result = old_tag, old_val, state # iterate to the next element res = iterate(evs, state + 1) - res == nothing && return result + res isa Nothing && return result # if the next event is identified, check its type (new_tag, summary), i_state = res diff --git a/src/Deserialization/images.jl b/src/Deserialization/images.jl index 2b147e6..dccb4f3 100644 --- a/src/Deserialization/images.jl +++ b/src/Deserialization/images.jl @@ -1,5 +1,5 @@ -function deserialize_image_summary(summary) - img = summary.image +function deserialize_image_summary(summary::Summary_Value) + img = summary.value.value value = load(_format_stream(format"PNG", IOBuffer(img.encoded_image_string))) @@ -14,7 +14,7 @@ function lookahead_deserialize_image_summary(old_tag, old_val, evs::Summary, state = state_old + 1 iter_result = iterate(evs, state) - while iter_result !== nothing + while !(iter_result isa Nothing) ((tag, summary), state) = iter_result # iteration body typ = summary_type(summary) diff --git a/src/Deserialization/lookahead.jl b/src/Deserialization/lookahead.jl index 0b7a8a5..f7273ed 100644 --- a/src/Deserialization/lookahead.jl +++ b/src/Deserialization/lookahead.jl @@ -49,10 +49,10 @@ end function lookahead_deserialize_simple_value_summary(old_tag, old_val, evs::Summary, state) # prepare the default output (when no action is taken) - result = old_tag, old_val, state + result = old_tag, old_val.value, state # iterate to the next element res = iterate(evs, state + 1) - res == nothing && return result + res isa Nothing && return result # if the next event is identified, check its type (new_tag, summary), i_state = res @@ -60,8 +60,8 @@ function lookahead_deserialize_simple_value_summary(old_tag, old_val, evs::Summa # if types match, check tags. If they match, return modified structure if typ === :simple_value && tags_match_re_im(old_tag, new_tag) - val_im = summary.simple_value - result = new_tag[1:end-3], old_val + im*val_im, i_state - 1 + val_im = summary.value.value + result = new_tag[1:end-3], old_val.value + im*val_im, i_state - 1 else return result end diff --git a/src/Deserialization/tensor.jl b/src/Deserialization/tensor.jl index 270104b..8bbab10 100644 --- a/src/Deserialization/tensor.jl +++ b/src/Deserialization/tensor.jl @@ -1,4 +1,4 @@ -using .tensorboard: TextPluginData +using .tensorboard_plugin_text: TextPluginData function deserialize_tensor_summary(summary) metadata = summary.metadata @@ -15,8 +15,8 @@ function deserialize_tensor_summary(summary) end function deserialize_text_tensor(summary, sizes, names) - version_data = readproto(PipeBuffer(summary.metadata.plugin_data.content), - TextPluginData()) + version_data = decode(ProtoDecoder(PipeBuffer(summary.metadata.plugin_data.content)), + TextPluginData) tensor = summary.tensor strings = Array{String, length(sizes)}(undef, sizes...) diff --git a/src/Loggers/LogAudio.jl b/src/Loggers/LogAudio.jl index 51c13cf..3f51a13 100644 --- a/src/Loggers/LogAudio.jl +++ b/src/Loggers/LogAudio.jl @@ -1,4 +1,4 @@ -using .tensorboard: Summary_Audio +using .tensorboard: var"Summary.Audio" as Summary_Audio """ log_audios(logger::TBLogger, name::AbstractString, samples::AbstractArray, samplerate::Real; step=step(logger)) @@ -32,6 +32,6 @@ function audio_summary(name::AbstractString, samples::AbstractArray, samplerate: io = IOBuffer() save(_format_stream(format"WAV",io), samples) eas = io.data - audio = Summary_Audio(sample_rate = samplerate, num_channels = ndims(samples), length_frames = size(samples, 1), encoded_audio_string = eas, content_type = "audio/wav") - Summary_Value(tag=name, audio=audio) + audio = Summary_Audio(samplerate, ndims(samples), size(samples, 1), eas, "audio/wav") + Summary_Value(name, name, nothing, OneOf(:audio, audio)) end diff --git a/src/Loggers/LogHistograms.jl b/src/Loggers/LogHistograms.jl index 82f4da5..add2134 100644 --- a/src/Loggers/LogHistograms.jl +++ b/src/Loggers/LogHistograms.jl @@ -48,11 +48,16 @@ end function histogram_summary(name::AbstractString, hist::Histogram{T,1}) where T edges = first(hist.edges) hist_vals = hist.weights - - hp = HistogramProto(min=first(edges), max=last(edges), - bucket_limit=collect(edges[2:end]), - bucket=hist_vals) - return Summary_Value(tag=name, histo=hp) + num = length(hist_vals) + histsum = sum(hist_vals) + histsumsqr = sum(hist_vals.^2) + hp = HistogramProto(first(edges), last(edges), + num, + histsum, + histsumsqr, + collect(edges[2:end]), + hist_vals) + return Summary_Value(name, name, nothing, OneOf(:histo, hp)) end # Writes to an Histogram summary the flattened version of the array. @@ -60,15 +65,19 @@ end # reconstruct the original shape when read back into Julia function histogram_arr_summary(name::AbstractString, tensor::AbstractArray) - smpd = SummaryMetadata_PluginData(plugin_name=TB_PLUGIN_JLARRAY_NAME, - content=reinterpret(UInt8, collect(size(tensor)))) - sm = SummaryMetadata(plugin_data=smpd) - + smpd = SummaryMetadata_PluginData(TB_PLUGIN_JLARRAY_NAME, reinterpret(UInt8, collect(size(tensor)))) + sm = SummaryMetadata(smpd, name, "", DataClass.DATA_CLASS_TENSOR) - edges = collect(0:length(tensor)) - hp = HistogramProto(min=minimum(edges), max=maximum(edges), - bucket_limit=edges[2:end], - bucket=vec(tensor)) + num = length(tensor) + edges = collect(0:num) + histsum = sum(tensor) + histsumsqr = sum(tensor.^2) + hp = HistogramProto(minimum(edges), maximum(edges), + num, + histsum, + histsumsqr, + edges[2:end], + vec(tensor)) - return Summary_Value(tag=name, histo=hp, metadata=sm) + return Summary_Value(name, name, sm, OneOf(:histo, hp)) end diff --git a/src/Loggers/LogImage.jl b/src/Loggers/LogImage.jl index 8ed6b48..9cf2347 100644 --- a/src/Loggers/LogImage.jl +++ b/src/Loggers/LogImage.jl @@ -1,13 +1,13 @@ -using .tensorboard: Summary_Image +using .tensorboard: var"Summary.Image" as Summary_Image function image_summary(name::AbstractString, img::PngImage) attr = img.attr - imgsumm = Summary_Image(height = attr[:height], - width = attr[:width], - colorspace = attr[:colorspace], - encoded_image_string = img.data ) - return Summary_Value(tag = name, image = imgsumm) + imgsumm = Summary_Image(attr[:height], + attr[:width], + attr[:colorspace], + img.data ) + return Summary_Value(name, name, nothing, OneOf(:image, imgsumm)) end diff --git a/src/Loggers/LogText.jl b/src/Loggers/LogText.jl index 8537ab2..88d1bf2 100644 --- a/src/Loggers/LogText.jl +++ b/src/Loggers/LogText.jl @@ -1,4 +1,5 @@ -using .tensorboard: TextPluginData +using .tensorboard_plugin_text: TextPluginData +using .tensorboard: DataClass """ log_text(logger::TBLogger, name::String, text::Any; step=step(logger)) @@ -23,12 +24,12 @@ you should define this method so that you can serialize the name to string. function construct_tensor_dims(data::AbstractArray) dims = Vector{TensorShapeProto_Dim}() for dim in size(data) - push!(dims, TensorShapeProto_Dim(size = dim)) + push!(dims, TensorShapeProto_Dim(dim, "")) end return dims end -construct_tensor_dims(data) = [TensorShapeProto_Dim(size=1)] +construct_tensor_dims(data) = [TensorShapeProto_Dim(1, "")] function construct_tensor_string_val(data::AbstractArray) textstringval = Vector{Vector{UInt8}}() @@ -53,16 +54,33 @@ function text_summary(name::String, text::Any) # Structure holding the shape of the tensor dims = construct_tensor_dims(text) - texttensorshape = TensorShapeProto(dim = dims) + texttensorshape = TensorShapeProto(dims, false) # Metadata for the text - textcontent = serialize_proto(TextPluginData(version = 0)) - plugindata = SummaryMetadata_PluginData(plugin_name = "text", content = textcontent) - smd = SummaryMetadata(plugin_data = plugindata) + textcontent = serialize_proto(TextPluginData(0)) + plugindata = SummaryMetadata_PluginData("text", textcontent) + smd = SummaryMetadata(plugindata, name, "text", DataClass.DATA_CLASS_TENSOR) # Create the tensor - texttensor = TensorProto(dtype = _DataType.DT_STRING, string_val = textstringval, tensor_shape = texttensorshape) - Summary_Value(tag = name, metadata = smd, tensor = texttensor) + texttensor = TensorProto(_DataType.DT_STRING, + texttensorshape, + Int32(0), + Vector{UInt8}(), + Vector{Int32}(), + Vector{Float32}(), + Vector{Float64}(), + Vector{Int32}(), + textstringval, + Vector{Float32}(), + Vector{Int64}(), + Vector{Bool}(), + Vector{Float64}(), + Vector{ResourceHandleProto}(), + Vector{VariantTensorDataProto}(), + Vector{UInt32}(), + Vector{UInt64}(), + UInt8[]) + Summary_Value(name, name, smd, OneOf(:tensor, texttensor)) end """ diff --git a/src/Loggers/LogValue.jl b/src/Loggers/LogValue.jl index 91152e8..ff394f0 100644 --- a/src/Loggers/LogValue.jl +++ b/src/Loggers/LogValue.jl @@ -16,5 +16,5 @@ function log_value(logger::TBLogger, name::AbstractString, value::Complex; step= end function scalar_summary(name::AbstractString, value::Real) - Summary_Value(tag=name, simple_value=value) + Summary_Value(name, name, nothing, OneOf(:simple_value, Float32(value))) end diff --git a/src/Optional/LogGraph.jl b/src/Optional/LogGraph.jl index c0cbab5..f79690b 100644 --- a/src/Optional/LogGraph.jl +++ b/src/Optional/LogGraph.jl @@ -1,4 +1,5 @@ -using .tensorboard: NodeDef, AttrValue_ListValue, AttrValue, NameAttrList +using .tensorboard: NodeDef, AttrValue, NameAttrList +using .tensorboard: var"AttrValue.ListValue" as AttrValue_ListValue """ log_graph @@ -22,35 +23,59 @@ function graph_summary(g, nodelabel, nodeop, nodedevice, nodevalue) attr = Dict{String, AttrValue}() x = nodevalue[v] if isa(x, AbstractString) - attr["value"] = AttrValue(s = Vector{UInt8}(x)) - attr["dtype"] = AttrValue(_type = jltype2tf(typeof(x))) + attr["value"] = AttrValue(OneOf(:s, Vector{UInt8}(x))) + attr["dtype"] = AttrValue(OneOf(:_type,jltype2tf(typeof(x)))) elseif isa(x, Integer) - attr["value"] = AttrValue(i = Int64(x)) - attr["dtype"] = AttrValue(_type = jltype2tf(typeof(x))) + attr["value"] = AttrValue(OneOf(:i,Int64(x))) + attr["dtype"] = AttrValue(OneOf(:_type, jltype2tf(typeof(x)))) elseif isa(x, Real) - attr["value"] = AttrValue(f = Float32(x)) - attr["dtype"] = AttrValue(_type = jltype2tf(typeof(x))) + attr["value"] = AttrValue(OneOf(:f, Float32(x))) + attr["dtype"] = AttrValue(OneOf(:_type, jltype2tf(typeof(x)))) elseif isa(x, Bool) - attr["value"] = AttrValue(b = x) - attr["dtype"] = AttrValue(_type = jltype2tf(typeof(x))) + attr["value"] = AttrValue(OneOf(:b, x)) + attr["dtype"] = AttrValue(OneOf(:_type, jltype2tf(typeof(x)))) elseif isa(x, AbstractArray) - shape = TensorShapeProto(dim = [TensorShapeProto_Dim(size = d) for d in (collect(size(x)))]) + shape = TensorShapeProto([TensorShapeProto_Dim(d, "") for d in (collect(size(x)))], false) t = TensorProto(dtype = jltype2tf(eltype(x)), tensor_shape = shape, tensor_content = serialize_proto(string(x))) - attr["value"] = AttrValue(tensor = t) - attr["_output_shapes"] = AttrValue(list = AttrValue_ListValue(shape = [shape])) + attr["value"] = AttrValue(OneOf(:tensor, t)) + listvalue = AttrValue_ListValue(Vector{Vector{UInt8}}(), + Vector{Int64}(), + Vector{Float32}(), + Vector{Bool}(), + Vector{var"#DataType".T}(), + [shape], + Vector{TensorProto}(), + Vector{NameAttrList}()) + attr["_output_shapes"] = AttrValue(OneOf(:list, listvalue)) elseif isa(x, Tuple) - attr["value"] = AttrValue(list = AttrValue_ListValue(s = [Vector{UInt8}(repr(y)) for y in x])) - shape = TensorShapeProto(dim = [TensorShapeProto_Dim(size = length(x))]) - attr["_output_shapes"] = AttrValue(list = AttrValue_ListValue(shape = [shape])) + listvalue = AttrValue_ListValue([Vector{UInt8}(repr(y)) for y in x], + Vector{Int64}(), + Vector{Float32}(), + Vector{Bool}(), + Vector{var"#DataType".T}(), + Vector{TensorShapeProto}(), + Vector{TensorProto}(), + Vector{NameAttrList}()) + attr["value"] = AttrValue(OneOf(:list, listvalue)) + shape = TensorShapeProto([TensorShapeProto_Dim(length(x), "")], false) + listvalue = AttrValue_ListValue(Vector{Vector{UInt8}}(), + Vector{Int64}(), + Vector{Float32}(), + Vector{Bool}(), + Vector{var"#DataType".T}(), + [shape], + Vector{TensorProto}(), + Vector{NameAttrList}()) + attr["_output_shapes"] = AttrValue(OneOf(:list, listvalue)) elseif isa(x, Function) - attr["value"] = AttrValue(func = NameAttrList(name = repr(x))) + attr["value"] = AttrValue(OneOf(:func, NameAttrList(name = repr(x)))) else #donothing end - node = NodeDef(name = name, op = op, input = input, device = device, attr = attr) + node = NodeDef(name, op, input, device, attr, nothing, nothing) push!(nodes, node) end - GraphDef(node = nodes) + GraphDef(nodes, nothing, 0, nothing, nothing) end function jltype2tf(dtype::DataType) diff --git a/src/Optional/ValueHistories.jl b/src/Optional/ValueHistories.jl index 5bbe8d0..101896b 100644 --- a/src/Optional/ValueHistories.jl +++ b/src/Optional/ValueHistories.jl @@ -2,7 +2,6 @@ import .ValueHistories: MVHistory function Base.convert(::Type{MVHistory}, tbl::TBReadable; kwargs...) hist = MVHistory() - map_summaries(tbl; kwargs...) do tag, iter, val push!(hist, Symbol(tag), iter, val) end diff --git a/src/TBLogger.jl b/src/TBLogger.jl index cee5087..efa1bf2 100644 --- a/src/TBLogger.jl +++ b/src/TBLogger.jl @@ -118,14 +118,15 @@ function create_eventfile(logdir, purge_step=nothing, time=time(); prepend="") file = open(fpath, "w") # Create the initial log - if purge_step != nothing - ev_0 = Event(wall_time=time, step=purge_step, file_version="brain.Event:2") + source_metadata = Ref{Union{Nothing,SourceMetadata}}(nothing) + if !(purge_step isa Nothing) + ev_0 = Event(time, purge_step, OneOf(:file_version,"brain.Event:2"), source_metadata[]) write_event(file, ev_0) - sess_log = TensorBoardLogger.SessionLog(status=TensorBoardLogger.SessionLog_SessionStatus.START) - ev_0 = Event(wall_time=time, step=purge_step, session_log=sess_log) + sess_log = TensorBoardLogger.SessionLog(TensorBoardLogger.SessionLog_SessionStatus.START, logdir, "") + ev_0 = Event(time, purge_step, OneOf(:session_log, sess_log), source_metadata[]) write_event(file, ev_0) else - ev_0 = Event(wall_time=time, step=0, file_version="brain.Event:2") + ev_0 = Event(time, 0, OneOf(:file_version,"brain.Event:2"), source_metadata[]) write_event(file, ev_0) end return fname, file @@ -138,7 +139,7 @@ Adds an event file to `lg` with `path` prepended to its name. It can be used to create sub-event collection in a single event collection. """ function add_eventfile(lg::TBLogger, path="") - fname, file = create_eventfile(logdir(lg), prepend=path) + fname, file = create_eventfile(logdir(lg); prepend=path) lg.all_files[fname] = file return fname end @@ -196,7 +197,10 @@ set_step_increment!(lg::TBLogger, Δstep) = lg.step_increment = Δstep Increments the step counter in the logger by `Δ_Step` and returns the new value. """ -increment_step!(lg::TBLogger, Δ_Step) = lg.global_step += Δ_Step +function increment_step!(lg::TBLogger, Δ_Step) + lg.global_step += Δ_Step + return lg.global_step +end """ step(lg) -> Int diff --git a/src/TensorBoardLogger.jl b/src/TensorBoardLogger.jl index 0c04916..758d74d 100644 --- a/src/TensorBoardLogger.jl +++ b/src/TensorBoardLogger.jl @@ -1,6 +1,6 @@ module TensorBoardLogger -using ProtoBuf: readproto, writeproto, ProtoType +using ProtoBuf: decode, encode, ProtoDecoder, ProtoEncoder, OneOf using CRC32c using ImageCore: colorview, channelview @@ -37,10 +37,22 @@ export TBText, TBVector, TBHistogram, TBImage, TBImages, TBAudio, TBAudios include("FileIO_workaround.jl") # Protobuffer definitions for tensorboard -include("protojl/tensorboard/tensorboard.jl") -using .tensorboard: Summary_Value, GraphDef, Summary, Event, SessionLog_SessionStatus, SessionLog -using .tensorboard: TensorShapeProto_Dim, TensorShapeProto, TextPluginData -using .tensorboard: TensorProto, SummaryMetadata, SummaryMetadata_PluginData, _DataType +include("protojl/tensorboard/tensorboard/tensorboard.jl") +using .tensorboard: GraphDef, Summary, Event, SessionLog, TensorShapeProto, SourceMetadata, ResourceHandleProto +using .tensorboard: var"Summary.Value" as Summary_Value +using .tensorboard: var"SessionLog.SessionStatus" as SessionLog_SessionStatus +using .tensorboard: var"TensorShapeProto.Dim" as TensorShapeProto_Dim +using .tensorboard: var"#DataType" as _DataType +using .tensorboard: TensorProto, VariantTensorDataProto, DataClass, SummaryMetadata +using .tensorboard: var"SummaryMetadata.PluginData" as SummaryMetadata_PluginData +using .tensorboard: var"AttrValue.ListValue" as AttrValue_ListValue + +include("protojl/tensorboard/plugins/text/tensorboard/tensorboard.jl") +using .tensorboard_plugin_text: TextPluginData +include("protojl/tensorboard/plugins/hparams/tensorboard/tensorboard.jl") +using .tensorboard_plugin_hparams +include("protojl/tensorboard/plugins/custom_scalar/tensorboard/tensorboard.jl") +using .tensorboard_plugin_custom_scalar include("PNG.jl") using .PNGImage diff --git a/src/event.jl b/src/event.jl index f9122f1..25c4811 100644 --- a/src/event.jl +++ b/src/event.jl @@ -1,18 +1,20 @@ # Create summary for Summary_value (default constructor by # protobuf is broken). -SummaryCollection(;kwargs...) = Summary(value=Vector{Summary_Value}(); kwargs...) -SummaryCollection(summaries::Vector{Summary_Value}; kwargs...) = Summary(value=summaries; kwargs...) -SummaryCollection(summary::Summary_Value; kwargs...) = Summary(value=[summary]; kwargs...) +SummaryCollection(;kwargs...) = Summary(Vector{Summary_Value}(); kwargs...) +SummaryCollection(summaries::Vector{Summary_Value}; kwargs...) = Summary(summaries; kwargs...) +SummaryCollection(summary::Summary_Value; kwargs...) = Summary([summary]; kwargs...) SummaryCollection(summary::GraphDef; kwargs...) = summary # TODO Clean up this nothing crazyness function make_event(logger::TBLogger, summary::Summary; step=TensorBoardLogger.step(logger)) step = typeof(step) == Nothing ? TensorBoardLogger.step(logger) : step - return Event(wall_time=time(), summary=summary, step=step) + source_metadata=Ref{Union{Nothing, SourceMetadata}}(nothing) + return Event(time(), step, OneOf(:summary, summary), source_metadata[]) end function make_event(logger::TBLogger, summary::GraphDef; step=TensorBoardLogger.step(logger)) step = typeof(step) == Nothing ? TensorBoardLogger.step(logger) : step - Event(wall_time=time(), graph_def=serialize_proto(summary), step=step) + source_metadata=Ref{Union{Nothing, SourceMetadata}}(nothing) + Event(time(), step, OneOf(:graph_def, serialize_proto(summary)), source_metadata[]) end """ @@ -28,7 +30,7 @@ format. The format follows the following rule (in bytes) """ function write_event(out::IO, event::Event) data = PipeBuffer(); - _writeproto(data, event) + encode(ProtoEncoder(data), event) #header header = collect(reinterpret(UInt8, [data.size])) diff --git a/src/protojl/tensorboard/allocation_description_pb.jl b/src/protojl/tensorboard/allocation_description_pb.jl deleted file mode 100644 index e6e26a3..0000000 --- a/src/protojl/tensorboard/allocation_description_pb.jl +++ /dev/null @@ -1,52 +0,0 @@ -# syntax: proto3 -using ProtoBuf -import ProtoBuf.meta - -mutable struct AllocationDescription <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function AllocationDescription(; kwargs...) - obj = new(meta(AllocationDescription), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct AllocationDescription -const __meta_AllocationDescription = Ref{ProtoMeta}() -function meta(::Type{AllocationDescription}) - ProtoBuf.metalock() do - if !isassigned(__meta_AllocationDescription) - __meta_AllocationDescription[] = target = ProtoMeta(AllocationDescription) - allflds = Pair{Symbol,Union{Type,String}}[:requested_bytes => Int64, :allocated_bytes => Int64, :allocator_name => AbstractString, :allocation_id => Int64, :has_single_reference => Bool, :ptr => UInt64] - meta(target, AllocationDescription, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_AllocationDescription[] - end -end -function Base.getproperty(obj::AllocationDescription, name::Symbol) - if name === :requested_bytes - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :allocated_bytes - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :allocator_name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :allocation_id - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :has_single_reference - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :ptr - return (obj.__protobuf_jl_internal_values[name])::UInt64 - else - getfield(obj, name) - end -end - -export AllocationDescription diff --git a/src/protojl/tensorboard/any_pb.jl b/src/protojl/tensorboard/any_pb.jl deleted file mode 100644 index 0d6f3af..0000000 --- a/src/protojl/tensorboard/any_pb.jl +++ /dev/null @@ -1,44 +0,0 @@ -# syntax: proto3 -using ProtoBuf -import ProtoBuf.meta - -mutable struct _Any <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function _Any(; kwargs...) - obj = new(meta(_Any), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct _Any -const __meta__Any = Ref{ProtoMeta}() -function meta(::Type{_Any}) - ProtoBuf.metalock() do - if !isassigned(__meta__Any) - __meta__Any[] = target = ProtoMeta(_Any) - allflds = Pair{Symbol,Union{Type,String}}[:type_url => AbstractString, :value => Vector{UInt8}] - meta(target, _Any, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta__Any[] - end -end -function Base.getproperty(obj::_Any, name::Symbol) - if name === :type_url - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :value - return (obj.__protobuf_jl_internal_values[name])::Vector{UInt8} - else - getfield(obj, name) - end -end - -export _Any diff --git a/src/protojl/tensorboard/api_def_pb.jl b/src/protojl/tensorboard/api_def_pb.jl deleted file mode 100644 index 8bedc3f..0000000 --- a/src/protojl/tensorboard/api_def_pb.jl +++ /dev/null @@ -1,237 +0,0 @@ -# syntax: proto3 -using ProtoBuf -import ProtoBuf.meta - -const ApiDef_Visibility = (;[ - Symbol("DEFAULT_VISIBILITY") => Int32(0), - Symbol("VISIBLE") => Int32(1), - Symbol("SKIP") => Int32(2), - Symbol("HIDDEN") => Int32(3), -]...) - -mutable struct ApiDef_Endpoint <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function ApiDef_Endpoint(; kwargs...) - obj = new(meta(ApiDef_Endpoint), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct ApiDef_Endpoint -const __meta_ApiDef_Endpoint = Ref{ProtoMeta}() -function meta(::Type{ApiDef_Endpoint}) - ProtoBuf.metalock() do - if !isassigned(__meta_ApiDef_Endpoint) - __meta_ApiDef_Endpoint[] = target = ProtoMeta(ApiDef_Endpoint) - fnum = Int[1,3,4] - allflds = Pair{Symbol,Union{Type,String}}[:name => AbstractString, :deprecated => Bool, :deprecation_version => Int32] - meta(target, ApiDef_Endpoint, allflds, ProtoBuf.DEF_REQ, fnum, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_ApiDef_Endpoint[] - end -end -function Base.getproperty(obj::ApiDef_Endpoint, name::Symbol) - if name === :name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :deprecated - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :deprecation_version - return (obj.__protobuf_jl_internal_values[name])::Int32 - else - getfield(obj, name) - end -end - -mutable struct ApiDef_Arg <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function ApiDef_Arg(; kwargs...) - obj = new(meta(ApiDef_Arg), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct ApiDef_Arg -const __meta_ApiDef_Arg = Ref{ProtoMeta}() -function meta(::Type{ApiDef_Arg}) - ProtoBuf.metalock() do - if !isassigned(__meta_ApiDef_Arg) - __meta_ApiDef_Arg[] = target = ProtoMeta(ApiDef_Arg) - allflds = Pair{Symbol,Union{Type,String}}[:name => AbstractString, :rename_to => AbstractString, :description => AbstractString] - meta(target, ApiDef_Arg, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_ApiDef_Arg[] - end -end -function Base.getproperty(obj::ApiDef_Arg, name::Symbol) - if name === :name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :rename_to - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :description - return (obj.__protobuf_jl_internal_values[name])::AbstractString - else - getfield(obj, name) - end -end - -mutable struct ApiDef_Attr <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function ApiDef_Attr(; kwargs...) - obj = new(meta(ApiDef_Attr), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct ApiDef_Attr -const __meta_ApiDef_Attr = Ref{ProtoMeta}() -function meta(::Type{ApiDef_Attr}) - ProtoBuf.metalock() do - if !isassigned(__meta_ApiDef_Attr) - __meta_ApiDef_Attr[] = target = ProtoMeta(ApiDef_Attr) - allflds = Pair{Symbol,Union{Type,String}}[:name => AbstractString, :rename_to => AbstractString, :default_value => AttrValue, :description => AbstractString] - meta(target, ApiDef_Attr, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_ApiDef_Attr[] - end -end -function Base.getproperty(obj::ApiDef_Attr, name::Symbol) - if name === :name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :rename_to - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :default_value - return (obj.__protobuf_jl_internal_values[name])::AttrValue - elseif name === :description - return (obj.__protobuf_jl_internal_values[name])::AbstractString - else - getfield(obj, name) - end -end - -mutable struct ApiDef <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function ApiDef(; kwargs...) - obj = new(meta(ApiDef), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct ApiDef -const __meta_ApiDef = Ref{ProtoMeta}() -function meta(::Type{ApiDef}) - ProtoBuf.metalock() do - if !isassigned(__meta_ApiDef) - __meta_ApiDef[] = target = ProtoMeta(ApiDef) - fnum = Int[1,12,13,2,3,4,5,11,6,7,8,9,10] - allflds = Pair{Symbol,Union{Type,String}}[:graph_op_name => AbstractString, :deprecation_message => AbstractString, :deprecation_version => Int32, :visibility => Int32, :endpoint => Base.Vector{ApiDef_Endpoint}, :in_arg => Base.Vector{ApiDef_Arg}, :out_arg => Base.Vector{ApiDef_Arg}, :arg_order => Base.Vector{AbstractString}, :attr => Base.Vector{ApiDef_Attr}, :summary => AbstractString, :description => AbstractString, :description_prefix => AbstractString, :description_suffix => AbstractString] - meta(target, ApiDef, allflds, ProtoBuf.DEF_REQ, fnum, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_ApiDef[] - end -end -function Base.getproperty(obj::ApiDef, name::Symbol) - if name === :graph_op_name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :deprecation_message - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :deprecation_version - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :visibility - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :endpoint - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{ApiDef_Endpoint} - elseif name === :in_arg - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{ApiDef_Arg} - elseif name === :out_arg - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{ApiDef_Arg} - elseif name === :arg_order - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{AbstractString} - elseif name === :attr - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{ApiDef_Attr} - elseif name === :summary - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :description - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :description_prefix - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :description_suffix - return (obj.__protobuf_jl_internal_values[name])::AbstractString - else - getfield(obj, name) - end -end - -mutable struct ApiDefs <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function ApiDefs(; kwargs...) - obj = new(meta(ApiDefs), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct ApiDefs -const __meta_ApiDefs = Ref{ProtoMeta}() -function meta(::Type{ApiDefs}) - ProtoBuf.metalock() do - if !isassigned(__meta_ApiDefs) - __meta_ApiDefs[] = target = ProtoMeta(ApiDefs) - allflds = Pair{Symbol,Union{Type,String}}[:op => Base.Vector{ApiDef}] - meta(target, ApiDefs, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_ApiDefs[] - end -end -function Base.getproperty(obj::ApiDefs, name::Symbol) - if name === :op - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{ApiDef} - else - getfield(obj, name) - end -end - -export ApiDef_Visibility, ApiDef_Endpoint, ApiDef_Arg, ApiDef_Attr, ApiDef, ApiDefs diff --git a/src/protojl/tensorboard/attr_value_pb.jl b/src/protojl/tensorboard/attr_value_pb.jl deleted file mode 100644 index b502342..0000000 --- a/src/protojl/tensorboard/attr_value_pb.jl +++ /dev/null @@ -1,195 +0,0 @@ -# syntax: proto3 -using ProtoBuf -import ProtoBuf.meta - -mutable struct AttrValue_ListValue <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function AttrValue_ListValue(; kwargs...) - obj = new(meta(AttrValue_ListValue), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct AttrValue_ListValue (has cyclic type dependency) -const __meta_AttrValue_ListValue = Ref{ProtoMeta}() -function meta(::Type{AttrValue_ListValue}) - ProtoBuf.metalock() do - if !isassigned(__meta_AttrValue_ListValue) - __meta_AttrValue_ListValue[] = target = ProtoMeta(AttrValue_ListValue) - fnum = Int[2,3,4,5,6,7,8,9] - pack = Symbol[:i,:f,:b,:_type] - allflds = Pair{Symbol,Union{Type,String}}[:s => Base.Vector{Vector{UInt8}}, :i => Base.Vector{Int64}, :f => Base.Vector{Float32}, :b => Base.Vector{Bool}, :_type => Base.Vector{Int32}, :shape => Base.Vector{TensorShapeProto}, :tensor => Base.Vector{TensorProto}, :func => "Base.Vector{NameAttrList}"] - meta(target, AttrValue_ListValue, allflds, ProtoBuf.DEF_REQ, fnum, ProtoBuf.DEF_VAL, pack, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_AttrValue_ListValue[] - end -end -function Base.getproperty(obj::AttrValue_ListValue, name::Symbol) - if name === :s - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Vector{UInt8}} - elseif name === :i - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Int64} - elseif name === :f - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Float32} - elseif name === :b - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Bool} - elseif name === :_type - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Int32} - elseif name === :shape - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{TensorShapeProto} - elseif name === :tensor - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{TensorProto} - elseif name === :func - return (obj.__protobuf_jl_internal_values[name])::Any - else - getfield(obj, name) - end -end - -mutable struct AttrValue <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function AttrValue(; kwargs...) - obj = new(meta(AttrValue), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct AttrValue (has cyclic type dependency) -const __meta_AttrValue = Ref{ProtoMeta}() -function meta(::Type{AttrValue}) - ProtoBuf.metalock() do - if !isassigned(__meta_AttrValue) - __meta_AttrValue[] = target = ProtoMeta(AttrValue) - fnum = Int[2,3,4,5,6,7,8,1,10,9] - allflds = Pair{Symbol,Union{Type,String}}[:s => Vector{UInt8}, :i => Int64, :f => Float32, :b => Bool, :_type => Int32, :shape => TensorShapeProto, :tensor => TensorProto, :list => AttrValue_ListValue, :func => "NameAttrList", :placeholder => AbstractString] - oneofs = Int[1,1,1,1,1,1,1,1,1,1] - oneof_names = Symbol[Symbol("value")] - meta(target, AttrValue, allflds, ProtoBuf.DEF_REQ, fnum, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, oneofs, oneof_names) - end - __meta_AttrValue[] - end -end -function Base.getproperty(obj::AttrValue, name::Symbol) - if name === :s - return (obj.__protobuf_jl_internal_values[name])::Vector{UInt8} - elseif name === :i - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :f - return (obj.__protobuf_jl_internal_values[name])::Float32 - elseif name === :b - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :_type - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :shape - return (obj.__protobuf_jl_internal_values[name])::TensorShapeProto - elseif name === :tensor - return (obj.__protobuf_jl_internal_values[name])::TensorProto - elseif name === :list - return (obj.__protobuf_jl_internal_values[name])::AttrValue_ListValue - elseif name === :func - return (obj.__protobuf_jl_internal_values[name])::Any - elseif name === :placeholder - return (obj.__protobuf_jl_internal_values[name])::AbstractString - else - getfield(obj, name) - end -end - -mutable struct NameAttrList_AttrEntry <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function NameAttrList_AttrEntry(; kwargs...) - obj = new(meta(NameAttrList_AttrEntry), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct NameAttrList_AttrEntry (mapentry) (has cyclic type dependency) -const __meta_NameAttrList_AttrEntry = Ref{ProtoMeta}() -function meta(::Type{NameAttrList_AttrEntry}) - ProtoBuf.metalock() do - if !isassigned(__meta_NameAttrList_AttrEntry) - __meta_NameAttrList_AttrEntry[] = target = ProtoMeta(NameAttrList_AttrEntry) - allflds = Pair{Symbol,Union{Type,String}}[:key => AbstractString, :value => AttrValue] - meta(target, NameAttrList_AttrEntry, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_NameAttrList_AttrEntry[] - end -end -function Base.getproperty(obj::NameAttrList_AttrEntry, name::Symbol) - if name === :key - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :value - return (obj.__protobuf_jl_internal_values[name])::AttrValue - else - getfield(obj, name) - end -end - -mutable struct NameAttrList <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function NameAttrList(; kwargs...) - obj = new(meta(NameAttrList), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct NameAttrList (has cyclic type dependency) -const __meta_NameAttrList = Ref{ProtoMeta}() -function meta(::Type{NameAttrList}) - ProtoBuf.metalock() do - if !isassigned(__meta_NameAttrList) - __meta_NameAttrList[] = target = ProtoMeta(NameAttrList) - allflds = Pair{Symbol,Union{Type,String}}[:name => AbstractString, :attr => "Base.Dict{AbstractString,AttrValue}"] - meta(target, NameAttrList, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_NameAttrList[] - end -end -function Base.getproperty(obj::NameAttrList, name::Symbol) - if name === :name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :attr - return (obj.__protobuf_jl_internal_values[name])::Any - else - getfield(obj, name) - end -end - -export AttrValue_ListValue, AttrValue, NameAttrList_AttrEntry, NameAttrList, AttrValue_ListValue, AttrValue, NameAttrList_AttrEntry, NameAttrList -# mapentries: "NameAttrList_AttrEntry" => ("AbstractString", "AttrValue") diff --git a/src/protojl/tensorboard/cluster_pb.jl b/src/protojl/tensorboard/cluster_pb.jl deleted file mode 100644 index 8ffbee9..0000000 --- a/src/protojl/tensorboard/cluster_pb.jl +++ /dev/null @@ -1,121 +0,0 @@ -# syntax: proto3 -using ProtoBuf -import ProtoBuf.meta - -mutable struct JobDef_TasksEntry <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function JobDef_TasksEntry(; kwargs...) - obj = new(meta(JobDef_TasksEntry), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct JobDef_TasksEntry (mapentry) -const __meta_JobDef_TasksEntry = Ref{ProtoMeta}() -function meta(::Type{JobDef_TasksEntry}) - ProtoBuf.metalock() do - if !isassigned(__meta_JobDef_TasksEntry) - __meta_JobDef_TasksEntry[] = target = ProtoMeta(JobDef_TasksEntry) - allflds = Pair{Symbol,Union{Type,String}}[:key => Int32, :value => AbstractString] - meta(target, JobDef_TasksEntry, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_JobDef_TasksEntry[] - end -end -function Base.getproperty(obj::JobDef_TasksEntry, name::Symbol) - if name === :key - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :value - return (obj.__protobuf_jl_internal_values[name])::AbstractString - else - getfield(obj, name) - end -end - -mutable struct JobDef <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function JobDef(; kwargs...) - obj = new(meta(JobDef), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct JobDef -const __meta_JobDef = Ref{ProtoMeta}() -function meta(::Type{JobDef}) - ProtoBuf.metalock() do - if !isassigned(__meta_JobDef) - __meta_JobDef[] = target = ProtoMeta(JobDef) - allflds = Pair{Symbol,Union{Type,String}}[:name => AbstractString, :tasks => Base.Dict{Int32,AbstractString}] - meta(target, JobDef, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_JobDef[] - end -end -function Base.getproperty(obj::JobDef, name::Symbol) - if name === :name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :tasks - return (obj.__protobuf_jl_internal_values[name])::Base.Dict{Int32,AbstractString} - else - getfield(obj, name) - end -end - -mutable struct ClusterDef <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function ClusterDef(; kwargs...) - obj = new(meta(ClusterDef), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct ClusterDef -const __meta_ClusterDef = Ref{ProtoMeta}() -function meta(::Type{ClusterDef}) - ProtoBuf.metalock() do - if !isassigned(__meta_ClusterDef) - __meta_ClusterDef[] = target = ProtoMeta(ClusterDef) - allflds = Pair{Symbol,Union{Type,String}}[:job => Base.Vector{JobDef}] - meta(target, ClusterDef, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_ClusterDef[] - end -end -function Base.getproperty(obj::ClusterDef, name::Symbol) - if name === :job - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{JobDef} - else - getfield(obj, name) - end -end - -export JobDef_TasksEntry, JobDef, ClusterDef -# mapentries: "JobDef_TasksEntry" => ("Int32", "AbstractString") diff --git a/src/protojl/tensorboard/config_pb.jl b/src/protojl/tensorboard/config_pb.jl deleted file mode 100644 index 7634620..0000000 --- a/src/protojl/tensorboard/config_pb.jl +++ /dev/null @@ -1,959 +0,0 @@ -# syntax: proto3 -using ProtoBuf -import ProtoBuf.meta - -mutable struct GPUOptions_Experimental_VirtualDevices <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function GPUOptions_Experimental_VirtualDevices(; kwargs...) - obj = new(meta(GPUOptions_Experimental_VirtualDevices), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct GPUOptions_Experimental_VirtualDevices -const __meta_GPUOptions_Experimental_VirtualDevices = Ref{ProtoMeta}() -function meta(::Type{GPUOptions_Experimental_VirtualDevices}) - ProtoBuf.metalock() do - if !isassigned(__meta_GPUOptions_Experimental_VirtualDevices) - __meta_GPUOptions_Experimental_VirtualDevices[] = target = ProtoMeta(GPUOptions_Experimental_VirtualDevices) - pack = Symbol[:memory_limit_mb,:priority] - allflds = Pair{Symbol,Union{Type,String}}[:memory_limit_mb => Base.Vector{Float32}, :priority => Base.Vector{Int32}] - meta(target, GPUOptions_Experimental_VirtualDevices, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, pack, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_GPUOptions_Experimental_VirtualDevices[] - end -end -function Base.getproperty(obj::GPUOptions_Experimental_VirtualDevices, name::Symbol) - if name === :memory_limit_mb - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Float32} - elseif name === :priority - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Int32} - else - getfield(obj, name) - end -end - -mutable struct GPUOptions_Experimental <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function GPUOptions_Experimental(; kwargs...) - obj = new(meta(GPUOptions_Experimental), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct GPUOptions_Experimental -const __meta_GPUOptions_Experimental = Ref{ProtoMeta}() -function meta(::Type{GPUOptions_Experimental}) - ProtoBuf.metalock() do - if !isassigned(__meta_GPUOptions_Experimental) - __meta_GPUOptions_Experimental[] = target = ProtoMeta(GPUOptions_Experimental) - fnum = Int[1,2,3,4,5,7,8,9] - allflds = Pair{Symbol,Union{Type,String}}[:virtual_devices => Base.Vector{GPUOptions_Experimental_VirtualDevices}, :use_unified_memory => Bool, :num_dev_to_dev_copy_streams => Int32, :collective_ring_order => AbstractString, :timestamped_allocator => Bool, :kernel_tracker_max_interval => Int32, :kernel_tracker_max_bytes => Int32, :kernel_tracker_max_pending => Int32] - meta(target, GPUOptions_Experimental, allflds, ProtoBuf.DEF_REQ, fnum, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_GPUOptions_Experimental[] - end -end -function Base.getproperty(obj::GPUOptions_Experimental, name::Symbol) - if name === :virtual_devices - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{GPUOptions_Experimental_VirtualDevices} - elseif name === :use_unified_memory - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :num_dev_to_dev_copy_streams - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :collective_ring_order - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :timestamped_allocator - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :kernel_tracker_max_interval - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :kernel_tracker_max_bytes - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :kernel_tracker_max_pending - return (obj.__protobuf_jl_internal_values[name])::Int32 - else - getfield(obj, name) - end -end - -mutable struct GPUOptions <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function GPUOptions(; kwargs...) - obj = new(meta(GPUOptions), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct GPUOptions -const __meta_GPUOptions = Ref{ProtoMeta}() -function meta(::Type{GPUOptions}) - ProtoBuf.metalock() do - if !isassigned(__meta_GPUOptions) - __meta_GPUOptions[] = target = ProtoMeta(GPUOptions) - fnum = Int[1,4,2,3,5,6,7,8,9] - allflds = Pair{Symbol,Union{Type,String}}[:per_process_gpu_memory_fraction => Float64, :allow_growth => Bool, :allocator_type => AbstractString, :deferred_deletion_bytes => Int64, :visible_device_list => AbstractString, :polling_active_delay_usecs => Int32, :polling_inactive_delay_msecs => Int32, :force_gpu_compatible => Bool, :experimental => GPUOptions_Experimental] - meta(target, GPUOptions, allflds, ProtoBuf.DEF_REQ, fnum, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_GPUOptions[] - end -end -function Base.getproperty(obj::GPUOptions, name::Symbol) - if name === :per_process_gpu_memory_fraction - return (obj.__protobuf_jl_internal_values[name])::Float64 - elseif name === :allow_growth - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :allocator_type - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :deferred_deletion_bytes - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :visible_device_list - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :polling_active_delay_usecs - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :polling_inactive_delay_msecs - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :force_gpu_compatible - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :experimental - return (obj.__protobuf_jl_internal_values[name])::GPUOptions_Experimental - else - getfield(obj, name) - end -end - -const OptimizerOptions_Level = (;[ - Symbol("L1") => Int32(0), - Symbol("L0") => Int32(-1), -]...) - -const OptimizerOptions_GlobalJitLevel = (;[ - Symbol("DEFAULT") => Int32(0), - Symbol("OFF") => Int32(-1), - Symbol("ON_1") => Int32(1), - Symbol("ON_2") => Int32(2), -]...) - -mutable struct OptimizerOptions <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function OptimizerOptions(; kwargs...) - obj = new(meta(OptimizerOptions), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct OptimizerOptions -const __meta_OptimizerOptions = Ref{ProtoMeta}() -function meta(::Type{OptimizerOptions}) - ProtoBuf.metalock() do - if !isassigned(__meta_OptimizerOptions) - __meta_OptimizerOptions[] = target = ProtoMeta(OptimizerOptions) - fnum = Int[1,2,6,4,3,5] - allflds = Pair{Symbol,Union{Type,String}}[:do_common_subexpression_elimination => Bool, :do_constant_folding => Bool, :max_folded_constant_in_bytes => Int64, :do_function_inlining => Bool, :opt_level => Int32, :global_jit_level => Int32] - meta(target, OptimizerOptions, allflds, ProtoBuf.DEF_REQ, fnum, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_OptimizerOptions[] - end -end -function Base.getproperty(obj::OptimizerOptions, name::Symbol) - if name === :do_common_subexpression_elimination - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :do_constant_folding - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :max_folded_constant_in_bytes - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :do_function_inlining - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :opt_level - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :global_jit_level - return (obj.__protobuf_jl_internal_values[name])::Int32 - else - getfield(obj, name) - end -end - -mutable struct GraphOptions <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function GraphOptions(; kwargs...) - obj = new(meta(GraphOptions), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct GraphOptions -const __meta_GraphOptions = Ref{ProtoMeta}() -function meta(::Type{GraphOptions}) - ProtoBuf.metalock() do - if !isassigned(__meta_GraphOptions) - __meta_GraphOptions[] = target = ProtoMeta(GraphOptions) - fnum = Int[2,3,4,9,5,6,7,8,10] - allflds = Pair{Symbol,Union{Type,String}}[:enable_recv_scheduling => Bool, :optimizer_options => OptimizerOptions, :build_cost_model => Int64, :build_cost_model_after => Int64, :infer_shapes => Bool, :place_pruned_graph => Bool, :enable_bfloat16_sendrecv => Bool, :timeline_step => Int32, :rewrite_options => RewriterConfig] - meta(target, GraphOptions, allflds, ProtoBuf.DEF_REQ, fnum, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_GraphOptions[] - end -end -function Base.getproperty(obj::GraphOptions, name::Symbol) - if name === :enable_recv_scheduling - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :optimizer_options - return (obj.__protobuf_jl_internal_values[name])::OptimizerOptions - elseif name === :build_cost_model - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :build_cost_model_after - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :infer_shapes - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :place_pruned_graph - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :enable_bfloat16_sendrecv - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :timeline_step - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :rewrite_options - return (obj.__protobuf_jl_internal_values[name])::RewriterConfig - else - getfield(obj, name) - end -end - -mutable struct ThreadPoolOptionProto <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function ThreadPoolOptionProto(; kwargs...) - obj = new(meta(ThreadPoolOptionProto), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct ThreadPoolOptionProto -const __meta_ThreadPoolOptionProto = Ref{ProtoMeta}() -function meta(::Type{ThreadPoolOptionProto}) - ProtoBuf.metalock() do - if !isassigned(__meta_ThreadPoolOptionProto) - __meta_ThreadPoolOptionProto[] = target = ProtoMeta(ThreadPoolOptionProto) - allflds = Pair{Symbol,Union{Type,String}}[:num_threads => Int32, :global_name => AbstractString] - meta(target, ThreadPoolOptionProto, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_ThreadPoolOptionProto[] - end -end -function Base.getproperty(obj::ThreadPoolOptionProto, name::Symbol) - if name === :num_threads - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :global_name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - else - getfield(obj, name) - end -end - -mutable struct RPCOptions <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function RPCOptions(; kwargs...) - obj = new(meta(RPCOptions), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct RPCOptions -const __meta_RPCOptions = Ref{ProtoMeta}() -function meta(::Type{RPCOptions}) - ProtoBuf.metalock() do - if !isassigned(__meta_RPCOptions) - __meta_RPCOptions[] = target = ProtoMeta(RPCOptions) - allflds = Pair{Symbol,Union{Type,String}}[:use_rpc_for_inprocess_master => Bool, :compression_algorithm => AbstractString, :compression_level => Int32, :cache_rpc_response => Bool, :disable_session_connection_sharing => Bool] - meta(target, RPCOptions, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_RPCOptions[] - end -end -function Base.getproperty(obj::RPCOptions, name::Symbol) - if name === :use_rpc_for_inprocess_master - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :compression_algorithm - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :compression_level - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :cache_rpc_response - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :disable_session_connection_sharing - return (obj.__protobuf_jl_internal_values[name])::Bool - else - getfield(obj, name) - end -end - -mutable struct SessionMetadata <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function SessionMetadata(; kwargs...) - obj = new(meta(SessionMetadata), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct SessionMetadata -const __meta_SessionMetadata = Ref{ProtoMeta}() -function meta(::Type{SessionMetadata}) - ProtoBuf.metalock() do - if !isassigned(__meta_SessionMetadata) - __meta_SessionMetadata[] = target = ProtoMeta(SessionMetadata) - allflds = Pair{Symbol,Union{Type,String}}[:name => AbstractString, :version => Int64] - meta(target, SessionMetadata, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_SessionMetadata[] - end -end -function Base.getproperty(obj::SessionMetadata, name::Symbol) - if name === :name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :version - return (obj.__protobuf_jl_internal_values[name])::Int64 - else - getfield(obj, name) - end -end - -mutable struct ConfigProto_DeviceCountEntry <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function ConfigProto_DeviceCountEntry(; kwargs...) - obj = new(meta(ConfigProto_DeviceCountEntry), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct ConfigProto_DeviceCountEntry (mapentry) -const __meta_ConfigProto_DeviceCountEntry = Ref{ProtoMeta}() -function meta(::Type{ConfigProto_DeviceCountEntry}) - ProtoBuf.metalock() do - if !isassigned(__meta_ConfigProto_DeviceCountEntry) - __meta_ConfigProto_DeviceCountEntry[] = target = ProtoMeta(ConfigProto_DeviceCountEntry) - allflds = Pair{Symbol,Union{Type,String}}[:key => AbstractString, :value => Int32] - meta(target, ConfigProto_DeviceCountEntry, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_ConfigProto_DeviceCountEntry[] - end -end -function Base.getproperty(obj::ConfigProto_DeviceCountEntry, name::Symbol) - if name === :key - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :value - return (obj.__protobuf_jl_internal_values[name])::Int32 - else - getfield(obj, name) - end -end - -const ConfigProto_Experimental_MlirBridgeRollout = (;[ - Symbol("MLIR_BRIDGE_ROLLOUT_UNSPECIFIED") => Int32(0), - Symbol("MLIR_BRIDGE_ROLLOUT_ENABLED") => Int32(1), - Symbol("MLIR_BRIDGE_ROLLOUT_DISABLED") => Int32(2), -]...) - -mutable struct ConfigProto_Experimental <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function ConfigProto_Experimental(; kwargs...) - obj = new(meta(ConfigProto_Experimental), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct ConfigProto_Experimental -const __meta_ConfigProto_Experimental = Ref{ProtoMeta}() -function meta(::Type{ConfigProto_Experimental}) - ProtoBuf.metalock() do - if !isassigned(__meta_ConfigProto_Experimental) - __meta_ConfigProto_Experimental[] = target = ProtoMeta(ConfigProto_Experimental) - fnum = Int[1,3,4,5,6,7,8,9,10,11,12,13,17,16,14,15] - allflds = Pair{Symbol,Union{Type,String}}[:collective_group_leader => AbstractString, :executor_type => AbstractString, :recv_buf_max_chunk => Int32, :use_numa_affinity => Bool, :collective_deterministic_sequential_execution => Bool, :collective_nccl => Bool, :share_session_state_in_clusterspec_propagation => Bool, :disable_thread_spinning => Bool, :share_cluster_devices_in_session => Bool, :session_metadata => SessionMetadata, :optimize_for_static_graph => Bool, :enable_mlir_bridge => Bool, :mlir_bridge_rollout => Int32, :enable_mlir_graph_optimization => Bool, :disable_output_partition_graphs => Bool, :xla_fusion_autotuner_thresh => Int64] - meta(target, ConfigProto_Experimental, allflds, ProtoBuf.DEF_REQ, fnum, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_ConfigProto_Experimental[] - end -end -function Base.getproperty(obj::ConfigProto_Experimental, name::Symbol) - if name === :collective_group_leader - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :executor_type - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :recv_buf_max_chunk - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :use_numa_affinity - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :collective_deterministic_sequential_execution - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :collective_nccl - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :share_session_state_in_clusterspec_propagation - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :disable_thread_spinning - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :share_cluster_devices_in_session - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :session_metadata - return (obj.__protobuf_jl_internal_values[name])::SessionMetadata - elseif name === :optimize_for_static_graph - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :enable_mlir_bridge - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :mlir_bridge_rollout - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :enable_mlir_graph_optimization - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :disable_output_partition_graphs - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :xla_fusion_autotuner_thresh - return (obj.__protobuf_jl_internal_values[name])::Int64 - else - getfield(obj, name) - end -end - -mutable struct ConfigProto <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function ConfigProto(; kwargs...) - obj = new(meta(ConfigProto), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct ConfigProto -const __meta_ConfigProto = Ref{ProtoMeta}() -function meta(::Type{ConfigProto}) - ProtoBuf.metalock() do - if !isassigned(__meta_ConfigProto) - __meta_ConfigProto[] = target = ProtoMeta(ConfigProto) - fnum = Int[1,2,5,9,12,3,4,6,7,8,10,11,13,14,15,17,16] - allflds = Pair{Symbol,Union{Type,String}}[:device_count => Base.Dict{AbstractString,Int32}, :intra_op_parallelism_threads => Int32, :inter_op_parallelism_threads => Int32, :use_per_session_threads => Bool, :session_inter_op_thread_pool => Base.Vector{ThreadPoolOptionProto}, :placement_period => Int32, :device_filters => Base.Vector{AbstractString}, :gpu_options => GPUOptions, :allow_soft_placement => Bool, :log_device_placement => Bool, :graph_options => GraphOptions, :operation_timeout_in_ms => Int64, :rpc_options => RPCOptions, :cluster_def => ClusterDef, :isolate_session_state => Bool, :share_cluster_devices_in_session => Bool, :experimental => ConfigProto_Experimental] - meta(target, ConfigProto, allflds, ProtoBuf.DEF_REQ, fnum, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_ConfigProto[] - end -end -function Base.getproperty(obj::ConfigProto, name::Symbol) - if name === :device_count - return (obj.__protobuf_jl_internal_values[name])::Base.Dict{AbstractString,Int32} - elseif name === :intra_op_parallelism_threads - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :inter_op_parallelism_threads - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :use_per_session_threads - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :session_inter_op_thread_pool - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{ThreadPoolOptionProto} - elseif name === :placement_period - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :device_filters - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{AbstractString} - elseif name === :gpu_options - return (obj.__protobuf_jl_internal_values[name])::GPUOptions - elseif name === :allow_soft_placement - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :log_device_placement - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :graph_options - return (obj.__protobuf_jl_internal_values[name])::GraphOptions - elseif name === :operation_timeout_in_ms - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :rpc_options - return (obj.__protobuf_jl_internal_values[name])::RPCOptions - elseif name === :cluster_def - return (obj.__protobuf_jl_internal_values[name])::ClusterDef - elseif name === :isolate_session_state - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :share_cluster_devices_in_session - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :experimental - return (obj.__protobuf_jl_internal_values[name])::ConfigProto_Experimental - else - getfield(obj, name) - end -end - -const RunOptions_TraceLevel = (;[ - Symbol("NO_TRACE") => Int32(0), - Symbol("SOFTWARE_TRACE") => Int32(1), - Symbol("HARDWARE_TRACE") => Int32(2), - Symbol("FULL_TRACE") => Int32(3), -]...) - -mutable struct RunOptions_Experimental_RunHandlerPoolOptions <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function RunOptions_Experimental_RunHandlerPoolOptions(; kwargs...) - obj = new(meta(RunOptions_Experimental_RunHandlerPoolOptions), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct RunOptions_Experimental_RunHandlerPoolOptions -const __meta_RunOptions_Experimental_RunHandlerPoolOptions = Ref{ProtoMeta}() -function meta(::Type{RunOptions_Experimental_RunHandlerPoolOptions}) - ProtoBuf.metalock() do - if !isassigned(__meta_RunOptions_Experimental_RunHandlerPoolOptions) - __meta_RunOptions_Experimental_RunHandlerPoolOptions[] = target = ProtoMeta(RunOptions_Experimental_RunHandlerPoolOptions) - allflds = Pair{Symbol,Union{Type,String}}[:priority => Int64] - meta(target, RunOptions_Experimental_RunHandlerPoolOptions, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_RunOptions_Experimental_RunHandlerPoolOptions[] - end -end -function Base.getproperty(obj::RunOptions_Experimental_RunHandlerPoolOptions, name::Symbol) - if name === :priority - return (obj.__protobuf_jl_internal_values[name])::Int64 - else - getfield(obj, name) - end -end - -mutable struct RunOptions_Experimental <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function RunOptions_Experimental(; kwargs...) - obj = new(meta(RunOptions_Experimental), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct RunOptions_Experimental -const __meta_RunOptions_Experimental = Ref{ProtoMeta}() -function meta(::Type{RunOptions_Experimental}) - ProtoBuf.metalock() do - if !isassigned(__meta_RunOptions_Experimental) - __meta_RunOptions_Experimental[] = target = ProtoMeta(RunOptions_Experimental) - allflds = Pair{Symbol,Union{Type,String}}[:collective_graph_key => Int64, :use_run_handler_pool => Bool, :run_handler_pool_options => RunOptions_Experimental_RunHandlerPoolOptions] - meta(target, RunOptions_Experimental, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_RunOptions_Experimental[] - end -end -function Base.getproperty(obj::RunOptions_Experimental, name::Symbol) - if name === :collective_graph_key - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :use_run_handler_pool - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :run_handler_pool_options - return (obj.__protobuf_jl_internal_values[name])::RunOptions_Experimental_RunHandlerPoolOptions - else - getfield(obj, name) - end -end - -mutable struct RunOptions <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function RunOptions(; kwargs...) - obj = new(meta(RunOptions), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct RunOptions -const __meta_RunOptions = Ref{ProtoMeta}() -function meta(::Type{RunOptions}) - ProtoBuf.metalock() do - if !isassigned(__meta_RunOptions) - __meta_RunOptions[] = target = ProtoMeta(RunOptions) - fnum = Int[1,2,3,5,6,7,8] - allflds = Pair{Symbol,Union{Type,String}}[:trace_level => Int32, :timeout_in_ms => Int64, :inter_op_thread_pool => Int32, :output_partition_graphs => Bool, :debug_options => DebugOptions, :report_tensor_allocations_upon_oom => Bool, :experimental => RunOptions_Experimental] - meta(target, RunOptions, allflds, ProtoBuf.DEF_REQ, fnum, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_RunOptions[] - end -end -function Base.getproperty(obj::RunOptions, name::Symbol) - if name === :trace_level - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :timeout_in_ms - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :inter_op_thread_pool - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :output_partition_graphs - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :debug_options - return (obj.__protobuf_jl_internal_values[name])::DebugOptions - elseif name === :report_tensor_allocations_upon_oom - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :experimental - return (obj.__protobuf_jl_internal_values[name])::RunOptions_Experimental - else - getfield(obj, name) - end -end - -mutable struct RunMetadata_FunctionGraphs <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function RunMetadata_FunctionGraphs(; kwargs...) - obj = new(meta(RunMetadata_FunctionGraphs), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct RunMetadata_FunctionGraphs -const __meta_RunMetadata_FunctionGraphs = Ref{ProtoMeta}() -function meta(::Type{RunMetadata_FunctionGraphs}) - ProtoBuf.metalock() do - if !isassigned(__meta_RunMetadata_FunctionGraphs) - __meta_RunMetadata_FunctionGraphs[] = target = ProtoMeta(RunMetadata_FunctionGraphs) - allflds = Pair{Symbol,Union{Type,String}}[:partition_graphs => Base.Vector{GraphDef}, :pre_optimization_graph => GraphDef, :post_optimization_graph => GraphDef] - meta(target, RunMetadata_FunctionGraphs, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_RunMetadata_FunctionGraphs[] - end -end -function Base.getproperty(obj::RunMetadata_FunctionGraphs, name::Symbol) - if name === :partition_graphs - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{GraphDef} - elseif name === :pre_optimization_graph - return (obj.__protobuf_jl_internal_values[name])::GraphDef - elseif name === :post_optimization_graph - return (obj.__protobuf_jl_internal_values[name])::GraphDef - else - getfield(obj, name) - end -end - -mutable struct RunMetadata <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function RunMetadata(; kwargs...) - obj = new(meta(RunMetadata), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct RunMetadata -const __meta_RunMetadata = Ref{ProtoMeta}() -function meta(::Type{RunMetadata}) - ProtoBuf.metalock() do - if !isassigned(__meta_RunMetadata) - __meta_RunMetadata[] = target = ProtoMeta(RunMetadata) - allflds = Pair{Symbol,Union{Type,String}}[:step_stats => StepStats, :cost_graph => CostGraphDef, :partition_graphs => Base.Vector{GraphDef}, :function_graphs => Base.Vector{RunMetadata_FunctionGraphs}] - meta(target, RunMetadata, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_RunMetadata[] - end -end -function Base.getproperty(obj::RunMetadata, name::Symbol) - if name === :step_stats - return (obj.__protobuf_jl_internal_values[name])::StepStats - elseif name === :cost_graph - return (obj.__protobuf_jl_internal_values[name])::CostGraphDef - elseif name === :partition_graphs - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{GraphDef} - elseif name === :function_graphs - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{RunMetadata_FunctionGraphs} - else - getfield(obj, name) - end -end - -mutable struct TensorConnection <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function TensorConnection(; kwargs...) - obj = new(meta(TensorConnection), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct TensorConnection -const __meta_TensorConnection = Ref{ProtoMeta}() -function meta(::Type{TensorConnection}) - ProtoBuf.metalock() do - if !isassigned(__meta_TensorConnection) - __meta_TensorConnection[] = target = ProtoMeta(TensorConnection) - allflds = Pair{Symbol,Union{Type,String}}[:from_tensor => AbstractString, :to_tensor => AbstractString] - meta(target, TensorConnection, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_TensorConnection[] - end -end -function Base.getproperty(obj::TensorConnection, name::Symbol) - if name === :from_tensor - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :to_tensor - return (obj.__protobuf_jl_internal_values[name])::AbstractString - else - getfield(obj, name) - end -end - -mutable struct CallableOptions_FeedDevicesEntry <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function CallableOptions_FeedDevicesEntry(; kwargs...) - obj = new(meta(CallableOptions_FeedDevicesEntry), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct CallableOptions_FeedDevicesEntry (mapentry) -const __meta_CallableOptions_FeedDevicesEntry = Ref{ProtoMeta}() -function meta(::Type{CallableOptions_FeedDevicesEntry}) - ProtoBuf.metalock() do - if !isassigned(__meta_CallableOptions_FeedDevicesEntry) - __meta_CallableOptions_FeedDevicesEntry[] = target = ProtoMeta(CallableOptions_FeedDevicesEntry) - allflds = Pair{Symbol,Union{Type,String}}[:key => AbstractString, :value => AbstractString] - meta(target, CallableOptions_FeedDevicesEntry, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_CallableOptions_FeedDevicesEntry[] - end -end -function Base.getproperty(obj::CallableOptions_FeedDevicesEntry, name::Symbol) - if name === :key - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :value - return (obj.__protobuf_jl_internal_values[name])::AbstractString - else - getfield(obj, name) - end -end - -mutable struct CallableOptions_FetchDevicesEntry <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function CallableOptions_FetchDevicesEntry(; kwargs...) - obj = new(meta(CallableOptions_FetchDevicesEntry), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct CallableOptions_FetchDevicesEntry (mapentry) -const __meta_CallableOptions_FetchDevicesEntry = Ref{ProtoMeta}() -function meta(::Type{CallableOptions_FetchDevicesEntry}) - ProtoBuf.metalock() do - if !isassigned(__meta_CallableOptions_FetchDevicesEntry) - __meta_CallableOptions_FetchDevicesEntry[] = target = ProtoMeta(CallableOptions_FetchDevicesEntry) - allflds = Pair{Symbol,Union{Type,String}}[:key => AbstractString, :value => AbstractString] - meta(target, CallableOptions_FetchDevicesEntry, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_CallableOptions_FetchDevicesEntry[] - end -end -function Base.getproperty(obj::CallableOptions_FetchDevicesEntry, name::Symbol) - if name === :key - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :value - return (obj.__protobuf_jl_internal_values[name])::AbstractString - else - getfield(obj, name) - end -end - -mutable struct CallableOptions <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function CallableOptions(; kwargs...) - obj = new(meta(CallableOptions), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct CallableOptions -const __meta_CallableOptions = Ref{ProtoMeta}() -function meta(::Type{CallableOptions}) - ProtoBuf.metalock() do - if !isassigned(__meta_CallableOptions) - __meta_CallableOptions[] = target = ProtoMeta(CallableOptions) - allflds = Pair{Symbol,Union{Type,String}}[:feed => Base.Vector{AbstractString}, :fetch => Base.Vector{AbstractString}, :target => Base.Vector{AbstractString}, :run_options => RunOptions, :tensor_connection => Base.Vector{TensorConnection}, :feed_devices => Base.Dict{AbstractString,AbstractString}, :fetch_devices => Base.Dict{AbstractString,AbstractString}, :fetch_skip_sync => Bool] - meta(target, CallableOptions, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_CallableOptions[] - end -end -function Base.getproperty(obj::CallableOptions, name::Symbol) - if name === :feed - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{AbstractString} - elseif name === :fetch - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{AbstractString} - elseif name === :target - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{AbstractString} - elseif name === :run_options - return (obj.__protobuf_jl_internal_values[name])::RunOptions - elseif name === :tensor_connection - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{TensorConnection} - elseif name === :feed_devices - return (obj.__protobuf_jl_internal_values[name])::Base.Dict{AbstractString,AbstractString} - elseif name === :fetch_devices - return (obj.__protobuf_jl_internal_values[name])::Base.Dict{AbstractString,AbstractString} - elseif name === :fetch_skip_sync - return (obj.__protobuf_jl_internal_values[name])::Bool - else - getfield(obj, name) - end -end - -export GPUOptions_Experimental_VirtualDevices, GPUOptions_Experimental, GPUOptions, OptimizerOptions_Level, OptimizerOptions_GlobalJitLevel, OptimizerOptions, GraphOptions, ThreadPoolOptionProto, RPCOptions, SessionMetadata, ConfigProto_DeviceCountEntry, ConfigProto_Experimental_MlirBridgeRollout, ConfigProto_Experimental, ConfigProto, RunOptions_TraceLevel, RunOptions_Experimental_RunHandlerPoolOptions, RunOptions_Experimental, RunOptions, RunMetadata_FunctionGraphs, RunMetadata, TensorConnection, CallableOptions_FeedDevicesEntry, CallableOptions_FetchDevicesEntry, CallableOptions -# mapentries: "CallableOptions_FeedDevicesEntry" => ("AbstractString", "AbstractString"), "CallableOptions_FetchDevicesEntry" => ("AbstractString", "AbstractString"), "ConfigProto_DeviceCountEntry" => ("AbstractString", "Int32") diff --git a/src/protojl/tensorboard/cost_graph_pb.jl b/src/protojl/tensorboard/cost_graph_pb.jl deleted file mode 100644 index 5fee5c2..0000000 --- a/src/protojl/tensorboard/cost_graph_pb.jl +++ /dev/null @@ -1,234 +0,0 @@ -# syntax: proto3 -using ProtoBuf -import ProtoBuf.meta - -mutable struct CostGraphDef_Node_InputInfo <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function CostGraphDef_Node_InputInfo(; kwargs...) - obj = new(meta(CostGraphDef_Node_InputInfo), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct CostGraphDef_Node_InputInfo -const __meta_CostGraphDef_Node_InputInfo = Ref{ProtoMeta}() -function meta(::Type{CostGraphDef_Node_InputInfo}) - ProtoBuf.metalock() do - if !isassigned(__meta_CostGraphDef_Node_InputInfo) - __meta_CostGraphDef_Node_InputInfo[] = target = ProtoMeta(CostGraphDef_Node_InputInfo) - allflds = Pair{Symbol,Union{Type,String}}[:preceding_node => Int32, :preceding_port => Int32] - meta(target, CostGraphDef_Node_InputInfo, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_CostGraphDef_Node_InputInfo[] - end -end -function Base.getproperty(obj::CostGraphDef_Node_InputInfo, name::Symbol) - if name === :preceding_node - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :preceding_port - return (obj.__protobuf_jl_internal_values[name])::Int32 - else - getfield(obj, name) - end -end - -mutable struct CostGraphDef_Node_OutputInfo <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function CostGraphDef_Node_OutputInfo(; kwargs...) - obj = new(meta(CostGraphDef_Node_OutputInfo), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct CostGraphDef_Node_OutputInfo -const __meta_CostGraphDef_Node_OutputInfo = Ref{ProtoMeta}() -function meta(::Type{CostGraphDef_Node_OutputInfo}) - ProtoBuf.metalock() do - if !isassigned(__meta_CostGraphDef_Node_OutputInfo) - __meta_CostGraphDef_Node_OutputInfo[] = target = ProtoMeta(CostGraphDef_Node_OutputInfo) - allflds = Pair{Symbol,Union{Type,String}}[:size => Int64, :alias_input_port => Int64, :shape => TensorShapeProto, :dtype => Int32] - meta(target, CostGraphDef_Node_OutputInfo, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_CostGraphDef_Node_OutputInfo[] - end -end -function Base.getproperty(obj::CostGraphDef_Node_OutputInfo, name::Symbol) - if name === :size - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :alias_input_port - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :shape - return (obj.__protobuf_jl_internal_values[name])::TensorShapeProto - elseif name === :dtype - return (obj.__protobuf_jl_internal_values[name])::Int32 - else - getfield(obj, name) - end -end - -mutable struct CostGraphDef_Node <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function CostGraphDef_Node(; kwargs...) - obj = new(meta(CostGraphDef_Node), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct CostGraphDef_Node -const __meta_CostGraphDef_Node = Ref{ProtoMeta}() -function meta(::Type{CostGraphDef_Node}) - ProtoBuf.metalock() do - if !isassigned(__meta_CostGraphDef_Node) - __meta_CostGraphDef_Node[] = target = ProtoMeta(CostGraphDef_Node) - fnum = Int[1,2,3,4,5,6,12,10,11,16,9,14,15,7,8,17] - pack = Symbol[:control_input] - allflds = Pair{Symbol,Union{Type,String}}[:name => AbstractString, :device => AbstractString, :id => Int32, :input_info => Base.Vector{CostGraphDef_Node_InputInfo}, :output_info => Base.Vector{CostGraphDef_Node_OutputInfo}, :temporary_memory_size => Int64, :persistent_memory_size => Int64, :host_temp_memory_size => Int64, :device_temp_memory_size => Int64, :device_persistent_memory_size => Int64, :compute_cost => Int64, :compute_time => Int64, :memory_time => Int64, :is_final => Bool, :control_input => Base.Vector{Int32}, :inaccurate => Bool] - meta(target, CostGraphDef_Node, allflds, ProtoBuf.DEF_REQ, fnum, ProtoBuf.DEF_VAL, pack, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_CostGraphDef_Node[] - end -end -function Base.getproperty(obj::CostGraphDef_Node, name::Symbol) - if name === :name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :device - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :id - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :input_info - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{CostGraphDef_Node_InputInfo} - elseif name === :output_info - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{CostGraphDef_Node_OutputInfo} - elseif name === :temporary_memory_size - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :persistent_memory_size - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :host_temp_memory_size - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :device_temp_memory_size - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :device_persistent_memory_size - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :compute_cost - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :compute_time - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :memory_time - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :is_final - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :control_input - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Int32} - elseif name === :inaccurate - return (obj.__protobuf_jl_internal_values[name])::Bool - else - getfield(obj, name) - end -end - -mutable struct CostGraphDef_AggregatedCost <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function CostGraphDef_AggregatedCost(; kwargs...) - obj = new(meta(CostGraphDef_AggregatedCost), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct CostGraphDef_AggregatedCost -const __meta_CostGraphDef_AggregatedCost = Ref{ProtoMeta}() -function meta(::Type{CostGraphDef_AggregatedCost}) - ProtoBuf.metalock() do - if !isassigned(__meta_CostGraphDef_AggregatedCost) - __meta_CostGraphDef_AggregatedCost[] = target = ProtoMeta(CostGraphDef_AggregatedCost) - allflds = Pair{Symbol,Union{Type,String}}[:cost => Float32, :dimension => AbstractString] - meta(target, CostGraphDef_AggregatedCost, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_CostGraphDef_AggregatedCost[] - end -end -function Base.getproperty(obj::CostGraphDef_AggregatedCost, name::Symbol) - if name === :cost - return (obj.__protobuf_jl_internal_values[name])::Float32 - elseif name === :dimension - return (obj.__protobuf_jl_internal_values[name])::AbstractString - else - getfield(obj, name) - end -end - -mutable struct CostGraphDef <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function CostGraphDef(; kwargs...) - obj = new(meta(CostGraphDef), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct CostGraphDef -const __meta_CostGraphDef = Ref{ProtoMeta}() -function meta(::Type{CostGraphDef}) - ProtoBuf.metalock() do - if !isassigned(__meta_CostGraphDef) - __meta_CostGraphDef[] = target = ProtoMeta(CostGraphDef) - allflds = Pair{Symbol,Union{Type,String}}[:node => Base.Vector{CostGraphDef_Node}, :cost => Base.Vector{CostGraphDef_AggregatedCost}] - meta(target, CostGraphDef, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_CostGraphDef[] - end -end -function Base.getproperty(obj::CostGraphDef, name::Symbol) - if name === :node - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{CostGraphDef_Node} - elseif name === :cost - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{CostGraphDef_AggregatedCost} - else - getfield(obj, name) - end -end - -export CostGraphDef_Node_InputInfo, CostGraphDef_Node_OutputInfo, CostGraphDef_Node, CostGraphDef_AggregatedCost, CostGraphDef diff --git a/src/protojl/tensorboard/cpp_shape_inference_pb.jl b/src/protojl/tensorboard/cpp_shape_inference_pb.jl deleted file mode 100644 index 5c6acef..0000000 --- a/src/protojl/tensorboard/cpp_shape_inference_pb.jl +++ /dev/null @@ -1,165 +0,0 @@ -# syntax: proto3 -using ProtoBuf -import ProtoBuf.meta - -mutable struct CppShapeInferenceResult_HandleShapeAndType <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function CppShapeInferenceResult_HandleShapeAndType(; kwargs...) - obj = new(meta(CppShapeInferenceResult_HandleShapeAndType), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct CppShapeInferenceResult_HandleShapeAndType -const __meta_CppShapeInferenceResult_HandleShapeAndType = Ref{ProtoMeta}() -function meta(::Type{CppShapeInferenceResult_HandleShapeAndType}) - ProtoBuf.metalock() do - if !isassigned(__meta_CppShapeInferenceResult_HandleShapeAndType) - __meta_CppShapeInferenceResult_HandleShapeAndType[] = target = ProtoMeta(CppShapeInferenceResult_HandleShapeAndType) - allflds = Pair{Symbol,Union{Type,String}}[:shape => TensorShapeProto, :dtype => Int32, :specialized_type => Int32] - meta(target, CppShapeInferenceResult_HandleShapeAndType, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_CppShapeInferenceResult_HandleShapeAndType[] - end -end -function Base.getproperty(obj::CppShapeInferenceResult_HandleShapeAndType, name::Symbol) - if name === :shape - return (obj.__protobuf_jl_internal_values[name])::TensorShapeProto - elseif name === :dtype - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :specialized_type - return (obj.__protobuf_jl_internal_values[name])::Int32 - else - getfield(obj, name) - end -end - -mutable struct CppShapeInferenceResult_HandleData <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function CppShapeInferenceResult_HandleData(; kwargs...) - obj = new(meta(CppShapeInferenceResult_HandleData), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct CppShapeInferenceResult_HandleData -const __meta_CppShapeInferenceResult_HandleData = Ref{ProtoMeta}() -function meta(::Type{CppShapeInferenceResult_HandleData}) - ProtoBuf.metalock() do - if !isassigned(__meta_CppShapeInferenceResult_HandleData) - __meta_CppShapeInferenceResult_HandleData[] = target = ProtoMeta(CppShapeInferenceResult_HandleData) - allflds = Pair{Symbol,Union{Type,String}}[:is_set => Bool, :shape_and_type => Base.Vector{CppShapeInferenceResult_HandleShapeAndType}] - meta(target, CppShapeInferenceResult_HandleData, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_CppShapeInferenceResult_HandleData[] - end -end -function Base.getproperty(obj::CppShapeInferenceResult_HandleData, name::Symbol) - if name === :is_set - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :shape_and_type - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{CppShapeInferenceResult_HandleShapeAndType} - else - getfield(obj, name) - end -end - -mutable struct CppShapeInferenceResult <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function CppShapeInferenceResult(; kwargs...) - obj = new(meta(CppShapeInferenceResult), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct CppShapeInferenceResult -const __meta_CppShapeInferenceResult = Ref{ProtoMeta}() -function meta(::Type{CppShapeInferenceResult}) - ProtoBuf.metalock() do - if !isassigned(__meta_CppShapeInferenceResult) - __meta_CppShapeInferenceResult[] = target = ProtoMeta(CppShapeInferenceResult) - fnum = Int[1,4] - allflds = Pair{Symbol,Union{Type,String}}[:shape => TensorShapeProto, :handle_data => CppShapeInferenceResult_HandleData] - meta(target, CppShapeInferenceResult, allflds, ProtoBuf.DEF_REQ, fnum, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_CppShapeInferenceResult[] - end -end -function Base.getproperty(obj::CppShapeInferenceResult, name::Symbol) - if name === :shape - return (obj.__protobuf_jl_internal_values[name])::TensorShapeProto - elseif name === :handle_data - return (obj.__protobuf_jl_internal_values[name])::CppShapeInferenceResult_HandleData - else - getfield(obj, name) - end -end - -mutable struct CppShapeInferenceInputsNeeded <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function CppShapeInferenceInputsNeeded(; kwargs...) - obj = new(meta(CppShapeInferenceInputsNeeded), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct CppShapeInferenceInputsNeeded -const __meta_CppShapeInferenceInputsNeeded = Ref{ProtoMeta}() -function meta(::Type{CppShapeInferenceInputsNeeded}) - ProtoBuf.metalock() do - if !isassigned(__meta_CppShapeInferenceInputsNeeded) - __meta_CppShapeInferenceInputsNeeded[] = target = ProtoMeta(CppShapeInferenceInputsNeeded) - pack = Symbol[:input_tensors_needed,:input_tensors_as_shapes_needed] - allflds = Pair{Symbol,Union{Type,String}}[:input_tensors_needed => Base.Vector{Int32}, :input_tensors_as_shapes_needed => Base.Vector{Int32}] - meta(target, CppShapeInferenceInputsNeeded, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, pack, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_CppShapeInferenceInputsNeeded[] - end -end -function Base.getproperty(obj::CppShapeInferenceInputsNeeded, name::Symbol) - if name === :input_tensors_needed - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Int32} - elseif name === :input_tensors_as_shapes_needed - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Int32} - else - getfield(obj, name) - end -end - -export CppShapeInferenceResult_HandleShapeAndType, CppShapeInferenceResult_HandleData, CppShapeInferenceResult, CppShapeInferenceInputsNeeded diff --git a/src/protojl/tensorboard/debug_pb.jl b/src/protojl/tensorboard/debug_pb.jl deleted file mode 100644 index d981eb5..0000000 --- a/src/protojl/tensorboard/debug_pb.jl +++ /dev/null @@ -1,174 +0,0 @@ -# syntax: proto3 -using ProtoBuf -import ProtoBuf.meta - -mutable struct DebugTensorWatch <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function DebugTensorWatch(; kwargs...) - obj = new(meta(DebugTensorWatch), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct DebugTensorWatch -const __meta_DebugTensorWatch = Ref{ProtoMeta}() -function meta(::Type{DebugTensorWatch}) - ProtoBuf.metalock() do - if !isassigned(__meta_DebugTensorWatch) - __meta_DebugTensorWatch[] = target = ProtoMeta(DebugTensorWatch) - allflds = Pair{Symbol,Union{Type,String}}[:node_name => AbstractString, :output_slot => Int32, :debug_ops => Base.Vector{AbstractString}, :debug_urls => Base.Vector{AbstractString}, :tolerate_debug_op_creation_failures => Bool] - meta(target, DebugTensorWatch, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_DebugTensorWatch[] - end -end -function Base.getproperty(obj::DebugTensorWatch, name::Symbol) - if name === :node_name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :output_slot - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :debug_ops - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{AbstractString} - elseif name === :debug_urls - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{AbstractString} - elseif name === :tolerate_debug_op_creation_failures - return (obj.__protobuf_jl_internal_values[name])::Bool - else - getfield(obj, name) - end -end - -mutable struct DebugOptions <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function DebugOptions(; kwargs...) - obj = new(meta(DebugOptions), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct DebugOptions -const __meta_DebugOptions = Ref{ProtoMeta}() -function meta(::Type{DebugOptions}) - ProtoBuf.metalock() do - if !isassigned(__meta_DebugOptions) - __meta_DebugOptions[] = target = ProtoMeta(DebugOptions) - fnum = Int[4,10,11] - allflds = Pair{Symbol,Union{Type,String}}[:debug_tensor_watch_opts => Base.Vector{DebugTensorWatch}, :global_step => Int64, :reset_disk_byte_usage => Bool] - meta(target, DebugOptions, allflds, ProtoBuf.DEF_REQ, fnum, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_DebugOptions[] - end -end -function Base.getproperty(obj::DebugOptions, name::Symbol) - if name === :debug_tensor_watch_opts - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{DebugTensorWatch} - elseif name === :global_step - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :reset_disk_byte_usage - return (obj.__protobuf_jl_internal_values[name])::Bool - else - getfield(obj, name) - end -end - -mutable struct DebuggedSourceFile <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function DebuggedSourceFile(; kwargs...) - obj = new(meta(DebuggedSourceFile), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct DebuggedSourceFile -const __meta_DebuggedSourceFile = Ref{ProtoMeta}() -function meta(::Type{DebuggedSourceFile}) - ProtoBuf.metalock() do - if !isassigned(__meta_DebuggedSourceFile) - __meta_DebuggedSourceFile[] = target = ProtoMeta(DebuggedSourceFile) - allflds = Pair{Symbol,Union{Type,String}}[:host => AbstractString, :file_path => AbstractString, :last_modified => Int64, :bytes => Int64, :lines => Base.Vector{AbstractString}] - meta(target, DebuggedSourceFile, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_DebuggedSourceFile[] - end -end -function Base.getproperty(obj::DebuggedSourceFile, name::Symbol) - if name === :host - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :file_path - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :last_modified - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :bytes - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :lines - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{AbstractString} - else - getfield(obj, name) - end -end - -mutable struct DebuggedSourceFiles <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function DebuggedSourceFiles(; kwargs...) - obj = new(meta(DebuggedSourceFiles), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct DebuggedSourceFiles -const __meta_DebuggedSourceFiles = Ref{ProtoMeta}() -function meta(::Type{DebuggedSourceFiles}) - ProtoBuf.metalock() do - if !isassigned(__meta_DebuggedSourceFiles) - __meta_DebuggedSourceFiles[] = target = ProtoMeta(DebuggedSourceFiles) - allflds = Pair{Symbol,Union{Type,String}}[:source_files => Base.Vector{DebuggedSourceFile}] - meta(target, DebuggedSourceFiles, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_DebuggedSourceFiles[] - end -end -function Base.getproperty(obj::DebuggedSourceFiles, name::Symbol) - if name === :source_files - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{DebuggedSourceFile} - else - getfield(obj, name) - end -end - -export DebugTensorWatch, DebugOptions, DebuggedSourceFile, DebuggedSourceFiles diff --git a/src/protojl/tensorboard/event_pb.jl b/src/protojl/tensorboard/event_pb.jl deleted file mode 100644 index cd03034..0000000 --- a/src/protojl/tensorboard/event_pb.jl +++ /dev/null @@ -1,365 +0,0 @@ -# syntax: proto3 -using ProtoBuf -import ProtoBuf.meta - -const WorkerHealth = (;[ - Symbol("OK") => Int32(0), - Symbol("RECEIVED_SHUTDOWN_SIGNAL") => Int32(1), - Symbol("INTERNAL_ERROR") => Int32(2), - Symbol("SHUTTING_DOWN") => Int32(3), -]...) - -const WorkerShutdownMode = (;[ - Symbol("DEFAULT") => Int32(0), - Symbol("NOT_CONFIGURED") => Int32(1), - Symbol("WAIT_FOR_COORDINATOR") => Int32(2), - Symbol("SHUTDOWN_AFTER_TIMEOUT") => Int32(3), -]...) - -const LogMessage_Level = (;[ - Symbol("UNKNOWN") => Int32(0), - Symbol("DEBUGGING") => Int32(10), - Symbol("INFO") => Int32(20), - Symbol("WARN") => Int32(30), - Symbol("ERROR") => Int32(40), - Symbol("FATAL") => Int32(50), -]...) - -mutable struct LogMessage <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function LogMessage(; kwargs...) - obj = new(meta(LogMessage), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct LogMessage -const __meta_LogMessage = Ref{ProtoMeta}() -function meta(::Type{LogMessage}) - ProtoBuf.metalock() do - if !isassigned(__meta_LogMessage) - __meta_LogMessage[] = target = ProtoMeta(LogMessage) - allflds = Pair{Symbol,Union{Type,String}}[:level => Int32, :message => AbstractString] - meta(target, LogMessage, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_LogMessage[] - end -end -function Base.getproperty(obj::LogMessage, name::Symbol) - if name === :level - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :message - return (obj.__protobuf_jl_internal_values[name])::AbstractString - else - getfield(obj, name) - end -end - -const SessionLog_SessionStatus = (;[ - Symbol("STATUS_UNSPECIFIED") => Int32(0), - Symbol("START") => Int32(1), - Symbol("STOP") => Int32(2), - Symbol("CHECKPOINT") => Int32(3), -]...) - -mutable struct SessionLog <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function SessionLog(; kwargs...) - obj = new(meta(SessionLog), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct SessionLog -const __meta_SessionLog = Ref{ProtoMeta}() -function meta(::Type{SessionLog}) - ProtoBuf.metalock() do - if !isassigned(__meta_SessionLog) - __meta_SessionLog[] = target = ProtoMeta(SessionLog) - allflds = Pair{Symbol,Union{Type,String}}[:status => Int32, :checkpoint_path => AbstractString, :msg => AbstractString] - meta(target, SessionLog, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_SessionLog[] - end -end -function Base.getproperty(obj::SessionLog, name::Symbol) - if name === :status - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :checkpoint_path - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :msg - return (obj.__protobuf_jl_internal_values[name])::AbstractString - else - getfield(obj, name) - end -end - -mutable struct TaggedRunMetadata <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function TaggedRunMetadata(; kwargs...) - obj = new(meta(TaggedRunMetadata), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct TaggedRunMetadata -const __meta_TaggedRunMetadata = Ref{ProtoMeta}() -function meta(::Type{TaggedRunMetadata}) - ProtoBuf.metalock() do - if !isassigned(__meta_TaggedRunMetadata) - __meta_TaggedRunMetadata[] = target = ProtoMeta(TaggedRunMetadata) - allflds = Pair{Symbol,Union{Type,String}}[:tag => AbstractString, :run_metadata => Vector{UInt8}] - meta(target, TaggedRunMetadata, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_TaggedRunMetadata[] - end -end -function Base.getproperty(obj::TaggedRunMetadata, name::Symbol) - if name === :tag - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :run_metadata - return (obj.__protobuf_jl_internal_values[name])::Vector{UInt8} - else - getfield(obj, name) - end -end - -mutable struct Event <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function Event(; kwargs...) - obj = new(meta(Event), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct Event -const __meta_Event = Ref{ProtoMeta}() -function meta(::Type{Event}) - ProtoBuf.metalock() do - if !isassigned(__meta_Event) - __meta_Event[] = target = ProtoMeta(Event) - allflds = Pair{Symbol,Union{Type,String}}[:wall_time => Float64, :step => Int64, :file_version => AbstractString, :graph_def => Vector{UInt8}, :summary => Summary, :log_message => LogMessage, :session_log => SessionLog, :tagged_run_metadata => TaggedRunMetadata, :meta_graph_def => Vector{UInt8}] - oneofs = Int[0,0,1,1,1,1,1,1,1] - oneof_names = Symbol[Symbol("what")] - meta(target, Event, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, oneofs, oneof_names) - end - __meta_Event[] - end -end -function Base.getproperty(obj::Event, name::Symbol) - if name === :wall_time - return (obj.__protobuf_jl_internal_values[name])::Float64 - elseif name === :step - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :file_version - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :graph_def - return (obj.__protobuf_jl_internal_values[name])::Vector{UInt8} - elseif name === :summary - return (obj.__protobuf_jl_internal_values[name])::Summary - elseif name === :log_message - return (obj.__protobuf_jl_internal_values[name])::LogMessage - elseif name === :session_log - return (obj.__protobuf_jl_internal_values[name])::SessionLog - elseif name === :tagged_run_metadata - return (obj.__protobuf_jl_internal_values[name])::TaggedRunMetadata - elseif name === :meta_graph_def - return (obj.__protobuf_jl_internal_values[name])::Vector{UInt8} - else - getfield(obj, name) - end -end - -mutable struct WatchdogConfig <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function WatchdogConfig(; kwargs...) - obj = new(meta(WatchdogConfig), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct WatchdogConfig -const __meta_WatchdogConfig = Ref{ProtoMeta}() -function meta(::Type{WatchdogConfig}) - ProtoBuf.metalock() do - if !isassigned(__meta_WatchdogConfig) - __meta_WatchdogConfig[] = target = ProtoMeta(WatchdogConfig) - allflds = Pair{Symbol,Union{Type,String}}[:timeout_ms => Int64] - meta(target, WatchdogConfig, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_WatchdogConfig[] - end -end -function Base.getproperty(obj::WatchdogConfig, name::Symbol) - if name === :timeout_ms - return (obj.__protobuf_jl_internal_values[name])::Int64 - else - getfield(obj, name) - end -end - -mutable struct RequestedExitCode <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function RequestedExitCode(; kwargs...) - obj = new(meta(RequestedExitCode), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct RequestedExitCode -const __meta_RequestedExitCode = Ref{ProtoMeta}() -function meta(::Type{RequestedExitCode}) - ProtoBuf.metalock() do - if !isassigned(__meta_RequestedExitCode) - __meta_RequestedExitCode[] = target = ProtoMeta(RequestedExitCode) - allflds = Pair{Symbol,Union{Type,String}}[:exit_code => Int32] - meta(target, RequestedExitCode, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_RequestedExitCode[] - end -end -function Base.getproperty(obj::RequestedExitCode, name::Symbol) - if name === :exit_code - return (obj.__protobuf_jl_internal_values[name])::Int32 - else - getfield(obj, name) - end -end - -mutable struct WorkerHeartbeatRequest <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function WorkerHeartbeatRequest(; kwargs...) - obj = new(meta(WorkerHeartbeatRequest), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct WorkerHeartbeatRequest -const __meta_WorkerHeartbeatRequest = Ref{ProtoMeta}() -function meta(::Type{WorkerHeartbeatRequest}) - ProtoBuf.metalock() do - if !isassigned(__meta_WorkerHeartbeatRequest) - __meta_WorkerHeartbeatRequest[] = target = ProtoMeta(WorkerHeartbeatRequest) - allflds = Pair{Symbol,Union{Type,String}}[:shutdown_mode => Int32, :watchdog_config => WatchdogConfig, :exit_code => RequestedExitCode] - meta(target, WorkerHeartbeatRequest, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_WorkerHeartbeatRequest[] - end -end -function Base.getproperty(obj::WorkerHeartbeatRequest, name::Symbol) - if name === :shutdown_mode - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :watchdog_config - return (obj.__protobuf_jl_internal_values[name])::WatchdogConfig - elseif name === :exit_code - return (obj.__protobuf_jl_internal_values[name])::RequestedExitCode - else - getfield(obj, name) - end -end - -mutable struct WorkerHeartbeatResponse <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function WorkerHeartbeatResponse(; kwargs...) - obj = new(meta(WorkerHeartbeatResponse), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct WorkerHeartbeatResponse -const __meta_WorkerHeartbeatResponse = Ref{ProtoMeta}() -function meta(::Type{WorkerHeartbeatResponse}) - ProtoBuf.metalock() do - if !isassigned(__meta_WorkerHeartbeatResponse) - __meta_WorkerHeartbeatResponse[] = target = ProtoMeta(WorkerHeartbeatResponse) - allflds = Pair{Symbol,Union{Type,String}}[:health_status => Int32, :worker_log => Base.Vector{Event}, :hostname => AbstractString] - meta(target, WorkerHeartbeatResponse, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_WorkerHeartbeatResponse[] - end -end -function Base.getproperty(obj::WorkerHeartbeatResponse, name::Symbol) - if name === :health_status - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :worker_log - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Event} - elseif name === :hostname - return (obj.__protobuf_jl_internal_values[name])::AbstractString - else - getfield(obj, name) - end -end - -export WorkerHealth, WorkerShutdownMode, Event, LogMessage_Level, LogMessage, SessionLog_SessionStatus, SessionLog, TaggedRunMetadata, WatchdogConfig, RequestedExitCode, WorkerHeartbeatRequest, WorkerHeartbeatResponse diff --git a/src/protojl/tensorboard/function_pb.jl b/src/protojl/tensorboard/function_pb.jl deleted file mode 100644 index 5d57898..0000000 --- a/src/protojl/tensorboard/function_pb.jl +++ /dev/null @@ -1,405 +0,0 @@ -# syntax: proto3 -using ProtoBuf -import ProtoBuf.meta - -mutable struct FunctionDef_AttrEntry <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function FunctionDef_AttrEntry(; kwargs...) - obj = new(meta(FunctionDef_AttrEntry), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct FunctionDef_AttrEntry (mapentry) -const __meta_FunctionDef_AttrEntry = Ref{ProtoMeta}() -function meta(::Type{FunctionDef_AttrEntry}) - ProtoBuf.metalock() do - if !isassigned(__meta_FunctionDef_AttrEntry) - __meta_FunctionDef_AttrEntry[] = target = ProtoMeta(FunctionDef_AttrEntry) - allflds = Pair{Symbol,Union{Type,String}}[:key => AbstractString, :value => AttrValue] - meta(target, FunctionDef_AttrEntry, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_FunctionDef_AttrEntry[] - end -end -function Base.getproperty(obj::FunctionDef_AttrEntry, name::Symbol) - if name === :key - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :value - return (obj.__protobuf_jl_internal_values[name])::AttrValue - else - getfield(obj, name) - end -end - -mutable struct FunctionDef_ArgAttrs_AttrEntry <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function FunctionDef_ArgAttrs_AttrEntry(; kwargs...) - obj = new(meta(FunctionDef_ArgAttrs_AttrEntry), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct FunctionDef_ArgAttrs_AttrEntry (mapentry) -const __meta_FunctionDef_ArgAttrs_AttrEntry = Ref{ProtoMeta}() -function meta(::Type{FunctionDef_ArgAttrs_AttrEntry}) - ProtoBuf.metalock() do - if !isassigned(__meta_FunctionDef_ArgAttrs_AttrEntry) - __meta_FunctionDef_ArgAttrs_AttrEntry[] = target = ProtoMeta(FunctionDef_ArgAttrs_AttrEntry) - allflds = Pair{Symbol,Union{Type,String}}[:key => AbstractString, :value => AttrValue] - meta(target, FunctionDef_ArgAttrs_AttrEntry, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_FunctionDef_ArgAttrs_AttrEntry[] - end -end -function Base.getproperty(obj::FunctionDef_ArgAttrs_AttrEntry, name::Symbol) - if name === :key - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :value - return (obj.__protobuf_jl_internal_values[name])::AttrValue - else - getfield(obj, name) - end -end - -mutable struct FunctionDef_ArgAttrs <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function FunctionDef_ArgAttrs(; kwargs...) - obj = new(meta(FunctionDef_ArgAttrs), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct FunctionDef_ArgAttrs -const __meta_FunctionDef_ArgAttrs = Ref{ProtoMeta}() -function meta(::Type{FunctionDef_ArgAttrs}) - ProtoBuf.metalock() do - if !isassigned(__meta_FunctionDef_ArgAttrs) - __meta_FunctionDef_ArgAttrs[] = target = ProtoMeta(FunctionDef_ArgAttrs) - allflds = Pair{Symbol,Union{Type,String}}[:attr => Base.Dict{AbstractString,AttrValue}] - meta(target, FunctionDef_ArgAttrs, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_FunctionDef_ArgAttrs[] - end -end -function Base.getproperty(obj::FunctionDef_ArgAttrs, name::Symbol) - if name === :attr - return (obj.__protobuf_jl_internal_values[name])::Base.Dict{AbstractString,AttrValue} - else - getfield(obj, name) - end -end - -mutable struct FunctionDef_ArgAttrEntry <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function FunctionDef_ArgAttrEntry(; kwargs...) - obj = new(meta(FunctionDef_ArgAttrEntry), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct FunctionDef_ArgAttrEntry (mapentry) -const __meta_FunctionDef_ArgAttrEntry = Ref{ProtoMeta}() -function meta(::Type{FunctionDef_ArgAttrEntry}) - ProtoBuf.metalock() do - if !isassigned(__meta_FunctionDef_ArgAttrEntry) - __meta_FunctionDef_ArgAttrEntry[] = target = ProtoMeta(FunctionDef_ArgAttrEntry) - allflds = Pair{Symbol,Union{Type,String}}[:key => UInt32, :value => FunctionDef_ArgAttrs] - meta(target, FunctionDef_ArgAttrEntry, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_FunctionDef_ArgAttrEntry[] - end -end -function Base.getproperty(obj::FunctionDef_ArgAttrEntry, name::Symbol) - if name === :key - return (obj.__protobuf_jl_internal_values[name])::UInt32 - elseif name === :value - return (obj.__protobuf_jl_internal_values[name])::FunctionDef_ArgAttrs - else - getfield(obj, name) - end -end - -mutable struct FunctionDef_ResourceArgUniqueIdEntry <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function FunctionDef_ResourceArgUniqueIdEntry(; kwargs...) - obj = new(meta(FunctionDef_ResourceArgUniqueIdEntry), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct FunctionDef_ResourceArgUniqueIdEntry (mapentry) -const __meta_FunctionDef_ResourceArgUniqueIdEntry = Ref{ProtoMeta}() -function meta(::Type{FunctionDef_ResourceArgUniqueIdEntry}) - ProtoBuf.metalock() do - if !isassigned(__meta_FunctionDef_ResourceArgUniqueIdEntry) - __meta_FunctionDef_ResourceArgUniqueIdEntry[] = target = ProtoMeta(FunctionDef_ResourceArgUniqueIdEntry) - allflds = Pair{Symbol,Union{Type,String}}[:key => UInt32, :value => UInt32] - meta(target, FunctionDef_ResourceArgUniqueIdEntry, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_FunctionDef_ResourceArgUniqueIdEntry[] - end -end -function Base.getproperty(obj::FunctionDef_ResourceArgUniqueIdEntry, name::Symbol) - if name === :key - return (obj.__protobuf_jl_internal_values[name])::UInt32 - elseif name === :value - return (obj.__protobuf_jl_internal_values[name])::UInt32 - else - getfield(obj, name) - end -end - -mutable struct FunctionDef_RetEntry <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function FunctionDef_RetEntry(; kwargs...) - obj = new(meta(FunctionDef_RetEntry), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct FunctionDef_RetEntry (mapentry) -const __meta_FunctionDef_RetEntry = Ref{ProtoMeta}() -function meta(::Type{FunctionDef_RetEntry}) - ProtoBuf.metalock() do - if !isassigned(__meta_FunctionDef_RetEntry) - __meta_FunctionDef_RetEntry[] = target = ProtoMeta(FunctionDef_RetEntry) - allflds = Pair{Symbol,Union{Type,String}}[:key => AbstractString, :value => AbstractString] - meta(target, FunctionDef_RetEntry, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_FunctionDef_RetEntry[] - end -end -function Base.getproperty(obj::FunctionDef_RetEntry, name::Symbol) - if name === :key - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :value - return (obj.__protobuf_jl_internal_values[name])::AbstractString - else - getfield(obj, name) - end -end - -mutable struct FunctionDef_ControlRetEntry <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function FunctionDef_ControlRetEntry(; kwargs...) - obj = new(meta(FunctionDef_ControlRetEntry), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct FunctionDef_ControlRetEntry (mapentry) -const __meta_FunctionDef_ControlRetEntry = Ref{ProtoMeta}() -function meta(::Type{FunctionDef_ControlRetEntry}) - ProtoBuf.metalock() do - if !isassigned(__meta_FunctionDef_ControlRetEntry) - __meta_FunctionDef_ControlRetEntry[] = target = ProtoMeta(FunctionDef_ControlRetEntry) - allflds = Pair{Symbol,Union{Type,String}}[:key => AbstractString, :value => AbstractString] - meta(target, FunctionDef_ControlRetEntry, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_FunctionDef_ControlRetEntry[] - end -end -function Base.getproperty(obj::FunctionDef_ControlRetEntry, name::Symbol) - if name === :key - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :value - return (obj.__protobuf_jl_internal_values[name])::AbstractString - else - getfield(obj, name) - end -end - -mutable struct FunctionDef <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function FunctionDef(; kwargs...) - obj = new(meta(FunctionDef), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct FunctionDef -const __meta_FunctionDef = Ref{ProtoMeta}() -function meta(::Type{FunctionDef}) - ProtoBuf.metalock() do - if !isassigned(__meta_FunctionDef) - __meta_FunctionDef[] = target = ProtoMeta(FunctionDef) - fnum = Int[1,5,7,8,3,4,6] - allflds = Pair{Symbol,Union{Type,String}}[:signature => OpDef, :attr => Base.Dict{AbstractString,AttrValue}, :arg_attr => Base.Dict{UInt32,FunctionDef_ArgAttrs}, :resource_arg_unique_id => Base.Dict{UInt32,UInt32}, :node_def => Base.Vector{NodeDef}, :ret => Base.Dict{AbstractString,AbstractString}, :control_ret => Base.Dict{AbstractString,AbstractString}] - meta(target, FunctionDef, allflds, ProtoBuf.DEF_REQ, fnum, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_FunctionDef[] - end -end -function Base.getproperty(obj::FunctionDef, name::Symbol) - if name === :signature - return (obj.__protobuf_jl_internal_values[name])::OpDef - elseif name === :attr - return (obj.__protobuf_jl_internal_values[name])::Base.Dict{AbstractString,AttrValue} - elseif name === :arg_attr - return (obj.__protobuf_jl_internal_values[name])::Base.Dict{UInt32,FunctionDef_ArgAttrs} - elseif name === :resource_arg_unique_id - return (obj.__protobuf_jl_internal_values[name])::Base.Dict{UInt32,UInt32} - elseif name === :node_def - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{NodeDef} - elseif name === :ret - return (obj.__protobuf_jl_internal_values[name])::Base.Dict{AbstractString,AbstractString} - elseif name === :control_ret - return (obj.__protobuf_jl_internal_values[name])::Base.Dict{AbstractString,AbstractString} - else - getfield(obj, name) - end -end - -mutable struct GradientDef <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function GradientDef(; kwargs...) - obj = new(meta(GradientDef), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct GradientDef -const __meta_GradientDef = Ref{ProtoMeta}() -function meta(::Type{GradientDef}) - ProtoBuf.metalock() do - if !isassigned(__meta_GradientDef) - __meta_GradientDef[] = target = ProtoMeta(GradientDef) - allflds = Pair{Symbol,Union{Type,String}}[:function_name => AbstractString, :gradient_func => AbstractString] - meta(target, GradientDef, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_GradientDef[] - end -end -function Base.getproperty(obj::GradientDef, name::Symbol) - if name === :function_name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :gradient_func - return (obj.__protobuf_jl_internal_values[name])::AbstractString - else - getfield(obj, name) - end -end - -mutable struct FunctionDefLibrary <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function FunctionDefLibrary(; kwargs...) - obj = new(meta(FunctionDefLibrary), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct FunctionDefLibrary -const __meta_FunctionDefLibrary = Ref{ProtoMeta}() -function meta(::Type{FunctionDefLibrary}) - ProtoBuf.metalock() do - if !isassigned(__meta_FunctionDefLibrary) - __meta_FunctionDefLibrary[] = target = ProtoMeta(FunctionDefLibrary) - allflds = Pair{Symbol,Union{Type,String}}[:_function => Base.Vector{FunctionDef}, :gradient => Base.Vector{GradientDef}] - meta(target, FunctionDefLibrary, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_FunctionDefLibrary[] - end -end -function Base.getproperty(obj::FunctionDefLibrary, name::Symbol) - if name === :_function - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{FunctionDef} - elseif name === :gradient - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{GradientDef} - else - getfield(obj, name) - end -end - -export FunctionDefLibrary, FunctionDef_AttrEntry, FunctionDef_ArgAttrs_AttrEntry, FunctionDef_ArgAttrs, FunctionDef_ArgAttrEntry, FunctionDef_ResourceArgUniqueIdEntry, FunctionDef_RetEntry, FunctionDef_ControlRetEntry, FunctionDef, GradientDef -# mapentries: "FunctionDef_AttrEntry" => ("AbstractString", "AttrValue"), "FunctionDef_ArgAttrEntry" => ("UInt32", "FunctionDef_ArgAttrs"), "FunctionDef_ResourceArgUniqueIdEntry" => ("UInt32", "UInt32"), "FunctionDef_RetEntry" => ("AbstractString", "AbstractString"), "FunctionDef_ControlRetEntry" => ("AbstractString", "AbstractString"), "FunctionDef_ArgAttrs_AttrEntry" => ("AbstractString", "AttrValue") diff --git a/src/protojl/tensorboard/google.jl b/src/protojl/tensorboard/google.jl deleted file mode 100644 index 3aa1965..0000000 --- a/src/protojl/tensorboard/google.jl +++ /dev/null @@ -1,7 +0,0 @@ -module google - const _ProtoBuf_Top_ = @static isdefined(parentmodule(@__MODULE__), :_ProtoBuf_Top_) ? (parentmodule(@__MODULE__))._ProtoBuf_Top_ : parentmodule(@__MODULE__) - module protobuf - const _ProtoBuf_Top_ = @static isdefined(parentmodule(@__MODULE__), :_ProtoBuf_Top_) ? (parentmodule(@__MODULE__))._ProtoBuf_Top_ : parentmodule(@__MODULE__) - include("any_pb.jl") - end -end diff --git a/src/protojl/tensorboard/google/google.jl b/src/protojl/tensorboard/google/google.jl new file mode 100644 index 0000000..25bf6b5 --- /dev/null +++ b/src/protojl/tensorboard/google/google.jl @@ -0,0 +1,5 @@ +module google + +include("protobuf/protobuf.jl") + +end # module google diff --git a/src/protojl/tensorboard/google/protobuf/any_pb.jl b/src/protojl/tensorboard/google/protobuf/any_pb.jl new file mode 100644 index 0000000..d426189 --- /dev/null +++ b/src/protojl/tensorboard/google/protobuf/any_pb.jl @@ -0,0 +1,44 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:24.779 +# original file: /home/lior/.julia/dev/ProtoBuf/src/google/protobuf/any.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export var"#Any" + +struct var"#Any" + type_url::String + value::Vector{UInt8} +end +PB.default_values(::Type{var"#Any"}) = (;type_url = "", value = UInt8[]) +PB.field_numbers(::Type{var"#Any"}) = (;type_url = 1, value = 2) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"#Any"}) + type_url = "" + value = UInt8[] + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + type_url = PB.decode(d, String) + elseif field_number == 2 + value = PB.decode(d, Vector{UInt8}) + else + PB.skip(d, wire_type) + end + end + return var"#Any"(type_url, value) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"#Any") + initpos = position(e.io) + !isempty(x.type_url) && PB.encode(e, 1, x.type_url) + !isempty(x.value) && PB.encode(e, 2, x.value) + return position(e.io) - initpos +end +function PB._encoded_size(x::var"#Any") + encoded_size = 0 + !isempty(x.type_url) && (encoded_size += PB._encoded_size(x.type_url, 1)) + !isempty(x.value) && (encoded_size += PB._encoded_size(x.value, 2)) + return encoded_size +end diff --git a/src/protojl/tensorboard/google/protobuf/protobuf.jl b/src/protojl/tensorboard/google/protobuf/protobuf.jl new file mode 100644 index 0000000..1557114 --- /dev/null +++ b/src/protojl/tensorboard/google/protobuf/protobuf.jl @@ -0,0 +1,6 @@ +module protobuf + +include("any_pb.jl") +include("wrappers_pb.jl") + +end # module protobuf diff --git a/src/protojl/tensorboard/google/protobuf/wrappers_pb.jl b/src/protojl/tensorboard/google/protobuf/wrappers_pb.jl new file mode 100644 index 0000000..ecd7da3 --- /dev/null +++ b/src/protojl/tensorboard/google/protobuf/wrappers_pb.jl @@ -0,0 +1,279 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:24.780 +# original file: /home/lior/.julia/dev/ProtoBuf/src/google/protobuf/wrappers.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export BoolValue, Int64Value, FloatValue, Int32Value, DoubleValue, UInt64Value, UInt32Value +export BytesValue, StringValue + +struct BoolValue + value::Bool +end +PB.default_values(::Type{BoolValue}) = (;value = false) +PB.field_numbers(::Type{BoolValue}) = (;value = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:BoolValue}) + value = false + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + value = PB.decode(d, Bool) + else + PB.skip(d, wire_type) + end + end + return BoolValue(value) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::BoolValue) + initpos = position(e.io) + x.value != false && PB.encode(e, 1, x.value) + return position(e.io) - initpos +end +function PB._encoded_size(x::BoolValue) + encoded_size = 0 + x.value != false && (encoded_size += PB._encoded_size(x.value, 1)) + return encoded_size +end + +struct Int64Value + value::Int64 +end +PB.default_values(::Type{Int64Value}) = (;value = zero(Int64)) +PB.field_numbers(::Type{Int64Value}) = (;value = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:Int64Value}) + value = zero(Int64) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + value = PB.decode(d, Int64) + else + PB.skip(d, wire_type) + end + end + return Int64Value(value) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::Int64Value) + initpos = position(e.io) + x.value != zero(Int64) && PB.encode(e, 1, x.value) + return position(e.io) - initpos +end +function PB._encoded_size(x::Int64Value) + encoded_size = 0 + x.value != zero(Int64) && (encoded_size += PB._encoded_size(x.value, 1)) + return encoded_size +end + +struct FloatValue + value::Float32 +end +PB.default_values(::Type{FloatValue}) = (;value = zero(Float32)) +PB.field_numbers(::Type{FloatValue}) = (;value = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:FloatValue}) + value = zero(Float32) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + value = PB.decode(d, Float32) + else + PB.skip(d, wire_type) + end + end + return FloatValue(value) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::FloatValue) + initpos = position(e.io) + x.value != zero(Float32) && PB.encode(e, 1, x.value) + return position(e.io) - initpos +end +function PB._encoded_size(x::FloatValue) + encoded_size = 0 + x.value != zero(Float32) && (encoded_size += PB._encoded_size(x.value, 1)) + return encoded_size +end + +struct Int32Value + value::Int32 +end +PB.default_values(::Type{Int32Value}) = (;value = zero(Int32)) +PB.field_numbers(::Type{Int32Value}) = (;value = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:Int32Value}) + value = zero(Int32) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + value = PB.decode(d, Int32) + else + PB.skip(d, wire_type) + end + end + return Int32Value(value) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::Int32Value) + initpos = position(e.io) + x.value != zero(Int32) && PB.encode(e, 1, x.value) + return position(e.io) - initpos +end +function PB._encoded_size(x::Int32Value) + encoded_size = 0 + x.value != zero(Int32) && (encoded_size += PB._encoded_size(x.value, 1)) + return encoded_size +end + +struct DoubleValue + value::Float64 +end +PB.default_values(::Type{DoubleValue}) = (;value = zero(Float64)) +PB.field_numbers(::Type{DoubleValue}) = (;value = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:DoubleValue}) + value = zero(Float64) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + value = PB.decode(d, Float64) + else + PB.skip(d, wire_type) + end + end + return DoubleValue(value) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::DoubleValue) + initpos = position(e.io) + x.value != zero(Float64) && PB.encode(e, 1, x.value) + return position(e.io) - initpos +end +function PB._encoded_size(x::DoubleValue) + encoded_size = 0 + x.value != zero(Float64) && (encoded_size += PB._encoded_size(x.value, 1)) + return encoded_size +end + +struct UInt64Value + value::UInt64 +end +PB.default_values(::Type{UInt64Value}) = (;value = zero(UInt64)) +PB.field_numbers(::Type{UInt64Value}) = (;value = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:UInt64Value}) + value = zero(UInt64) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + value = PB.decode(d, UInt64) + else + PB.skip(d, wire_type) + end + end + return UInt64Value(value) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::UInt64Value) + initpos = position(e.io) + x.value != zero(UInt64) && PB.encode(e, 1, x.value) + return position(e.io) - initpos +end +function PB._encoded_size(x::UInt64Value) + encoded_size = 0 + x.value != zero(UInt64) && (encoded_size += PB._encoded_size(x.value, 1)) + return encoded_size +end + +struct UInt32Value + value::UInt32 +end +PB.default_values(::Type{UInt32Value}) = (;value = zero(UInt32)) +PB.field_numbers(::Type{UInt32Value}) = (;value = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:UInt32Value}) + value = zero(UInt32) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + value = PB.decode(d, UInt32) + else + PB.skip(d, wire_type) + end + end + return UInt32Value(value) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::UInt32Value) + initpos = position(e.io) + x.value != zero(UInt32) && PB.encode(e, 1, x.value) + return position(e.io) - initpos +end +function PB._encoded_size(x::UInt32Value) + encoded_size = 0 + x.value != zero(UInt32) && (encoded_size += PB._encoded_size(x.value, 1)) + return encoded_size +end + +struct BytesValue + value::Vector{UInt8} +end +PB.default_values(::Type{BytesValue}) = (;value = UInt8[]) +PB.field_numbers(::Type{BytesValue}) = (;value = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:BytesValue}) + value = UInt8[] + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + value = PB.decode(d, Vector{UInt8}) + else + PB.skip(d, wire_type) + end + end + return BytesValue(value) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::BytesValue) + initpos = position(e.io) + !isempty(x.value) && PB.encode(e, 1, x.value) + return position(e.io) - initpos +end +function PB._encoded_size(x::BytesValue) + encoded_size = 0 + !isempty(x.value) && (encoded_size += PB._encoded_size(x.value, 1)) + return encoded_size +end + +struct StringValue + value::String +end +PB.default_values(::Type{StringValue}) = (;value = "") +PB.field_numbers(::Type{StringValue}) = (;value = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:StringValue}) + value = "" + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + value = PB.decode(d, String) + else + PB.skip(d, wire_type) + end + end + return StringValue(value) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::StringValue) + initpos = position(e.io) + !isempty(x.value) && PB.encode(e, 1, x.value) + return position(e.io) - initpos +end +function PB._encoded_size(x::StringValue) + encoded_size = 0 + !isempty(x.value) && (encoded_size += PB._encoded_size(x.value, 1)) + return encoded_size +end diff --git a/src/protojl/tensorboard/graph_pb.jl b/src/protojl/tensorboard/graph_pb.jl deleted file mode 100644 index 492aee3..0000000 --- a/src/protojl/tensorboard/graph_pb.jl +++ /dev/null @@ -1,49 +0,0 @@ -# syntax: proto3 -using ProtoBuf -import ProtoBuf.meta - -mutable struct GraphDef <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function GraphDef(; kwargs...) - obj = new(meta(GraphDef), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct GraphDef -const __meta_GraphDef = Ref{ProtoMeta}() -function meta(::Type{GraphDef}) - ProtoBuf.metalock() do - if !isassigned(__meta_GraphDef) - __meta_GraphDef[] = target = ProtoMeta(GraphDef) - fnum = Int[1,4,3,2] - allflds = Pair{Symbol,Union{Type,String}}[:node => Base.Vector{NodeDef}, :versions => VersionDef, :version => Int32, :library => FunctionDefLibrary] - meta(target, GraphDef, allflds, ProtoBuf.DEF_REQ, fnum, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_GraphDef[] - end -end -function Base.getproperty(obj::GraphDef, name::Symbol) - if name === :node - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{NodeDef} - elseif name === :versions - return (obj.__protobuf_jl_internal_values[name])::VersionDef - elseif name === :version - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :library - return (obj.__protobuf_jl_internal_values[name])::FunctionDefLibrary - else - getfield(obj, name) - end -end - -export GraphDef diff --git a/src/protojl/tensorboard/meta_graph_pb.jl b/src/protojl/tensorboard/meta_graph_pb.jl deleted file mode 100644 index 2984061..0000000 --- a/src/protojl/tensorboard/meta_graph_pb.jl +++ /dev/null @@ -1,613 +0,0 @@ -# syntax: proto3 -using ProtoBuf -import ProtoBuf.meta -import ProtoBuf.google.protobuf - -mutable struct CollectionDef_NodeList <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function CollectionDef_NodeList(; kwargs...) - obj = new(meta(CollectionDef_NodeList), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct CollectionDef_NodeList -const __meta_CollectionDef_NodeList = Ref{ProtoMeta}() -function meta(::Type{CollectionDef_NodeList}) - ProtoBuf.metalock() do - if !isassigned(__meta_CollectionDef_NodeList) - __meta_CollectionDef_NodeList[] = target = ProtoMeta(CollectionDef_NodeList) - allflds = Pair{Symbol,Union{Type,String}}[:value => Base.Vector{AbstractString}] - meta(target, CollectionDef_NodeList, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_CollectionDef_NodeList[] - end -end -function Base.getproperty(obj::CollectionDef_NodeList, name::Symbol) - if name === :value - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{AbstractString} - else - getfield(obj, name) - end -end - -mutable struct CollectionDef_BytesList <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function CollectionDef_BytesList(; kwargs...) - obj = new(meta(CollectionDef_BytesList), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct CollectionDef_BytesList -const __meta_CollectionDef_BytesList = Ref{ProtoMeta}() -function meta(::Type{CollectionDef_BytesList}) - ProtoBuf.metalock() do - if !isassigned(__meta_CollectionDef_BytesList) - __meta_CollectionDef_BytesList[] = target = ProtoMeta(CollectionDef_BytesList) - allflds = Pair{Symbol,Union{Type,String}}[:value => Base.Vector{Vector{UInt8}}] - meta(target, CollectionDef_BytesList, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_CollectionDef_BytesList[] - end -end -function Base.getproperty(obj::CollectionDef_BytesList, name::Symbol) - if name === :value - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Vector{UInt8}} - else - getfield(obj, name) - end -end - -mutable struct CollectionDef_Int64List <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function CollectionDef_Int64List(; kwargs...) - obj = new(meta(CollectionDef_Int64List), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct CollectionDef_Int64List -const __meta_CollectionDef_Int64List = Ref{ProtoMeta}() -function meta(::Type{CollectionDef_Int64List}) - ProtoBuf.metalock() do - if !isassigned(__meta_CollectionDef_Int64List) - __meta_CollectionDef_Int64List[] = target = ProtoMeta(CollectionDef_Int64List) - pack = Symbol[:value] - allflds = Pair{Symbol,Union{Type,String}}[:value => Base.Vector{Int64}] - meta(target, CollectionDef_Int64List, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, pack, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_CollectionDef_Int64List[] - end -end -function Base.getproperty(obj::CollectionDef_Int64List, name::Symbol) - if name === :value - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Int64} - else - getfield(obj, name) - end -end - -mutable struct CollectionDef_FloatList <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function CollectionDef_FloatList(; kwargs...) - obj = new(meta(CollectionDef_FloatList), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct CollectionDef_FloatList -const __meta_CollectionDef_FloatList = Ref{ProtoMeta}() -function meta(::Type{CollectionDef_FloatList}) - ProtoBuf.metalock() do - if !isassigned(__meta_CollectionDef_FloatList) - __meta_CollectionDef_FloatList[] = target = ProtoMeta(CollectionDef_FloatList) - pack = Symbol[:value] - allflds = Pair{Symbol,Union{Type,String}}[:value => Base.Vector{Float32}] - meta(target, CollectionDef_FloatList, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, pack, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_CollectionDef_FloatList[] - end -end -function Base.getproperty(obj::CollectionDef_FloatList, name::Symbol) - if name === :value - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Float32} - else - getfield(obj, name) - end -end - -mutable struct CollectionDef_AnyList <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function CollectionDef_AnyList(; kwargs...) - obj = new(meta(CollectionDef_AnyList), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct CollectionDef_AnyList -const __meta_CollectionDef_AnyList = Ref{ProtoMeta}() -function meta(::Type{CollectionDef_AnyList}) - ProtoBuf.metalock() do - if !isassigned(__meta_CollectionDef_AnyList) - __meta_CollectionDef_AnyList[] = target = ProtoMeta(CollectionDef_AnyList) - allflds = Pair{Symbol,Union{Type,String}}[:value => Base.Vector{ProtoBuf.google.protobuf._Any}] - meta(target, CollectionDef_AnyList, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_CollectionDef_AnyList[] - end -end -function Base.getproperty(obj::CollectionDef_AnyList, name::Symbol) - if name === :value - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{ProtoBuf.google.protobuf._Any} - else - getfield(obj, name) - end -end - -mutable struct CollectionDef <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function CollectionDef(; kwargs...) - obj = new(meta(CollectionDef), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct CollectionDef -const __meta_CollectionDef = Ref{ProtoMeta}() -function meta(::Type{CollectionDef}) - ProtoBuf.metalock() do - if !isassigned(__meta_CollectionDef) - __meta_CollectionDef[] = target = ProtoMeta(CollectionDef) - allflds = Pair{Symbol,Union{Type,String}}[:node_list => CollectionDef_NodeList, :bytes_list => CollectionDef_BytesList, :int64_list => CollectionDef_Int64List, :float_list => CollectionDef_FloatList, :any_list => CollectionDef_AnyList] - oneofs = Int[1,1,1,1,1] - oneof_names = Symbol[Symbol("kind")] - meta(target, CollectionDef, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, oneofs, oneof_names) - end - __meta_CollectionDef[] - end -end -function Base.getproperty(obj::CollectionDef, name::Symbol) - if name === :node_list - return (obj.__protobuf_jl_internal_values[name])::CollectionDef_NodeList - elseif name === :bytes_list - return (obj.__protobuf_jl_internal_values[name])::CollectionDef_BytesList - elseif name === :int64_list - return (obj.__protobuf_jl_internal_values[name])::CollectionDef_Int64List - elseif name === :float_list - return (obj.__protobuf_jl_internal_values[name])::CollectionDef_FloatList - elseif name === :any_list - return (obj.__protobuf_jl_internal_values[name])::CollectionDef_AnyList - else - getfield(obj, name) - end -end - -mutable struct MetaGraphDef_CollectionDefEntry <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function MetaGraphDef_CollectionDefEntry(; kwargs...) - obj = new(meta(MetaGraphDef_CollectionDefEntry), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct MetaGraphDef_CollectionDefEntry (mapentry) -const __meta_MetaGraphDef_CollectionDefEntry = Ref{ProtoMeta}() -function meta(::Type{MetaGraphDef_CollectionDefEntry}) - ProtoBuf.metalock() do - if !isassigned(__meta_MetaGraphDef_CollectionDefEntry) - __meta_MetaGraphDef_CollectionDefEntry[] = target = ProtoMeta(MetaGraphDef_CollectionDefEntry) - allflds = Pair{Symbol,Union{Type,String}}[:key => AbstractString, :value => CollectionDef] - meta(target, MetaGraphDef_CollectionDefEntry, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_MetaGraphDef_CollectionDefEntry[] - end -end -function Base.getproperty(obj::MetaGraphDef_CollectionDefEntry, name::Symbol) - if name === :key - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :value - return (obj.__protobuf_jl_internal_values[name])::CollectionDef - else - getfield(obj, name) - end -end - -mutable struct MetaGraphDef_SignatureDefEntry <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function MetaGraphDef_SignatureDefEntry(; kwargs...) - obj = new(meta(MetaGraphDef_SignatureDefEntry), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct MetaGraphDef_SignatureDefEntry (mapentry) (has cyclic type dependency) -const __meta_MetaGraphDef_SignatureDefEntry = Ref{ProtoMeta}() -function meta(::Type{MetaGraphDef_SignatureDefEntry}) - ProtoBuf.metalock() do - if !isassigned(__meta_MetaGraphDef_SignatureDefEntry) - __meta_MetaGraphDef_SignatureDefEntry[] = target = ProtoMeta(MetaGraphDef_SignatureDefEntry) - allflds = Pair{Symbol,Union{Type,String}}[:key => AbstractString, :value => "SignatureDef"] - meta(target, MetaGraphDef_SignatureDefEntry, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_MetaGraphDef_SignatureDefEntry[] - end -end -function Base.getproperty(obj::MetaGraphDef_SignatureDefEntry, name::Symbol) - if name === :key - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :value - return (obj.__protobuf_jl_internal_values[name])::Any - else - getfield(obj, name) - end -end - -mutable struct MetaGraphDef <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function MetaGraphDef(; kwargs...) - obj = new(meta(MetaGraphDef), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct MetaGraphDef (has cyclic type dependency) -const __meta_MetaGraphDef = Ref{ProtoMeta}() -function meta(::Type{MetaGraphDef}) - ProtoBuf.metalock() do - if !isassigned(__meta_MetaGraphDef) - __meta_MetaGraphDef[] = target = ProtoMeta(MetaGraphDef) - allflds = Pair{Symbol,Union{Type,String}}[:meta_info_def => MetaGraphDef_MetaInfoDef, :graph_def => GraphDef, :saver_def => SaverDef, :collection_def => "Base.Dict{AbstractString,CollectionDef}", :signature_def => "Base.Dict{AbstractString,SignatureDef}", :asset_file_def => "Base.Vector{AssetFileDef}", :object_graph_def => SavedObjectGraph] - meta(target, MetaGraphDef, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_MetaGraphDef[] - end -end -function Base.getproperty(obj::MetaGraphDef, name::Symbol) - if name === :meta_info_def - return (obj.__protobuf_jl_internal_values[name])::MetaGraphDef_MetaInfoDef - elseif name === :graph_def - return (obj.__protobuf_jl_internal_values[name])::GraphDef - elseif name === :saver_def - return (obj.__protobuf_jl_internal_values[name])::SaverDef - elseif name === :collection_def - return (obj.__protobuf_jl_internal_values[name])::Any - elseif name === :signature_def - return (obj.__protobuf_jl_internal_values[name])::Any - elseif name === :asset_file_def - return (obj.__protobuf_jl_internal_values[name])::Any - elseif name === :object_graph_def - return (obj.__protobuf_jl_internal_values[name])::SavedObjectGraph - else - getfield(obj, name) - end -end - -mutable struct TensorInfo_CompositeTensor <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function TensorInfo_CompositeTensor(; kwargs...) - obj = new(meta(TensorInfo_CompositeTensor), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct TensorInfo_CompositeTensor (has cyclic type dependency) -const __meta_TensorInfo_CompositeTensor = Ref{ProtoMeta}() -function meta(::Type{TensorInfo_CompositeTensor}) - ProtoBuf.metalock() do - if !isassigned(__meta_TensorInfo_CompositeTensor) - __meta_TensorInfo_CompositeTensor[] = target = ProtoMeta(TensorInfo_CompositeTensor) - allflds = Pair{Symbol,Union{Type,String}}[:type_spec => TypeSpecProto, :components => "Base.Vector{TensorInfo}"] - meta(target, TensorInfo_CompositeTensor, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_TensorInfo_CompositeTensor[] - end -end -function Base.getproperty(obj::TensorInfo_CompositeTensor, name::Symbol) - if name === :type_spec - return (obj.__protobuf_jl_internal_values[name])::TypeSpecProto - elseif name === :components - return (obj.__protobuf_jl_internal_values[name])::Any - else - getfield(obj, name) - end -end - -mutable struct TensorInfo <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function TensorInfo(; kwargs...) - obj = new(meta(TensorInfo), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct TensorInfo (has cyclic type dependency) -const __meta_TensorInfo = Ref{ProtoMeta}() -function meta(::Type{TensorInfo}) - ProtoBuf.metalock() do - if !isassigned(__meta_TensorInfo) - __meta_TensorInfo[] = target = ProtoMeta(TensorInfo) - fnum = Int[1,4,5,2,3] - allflds = Pair{Symbol,Union{Type,String}}[:name => AbstractString, :coo_sparse => TensorInfo_CooSparse, :composite_tensor => TensorInfo_CompositeTensor, :dtype => Int32, :tensor_shape => TensorShapeProto] - oneofs = Int[1,1,1,0,0] - oneof_names = Symbol[Symbol("encoding")] - meta(target, TensorInfo, allflds, ProtoBuf.DEF_REQ, fnum, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, oneofs, oneof_names) - end - __meta_TensorInfo[] - end -end -function Base.getproperty(obj::TensorInfo, name::Symbol) - if name === :name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :coo_sparse - return (obj.__protobuf_jl_internal_values[name])::TensorInfo_CooSparse - elseif name === :composite_tensor - return (obj.__protobuf_jl_internal_values[name])::TensorInfo_CompositeTensor - elseif name === :dtype - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :tensor_shape - return (obj.__protobuf_jl_internal_values[name])::TensorShapeProto - else - getfield(obj, name) - end -end - -mutable struct SignatureDef_InputsEntry <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function SignatureDef_InputsEntry(; kwargs...) - obj = new(meta(SignatureDef_InputsEntry), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct SignatureDef_InputsEntry (mapentry) (has cyclic type dependency) -const __meta_SignatureDef_InputsEntry = Ref{ProtoMeta}() -function meta(::Type{SignatureDef_InputsEntry}) - ProtoBuf.metalock() do - if !isassigned(__meta_SignatureDef_InputsEntry) - __meta_SignatureDef_InputsEntry[] = target = ProtoMeta(SignatureDef_InputsEntry) - allflds = Pair{Symbol,Union{Type,String}}[:key => AbstractString, :value => TensorInfo] - meta(target, SignatureDef_InputsEntry, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_SignatureDef_InputsEntry[] - end -end -function Base.getproperty(obj::SignatureDef_InputsEntry, name::Symbol) - if name === :key - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :value - return (obj.__protobuf_jl_internal_values[name])::TensorInfo - else - getfield(obj, name) - end -end - -mutable struct SignatureDef_OutputsEntry <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function SignatureDef_OutputsEntry(; kwargs...) - obj = new(meta(SignatureDef_OutputsEntry), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct SignatureDef_OutputsEntry (mapentry) (has cyclic type dependency) -const __meta_SignatureDef_OutputsEntry = Ref{ProtoMeta}() -function meta(::Type{SignatureDef_OutputsEntry}) - ProtoBuf.metalock() do - if !isassigned(__meta_SignatureDef_OutputsEntry) - __meta_SignatureDef_OutputsEntry[] = target = ProtoMeta(SignatureDef_OutputsEntry) - allflds = Pair{Symbol,Union{Type,String}}[:key => AbstractString, :value => TensorInfo] - meta(target, SignatureDef_OutputsEntry, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_SignatureDef_OutputsEntry[] - end -end -function Base.getproperty(obj::SignatureDef_OutputsEntry, name::Symbol) - if name === :key - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :value - return (obj.__protobuf_jl_internal_values[name])::TensorInfo - else - getfield(obj, name) - end -end - -mutable struct SignatureDef <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function SignatureDef(; kwargs...) - obj = new(meta(SignatureDef), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct SignatureDef (has cyclic type dependency) -const __meta_SignatureDef = Ref{ProtoMeta}() -function meta(::Type{SignatureDef}) - ProtoBuf.metalock() do - if !isassigned(__meta_SignatureDef) - __meta_SignatureDef[] = target = ProtoMeta(SignatureDef) - allflds = Pair{Symbol,Union{Type,String}}[:inputs => "Base.Dict{AbstractString,TensorInfo}", :outputs => "Base.Dict{AbstractString,TensorInfo}", :method_name => AbstractString] - meta(target, SignatureDef, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_SignatureDef[] - end -end -function Base.getproperty(obj::SignatureDef, name::Symbol) - if name === :inputs - return (obj.__protobuf_jl_internal_values[name])::Any - elseif name === :outputs - return (obj.__protobuf_jl_internal_values[name])::Any - elseif name === :method_name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - else - getfield(obj, name) - end -end - -mutable struct AssetFileDef <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function AssetFileDef(; kwargs...) - obj = new(meta(AssetFileDef), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct AssetFileDef (has cyclic type dependency) -const __meta_AssetFileDef = Ref{ProtoMeta}() -function meta(::Type{AssetFileDef}) - ProtoBuf.metalock() do - if !isassigned(__meta_AssetFileDef) - __meta_AssetFileDef[] = target = ProtoMeta(AssetFileDef) - allflds = Pair{Symbol,Union{Type,String}}[:tensor_info => TensorInfo, :filename => AbstractString] - meta(target, AssetFileDef, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_AssetFileDef[] - end -end -function Base.getproperty(obj::AssetFileDef, name::Symbol) - if name === :tensor_info - return (obj.__protobuf_jl_internal_values[name])::TensorInfo - elseif name === :filename - return (obj.__protobuf_jl_internal_values[name])::AbstractString - else - getfield(obj, name) - end -end - -export MetaGraphDef_MetaInfoDef_FunctionAliasesEntry, MetaGraphDef_MetaInfoDef, MetaGraphDef_CollectionDefEntry, MetaGraphDef_SignatureDefEntry, MetaGraphDef, CollectionDef_NodeList, CollectionDef_BytesList, CollectionDef_Int64List, CollectionDef_FloatList, CollectionDef_AnyList, CollectionDef, TensorInfo_CooSparse, TensorInfo_CompositeTensor, TensorInfo, SignatureDef_InputsEntry, SignatureDef_OutputsEntry, SignatureDef, AssetFileDef, MetaGraphDef_SignatureDefEntry, MetaGraphDef, TensorInfo_CompositeTensor, TensorInfo, SignatureDef_InputsEntry, SignatureDef_OutputsEntry, SignatureDef, AssetFileDef -# mapentries: "MetaGraphDef_MetaInfoDef_FunctionAliasesEntry" => ("AbstractString", "AbstractString"), "MetaGraphDef_SignatureDefEntry" => ("AbstractString", "SignatureDef"), "MetaGraphDef_CollectionDefEntry" => ("AbstractString", "CollectionDef"), "SignatureDef_InputsEntry" => ("AbstractString", "TensorInfo"), "SignatureDef_OutputsEntry" => ("AbstractString", "TensorInfo") diff --git a/src/protojl/tensorboard/node_def_pb.jl b/src/protojl/tensorboard/node_def_pb.jl deleted file mode 100644 index 165610a..0000000 --- a/src/protojl/tensorboard/node_def_pb.jl +++ /dev/null @@ -1,131 +0,0 @@ -# syntax: proto3 -using ProtoBuf -import ProtoBuf.meta - -mutable struct NodeDef_AttrEntry <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function NodeDef_AttrEntry(; kwargs...) - obj = new(meta(NodeDef_AttrEntry), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct NodeDef_AttrEntry (mapentry) -const __meta_NodeDef_AttrEntry = Ref{ProtoMeta}() -function meta(::Type{NodeDef_AttrEntry}) - ProtoBuf.metalock() do - if !isassigned(__meta_NodeDef_AttrEntry) - __meta_NodeDef_AttrEntry[] = target = ProtoMeta(NodeDef_AttrEntry) - allflds = Pair{Symbol,Union{Type,String}}[:key => AbstractString, :value => AttrValue] - meta(target, NodeDef_AttrEntry, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_NodeDef_AttrEntry[] - end -end -function Base.getproperty(obj::NodeDef_AttrEntry, name::Symbol) - if name === :key - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :value - return (obj.__protobuf_jl_internal_values[name])::AttrValue - else - getfield(obj, name) - end -end - -mutable struct NodeDef_ExperimentalDebugInfo <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function NodeDef_ExperimentalDebugInfo(; kwargs...) - obj = new(meta(NodeDef_ExperimentalDebugInfo), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct NodeDef_ExperimentalDebugInfo -const __meta_NodeDef_ExperimentalDebugInfo = Ref{ProtoMeta}() -function meta(::Type{NodeDef_ExperimentalDebugInfo}) - ProtoBuf.metalock() do - if !isassigned(__meta_NodeDef_ExperimentalDebugInfo) - __meta_NodeDef_ExperimentalDebugInfo[] = target = ProtoMeta(NodeDef_ExperimentalDebugInfo) - allflds = Pair{Symbol,Union{Type,String}}[:original_node_names => Base.Vector{AbstractString}, :original_func_names => Base.Vector{AbstractString}] - meta(target, NodeDef_ExperimentalDebugInfo, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_NodeDef_ExperimentalDebugInfo[] - end -end -function Base.getproperty(obj::NodeDef_ExperimentalDebugInfo, name::Symbol) - if name === :original_node_names - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{AbstractString} - elseif name === :original_func_names - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{AbstractString} - else - getfield(obj, name) - end -end - -mutable struct NodeDef <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function NodeDef(; kwargs...) - obj = new(meta(NodeDef), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct NodeDef -const __meta_NodeDef = Ref{ProtoMeta}() -function meta(::Type{NodeDef}) - ProtoBuf.metalock() do - if !isassigned(__meta_NodeDef) - __meta_NodeDef[] = target = ProtoMeta(NodeDef) - allflds = Pair{Symbol,Union{Type,String}}[:name => AbstractString, :op => AbstractString, :input => Base.Vector{AbstractString}, :device => AbstractString, :attr => Base.Dict{AbstractString,AttrValue}, :experimental_debug_info => NodeDef_ExperimentalDebugInfo] - meta(target, NodeDef, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_NodeDef[] - end -end -function Base.getproperty(obj::NodeDef, name::Symbol) - if name === :name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :op - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :input - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{AbstractString} - elseif name === :device - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :attr - return (obj.__protobuf_jl_internal_values[name])::Base.Dict{AbstractString,AttrValue} - elseif name === :experimental_debug_info - return (obj.__protobuf_jl_internal_values[name])::NodeDef_ExperimentalDebugInfo - else - getfield(obj, name) - end -end - -export NodeDef_AttrEntry, NodeDef_ExperimentalDebugInfo, NodeDef -# mapentries: "NodeDef_AttrEntry" => ("AbstractString", "AttrValue") diff --git a/src/protojl/tensorboard/op_def_pb.jl b/src/protojl/tensorboard/op_def_pb.jl deleted file mode 100644 index e672ec5..0000000 --- a/src/protojl/tensorboard/op_def_pb.jl +++ /dev/null @@ -1,240 +0,0 @@ -# syntax: proto3 -using ProtoBuf -import ProtoBuf.meta - -mutable struct OpDeprecation <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function OpDeprecation(; kwargs...) - obj = new(meta(OpDeprecation), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct OpDeprecation -const __meta_OpDeprecation = Ref{ProtoMeta}() -function meta(::Type{OpDeprecation}) - ProtoBuf.metalock() do - if !isassigned(__meta_OpDeprecation) - __meta_OpDeprecation[] = target = ProtoMeta(OpDeprecation) - allflds = Pair{Symbol,Union{Type,String}}[:version => Int32, :explanation => AbstractString] - meta(target, OpDeprecation, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_OpDeprecation[] - end -end -function Base.getproperty(obj::OpDeprecation, name::Symbol) - if name === :version - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :explanation - return (obj.__protobuf_jl_internal_values[name])::AbstractString - else - getfield(obj, name) - end -end - -mutable struct OpDef_ArgDef <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function OpDef_ArgDef(; kwargs...) - obj = new(meta(OpDef_ArgDef), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct OpDef_ArgDef -const __meta_OpDef_ArgDef = Ref{ProtoMeta}() -function meta(::Type{OpDef_ArgDef}) - ProtoBuf.metalock() do - if !isassigned(__meta_OpDef_ArgDef) - __meta_OpDef_ArgDef[] = target = ProtoMeta(OpDef_ArgDef) - fnum = Int[1,2,3,4,5,6,16] - allflds = Pair{Symbol,Union{Type,String}}[:name => AbstractString, :description => AbstractString, :_type => Int32, :type_attr => AbstractString, :number_attr => AbstractString, :type_list_attr => AbstractString, :is_ref => Bool] - meta(target, OpDef_ArgDef, allflds, ProtoBuf.DEF_REQ, fnum, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_OpDef_ArgDef[] - end -end -function Base.getproperty(obj::OpDef_ArgDef, name::Symbol) - if name === :name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :description - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :_type - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :type_attr - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :number_attr - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :type_list_attr - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :is_ref - return (obj.__protobuf_jl_internal_values[name])::Bool - else - getfield(obj, name) - end -end - -mutable struct OpDef_AttrDef <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function OpDef_AttrDef(; kwargs...) - obj = new(meta(OpDef_AttrDef), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct OpDef_AttrDef -const __meta_OpDef_AttrDef = Ref{ProtoMeta}() -function meta(::Type{OpDef_AttrDef}) - ProtoBuf.metalock() do - if !isassigned(__meta_OpDef_AttrDef) - __meta_OpDef_AttrDef[] = target = ProtoMeta(OpDef_AttrDef) - allflds = Pair{Symbol,Union{Type,String}}[:name => AbstractString, :_type => AbstractString, :default_value => AttrValue, :description => AbstractString, :has_minimum => Bool, :minimum => Int64, :allowed_values => AttrValue] - meta(target, OpDef_AttrDef, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_OpDef_AttrDef[] - end -end -function Base.getproperty(obj::OpDef_AttrDef, name::Symbol) - if name === :name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :_type - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :default_value - return (obj.__protobuf_jl_internal_values[name])::AttrValue - elseif name === :description - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :has_minimum - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :minimum - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :allowed_values - return (obj.__protobuf_jl_internal_values[name])::AttrValue - else - getfield(obj, name) - end -end - -mutable struct OpDef <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function OpDef(; kwargs...) - obj = new(meta(OpDef), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct OpDef -const __meta_OpDef = Ref{ProtoMeta}() -function meta(::Type{OpDef}) - ProtoBuf.metalock() do - if !isassigned(__meta_OpDef) - __meta_OpDef[] = target = ProtoMeta(OpDef) - fnum = Int[1,2,3,20,4,8,5,6,18,16,17,19] - allflds = Pair{Symbol,Union{Type,String}}[:name => AbstractString, :input_arg => Base.Vector{OpDef_ArgDef}, :output_arg => Base.Vector{OpDef_ArgDef}, :control_output => Base.Vector{AbstractString}, :attr => Base.Vector{OpDef_AttrDef}, :deprecation => OpDeprecation, :summary => AbstractString, :description => AbstractString, :is_commutative => Bool, :is_aggregate => Bool, :is_stateful => Bool, :allows_uninitialized_input => Bool] - meta(target, OpDef, allflds, ProtoBuf.DEF_REQ, fnum, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_OpDef[] - end -end -function Base.getproperty(obj::OpDef, name::Symbol) - if name === :name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :input_arg - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{OpDef_ArgDef} - elseif name === :output_arg - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{OpDef_ArgDef} - elseif name === :control_output - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{AbstractString} - elseif name === :attr - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{OpDef_AttrDef} - elseif name === :deprecation - return (obj.__protobuf_jl_internal_values[name])::OpDeprecation - elseif name === :summary - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :description - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :is_commutative - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :is_aggregate - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :is_stateful - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :allows_uninitialized_input - return (obj.__protobuf_jl_internal_values[name])::Bool - else - getfield(obj, name) - end -end - -mutable struct OpList <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function OpList(; kwargs...) - obj = new(meta(OpList), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct OpList -const __meta_OpList = Ref{ProtoMeta}() -function meta(::Type{OpList}) - ProtoBuf.metalock() do - if !isassigned(__meta_OpList) - __meta_OpList[] = target = ProtoMeta(OpList) - allflds = Pair{Symbol,Union{Type,String}}[:op => Base.Vector{OpDef}] - meta(target, OpList, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_OpList[] - end -end -function Base.getproperty(obj::OpList, name::Symbol) - if name === :op - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{OpDef} - else - getfield(obj, name) - end -end - -export OpDef_ArgDef, OpDef_AttrDef, OpDef, OpDeprecation, OpList diff --git a/src/protojl/tensorboard/plugins/custom_scalar/layout_pb.jl b/src/protojl/tensorboard/plugins/custom_scalar/layout_pb.jl deleted file mode 100644 index 1bdb09a..0000000 --- a/src/protojl/tensorboard/plugins/custom_scalar/layout_pb.jl +++ /dev/null @@ -1,243 +0,0 @@ -# syntax: proto3 -using ProtoBuf -import ProtoBuf.meta - -mutable struct MultilineChartContent <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function MultilineChartContent(; kwargs...) - obj = new(meta(MultilineChartContent), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct MultilineChartContent -const __meta_MultilineChartContent = Ref{ProtoMeta}() -function meta(::Type{MultilineChartContent}) - ProtoBuf.metalock() do - if !isassigned(__meta_MultilineChartContent) - __meta_MultilineChartContent[] = target = ProtoMeta(MultilineChartContent) - allflds = Pair{Symbol,Union{Type,String}}[:tag => Base.Vector{AbstractString}] - meta(target, MultilineChartContent, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_MultilineChartContent[] - end -end -function Base.getproperty(obj::MultilineChartContent, name::Symbol) - if name === :tag - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{AbstractString} - else - getfield(obj, name) - end -end - -mutable struct MarginChartContent_Series <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function MarginChartContent_Series(; kwargs...) - obj = new(meta(MarginChartContent_Series), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct MarginChartContent_Series -const __meta_MarginChartContent_Series = Ref{ProtoMeta}() -function meta(::Type{MarginChartContent_Series}) - ProtoBuf.metalock() do - if !isassigned(__meta_MarginChartContent_Series) - __meta_MarginChartContent_Series[] = target = ProtoMeta(MarginChartContent_Series) - allflds = Pair{Symbol,Union{Type,String}}[:value => AbstractString, :lower => AbstractString, :upper => AbstractString] - meta(target, MarginChartContent_Series, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_MarginChartContent_Series[] - end -end -function Base.getproperty(obj::MarginChartContent_Series, name::Symbol) - if name === :value - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :lower - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :upper - return (obj.__protobuf_jl_internal_values[name])::AbstractString - else - getfield(obj, name) - end -end - -mutable struct MarginChartContent <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function MarginChartContent(; kwargs...) - obj = new(meta(MarginChartContent), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct MarginChartContent -const __meta_MarginChartContent = Ref{ProtoMeta}() -function meta(::Type{MarginChartContent}) - ProtoBuf.metalock() do - if !isassigned(__meta_MarginChartContent) - __meta_MarginChartContent[] = target = ProtoMeta(MarginChartContent) - allflds = Pair{Symbol,Union{Type,String}}[:series => Base.Vector{MarginChartContent_Series}] - meta(target, MarginChartContent, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_MarginChartContent[] - end -end -function Base.getproperty(obj::MarginChartContent, name::Symbol) - if name === :series - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{MarginChartContent_Series} - else - getfield(obj, name) - end -end - -mutable struct Chart <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function Chart(; kwargs...) - obj = new(meta(Chart), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct Chart -const __meta_Chart = Ref{ProtoMeta}() -function meta(::Type{Chart}) - ProtoBuf.metalock() do - if !isassigned(__meta_Chart) - __meta_Chart[] = target = ProtoMeta(Chart) - allflds = Pair{Symbol,Union{Type,String}}[:title => AbstractString, :multiline => MultilineChartContent, :margin => MarginChartContent] - oneofs = Int[0,1,1] - oneof_names = Symbol[Symbol("content")] - meta(target, Chart, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, oneofs, oneof_names) - end - __meta_Chart[] - end -end -function Base.getproperty(obj::Chart, name::Symbol) - if name === :title - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :multiline - return (obj.__protobuf_jl_internal_values[name])::MultilineChartContent - elseif name === :margin - return (obj.__protobuf_jl_internal_values[name])::MarginChartContent - else - getfield(obj, name) - end -end - -mutable struct Category <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function Category(; kwargs...) - obj = new(meta(Category), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct Category -const __meta_Category = Ref{ProtoMeta}() -function meta(::Type{Category}) - ProtoBuf.metalock() do - if !isassigned(__meta_Category) - __meta_Category[] = target = ProtoMeta(Category) - allflds = Pair{Symbol,Union{Type,String}}[:title => AbstractString, :chart => Base.Vector{Chart}, :closed => Bool] - meta(target, Category, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_Category[] - end -end -function Base.getproperty(obj::Category, name::Symbol) - if name === :title - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :chart - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Chart} - elseif name === :closed - return (obj.__protobuf_jl_internal_values[name])::Bool - else - getfield(obj, name) - end -end - -mutable struct Layout <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function Layout(; kwargs...) - obj = new(meta(Layout), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct Layout -const __meta_Layout = Ref{ProtoMeta}() -function meta(::Type{Layout}) - ProtoBuf.metalock() do - if !isassigned(__meta_Layout) - __meta_Layout[] = target = ProtoMeta(Layout) - allflds = Pair{Symbol,Union{Type,String}}[:version => Int32, :category => Base.Vector{Category}] - meta(target, Layout, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_Layout[] - end -end -function Base.getproperty(obj::Layout, name::Symbol) - if name === :version - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :category - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Category} - else - getfield(obj, name) - end -end - -export Chart, MultilineChartContent, MarginChartContent_Series, MarginChartContent, Category, Layout diff --git a/src/protojl/tensorboard/plugins/custom_scalar/tensorboard.jl b/src/protojl/tensorboard/plugins/custom_scalar/tensorboard.jl deleted file mode 100644 index 06f6b30..0000000 --- a/src/protojl/tensorboard/plugins/custom_scalar/tensorboard.jl +++ /dev/null @@ -1,4 +0,0 @@ -module tensorboard - const _ProtoBuf_Top_ = @static isdefined(parentmodule(@__MODULE__), :_ProtoBuf_Top_) ? (parentmodule(@__MODULE__))._ProtoBuf_Top_ : parentmodule(@__MODULE__) - include("layout_pb.jl") -end diff --git a/src/protojl/tensorboard/plugins/custom_scalar/tensorboard/layout_pb.jl b/src/protojl/tensorboard/plugins/custom_scalar/tensorboard/layout_pb.jl new file mode 100644 index 0000000..38306b7 --- /dev/null +++ b/src/protojl/tensorboard/plugins/custom_scalar/tensorboard/layout_pb.jl @@ -0,0 +1,240 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:24.964 +# original file: /home/lior/TensorBoardLogger.jl/gen/proto/tensorboard/plugins/custom_scalar/layout.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export MultilineChartContent, var"MarginChartContent.Series", MarginChartContent, Chart +export Category, Layout + +struct MultilineChartContent + tag::Vector{String} +end +PB.default_values(::Type{MultilineChartContent}) = (;tag = Vector{String}()) +PB.field_numbers(::Type{MultilineChartContent}) = (;tag = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:MultilineChartContent}) + tag = PB.BufferedVector{String}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, tag) + else + PB.skip(d, wire_type) + end + end + return MultilineChartContent(tag[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::MultilineChartContent) + initpos = position(e.io) + !isempty(x.tag) && PB.encode(e, 1, x.tag) + return position(e.io) - initpos +end +function PB._encoded_size(x::MultilineChartContent) + encoded_size = 0 + !isempty(x.tag) && (encoded_size += PB._encoded_size(x.tag, 1)) + return encoded_size +end + +struct var"MarginChartContent.Series" + value::String + lower::String + upper::String +end +PB.default_values(::Type{var"MarginChartContent.Series"}) = (;value = "", lower = "", upper = "") +PB.field_numbers(::Type{var"MarginChartContent.Series"}) = (;value = 1, lower = 2, upper = 3) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"MarginChartContent.Series"}) + value = "" + lower = "" + upper = "" + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + value = PB.decode(d, String) + elseif field_number == 2 + lower = PB.decode(d, String) + elseif field_number == 3 + upper = PB.decode(d, String) + else + PB.skip(d, wire_type) + end + end + return var"MarginChartContent.Series"(value, lower, upper) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"MarginChartContent.Series") + initpos = position(e.io) + !isempty(x.value) && PB.encode(e, 1, x.value) + !isempty(x.lower) && PB.encode(e, 2, x.lower) + !isempty(x.upper) && PB.encode(e, 3, x.upper) + return position(e.io) - initpos +end +function PB._encoded_size(x::var"MarginChartContent.Series") + encoded_size = 0 + !isempty(x.value) && (encoded_size += PB._encoded_size(x.value, 1)) + !isempty(x.lower) && (encoded_size += PB._encoded_size(x.lower, 2)) + !isempty(x.upper) && (encoded_size += PB._encoded_size(x.upper, 3)) + return encoded_size +end + +struct MarginChartContent + series::Vector{var"MarginChartContent.Series"} +end +PB.default_values(::Type{MarginChartContent}) = (;series = Vector{var"MarginChartContent.Series"}()) +PB.field_numbers(::Type{MarginChartContent}) = (;series = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:MarginChartContent}) + series = PB.BufferedVector{var"MarginChartContent.Series"}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, series) + else + PB.skip(d, wire_type) + end + end + return MarginChartContent(series[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::MarginChartContent) + initpos = position(e.io) + !isempty(x.series) && PB.encode(e, 1, x.series) + return position(e.io) - initpos +end +function PB._encoded_size(x::MarginChartContent) + encoded_size = 0 + !isempty(x.series) && (encoded_size += PB._encoded_size(x.series, 1)) + return encoded_size +end + +struct Chart + title::String + content::Union{Nothing,OneOf{<:Union{MultilineChartContent,MarginChartContent}}} +end +PB.oneof_field_types(::Type{Chart}) = (; + content = (;multiline=MultilineChartContent, margin=MarginChartContent), +) +PB.default_values(::Type{Chart}) = (;title = "", multiline = nothing, margin = nothing) +PB.field_numbers(::Type{Chart}) = (;title = 1, multiline = 2, margin = 3) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:Chart}) + title = "" + content = nothing + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + title = PB.decode(d, String) + elseif field_number == 2 + content = OneOf(:multiline, PB.decode(d, Ref{MultilineChartContent})) + elseif field_number == 3 + content = OneOf(:margin, PB.decode(d, Ref{MarginChartContent})) + else + PB.skip(d, wire_type) + end + end + return Chart(title, content) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::Chart) + initpos = position(e.io) + !isempty(x.title) && PB.encode(e, 1, x.title) + if isnothing(x.content); + elseif x.content.name === :multiline + PB.encode(e, 2, x.content[]::MultilineChartContent) + elseif x.content.name === :margin + PB.encode(e, 3, x.content[]::MarginChartContent) + end + return position(e.io) - initpos +end +function PB._encoded_size(x::Chart) + encoded_size = 0 + !isempty(x.title) && (encoded_size += PB._encoded_size(x.title, 1)) + if isnothing(x.content); + elseif x.content.name === :multiline + encoded_size += PB._encoded_size(x.content[]::MultilineChartContent, 2) + elseif x.content.name === :margin + encoded_size += PB._encoded_size(x.content[]::MarginChartContent, 3) + end + return encoded_size +end + +struct Category + title::String + chart::Vector{Chart} + closed::Bool +end +PB.default_values(::Type{Category}) = (;title = "", chart = Vector{Chart}(), closed = false) +PB.field_numbers(::Type{Category}) = (;title = 1, chart = 2, closed = 3) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:Category}) + title = "" + chart = PB.BufferedVector{Chart}() + closed = false + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + title = PB.decode(d, String) + elseif field_number == 2 + PB.decode!(d, chart) + elseif field_number == 3 + closed = PB.decode(d, Bool) + else + PB.skip(d, wire_type) + end + end + return Category(title, chart[], closed) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::Category) + initpos = position(e.io) + !isempty(x.title) && PB.encode(e, 1, x.title) + !isempty(x.chart) && PB.encode(e, 2, x.chart) + x.closed != false && PB.encode(e, 3, x.closed) + return position(e.io) - initpos +end +function PB._encoded_size(x::Category) + encoded_size = 0 + !isempty(x.title) && (encoded_size += PB._encoded_size(x.title, 1)) + !isempty(x.chart) && (encoded_size += PB._encoded_size(x.chart, 2)) + x.closed != false && (encoded_size += PB._encoded_size(x.closed, 3)) + return encoded_size +end + +struct Layout + version::Int32 + category::Vector{Category} +end +PB.default_values(::Type{Layout}) = (;version = zero(Int32), category = Vector{Category}()) +PB.field_numbers(::Type{Layout}) = (;version = 1, category = 2) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:Layout}) + version = zero(Int32) + category = PB.BufferedVector{Category}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + version = PB.decode(d, Int32) + elseif field_number == 2 + PB.decode!(d, category) + else + PB.skip(d, wire_type) + end + end + return Layout(version, category[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::Layout) + initpos = position(e.io) + x.version != zero(Int32) && PB.encode(e, 1, x.version) + !isempty(x.category) && PB.encode(e, 2, x.category) + return position(e.io) - initpos +end +function PB._encoded_size(x::Layout) + encoded_size = 0 + x.version != zero(Int32) && (encoded_size += PB._encoded_size(x.version, 1)) + !isempty(x.category) && (encoded_size += PB._encoded_size(x.category, 2)) + return encoded_size +end diff --git a/src/protojl/tensorboard/plugins/custom_scalar/tensorboard/tensorboard.jl b/src/protojl/tensorboard/plugins/custom_scalar/tensorboard/tensorboard.jl new file mode 100644 index 0000000..5889821 --- /dev/null +++ b/src/protojl/tensorboard/plugins/custom_scalar/tensorboard/tensorboard.jl @@ -0,0 +1,5 @@ +module tensorboard_plugin_custom_scalar + +include("layout_pb.jl") + +end # module tensorboard diff --git a/src/protojl/tensorboard/plugins/hparams/api_pb.jl b/src/protojl/tensorboard/plugins/hparams/api_pb.jl deleted file mode 100644 index 7c6fb34..0000000 --- a/src/protojl/tensorboard/plugins/hparams/api_pb.jl +++ /dev/null @@ -1,659 +0,0 @@ -# syntax: proto3 -using ProtoBuf -import ProtoBuf.meta -import ProtoBuf.google.protobuf - -const _DataType = (;[ - Symbol("DATA_TYPE_UNSET") => Int32(0), - Symbol("DATA_TYPE_STRING") => Int32(1), - Symbol("DATA_TYPE_BOOL") => Int32(2), - Symbol("DATA_TYPE_FLOAT64") => Int32(3), -]...) - -const DatasetType = (;[ - Symbol("DATASET_UNKNOWN") => Int32(0), - Symbol("DATASET_TRAINING") => Int32(1), - Symbol("DATASET_VALIDATION") => Int32(2), -]...) - -const Status = (;[ - Symbol("STATUS_UNKNOWN") => Int32(0), - Symbol("STATUS_SUCCESS") => Int32(1), - Symbol("STATUS_FAILURE") => Int32(2), - Symbol("STATUS_RUNNING") => Int32(3), -]...) - -const SortOrder = (;[ - Symbol("ORDER_UNSPECIFIED") => Int32(0), - Symbol("ORDER_ASC") => Int32(1), - Symbol("ORDER_DESC") => Int32(2), -]...) - -const AggregationType = (;[ - Symbol("AGGREGATION_UNSET") => Int32(0), - Symbol("AGGREGATION_AVG") => Int32(1), - Symbol("AGGREGATION_MEDIAN") => Int32(2), - Symbol("AGGREGATION_MIN") => Int32(3), - Symbol("AGGREGATION_MAX") => Int32(4), -]...) - -mutable struct Interval <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function Interval(; kwargs...) - obj = new(meta(Interval), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct Interval -const __meta_Interval = Ref{ProtoMeta}() -function meta(::Type{Interval}) - ProtoBuf.metalock() do - if !isassigned(__meta_Interval) - __meta_Interval[] = target = ProtoMeta(Interval) - allflds = Pair{Symbol,Union{Type,String}}[:min_value => Float64, :max_value => Float64] - meta(target, Interval, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_Interval[] - end -end -function Base.getproperty(obj::Interval, name::Symbol) - if name === :min_value - return (obj.__protobuf_jl_internal_values[name])::Float64 - elseif name === :max_value - return (obj.__protobuf_jl_internal_values[name])::Float64 - else - getfield(obj, name) - end -end - -mutable struct HParamInfo <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function HParamInfo(; kwargs...) - obj = new(meta(HParamInfo), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct HParamInfo -const __meta_HParamInfo = Ref{ProtoMeta}() -function meta(::Type{HParamInfo}) - ProtoBuf.metalock() do - if !isassigned(__meta_HParamInfo) - __meta_HParamInfo[] = target = ProtoMeta(HParamInfo) - allflds = Pair{Symbol,Union{Type,String}}[:name => AbstractString, :display_name => AbstractString, :description => AbstractString, :_type => Int32, :domain_discrete => ProtoBuf.google.protobuf.ListValue, :domain_interval => Interval] - oneofs = Int[0,0,0,0,1,1] - oneof_names = Symbol[Symbol("domain")] - meta(target, HParamInfo, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, oneofs, oneof_names) - end - __meta_HParamInfo[] - end -end -function Base.getproperty(obj::HParamInfo, name::Symbol) - if name === :name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :display_name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :description - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :_type - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :domain_discrete - return (obj.__protobuf_jl_internal_values[name])::ProtoBuf.google.protobuf.ListValue - elseif name === :domain_interval - return (obj.__protobuf_jl_internal_values[name])::Interval - else - getfield(obj, name) - end -end - -mutable struct MetricName <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function MetricName(; kwargs...) - obj = new(meta(MetricName), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct MetricName -const __meta_MetricName = Ref{ProtoMeta}() -function meta(::Type{MetricName}) - ProtoBuf.metalock() do - if !isassigned(__meta_MetricName) - __meta_MetricName[] = target = ProtoMeta(MetricName) - allflds = Pair{Symbol,Union{Type,String}}[:group => AbstractString, :tag => AbstractString] - meta(target, MetricName, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_MetricName[] - end -end -function Base.getproperty(obj::MetricName, name::Symbol) - if name === :group - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :tag - return (obj.__protobuf_jl_internal_values[name])::AbstractString - else - getfield(obj, name) - end -end - -mutable struct MetricInfo <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function MetricInfo(; kwargs...) - obj = new(meta(MetricInfo), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct MetricInfo -const __meta_MetricInfo = Ref{ProtoMeta}() -function meta(::Type{MetricInfo}) - ProtoBuf.metalock() do - if !isassigned(__meta_MetricInfo) - __meta_MetricInfo[] = target = ProtoMeta(MetricInfo) - fnum = Int[1,3,4,5] - allflds = Pair{Symbol,Union{Type,String}}[:name => MetricName, :display_name => AbstractString, :description => AbstractString, :dataset_type => Int32] - meta(target, MetricInfo, allflds, ProtoBuf.DEF_REQ, fnum, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_MetricInfo[] - end -end -function Base.getproperty(obj::MetricInfo, name::Symbol) - if name === :name - return (obj.__protobuf_jl_internal_values[name])::MetricName - elseif name === :display_name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :description - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :dataset_type - return (obj.__protobuf_jl_internal_values[name])::Int32 - else - getfield(obj, name) - end -end - -mutable struct Experiment <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function Experiment(; kwargs...) - obj = new(meta(Experiment), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct Experiment -const __meta_Experiment = Ref{ProtoMeta}() -function meta(::Type{Experiment}) - ProtoBuf.metalock() do - if !isassigned(__meta_Experiment) - __meta_Experiment[] = target = ProtoMeta(Experiment) - fnum = Int[6,1,2,3,4,5] - allflds = Pair{Symbol,Union{Type,String}}[:name => AbstractString, :description => AbstractString, :user => AbstractString, :time_created_secs => Float64, :hparam_infos => Base.Vector{HParamInfo}, :metric_infos => Base.Vector{MetricInfo}] - meta(target, Experiment, allflds, ProtoBuf.DEF_REQ, fnum, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_Experiment[] - end -end -function Base.getproperty(obj::Experiment, name::Symbol) - if name === :name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :description - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :user - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :time_created_secs - return (obj.__protobuf_jl_internal_values[name])::Float64 - elseif name === :hparam_infos - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{HParamInfo} - elseif name === :metric_infos - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{MetricInfo} - else - getfield(obj, name) - end -end - -mutable struct MetricValue <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function MetricValue(; kwargs...) - obj = new(meta(MetricValue), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct MetricValue -const __meta_MetricValue = Ref{ProtoMeta}() -function meta(::Type{MetricValue}) - ProtoBuf.metalock() do - if !isassigned(__meta_MetricValue) - __meta_MetricValue[] = target = ProtoMeta(MetricValue) - allflds = Pair{Symbol,Union{Type,String}}[:name => MetricName, :value => Float64, :training_step => Int32, :wall_time_secs => Float64] - meta(target, MetricValue, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_MetricValue[] - end -end -function Base.getproperty(obj::MetricValue, name::Symbol) - if name === :name - return (obj.__protobuf_jl_internal_values[name])::MetricName - elseif name === :value - return (obj.__protobuf_jl_internal_values[name])::Float64 - elseif name === :training_step - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :wall_time_secs - return (obj.__protobuf_jl_internal_values[name])::Float64 - else - getfield(obj, name) - end -end - -mutable struct Session <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function Session(; kwargs...) - obj = new(meta(Session), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct Session -const __meta_Session = Ref{ProtoMeta}() -function meta(::Type{Session}) - ProtoBuf.metalock() do - if !isassigned(__meta_Session) - __meta_Session[] = target = ProtoMeta(Session) - allflds = Pair{Symbol,Union{Type,String}}[:name => AbstractString, :start_time_secs => Float64, :end_time_secs => Float64, :status => Int32, :model_uri => AbstractString, :metric_values => Base.Vector{MetricValue}, :monitor_url => AbstractString] - meta(target, Session, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_Session[] - end -end -function Base.getproperty(obj::Session, name::Symbol) - if name === :name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :start_time_secs - return (obj.__protobuf_jl_internal_values[name])::Float64 - elseif name === :end_time_secs - return (obj.__protobuf_jl_internal_values[name])::Float64 - elseif name === :status - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :model_uri - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :metric_values - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{MetricValue} - elseif name === :monitor_url - return (obj.__protobuf_jl_internal_values[name])::AbstractString - else - getfield(obj, name) - end -end - -mutable struct SessionGroup_HparamsEntry <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function SessionGroup_HparamsEntry(; kwargs...) - obj = new(meta(SessionGroup_HparamsEntry), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct SessionGroup_HparamsEntry (mapentry) -const __meta_SessionGroup_HparamsEntry = Ref{ProtoMeta}() -function meta(::Type{SessionGroup_HparamsEntry}) - ProtoBuf.metalock() do - if !isassigned(__meta_SessionGroup_HparamsEntry) - __meta_SessionGroup_HparamsEntry[] = target = ProtoMeta(SessionGroup_HparamsEntry) - allflds = Pair{Symbol,Union{Type,String}}[:key => AbstractString, :value => ProtoBuf.google.protobuf.Value] - meta(target, SessionGroup_HparamsEntry, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_SessionGroup_HparamsEntry[] - end -end -function Base.getproperty(obj::SessionGroup_HparamsEntry, name::Symbol) - if name === :key - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :value - return (obj.__protobuf_jl_internal_values[name])::ProtoBuf.google.protobuf.Value - else - getfield(obj, name) - end -end - -mutable struct SessionGroup <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function SessionGroup(; kwargs...) - obj = new(meta(SessionGroup), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct SessionGroup -const __meta_SessionGroup = Ref{ProtoMeta}() -function meta(::Type{SessionGroup}) - ProtoBuf.metalock() do - if !isassigned(__meta_SessionGroup) - __meta_SessionGroup[] = target = ProtoMeta(SessionGroup) - allflds = Pair{Symbol,Union{Type,String}}[:name => AbstractString, :hparams => Base.Dict{AbstractString,ProtoBuf.google.protobuf.Value}, :metric_values => Base.Vector{MetricValue}, :sessions => Base.Vector{Session}, :monitor_url => AbstractString] - meta(target, SessionGroup, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_SessionGroup[] - end -end -function Base.getproperty(obj::SessionGroup, name::Symbol) - if name === :name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :hparams - return (obj.__protobuf_jl_internal_values[name])::Base.Dict{AbstractString,ProtoBuf.google.protobuf.Value} - elseif name === :metric_values - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{MetricValue} - elseif name === :sessions - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Session} - elseif name === :monitor_url - return (obj.__protobuf_jl_internal_values[name])::AbstractString - else - getfield(obj, name) - end -end - -mutable struct GetExperimentRequest <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function GetExperimentRequest(; kwargs...) - obj = new(meta(GetExperimentRequest), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct GetExperimentRequest -const __meta_GetExperimentRequest = Ref{ProtoMeta}() -function meta(::Type{GetExperimentRequest}) - ProtoBuf.metalock() do - if !isassigned(__meta_GetExperimentRequest) - __meta_GetExperimentRequest[] = target = ProtoMeta(GetExperimentRequest) - allflds = Pair{Symbol,Union{Type,String}}[:experiment_name => AbstractString] - meta(target, GetExperimentRequest, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_GetExperimentRequest[] - end -end -function Base.getproperty(obj::GetExperimentRequest, name::Symbol) - if name === :experiment_name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - else - getfield(obj, name) - end -end - -mutable struct ColParams <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function ColParams(; kwargs...) - obj = new(meta(ColParams), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct ColParams -const __meta_ColParams = Ref{ProtoMeta}() -function meta(::Type{ColParams}) - ProtoBuf.metalock() do - if !isassigned(__meta_ColParams) - __meta_ColParams[] = target = ProtoMeta(ColParams) - allflds = Pair{Symbol,Union{Type,String}}[:metric => MetricName, :hparam => AbstractString, :order => Int32, :missing_values_first => Bool, :filter_regexp => AbstractString, :filter_interval => Interval, :filter_discrete => ProtoBuf.google.protobuf.ListValue, :exclude_missing_values => Bool] - oneofs = Int[1,1,0,0,2,2,2,0] - oneof_names = Symbol[Symbol("name"),Symbol("filter")] - meta(target, ColParams, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, oneofs, oneof_names) - end - __meta_ColParams[] - end -end -function Base.getproperty(obj::ColParams, name::Symbol) - if name === :metric - return (obj.__protobuf_jl_internal_values[name])::MetricName - elseif name === :hparam - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :order - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :missing_values_first - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :filter_regexp - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :filter_interval - return (obj.__protobuf_jl_internal_values[name])::Interval - elseif name === :filter_discrete - return (obj.__protobuf_jl_internal_values[name])::ProtoBuf.google.protobuf.ListValue - elseif name === :exclude_missing_values - return (obj.__protobuf_jl_internal_values[name])::Bool - else - getfield(obj, name) - end -end - -mutable struct ListSessionGroupsRequest <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function ListSessionGroupsRequest(; kwargs...) - obj = new(meta(ListSessionGroupsRequest), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct ListSessionGroupsRequest -const __meta_ListSessionGroupsRequest = Ref{ProtoMeta}() -function meta(::Type{ListSessionGroupsRequest}) - ProtoBuf.metalock() do - if !isassigned(__meta_ListSessionGroupsRequest) - __meta_ListSessionGroupsRequest[] = target = ProtoMeta(ListSessionGroupsRequest) - fnum = Int[6,7,1,2,3,4,5] - pack = Symbol[:allowed_statuses] - allflds = Pair{Symbol,Union{Type,String}}[:experiment_name => AbstractString, :allowed_statuses => Base.Vector{Int32}, :col_params => Base.Vector{ColParams}, :aggregation_type => Int32, :aggregation_metric => MetricName, :start_index => Int32, :slice_size => Int32] - meta(target, ListSessionGroupsRequest, allflds, ProtoBuf.DEF_REQ, fnum, ProtoBuf.DEF_VAL, pack, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_ListSessionGroupsRequest[] - end -end -function Base.getproperty(obj::ListSessionGroupsRequest, name::Symbol) - if name === :experiment_name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :allowed_statuses - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Int32} - elseif name === :col_params - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{ColParams} - elseif name === :aggregation_type - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :aggregation_metric - return (obj.__protobuf_jl_internal_values[name])::MetricName - elseif name === :start_index - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :slice_size - return (obj.__protobuf_jl_internal_values[name])::Int32 - else - getfield(obj, name) - end -end - -mutable struct ListSessionGroupsResponse <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function ListSessionGroupsResponse(; kwargs...) - obj = new(meta(ListSessionGroupsResponse), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct ListSessionGroupsResponse -const __meta_ListSessionGroupsResponse = Ref{ProtoMeta}() -function meta(::Type{ListSessionGroupsResponse}) - ProtoBuf.metalock() do - if !isassigned(__meta_ListSessionGroupsResponse) - __meta_ListSessionGroupsResponse[] = target = ProtoMeta(ListSessionGroupsResponse) - fnum = Int[1,3] - allflds = Pair{Symbol,Union{Type,String}}[:session_groups => Base.Vector{SessionGroup}, :total_size => Int32] - meta(target, ListSessionGroupsResponse, allflds, ProtoBuf.DEF_REQ, fnum, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_ListSessionGroupsResponse[] - end -end -function Base.getproperty(obj::ListSessionGroupsResponse, name::Symbol) - if name === :session_groups - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{SessionGroup} - elseif name === :total_size - return (obj.__protobuf_jl_internal_values[name])::Int32 - else - getfield(obj, name) - end -end - -mutable struct ListMetricEvalsRequest <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function ListMetricEvalsRequest(; kwargs...) - obj = new(meta(ListMetricEvalsRequest), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct ListMetricEvalsRequest -const __meta_ListMetricEvalsRequest = Ref{ProtoMeta}() -function meta(::Type{ListMetricEvalsRequest}) - ProtoBuf.metalock() do - if !isassigned(__meta_ListMetricEvalsRequest) - __meta_ListMetricEvalsRequest[] = target = ProtoMeta(ListMetricEvalsRequest) - fnum = Int[3,1,2] - allflds = Pair{Symbol,Union{Type,String}}[:experiment_name => AbstractString, :session_name => AbstractString, :metric_name => MetricName] - meta(target, ListMetricEvalsRequest, allflds, ProtoBuf.DEF_REQ, fnum, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_ListMetricEvalsRequest[] - end -end -function Base.getproperty(obj::ListMetricEvalsRequest, name::Symbol) - if name === :experiment_name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :session_name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :metric_name - return (obj.__protobuf_jl_internal_values[name])::MetricName - else - getfield(obj, name) - end -end - -export _DataType, DatasetType, Status, SortOrder, AggregationType, Experiment, HParamInfo, Interval, MetricName, MetricInfo, SessionGroup_HparamsEntry, SessionGroup, MetricValue, Session, GetExperimentRequest, ListSessionGroupsRequest, ColParams, ListSessionGroupsResponse, ListMetricEvalsRequest -# mapentries: "SessionGroup_HparamsEntry" => ("AbstractString", "ProtoBuf.google.protobuf.Value") diff --git a/src/protojl/tensorboard/plugins/hparams/google.jl b/src/protojl/tensorboard/plugins/hparams/google.jl deleted file mode 100644 index 4478be5..0000000 --- a/src/protojl/tensorboard/plugins/hparams/google.jl +++ /dev/null @@ -1,7 +0,0 @@ -module google - const _ProtoBuf_Top_ = @static isdefined(parentmodule(@__MODULE__), :_ProtoBuf_Top_) ? (parentmodule(@__MODULE__))._ProtoBuf_Top_ : parentmodule(@__MODULE__) - module protobuf - const _ProtoBuf_Top_ = @static isdefined(parentmodule(@__MODULE__), :_ProtoBuf_Top_) ? (parentmodule(@__MODULE__))._ProtoBuf_Top_ : parentmodule(@__MODULE__) - include("struct_pb.jl") - end -end diff --git a/src/protojl/tensorboard/plugins/hparams/google/google.jl b/src/protojl/tensorboard/plugins/hparams/google/google.jl new file mode 100644 index 0000000..25bf6b5 --- /dev/null +++ b/src/protojl/tensorboard/plugins/hparams/google/google.jl @@ -0,0 +1,5 @@ +module google + +include("protobuf/protobuf.jl") + +end # module google diff --git a/src/protojl/tensorboard/plugins/hparams/google/protobuf/protobuf.jl b/src/protojl/tensorboard/plugins/hparams/google/protobuf/protobuf.jl new file mode 100644 index 0000000..d33544d --- /dev/null +++ b/src/protojl/tensorboard/plugins/hparams/google/protobuf/protobuf.jl @@ -0,0 +1,5 @@ +module protobuf + +include("struct_pb.jl") + +end # module protobuf diff --git a/src/protojl/tensorboard/plugins/hparams/google/protobuf/struct_pb.jl b/src/protojl/tensorboard/plugins/hparams/google/protobuf/struct_pb.jl new file mode 100644 index 0000000..b1dbe53 --- /dev/null +++ b/src/protojl/tensorboard/plugins/hparams/google/protobuf/struct_pb.jl @@ -0,0 +1,145 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:25.011 +# original file: /home/lior/.julia/dev/ProtoBuf/src/google/protobuf/struct.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export NullValue, Struct, Value, ListValue + +# Abstract types to help resolve mutually recursive definitions +abstract type var"##AbstractStruct" end +abstract type var"##AbstractValue" end +abstract type var"##AbstractListValue" end + + +@enumx NullValue NULL_VALUE=0 + +struct Struct{T1<:Union{Nothing,var"##AbstractValue"}} <: var"##AbstractStruct" + fields::Dict{String,T1} +end +PB.default_values(::Type{Struct}) = (;fields = Dict{String,Value}()) +PB.field_numbers(::Type{Struct}) = (;fields = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:Struct}) + fields = Dict{String,Value}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, fields) + else + PB.skip(d, wire_type) + end + end + return Struct(fields) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::Struct) + initpos = position(e.io) + !isempty(x.fields) && PB.encode(e, 1, x.fields) + return position(e.io) - initpos +end +function PB._encoded_size(x::Struct) + encoded_size = 0 + !isempty(x.fields) && (encoded_size += PB._encoded_size(x.fields, 1)) + return encoded_size +end + +struct Value <: var"##AbstractValue" + kind::Union{Nothing,OneOf{<:Union{NullValue.T,Float64,String,Bool,var"##AbstractStruct",var"##AbstractListValue"}}} +end +PB.oneof_field_types(::Type{Value}) = (; + kind = (;null_value=NullValue.T, number_value=Float64, string_value=String, bool_value=Bool, struct_value=Struct, list_value=ListValue), +) +PB.default_values(::Type{Value}) = (;null_value = NullValue.NULL_VALUE, number_value = zero(Float64), string_value = "", bool_value = false, struct_value = nothing, list_value = nothing) +PB.field_numbers(::Type{Value}) = (;null_value = 1, number_value = 2, string_value = 3, bool_value = 4, struct_value = 5, list_value = 6) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:Value}) + kind = nothing + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + kind = OneOf(:null_value, PB.decode(d, NullValue.T)) + elseif field_number == 2 + kind = OneOf(:number_value, PB.decode(d, Float64)) + elseif field_number == 3 + kind = OneOf(:string_value, PB.decode(d, String)) + elseif field_number == 4 + kind = OneOf(:bool_value, PB.decode(d, Bool)) + elseif field_number == 5 + kind = OneOf(:struct_value, PB.decode(d, Ref{Struct})) + elseif field_number == 6 + kind = OneOf(:list_value, PB.decode(d, Ref{ListValue})) + else + PB.skip(d, wire_type) + end + end + return Value(kind) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::Value) + initpos = position(e.io) + if isnothing(x.kind); + elseif x.kind.name === :null_value + PB.encode(e, 1, x.kind[]::NullValue.T) + elseif x.kind.name === :number_value + PB.encode(e, 2, x.kind[]::Float64) + elseif x.kind.name === :string_value + PB.encode(e, 3, x.kind[]::String) + elseif x.kind.name === :bool_value + PB.encode(e, 4, x.kind[]::Bool) + elseif x.kind.name === :struct_value + PB.encode(e, 5, x.kind[]::Struct) + elseif x.kind.name === :list_value + PB.encode(e, 6, x.kind[]::ListValue) + end + return position(e.io) - initpos +end +function PB._encoded_size(x::Value) + encoded_size = 0 + if isnothing(x.kind); + elseif x.kind.name === :null_value + encoded_size += PB._encoded_size(x.kind[]::NullValue.T, 1) + elseif x.kind.name === :number_value + encoded_size += PB._encoded_size(x.kind[]::Float64, 2) + elseif x.kind.name === :string_value + encoded_size += PB._encoded_size(x.kind[]::String, 3) + elseif x.kind.name === :bool_value + encoded_size += PB._encoded_size(x.kind[]::Bool, 4) + elseif x.kind.name === :struct_value + encoded_size += PB._encoded_size(x.kind[]::Struct, 5) + elseif x.kind.name === :list_value + encoded_size += PB._encoded_size(x.kind[]::ListValue, 6) + end + return encoded_size +end + +struct ListValue <: var"##AbstractListValue" + values::Vector{<:Value} +end +PB.default_values(::Type{ListValue}) = (;values = Vector{Value}()) +PB.field_numbers(::Type{ListValue}) = (;values = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:ListValue}) + values = PB.BufferedVector{Value}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, values) + else + PB.skip(d, wire_type) + end + end + return ListValue(values[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::ListValue) + initpos = position(e.io) + !isempty(x.values) && PB.encode(e, 1, x.values) + return position(e.io) - initpos +end +function PB._encoded_size(x::ListValue) + encoded_size = 0 + !isempty(x.values) && (encoded_size += PB._encoded_size(x.values, 1)) + return encoded_size +end diff --git a/src/protojl/tensorboard/plugins/hparams/hparams_util_pb.jl b/src/protojl/tensorboard/plugins/hparams/hparams_util_pb.jl deleted file mode 100644 index 2f8dac6..0000000 --- a/src/protojl/tensorboard/plugins/hparams/hparams_util_pb.jl +++ /dev/null @@ -1,157 +0,0 @@ -# syntax: proto3 -using ProtoBuf -import ProtoBuf.meta -import ProtoBuf.google.protobuf - -mutable struct HParamInfosList <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function HParamInfosList(; kwargs...) - obj = new(meta(HParamInfosList), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct HParamInfosList -const __meta_HParamInfosList = Ref{ProtoMeta}() -function meta(::Type{HParamInfosList}) - ProtoBuf.metalock() do - if !isassigned(__meta_HParamInfosList) - __meta_HParamInfosList[] = target = ProtoMeta(HParamInfosList) - allflds = Pair{Symbol,Union{Type,String}}[:hparam_infos => Base.Vector{HParamInfo}] - meta(target, HParamInfosList, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_HParamInfosList[] - end -end -function Base.getproperty(obj::HParamInfosList, name::Symbol) - if name === :hparam_infos - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{HParamInfo} - else - getfield(obj, name) - end -end - -mutable struct MetricInfosList <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function MetricInfosList(; kwargs...) - obj = new(meta(MetricInfosList), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct MetricInfosList -const __meta_MetricInfosList = Ref{ProtoMeta}() -function meta(::Type{MetricInfosList}) - ProtoBuf.metalock() do - if !isassigned(__meta_MetricInfosList) - __meta_MetricInfosList[] = target = ProtoMeta(MetricInfosList) - allflds = Pair{Symbol,Union{Type,String}}[:metric_infos => Base.Vector{MetricInfo}] - meta(target, MetricInfosList, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_MetricInfosList[] - end -end -function Base.getproperty(obj::MetricInfosList, name::Symbol) - if name === :metric_infos - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{MetricInfo} - else - getfield(obj, name) - end -end - -mutable struct HParams_HparamsEntry <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function HParams_HparamsEntry(; kwargs...) - obj = new(meta(HParams_HparamsEntry), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct HParams_HparamsEntry (mapentry) -const __meta_HParams_HparamsEntry = Ref{ProtoMeta}() -function meta(::Type{HParams_HparamsEntry}) - ProtoBuf.metalock() do - if !isassigned(__meta_HParams_HparamsEntry) - __meta_HParams_HparamsEntry[] = target = ProtoMeta(HParams_HparamsEntry) - allflds = Pair{Symbol,Union{Type,String}}[:key => AbstractString, :value => ProtoBuf.google.protobuf.Value] - meta(target, HParams_HparamsEntry, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_HParams_HparamsEntry[] - end -end -function Base.getproperty(obj::HParams_HparamsEntry, name::Symbol) - if name === :key - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :value - return (obj.__protobuf_jl_internal_values[name])::ProtoBuf.google.protobuf.Value - else - getfield(obj, name) - end -end - -mutable struct HParams <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function HParams(; kwargs...) - obj = new(meta(HParams), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct HParams -const __meta_HParams = Ref{ProtoMeta}() -function meta(::Type{HParams}) - ProtoBuf.metalock() do - if !isassigned(__meta_HParams) - __meta_HParams[] = target = ProtoMeta(HParams) - allflds = Pair{Symbol,Union{Type,String}}[:hparams => Base.Dict{AbstractString,ProtoBuf.google.protobuf.Value}] - meta(target, HParams, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_HParams[] - end -end -function Base.getproperty(obj::HParams, name::Symbol) - if name === :hparams - return (obj.__protobuf_jl_internal_values[name])::Base.Dict{AbstractString,ProtoBuf.google.protobuf.Value} - else - getfield(obj, name) - end -end - -export HParamInfosList, MetricInfosList, HParams_HparamsEntry, HParams -# mapentries: "HParams_HparamsEntry" => ("AbstractString", "ProtoBuf.google.protobuf.Value") diff --git a/src/protojl/tensorboard/plugins/hparams/plugin_data_pb.jl b/src/protojl/tensorboard/plugins/hparams/plugin_data_pb.jl deleted file mode 100644 index 694b5d6..0000000 --- a/src/protojl/tensorboard/plugins/hparams/plugin_data_pb.jl +++ /dev/null @@ -1,175 +0,0 @@ -# syntax: proto3 -using ProtoBuf -import ProtoBuf.meta -import ProtoBuf.google.protobuf - -mutable struct SessionStartInfo_HparamsEntry <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function SessionStartInfo_HparamsEntry(; kwargs...) - obj = new(meta(SessionStartInfo_HparamsEntry), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct SessionStartInfo_HparamsEntry (mapentry) -const __meta_SessionStartInfo_HparamsEntry = Ref{ProtoMeta}() -function meta(::Type{SessionStartInfo_HparamsEntry}) - ProtoBuf.metalock() do - if !isassigned(__meta_SessionStartInfo_HparamsEntry) - __meta_SessionStartInfo_HparamsEntry[] = target = ProtoMeta(SessionStartInfo_HparamsEntry) - allflds = Pair{Symbol,Union{Type,String}}[:key => AbstractString, :value => ProtoBuf.google.protobuf.Value] - meta(target, SessionStartInfo_HparamsEntry, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_SessionStartInfo_HparamsEntry[] - end -end -function Base.getproperty(obj::SessionStartInfo_HparamsEntry, name::Symbol) - if name === :key - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :value - return (obj.__protobuf_jl_internal_values[name])::ProtoBuf.google.protobuf.Value - else - getfield(obj, name) - end -end - -mutable struct SessionStartInfo <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function SessionStartInfo(; kwargs...) - obj = new(meta(SessionStartInfo), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct SessionStartInfo -const __meta_SessionStartInfo = Ref{ProtoMeta}() -function meta(::Type{SessionStartInfo}) - ProtoBuf.metalock() do - if !isassigned(__meta_SessionStartInfo) - __meta_SessionStartInfo[] = target = ProtoMeta(SessionStartInfo) - allflds = Pair{Symbol,Union{Type,String}}[:hparams => Base.Dict{AbstractString,ProtoBuf.google.protobuf.Value}, :model_uri => AbstractString, :monitor_url => AbstractString, :group_name => AbstractString, :start_time_secs => Float64] - meta(target, SessionStartInfo, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_SessionStartInfo[] - end -end -function Base.getproperty(obj::SessionStartInfo, name::Symbol) - if name === :hparams - return (obj.__protobuf_jl_internal_values[name])::Base.Dict{AbstractString,ProtoBuf.google.protobuf.Value} - elseif name === :model_uri - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :monitor_url - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :group_name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :start_time_secs - return (obj.__protobuf_jl_internal_values[name])::Float64 - else - getfield(obj, name) - end -end - -mutable struct SessionEndInfo <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function SessionEndInfo(; kwargs...) - obj = new(meta(SessionEndInfo), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct SessionEndInfo -const __meta_SessionEndInfo = Ref{ProtoMeta}() -function meta(::Type{SessionEndInfo}) - ProtoBuf.metalock() do - if !isassigned(__meta_SessionEndInfo) - __meta_SessionEndInfo[] = target = ProtoMeta(SessionEndInfo) - allflds = Pair{Symbol,Union{Type,String}}[:status => Int32, :end_time_secs => Float64] - meta(target, SessionEndInfo, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_SessionEndInfo[] - end -end -function Base.getproperty(obj::SessionEndInfo, name::Symbol) - if name === :status - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :end_time_secs - return (obj.__protobuf_jl_internal_values[name])::Float64 - else - getfield(obj, name) - end -end - -mutable struct HParamsPluginData <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function HParamsPluginData(; kwargs...) - obj = new(meta(HParamsPluginData), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct HParamsPluginData -const __meta_HParamsPluginData = Ref{ProtoMeta}() -function meta(::Type{HParamsPluginData}) - ProtoBuf.metalock() do - if !isassigned(__meta_HParamsPluginData) - __meta_HParamsPluginData[] = target = ProtoMeta(HParamsPluginData) - allflds = Pair{Symbol,Union{Type,String}}[:version => Int32, :experiment => Experiment, :session_start_info => SessionStartInfo, :session_end_info => SessionEndInfo] - oneofs = Int[0,1,1,1] - oneof_names = Symbol[Symbol("data")] - meta(target, HParamsPluginData, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, oneofs, oneof_names) - end - __meta_HParamsPluginData[] - end -end -function Base.getproperty(obj::HParamsPluginData, name::Symbol) - if name === :version - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :experiment - return (obj.__protobuf_jl_internal_values[name])::Experiment - elseif name === :session_start_info - return (obj.__protobuf_jl_internal_values[name])::SessionStartInfo - elseif name === :session_end_info - return (obj.__protobuf_jl_internal_values[name])::SessionEndInfo - else - getfield(obj, name) - end -end - -export HParamsPluginData, SessionStartInfo_HparamsEntry, SessionStartInfo, SessionEndInfo -# mapentries: "SessionStartInfo_HparamsEntry" => ("AbstractString", "ProtoBuf.google.protobuf.Value") diff --git a/src/protojl/tensorboard/plugins/hparams/struct_pb.jl b/src/protojl/tensorboard/plugins/hparams/struct_pb.jl deleted file mode 100644 index 11476e7..0000000 --- a/src/protojl/tensorboard/plugins/hparams/struct_pb.jl +++ /dev/null @@ -1,172 +0,0 @@ -# syntax: proto3 -using ProtoBuf -import ProtoBuf.meta - -const NullValue = (;[ - Symbol("NULL_VALUE") => Int32(0), -]...) - -mutable struct Struct_FieldsEntry <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function Struct_FieldsEntry(; kwargs...) - obj = new(meta(Struct_FieldsEntry), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct Struct_FieldsEntry (mapentry) (has cyclic type dependency) -const __meta_Struct_FieldsEntry = Ref{ProtoMeta}() -function meta(::Type{Struct_FieldsEntry}) - ProtoBuf.metalock() do - if !isassigned(__meta_Struct_FieldsEntry) - __meta_Struct_FieldsEntry[] = target = ProtoMeta(Struct_FieldsEntry) - allflds = Pair{Symbol,Union{Type,String}}[:key => AbstractString, :value => "Value"] - meta(target, Struct_FieldsEntry, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_Struct_FieldsEntry[] - end -end -function Base.getproperty(obj::Struct_FieldsEntry, name::Symbol) - if name === :key - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :value - return (obj.__protobuf_jl_internal_values[name])::Any - else - getfield(obj, name) - end -end - -mutable struct Struct <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function Struct(; kwargs...) - obj = new(meta(Struct), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct Struct (has cyclic type dependency) -const __meta_Struct = Ref{ProtoMeta}() -function meta(::Type{Struct}) - ProtoBuf.metalock() do - if !isassigned(__meta_Struct) - __meta_Struct[] = target = ProtoMeta(Struct) - allflds = Pair{Symbol,Union{Type,String}}[:fields => "Base.Dict{AbstractString,Value}"] - meta(target, Struct, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_Struct[] - end -end -function Base.getproperty(obj::Struct, name::Symbol) - if name === :fields - return (obj.__protobuf_jl_internal_values[name])::Any - else - getfield(obj, name) - end -end - -mutable struct Value <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function Value(; kwargs...) - obj = new(meta(Value), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct Value (has cyclic type dependency) -const __meta_Value = Ref{ProtoMeta}() -function meta(::Type{Value}) - ProtoBuf.metalock() do - if !isassigned(__meta_Value) - __meta_Value[] = target = ProtoMeta(Value) - allflds = Pair{Symbol,Union{Type,String}}[:null_value => Int32, :number_value => Float64, :string_value => AbstractString, :bool_value => Bool, :struct_value => Struct, :list_value => "ListValue"] - oneofs = Int[1,1,1,1,1,1] - oneof_names = Symbol[Symbol("kind")] - meta(target, Value, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, oneofs, oneof_names) - end - __meta_Value[] - end -end -function Base.getproperty(obj::Value, name::Symbol) - if name === :null_value - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :number_value - return (obj.__protobuf_jl_internal_values[name])::Float64 - elseif name === :string_value - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :bool_value - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :struct_value - return (obj.__protobuf_jl_internal_values[name])::Struct - elseif name === :list_value - return (obj.__protobuf_jl_internal_values[name])::Any - else - getfield(obj, name) - end -end - -mutable struct ListValue <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function ListValue(; kwargs...) - obj = new(meta(ListValue), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct ListValue (has cyclic type dependency) -const __meta_ListValue = Ref{ProtoMeta}() -function meta(::Type{ListValue}) - ProtoBuf.metalock() do - if !isassigned(__meta_ListValue) - __meta_ListValue[] = target = ProtoMeta(ListValue) - allflds = Pair{Symbol,Union{Type,String}}[:values => Base.Vector{Value}] - meta(target, ListValue, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_ListValue[] - end -end -function Base.getproperty(obj::ListValue, name::Symbol) - if name === :values - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Value} - else - getfield(obj, name) - end -end - -export NullValue, Struct_FieldsEntry, Struct, Value, ListValue, Struct_FieldsEntry, Struct, Value, ListValue -# mapentries: "Struct_FieldsEntry" => ("AbstractString", "Value") diff --git a/src/protojl/tensorboard/plugins/hparams/tensorboard.jl b/src/protojl/tensorboard/plugins/hparams/tensorboard.jl deleted file mode 100644 index cc83736..0000000 --- a/src/protojl/tensorboard/plugins/hparams/tensorboard.jl +++ /dev/null @@ -1,9 +0,0 @@ -module tensorboard - const _ProtoBuf_Top_ = @static isdefined(parentmodule(@__MODULE__), :_ProtoBuf_Top_) ? (parentmodule(@__MODULE__))._ProtoBuf_Top_ : parentmodule(@__MODULE__) - module hparams - const _ProtoBuf_Top_ = @static isdefined(parentmodule(@__MODULE__), :_ProtoBuf_Top_) ? (parentmodule(@__MODULE__))._ProtoBuf_Top_ : parentmodule(@__MODULE__) - include("api_pb.jl") - include("hparams_util_pb.jl") - include("plugin_data_pb.jl") - end -end diff --git a/src/protojl/tensorboard/plugins/hparams/tensorboard/hparams/api_pb.jl b/src/protojl/tensorboard/plugins/hparams/tensorboard/hparams/api_pb.jl new file mode 100644 index 0000000..1662a30 --- /dev/null +++ b/src/protojl/tensorboard/plugins/hparams/tensorboard/hparams/api_pb.jl @@ -0,0 +1,700 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:25.010 +# original file: /home/lior/TensorBoardLogger.jl/gen/proto/tensorboard/plugins/hparams/api.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export Interval, GetExperimentRequest, var"#DataType", Status, SortOrder, DatasetType +export MetricName, AggregationType, HParamInfo, ColParams, ListMetricEvalsRequest +export MetricInfo, MetricValue, ListSessionGroupsRequest, Experiment, Session, SessionGroup +export ListSessionGroupsResponse + +struct Interval + min_value::Float64 + max_value::Float64 +end +PB.default_values(::Type{Interval}) = (;min_value = zero(Float64), max_value = zero(Float64)) +PB.field_numbers(::Type{Interval}) = (;min_value = 1, max_value = 2) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:Interval}) + min_value = zero(Float64) + max_value = zero(Float64) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + min_value = PB.decode(d, Float64) + elseif field_number == 2 + max_value = PB.decode(d, Float64) + else + PB.skip(d, wire_type) + end + end + return Interval(min_value, max_value) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::Interval) + initpos = position(e.io) + x.min_value != zero(Float64) && PB.encode(e, 1, x.min_value) + x.max_value != zero(Float64) && PB.encode(e, 2, x.max_value) + return position(e.io) - initpos +end +function PB._encoded_size(x::Interval) + encoded_size = 0 + x.min_value != zero(Float64) && (encoded_size += PB._encoded_size(x.min_value, 1)) + x.max_value != zero(Float64) && (encoded_size += PB._encoded_size(x.max_value, 2)) + return encoded_size +end + +struct GetExperimentRequest + experiment_name::String +end +PB.default_values(::Type{GetExperimentRequest}) = (;experiment_name = "") +PB.field_numbers(::Type{GetExperimentRequest}) = (;experiment_name = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:GetExperimentRequest}) + experiment_name = "" + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + experiment_name = PB.decode(d, String) + else + PB.skip(d, wire_type) + end + end + return GetExperimentRequest(experiment_name) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::GetExperimentRequest) + initpos = position(e.io) + !isempty(x.experiment_name) && PB.encode(e, 1, x.experiment_name) + return position(e.io) - initpos +end +function PB._encoded_size(x::GetExperimentRequest) + encoded_size = 0 + !isempty(x.experiment_name) && (encoded_size += PB._encoded_size(x.experiment_name, 1)) + return encoded_size +end + +@enumx var"#DataType" DATA_TYPE_UNSET=0 DATA_TYPE_STRING=1 DATA_TYPE_BOOL=2 DATA_TYPE_FLOAT64=3 + +@enumx Status STATUS_UNKNOWN=0 STATUS_SUCCESS=1 STATUS_FAILURE=2 STATUS_RUNNING=3 + +@enumx SortOrder ORDER_UNSPECIFIED=0 ORDER_ASC=1 ORDER_DESC=2 + +@enumx DatasetType DATASET_UNKNOWN=0 DATASET_TRAINING=1 DATASET_VALIDATION=2 + +struct MetricName + group::String + tag::String +end +PB.default_values(::Type{MetricName}) = (;group = "", tag = "") +PB.field_numbers(::Type{MetricName}) = (;group = 1, tag = 2) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:MetricName}) + group = "" + tag = "" + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + group = PB.decode(d, String) + elseif field_number == 2 + tag = PB.decode(d, String) + else + PB.skip(d, wire_type) + end + end + return MetricName(group, tag) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::MetricName) + initpos = position(e.io) + !isempty(x.group) && PB.encode(e, 1, x.group) + !isempty(x.tag) && PB.encode(e, 2, x.tag) + return position(e.io) - initpos +end +function PB._encoded_size(x::MetricName) + encoded_size = 0 + !isempty(x.group) && (encoded_size += PB._encoded_size(x.group, 1)) + !isempty(x.tag) && (encoded_size += PB._encoded_size(x.tag, 2)) + return encoded_size +end + +@enumx AggregationType AGGREGATION_UNSET=0 AGGREGATION_AVG=1 AGGREGATION_MEDIAN=2 AGGREGATION_MIN=3 AGGREGATION_MAX=4 + +struct HParamInfo + name::String + display_name::String + description::String + var"#type"::var"#DataType".T + domain::Union{Nothing,OneOf{<:Union{google.protobuf.ListValue,Interval}}} +end +PB.oneof_field_types(::Type{HParamInfo}) = (; + domain = (;domain_discrete=google.protobuf.ListValue, domain_interval=Interval), +) +PB.default_values(::Type{HParamInfo}) = (;name = "", display_name = "", description = "", var"#type" = var"#DataType".DATA_TYPE_UNSET, domain_discrete = nothing, domain_interval = nothing) +PB.field_numbers(::Type{HParamInfo}) = (;name = 1, display_name = 2, description = 3, var"#type" = 4, domain_discrete = 5, domain_interval = 6) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:HParamInfo}) + name = "" + display_name = "" + description = "" + var"#type" = var"#DataType".DATA_TYPE_UNSET + domain = nothing + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + name = PB.decode(d, String) + elseif field_number == 2 + display_name = PB.decode(d, String) + elseif field_number == 3 + description = PB.decode(d, String) + elseif field_number == 4 + var"#type" = PB.decode(d, var"#DataType".T) + elseif field_number == 5 + domain = OneOf(:domain_discrete, PB.decode(d, Ref{google.protobuf.ListValue})) + elseif field_number == 6 + domain = OneOf(:domain_interval, PB.decode(d, Ref{Interval})) + else + PB.skip(d, wire_type) + end + end + return HParamInfo(name, display_name, description, var"#type", domain) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::HParamInfo) + initpos = position(e.io) + !isempty(x.name) && PB.encode(e, 1, x.name) + !isempty(x.display_name) && PB.encode(e, 2, x.display_name) + !isempty(x.description) && PB.encode(e, 3, x.description) + x.var"#type" != var"#DataType".DATA_TYPE_UNSET && PB.encode(e, 4, x.var"#type") + if isnothing(x.domain); + elseif x.domain.name === :domain_discrete + PB.encode(e, 5, x.domain[]::google.protobuf.ListValue) + elseif x.domain.name === :domain_interval + PB.encode(e, 6, x.domain[]::Interval) + end + return position(e.io) - initpos +end +function PB._encoded_size(x::HParamInfo) + encoded_size = 0 + !isempty(x.name) && (encoded_size += PB._encoded_size(x.name, 1)) + !isempty(x.display_name) && (encoded_size += PB._encoded_size(x.display_name, 2)) + !isempty(x.description) && (encoded_size += PB._encoded_size(x.description, 3)) + x.var"#type" != var"#DataType".DATA_TYPE_UNSET && (encoded_size += PB._encoded_size(x.var"#type", 4)) + if isnothing(x.domain); + elseif x.domain.name === :domain_discrete + encoded_size += PB._encoded_size(x.domain[]::google.protobuf.ListValue, 5) + elseif x.domain.name === :domain_interval + encoded_size += PB._encoded_size(x.domain[]::Interval, 6) + end + return encoded_size +end + +struct ColParams + name::Union{Nothing,OneOf{<:Union{MetricName,String}}} + order::SortOrder.T + missing_values_first::Bool + filter::Union{Nothing,OneOf{<:Union{String,Interval,google.protobuf.ListValue}}} + exclude_missing_values::Bool +end +PB.oneof_field_types(::Type{ColParams}) = (; + name = (;metric=MetricName, hparam=String), + filter = (;filter_regexp=String, filter_interval=Interval, filter_discrete=google.protobuf.ListValue), +) +PB.default_values(::Type{ColParams}) = (;metric = nothing, hparam = "", order = SortOrder.ORDER_UNSPECIFIED, missing_values_first = false, filter_regexp = "", filter_interval = nothing, filter_discrete = nothing, exclude_missing_values = false) +PB.field_numbers(::Type{ColParams}) = (;metric = 1, hparam = 2, order = 3, missing_values_first = 4, filter_regexp = 5, filter_interval = 6, filter_discrete = 7, exclude_missing_values = 8) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:ColParams}) + name = nothing + order = SortOrder.ORDER_UNSPECIFIED + missing_values_first = false + filter = nothing + exclude_missing_values = false + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + name = OneOf(:metric, PB.decode(d, Ref{MetricName})) + elseif field_number == 2 + name = OneOf(:hparam, PB.decode(d, String)) + elseif field_number == 3 + order = PB.decode(d, SortOrder.T) + elseif field_number == 4 + missing_values_first = PB.decode(d, Bool) + elseif field_number == 5 + filter = OneOf(:filter_regexp, PB.decode(d, String)) + elseif field_number == 6 + filter = OneOf(:filter_interval, PB.decode(d, Ref{Interval})) + elseif field_number == 7 + filter = OneOf(:filter_discrete, PB.decode(d, Ref{google.protobuf.ListValue})) + elseif field_number == 8 + exclude_missing_values = PB.decode(d, Bool) + else + PB.skip(d, wire_type) + end + end + return ColParams(name, order, missing_values_first, filter, exclude_missing_values) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::ColParams) + initpos = position(e.io) + if isnothing(x.name); + elseif x.name.name === :metric + PB.encode(e, 1, x.name[]::MetricName) + elseif x.name.name === :hparam + PB.encode(e, 2, x.name[]::String) + end + x.order != SortOrder.ORDER_UNSPECIFIED && PB.encode(e, 3, x.order) + x.missing_values_first != false && PB.encode(e, 4, x.missing_values_first) + if isnothing(x.filter); + elseif x.filter.name === :filter_regexp + PB.encode(e, 5, x.filter[]::String) + elseif x.filter.name === :filter_interval + PB.encode(e, 6, x.filter[]::Interval) + elseif x.filter.name === :filter_discrete + PB.encode(e, 7, x.filter[]::google.protobuf.ListValue) + end + x.exclude_missing_values != false && PB.encode(e, 8, x.exclude_missing_values) + return position(e.io) - initpos +end +function PB._encoded_size(x::ColParams) + encoded_size = 0 + if isnothing(x.name); + elseif x.name.name === :metric + encoded_size += PB._encoded_size(x.name[]::MetricName, 1) + elseif x.name.name === :hparam + encoded_size += PB._encoded_size(x.name[]::String, 2) + end + x.order != SortOrder.ORDER_UNSPECIFIED && (encoded_size += PB._encoded_size(x.order, 3)) + x.missing_values_first != false && (encoded_size += PB._encoded_size(x.missing_values_first, 4)) + if isnothing(x.filter); + elseif x.filter.name === :filter_regexp + encoded_size += PB._encoded_size(x.filter[]::String, 5) + elseif x.filter.name === :filter_interval + encoded_size += PB._encoded_size(x.filter[]::Interval, 6) + elseif x.filter.name === :filter_discrete + encoded_size += PB._encoded_size(x.filter[]::google.protobuf.ListValue, 7) + end + x.exclude_missing_values != false && (encoded_size += PB._encoded_size(x.exclude_missing_values, 8)) + return encoded_size +end + +struct ListMetricEvalsRequest + experiment_name::String + session_name::String + metric_name::Union{Nothing,MetricName} +end +PB.default_values(::Type{ListMetricEvalsRequest}) = (;experiment_name = "", session_name = "", metric_name = nothing) +PB.field_numbers(::Type{ListMetricEvalsRequest}) = (;experiment_name = 3, session_name = 1, metric_name = 2) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:ListMetricEvalsRequest}) + experiment_name = "" + session_name = "" + metric_name = Ref{Union{Nothing,MetricName}}(nothing) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 3 + experiment_name = PB.decode(d, String) + elseif field_number == 1 + session_name = PB.decode(d, String) + elseif field_number == 2 + PB.decode!(d, metric_name) + else + PB.skip(d, wire_type) + end + end + return ListMetricEvalsRequest(experiment_name, session_name, metric_name[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::ListMetricEvalsRequest) + initpos = position(e.io) + !isempty(x.experiment_name) && PB.encode(e, 3, x.experiment_name) + !isempty(x.session_name) && PB.encode(e, 1, x.session_name) + !isnothing(x.metric_name) && PB.encode(e, 2, x.metric_name) + return position(e.io) - initpos +end +function PB._encoded_size(x::ListMetricEvalsRequest) + encoded_size = 0 + !isempty(x.experiment_name) && (encoded_size += PB._encoded_size(x.experiment_name, 3)) + !isempty(x.session_name) && (encoded_size += PB._encoded_size(x.session_name, 1)) + !isnothing(x.metric_name) && (encoded_size += PB._encoded_size(x.metric_name, 2)) + return encoded_size +end + +struct MetricInfo + name::Union{Nothing,MetricName} + display_name::String + description::String + dataset_type::DatasetType.T +end +PB.default_values(::Type{MetricInfo}) = (;name = nothing, display_name = "", description = "", dataset_type = DatasetType.DATASET_UNKNOWN) +PB.field_numbers(::Type{MetricInfo}) = (;name = 1, display_name = 3, description = 4, dataset_type = 5) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:MetricInfo}) + name = Ref{Union{Nothing,MetricName}}(nothing) + display_name = "" + description = "" + dataset_type = DatasetType.DATASET_UNKNOWN + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, name) + elseif field_number == 3 + display_name = PB.decode(d, String) + elseif field_number == 4 + description = PB.decode(d, String) + elseif field_number == 5 + dataset_type = PB.decode(d, DatasetType.T) + else + PB.skip(d, wire_type) + end + end + return MetricInfo(name[], display_name, description, dataset_type) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::MetricInfo) + initpos = position(e.io) + !isnothing(x.name) && PB.encode(e, 1, x.name) + !isempty(x.display_name) && PB.encode(e, 3, x.display_name) + !isempty(x.description) && PB.encode(e, 4, x.description) + x.dataset_type != DatasetType.DATASET_UNKNOWN && PB.encode(e, 5, x.dataset_type) + return position(e.io) - initpos +end +function PB._encoded_size(x::MetricInfo) + encoded_size = 0 + !isnothing(x.name) && (encoded_size += PB._encoded_size(x.name, 1)) + !isempty(x.display_name) && (encoded_size += PB._encoded_size(x.display_name, 3)) + !isempty(x.description) && (encoded_size += PB._encoded_size(x.description, 4)) + x.dataset_type != DatasetType.DATASET_UNKNOWN && (encoded_size += PB._encoded_size(x.dataset_type, 5)) + return encoded_size +end + +struct MetricValue + name::Union{Nothing,MetricName} + value::Float64 + training_step::Int32 + wall_time_secs::Float64 +end +PB.default_values(::Type{MetricValue}) = (;name = nothing, value = zero(Float64), training_step = zero(Int32), wall_time_secs = zero(Float64)) +PB.field_numbers(::Type{MetricValue}) = (;name = 1, value = 2, training_step = 3, wall_time_secs = 4) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:MetricValue}) + name = Ref{Union{Nothing,MetricName}}(nothing) + value = zero(Float64) + training_step = zero(Int32) + wall_time_secs = zero(Float64) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, name) + elseif field_number == 2 + value = PB.decode(d, Float64) + elseif field_number == 3 + training_step = PB.decode(d, Int32) + elseif field_number == 4 + wall_time_secs = PB.decode(d, Float64) + else + PB.skip(d, wire_type) + end + end + return MetricValue(name[], value, training_step, wall_time_secs) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::MetricValue) + initpos = position(e.io) + !isnothing(x.name) && PB.encode(e, 1, x.name) + x.value != zero(Float64) && PB.encode(e, 2, x.value) + x.training_step != zero(Int32) && PB.encode(e, 3, x.training_step) + x.wall_time_secs != zero(Float64) && PB.encode(e, 4, x.wall_time_secs) + return position(e.io) - initpos +end +function PB._encoded_size(x::MetricValue) + encoded_size = 0 + !isnothing(x.name) && (encoded_size += PB._encoded_size(x.name, 1)) + x.value != zero(Float64) && (encoded_size += PB._encoded_size(x.value, 2)) + x.training_step != zero(Int32) && (encoded_size += PB._encoded_size(x.training_step, 3)) + x.wall_time_secs != zero(Float64) && (encoded_size += PB._encoded_size(x.wall_time_secs, 4)) + return encoded_size +end + +struct ListSessionGroupsRequest + experiment_name::String + allowed_statuses::Vector{Status.T} + col_params::Vector{ColParams} + aggregation_type::AggregationType.T + aggregation_metric::Union{Nothing,MetricName} + start_index::Int32 + slice_size::Int32 +end +PB.default_values(::Type{ListSessionGroupsRequest}) = (;experiment_name = "", allowed_statuses = Vector{Status.T}(), col_params = Vector{ColParams}(), aggregation_type = AggregationType.AGGREGATION_UNSET, aggregation_metric = nothing, start_index = zero(Int32), slice_size = zero(Int32)) +PB.field_numbers(::Type{ListSessionGroupsRequest}) = (;experiment_name = 6, allowed_statuses = 7, col_params = 1, aggregation_type = 2, aggregation_metric = 3, start_index = 4, slice_size = 5) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:ListSessionGroupsRequest}) + experiment_name = "" + allowed_statuses = PB.BufferedVector{Status.T}() + col_params = PB.BufferedVector{ColParams}() + aggregation_type = AggregationType.AGGREGATION_UNSET + aggregation_metric = Ref{Union{Nothing,MetricName}}(nothing) + start_index = zero(Int32) + slice_size = zero(Int32) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 6 + experiment_name = PB.decode(d, String) + elseif field_number == 7 + PB.decode!(d, wire_type, allowed_statuses) + elseif field_number == 1 + PB.decode!(d, col_params) + elseif field_number == 2 + aggregation_type = PB.decode(d, AggregationType.T) + elseif field_number == 3 + PB.decode!(d, aggregation_metric) + elseif field_number == 4 + start_index = PB.decode(d, Int32) + elseif field_number == 5 + slice_size = PB.decode(d, Int32) + else + PB.skip(d, wire_type) + end + end + return ListSessionGroupsRequest(experiment_name, allowed_statuses[], col_params[], aggregation_type, aggregation_metric[], start_index, slice_size) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::ListSessionGroupsRequest) + initpos = position(e.io) + !isempty(x.experiment_name) && PB.encode(e, 6, x.experiment_name) + !isempty(x.allowed_statuses) && PB.encode(e, 7, x.allowed_statuses) + !isempty(x.col_params) && PB.encode(e, 1, x.col_params) + x.aggregation_type != AggregationType.AGGREGATION_UNSET && PB.encode(e, 2, x.aggregation_type) + !isnothing(x.aggregation_metric) && PB.encode(e, 3, x.aggregation_metric) + x.start_index != zero(Int32) && PB.encode(e, 4, x.start_index) + x.slice_size != zero(Int32) && PB.encode(e, 5, x.slice_size) + return position(e.io) - initpos +end +function PB._encoded_size(x::ListSessionGroupsRequest) + encoded_size = 0 + !isempty(x.experiment_name) && (encoded_size += PB._encoded_size(x.experiment_name, 6)) + !isempty(x.allowed_statuses) && (encoded_size += PB._encoded_size(x.allowed_statuses, 7)) + !isempty(x.col_params) && (encoded_size += PB._encoded_size(x.col_params, 1)) + x.aggregation_type != AggregationType.AGGREGATION_UNSET && (encoded_size += PB._encoded_size(x.aggregation_type, 2)) + !isnothing(x.aggregation_metric) && (encoded_size += PB._encoded_size(x.aggregation_metric, 3)) + x.start_index != zero(Int32) && (encoded_size += PB._encoded_size(x.start_index, 4)) + x.slice_size != zero(Int32) && (encoded_size += PB._encoded_size(x.slice_size, 5)) + return encoded_size +end + +struct Experiment + name::String + description::String + user::String + time_created_secs::Float64 + hparam_infos::Vector{HParamInfo} + metric_infos::Vector{MetricInfo} +end +PB.default_values(::Type{Experiment}) = (;name = "", description = "", user = "", time_created_secs = zero(Float64), hparam_infos = Vector{HParamInfo}(), metric_infos = Vector{MetricInfo}()) +PB.field_numbers(::Type{Experiment}) = (;name = 6, description = 1, user = 2, time_created_secs = 3, hparam_infos = 4, metric_infos = 5) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:Experiment}) + name = "" + description = "" + user = "" + time_created_secs = zero(Float64) + hparam_infos = PB.BufferedVector{HParamInfo}() + metric_infos = PB.BufferedVector{MetricInfo}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 6 + name = PB.decode(d, String) + elseif field_number == 1 + description = PB.decode(d, String) + elseif field_number == 2 + user = PB.decode(d, String) + elseif field_number == 3 + time_created_secs = PB.decode(d, Float64) + elseif field_number == 4 + PB.decode!(d, hparam_infos) + elseif field_number == 5 + PB.decode!(d, metric_infos) + else + PB.skip(d, wire_type) + end + end + return Experiment(name, description, user, time_created_secs, hparam_infos[], metric_infos[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::Experiment) + initpos = position(e.io) + !isempty(x.name) && PB.encode(e, 6, x.name) + !isempty(x.description) && PB.encode(e, 1, x.description) + !isempty(x.user) && PB.encode(e, 2, x.user) + x.time_created_secs != zero(Float64) && PB.encode(e, 3, x.time_created_secs) + !isempty(x.hparam_infos) && PB.encode(e, 4, x.hparam_infos) + !isempty(x.metric_infos) && PB.encode(e, 5, x.metric_infos) + return position(e.io) - initpos +end +function PB._encoded_size(x::Experiment) + encoded_size = 0 + !isempty(x.name) && (encoded_size += PB._encoded_size(x.name, 6)) + !isempty(x.description) && (encoded_size += PB._encoded_size(x.description, 1)) + !isempty(x.user) && (encoded_size += PB._encoded_size(x.user, 2)) + x.time_created_secs != zero(Float64) && (encoded_size += PB._encoded_size(x.time_created_secs, 3)) + !isempty(x.hparam_infos) && (encoded_size += PB._encoded_size(x.hparam_infos, 4)) + !isempty(x.metric_infos) && (encoded_size += PB._encoded_size(x.metric_infos, 5)) + return encoded_size +end + +struct Session + name::String + start_time_secs::Float64 + end_time_secs::Float64 + status::Status.T + model_uri::String + metric_values::Vector{MetricValue} + monitor_url::String +end +PB.default_values(::Type{Session}) = (;name = "", start_time_secs = zero(Float64), end_time_secs = zero(Float64), status = Status.STATUS_UNKNOWN, model_uri = "", metric_values = Vector{MetricValue}(), monitor_url = "") +PB.field_numbers(::Type{Session}) = (;name = 1, start_time_secs = 2, end_time_secs = 3, status = 4, model_uri = 5, metric_values = 6, monitor_url = 7) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:Session}) + name = "" + start_time_secs = zero(Float64) + end_time_secs = zero(Float64) + status = Status.STATUS_UNKNOWN + model_uri = "" + metric_values = PB.BufferedVector{MetricValue}() + monitor_url = "" + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + name = PB.decode(d, String) + elseif field_number == 2 + start_time_secs = PB.decode(d, Float64) + elseif field_number == 3 + end_time_secs = PB.decode(d, Float64) + elseif field_number == 4 + status = PB.decode(d, Status.T) + elseif field_number == 5 + model_uri = PB.decode(d, String) + elseif field_number == 6 + PB.decode!(d, metric_values) + elseif field_number == 7 + monitor_url = PB.decode(d, String) + else + PB.skip(d, wire_type) + end + end + return Session(name, start_time_secs, end_time_secs, status, model_uri, metric_values[], monitor_url) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::Session) + initpos = position(e.io) + !isempty(x.name) && PB.encode(e, 1, x.name) + x.start_time_secs != zero(Float64) && PB.encode(e, 2, x.start_time_secs) + x.end_time_secs != zero(Float64) && PB.encode(e, 3, x.end_time_secs) + x.status != Status.STATUS_UNKNOWN && PB.encode(e, 4, x.status) + !isempty(x.model_uri) && PB.encode(e, 5, x.model_uri) + !isempty(x.metric_values) && PB.encode(e, 6, x.metric_values) + !isempty(x.monitor_url) && PB.encode(e, 7, x.monitor_url) + return position(e.io) - initpos +end +function PB._encoded_size(x::Session) + encoded_size = 0 + !isempty(x.name) && (encoded_size += PB._encoded_size(x.name, 1)) + x.start_time_secs != zero(Float64) && (encoded_size += PB._encoded_size(x.start_time_secs, 2)) + x.end_time_secs != zero(Float64) && (encoded_size += PB._encoded_size(x.end_time_secs, 3)) + x.status != Status.STATUS_UNKNOWN && (encoded_size += PB._encoded_size(x.status, 4)) + !isempty(x.model_uri) && (encoded_size += PB._encoded_size(x.model_uri, 5)) + !isempty(x.metric_values) && (encoded_size += PB._encoded_size(x.metric_values, 6)) + !isempty(x.monitor_url) && (encoded_size += PB._encoded_size(x.monitor_url, 7)) + return encoded_size +end + +struct SessionGroup + name::String + hparams::Dict{String,google.protobuf.Value} + metric_values::Vector{MetricValue} + sessions::Vector{Session} + monitor_url::String +end +PB.default_values(::Type{SessionGroup}) = (;name = "", hparams = Dict{String,google.protobuf.Value}(), metric_values = Vector{MetricValue}(), sessions = Vector{Session}(), monitor_url = "") +PB.field_numbers(::Type{SessionGroup}) = (;name = 1, hparams = 2, metric_values = 3, sessions = 4, monitor_url = 5) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:SessionGroup}) + name = "" + hparams = Dict{String,google.protobuf.Value}() + metric_values = PB.BufferedVector{MetricValue}() + sessions = PB.BufferedVector{Session}() + monitor_url = "" + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + name = PB.decode(d, String) + elseif field_number == 2 + PB.decode!(d, hparams) + elseif field_number == 3 + PB.decode!(d, metric_values) + elseif field_number == 4 + PB.decode!(d, sessions) + elseif field_number == 5 + monitor_url = PB.decode(d, String) + else + PB.skip(d, wire_type) + end + end + return SessionGroup(name, hparams, metric_values[], sessions[], monitor_url) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::SessionGroup) + initpos = position(e.io) + !isempty(x.name) && PB.encode(e, 1, x.name) + !isempty(x.hparams) && PB.encode(e, 2, x.hparams) + !isempty(x.metric_values) && PB.encode(e, 3, x.metric_values) + !isempty(x.sessions) && PB.encode(e, 4, x.sessions) + !isempty(x.monitor_url) && PB.encode(e, 5, x.monitor_url) + return position(e.io) - initpos +end +function PB._encoded_size(x::SessionGroup) + encoded_size = 0 + !isempty(x.name) && (encoded_size += PB._encoded_size(x.name, 1)) + !isempty(x.hparams) && (encoded_size += PB._encoded_size(x.hparams, 2)) + !isempty(x.metric_values) && (encoded_size += PB._encoded_size(x.metric_values, 3)) + !isempty(x.sessions) && (encoded_size += PB._encoded_size(x.sessions, 4)) + !isempty(x.monitor_url) && (encoded_size += PB._encoded_size(x.monitor_url, 5)) + return encoded_size +end + +struct ListSessionGroupsResponse + session_groups::Vector{SessionGroup} + total_size::Int32 +end +PB.default_values(::Type{ListSessionGroupsResponse}) = (;session_groups = Vector{SessionGroup}(), total_size = zero(Int32)) +PB.field_numbers(::Type{ListSessionGroupsResponse}) = (;session_groups = 1, total_size = 3) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:ListSessionGroupsResponse}) + session_groups = PB.BufferedVector{SessionGroup}() + total_size = zero(Int32) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, session_groups) + elseif field_number == 3 + total_size = PB.decode(d, Int32) + else + PB.skip(d, wire_type) + end + end + return ListSessionGroupsResponse(session_groups[], total_size) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::ListSessionGroupsResponse) + initpos = position(e.io) + !isempty(x.session_groups) && PB.encode(e, 1, x.session_groups) + x.total_size != zero(Int32) && PB.encode(e, 3, x.total_size) + return position(e.io) - initpos +end +function PB._encoded_size(x::ListSessionGroupsResponse) + encoded_size = 0 + !isempty(x.session_groups) && (encoded_size += PB._encoded_size(x.session_groups, 1)) + x.total_size != zero(Int32) && (encoded_size += PB._encoded_size(x.total_size, 3)) + return encoded_size +end diff --git a/src/protojl/tensorboard/plugins/hparams/tensorboard/hparams/hparams.jl b/src/protojl/tensorboard/plugins/hparams/tensorboard/hparams/hparams.jl new file mode 100644 index 0000000..40b855d --- /dev/null +++ b/src/protojl/tensorboard/plugins/hparams/tensorboard/hparams/hparams.jl @@ -0,0 +1,9 @@ +module hparams + +import ..google + +include("api_pb.jl") +include("hparams_util_pb.jl") +include("plugin_data_pb.jl") + +end # module hparams diff --git a/src/protojl/tensorboard/plugins/hparams/tensorboard/hparams/hparams_util_pb.jl b/src/protojl/tensorboard/plugins/hparams/tensorboard/hparams/hparams_util_pb.jl new file mode 100644 index 0000000..325f308 --- /dev/null +++ b/src/protojl/tensorboard/plugins/hparams/tensorboard/hparams/hparams_util_pb.jl @@ -0,0 +1,98 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:25.011 +# original file: /home/lior/TensorBoardLogger.jl/gen/proto/tensorboard/plugins/hparams/hparams_util.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export MetricInfosList, HParams, HParamInfosList + +struct MetricInfosList + metric_infos::Vector{MetricInfo} +end +PB.default_values(::Type{MetricInfosList}) = (;metric_infos = Vector{MetricInfo}()) +PB.field_numbers(::Type{MetricInfosList}) = (;metric_infos = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:MetricInfosList}) + metric_infos = PB.BufferedVector{MetricInfo}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, metric_infos) + else + PB.skip(d, wire_type) + end + end + return MetricInfosList(metric_infos[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::MetricInfosList) + initpos = position(e.io) + !isempty(x.metric_infos) && PB.encode(e, 1, x.metric_infos) + return position(e.io) - initpos +end +function PB._encoded_size(x::MetricInfosList) + encoded_size = 0 + !isempty(x.metric_infos) && (encoded_size += PB._encoded_size(x.metric_infos, 1)) + return encoded_size +end + +struct HParams + hparams::Dict{String,google.protobuf.Value} +end +PB.default_values(::Type{HParams}) = (;hparams = Dict{String,google.protobuf.Value}()) +PB.field_numbers(::Type{HParams}) = (;hparams = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:HParams}) + hparams = Dict{String,google.protobuf.Value}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, hparams) + else + PB.skip(d, wire_type) + end + end + return HParams(hparams) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::HParams) + initpos = position(e.io) + !isempty(x.hparams) && PB.encode(e, 1, x.hparams) + return position(e.io) - initpos +end +function PB._encoded_size(x::HParams) + encoded_size = 0 + !isempty(x.hparams) && (encoded_size += PB._encoded_size(x.hparams, 1)) + return encoded_size +end + +struct HParamInfosList + hparam_infos::Vector{HParamInfo} +end +PB.default_values(::Type{HParamInfosList}) = (;hparam_infos = Vector{HParamInfo}()) +PB.field_numbers(::Type{HParamInfosList}) = (;hparam_infos = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:HParamInfosList}) + hparam_infos = PB.BufferedVector{HParamInfo}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, hparam_infos) + else + PB.skip(d, wire_type) + end + end + return HParamInfosList(hparam_infos[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::HParamInfosList) + initpos = position(e.io) + !isempty(x.hparam_infos) && PB.encode(e, 1, x.hparam_infos) + return position(e.io) - initpos +end +function PB._encoded_size(x::HParamInfosList) + encoded_size = 0 + !isempty(x.hparam_infos) && (encoded_size += PB._encoded_size(x.hparam_infos, 1)) + return encoded_size +end diff --git a/src/protojl/tensorboard/plugins/hparams/tensorboard/hparams/plugin_data_pb.jl b/src/protojl/tensorboard/plugins/hparams/tensorboard/hparams/plugin_data_pb.jl new file mode 100644 index 0000000..c0d2012 --- /dev/null +++ b/src/protojl/tensorboard/plugins/hparams/tensorboard/hparams/plugin_data_pb.jl @@ -0,0 +1,155 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:25.011 +# original file: /home/lior/TensorBoardLogger.jl/gen/proto/tensorboard/plugins/hparams/plugin_data.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export SessionEndInfo, SessionStartInfo, HParamsPluginData + +struct SessionEndInfo + status::Status.T + end_time_secs::Float64 +end +PB.default_values(::Type{SessionEndInfo}) = (;status = Status.STATUS_UNKNOWN, end_time_secs = zero(Float64)) +PB.field_numbers(::Type{SessionEndInfo}) = (;status = 1, end_time_secs = 2) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:SessionEndInfo}) + status = Status.STATUS_UNKNOWN + end_time_secs = zero(Float64) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + status = PB.decode(d, Status.T) + elseif field_number == 2 + end_time_secs = PB.decode(d, Float64) + else + PB.skip(d, wire_type) + end + end + return SessionEndInfo(status, end_time_secs) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::SessionEndInfo) + initpos = position(e.io) + x.status != Status.STATUS_UNKNOWN && PB.encode(e, 1, x.status) + x.end_time_secs != zero(Float64) && PB.encode(e, 2, x.end_time_secs) + return position(e.io) - initpos +end +function PB._encoded_size(x::SessionEndInfo) + encoded_size = 0 + x.status != Status.STATUS_UNKNOWN && (encoded_size += PB._encoded_size(x.status, 1)) + x.end_time_secs != zero(Float64) && (encoded_size += PB._encoded_size(x.end_time_secs, 2)) + return encoded_size +end + +struct SessionStartInfo + hparams::Dict{String,google.protobuf.Value} + model_uri::String + monitor_url::String + group_name::String + start_time_secs::Float64 +end +PB.default_values(::Type{SessionStartInfo}) = (;hparams = Dict{String,google.protobuf.Value}(), model_uri = "", monitor_url = "", group_name = "", start_time_secs = zero(Float64)) +PB.field_numbers(::Type{SessionStartInfo}) = (;hparams = 1, model_uri = 2, monitor_url = 3, group_name = 4, start_time_secs = 5) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:SessionStartInfo}) + hparams = Dict{String,google.protobuf.Value}() + model_uri = "" + monitor_url = "" + group_name = "" + start_time_secs = zero(Float64) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, hparams) + elseif field_number == 2 + model_uri = PB.decode(d, String) + elseif field_number == 3 + monitor_url = PB.decode(d, String) + elseif field_number == 4 + group_name = PB.decode(d, String) + elseif field_number == 5 + start_time_secs = PB.decode(d, Float64) + else + PB.skip(d, wire_type) + end + end + return SessionStartInfo(hparams, model_uri, monitor_url, group_name, start_time_secs) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::SessionStartInfo) + initpos = position(e.io) + !isempty(x.hparams) && PB.encode(e, 1, x.hparams) + !isempty(x.model_uri) && PB.encode(e, 2, x.model_uri) + !isempty(x.monitor_url) && PB.encode(e, 3, x.monitor_url) + !isempty(x.group_name) && PB.encode(e, 4, x.group_name) + x.start_time_secs != zero(Float64) && PB.encode(e, 5, x.start_time_secs) + return position(e.io) - initpos +end +function PB._encoded_size(x::SessionStartInfo) + encoded_size = 0 + !isempty(x.hparams) && (encoded_size += PB._encoded_size(x.hparams, 1)) + !isempty(x.model_uri) && (encoded_size += PB._encoded_size(x.model_uri, 2)) + !isempty(x.monitor_url) && (encoded_size += PB._encoded_size(x.monitor_url, 3)) + !isempty(x.group_name) && (encoded_size += PB._encoded_size(x.group_name, 4)) + x.start_time_secs != zero(Float64) && (encoded_size += PB._encoded_size(x.start_time_secs, 5)) + return encoded_size +end + +struct HParamsPluginData + version::Int32 + data::Union{Nothing,OneOf{<:Union{Experiment,SessionStartInfo,SessionEndInfo}}} +end +PB.oneof_field_types(::Type{HParamsPluginData}) = (; + data = (;experiment=Experiment, session_start_info=SessionStartInfo, session_end_info=SessionEndInfo), +) +PB.default_values(::Type{HParamsPluginData}) = (;version = zero(Int32), experiment = nothing, session_start_info = nothing, session_end_info = nothing) +PB.field_numbers(::Type{HParamsPluginData}) = (;version = 1, experiment = 2, session_start_info = 3, session_end_info = 4) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:HParamsPluginData}) + version = zero(Int32) + data = nothing + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + version = PB.decode(d, Int32) + elseif field_number == 2 + data = OneOf(:experiment, PB.decode(d, Ref{Experiment})) + elseif field_number == 3 + data = OneOf(:session_start_info, PB.decode(d, Ref{SessionStartInfo})) + elseif field_number == 4 + data = OneOf(:session_end_info, PB.decode(d, Ref{SessionEndInfo})) + else + PB.skip(d, wire_type) + end + end + return HParamsPluginData(version, data) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::HParamsPluginData) + initpos = position(e.io) + x.version != zero(Int32) && PB.encode(e, 1, x.version) + if isnothing(x.data); + elseif x.data.name === :experiment + PB.encode(e, 2, x.data[]::Experiment) + elseif x.data.name === :session_start_info + PB.encode(e, 3, x.data[]::SessionStartInfo) + elseif x.data.name === :session_end_info + PB.encode(e, 4, x.data[]::SessionEndInfo) + end + return position(e.io) - initpos +end +function PB._encoded_size(x::HParamsPluginData) + encoded_size = 0 + x.version != zero(Int32) && (encoded_size += PB._encoded_size(x.version, 1)) + if isnothing(x.data); + elseif x.data.name === :experiment + encoded_size += PB._encoded_size(x.data[]::Experiment, 2) + elseif x.data.name === :session_start_info + encoded_size += PB._encoded_size(x.data[]::SessionStartInfo, 3) + elseif x.data.name === :session_end_info + encoded_size += PB._encoded_size(x.data[]::SessionEndInfo, 4) + end + return encoded_size +end diff --git a/src/protojl/tensorboard/plugins/hparams/tensorboard/tensorboard.jl b/src/protojl/tensorboard/plugins/hparams/tensorboard/tensorboard.jl new file mode 100644 index 0000000..8096c66 --- /dev/null +++ b/src/protojl/tensorboard/plugins/hparams/tensorboard/tensorboard.jl @@ -0,0 +1,7 @@ +module tensorboard_plugin_hparams + +include("../google/google.jl") + +include("hparams/hparams.jl") + +end # module tensorboard diff --git a/src/protojl/tensorboard/plugins/text/plugin_data_pb.jl b/src/protojl/tensorboard/plugins/text/plugin_data_pb.jl deleted file mode 100644 index a63110f..0000000 --- a/src/protojl/tensorboard/plugins/text/plugin_data_pb.jl +++ /dev/null @@ -1,42 +0,0 @@ -# syntax: proto3 -using ProtoBuf -import ProtoBuf.meta - -mutable struct TextPluginData <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function TextPluginData(; kwargs...) - obj = new(meta(TextPluginData), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct TextPluginData -const __meta_TextPluginData = Ref{ProtoMeta}() -function meta(::Type{TextPluginData}) - ProtoBuf.metalock() do - if !isassigned(__meta_TextPluginData) - __meta_TextPluginData[] = target = ProtoMeta(TextPluginData) - allflds = Pair{Symbol,Union{Type,String}}[:version => Int32] - meta(target, TextPluginData, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_TextPluginData[] - end -end -function Base.getproperty(obj::TextPluginData, name::Symbol) - if name === :version - return (obj.__protobuf_jl_internal_values[name])::Int32 - else - getfield(obj, name) - end -end - -export TextPluginData diff --git a/src/protojl/tensorboard/plugins/text/tensorboard.jl b/src/protojl/tensorboard/plugins/text/tensorboard.jl deleted file mode 100644 index fce4857..0000000 --- a/src/protojl/tensorboard/plugins/text/tensorboard.jl +++ /dev/null @@ -1,4 +0,0 @@ -module tensorboard - const _ProtoBuf_Top_ = @static isdefined(parentmodule(@__MODULE__), :_ProtoBuf_Top_) ? (parentmodule(@__MODULE__))._ProtoBuf_Top_ : parentmodule(@__MODULE__) - include("plugin_data_pb.jl") -end diff --git a/src/protojl/tensorboard/plugins/text/tensorboard/plugin_data_pb.jl b/src/protojl/tensorboard/plugins/text/tensorboard/plugin_data_pb.jl new file mode 100644 index 0000000..f43d11f --- /dev/null +++ b/src/protojl/tensorboard/plugins/text/tensorboard/plugin_data_pb.jl @@ -0,0 +1,38 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:25.012 +# original file: /home/lior/TensorBoardLogger.jl/gen/proto/tensorboard/plugins/text/plugin_data.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export TextPluginData + +struct TextPluginData + version::Int32 +end +PB.default_values(::Type{TextPluginData}) = (;version = zero(Int32)) +PB.field_numbers(::Type{TextPluginData}) = (;version = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:TextPluginData}) + version = zero(Int32) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + version = PB.decode(d, Int32) + else + PB.skip(d, wire_type) + end + end + return TextPluginData(version) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::TextPluginData) + initpos = position(e.io) + x.version != zero(Int32) && PB.encode(e, 1, x.version) + return position(e.io) - initpos +end +function PB._encoded_size(x::TextPluginData) + encoded_size = 0 + x.version != zero(Int32) && (encoded_size += PB._encoded_size(x.version, 1)) + return encoded_size +end diff --git a/src/protojl/tensorboard/plugins/text/tensorboard/tensorboard.jl b/src/protojl/tensorboard/plugins/text/tensorboard/tensorboard.jl new file mode 100644 index 0000000..7cce2e0 --- /dev/null +++ b/src/protojl/tensorboard/plugins/text/tensorboard/tensorboard.jl @@ -0,0 +1,5 @@ +module tensorboard_plugin_text + +include("plugin_data_pb.jl") + +end # module tensorboard diff --git a/src/protojl/tensorboard/resource_handle_pb.jl b/src/protojl/tensorboard/resource_handle_pb.jl deleted file mode 100644 index 2d16b28..0000000 --- a/src/protojl/tensorboard/resource_handle_pb.jl +++ /dev/null @@ -1,91 +0,0 @@ -# syntax: proto3 -using ProtoBuf -import ProtoBuf.meta - -mutable struct ResourceHandleProto_DtypeAndShape <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function ResourceHandleProto_DtypeAndShape(; kwargs...) - obj = new(meta(ResourceHandleProto_DtypeAndShape), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct ResourceHandleProto_DtypeAndShape -const __meta_ResourceHandleProto_DtypeAndShape = Ref{ProtoMeta}() -function meta(::Type{ResourceHandleProto_DtypeAndShape}) - ProtoBuf.metalock() do - if !isassigned(__meta_ResourceHandleProto_DtypeAndShape) - __meta_ResourceHandleProto_DtypeAndShape[] = target = ProtoMeta(ResourceHandleProto_DtypeAndShape) - allflds = Pair{Symbol,Union{Type,String}}[:dtype => Int32, :shape => TensorShapeProto] - meta(target, ResourceHandleProto_DtypeAndShape, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_ResourceHandleProto_DtypeAndShape[] - end -end -function Base.getproperty(obj::ResourceHandleProto_DtypeAndShape, name::Symbol) - if name === :dtype - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :shape - return (obj.__protobuf_jl_internal_values[name])::TensorShapeProto - else - getfield(obj, name) - end -end - -mutable struct ResourceHandleProto <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function ResourceHandleProto(; kwargs...) - obj = new(meta(ResourceHandleProto), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct ResourceHandleProto -const __meta_ResourceHandleProto = Ref{ProtoMeta}() -function meta(::Type{ResourceHandleProto}) - ProtoBuf.metalock() do - if !isassigned(__meta_ResourceHandleProto) - __meta_ResourceHandleProto[] = target = ProtoMeta(ResourceHandleProto) - allflds = Pair{Symbol,Union{Type,String}}[:device => AbstractString, :container => AbstractString, :name => AbstractString, :hash_code => UInt64, :maybe_type_name => AbstractString, :dtypes_and_shapes => Base.Vector{ResourceHandleProto_DtypeAndShape}] - meta(target, ResourceHandleProto, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_ResourceHandleProto[] - end -end -function Base.getproperty(obj::ResourceHandleProto, name::Symbol) - if name === :device - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :container - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :hash_code - return (obj.__protobuf_jl_internal_values[name])::UInt64 - elseif name === :maybe_type_name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :dtypes_and_shapes - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{ResourceHandleProto_DtypeAndShape} - else - getfield(obj, name) - end -end - -export ResourceHandleProto_DtypeAndShape, ResourceHandleProto diff --git a/src/protojl/tensorboard/rewriter_config_pb.jl b/src/protojl/tensorboard/rewriter_config_pb.jl deleted file mode 100644 index 59df572..0000000 --- a/src/protojl/tensorboard/rewriter_config_pb.jl +++ /dev/null @@ -1,287 +0,0 @@ -# syntax: proto3 -using ProtoBuf -import ProtoBuf.meta - -mutable struct AutoParallelOptions <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function AutoParallelOptions(; kwargs...) - obj = new(meta(AutoParallelOptions), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct AutoParallelOptions -const __meta_AutoParallelOptions = Ref{ProtoMeta}() -function meta(::Type{AutoParallelOptions}) - ProtoBuf.metalock() do - if !isassigned(__meta_AutoParallelOptions) - __meta_AutoParallelOptions[] = target = ProtoMeta(AutoParallelOptions) - allflds = Pair{Symbol,Union{Type,String}}[:enable => Bool, :num_replicas => Int32] - meta(target, AutoParallelOptions, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_AutoParallelOptions[] - end -end -function Base.getproperty(obj::AutoParallelOptions, name::Symbol) - if name === :enable - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :num_replicas - return (obj.__protobuf_jl_internal_values[name])::Int32 - else - getfield(obj, name) - end -end - -mutable struct ScopedAllocatorOptions <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function ScopedAllocatorOptions(; kwargs...) - obj = new(meta(ScopedAllocatorOptions), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct ScopedAllocatorOptions -const __meta_ScopedAllocatorOptions = Ref{ProtoMeta}() -function meta(::Type{ScopedAllocatorOptions}) - ProtoBuf.metalock() do - if !isassigned(__meta_ScopedAllocatorOptions) - __meta_ScopedAllocatorOptions[] = target = ProtoMeta(ScopedAllocatorOptions) - allflds = Pair{Symbol,Union{Type,String}}[:enable_op => Base.Vector{AbstractString}] - meta(target, ScopedAllocatorOptions, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_ScopedAllocatorOptions[] - end -end -function Base.getproperty(obj::ScopedAllocatorOptions, name::Symbol) - if name === :enable_op - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{AbstractString} - else - getfield(obj, name) - end -end - -const RewriterConfig_Toggle = (;[ - Symbol("DEFAULT") => Int32(0), - Symbol("ON") => Int32(1), - Symbol("OFF") => Int32(2), - Symbol("AGGRESSIVE") => Int32(3), -]...) - -const RewriterConfig_CpuLayout = (;[ - Symbol("NO_CONVERSION_ON_CPU") => Int32(0), - Symbol("NCHW_TO_NHWC") => Int32(1), - Symbol("NHWC_TO_NCHW") => Int32(2), -]...) - -const RewriterConfig_NumIterationsType = (;[ - Symbol("DEFAULT_NUM_ITERS") => Int32(0), - Symbol("ONE") => Int32(1), - Symbol("TWO") => Int32(2), -]...) - -const RewriterConfig_MemOptType = (;[ - Symbol("DEFAULT_MEM_OPT") => Int32(0), - Symbol("NO_MEM_OPT") => Int32(1), - Symbol("MANUAL") => Int32(2), - Symbol("SWAPPING_HEURISTICS") => Int32(4), - Symbol("RECOMPUTATION_HEURISTICS") => Int32(5), - Symbol("SCHEDULING_HEURISTICS") => Int32(6), - Symbol("HEURISTICS") => Int32(3), -]...) - -mutable struct RewriterConfig_CustomGraphOptimizer_ParameterMapEntry <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function RewriterConfig_CustomGraphOptimizer_ParameterMapEntry(; kwargs...) - obj = new(meta(RewriterConfig_CustomGraphOptimizer_ParameterMapEntry), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct RewriterConfig_CustomGraphOptimizer_ParameterMapEntry (mapentry) -const __meta_RewriterConfig_CustomGraphOptimizer_ParameterMapEntry = Ref{ProtoMeta}() -function meta(::Type{RewriterConfig_CustomGraphOptimizer_ParameterMapEntry}) - ProtoBuf.metalock() do - if !isassigned(__meta_RewriterConfig_CustomGraphOptimizer_ParameterMapEntry) - __meta_RewriterConfig_CustomGraphOptimizer_ParameterMapEntry[] = target = ProtoMeta(RewriterConfig_CustomGraphOptimizer_ParameterMapEntry) - allflds = Pair{Symbol,Union{Type,String}}[:key => AbstractString, :value => AttrValue] - meta(target, RewriterConfig_CustomGraphOptimizer_ParameterMapEntry, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_RewriterConfig_CustomGraphOptimizer_ParameterMapEntry[] - end -end -function Base.getproperty(obj::RewriterConfig_CustomGraphOptimizer_ParameterMapEntry, name::Symbol) - if name === :key - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :value - return (obj.__protobuf_jl_internal_values[name])::AttrValue - else - getfield(obj, name) - end -end - -mutable struct RewriterConfig_CustomGraphOptimizer <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function RewriterConfig_CustomGraphOptimizer(; kwargs...) - obj = new(meta(RewriterConfig_CustomGraphOptimizer), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct RewriterConfig_CustomGraphOptimizer -const __meta_RewriterConfig_CustomGraphOptimizer = Ref{ProtoMeta}() -function meta(::Type{RewriterConfig_CustomGraphOptimizer}) - ProtoBuf.metalock() do - if !isassigned(__meta_RewriterConfig_CustomGraphOptimizer) - __meta_RewriterConfig_CustomGraphOptimizer[] = target = ProtoMeta(RewriterConfig_CustomGraphOptimizer) - allflds = Pair{Symbol,Union{Type,String}}[:name => AbstractString, :parameter_map => Base.Dict{AbstractString,AttrValue}] - meta(target, RewriterConfig_CustomGraphOptimizer, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_RewriterConfig_CustomGraphOptimizer[] - end -end -function Base.getproperty(obj::RewriterConfig_CustomGraphOptimizer, name::Symbol) - if name === :name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :parameter_map - return (obj.__protobuf_jl_internal_values[name])::Base.Dict{AbstractString,AttrValue} - else - getfield(obj, name) - end -end - -mutable struct RewriterConfig <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function RewriterConfig(; kwargs...) - obj = new(meta(RewriterConfig), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct RewriterConfig -const __meta_RewriterConfig = Ref{ProtoMeta}() -function meta(::Type{RewriterConfig}) - ProtoBuf.metalock() do - if !isassigned(__meta_RewriterConfig) - __meta_RewriterConfig[] = target = ProtoMeta(RewriterConfig) - fnum = Int[50,1,3,13,14,24,7,8,9,10,11,2,15,18,22,23,25,19,12,17,26,4,6,20,5,21,16,100,200,300,301] - allflds = Pair{Symbol,Union{Type,String}}[:cpu_layout_conversion => Int32, :layout_optimizer => Int32, :constant_folding => Int32, :shape_optimization => Int32, :remapping => Int32, :common_subgraph_elimination => Int32, :arithmetic_optimization => Int32, :dependency_optimization => Int32, :loop_optimization => Int32, :function_optimization => Int32, :debug_stripper => Int32, :disable_model_pruning => Bool, :scoped_allocator_optimization => Int32, :pin_to_host_optimization => Int32, :implementation_selector => Int32, :auto_mixed_precision => Int32, :auto_mixed_precision_mkl => Int32, :disable_meta_optimizer => Bool, :meta_optimizer_iterations => Int32, :min_graph_nodes => Int32, :experimental_disable_compressed_tensor_optimization => Bool, :memory_optimization => Int32, :memory_optimizer_target_node_name_scope => AbstractString, :meta_optimizer_timeout_ms => Int64, :auto_parallel => AutoParallelOptions, :fail_on_optimizer_errors => Bool, :scoped_allocator_opts => ScopedAllocatorOptions, :optimizers => Base.Vector{AbstractString}, :custom_optimizers => Base.Vector{RewriterConfig_CustomGraphOptimizer}, :inter_optimizer_verifier_config => VerifierConfig, :post_optimization_verifier_config => VerifierConfig] - meta(target, RewriterConfig, allflds, ProtoBuf.DEF_REQ, fnum, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_RewriterConfig[] - end -end -function Base.getproperty(obj::RewriterConfig, name::Symbol) - if name === :cpu_layout_conversion - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :layout_optimizer - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :constant_folding - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :shape_optimization - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :remapping - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :common_subgraph_elimination - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :arithmetic_optimization - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :dependency_optimization - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :loop_optimization - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :function_optimization - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :debug_stripper - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :disable_model_pruning - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :scoped_allocator_optimization - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :pin_to_host_optimization - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :implementation_selector - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :auto_mixed_precision - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :auto_mixed_precision_mkl - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :disable_meta_optimizer - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :meta_optimizer_iterations - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :min_graph_nodes - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :experimental_disable_compressed_tensor_optimization - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :memory_optimization - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :memory_optimizer_target_node_name_scope - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :meta_optimizer_timeout_ms - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :auto_parallel - return (obj.__protobuf_jl_internal_values[name])::AutoParallelOptions - elseif name === :fail_on_optimizer_errors - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :scoped_allocator_opts - return (obj.__protobuf_jl_internal_values[name])::ScopedAllocatorOptions - elseif name === :optimizers - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{AbstractString} - elseif name === :custom_optimizers - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{RewriterConfig_CustomGraphOptimizer} - elseif name === :inter_optimizer_verifier_config - return (obj.__protobuf_jl_internal_values[name])::VerifierConfig - elseif name === :post_optimization_verifier_config - return (obj.__protobuf_jl_internal_values[name])::VerifierConfig - else - getfield(obj, name) - end -end - -export AutoParallelOptions, ScopedAllocatorOptions, RewriterConfig_Toggle, RewriterConfig_CpuLayout, RewriterConfig_NumIterationsType, RewriterConfig_MemOptType, RewriterConfig_CustomGraphOptimizer_ParameterMapEntry, RewriterConfig_CustomGraphOptimizer, RewriterConfig -# mapentries: "RewriterConfig_CustomGraphOptimizer_ParameterMapEntry" => ("AbstractString", "AttrValue") diff --git a/src/protojl/tensorboard/saved_object_graph_pb.jl b/src/protojl/tensorboard/saved_object_graph_pb.jl deleted file mode 100644 index 7d49ca1..0000000 --- a/src/protojl/tensorboard/saved_object_graph_pb.jl +++ /dev/null @@ -1,599 +0,0 @@ -# syntax: proto3 -using ProtoBuf -import ProtoBuf.meta - -mutable struct SavedUserObject <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function SavedUserObject(; kwargs...) - obj = new(meta(SavedUserObject), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct SavedUserObject -const __meta_SavedUserObject = Ref{ProtoMeta}() -function meta(::Type{SavedUserObject}) - ProtoBuf.metalock() do - if !isassigned(__meta_SavedUserObject) - __meta_SavedUserObject[] = target = ProtoMeta(SavedUserObject) - allflds = Pair{Symbol,Union{Type,String}}[:identifier => AbstractString, :version => VersionDef, :metadata => AbstractString] - meta(target, SavedUserObject, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_SavedUserObject[] - end -end -function Base.getproperty(obj::SavedUserObject, name::Symbol) - if name === :identifier - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :version - return (obj.__protobuf_jl_internal_values[name])::VersionDef - elseif name === :metadata - return (obj.__protobuf_jl_internal_values[name])::AbstractString - else - getfield(obj, name) - end -end - -mutable struct SavedAsset <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function SavedAsset(; kwargs...) - obj = new(meta(SavedAsset), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct SavedAsset -const __meta_SavedAsset = Ref{ProtoMeta}() -function meta(::Type{SavedAsset}) - ProtoBuf.metalock() do - if !isassigned(__meta_SavedAsset) - __meta_SavedAsset[] = target = ProtoMeta(SavedAsset) - allflds = Pair{Symbol,Union{Type,String}}[:asset_file_def_index => Int32] - meta(target, SavedAsset, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_SavedAsset[] - end -end -function Base.getproperty(obj::SavedAsset, name::Symbol) - if name === :asset_file_def_index - return (obj.__protobuf_jl_internal_values[name])::Int32 - else - getfield(obj, name) - end -end - -mutable struct SavedConcreteFunction <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function SavedConcreteFunction(; kwargs...) - obj = new(meta(SavedConcreteFunction), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct SavedConcreteFunction -const __meta_SavedConcreteFunction = Ref{ProtoMeta}() -function meta(::Type{SavedConcreteFunction}) - ProtoBuf.metalock() do - if !isassigned(__meta_SavedConcreteFunction) - __meta_SavedConcreteFunction[] = target = ProtoMeta(SavedConcreteFunction) - fnum = Int[2,3,4] - pack = Symbol[:bound_inputs] - allflds = Pair{Symbol,Union{Type,String}}[:bound_inputs => Base.Vector{Int32}, :canonicalized_input_signature => StructuredValue, :output_signature => StructuredValue] - meta(target, SavedConcreteFunction, allflds, ProtoBuf.DEF_REQ, fnum, ProtoBuf.DEF_VAL, pack, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_SavedConcreteFunction[] - end -end -function Base.getproperty(obj::SavedConcreteFunction, name::Symbol) - if name === :bound_inputs - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Int32} - elseif name === :canonicalized_input_signature - return (obj.__protobuf_jl_internal_values[name])::StructuredValue - elseif name === :output_signature - return (obj.__protobuf_jl_internal_values[name])::StructuredValue - else - getfield(obj, name) - end -end - -mutable struct SavedObjectGraph_ConcreteFunctionsEntry <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function SavedObjectGraph_ConcreteFunctionsEntry(; kwargs...) - obj = new(meta(SavedObjectGraph_ConcreteFunctionsEntry), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct SavedObjectGraph_ConcreteFunctionsEntry (mapentry) -const __meta_SavedObjectGraph_ConcreteFunctionsEntry = Ref{ProtoMeta}() -function meta(::Type{SavedObjectGraph_ConcreteFunctionsEntry}) - ProtoBuf.metalock() do - if !isassigned(__meta_SavedObjectGraph_ConcreteFunctionsEntry) - __meta_SavedObjectGraph_ConcreteFunctionsEntry[] = target = ProtoMeta(SavedObjectGraph_ConcreteFunctionsEntry) - allflds = Pair{Symbol,Union{Type,String}}[:key => AbstractString, :value => SavedConcreteFunction] - meta(target, SavedObjectGraph_ConcreteFunctionsEntry, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_SavedObjectGraph_ConcreteFunctionsEntry[] - end -end -function Base.getproperty(obj::SavedObjectGraph_ConcreteFunctionsEntry, name::Symbol) - if name === :key - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :value - return (obj.__protobuf_jl_internal_values[name])::SavedConcreteFunction - else - getfield(obj, name) - end -end - -mutable struct SavedConstant <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function SavedConstant(; kwargs...) - obj = new(meta(SavedConstant), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct SavedConstant -const __meta_SavedConstant = Ref{ProtoMeta}() -function meta(::Type{SavedConstant}) - ProtoBuf.metalock() do - if !isassigned(__meta_SavedConstant) - __meta_SavedConstant[] = target = ProtoMeta(SavedConstant) - allflds = Pair{Symbol,Union{Type,String}}[:operation => AbstractString] - meta(target, SavedConstant, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_SavedConstant[] - end -end -function Base.getproperty(obj::SavedConstant, name::Symbol) - if name === :operation - return (obj.__protobuf_jl_internal_values[name])::AbstractString - else - getfield(obj, name) - end -end - -mutable struct SavedVariable <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function SavedVariable(; kwargs...) - obj = new(meta(SavedVariable), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct SavedVariable -const __meta_SavedVariable = Ref{ProtoMeta}() -function meta(::Type{SavedVariable}) - ProtoBuf.metalock() do - if !isassigned(__meta_SavedVariable) - __meta_SavedVariable[] = target = ProtoMeta(SavedVariable) - allflds = Pair{Symbol,Union{Type,String}}[:dtype => Int32, :shape => TensorShapeProto, :trainable => Bool, :synchronization => Int32, :aggregation => Int32, :name => AbstractString, :device => AbstractString, :experimental_distributed_variable_components => Base.Vector{SavedVariable}] - meta(target, SavedVariable, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_SavedVariable[] - end -end -function Base.getproperty(obj::SavedVariable, name::Symbol) - if name === :dtype - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :shape - return (obj.__protobuf_jl_internal_values[name])::TensorShapeProto - elseif name === :trainable - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :synchronization - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :aggregation - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :device - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :experimental_distributed_variable_components - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{SavedVariable} - else - getfield(obj, name) - end -end - -const FunctionSpec_ExperimentalCompile = (;[ - Symbol("DEFAULT") => Int32(0), - Symbol("ON") => Int32(1), - Symbol("OFF") => Int32(2), -]...) - -mutable struct FunctionSpec <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function FunctionSpec(; kwargs...) - obj = new(meta(FunctionSpec), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct FunctionSpec -const __meta_FunctionSpec = Ref{ProtoMeta}() -function meta(::Type{FunctionSpec}) - ProtoBuf.metalock() do - if !isassigned(__meta_FunctionSpec) - __meta_FunctionSpec[] = target = ProtoMeta(FunctionSpec) - fnum = Int[1,2,5,6] - allflds = Pair{Symbol,Union{Type,String}}[:fullargspec => StructuredValue, :is_method => Bool, :input_signature => StructuredValue, :experimental_compile => Int32] - meta(target, FunctionSpec, allflds, ProtoBuf.DEF_REQ, fnum, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_FunctionSpec[] - end -end -function Base.getproperty(obj::FunctionSpec, name::Symbol) - if name === :fullargspec - return (obj.__protobuf_jl_internal_values[name])::StructuredValue - elseif name === :is_method - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :input_signature - return (obj.__protobuf_jl_internal_values[name])::StructuredValue - elseif name === :experimental_compile - return (obj.__protobuf_jl_internal_values[name])::Int32 - else - getfield(obj, name) - end -end - -mutable struct SavedFunction <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function SavedFunction(; kwargs...) - obj = new(meta(SavedFunction), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct SavedFunction -const __meta_SavedFunction = Ref{ProtoMeta}() -function meta(::Type{SavedFunction}) - ProtoBuf.metalock() do - if !isassigned(__meta_SavedFunction) - __meta_SavedFunction[] = target = ProtoMeta(SavedFunction) - allflds = Pair{Symbol,Union{Type,String}}[:concrete_functions => Base.Vector{AbstractString}, :function_spec => FunctionSpec] - meta(target, SavedFunction, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_SavedFunction[] - end -end -function Base.getproperty(obj::SavedFunction, name::Symbol) - if name === :concrete_functions - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{AbstractString} - elseif name === :function_spec - return (obj.__protobuf_jl_internal_values[name])::FunctionSpec - else - getfield(obj, name) - end -end - -mutable struct SavedBareConcreteFunction <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function SavedBareConcreteFunction(; kwargs...) - obj = new(meta(SavedBareConcreteFunction), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct SavedBareConcreteFunction -const __meta_SavedBareConcreteFunction = Ref{ProtoMeta}() -function meta(::Type{SavedBareConcreteFunction}) - ProtoBuf.metalock() do - if !isassigned(__meta_SavedBareConcreteFunction) - __meta_SavedBareConcreteFunction[] = target = ProtoMeta(SavedBareConcreteFunction) - allflds = Pair{Symbol,Union{Type,String}}[:concrete_function_name => AbstractString, :argument_keywords => Base.Vector{AbstractString}, :allowed_positional_arguments => Int64, :function_spec => FunctionSpec] - meta(target, SavedBareConcreteFunction, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_SavedBareConcreteFunction[] - end -end -function Base.getproperty(obj::SavedBareConcreteFunction, name::Symbol) - if name === :concrete_function_name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :argument_keywords - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{AbstractString} - elseif name === :allowed_positional_arguments - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :function_spec - return (obj.__protobuf_jl_internal_values[name])::FunctionSpec - else - getfield(obj, name) - end -end - -mutable struct SavedResource <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function SavedResource(; kwargs...) - obj = new(meta(SavedResource), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct SavedResource -const __meta_SavedResource = Ref{ProtoMeta}() -function meta(::Type{SavedResource}) - ProtoBuf.metalock() do - if !isassigned(__meta_SavedResource) - __meta_SavedResource[] = target = ProtoMeta(SavedResource) - allflds = Pair{Symbol,Union{Type,String}}[:device => AbstractString] - meta(target, SavedResource, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_SavedResource[] - end -end -function Base.getproperty(obj::SavedResource, name::Symbol) - if name === :device - return (obj.__protobuf_jl_internal_values[name])::AbstractString - else - getfield(obj, name) - end -end - -mutable struct SaveableObject <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function SaveableObject(; kwargs...) - obj = new(meta(SaveableObject), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct SaveableObject -const __meta_SaveableObject = Ref{ProtoMeta}() -function meta(::Type{SaveableObject}) - ProtoBuf.metalock() do - if !isassigned(__meta_SaveableObject) - __meta_SaveableObject[] = target = ProtoMeta(SaveableObject) - fnum = Int[2,3] - allflds = Pair{Symbol,Union{Type,String}}[:save_function => Int32, :restore_function => Int32] - meta(target, SaveableObject, allflds, ProtoBuf.DEF_REQ, fnum, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_SaveableObject[] - end -end -function Base.getproperty(obj::SaveableObject, name::Symbol) - if name === :save_function - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :restore_function - return (obj.__protobuf_jl_internal_values[name])::Int32 - else - getfield(obj, name) - end -end - -mutable struct SavedObject_SaveableObjectsEntry <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function SavedObject_SaveableObjectsEntry(; kwargs...) - obj = new(meta(SavedObject_SaveableObjectsEntry), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct SavedObject_SaveableObjectsEntry (mapentry) -const __meta_SavedObject_SaveableObjectsEntry = Ref{ProtoMeta}() -function meta(::Type{SavedObject_SaveableObjectsEntry}) - ProtoBuf.metalock() do - if !isassigned(__meta_SavedObject_SaveableObjectsEntry) - __meta_SavedObject_SaveableObjectsEntry[] = target = ProtoMeta(SavedObject_SaveableObjectsEntry) - allflds = Pair{Symbol,Union{Type,String}}[:key => AbstractString, :value => SaveableObject] - meta(target, SavedObject_SaveableObjectsEntry, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_SavedObject_SaveableObjectsEntry[] - end -end -function Base.getproperty(obj::SavedObject_SaveableObjectsEntry, name::Symbol) - if name === :key - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :value - return (obj.__protobuf_jl_internal_values[name])::SaveableObject - else - getfield(obj, name) - end -end - -mutable struct SavedObject <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function SavedObject(; kwargs...) - obj = new(meta(SavedObject), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct SavedObject -const __meta_SavedObject = Ref{ProtoMeta}() -function meta(::Type{SavedObject}) - ProtoBuf.metalock() do - if !isassigned(__meta_SavedObject) - __meta_SavedObject[] = target = ProtoMeta(SavedObject) - fnum = Int[1,3,4,5,6,7,8,9,10,11] - allflds = Pair{Symbol,Union{Type,String}}[:children => Base.Vector{TrackableObjectGraph_TrackableObject_ObjectReference}, :slot_variables => Base.Vector{TrackableObjectGraph_TrackableObject_SlotVariableReference}, :user_object => SavedUserObject, :asset => SavedAsset, :_function => SavedFunction, :variable => SavedVariable, :bare_concrete_function => SavedBareConcreteFunction, :constant => SavedConstant, :resource => SavedResource, :saveable_objects => Base.Dict{AbstractString,SaveableObject}] - oneofs = Int[0,0,1,1,1,1,1,1,1,0] - oneof_names = Symbol[Symbol("kind")] - meta(target, SavedObject, allflds, ProtoBuf.DEF_REQ, fnum, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, oneofs, oneof_names) - end - __meta_SavedObject[] - end -end -function Base.getproperty(obj::SavedObject, name::Symbol) - if name === :children - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{TrackableObjectGraph_TrackableObject_ObjectReference} - elseif name === :slot_variables - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{TrackableObjectGraph_TrackableObject_SlotVariableReference} - elseif name === :user_object - return (obj.__protobuf_jl_internal_values[name])::SavedUserObject - elseif name === :asset - return (obj.__protobuf_jl_internal_values[name])::SavedAsset - elseif name === :_function - return (obj.__protobuf_jl_internal_values[name])::SavedFunction - elseif name === :variable - return (obj.__protobuf_jl_internal_values[name])::SavedVariable - elseif name === :bare_concrete_function - return (obj.__protobuf_jl_internal_values[name])::SavedBareConcreteFunction - elseif name === :constant - return (obj.__protobuf_jl_internal_values[name])::SavedConstant - elseif name === :resource - return (obj.__protobuf_jl_internal_values[name])::SavedResource - elseif name === :saveable_objects - return (obj.__protobuf_jl_internal_values[name])::Base.Dict{AbstractString,SaveableObject} - else - getfield(obj, name) - end -end - -mutable struct SavedObjectGraph <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function SavedObjectGraph(; kwargs...) - obj = new(meta(SavedObjectGraph), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct SavedObjectGraph -const __meta_SavedObjectGraph = Ref{ProtoMeta}() -function meta(::Type{SavedObjectGraph}) - ProtoBuf.metalock() do - if !isassigned(__meta_SavedObjectGraph) - __meta_SavedObjectGraph[] = target = ProtoMeta(SavedObjectGraph) - allflds = Pair{Symbol,Union{Type,String}}[:nodes => Base.Vector{SavedObject}, :concrete_functions => Base.Dict{AbstractString,SavedConcreteFunction}] - meta(target, SavedObjectGraph, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_SavedObjectGraph[] - end -end -function Base.getproperty(obj::SavedObjectGraph, name::Symbol) - if name === :nodes - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{SavedObject} - elseif name === :concrete_functions - return (obj.__protobuf_jl_internal_values[name])::Base.Dict{AbstractString,SavedConcreteFunction} - else - getfield(obj, name) - end -end - -export SavedObjectGraph_ConcreteFunctionsEntry, SavedObjectGraph, SavedObject_SaveableObjectsEntry, SavedObject, SavedUserObject, SavedAsset, SavedFunction, SavedConcreteFunction, SavedBareConcreteFunction, SavedConstant, SavedVariable, FunctionSpec_ExperimentalCompile, FunctionSpec, SavedResource, SaveableObject -# mapentries: "SavedObject_SaveableObjectsEntry" => ("AbstractString", "SaveableObject"), "SavedObjectGraph_ConcreteFunctionsEntry" => ("AbstractString", "SavedConcreteFunction") diff --git a/src/protojl/tensorboard/saver_pb.jl b/src/protojl/tensorboard/saver_pb.jl deleted file mode 100644 index 8df2c03..0000000 --- a/src/protojl/tensorboard/saver_pb.jl +++ /dev/null @@ -1,60 +0,0 @@ -# syntax: proto3 -using ProtoBuf -import ProtoBuf.meta - -const SaverDef_CheckpointFormatVersion = (;[ - Symbol("LEGACY") => Int32(0), - Symbol("V1") => Int32(1), - Symbol("V2") => Int32(2), -]...) - -mutable struct SaverDef <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function SaverDef(; kwargs...) - obj = new(meta(SaverDef), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct SaverDef -const __meta_SaverDef = Ref{ProtoMeta}() -function meta(::Type{SaverDef}) - ProtoBuf.metalock() do - if !isassigned(__meta_SaverDef) - __meta_SaverDef[] = target = ProtoMeta(SaverDef) - allflds = Pair{Symbol,Union{Type,String}}[:filename_tensor_name => AbstractString, :save_tensor_name => AbstractString, :restore_op_name => AbstractString, :max_to_keep => Int32, :sharded => Bool, :keep_checkpoint_every_n_hours => Float32, :version => Int32] - meta(target, SaverDef, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_SaverDef[] - end -end -function Base.getproperty(obj::SaverDef, name::Symbol) - if name === :filename_tensor_name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :save_tensor_name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :restore_op_name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :max_to_keep - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :sharded - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :keep_checkpoint_every_n_hours - return (obj.__protobuf_jl_internal_values[name])::Float32 - elseif name === :version - return (obj.__protobuf_jl_internal_values[name])::Int32 - else - getfield(obj, name) - end -end - -export SaverDef_CheckpointFormatVersion, SaverDef diff --git a/src/protojl/tensorboard/step_stats_pb.jl b/src/protojl/tensorboard/step_stats_pb.jl deleted file mode 100644 index e81c118..0000000 --- a/src/protojl/tensorboard/step_stats_pb.jl +++ /dev/null @@ -1,368 +0,0 @@ -# syntax: proto3 -using ProtoBuf -import ProtoBuf.meta - -mutable struct AllocationRecord <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function AllocationRecord(; kwargs...) - obj = new(meta(AllocationRecord), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct AllocationRecord -const __meta_AllocationRecord = Ref{ProtoMeta}() -function meta(::Type{AllocationRecord}) - ProtoBuf.metalock() do - if !isassigned(__meta_AllocationRecord) - __meta_AllocationRecord[] = target = ProtoMeta(AllocationRecord) - allflds = Pair{Symbol,Union{Type,String}}[:alloc_micros => Int64, :alloc_bytes => Int64] - meta(target, AllocationRecord, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_AllocationRecord[] - end -end -function Base.getproperty(obj::AllocationRecord, name::Symbol) - if name === :alloc_micros - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :alloc_bytes - return (obj.__protobuf_jl_internal_values[name])::Int64 - else - getfield(obj, name) - end -end - -mutable struct AllocatorMemoryUsed <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function AllocatorMemoryUsed(; kwargs...) - obj = new(meta(AllocatorMemoryUsed), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct AllocatorMemoryUsed -const __meta_AllocatorMemoryUsed = Ref{ProtoMeta}() -function meta(::Type{AllocatorMemoryUsed}) - ProtoBuf.metalock() do - if !isassigned(__meta_AllocatorMemoryUsed) - __meta_AllocatorMemoryUsed[] = target = ProtoMeta(AllocatorMemoryUsed) - fnum = Int[1,2,3,4,6,5] - allflds = Pair{Symbol,Union{Type,String}}[:allocator_name => AbstractString, :total_bytes => Int64, :peak_bytes => Int64, :live_bytes => Int64, :allocation_records => Base.Vector{AllocationRecord}, :allocator_bytes_in_use => Int64] - meta(target, AllocatorMemoryUsed, allflds, ProtoBuf.DEF_REQ, fnum, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_AllocatorMemoryUsed[] - end -end -function Base.getproperty(obj::AllocatorMemoryUsed, name::Symbol) - if name === :allocator_name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :total_bytes - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :peak_bytes - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :live_bytes - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :allocation_records - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{AllocationRecord} - elseif name === :allocator_bytes_in_use - return (obj.__protobuf_jl_internal_values[name])::Int64 - else - getfield(obj, name) - end -end - -mutable struct NodeOutput <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function NodeOutput(; kwargs...) - obj = new(meta(NodeOutput), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct NodeOutput -const __meta_NodeOutput = Ref{ProtoMeta}() -function meta(::Type{NodeOutput}) - ProtoBuf.metalock() do - if !isassigned(__meta_NodeOutput) - __meta_NodeOutput[] = target = ProtoMeta(NodeOutput) - fnum = Int[1,3] - allflds = Pair{Symbol,Union{Type,String}}[:slot => Int32, :tensor_description => TensorDescription] - meta(target, NodeOutput, allflds, ProtoBuf.DEF_REQ, fnum, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_NodeOutput[] - end -end -function Base.getproperty(obj::NodeOutput, name::Symbol) - if name === :slot - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :tensor_description - return (obj.__protobuf_jl_internal_values[name])::TensorDescription - else - getfield(obj, name) - end -end - -mutable struct MemoryStats <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function MemoryStats(; kwargs...) - obj = new(meta(MemoryStats), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct MemoryStats -const __meta_MemoryStats = Ref{ProtoMeta}() -function meta(::Type{MemoryStats}) - ProtoBuf.metalock() do - if !isassigned(__meta_MemoryStats) - __meta_MemoryStats[] = target = ProtoMeta(MemoryStats) - fnum = Int[1,3,5,2,4,6] - pack = Symbol[:persistent_tensor_alloc_ids,:device_persistent_tensor_alloc_ids] - allflds = Pair{Symbol,Union{Type,String}}[:temp_memory_size => Int64, :persistent_memory_size => Int64, :persistent_tensor_alloc_ids => Base.Vector{Int64}, :device_temp_memory_size => Int64, :device_persistent_memory_size => Int64, :device_persistent_tensor_alloc_ids => Base.Vector{Int64}] - meta(target, MemoryStats, allflds, ProtoBuf.DEF_REQ, fnum, ProtoBuf.DEF_VAL, pack, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_MemoryStats[] - end -end -function Base.getproperty(obj::MemoryStats, name::Symbol) - if name === :temp_memory_size - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :persistent_memory_size - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :persistent_tensor_alloc_ids - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Int64} - elseif name === :device_temp_memory_size - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :device_persistent_memory_size - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :device_persistent_tensor_alloc_ids - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Int64} - else - getfield(obj, name) - end -end - -mutable struct NodeExecStats <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function NodeExecStats(; kwargs...) - obj = new(meta(NodeExecStats), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct NodeExecStats -const __meta_NodeExecStats = Ref{ProtoMeta}() -function meta(::Type{NodeExecStats}) - ProtoBuf.metalock() do - if !isassigned(__meta_NodeExecStats) - __meta_NodeExecStats[] = target = ProtoMeta(NodeExecStats) - allflds = Pair{Symbol,Union{Type,String}}[:node_name => AbstractString, :all_start_micros => Int64, :op_start_rel_micros => Int64, :op_end_rel_micros => Int64, :all_end_rel_micros => Int64, :memory => Base.Vector{AllocatorMemoryUsed}, :output => Base.Vector{NodeOutput}, :timeline_label => AbstractString, :scheduled_micros => Int64, :thread_id => UInt32, :referenced_tensor => Base.Vector{AllocationDescription}, :memory_stats => MemoryStats, :all_start_nanos => Int64, :op_start_rel_nanos => Int64, :op_end_rel_nanos => Int64, :all_end_rel_nanos => Int64, :scheduled_nanos => Int64] - meta(target, NodeExecStats, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_NodeExecStats[] - end -end -function Base.getproperty(obj::NodeExecStats, name::Symbol) - if name === :node_name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :all_start_micros - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :op_start_rel_micros - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :op_end_rel_micros - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :all_end_rel_micros - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :memory - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{AllocatorMemoryUsed} - elseif name === :output - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{NodeOutput} - elseif name === :timeline_label - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :scheduled_micros - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :thread_id - return (obj.__protobuf_jl_internal_values[name])::UInt32 - elseif name === :referenced_tensor - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{AllocationDescription} - elseif name === :memory_stats - return (obj.__protobuf_jl_internal_values[name])::MemoryStats - elseif name === :all_start_nanos - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :op_start_rel_nanos - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :op_end_rel_nanos - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :all_end_rel_nanos - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :scheduled_nanos - return (obj.__protobuf_jl_internal_values[name])::Int64 - else - getfield(obj, name) - end -end - -mutable struct DeviceStepStats_ThreadNamesEntry <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function DeviceStepStats_ThreadNamesEntry(; kwargs...) - obj = new(meta(DeviceStepStats_ThreadNamesEntry), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct DeviceStepStats_ThreadNamesEntry (mapentry) -const __meta_DeviceStepStats_ThreadNamesEntry = Ref{ProtoMeta}() -function meta(::Type{DeviceStepStats_ThreadNamesEntry}) - ProtoBuf.metalock() do - if !isassigned(__meta_DeviceStepStats_ThreadNamesEntry) - __meta_DeviceStepStats_ThreadNamesEntry[] = target = ProtoMeta(DeviceStepStats_ThreadNamesEntry) - allflds = Pair{Symbol,Union{Type,String}}[:key => UInt32, :value => AbstractString] - meta(target, DeviceStepStats_ThreadNamesEntry, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_DeviceStepStats_ThreadNamesEntry[] - end -end -function Base.getproperty(obj::DeviceStepStats_ThreadNamesEntry, name::Symbol) - if name === :key - return (obj.__protobuf_jl_internal_values[name])::UInt32 - elseif name === :value - return (obj.__protobuf_jl_internal_values[name])::AbstractString - else - getfield(obj, name) - end -end - -mutable struct DeviceStepStats <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function DeviceStepStats(; kwargs...) - obj = new(meta(DeviceStepStats), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct DeviceStepStats -const __meta_DeviceStepStats = Ref{ProtoMeta}() -function meta(::Type{DeviceStepStats}) - ProtoBuf.metalock() do - if !isassigned(__meta_DeviceStepStats) - __meta_DeviceStepStats[] = target = ProtoMeta(DeviceStepStats) - allflds = Pair{Symbol,Union{Type,String}}[:device => AbstractString, :node_stats => Base.Vector{NodeExecStats}, :thread_names => Base.Dict{UInt32,AbstractString}] - meta(target, DeviceStepStats, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_DeviceStepStats[] - end -end -function Base.getproperty(obj::DeviceStepStats, name::Symbol) - if name === :device - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :node_stats - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{NodeExecStats} - elseif name === :thread_names - return (obj.__protobuf_jl_internal_values[name])::Base.Dict{UInt32,AbstractString} - else - getfield(obj, name) - end -end - -mutable struct StepStats <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function StepStats(; kwargs...) - obj = new(meta(StepStats), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct StepStats -const __meta_StepStats = Ref{ProtoMeta}() -function meta(::Type{StepStats}) - ProtoBuf.metalock() do - if !isassigned(__meta_StepStats) - __meta_StepStats[] = target = ProtoMeta(StepStats) - allflds = Pair{Symbol,Union{Type,String}}[:dev_stats => Base.Vector{DeviceStepStats}] - meta(target, StepStats, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_StepStats[] - end -end -function Base.getproperty(obj::StepStats, name::Symbol) - if name === :dev_stats - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{DeviceStepStats} - else - getfield(obj, name) - end -end - -export AllocationRecord, AllocatorMemoryUsed, NodeOutput, MemoryStats, NodeExecStats, DeviceStepStats_ThreadNamesEntry, DeviceStepStats, StepStats -# mapentries: "DeviceStepStats_ThreadNamesEntry" => ("UInt32", "AbstractString") diff --git a/src/protojl/tensorboard/struct_tb_pb.jl b/src/protojl/tensorboard/struct_tb_pb.jl deleted file mode 100644 index b06f557..0000000 --- a/src/protojl/tensorboard/struct_tb_pb.jl +++ /dev/null @@ -1,473 +0,0 @@ -# syntax: proto3 -using ProtoBuf -import ProtoBuf.meta - -mutable struct NoneValue <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function NoneValue(; kwargs...) - obj = new(meta(NoneValue), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct NoneValue -const __meta_NoneValue = Ref{ProtoMeta}() -function meta(::Type{NoneValue}) - ProtoBuf.metalock() do - if !isassigned(__meta_NoneValue) - __meta_NoneValue[] = target = ProtoMeta(NoneValue) - allflds = Pair{Symbol,Union{Type,String}}[] - meta(target, NoneValue, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_NoneValue[] - end -end - -mutable struct TensorSpecProto <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function TensorSpecProto(; kwargs...) - obj = new(meta(TensorSpecProto), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct TensorSpecProto -const __meta_TensorSpecProto = Ref{ProtoMeta}() -function meta(::Type{TensorSpecProto}) - ProtoBuf.metalock() do - if !isassigned(__meta_TensorSpecProto) - __meta_TensorSpecProto[] = target = ProtoMeta(TensorSpecProto) - allflds = Pair{Symbol,Union{Type,String}}[:name => AbstractString, :shape => TensorShapeProto, :dtype => Int32] - meta(target, TensorSpecProto, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_TensorSpecProto[] - end -end -function Base.getproperty(obj::TensorSpecProto, name::Symbol) - if name === :name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :shape - return (obj.__protobuf_jl_internal_values[name])::TensorShapeProto - elseif name === :dtype - return (obj.__protobuf_jl_internal_values[name])::Int32 - else - getfield(obj, name) - end -end - -mutable struct BoundedTensorSpecProto <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function BoundedTensorSpecProto(; kwargs...) - obj = new(meta(BoundedTensorSpecProto), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct BoundedTensorSpecProto -const __meta_BoundedTensorSpecProto = Ref{ProtoMeta}() -function meta(::Type{BoundedTensorSpecProto}) - ProtoBuf.metalock() do - if !isassigned(__meta_BoundedTensorSpecProto) - __meta_BoundedTensorSpecProto[] = target = ProtoMeta(BoundedTensorSpecProto) - allflds = Pair{Symbol,Union{Type,String}}[:name => AbstractString, :shape => TensorShapeProto, :dtype => Int32, :minimum => TensorProto, :maximum => TensorProto] - meta(target, BoundedTensorSpecProto, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_BoundedTensorSpecProto[] - end -end -function Base.getproperty(obj::BoundedTensorSpecProto, name::Symbol) - if name === :name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :shape - return (obj.__protobuf_jl_internal_values[name])::TensorShapeProto - elseif name === :dtype - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :minimum - return (obj.__protobuf_jl_internal_values[name])::TensorProto - elseif name === :maximum - return (obj.__protobuf_jl_internal_values[name])::TensorProto - else - getfield(obj, name) - end -end - -mutable struct StructuredValue <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function StructuredValue(; kwargs...) - obj = new(meta(StructuredValue), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct StructuredValue (has cyclic type dependency) -const __meta_StructuredValue = Ref{ProtoMeta}() -function meta(::Type{StructuredValue}) - ProtoBuf.metalock() do - if !isassigned(__meta_StructuredValue) - __meta_StructuredValue[] = target = ProtoMeta(StructuredValue) - fnum = Int[1,11,12,13,14,31,32,33,34,35,51,52,53,54] - wtype = Dict(:int64_value => :sint64) - allflds = Pair{Symbol,Union{Type,String}}[:none_value => NoneValue, :float64_value => Float64, :int64_value => Int64, :string_value => AbstractString, :bool_value => Bool, :tensor_shape_value => TensorShapeProto, :tensor_dtype_value => Int32, :tensor_spec_value => TensorSpecProto, :type_spec_value => "TypeSpecProto", :bounded_tensor_spec_value => BoundedTensorSpecProto, :list_value => "ListValue", :tuple_value => "TupleValue", :dict_value => "DictValue", :named_tuple_value => "NamedTupleValue"] - oneofs = Int[1,1,1,1,1,1,1,1,1,1,1,1,1,1] - oneof_names = Symbol[Symbol("kind")] - meta(target, StructuredValue, allflds, ProtoBuf.DEF_REQ, fnum, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, wtype, oneofs, oneof_names) - end - __meta_StructuredValue[] - end -end -function Base.getproperty(obj::StructuredValue, name::Symbol) - if name === :none_value - return (obj.__protobuf_jl_internal_values[name])::NoneValue - elseif name === :float64_value - return (obj.__protobuf_jl_internal_values[name])::Float64 - elseif name === :int64_value - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :string_value - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :bool_value - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :tensor_shape_value - return (obj.__protobuf_jl_internal_values[name])::TensorShapeProto - elseif name === :tensor_dtype_value - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :tensor_spec_value - return (obj.__protobuf_jl_internal_values[name])::TensorSpecProto - elseif name === :type_spec_value - return (obj.__protobuf_jl_internal_values[name])::Any - elseif name === :bounded_tensor_spec_value - return (obj.__protobuf_jl_internal_values[name])::BoundedTensorSpecProto - elseif name === :list_value - return (obj.__protobuf_jl_internal_values[name])::Any - elseif name === :tuple_value - return (obj.__protobuf_jl_internal_values[name])::Any - elseif name === :dict_value - return (obj.__protobuf_jl_internal_values[name])::Any - elseif name === :named_tuple_value - return (obj.__protobuf_jl_internal_values[name])::Any - else - getfield(obj, name) - end -end - -mutable struct ListValue <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function ListValue(; kwargs...) - obj = new(meta(ListValue), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct ListValue (has cyclic type dependency) -const __meta_ListValue = Ref{ProtoMeta}() -function meta(::Type{ListValue}) - ProtoBuf.metalock() do - if !isassigned(__meta_ListValue) - __meta_ListValue[] = target = ProtoMeta(ListValue) - allflds = Pair{Symbol,Union{Type,String}}[:values => Base.Vector{StructuredValue}] - meta(target, ListValue, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_ListValue[] - end -end -function Base.getproperty(obj::ListValue, name::Symbol) - if name === :values - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{StructuredValue} - else - getfield(obj, name) - end -end - -mutable struct TupleValue <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function TupleValue(; kwargs...) - obj = new(meta(TupleValue), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct TupleValue (has cyclic type dependency) -const __meta_TupleValue = Ref{ProtoMeta}() -function meta(::Type{TupleValue}) - ProtoBuf.metalock() do - if !isassigned(__meta_TupleValue) - __meta_TupleValue[] = target = ProtoMeta(TupleValue) - allflds = Pair{Symbol,Union{Type,String}}[:values => Base.Vector{StructuredValue}] - meta(target, TupleValue, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_TupleValue[] - end -end -function Base.getproperty(obj::TupleValue, name::Symbol) - if name === :values - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{StructuredValue} - else - getfield(obj, name) - end -end - -mutable struct DictValue_FieldsEntry <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function DictValue_FieldsEntry(; kwargs...) - obj = new(meta(DictValue_FieldsEntry), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct DictValue_FieldsEntry (mapentry) (has cyclic type dependency) -const __meta_DictValue_FieldsEntry = Ref{ProtoMeta}() -function meta(::Type{DictValue_FieldsEntry}) - ProtoBuf.metalock() do - if !isassigned(__meta_DictValue_FieldsEntry) - __meta_DictValue_FieldsEntry[] = target = ProtoMeta(DictValue_FieldsEntry) - allflds = Pair{Symbol,Union{Type,String}}[:key => AbstractString, :value => StructuredValue] - meta(target, DictValue_FieldsEntry, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_DictValue_FieldsEntry[] - end -end -function Base.getproperty(obj::DictValue_FieldsEntry, name::Symbol) - if name === :key - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :value - return (obj.__protobuf_jl_internal_values[name])::StructuredValue - else - getfield(obj, name) - end -end - -mutable struct DictValue <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function DictValue(; kwargs...) - obj = new(meta(DictValue), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct DictValue (has cyclic type dependency) -const __meta_DictValue = Ref{ProtoMeta}() -function meta(::Type{DictValue}) - ProtoBuf.metalock() do - if !isassigned(__meta_DictValue) - __meta_DictValue[] = target = ProtoMeta(DictValue) - allflds = Pair{Symbol,Union{Type,String}}[:fields => "Base.Dict{AbstractString,StructuredValue}"] - meta(target, DictValue, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_DictValue[] - end -end -function Base.getproperty(obj::DictValue, name::Symbol) - if name === :fields - return (obj.__protobuf_jl_internal_values[name])::Any - else - getfield(obj, name) - end -end - -mutable struct PairValue <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function PairValue(; kwargs...) - obj = new(meta(PairValue), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct PairValue (has cyclic type dependency) -const __meta_PairValue = Ref{ProtoMeta}() -function meta(::Type{PairValue}) - ProtoBuf.metalock() do - if !isassigned(__meta_PairValue) - __meta_PairValue[] = target = ProtoMeta(PairValue) - allflds = Pair{Symbol,Union{Type,String}}[:key => AbstractString, :value => StructuredValue] - meta(target, PairValue, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_PairValue[] - end -end -function Base.getproperty(obj::PairValue, name::Symbol) - if name === :key - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :value - return (obj.__protobuf_jl_internal_values[name])::StructuredValue - else - getfield(obj, name) - end -end - -mutable struct NamedTupleValue <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function NamedTupleValue(; kwargs...) - obj = new(meta(NamedTupleValue), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct NamedTupleValue (has cyclic type dependency) -const __meta_NamedTupleValue = Ref{ProtoMeta}() -function meta(::Type{NamedTupleValue}) - ProtoBuf.metalock() do - if !isassigned(__meta_NamedTupleValue) - __meta_NamedTupleValue[] = target = ProtoMeta(NamedTupleValue) - allflds = Pair{Symbol,Union{Type,String}}[:name => AbstractString, :values => Base.Vector{PairValue}] - meta(target, NamedTupleValue, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_NamedTupleValue[] - end -end -function Base.getproperty(obj::NamedTupleValue, name::Symbol) - if name === :name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :values - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{PairValue} - else - getfield(obj, name) - end -end - -const TypeSpecProto_TypeSpecClass = (;[ - Symbol("UNKNOWN") => Int32(0), - Symbol("SPARSE_TENSOR_SPEC") => Int32(1), - Symbol("INDEXED_SLICES_SPEC") => Int32(2), - Symbol("RAGGED_TENSOR_SPEC") => Int32(3), - Symbol("TENSOR_ARRAY_SPEC") => Int32(4), - Symbol("DATA_DATASET_SPEC") => Int32(5), - Symbol("DATA_ITERATOR_SPEC") => Int32(6), - Symbol("OPTIONAL_SPEC") => Int32(7), - Symbol("PER_REPLICA_SPEC") => Int32(8), - Symbol("VARIABLE_SPEC") => Int32(9), - Symbol("ROW_PARTITION_SPEC") => Int32(10), - Symbol("NDARRAY_SPEC") => Int32(11), -]...) - -mutable struct TypeSpecProto <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function TypeSpecProto(; kwargs...) - obj = new(meta(TypeSpecProto), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct TypeSpecProto (has cyclic type dependency) -const __meta_TypeSpecProto = Ref{ProtoMeta}() -function meta(::Type{TypeSpecProto}) - ProtoBuf.metalock() do - if !isassigned(__meta_TypeSpecProto) - __meta_TypeSpecProto[] = target = ProtoMeta(TypeSpecProto) - allflds = Pair{Symbol,Union{Type,String}}[:type_spec_class => Int32, :type_state => StructuredValue, :type_spec_class_name => AbstractString] - meta(target, TypeSpecProto, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_TypeSpecProto[] - end -end -function Base.getproperty(obj::TypeSpecProto, name::Symbol) - if name === :type_spec_class - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :type_state - return (obj.__protobuf_jl_internal_values[name])::StructuredValue - elseif name === :type_spec_class_name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - else - getfield(obj, name) - end -end - -export StructuredValue, NoneValue, ListValue, TupleValue, DictValue_FieldsEntry, DictValue, PairValue, NamedTupleValue, TensorSpecProto, BoundedTensorSpecProto, TypeSpecProto_TypeSpecClass, TypeSpecProto, StructuredValue, ListValue, TupleValue, DictValue_FieldsEntry, DictValue, PairValue, NamedTupleValue, TypeSpecProto_TypeSpecClass, TypeSpecProto -# mapentries: "DictValue_FieldsEntry" => ("AbstractString", "StructuredValue") diff --git a/src/protojl/tensorboard/summary_pb.jl b/src/protojl/tensorboard/summary_pb.jl deleted file mode 100644 index cbb85c1..0000000 --- a/src/protojl/tensorboard/summary_pb.jl +++ /dev/null @@ -1,362 +0,0 @@ -# syntax: proto3 -using ProtoBuf -import ProtoBuf.meta - -const DataClass = (;[ - Symbol("DATA_CLASS_UNKNOWN") => Int32(0), - Symbol("DATA_CLASS_SCALAR") => Int32(1), - Symbol("DATA_CLASS_TENSOR") => Int32(2), - Symbol("DATA_CLASS_BLOB_SEQUENCE") => Int32(3), -]...) - -mutable struct SummaryDescription <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function SummaryDescription(; kwargs...) - obj = new(meta(SummaryDescription), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct SummaryDescription -const __meta_SummaryDescription = Ref{ProtoMeta}() -function meta(::Type{SummaryDescription}) - ProtoBuf.metalock() do - if !isassigned(__meta_SummaryDescription) - __meta_SummaryDescription[] = target = ProtoMeta(SummaryDescription) - allflds = Pair{Symbol,Union{Type,String}}[:type_hint => AbstractString] - meta(target, SummaryDescription, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_SummaryDescription[] - end -end -function Base.getproperty(obj::SummaryDescription, name::Symbol) - if name === :type_hint - return (obj.__protobuf_jl_internal_values[name])::AbstractString - else - getfield(obj, name) - end -end - -mutable struct HistogramProto <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function HistogramProto(; kwargs...) - obj = new(meta(HistogramProto), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct HistogramProto -const __meta_HistogramProto = Ref{ProtoMeta}() -function meta(::Type{HistogramProto}) - ProtoBuf.metalock() do - if !isassigned(__meta_HistogramProto) - __meta_HistogramProto[] = target = ProtoMeta(HistogramProto) - pack = Symbol[:bucket_limit,:bucket] - allflds = Pair{Symbol,Union{Type,String}}[:min => Float64, :max => Float64, :num => Float64, :sum => Float64, :sum_squares => Float64, :bucket_limit => Base.Vector{Float64}, :bucket => Base.Vector{Float64}] - meta(target, HistogramProto, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, pack, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_HistogramProto[] - end -end -function Base.getproperty(obj::HistogramProto, name::Symbol) - if name === :min - return (obj.__protobuf_jl_internal_values[name])::Float64 - elseif name === :max - return (obj.__protobuf_jl_internal_values[name])::Float64 - elseif name === :num - return (obj.__protobuf_jl_internal_values[name])::Float64 - elseif name === :sum - return (obj.__protobuf_jl_internal_values[name])::Float64 - elseif name === :sum_squares - return (obj.__protobuf_jl_internal_values[name])::Float64 - elseif name === :bucket_limit - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Float64} - elseif name === :bucket - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Float64} - else - getfield(obj, name) - end -end - -mutable struct SummaryMetadata_PluginData <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function SummaryMetadata_PluginData(; kwargs...) - obj = new(meta(SummaryMetadata_PluginData), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct SummaryMetadata_PluginData -const __meta_SummaryMetadata_PluginData = Ref{ProtoMeta}() -function meta(::Type{SummaryMetadata_PluginData}) - ProtoBuf.metalock() do - if !isassigned(__meta_SummaryMetadata_PluginData) - __meta_SummaryMetadata_PluginData[] = target = ProtoMeta(SummaryMetadata_PluginData) - allflds = Pair{Symbol,Union{Type,String}}[:plugin_name => AbstractString, :content => Vector{UInt8}] - meta(target, SummaryMetadata_PluginData, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_SummaryMetadata_PluginData[] - end -end -function Base.getproperty(obj::SummaryMetadata_PluginData, name::Symbol) - if name === :plugin_name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :content - return (obj.__protobuf_jl_internal_values[name])::Vector{UInt8} - else - getfield(obj, name) - end -end - -mutable struct SummaryMetadata <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function SummaryMetadata(; kwargs...) - obj = new(meta(SummaryMetadata), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct SummaryMetadata -const __meta_SummaryMetadata = Ref{ProtoMeta}() -function meta(::Type{SummaryMetadata}) - ProtoBuf.metalock() do - if !isassigned(__meta_SummaryMetadata) - __meta_SummaryMetadata[] = target = ProtoMeta(SummaryMetadata) - allflds = Pair{Symbol,Union{Type,String}}[:plugin_data => SummaryMetadata_PluginData, :display_name => AbstractString, :summary_description => AbstractString, :data_class => Int32] - meta(target, SummaryMetadata, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_SummaryMetadata[] - end -end -function Base.getproperty(obj::SummaryMetadata, name::Symbol) - if name === :plugin_data - return (obj.__protobuf_jl_internal_values[name])::SummaryMetadata_PluginData - elseif name === :display_name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :summary_description - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :data_class - return (obj.__protobuf_jl_internal_values[name])::Int32 - else - getfield(obj, name) - end -end - -mutable struct Summary_Image <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function Summary_Image(; kwargs...) - obj = new(meta(Summary_Image), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct Summary_Image -const __meta_Summary_Image = Ref{ProtoMeta}() -function meta(::Type{Summary_Image}) - ProtoBuf.metalock() do - if !isassigned(__meta_Summary_Image) - __meta_Summary_Image[] = target = ProtoMeta(Summary_Image) - allflds = Pair{Symbol,Union{Type,String}}[:height => Int32, :width => Int32, :colorspace => Int32, :encoded_image_string => Vector{UInt8}] - meta(target, Summary_Image, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_Summary_Image[] - end -end -function Base.getproperty(obj::Summary_Image, name::Symbol) - if name === :height - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :width - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :colorspace - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :encoded_image_string - return (obj.__protobuf_jl_internal_values[name])::Vector{UInt8} - else - getfield(obj, name) - end -end - -mutable struct Summary_Audio <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function Summary_Audio(; kwargs...) - obj = new(meta(Summary_Audio), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct Summary_Audio -const __meta_Summary_Audio = Ref{ProtoMeta}() -function meta(::Type{Summary_Audio}) - ProtoBuf.metalock() do - if !isassigned(__meta_Summary_Audio) - __meta_Summary_Audio[] = target = ProtoMeta(Summary_Audio) - allflds = Pair{Symbol,Union{Type,String}}[:sample_rate => Float32, :num_channels => Int64, :length_frames => Int64, :encoded_audio_string => Vector{UInt8}, :content_type => AbstractString] - meta(target, Summary_Audio, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_Summary_Audio[] - end -end -function Base.getproperty(obj::Summary_Audio, name::Symbol) - if name === :sample_rate - return (obj.__protobuf_jl_internal_values[name])::Float32 - elseif name === :num_channels - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :length_frames - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :encoded_audio_string - return (obj.__protobuf_jl_internal_values[name])::Vector{UInt8} - elseif name === :content_type - return (obj.__protobuf_jl_internal_values[name])::AbstractString - else - getfield(obj, name) - end -end - -mutable struct Summary_Value <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function Summary_Value(; kwargs...) - obj = new(meta(Summary_Value), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct Summary_Value -const __meta_Summary_Value = Ref{ProtoMeta}() -function meta(::Type{Summary_Value}) - ProtoBuf.metalock() do - if !isassigned(__meta_Summary_Value) - __meta_Summary_Value[] = target = ProtoMeta(Summary_Value) - fnum = Int[7,1,9,2,3,4,5,6,8] - allflds = Pair{Symbol,Union{Type,String}}[:node_name => AbstractString, :tag => AbstractString, :metadata => SummaryMetadata, :simple_value => Float32, :obsolete_old_style_histogram => Vector{UInt8}, :image => Summary_Image, :histo => HistogramProto, :audio => Summary_Audio, :tensor => TensorProto] - oneofs = Int[0,0,0,1,1,1,1,1,1] - oneof_names = Symbol[Symbol("value")] - meta(target, Summary_Value, allflds, ProtoBuf.DEF_REQ, fnum, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, oneofs, oneof_names) - end - __meta_Summary_Value[] - end -end -function Base.getproperty(obj::Summary_Value, name::Symbol) - if name === :node_name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :tag - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :metadata - return (obj.__protobuf_jl_internal_values[name])::SummaryMetadata - elseif name === :simple_value - return (obj.__protobuf_jl_internal_values[name])::Float32 - elseif name === :obsolete_old_style_histogram - return (obj.__protobuf_jl_internal_values[name])::Vector{UInt8} - elseif name === :image - return (obj.__protobuf_jl_internal_values[name])::Summary_Image - elseif name === :histo - return (obj.__protobuf_jl_internal_values[name])::HistogramProto - elseif name === :audio - return (obj.__protobuf_jl_internal_values[name])::Summary_Audio - elseif name === :tensor - return (obj.__protobuf_jl_internal_values[name])::TensorProto - else - getfield(obj, name) - end -end - -mutable struct Summary <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function Summary(; kwargs...) - obj = new(meta(Summary), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct Summary -const __meta_Summary = Ref{ProtoMeta}() -function meta(::Type{Summary}) - ProtoBuf.metalock() do - if !isassigned(__meta_Summary) - __meta_Summary[] = target = ProtoMeta(Summary) - allflds = Pair{Symbol,Union{Type,String}}[:value => Base.Vector{Summary_Value}] - meta(target, Summary, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_Summary[] - end -end -function Base.getproperty(obj::Summary, name::Symbol) - if name === :value - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Summary_Value} - else - getfield(obj, name) - end -end - -export DataClass, SummaryDescription, HistogramProto, SummaryMetadata_PluginData, SummaryMetadata, Summary_Image, Summary_Audio, Summary_Value, Summary diff --git a/src/protojl/tensorboard/tensor_description_pb.jl b/src/protojl/tensorboard/tensor_description_pb.jl deleted file mode 100644 index c57b4c2..0000000 --- a/src/protojl/tensorboard/tensor_description_pb.jl +++ /dev/null @@ -1,47 +0,0 @@ -# syntax: proto3 -using ProtoBuf -import ProtoBuf.meta - -mutable struct TensorDescription <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function TensorDescription(; kwargs...) - obj = new(meta(TensorDescription), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct TensorDescription -const __meta_TensorDescription = Ref{ProtoMeta}() -function meta(::Type{TensorDescription}) - ProtoBuf.metalock() do - if !isassigned(__meta_TensorDescription) - __meta_TensorDescription[] = target = ProtoMeta(TensorDescription) - fnum = Int[1,2,4] - allflds = Pair{Symbol,Union{Type,String}}[:dtype => Int32, :shape => TensorShapeProto, :allocation_description => AllocationDescription] - meta(target, TensorDescription, allflds, ProtoBuf.DEF_REQ, fnum, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_TensorDescription[] - end -end -function Base.getproperty(obj::TensorDescription, name::Symbol) - if name === :dtype - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :shape - return (obj.__protobuf_jl_internal_values[name])::TensorShapeProto - elseif name === :allocation_description - return (obj.__protobuf_jl_internal_values[name])::AllocationDescription - else - getfield(obj, name) - end -end - -export TensorDescription diff --git a/src/protojl/tensorboard/tensor_pb.jl b/src/protojl/tensorboard/tensor_pb.jl deleted file mode 100644 index b1b2a1d..0000000 --- a/src/protojl/tensorboard/tensor_pb.jl +++ /dev/null @@ -1,117 +0,0 @@ -# syntax: proto3 -using ProtoBuf -import ProtoBuf.meta - -mutable struct TensorProto <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function TensorProto(; kwargs...) - obj = new(meta(TensorProto), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct TensorProto (has cyclic type dependency) -const __meta_TensorProto = Ref{ProtoMeta}() -function meta(::Type{TensorProto}) - ProtoBuf.metalock() do - if !isassigned(__meta_TensorProto) - __meta_TensorProto[] = target = ProtoMeta(TensorProto) - fnum = Int[1,2,3,4,13,5,6,7,8,9,10,11,12,14,15,16,17] - pack = Symbol[:half_val,:float_val,:double_val,:int_val,:scomplex_val,:int64_val,:bool_val,:dcomplex_val,:uint32_val,:uint64_val] - allflds = Pair{Symbol,Union{Type,String}}[:dtype => Int32, :tensor_shape => TensorShapeProto, :version_number => Int32, :tensor_content => Vector{UInt8}, :half_val => Base.Vector{Int32}, :float_val => Base.Vector{Float32}, :double_val => Base.Vector{Float64}, :int_val => Base.Vector{Int32}, :string_val => Base.Vector{Vector{UInt8}}, :scomplex_val => Base.Vector{Float32}, :int64_val => Base.Vector{Int64}, :bool_val => Base.Vector{Bool}, :dcomplex_val => Base.Vector{Float64}, :resource_handle_val => Base.Vector{ResourceHandleProto}, :variant_val => "Base.Vector{VariantTensorDataProto}", :uint32_val => Base.Vector{UInt32}, :uint64_val => Base.Vector{UInt64}] - meta(target, TensorProto, allflds, ProtoBuf.DEF_REQ, fnum, ProtoBuf.DEF_VAL, pack, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_TensorProto[] - end -end -function Base.getproperty(obj::TensorProto, name::Symbol) - if name === :dtype - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :tensor_shape - return (obj.__protobuf_jl_internal_values[name])::TensorShapeProto - elseif name === :version_number - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :tensor_content - return (obj.__protobuf_jl_internal_values[name])::Vector{UInt8} - elseif name === :half_val - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Int32} - elseif name === :float_val - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Float32} - elseif name === :double_val - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Float64} - elseif name === :int_val - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Int32} - elseif name === :string_val - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Vector{UInt8}} - elseif name === :scomplex_val - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Float32} - elseif name === :int64_val - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Int64} - elseif name === :bool_val - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Bool} - elseif name === :dcomplex_val - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Float64} - elseif name === :resource_handle_val - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{ResourceHandleProto} - elseif name === :variant_val - return (obj.__protobuf_jl_internal_values[name])::Any - elseif name === :uint32_val - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{UInt32} - elseif name === :uint64_val - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{UInt64} - else - getfield(obj, name) - end -end - -mutable struct VariantTensorDataProto <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function VariantTensorDataProto(; kwargs...) - obj = new(meta(VariantTensorDataProto), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct VariantTensorDataProto (has cyclic type dependency) -const __meta_VariantTensorDataProto = Ref{ProtoMeta}() -function meta(::Type{VariantTensorDataProto}) - ProtoBuf.metalock() do - if !isassigned(__meta_VariantTensorDataProto) - __meta_VariantTensorDataProto[] = target = ProtoMeta(VariantTensorDataProto) - allflds = Pair{Symbol,Union{Type,String}}[:type_name => AbstractString, :metadata => Vector{UInt8}, :tensors => Base.Vector{TensorProto}] - meta(target, VariantTensorDataProto, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_VariantTensorDataProto[] - end -end -function Base.getproperty(obj::VariantTensorDataProto, name::Symbol) - if name === :type_name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :metadata - return (obj.__protobuf_jl_internal_values[name])::Vector{UInt8} - elseif name === :tensors - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{TensorProto} - else - getfield(obj, name) - end -end - -export TensorProto, VariantTensorDataProto, TensorProto, VariantTensorDataProto diff --git a/src/protojl/tensorboard/tensor_shape_pb.jl b/src/protojl/tensorboard/tensor_shape_pb.jl deleted file mode 100644 index 05b5c4c..0000000 --- a/src/protojl/tensorboard/tensor_shape_pb.jl +++ /dev/null @@ -1,84 +0,0 @@ -# syntax: proto3 -using ProtoBuf -import ProtoBuf.meta - -mutable struct TensorShapeProto_Dim <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function TensorShapeProto_Dim(; kwargs...) - obj = new(meta(TensorShapeProto_Dim), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct TensorShapeProto_Dim -const __meta_TensorShapeProto_Dim = Ref{ProtoMeta}() -function meta(::Type{TensorShapeProto_Dim}) - ProtoBuf.metalock() do - if !isassigned(__meta_TensorShapeProto_Dim) - __meta_TensorShapeProto_Dim[] = target = ProtoMeta(TensorShapeProto_Dim) - allflds = Pair{Symbol,Union{Type,String}}[:size => Int64, :name => AbstractString] - meta(target, TensorShapeProto_Dim, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_TensorShapeProto_Dim[] - end -end -function Base.getproperty(obj::TensorShapeProto_Dim, name::Symbol) - if name === :size - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - else - getfield(obj, name) - end -end - -mutable struct TensorShapeProto <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function TensorShapeProto(; kwargs...) - obj = new(meta(TensorShapeProto), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct TensorShapeProto -const __meta_TensorShapeProto = Ref{ProtoMeta}() -function meta(::Type{TensorShapeProto}) - ProtoBuf.metalock() do - if !isassigned(__meta_TensorShapeProto) - __meta_TensorShapeProto[] = target = ProtoMeta(TensorShapeProto) - fnum = Int[2,3] - allflds = Pair{Symbol,Union{Type,String}}[:dim => Base.Vector{TensorShapeProto_Dim}, :unknown_rank => Bool] - meta(target, TensorShapeProto, allflds, ProtoBuf.DEF_REQ, fnum, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_TensorShapeProto[] - end -end -function Base.getproperty(obj::TensorShapeProto, name::Symbol) - if name === :dim - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{TensorShapeProto_Dim} - elseif name === :unknown_rank - return (obj.__protobuf_jl_internal_values[name])::Bool - else - getfield(obj, name) - end -end - -export TensorShapeProto_Dim, TensorShapeProto diff --git a/src/protojl/tensorboard/tensorboard.jl b/src/protojl/tensorboard/tensorboard.jl deleted file mode 100644 index 1851dba..0000000 --- a/src/protojl/tensorboard/tensorboard.jl +++ /dev/null @@ -1,39 +0,0 @@ -module tensorboard - const _ProtoBuf_Top_ = @static isdefined(parentmodule(@__MODULE__), :_ProtoBuf_Top_) ? (parentmodule(@__MODULE__))._ProtoBuf_Top_ : parentmodule(@__MODULE__) - include("allocation_description_pb.jl") - include("tensor_shape_pb.jl") - include("types_pb.jl") - include("resource_handle_pb.jl") - include("tensor_pb.jl") - include("attr_value_pb.jl") - include("api_def_pb.jl") - include("cluster_pb.jl") - include("cost_graph_pb.jl") - include("node_def_pb.jl") - include("op_def_pb.jl") - include("function_pb.jl") - include("versions_pb.jl") - include("graph_pb.jl") - include("tensor_description_pb.jl") - include("step_stats_pb.jl") - include("debug_pb.jl") - include("verifier_config_pb.jl") - include("rewriter_config_pb.jl") - include("config_pb.jl") - include("cpp_shape_inference_pb.jl") - include("summary_pb.jl") - include("event_pb.jl") - include("variable_pb.jl") - include("struct_tb_pb.jl") - include("trackable_object_graph_pb.jl") - include("saved_object_graph_pb.jl") - include("saver_pb.jl") - include("meta_graph_pb.jl") - include("tfprof_log_pb.jl") - - include("plugins/custom_scalar/layout_pb.jl") - include("plugins/text/plugin_data_pb.jl") - - #include("plugins/hparams/hparams.jl") - -end diff --git a/src/protojl/tensorboard/tensorboard/allocation_description_pb.jl b/src/protojl/tensorboard/tensorboard/allocation_description_pb.jl new file mode 100644 index 0000000..eab6af0 --- /dev/null +++ b/src/protojl/tensorboard/tensorboard/allocation_description_pb.jl @@ -0,0 +1,68 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:24.163 +# original file: /home/lior/TensorBoardLogger.jl/gen/proto/tensorboard/compat/proto/allocation_description.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export AllocationDescription + +struct AllocationDescription + requested_bytes::Int64 + allocated_bytes::Int64 + allocator_name::String + allocation_id::Int64 + has_single_reference::Bool + ptr::UInt64 +end +PB.default_values(::Type{AllocationDescription}) = (;requested_bytes = zero(Int64), allocated_bytes = zero(Int64), allocator_name = "", allocation_id = zero(Int64), has_single_reference = false, ptr = zero(UInt64)) +PB.field_numbers(::Type{AllocationDescription}) = (;requested_bytes = 1, allocated_bytes = 2, allocator_name = 3, allocation_id = 4, has_single_reference = 5, ptr = 6) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:AllocationDescription}) + requested_bytes = zero(Int64) + allocated_bytes = zero(Int64) + allocator_name = "" + allocation_id = zero(Int64) + has_single_reference = false + ptr = zero(UInt64) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + requested_bytes = PB.decode(d, Int64) + elseif field_number == 2 + allocated_bytes = PB.decode(d, Int64) + elseif field_number == 3 + allocator_name = PB.decode(d, String) + elseif field_number == 4 + allocation_id = PB.decode(d, Int64) + elseif field_number == 5 + has_single_reference = PB.decode(d, Bool) + elseif field_number == 6 + ptr = PB.decode(d, UInt64) + else + PB.skip(d, wire_type) + end + end + return AllocationDescription(requested_bytes, allocated_bytes, allocator_name, allocation_id, has_single_reference, ptr) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::AllocationDescription) + initpos = position(e.io) + x.requested_bytes != zero(Int64) && PB.encode(e, 1, x.requested_bytes) + x.allocated_bytes != zero(Int64) && PB.encode(e, 2, x.allocated_bytes) + !isempty(x.allocator_name) && PB.encode(e, 3, x.allocator_name) + x.allocation_id != zero(Int64) && PB.encode(e, 4, x.allocation_id) + x.has_single_reference != false && PB.encode(e, 5, x.has_single_reference) + x.ptr != zero(UInt64) && PB.encode(e, 6, x.ptr) + return position(e.io) - initpos +end +function PB._encoded_size(x::AllocationDescription) + encoded_size = 0 + x.requested_bytes != zero(Int64) && (encoded_size += PB._encoded_size(x.requested_bytes, 1)) + x.allocated_bytes != zero(Int64) && (encoded_size += PB._encoded_size(x.allocated_bytes, 2)) + !isempty(x.allocator_name) && (encoded_size += PB._encoded_size(x.allocator_name, 3)) + x.allocation_id != zero(Int64) && (encoded_size += PB._encoded_size(x.allocation_id, 4)) + x.has_single_reference != false && (encoded_size += PB._encoded_size(x.has_single_reference, 5)) + x.ptr != zero(UInt64) && (encoded_size += PB._encoded_size(x.ptr, 6)) + return encoded_size +end diff --git a/src/protojl/tensorboard/tensorboard/api_def_pb.jl b/src/protojl/tensorboard/tensorboard/api_def_pb.jl new file mode 100644 index 0000000..3a57a6d --- /dev/null +++ b/src/protojl/tensorboard/tensorboard/api_def_pb.jl @@ -0,0 +1,275 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:24.776 +# original file: /home/lior/TensorBoardLogger.jl/gen/proto/tensorboard/compat/proto/api_def.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export var"ApiDef.Attr", var"ApiDef.Endpoint", var"ApiDef.Arg", var"ApiDef.Visibility" +export ApiDef, ApiDefs + +struct var"ApiDef.Attr" + name::String + rename_to::String + default_value::Union{Nothing,AttrValue} + description::String +end +PB.default_values(::Type{var"ApiDef.Attr"}) = (;name = "", rename_to = "", default_value = nothing, description = "") +PB.field_numbers(::Type{var"ApiDef.Attr"}) = (;name = 1, rename_to = 2, default_value = 3, description = 4) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"ApiDef.Attr"}) + name = "" + rename_to = "" + default_value = Ref{Union{Nothing,AttrValue}}(nothing) + description = "" + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + name = PB.decode(d, String) + elseif field_number == 2 + rename_to = PB.decode(d, String) + elseif field_number == 3 + PB.decode!(d, default_value) + elseif field_number == 4 + description = PB.decode(d, String) + else + PB.skip(d, wire_type) + end + end + return var"ApiDef.Attr"(name, rename_to, default_value[], description) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"ApiDef.Attr") + initpos = position(e.io) + !isempty(x.name) && PB.encode(e, 1, x.name) + !isempty(x.rename_to) && PB.encode(e, 2, x.rename_to) + !isnothing(x.default_value) && PB.encode(e, 3, x.default_value) + !isempty(x.description) && PB.encode(e, 4, x.description) + return position(e.io) - initpos +end +function PB._encoded_size(x::var"ApiDef.Attr") + encoded_size = 0 + !isempty(x.name) && (encoded_size += PB._encoded_size(x.name, 1)) + !isempty(x.rename_to) && (encoded_size += PB._encoded_size(x.rename_to, 2)) + !isnothing(x.default_value) && (encoded_size += PB._encoded_size(x.default_value, 3)) + !isempty(x.description) && (encoded_size += PB._encoded_size(x.description, 4)) + return encoded_size +end + +struct var"ApiDef.Endpoint" + name::String + deprecated::Bool + deprecation_version::Int32 +end +PB.default_values(::Type{var"ApiDef.Endpoint"}) = (;name = "", deprecated = false, deprecation_version = zero(Int32)) +PB.field_numbers(::Type{var"ApiDef.Endpoint"}) = (;name = 1, deprecated = 3, deprecation_version = 4) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"ApiDef.Endpoint"}) + name = "" + deprecated = false + deprecation_version = zero(Int32) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + name = PB.decode(d, String) + elseif field_number == 3 + deprecated = PB.decode(d, Bool) + elseif field_number == 4 + deprecation_version = PB.decode(d, Int32) + else + PB.skip(d, wire_type) + end + end + return var"ApiDef.Endpoint"(name, deprecated, deprecation_version) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"ApiDef.Endpoint") + initpos = position(e.io) + !isempty(x.name) && PB.encode(e, 1, x.name) + x.deprecated != false && PB.encode(e, 3, x.deprecated) + x.deprecation_version != zero(Int32) && PB.encode(e, 4, x.deprecation_version) + return position(e.io) - initpos +end +function PB._encoded_size(x::var"ApiDef.Endpoint") + encoded_size = 0 + !isempty(x.name) && (encoded_size += PB._encoded_size(x.name, 1)) + x.deprecated != false && (encoded_size += PB._encoded_size(x.deprecated, 3)) + x.deprecation_version != zero(Int32) && (encoded_size += PB._encoded_size(x.deprecation_version, 4)) + return encoded_size +end + +struct var"ApiDef.Arg" + name::String + rename_to::String + description::String +end +PB.default_values(::Type{var"ApiDef.Arg"}) = (;name = "", rename_to = "", description = "") +PB.field_numbers(::Type{var"ApiDef.Arg"}) = (;name = 1, rename_to = 2, description = 3) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"ApiDef.Arg"}) + name = "" + rename_to = "" + description = "" + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + name = PB.decode(d, String) + elseif field_number == 2 + rename_to = PB.decode(d, String) + elseif field_number == 3 + description = PB.decode(d, String) + else + PB.skip(d, wire_type) + end + end + return var"ApiDef.Arg"(name, rename_to, description) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"ApiDef.Arg") + initpos = position(e.io) + !isempty(x.name) && PB.encode(e, 1, x.name) + !isempty(x.rename_to) && PB.encode(e, 2, x.rename_to) + !isempty(x.description) && PB.encode(e, 3, x.description) + return position(e.io) - initpos +end +function PB._encoded_size(x::var"ApiDef.Arg") + encoded_size = 0 + !isempty(x.name) && (encoded_size += PB._encoded_size(x.name, 1)) + !isempty(x.rename_to) && (encoded_size += PB._encoded_size(x.rename_to, 2)) + !isempty(x.description) && (encoded_size += PB._encoded_size(x.description, 3)) + return encoded_size +end + +@enumx var"ApiDef.Visibility" DEFAULT_VISIBILITY=0 VISIBLE=1 SKIP=2 HIDDEN=3 + +struct ApiDef + graph_op_name::String + deprecation_message::String + deprecation_version::Int32 + visibility::var"ApiDef.Visibility".T + endpoint::Vector{var"ApiDef.Endpoint"} + in_arg::Vector{var"ApiDef.Arg"} + out_arg::Vector{var"ApiDef.Arg"} + arg_order::Vector{String} + attr::Vector{var"ApiDef.Attr"} + summary::String + description::String + description_prefix::String + description_suffix::String +end +PB.default_values(::Type{ApiDef}) = (;graph_op_name = "", deprecation_message = "", deprecation_version = zero(Int32), visibility = var"ApiDef.Visibility".DEFAULT_VISIBILITY, endpoint = Vector{var"ApiDef.Endpoint"}(), in_arg = Vector{var"ApiDef.Arg"}(), out_arg = Vector{var"ApiDef.Arg"}(), arg_order = Vector{String}(), attr = Vector{var"ApiDef.Attr"}(), summary = "", description = "", description_prefix = "", description_suffix = "") +PB.field_numbers(::Type{ApiDef}) = (;graph_op_name = 1, deprecation_message = 12, deprecation_version = 13, visibility = 2, endpoint = 3, in_arg = 4, out_arg = 5, arg_order = 11, attr = 6, summary = 7, description = 8, description_prefix = 9, description_suffix = 10) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:ApiDef}) + graph_op_name = "" + deprecation_message = "" + deprecation_version = zero(Int32) + visibility = var"ApiDef.Visibility".DEFAULT_VISIBILITY + endpoint = PB.BufferedVector{var"ApiDef.Endpoint"}() + in_arg = PB.BufferedVector{var"ApiDef.Arg"}() + out_arg = PB.BufferedVector{var"ApiDef.Arg"}() + arg_order = PB.BufferedVector{String}() + attr = PB.BufferedVector{var"ApiDef.Attr"}() + summary = "" + description = "" + description_prefix = "" + description_suffix = "" + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + graph_op_name = PB.decode(d, String) + elseif field_number == 12 + deprecation_message = PB.decode(d, String) + elseif field_number == 13 + deprecation_version = PB.decode(d, Int32) + elseif field_number == 2 + visibility = PB.decode(d, var"ApiDef.Visibility".T) + elseif field_number == 3 + PB.decode!(d, endpoint) + elseif field_number == 4 + PB.decode!(d, in_arg) + elseif field_number == 5 + PB.decode!(d, out_arg) + elseif field_number == 11 + PB.decode!(d, arg_order) + elseif field_number == 6 + PB.decode!(d, attr) + elseif field_number == 7 + summary = PB.decode(d, String) + elseif field_number == 8 + description = PB.decode(d, String) + elseif field_number == 9 + description_prefix = PB.decode(d, String) + elseif field_number == 10 + description_suffix = PB.decode(d, String) + else + PB.skip(d, wire_type) + end + end + return ApiDef(graph_op_name, deprecation_message, deprecation_version, visibility, endpoint[], in_arg[], out_arg[], arg_order[], attr[], summary, description, description_prefix, description_suffix) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::ApiDef) + initpos = position(e.io) + !isempty(x.graph_op_name) && PB.encode(e, 1, x.graph_op_name) + !isempty(x.deprecation_message) && PB.encode(e, 12, x.deprecation_message) + x.deprecation_version != zero(Int32) && PB.encode(e, 13, x.deprecation_version) + x.visibility != var"ApiDef.Visibility".DEFAULT_VISIBILITY && PB.encode(e, 2, x.visibility) + !isempty(x.endpoint) && PB.encode(e, 3, x.endpoint) + !isempty(x.in_arg) && PB.encode(e, 4, x.in_arg) + !isempty(x.out_arg) && PB.encode(e, 5, x.out_arg) + !isempty(x.arg_order) && PB.encode(e, 11, x.arg_order) + !isempty(x.attr) && PB.encode(e, 6, x.attr) + !isempty(x.summary) && PB.encode(e, 7, x.summary) + !isempty(x.description) && PB.encode(e, 8, x.description) + !isempty(x.description_prefix) && PB.encode(e, 9, x.description_prefix) + !isempty(x.description_suffix) && PB.encode(e, 10, x.description_suffix) + return position(e.io) - initpos +end +function PB._encoded_size(x::ApiDef) + encoded_size = 0 + !isempty(x.graph_op_name) && (encoded_size += PB._encoded_size(x.graph_op_name, 1)) + !isempty(x.deprecation_message) && (encoded_size += PB._encoded_size(x.deprecation_message, 12)) + x.deprecation_version != zero(Int32) && (encoded_size += PB._encoded_size(x.deprecation_version, 13)) + x.visibility != var"ApiDef.Visibility".DEFAULT_VISIBILITY && (encoded_size += PB._encoded_size(x.visibility, 2)) + !isempty(x.endpoint) && (encoded_size += PB._encoded_size(x.endpoint, 3)) + !isempty(x.in_arg) && (encoded_size += PB._encoded_size(x.in_arg, 4)) + !isempty(x.out_arg) && (encoded_size += PB._encoded_size(x.out_arg, 5)) + !isempty(x.arg_order) && (encoded_size += PB._encoded_size(x.arg_order, 11)) + !isempty(x.attr) && (encoded_size += PB._encoded_size(x.attr, 6)) + !isempty(x.summary) && (encoded_size += PB._encoded_size(x.summary, 7)) + !isempty(x.description) && (encoded_size += PB._encoded_size(x.description, 8)) + !isempty(x.description_prefix) && (encoded_size += PB._encoded_size(x.description_prefix, 9)) + !isempty(x.description_suffix) && (encoded_size += PB._encoded_size(x.description_suffix, 10)) + return encoded_size +end + +struct ApiDefs + op::Vector{ApiDef} +end +PB.default_values(::Type{ApiDefs}) = (;op = Vector{ApiDef}()) +PB.field_numbers(::Type{ApiDefs}) = (;op = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:ApiDefs}) + op = PB.BufferedVector{ApiDef}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, op) + else + PB.skip(d, wire_type) + end + end + return ApiDefs(op[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::ApiDefs) + initpos = position(e.io) + !isempty(x.op) && PB.encode(e, 1, x.op) + return position(e.io) - initpos +end +function PB._encoded_size(x::ApiDefs) + encoded_size = 0 + !isempty(x.op) && (encoded_size += PB._encoded_size(x.op, 1)) + return encoded_size +end diff --git a/src/protojl/tensorboard/tensorboard/attr_value_pb.jl b/src/protojl/tensorboard/tensorboard/attr_value_pb.jl new file mode 100644 index 0000000..04663ee --- /dev/null +++ b/src/protojl/tensorboard/tensorboard/attr_value_pb.jl @@ -0,0 +1,216 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:24.718 +# original file: /home/lior/TensorBoardLogger.jl/gen/proto/tensorboard/compat/proto/attr_value.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export NameAttrList, var"AttrValue.ListValue", AttrValue + +# Abstract types to help resolve mutually recursive definitions +abstract type var"##AbstractNameAttrList" end +abstract type var"##AbstractAttrValue.ListValue" end +abstract type var"##AbstractAttrValue" end + + +struct NameAttrList{T1<:Union{Nothing,var"##AbstractAttrValue"}} <: var"##AbstractNameAttrList" + name::String + attr::Dict{String,T1} +end +PB.default_values(::Type{NameAttrList}) = (;name = "", attr = Dict{String,AttrValue}()) +PB.field_numbers(::Type{NameAttrList}) = (;name = 1, attr = 2) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:NameAttrList}) + name = "" + attr = Dict{String,AttrValue}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + name = PB.decode(d, String) + elseif field_number == 2 + PB.decode!(d, attr) + else + PB.skip(d, wire_type) + end + end + return NameAttrList(name, attr) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::NameAttrList) + initpos = position(e.io) + !isempty(x.name) && PB.encode(e, 1, x.name) + !isempty(x.attr) && PB.encode(e, 2, x.attr) + return position(e.io) - initpos +end +function PB._encoded_size(x::NameAttrList) + encoded_size = 0 + !isempty(x.name) && (encoded_size += PB._encoded_size(x.name, 1)) + !isempty(x.attr) && (encoded_size += PB._encoded_size(x.attr, 2)) + return encoded_size +end + +struct var"AttrValue.ListValue" <: var"##AbstractAttrValue.ListValue" + s::Vector{Vector{UInt8}} + i::Vector{Int64} + f::Vector{Float32} + b::Vector{Bool} + var"#type"::Vector{var"#DataType".T} + shape::Vector{TensorShapeProto} + tensor::Vector{TensorProto} + func::Vector{<:NameAttrList} +end + +PB.default_values(::Type{var"AttrValue.ListValue"}) = (;s = Vector{Vector{UInt8}}(), i = Vector{Int64}(), f = Vector{Float32}(), b = Vector{Bool}(), var"#type" = Vector{var"#DataType".T}(), shape = Vector{TensorShapeProto}(), tensor = Vector{TensorProto}(), func = Vector{NameAttrList}()) +PB.field_numbers(::Type{var"AttrValue.ListValue"}) = (;s = 2, i = 3, f = 4, b = 5, var"#type" = 6, shape = 7, tensor = 8, func = 9) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"AttrValue.ListValue"}) + s = PB.BufferedVector{Vector{UInt8}}() + i = PB.BufferedVector{Int64}() + f = PB.BufferedVector{Float32}() + b = PB.BufferedVector{Bool}() + var"#type" = PB.BufferedVector{var"#DataType".T}() + shape = PB.BufferedVector{TensorShapeProto}() + tensor = PB.BufferedVector{TensorProto}() + func = PB.BufferedVector{NameAttrList}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 2 + PB.decode!(d, s) + elseif field_number == 3 + PB.decode!(d, wire_type, i) + elseif field_number == 4 + PB.decode!(d, wire_type, f) + elseif field_number == 5 + PB.decode!(d, wire_type, b) + elseif field_number == 6 + PB.decode!(d, wire_type, var"#type") + elseif field_number == 7 + PB.decode!(d, shape) + elseif field_number == 8 + PB.decode!(d, tensor) + elseif field_number == 9 + PB.decode!(d, func) + else + PB.skip(d, wire_type) + end + end + return var"AttrValue.ListValue"(s[], i[], f[], b[], var"#type"[], shape[], tensor[], func[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"AttrValue.ListValue") + initpos = position(e.io) + !isempty(x.s) && PB.encode(e, 2, x.s) + !isempty(x.i) && PB.encode(e, 3, x.i) + !isempty(x.f) && PB.encode(e, 4, x.f) + !isempty(x.b) && PB.encode(e, 5, x.b) + !isempty(x.var"#type") && PB.encode(e, 6, x.var"#type") + !isempty(x.shape) && PB.encode(e, 7, x.shape) + !isempty(x.tensor) && PB.encode(e, 8, x.tensor) + !isempty(x.func) && PB.encode(e, 9, x.func) + return position(e.io) - initpos +end +function PB._encoded_size(x::var"AttrValue.ListValue") + encoded_size = 0 + !isempty(x.s) && (encoded_size += PB._encoded_size(x.s, 2)) + !isempty(x.i) && (encoded_size += PB._encoded_size(x.i, 3)) + !isempty(x.f) && (encoded_size += PB._encoded_size(x.f, 4)) + !isempty(x.b) && (encoded_size += PB._encoded_size(x.b, 5)) + !isempty(x.var"#type") && (encoded_size += PB._encoded_size(x.var"#type", 6)) + !isempty(x.shape) && (encoded_size += PB._encoded_size(x.shape, 7)) + !isempty(x.tensor) && (encoded_size += PB._encoded_size(x.tensor, 8)) + !isempty(x.func) && (encoded_size += PB._encoded_size(x.func, 9)) + return encoded_size +end + +struct AttrValue <: var"##AbstractAttrValue" + value::Union{Nothing,OneOf{<:Union{Vector{UInt8},Int64,Float32,Bool,var"#DataType".T,TensorShapeProto,TensorProto,var"##AbstractAttrValue.ListValue",var"##AbstractNameAttrList",String}}} +end +PB.oneof_field_types(::Type{AttrValue}) = (; + value = (;s=Vector{UInt8}, i=Int64, f=Float32, b=Bool, var"#type"=var"#DataType".T, shape=TensorShapeProto, tensor=TensorProto, list=var"AttrValue.ListValue", func=NameAttrList, placeholder=String), +) +PB.default_values(::Type{AttrValue}) = (;s = UInt8[], i = zero(Int64), f = zero(Float32), b = false, var"#type" = var"#DataType".DT_INVALID, shape = nothing, tensor = nothing, list = nothing, func = nothing, placeholder = "") +PB.field_numbers(::Type{AttrValue}) = (;s = 2, i = 3, f = 4, b = 5, var"#type" = 6, shape = 7, tensor = 8, list = 1, func = 10, placeholder = 9) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:AttrValue}) + value = nothing + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 2 + value = OneOf(:s, PB.decode(d, Vector{UInt8})) + elseif field_number == 3 + value = OneOf(:i, PB.decode(d, Int64)) + elseif field_number == 4 + value = OneOf(:f, PB.decode(d, Float32)) + elseif field_number == 5 + value = OneOf(:b, PB.decode(d, Bool)) + elseif field_number == 6 + value = OneOf(:var"#type", PB.decode(d, var"#DataType".T)) + elseif field_number == 7 + value = OneOf(:shape, PB.decode(d, Ref{TensorShapeProto})) + elseif field_number == 8 + value = OneOf(:tensor, PB.decode(d, Ref{TensorProto})) + elseif field_number == 1 + value = OneOf(:list, PB.decode(d, Ref{var"AttrValue.ListValue"})) + elseif field_number == 10 + value = OneOf(:func, PB.decode(d, Ref{NameAttrList})) + elseif field_number == 9 + value = OneOf(:placeholder, PB.decode(d, String)) + else + PB.skip(d, wire_type) + end + end + return AttrValue(value) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::AttrValue) + initpos = position(e.io) + if isnothing(x.value); + elseif x.value.name === :s + PB.encode(e, 2, x.value[]::Vector{UInt8}) + elseif x.value.name === :i + PB.encode(e, 3, x.value[]::Int64) + elseif x.value.name === :f + PB.encode(e, 4, x.value[]::Float32) + elseif x.value.name === :b + PB.encode(e, 5, x.value[]::Bool) + elseif x.value.name === :var"#type" + PB.encode(e, 6, x.value[]::var"#DataType".T) + elseif x.value.name === :shape + PB.encode(e, 7, x.value[]::TensorShapeProto) + elseif x.value.name === :tensor + PB.encode(e, 8, x.value[]::TensorProto) + elseif x.value.name === :list + PB.encode(e, 1, x.value[]::var"AttrValue.ListValue") + elseif x.value.name === :func + PB.encode(e, 10, x.value[]::NameAttrList) + elseif x.value.name === :placeholder + PB.encode(e, 9, x.value[]::String) + end + return position(e.io) - initpos +end +function PB._encoded_size(x::AttrValue) + encoded_size = 0 + if isnothing(x.value); + elseif x.value.name === :s + encoded_size += PB._encoded_size(x.value[]::Vector{UInt8}, 2) + elseif x.value.name === :i + encoded_size += PB._encoded_size(x.value[]::Int64, 3) + elseif x.value.name === :f + encoded_size += PB._encoded_size(x.value[]::Float32, 4) + elseif x.value.name === :b + encoded_size += PB._encoded_size(x.value[]::Bool, 5) + elseif x.value.name === :var"#type" + encoded_size += PB._encoded_size(x.value[]::var"#DataType".T, 6) + elseif x.value.name === :shape + encoded_size += PB._encoded_size(x.value[]::TensorShapeProto, 7) + elseif x.value.name === :tensor + encoded_size += PB._encoded_size(x.value[]::TensorProto, 8) + elseif x.value.name === :list + encoded_size += PB._encoded_size(x.value[]::var"AttrValue.ListValue", 1) + elseif x.value.name === :func + encoded_size += PB._encoded_size(x.value[]::NameAttrList, 10) + elseif x.value.name === :placeholder + encoded_size += PB._encoded_size(x.value[]::String, 9) + end + return encoded_size +end diff --git a/src/protojl/tensorboard/tensorboard/cluster_pb.jl b/src/protojl/tensorboard/tensorboard/cluster_pb.jl new file mode 100644 index 0000000..3202c08 --- /dev/null +++ b/src/protojl/tensorboard/tensorboard/cluster_pb.jl @@ -0,0 +1,74 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:24.424 +# original file: /home/lior/TensorBoardLogger.jl/gen/proto/tensorboard/compat/proto/cluster.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export JobDef, ClusterDef + +struct JobDef + name::String + tasks::Dict{Int32,String} +end +PB.default_values(::Type{JobDef}) = (;name = "", tasks = Dict{Int32,String}()) +PB.field_numbers(::Type{JobDef}) = (;name = 1, tasks = 2) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:JobDef}) + name = "" + tasks = Dict{Int32,String}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + name = PB.decode(d, String) + elseif field_number == 2 + PB.decode!(d, tasks) + else + PB.skip(d, wire_type) + end + end + return JobDef(name, tasks) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::JobDef) + initpos = position(e.io) + !isempty(x.name) && PB.encode(e, 1, x.name) + !isempty(x.tasks) && PB.encode(e, 2, x.tasks) + return position(e.io) - initpos +end +function PB._encoded_size(x::JobDef) + encoded_size = 0 + !isempty(x.name) && (encoded_size += PB._encoded_size(x.name, 1)) + !isempty(x.tasks) && (encoded_size += PB._encoded_size(x.tasks, 2)) + return encoded_size +end + +struct ClusterDef + job::Vector{JobDef} +end +PB.default_values(::Type{ClusterDef}) = (;job = Vector{JobDef}()) +PB.field_numbers(::Type{ClusterDef}) = (;job = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:ClusterDef}) + job = PB.BufferedVector{JobDef}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, job) + else + PB.skip(d, wire_type) + end + end + return ClusterDef(job[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::ClusterDef) + initpos = position(e.io) + !isempty(x.job) && PB.encode(e, 1, x.job) + return position(e.io) - initpos +end +function PB._encoded_size(x::ClusterDef) + encoded_size = 0 + !isempty(x.job) && (encoded_size += PB._encoded_size(x.job, 1)) + return encoded_size +end diff --git a/src/protojl/tensorboard/tensorboard/config_pb.jl b/src/protojl/tensorboard/tensorboard/config_pb.jl new file mode 100644 index 0000000..89ff61f --- /dev/null +++ b/src/protojl/tensorboard/tensorboard/config_pb.jl @@ -0,0 +1,1083 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:24.779 +# original file: /home/lior/TensorBoardLogger.jl/gen/proto/tensorboard/compat/proto/config.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export var"OptimizerOptions.Level", var"GPUOptions.Experimental.VirtualDevices" +export ThreadPoolOptionProto, var"OptimizerOptions.GlobalJitLevel" +export var"RunMetadata.FunctionGraphs", TensorConnection +export var"ConfigProto.Experimental.MlirBridgeRollout", var"RunOptions.TraceLevel" +export var"RunOptions.Experimental.RunHandlerPoolOptions", SessionMetadata +export var"GPUOptions.Experimental", OptimizerOptions, var"RunOptions.Experimental" +export var"ConfigProto.Experimental", RunMetadata, GPUOptions, GraphOptions, RunOptions +export ConfigProto, CallableOptions + +@enumx var"OptimizerOptions.Level" L1=0 L0=-1 + +struct var"GPUOptions.Experimental.VirtualDevices" + memory_limit_mb::Vector{Float32} + priority::Vector{Int32} + device_ordinal::Vector{Int32} +end +PB.default_values(::Type{var"GPUOptions.Experimental.VirtualDevices"}) = (;memory_limit_mb = Vector{Float32}(), priority = Vector{Int32}(), device_ordinal = Vector{Int32}()) +PB.field_numbers(::Type{var"GPUOptions.Experimental.VirtualDevices"}) = (;memory_limit_mb = 1, priority = 2, device_ordinal = 3) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"GPUOptions.Experimental.VirtualDevices"}) + memory_limit_mb = PB.BufferedVector{Float32}() + priority = PB.BufferedVector{Int32}() + device_ordinal = PB.BufferedVector{Int32}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, wire_type, memory_limit_mb) + elseif field_number == 2 + PB.decode!(d, wire_type, priority) + elseif field_number == 3 + PB.decode!(d, wire_type, device_ordinal) + else + PB.skip(d, wire_type) + end + end + return var"GPUOptions.Experimental.VirtualDevices"(memory_limit_mb[], priority[], device_ordinal[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"GPUOptions.Experimental.VirtualDevices") + initpos = position(e.io) + !isempty(x.memory_limit_mb) && PB.encode(e, 1, x.memory_limit_mb) + !isempty(x.priority) && PB.encode(e, 2, x.priority) + !isempty(x.device_ordinal) && PB.encode(e, 3, x.device_ordinal) + return position(e.io) - initpos +end +function PB._encoded_size(x::var"GPUOptions.Experimental.VirtualDevices") + encoded_size = 0 + !isempty(x.memory_limit_mb) && (encoded_size += PB._encoded_size(x.memory_limit_mb, 1)) + !isempty(x.priority) && (encoded_size += PB._encoded_size(x.priority, 2)) + !isempty(x.device_ordinal) && (encoded_size += PB._encoded_size(x.device_ordinal, 3)) + return encoded_size +end + +struct ThreadPoolOptionProto + num_threads::Int32 + global_name::String +end +PB.default_values(::Type{ThreadPoolOptionProto}) = (;num_threads = zero(Int32), global_name = "") +PB.field_numbers(::Type{ThreadPoolOptionProto}) = (;num_threads = 1, global_name = 2) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:ThreadPoolOptionProto}) + num_threads = zero(Int32) + global_name = "" + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + num_threads = PB.decode(d, Int32) + elseif field_number == 2 + global_name = PB.decode(d, String) + else + PB.skip(d, wire_type) + end + end + return ThreadPoolOptionProto(num_threads, global_name) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::ThreadPoolOptionProto) + initpos = position(e.io) + x.num_threads != zero(Int32) && PB.encode(e, 1, x.num_threads) + !isempty(x.global_name) && PB.encode(e, 2, x.global_name) + return position(e.io) - initpos +end +function PB._encoded_size(x::ThreadPoolOptionProto) + encoded_size = 0 + x.num_threads != zero(Int32) && (encoded_size += PB._encoded_size(x.num_threads, 1)) + !isempty(x.global_name) && (encoded_size += PB._encoded_size(x.global_name, 2)) + return encoded_size +end + +@enumx var"OptimizerOptions.GlobalJitLevel" DEFAULT=0 OFF=-1 ON_1=1 ON_2=2 + +struct var"RunMetadata.FunctionGraphs" + partition_graphs::Vector{GraphDef} + pre_optimization_graph::Union{Nothing,GraphDef} + post_optimization_graph::Union{Nothing,GraphDef} +end +PB.default_values(::Type{var"RunMetadata.FunctionGraphs"}) = (;partition_graphs = Vector{GraphDef}(), pre_optimization_graph = nothing, post_optimization_graph = nothing) +PB.field_numbers(::Type{var"RunMetadata.FunctionGraphs"}) = (;partition_graphs = 1, pre_optimization_graph = 2, post_optimization_graph = 3) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"RunMetadata.FunctionGraphs"}) + partition_graphs = PB.BufferedVector{GraphDef}() + pre_optimization_graph = Ref{Union{Nothing,GraphDef}}(nothing) + post_optimization_graph = Ref{Union{Nothing,GraphDef}}(nothing) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, partition_graphs) + elseif field_number == 2 + PB.decode!(d, pre_optimization_graph) + elseif field_number == 3 + PB.decode!(d, post_optimization_graph) + else + PB.skip(d, wire_type) + end + end + return var"RunMetadata.FunctionGraphs"(partition_graphs[], pre_optimization_graph[], post_optimization_graph[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"RunMetadata.FunctionGraphs") + initpos = position(e.io) + !isempty(x.partition_graphs) && PB.encode(e, 1, x.partition_graphs) + !isnothing(x.pre_optimization_graph) && PB.encode(e, 2, x.pre_optimization_graph) + !isnothing(x.post_optimization_graph) && PB.encode(e, 3, x.post_optimization_graph) + return position(e.io) - initpos +end +function PB._encoded_size(x::var"RunMetadata.FunctionGraphs") + encoded_size = 0 + !isempty(x.partition_graphs) && (encoded_size += PB._encoded_size(x.partition_graphs, 1)) + !isnothing(x.pre_optimization_graph) && (encoded_size += PB._encoded_size(x.pre_optimization_graph, 2)) + !isnothing(x.post_optimization_graph) && (encoded_size += PB._encoded_size(x.post_optimization_graph, 3)) + return encoded_size +end + +struct TensorConnection + from_tensor::String + to_tensor::String +end +PB.default_values(::Type{TensorConnection}) = (;from_tensor = "", to_tensor = "") +PB.field_numbers(::Type{TensorConnection}) = (;from_tensor = 1, to_tensor = 2) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:TensorConnection}) + from_tensor = "" + to_tensor = "" + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + from_tensor = PB.decode(d, String) + elseif field_number == 2 + to_tensor = PB.decode(d, String) + else + PB.skip(d, wire_type) + end + end + return TensorConnection(from_tensor, to_tensor) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::TensorConnection) + initpos = position(e.io) + !isempty(x.from_tensor) && PB.encode(e, 1, x.from_tensor) + !isempty(x.to_tensor) && PB.encode(e, 2, x.to_tensor) + return position(e.io) - initpos +end +function PB._encoded_size(x::TensorConnection) + encoded_size = 0 + !isempty(x.from_tensor) && (encoded_size += PB._encoded_size(x.from_tensor, 1)) + !isempty(x.to_tensor) && (encoded_size += PB._encoded_size(x.to_tensor, 2)) + return encoded_size +end + +@enumx var"ConfigProto.Experimental.MlirBridgeRollout" MLIR_BRIDGE_ROLLOUT_UNSPECIFIED=0 MLIR_BRIDGE_ROLLOUT_ENABLED=1 MLIR_BRIDGE_ROLLOUT_DISABLED=2 +PB.reserved_fields(::Type{var"ConfigProto.Experimental.MlirBridgeRollout".T}) = (names = ["MLIR_BRIDGE_ROLLOUT_SAFE_MODE_ENABLED", "MLIR_BRIDGE_ROLLOUT_SAFE_MODE_FALLBACK_ENABLED"], numbers = Union{Int,UnitRange{Int}}[3, 4]) + +@enumx var"RunOptions.TraceLevel" NO_TRACE=0 SOFTWARE_TRACE=1 HARDWARE_TRACE=2 FULL_TRACE=3 + +struct var"RunOptions.Experimental.RunHandlerPoolOptions" + priority::Int64 +end +PB.default_values(::Type{var"RunOptions.Experimental.RunHandlerPoolOptions"}) = (;priority = zero(Int64)) +PB.field_numbers(::Type{var"RunOptions.Experimental.RunHandlerPoolOptions"}) = (;priority = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"RunOptions.Experimental.RunHandlerPoolOptions"}) + priority = zero(Int64) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + priority = PB.decode(d, Int64) + else + PB.skip(d, wire_type) + end + end + return var"RunOptions.Experimental.RunHandlerPoolOptions"(priority) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"RunOptions.Experimental.RunHandlerPoolOptions") + initpos = position(e.io) + x.priority != zero(Int64) && PB.encode(e, 1, x.priority) + return position(e.io) - initpos +end +function PB._encoded_size(x::var"RunOptions.Experimental.RunHandlerPoolOptions") + encoded_size = 0 + x.priority != zero(Int64) && (encoded_size += PB._encoded_size(x.priority, 1)) + return encoded_size +end + +struct SessionMetadata + name::String + version::Int64 +end +PB.default_values(::Type{SessionMetadata}) = (;name = "", version = zero(Int64)) +PB.field_numbers(::Type{SessionMetadata}) = (;name = 1, version = 2) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:SessionMetadata}) + name = "" + version = zero(Int64) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + name = PB.decode(d, String) + elseif field_number == 2 + version = PB.decode(d, Int64) + else + PB.skip(d, wire_type) + end + end + return SessionMetadata(name, version) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::SessionMetadata) + initpos = position(e.io) + !isempty(x.name) && PB.encode(e, 1, x.name) + x.version != zero(Int64) && PB.encode(e, 2, x.version) + return position(e.io) - initpos +end +function PB._encoded_size(x::SessionMetadata) + encoded_size = 0 + !isempty(x.name) && (encoded_size += PB._encoded_size(x.name, 1)) + x.version != zero(Int64) && (encoded_size += PB._encoded_size(x.version, 2)) + return encoded_size +end + +struct var"GPUOptions.Experimental" + virtual_devices::Vector{var"GPUOptions.Experimental.VirtualDevices"} + use_unified_memory::Bool + num_dev_to_dev_copy_streams::Int32 + collective_ring_order::String + timestamped_allocator::Bool + kernel_tracker_max_interval::Int32 + kernel_tracker_max_bytes::Int32 + kernel_tracker_max_pending::Int32 + internal_fragmentation_fraction::Float64 + use_cuda_malloc_async::Bool + disallow_retry_on_allocation_failure::Bool + gpu_host_mem_limit_in_mb::Float32 + gpu_host_mem_disallow_growth::Bool +end +PB.default_values(::Type{var"GPUOptions.Experimental"}) = (;virtual_devices = Vector{var"GPUOptions.Experimental.VirtualDevices"}(), use_unified_memory = false, num_dev_to_dev_copy_streams = zero(Int32), collective_ring_order = "", timestamped_allocator = false, kernel_tracker_max_interval = zero(Int32), kernel_tracker_max_bytes = zero(Int32), kernel_tracker_max_pending = zero(Int32), internal_fragmentation_fraction = zero(Float64), use_cuda_malloc_async = false, disallow_retry_on_allocation_failure = false, gpu_host_mem_limit_in_mb = zero(Float32), gpu_host_mem_disallow_growth = false) +PB.field_numbers(::Type{var"GPUOptions.Experimental"}) = (;virtual_devices = 1, use_unified_memory = 2, num_dev_to_dev_copy_streams = 3, collective_ring_order = 4, timestamped_allocator = 5, kernel_tracker_max_interval = 7, kernel_tracker_max_bytes = 8, kernel_tracker_max_pending = 9, internal_fragmentation_fraction = 10, use_cuda_malloc_async = 11, disallow_retry_on_allocation_failure = 12, gpu_host_mem_limit_in_mb = 13, gpu_host_mem_disallow_growth = 14) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"GPUOptions.Experimental"}) + virtual_devices = PB.BufferedVector{var"GPUOptions.Experimental.VirtualDevices"}() + use_unified_memory = false + num_dev_to_dev_copy_streams = zero(Int32) + collective_ring_order = "" + timestamped_allocator = false + kernel_tracker_max_interval = zero(Int32) + kernel_tracker_max_bytes = zero(Int32) + kernel_tracker_max_pending = zero(Int32) + internal_fragmentation_fraction = zero(Float64) + use_cuda_malloc_async = false + disallow_retry_on_allocation_failure = false + gpu_host_mem_limit_in_mb = zero(Float32) + gpu_host_mem_disallow_growth = false + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, virtual_devices) + elseif field_number == 2 + use_unified_memory = PB.decode(d, Bool) + elseif field_number == 3 + num_dev_to_dev_copy_streams = PB.decode(d, Int32) + elseif field_number == 4 + collective_ring_order = PB.decode(d, String) + elseif field_number == 5 + timestamped_allocator = PB.decode(d, Bool) + elseif field_number == 7 + kernel_tracker_max_interval = PB.decode(d, Int32) + elseif field_number == 8 + kernel_tracker_max_bytes = PB.decode(d, Int32) + elseif field_number == 9 + kernel_tracker_max_pending = PB.decode(d, Int32) + elseif field_number == 10 + internal_fragmentation_fraction = PB.decode(d, Float64) + elseif field_number == 11 + use_cuda_malloc_async = PB.decode(d, Bool) + elseif field_number == 12 + disallow_retry_on_allocation_failure = PB.decode(d, Bool) + elseif field_number == 13 + gpu_host_mem_limit_in_mb = PB.decode(d, Float32) + elseif field_number == 14 + gpu_host_mem_disallow_growth = PB.decode(d, Bool) + else + PB.skip(d, wire_type) + end + end + return var"GPUOptions.Experimental"(virtual_devices[], use_unified_memory, num_dev_to_dev_copy_streams, collective_ring_order, timestamped_allocator, kernel_tracker_max_interval, kernel_tracker_max_bytes, kernel_tracker_max_pending, internal_fragmentation_fraction, use_cuda_malloc_async, disallow_retry_on_allocation_failure, gpu_host_mem_limit_in_mb, gpu_host_mem_disallow_growth) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"GPUOptions.Experimental") + initpos = position(e.io) + !isempty(x.virtual_devices) && PB.encode(e, 1, x.virtual_devices) + x.use_unified_memory != false && PB.encode(e, 2, x.use_unified_memory) + x.num_dev_to_dev_copy_streams != zero(Int32) && PB.encode(e, 3, x.num_dev_to_dev_copy_streams) + !isempty(x.collective_ring_order) && PB.encode(e, 4, x.collective_ring_order) + x.timestamped_allocator != false && PB.encode(e, 5, x.timestamped_allocator) + x.kernel_tracker_max_interval != zero(Int32) && PB.encode(e, 7, x.kernel_tracker_max_interval) + x.kernel_tracker_max_bytes != zero(Int32) && PB.encode(e, 8, x.kernel_tracker_max_bytes) + x.kernel_tracker_max_pending != zero(Int32) && PB.encode(e, 9, x.kernel_tracker_max_pending) + x.internal_fragmentation_fraction != zero(Float64) && PB.encode(e, 10, x.internal_fragmentation_fraction) + x.use_cuda_malloc_async != false && PB.encode(e, 11, x.use_cuda_malloc_async) + x.disallow_retry_on_allocation_failure != false && PB.encode(e, 12, x.disallow_retry_on_allocation_failure) + x.gpu_host_mem_limit_in_mb != zero(Float32) && PB.encode(e, 13, x.gpu_host_mem_limit_in_mb) + x.gpu_host_mem_disallow_growth != false && PB.encode(e, 14, x.gpu_host_mem_disallow_growth) + return position(e.io) - initpos +end +function PB._encoded_size(x::var"GPUOptions.Experimental") + encoded_size = 0 + !isempty(x.virtual_devices) && (encoded_size += PB._encoded_size(x.virtual_devices, 1)) + x.use_unified_memory != false && (encoded_size += PB._encoded_size(x.use_unified_memory, 2)) + x.num_dev_to_dev_copy_streams != zero(Int32) && (encoded_size += PB._encoded_size(x.num_dev_to_dev_copy_streams, 3)) + !isempty(x.collective_ring_order) && (encoded_size += PB._encoded_size(x.collective_ring_order, 4)) + x.timestamped_allocator != false && (encoded_size += PB._encoded_size(x.timestamped_allocator, 5)) + x.kernel_tracker_max_interval != zero(Int32) && (encoded_size += PB._encoded_size(x.kernel_tracker_max_interval, 7)) + x.kernel_tracker_max_bytes != zero(Int32) && (encoded_size += PB._encoded_size(x.kernel_tracker_max_bytes, 8)) + x.kernel_tracker_max_pending != zero(Int32) && (encoded_size += PB._encoded_size(x.kernel_tracker_max_pending, 9)) + x.internal_fragmentation_fraction != zero(Float64) && (encoded_size += PB._encoded_size(x.internal_fragmentation_fraction, 10)) + x.use_cuda_malloc_async != false && (encoded_size += PB._encoded_size(x.use_cuda_malloc_async, 11)) + x.disallow_retry_on_allocation_failure != false && (encoded_size += PB._encoded_size(x.disallow_retry_on_allocation_failure, 12)) + x.gpu_host_mem_limit_in_mb != zero(Float32) && (encoded_size += PB._encoded_size(x.gpu_host_mem_limit_in_mb, 13)) + x.gpu_host_mem_disallow_growth != false && (encoded_size += PB._encoded_size(x.gpu_host_mem_disallow_growth, 14)) + return encoded_size +end + +struct OptimizerOptions + do_common_subexpression_elimination::Bool + do_constant_folding::Bool + max_folded_constant_in_bytes::Int64 + do_function_inlining::Bool + opt_level::var"OptimizerOptions.Level".T + global_jit_level::var"OptimizerOptions.GlobalJitLevel".T + cpu_global_jit::Bool +end +PB.default_values(::Type{OptimizerOptions}) = (;do_common_subexpression_elimination = false, do_constant_folding = false, max_folded_constant_in_bytes = zero(Int64), do_function_inlining = false, opt_level = var"OptimizerOptions.Level".L1, global_jit_level = var"OptimizerOptions.GlobalJitLevel".DEFAULT, cpu_global_jit = false) +PB.field_numbers(::Type{OptimizerOptions}) = (;do_common_subexpression_elimination = 1, do_constant_folding = 2, max_folded_constant_in_bytes = 6, do_function_inlining = 4, opt_level = 3, global_jit_level = 5, cpu_global_jit = 7) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:OptimizerOptions}) + do_common_subexpression_elimination = false + do_constant_folding = false + max_folded_constant_in_bytes = zero(Int64) + do_function_inlining = false + opt_level = var"OptimizerOptions.Level".L1 + global_jit_level = var"OptimizerOptions.GlobalJitLevel".DEFAULT + cpu_global_jit = false + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + do_common_subexpression_elimination = PB.decode(d, Bool) + elseif field_number == 2 + do_constant_folding = PB.decode(d, Bool) + elseif field_number == 6 + max_folded_constant_in_bytes = PB.decode(d, Int64) + elseif field_number == 4 + do_function_inlining = PB.decode(d, Bool) + elseif field_number == 3 + opt_level = PB.decode(d, var"OptimizerOptions.Level".T) + elseif field_number == 5 + global_jit_level = PB.decode(d, var"OptimizerOptions.GlobalJitLevel".T) + elseif field_number == 7 + cpu_global_jit = PB.decode(d, Bool) + else + PB.skip(d, wire_type) + end + end + return OptimizerOptions(do_common_subexpression_elimination, do_constant_folding, max_folded_constant_in_bytes, do_function_inlining, opt_level, global_jit_level, cpu_global_jit) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::OptimizerOptions) + initpos = position(e.io) + x.do_common_subexpression_elimination != false && PB.encode(e, 1, x.do_common_subexpression_elimination) + x.do_constant_folding != false && PB.encode(e, 2, x.do_constant_folding) + x.max_folded_constant_in_bytes != zero(Int64) && PB.encode(e, 6, x.max_folded_constant_in_bytes) + x.do_function_inlining != false && PB.encode(e, 4, x.do_function_inlining) + x.opt_level != var"OptimizerOptions.Level".L1 && PB.encode(e, 3, x.opt_level) + x.global_jit_level != var"OptimizerOptions.GlobalJitLevel".DEFAULT && PB.encode(e, 5, x.global_jit_level) + x.cpu_global_jit != false && PB.encode(e, 7, x.cpu_global_jit) + return position(e.io) - initpos +end +function PB._encoded_size(x::OptimizerOptions) + encoded_size = 0 + x.do_common_subexpression_elimination != false && (encoded_size += PB._encoded_size(x.do_common_subexpression_elimination, 1)) + x.do_constant_folding != false && (encoded_size += PB._encoded_size(x.do_constant_folding, 2)) + x.max_folded_constant_in_bytes != zero(Int64) && (encoded_size += PB._encoded_size(x.max_folded_constant_in_bytes, 6)) + x.do_function_inlining != false && (encoded_size += PB._encoded_size(x.do_function_inlining, 4)) + x.opt_level != var"OptimizerOptions.Level".L1 && (encoded_size += PB._encoded_size(x.opt_level, 3)) + x.global_jit_level != var"OptimizerOptions.GlobalJitLevel".DEFAULT && (encoded_size += PB._encoded_size(x.global_jit_level, 5)) + x.cpu_global_jit != false && (encoded_size += PB._encoded_size(x.cpu_global_jit, 7)) + return encoded_size +end + +struct var"RunOptions.Experimental" + collective_graph_key::Int64 + use_run_handler_pool::Bool + run_handler_pool_options::Union{Nothing,var"RunOptions.Experimental.RunHandlerPoolOptions"} +end +PB.default_values(::Type{var"RunOptions.Experimental"}) = (;collective_graph_key = zero(Int64), use_run_handler_pool = false, run_handler_pool_options = nothing) +PB.field_numbers(::Type{var"RunOptions.Experimental"}) = (;collective_graph_key = 1, use_run_handler_pool = 2, run_handler_pool_options = 3) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"RunOptions.Experimental"}) + collective_graph_key = zero(Int64) + use_run_handler_pool = false + run_handler_pool_options = Ref{Union{Nothing,var"RunOptions.Experimental.RunHandlerPoolOptions"}}(nothing) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + collective_graph_key = PB.decode(d, Int64) + elseif field_number == 2 + use_run_handler_pool = PB.decode(d, Bool) + elseif field_number == 3 + PB.decode!(d, run_handler_pool_options) + else + PB.skip(d, wire_type) + end + end + return var"RunOptions.Experimental"(collective_graph_key, use_run_handler_pool, run_handler_pool_options[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"RunOptions.Experimental") + initpos = position(e.io) + x.collective_graph_key != zero(Int64) && PB.encode(e, 1, x.collective_graph_key) + x.use_run_handler_pool != false && PB.encode(e, 2, x.use_run_handler_pool) + !isnothing(x.run_handler_pool_options) && PB.encode(e, 3, x.run_handler_pool_options) + return position(e.io) - initpos +end +function PB._encoded_size(x::var"RunOptions.Experimental") + encoded_size = 0 + x.collective_graph_key != zero(Int64) && (encoded_size += PB._encoded_size(x.collective_graph_key, 1)) + x.use_run_handler_pool != false && (encoded_size += PB._encoded_size(x.use_run_handler_pool, 2)) + !isnothing(x.run_handler_pool_options) && (encoded_size += PB._encoded_size(x.run_handler_pool_options, 3)) + return encoded_size +end + +struct var"ConfigProto.Experimental" + collective_group_leader::String + executor_type::String + recv_buf_max_chunk::Int32 + use_numa_affinity::Bool + collective_deterministic_sequential_execution::Bool + collective_nccl::Bool + share_session_state_in_clusterspec_propagation::Bool + disable_thread_spinning::Bool + share_cluster_devices_in_session::Bool + session_metadata::Union{Nothing,SessionMetadata} + optimize_for_static_graph::Bool + enable_mlir_bridge::Bool + mlir_bridge_rollout::var"ConfigProto.Experimental.MlirBridgeRollout".T + enable_mlir_graph_optimization::Bool + disable_output_partition_graphs::Bool + xla_fusion_autotuner_thresh::Int64 + use_tfrt::Bool + disable_functional_ops_lowering::Bool + xla_prefer_single_graph_cluster::Bool + coordination_config::Union{Nothing,CoordinationServiceConfig} + disable_optimize_for_static_graph::Bool +end +PB.reserved_fields(::Type{var"ConfigProto.Experimental"}) = (names = String[], numbers = Union{Int,UnitRange{Int}}[2, 19, 20, 25]) +PB.default_values(::Type{var"ConfigProto.Experimental"}) = (;collective_group_leader = "", executor_type = "", recv_buf_max_chunk = zero(Int32), use_numa_affinity = false, collective_deterministic_sequential_execution = false, collective_nccl = false, share_session_state_in_clusterspec_propagation = false, disable_thread_spinning = false, share_cluster_devices_in_session = false, session_metadata = nothing, optimize_for_static_graph = false, enable_mlir_bridge = false, mlir_bridge_rollout = var"ConfigProto.Experimental.MlirBridgeRollout".MLIR_BRIDGE_ROLLOUT_UNSPECIFIED, enable_mlir_graph_optimization = false, disable_output_partition_graphs = false, xla_fusion_autotuner_thresh = zero(Int64), use_tfrt = false, disable_functional_ops_lowering = false, xla_prefer_single_graph_cluster = false, coordination_config = nothing, disable_optimize_for_static_graph = false) +PB.field_numbers(::Type{var"ConfigProto.Experimental"}) = (;collective_group_leader = 1, executor_type = 3, recv_buf_max_chunk = 4, use_numa_affinity = 5, collective_deterministic_sequential_execution = 6, collective_nccl = 7, share_session_state_in_clusterspec_propagation = 8, disable_thread_spinning = 9, share_cluster_devices_in_session = 10, session_metadata = 11, optimize_for_static_graph = 12, enable_mlir_bridge = 13, mlir_bridge_rollout = 17, enable_mlir_graph_optimization = 16, disable_output_partition_graphs = 14, xla_fusion_autotuner_thresh = 15, use_tfrt = 18, disable_functional_ops_lowering = 21, xla_prefer_single_graph_cluster = 22, coordination_config = 23, disable_optimize_for_static_graph = 24) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"ConfigProto.Experimental"}) + collective_group_leader = "" + executor_type = "" + recv_buf_max_chunk = zero(Int32) + use_numa_affinity = false + collective_deterministic_sequential_execution = false + collective_nccl = false + share_session_state_in_clusterspec_propagation = false + disable_thread_spinning = false + share_cluster_devices_in_session = false + session_metadata = Ref{Union{Nothing,SessionMetadata}}(nothing) + optimize_for_static_graph = false + enable_mlir_bridge = false + mlir_bridge_rollout = var"ConfigProto.Experimental.MlirBridgeRollout".MLIR_BRIDGE_ROLLOUT_UNSPECIFIED + enable_mlir_graph_optimization = false + disable_output_partition_graphs = false + xla_fusion_autotuner_thresh = zero(Int64) + use_tfrt = false + disable_functional_ops_lowering = false + xla_prefer_single_graph_cluster = false + coordination_config = Ref{Union{Nothing,CoordinationServiceConfig}}(nothing) + disable_optimize_for_static_graph = false + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + collective_group_leader = PB.decode(d, String) + elseif field_number == 3 + executor_type = PB.decode(d, String) + elseif field_number == 4 + recv_buf_max_chunk = PB.decode(d, Int32) + elseif field_number == 5 + use_numa_affinity = PB.decode(d, Bool) + elseif field_number == 6 + collective_deterministic_sequential_execution = PB.decode(d, Bool) + elseif field_number == 7 + collective_nccl = PB.decode(d, Bool) + elseif field_number == 8 + share_session_state_in_clusterspec_propagation = PB.decode(d, Bool) + elseif field_number == 9 + disable_thread_spinning = PB.decode(d, Bool) + elseif field_number == 10 + share_cluster_devices_in_session = PB.decode(d, Bool) + elseif field_number == 11 + PB.decode!(d, session_metadata) + elseif field_number == 12 + optimize_for_static_graph = PB.decode(d, Bool) + elseif field_number == 13 + enable_mlir_bridge = PB.decode(d, Bool) + elseif field_number == 17 + mlir_bridge_rollout = PB.decode(d, var"ConfigProto.Experimental.MlirBridgeRollout".T) + elseif field_number == 16 + enable_mlir_graph_optimization = PB.decode(d, Bool) + elseif field_number == 14 + disable_output_partition_graphs = PB.decode(d, Bool) + elseif field_number == 15 + xla_fusion_autotuner_thresh = PB.decode(d, Int64) + elseif field_number == 18 + use_tfrt = PB.decode(d, Bool) + elseif field_number == 21 + disable_functional_ops_lowering = PB.decode(d, Bool) + elseif field_number == 22 + xla_prefer_single_graph_cluster = PB.decode(d, Bool) + elseif field_number == 23 + PB.decode!(d, coordination_config) + elseif field_number == 24 + disable_optimize_for_static_graph = PB.decode(d, Bool) + else + PB.skip(d, wire_type) + end + end + return var"ConfigProto.Experimental"(collective_group_leader, executor_type, recv_buf_max_chunk, use_numa_affinity, collective_deterministic_sequential_execution, collective_nccl, share_session_state_in_clusterspec_propagation, disable_thread_spinning, share_cluster_devices_in_session, session_metadata[], optimize_for_static_graph, enable_mlir_bridge, mlir_bridge_rollout, enable_mlir_graph_optimization, disable_output_partition_graphs, xla_fusion_autotuner_thresh, use_tfrt, disable_functional_ops_lowering, xla_prefer_single_graph_cluster, coordination_config[], disable_optimize_for_static_graph) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"ConfigProto.Experimental") + initpos = position(e.io) + !isempty(x.collective_group_leader) && PB.encode(e, 1, x.collective_group_leader) + !isempty(x.executor_type) && PB.encode(e, 3, x.executor_type) + x.recv_buf_max_chunk != zero(Int32) && PB.encode(e, 4, x.recv_buf_max_chunk) + x.use_numa_affinity != false && PB.encode(e, 5, x.use_numa_affinity) + x.collective_deterministic_sequential_execution != false && PB.encode(e, 6, x.collective_deterministic_sequential_execution) + x.collective_nccl != false && PB.encode(e, 7, x.collective_nccl) + x.share_session_state_in_clusterspec_propagation != false && PB.encode(e, 8, x.share_session_state_in_clusterspec_propagation) + x.disable_thread_spinning != false && PB.encode(e, 9, x.disable_thread_spinning) + x.share_cluster_devices_in_session != false && PB.encode(e, 10, x.share_cluster_devices_in_session) + !isnothing(x.session_metadata) && PB.encode(e, 11, x.session_metadata) + x.optimize_for_static_graph != false && PB.encode(e, 12, x.optimize_for_static_graph) + x.enable_mlir_bridge != false && PB.encode(e, 13, x.enable_mlir_bridge) + x.mlir_bridge_rollout != var"ConfigProto.Experimental.MlirBridgeRollout".MLIR_BRIDGE_ROLLOUT_UNSPECIFIED && PB.encode(e, 17, x.mlir_bridge_rollout) + x.enable_mlir_graph_optimization != false && PB.encode(e, 16, x.enable_mlir_graph_optimization) + x.disable_output_partition_graphs != false && PB.encode(e, 14, x.disable_output_partition_graphs) + x.xla_fusion_autotuner_thresh != zero(Int64) && PB.encode(e, 15, x.xla_fusion_autotuner_thresh) + x.use_tfrt != false && PB.encode(e, 18, x.use_tfrt) + x.disable_functional_ops_lowering != false && PB.encode(e, 21, x.disable_functional_ops_lowering) + x.xla_prefer_single_graph_cluster != false && PB.encode(e, 22, x.xla_prefer_single_graph_cluster) + !isnothing(x.coordination_config) && PB.encode(e, 23, x.coordination_config) + x.disable_optimize_for_static_graph != false && PB.encode(e, 24, x.disable_optimize_for_static_graph) + return position(e.io) - initpos +end +function PB._encoded_size(x::var"ConfigProto.Experimental") + encoded_size = 0 + !isempty(x.collective_group_leader) && (encoded_size += PB._encoded_size(x.collective_group_leader, 1)) + !isempty(x.executor_type) && (encoded_size += PB._encoded_size(x.executor_type, 3)) + x.recv_buf_max_chunk != zero(Int32) && (encoded_size += PB._encoded_size(x.recv_buf_max_chunk, 4)) + x.use_numa_affinity != false && (encoded_size += PB._encoded_size(x.use_numa_affinity, 5)) + x.collective_deterministic_sequential_execution != false && (encoded_size += PB._encoded_size(x.collective_deterministic_sequential_execution, 6)) + x.collective_nccl != false && (encoded_size += PB._encoded_size(x.collective_nccl, 7)) + x.share_session_state_in_clusterspec_propagation != false && (encoded_size += PB._encoded_size(x.share_session_state_in_clusterspec_propagation, 8)) + x.disable_thread_spinning != false && (encoded_size += PB._encoded_size(x.disable_thread_spinning, 9)) + x.share_cluster_devices_in_session != false && (encoded_size += PB._encoded_size(x.share_cluster_devices_in_session, 10)) + !isnothing(x.session_metadata) && (encoded_size += PB._encoded_size(x.session_metadata, 11)) + x.optimize_for_static_graph != false && (encoded_size += PB._encoded_size(x.optimize_for_static_graph, 12)) + x.enable_mlir_bridge != false && (encoded_size += PB._encoded_size(x.enable_mlir_bridge, 13)) + x.mlir_bridge_rollout != var"ConfigProto.Experimental.MlirBridgeRollout".MLIR_BRIDGE_ROLLOUT_UNSPECIFIED && (encoded_size += PB._encoded_size(x.mlir_bridge_rollout, 17)) + x.enable_mlir_graph_optimization != false && (encoded_size += PB._encoded_size(x.enable_mlir_graph_optimization, 16)) + x.disable_output_partition_graphs != false && (encoded_size += PB._encoded_size(x.disable_output_partition_graphs, 14)) + x.xla_fusion_autotuner_thresh != zero(Int64) && (encoded_size += PB._encoded_size(x.xla_fusion_autotuner_thresh, 15)) + x.use_tfrt != false && (encoded_size += PB._encoded_size(x.use_tfrt, 18)) + x.disable_functional_ops_lowering != false && (encoded_size += PB._encoded_size(x.disable_functional_ops_lowering, 21)) + x.xla_prefer_single_graph_cluster != false && (encoded_size += PB._encoded_size(x.xla_prefer_single_graph_cluster, 22)) + !isnothing(x.coordination_config) && (encoded_size += PB._encoded_size(x.coordination_config, 23)) + x.disable_optimize_for_static_graph != false && (encoded_size += PB._encoded_size(x.disable_optimize_for_static_graph, 24)) + return encoded_size +end + +struct RunMetadata + step_stats::Union{Nothing,StepStats} + cost_graph::Union{Nothing,CostGraphDef} + partition_graphs::Vector{GraphDef} + function_graphs::Vector{var"RunMetadata.FunctionGraphs"} + session_metadata::Union{Nothing,SessionMetadata} +end +PB.default_values(::Type{RunMetadata}) = (;step_stats = nothing, cost_graph = nothing, partition_graphs = Vector{GraphDef}(), function_graphs = Vector{var"RunMetadata.FunctionGraphs"}(), session_metadata = nothing) +PB.field_numbers(::Type{RunMetadata}) = (;step_stats = 1, cost_graph = 2, partition_graphs = 3, function_graphs = 4, session_metadata = 5) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:RunMetadata}) + step_stats = Ref{Union{Nothing,StepStats}}(nothing) + cost_graph = Ref{Union{Nothing,CostGraphDef}}(nothing) + partition_graphs = PB.BufferedVector{GraphDef}() + function_graphs = PB.BufferedVector{var"RunMetadata.FunctionGraphs"}() + session_metadata = Ref{Union{Nothing,SessionMetadata}}(nothing) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, step_stats) + elseif field_number == 2 + PB.decode!(d, cost_graph) + elseif field_number == 3 + PB.decode!(d, partition_graphs) + elseif field_number == 4 + PB.decode!(d, function_graphs) + elseif field_number == 5 + PB.decode!(d, session_metadata) + else + PB.skip(d, wire_type) + end + end + return RunMetadata(step_stats[], cost_graph[], partition_graphs[], function_graphs[], session_metadata[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::RunMetadata) + initpos = position(e.io) + !isnothing(x.step_stats) && PB.encode(e, 1, x.step_stats) + !isnothing(x.cost_graph) && PB.encode(e, 2, x.cost_graph) + !isempty(x.partition_graphs) && PB.encode(e, 3, x.partition_graphs) + !isempty(x.function_graphs) && PB.encode(e, 4, x.function_graphs) + !isnothing(x.session_metadata) && PB.encode(e, 5, x.session_metadata) + return position(e.io) - initpos +end +function PB._encoded_size(x::RunMetadata) + encoded_size = 0 + !isnothing(x.step_stats) && (encoded_size += PB._encoded_size(x.step_stats, 1)) + !isnothing(x.cost_graph) && (encoded_size += PB._encoded_size(x.cost_graph, 2)) + !isempty(x.partition_graphs) && (encoded_size += PB._encoded_size(x.partition_graphs, 3)) + !isempty(x.function_graphs) && (encoded_size += PB._encoded_size(x.function_graphs, 4)) + !isnothing(x.session_metadata) && (encoded_size += PB._encoded_size(x.session_metadata, 5)) + return encoded_size +end + +struct GPUOptions + per_process_gpu_memory_fraction::Float64 + allow_growth::Bool + allocator_type::String + deferred_deletion_bytes::Int64 + visible_device_list::String + polling_active_delay_usecs::Int32 + polling_inactive_delay_msecs::Int32 + force_gpu_compatible::Bool + experimental::Union{Nothing,var"GPUOptions.Experimental"} +end +PB.default_values(::Type{GPUOptions}) = (;per_process_gpu_memory_fraction = zero(Float64), allow_growth = false, allocator_type = "", deferred_deletion_bytes = zero(Int64), visible_device_list = "", polling_active_delay_usecs = zero(Int32), polling_inactive_delay_msecs = zero(Int32), force_gpu_compatible = false, experimental = nothing) +PB.field_numbers(::Type{GPUOptions}) = (;per_process_gpu_memory_fraction = 1, allow_growth = 4, allocator_type = 2, deferred_deletion_bytes = 3, visible_device_list = 5, polling_active_delay_usecs = 6, polling_inactive_delay_msecs = 7, force_gpu_compatible = 8, experimental = 9) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:GPUOptions}) + per_process_gpu_memory_fraction = zero(Float64) + allow_growth = false + allocator_type = "" + deferred_deletion_bytes = zero(Int64) + visible_device_list = "" + polling_active_delay_usecs = zero(Int32) + polling_inactive_delay_msecs = zero(Int32) + force_gpu_compatible = false + experimental = Ref{Union{Nothing,var"GPUOptions.Experimental"}}(nothing) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + per_process_gpu_memory_fraction = PB.decode(d, Float64) + elseif field_number == 4 + allow_growth = PB.decode(d, Bool) + elseif field_number == 2 + allocator_type = PB.decode(d, String) + elseif field_number == 3 + deferred_deletion_bytes = PB.decode(d, Int64) + elseif field_number == 5 + visible_device_list = PB.decode(d, String) + elseif field_number == 6 + polling_active_delay_usecs = PB.decode(d, Int32) + elseif field_number == 7 + polling_inactive_delay_msecs = PB.decode(d, Int32) + elseif field_number == 8 + force_gpu_compatible = PB.decode(d, Bool) + elseif field_number == 9 + PB.decode!(d, experimental) + else + PB.skip(d, wire_type) + end + end + return GPUOptions(per_process_gpu_memory_fraction, allow_growth, allocator_type, deferred_deletion_bytes, visible_device_list, polling_active_delay_usecs, polling_inactive_delay_msecs, force_gpu_compatible, experimental[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::GPUOptions) + initpos = position(e.io) + x.per_process_gpu_memory_fraction != zero(Float64) && PB.encode(e, 1, x.per_process_gpu_memory_fraction) + x.allow_growth != false && PB.encode(e, 4, x.allow_growth) + !isempty(x.allocator_type) && PB.encode(e, 2, x.allocator_type) + x.deferred_deletion_bytes != zero(Int64) && PB.encode(e, 3, x.deferred_deletion_bytes) + !isempty(x.visible_device_list) && PB.encode(e, 5, x.visible_device_list) + x.polling_active_delay_usecs != zero(Int32) && PB.encode(e, 6, x.polling_active_delay_usecs) + x.polling_inactive_delay_msecs != zero(Int32) && PB.encode(e, 7, x.polling_inactive_delay_msecs) + x.force_gpu_compatible != false && PB.encode(e, 8, x.force_gpu_compatible) + !isnothing(x.experimental) && PB.encode(e, 9, x.experimental) + return position(e.io) - initpos +end +function PB._encoded_size(x::GPUOptions) + encoded_size = 0 + x.per_process_gpu_memory_fraction != zero(Float64) && (encoded_size += PB._encoded_size(x.per_process_gpu_memory_fraction, 1)) + x.allow_growth != false && (encoded_size += PB._encoded_size(x.allow_growth, 4)) + !isempty(x.allocator_type) && (encoded_size += PB._encoded_size(x.allocator_type, 2)) + x.deferred_deletion_bytes != zero(Int64) && (encoded_size += PB._encoded_size(x.deferred_deletion_bytes, 3)) + !isempty(x.visible_device_list) && (encoded_size += PB._encoded_size(x.visible_device_list, 5)) + x.polling_active_delay_usecs != zero(Int32) && (encoded_size += PB._encoded_size(x.polling_active_delay_usecs, 6)) + x.polling_inactive_delay_msecs != zero(Int32) && (encoded_size += PB._encoded_size(x.polling_inactive_delay_msecs, 7)) + x.force_gpu_compatible != false && (encoded_size += PB._encoded_size(x.force_gpu_compatible, 8)) + !isnothing(x.experimental) && (encoded_size += PB._encoded_size(x.experimental, 9)) + return encoded_size +end + +struct GraphOptions + enable_recv_scheduling::Bool + optimizer_options::Union{Nothing,OptimizerOptions} + build_cost_model::Int64 + build_cost_model_after::Int64 + infer_shapes::Bool + place_pruned_graph::Bool + enable_bfloat16_sendrecv::Bool + timeline_step::Int32 + rewrite_options::Union{Nothing,RewriterConfig} +end +PB.reserved_fields(::Type{GraphOptions}) = (names = ["skip_common_subexpression_elimination"], numbers = Union{Int,UnitRange{Int}}[1]) +PB.default_values(::Type{GraphOptions}) = (;enable_recv_scheduling = false, optimizer_options = nothing, build_cost_model = zero(Int64), build_cost_model_after = zero(Int64), infer_shapes = false, place_pruned_graph = false, enable_bfloat16_sendrecv = false, timeline_step = zero(Int32), rewrite_options = nothing) +PB.field_numbers(::Type{GraphOptions}) = (;enable_recv_scheduling = 2, optimizer_options = 3, build_cost_model = 4, build_cost_model_after = 9, infer_shapes = 5, place_pruned_graph = 6, enable_bfloat16_sendrecv = 7, timeline_step = 8, rewrite_options = 10) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:GraphOptions}) + enable_recv_scheduling = false + optimizer_options = Ref{Union{Nothing,OptimizerOptions}}(nothing) + build_cost_model = zero(Int64) + build_cost_model_after = zero(Int64) + infer_shapes = false + place_pruned_graph = false + enable_bfloat16_sendrecv = false + timeline_step = zero(Int32) + rewrite_options = Ref{Union{Nothing,RewriterConfig}}(nothing) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 2 + enable_recv_scheduling = PB.decode(d, Bool) + elseif field_number == 3 + PB.decode!(d, optimizer_options) + elseif field_number == 4 + build_cost_model = PB.decode(d, Int64) + elseif field_number == 9 + build_cost_model_after = PB.decode(d, Int64) + elseif field_number == 5 + infer_shapes = PB.decode(d, Bool) + elseif field_number == 6 + place_pruned_graph = PB.decode(d, Bool) + elseif field_number == 7 + enable_bfloat16_sendrecv = PB.decode(d, Bool) + elseif field_number == 8 + timeline_step = PB.decode(d, Int32) + elseif field_number == 10 + PB.decode!(d, rewrite_options) + else + PB.skip(d, wire_type) + end + end + return GraphOptions(enable_recv_scheduling, optimizer_options[], build_cost_model, build_cost_model_after, infer_shapes, place_pruned_graph, enable_bfloat16_sendrecv, timeline_step, rewrite_options[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::GraphOptions) + initpos = position(e.io) + x.enable_recv_scheduling != false && PB.encode(e, 2, x.enable_recv_scheduling) + !isnothing(x.optimizer_options) && PB.encode(e, 3, x.optimizer_options) + x.build_cost_model != zero(Int64) && PB.encode(e, 4, x.build_cost_model) + x.build_cost_model_after != zero(Int64) && PB.encode(e, 9, x.build_cost_model_after) + x.infer_shapes != false && PB.encode(e, 5, x.infer_shapes) + x.place_pruned_graph != false && PB.encode(e, 6, x.place_pruned_graph) + x.enable_bfloat16_sendrecv != false && PB.encode(e, 7, x.enable_bfloat16_sendrecv) + x.timeline_step != zero(Int32) && PB.encode(e, 8, x.timeline_step) + !isnothing(x.rewrite_options) && PB.encode(e, 10, x.rewrite_options) + return position(e.io) - initpos +end +function PB._encoded_size(x::GraphOptions) + encoded_size = 0 + x.enable_recv_scheduling != false && (encoded_size += PB._encoded_size(x.enable_recv_scheduling, 2)) + !isnothing(x.optimizer_options) && (encoded_size += PB._encoded_size(x.optimizer_options, 3)) + x.build_cost_model != zero(Int64) && (encoded_size += PB._encoded_size(x.build_cost_model, 4)) + x.build_cost_model_after != zero(Int64) && (encoded_size += PB._encoded_size(x.build_cost_model_after, 9)) + x.infer_shapes != false && (encoded_size += PB._encoded_size(x.infer_shapes, 5)) + x.place_pruned_graph != false && (encoded_size += PB._encoded_size(x.place_pruned_graph, 6)) + x.enable_bfloat16_sendrecv != false && (encoded_size += PB._encoded_size(x.enable_bfloat16_sendrecv, 7)) + x.timeline_step != zero(Int32) && (encoded_size += PB._encoded_size(x.timeline_step, 8)) + !isnothing(x.rewrite_options) && (encoded_size += PB._encoded_size(x.rewrite_options, 10)) + return encoded_size +end + +struct RunOptions + trace_level::var"RunOptions.TraceLevel".T + timeout_in_ms::Int64 + inter_op_thread_pool::Int32 + output_partition_graphs::Bool + debug_options::Union{Nothing,DebugOptions} + report_tensor_allocations_upon_oom::Bool + experimental::Union{Nothing,var"RunOptions.Experimental"} +end +PB.reserved_fields(::Type{RunOptions}) = (names = String[], numbers = Union{Int,UnitRange{Int}}[4]) +PB.default_values(::Type{RunOptions}) = (;trace_level = var"RunOptions.TraceLevel".NO_TRACE, timeout_in_ms = zero(Int64), inter_op_thread_pool = zero(Int32), output_partition_graphs = false, debug_options = nothing, report_tensor_allocations_upon_oom = false, experimental = nothing) +PB.field_numbers(::Type{RunOptions}) = (;trace_level = 1, timeout_in_ms = 2, inter_op_thread_pool = 3, output_partition_graphs = 5, debug_options = 6, report_tensor_allocations_upon_oom = 7, experimental = 8) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:RunOptions}) + trace_level = var"RunOptions.TraceLevel".NO_TRACE + timeout_in_ms = zero(Int64) + inter_op_thread_pool = zero(Int32) + output_partition_graphs = false + debug_options = Ref{Union{Nothing,DebugOptions}}(nothing) + report_tensor_allocations_upon_oom = false + experimental = Ref{Union{Nothing,var"RunOptions.Experimental"}}(nothing) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + trace_level = PB.decode(d, var"RunOptions.TraceLevel".T) + elseif field_number == 2 + timeout_in_ms = PB.decode(d, Int64) + elseif field_number == 3 + inter_op_thread_pool = PB.decode(d, Int32) + elseif field_number == 5 + output_partition_graphs = PB.decode(d, Bool) + elseif field_number == 6 + PB.decode!(d, debug_options) + elseif field_number == 7 + report_tensor_allocations_upon_oom = PB.decode(d, Bool) + elseif field_number == 8 + PB.decode!(d, experimental) + else + PB.skip(d, wire_type) + end + end + return RunOptions(trace_level, timeout_in_ms, inter_op_thread_pool, output_partition_graphs, debug_options[], report_tensor_allocations_upon_oom, experimental[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::RunOptions) + initpos = position(e.io) + x.trace_level != var"RunOptions.TraceLevel".NO_TRACE && PB.encode(e, 1, x.trace_level) + x.timeout_in_ms != zero(Int64) && PB.encode(e, 2, x.timeout_in_ms) + x.inter_op_thread_pool != zero(Int32) && PB.encode(e, 3, x.inter_op_thread_pool) + x.output_partition_graphs != false && PB.encode(e, 5, x.output_partition_graphs) + !isnothing(x.debug_options) && PB.encode(e, 6, x.debug_options) + x.report_tensor_allocations_upon_oom != false && PB.encode(e, 7, x.report_tensor_allocations_upon_oom) + !isnothing(x.experimental) && PB.encode(e, 8, x.experimental) + return position(e.io) - initpos +end +function PB._encoded_size(x::RunOptions) + encoded_size = 0 + x.trace_level != var"RunOptions.TraceLevel".NO_TRACE && (encoded_size += PB._encoded_size(x.trace_level, 1)) + x.timeout_in_ms != zero(Int64) && (encoded_size += PB._encoded_size(x.timeout_in_ms, 2)) + x.inter_op_thread_pool != zero(Int32) && (encoded_size += PB._encoded_size(x.inter_op_thread_pool, 3)) + x.output_partition_graphs != false && (encoded_size += PB._encoded_size(x.output_partition_graphs, 5)) + !isnothing(x.debug_options) && (encoded_size += PB._encoded_size(x.debug_options, 6)) + x.report_tensor_allocations_upon_oom != false && (encoded_size += PB._encoded_size(x.report_tensor_allocations_upon_oom, 7)) + !isnothing(x.experimental) && (encoded_size += PB._encoded_size(x.experimental, 8)) + return encoded_size +end + +struct ConfigProto + device_count::Dict{String,Int32} + intra_op_parallelism_threads::Int32 + inter_op_parallelism_threads::Int32 + use_per_session_threads::Bool + session_inter_op_thread_pool::Vector{ThreadPoolOptionProto} + placement_period::Int32 + device_filters::Vector{String} + gpu_options::Union{Nothing,GPUOptions} + allow_soft_placement::Bool + log_device_placement::Bool + graph_options::Union{Nothing,GraphOptions} + operation_timeout_in_ms::Int64 + rpc_options::Union{Nothing,RPCOptions} + cluster_def::Union{Nothing,ClusterDef} + isolate_session_state::Bool + share_cluster_devices_in_session::Bool + experimental::Union{Nothing,var"ConfigProto.Experimental"} +end +PB.default_values(::Type{ConfigProto}) = (;device_count = Dict{String,Int32}(), intra_op_parallelism_threads = zero(Int32), inter_op_parallelism_threads = zero(Int32), use_per_session_threads = false, session_inter_op_thread_pool = Vector{ThreadPoolOptionProto}(), placement_period = zero(Int32), device_filters = Vector{String}(), gpu_options = nothing, allow_soft_placement = false, log_device_placement = false, graph_options = nothing, operation_timeout_in_ms = zero(Int64), rpc_options = nothing, cluster_def = nothing, isolate_session_state = false, share_cluster_devices_in_session = false, experimental = nothing) +PB.field_numbers(::Type{ConfigProto}) = (;device_count = 1, intra_op_parallelism_threads = 2, inter_op_parallelism_threads = 5, use_per_session_threads = 9, session_inter_op_thread_pool = 12, placement_period = 3, device_filters = 4, gpu_options = 6, allow_soft_placement = 7, log_device_placement = 8, graph_options = 10, operation_timeout_in_ms = 11, rpc_options = 13, cluster_def = 14, isolate_session_state = 15, share_cluster_devices_in_session = 17, experimental = 16) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:ConfigProto}) + device_count = Dict{String,Int32}() + intra_op_parallelism_threads = zero(Int32) + inter_op_parallelism_threads = zero(Int32) + use_per_session_threads = false + session_inter_op_thread_pool = PB.BufferedVector{ThreadPoolOptionProto}() + placement_period = zero(Int32) + device_filters = PB.BufferedVector{String}() + gpu_options = Ref{Union{Nothing,GPUOptions}}(nothing) + allow_soft_placement = false + log_device_placement = false + graph_options = Ref{Union{Nothing,GraphOptions}}(nothing) + operation_timeout_in_ms = zero(Int64) + rpc_options = Ref{Union{Nothing,RPCOptions}}(nothing) + cluster_def = Ref{Union{Nothing,ClusterDef}}(nothing) + isolate_session_state = false + share_cluster_devices_in_session = false + experimental = Ref{Union{Nothing,var"ConfigProto.Experimental"}}(nothing) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, device_count) + elseif field_number == 2 + intra_op_parallelism_threads = PB.decode(d, Int32) + elseif field_number == 5 + inter_op_parallelism_threads = PB.decode(d, Int32) + elseif field_number == 9 + use_per_session_threads = PB.decode(d, Bool) + elseif field_number == 12 + PB.decode!(d, session_inter_op_thread_pool) + elseif field_number == 3 + placement_period = PB.decode(d, Int32) + elseif field_number == 4 + PB.decode!(d, device_filters) + elseif field_number == 6 + PB.decode!(d, gpu_options) + elseif field_number == 7 + allow_soft_placement = PB.decode(d, Bool) + elseif field_number == 8 + log_device_placement = PB.decode(d, Bool) + elseif field_number == 10 + PB.decode!(d, graph_options) + elseif field_number == 11 + operation_timeout_in_ms = PB.decode(d, Int64) + elseif field_number == 13 + PB.decode!(d, rpc_options) + elseif field_number == 14 + PB.decode!(d, cluster_def) + elseif field_number == 15 + isolate_session_state = PB.decode(d, Bool) + elseif field_number == 17 + share_cluster_devices_in_session = PB.decode(d, Bool) + elseif field_number == 16 + PB.decode!(d, experimental) + else + PB.skip(d, wire_type) + end + end + return ConfigProto(device_count, intra_op_parallelism_threads, inter_op_parallelism_threads, use_per_session_threads, session_inter_op_thread_pool[], placement_period, device_filters[], gpu_options[], allow_soft_placement, log_device_placement, graph_options[], operation_timeout_in_ms, rpc_options[], cluster_def[], isolate_session_state, share_cluster_devices_in_session, experimental[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::ConfigProto) + initpos = position(e.io) + !isempty(x.device_count) && PB.encode(e, 1, x.device_count) + x.intra_op_parallelism_threads != zero(Int32) && PB.encode(e, 2, x.intra_op_parallelism_threads) + x.inter_op_parallelism_threads != zero(Int32) && PB.encode(e, 5, x.inter_op_parallelism_threads) + x.use_per_session_threads != false && PB.encode(e, 9, x.use_per_session_threads) + !isempty(x.session_inter_op_thread_pool) && PB.encode(e, 12, x.session_inter_op_thread_pool) + x.placement_period != zero(Int32) && PB.encode(e, 3, x.placement_period) + !isempty(x.device_filters) && PB.encode(e, 4, x.device_filters) + !isnothing(x.gpu_options) && PB.encode(e, 6, x.gpu_options) + x.allow_soft_placement != false && PB.encode(e, 7, x.allow_soft_placement) + x.log_device_placement != false && PB.encode(e, 8, x.log_device_placement) + !isnothing(x.graph_options) && PB.encode(e, 10, x.graph_options) + x.operation_timeout_in_ms != zero(Int64) && PB.encode(e, 11, x.operation_timeout_in_ms) + !isnothing(x.rpc_options) && PB.encode(e, 13, x.rpc_options) + !isnothing(x.cluster_def) && PB.encode(e, 14, x.cluster_def) + x.isolate_session_state != false && PB.encode(e, 15, x.isolate_session_state) + x.share_cluster_devices_in_session != false && PB.encode(e, 17, x.share_cluster_devices_in_session) + !isnothing(x.experimental) && PB.encode(e, 16, x.experimental) + return position(e.io) - initpos +end +function PB._encoded_size(x::ConfigProto) + encoded_size = 0 + !isempty(x.device_count) && (encoded_size += PB._encoded_size(x.device_count, 1)) + x.intra_op_parallelism_threads != zero(Int32) && (encoded_size += PB._encoded_size(x.intra_op_parallelism_threads, 2)) + x.inter_op_parallelism_threads != zero(Int32) && (encoded_size += PB._encoded_size(x.inter_op_parallelism_threads, 5)) + x.use_per_session_threads != false && (encoded_size += PB._encoded_size(x.use_per_session_threads, 9)) + !isempty(x.session_inter_op_thread_pool) && (encoded_size += PB._encoded_size(x.session_inter_op_thread_pool, 12)) + x.placement_period != zero(Int32) && (encoded_size += PB._encoded_size(x.placement_period, 3)) + !isempty(x.device_filters) && (encoded_size += PB._encoded_size(x.device_filters, 4)) + !isnothing(x.gpu_options) && (encoded_size += PB._encoded_size(x.gpu_options, 6)) + x.allow_soft_placement != false && (encoded_size += PB._encoded_size(x.allow_soft_placement, 7)) + x.log_device_placement != false && (encoded_size += PB._encoded_size(x.log_device_placement, 8)) + !isnothing(x.graph_options) && (encoded_size += PB._encoded_size(x.graph_options, 10)) + x.operation_timeout_in_ms != zero(Int64) && (encoded_size += PB._encoded_size(x.operation_timeout_in_ms, 11)) + !isnothing(x.rpc_options) && (encoded_size += PB._encoded_size(x.rpc_options, 13)) + !isnothing(x.cluster_def) && (encoded_size += PB._encoded_size(x.cluster_def, 14)) + x.isolate_session_state != false && (encoded_size += PB._encoded_size(x.isolate_session_state, 15)) + x.share_cluster_devices_in_session != false && (encoded_size += PB._encoded_size(x.share_cluster_devices_in_session, 17)) + !isnothing(x.experimental) && (encoded_size += PB._encoded_size(x.experimental, 16)) + return encoded_size +end + +struct CallableOptions + feed::Vector{String} + fetch::Vector{String} + target::Vector{String} + run_options::Union{Nothing,RunOptions} + tensor_connection::Vector{TensorConnection} + feed_devices::Dict{String,String} + fetch_devices::Dict{String,String} + fetch_skip_sync::Bool +end +PB.default_values(::Type{CallableOptions}) = (;feed = Vector{String}(), fetch = Vector{String}(), target = Vector{String}(), run_options = nothing, tensor_connection = Vector{TensorConnection}(), feed_devices = Dict{String,String}(), fetch_devices = Dict{String,String}(), fetch_skip_sync = false) +PB.field_numbers(::Type{CallableOptions}) = (;feed = 1, fetch = 2, target = 3, run_options = 4, tensor_connection = 5, feed_devices = 6, fetch_devices = 7, fetch_skip_sync = 8) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:CallableOptions}) + feed = PB.BufferedVector{String}() + fetch = PB.BufferedVector{String}() + target = PB.BufferedVector{String}() + run_options = Ref{Union{Nothing,RunOptions}}(nothing) + tensor_connection = PB.BufferedVector{TensorConnection}() + feed_devices = Dict{String,String}() + fetch_devices = Dict{String,String}() + fetch_skip_sync = false + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, feed) + elseif field_number == 2 + PB.decode!(d, fetch) + elseif field_number == 3 + PB.decode!(d, target) + elseif field_number == 4 + PB.decode!(d, run_options) + elseif field_number == 5 + PB.decode!(d, tensor_connection) + elseif field_number == 6 + PB.decode!(d, feed_devices) + elseif field_number == 7 + PB.decode!(d, fetch_devices) + elseif field_number == 8 + fetch_skip_sync = PB.decode(d, Bool) + else + PB.skip(d, wire_type) + end + end + return CallableOptions(feed[], fetch[], target[], run_options[], tensor_connection[], feed_devices, fetch_devices, fetch_skip_sync) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::CallableOptions) + initpos = position(e.io) + !isempty(x.feed) && PB.encode(e, 1, x.feed) + !isempty(x.fetch) && PB.encode(e, 2, x.fetch) + !isempty(x.target) && PB.encode(e, 3, x.target) + !isnothing(x.run_options) && PB.encode(e, 4, x.run_options) + !isempty(x.tensor_connection) && PB.encode(e, 5, x.tensor_connection) + !isempty(x.feed_devices) && PB.encode(e, 6, x.feed_devices) + !isempty(x.fetch_devices) && PB.encode(e, 7, x.fetch_devices) + x.fetch_skip_sync != false && PB.encode(e, 8, x.fetch_skip_sync) + return position(e.io) - initpos +end +function PB._encoded_size(x::CallableOptions) + encoded_size = 0 + !isempty(x.feed) && (encoded_size += PB._encoded_size(x.feed, 1)) + !isempty(x.fetch) && (encoded_size += PB._encoded_size(x.fetch, 2)) + !isempty(x.target) && (encoded_size += PB._encoded_size(x.target, 3)) + !isnothing(x.run_options) && (encoded_size += PB._encoded_size(x.run_options, 4)) + !isempty(x.tensor_connection) && (encoded_size += PB._encoded_size(x.tensor_connection, 5)) + !isempty(x.feed_devices) && (encoded_size += PB._encoded_size(x.feed_devices, 6)) + !isempty(x.fetch_devices) && (encoded_size += PB._encoded_size(x.fetch_devices, 7)) + x.fetch_skip_sync != false && (encoded_size += PB._encoded_size(x.fetch_skip_sync, 8)) + return encoded_size +end diff --git a/src/protojl/tensorboard/tensorboard/coordination_config_pb.jl b/src/protojl/tensorboard/tensorboard/coordination_config_pb.jl new file mode 100644 index 0000000..7bb49d0 --- /dev/null +++ b/src/protojl/tensorboard/tensorboard/coordination_config_pb.jl @@ -0,0 +1,129 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:24.223 +# original file: /home/lior/TensorBoardLogger.jl/gen/proto/tensorboard/compat/proto/coordination_config.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export CoordinatedJob, CoordinationServiceConfig + +struct CoordinatedJob + name::String + num_tasks::Int32 +end +PB.default_values(::Type{CoordinatedJob}) = (;name = "", num_tasks = zero(Int32)) +PB.field_numbers(::Type{CoordinatedJob}) = (;name = 1, num_tasks = 2) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:CoordinatedJob}) + name = "" + num_tasks = zero(Int32) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + name = PB.decode(d, String) + elseif field_number == 2 + num_tasks = PB.decode(d, Int32) + else + PB.skip(d, wire_type) + end + end + return CoordinatedJob(name, num_tasks) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::CoordinatedJob) + initpos = position(e.io) + !isempty(x.name) && PB.encode(e, 1, x.name) + x.num_tasks != zero(Int32) && PB.encode(e, 2, x.num_tasks) + return position(e.io) - initpos +end +function PB._encoded_size(x::CoordinatedJob) + encoded_size = 0 + !isempty(x.name) && (encoded_size += PB._encoded_size(x.name, 1)) + x.num_tasks != zero(Int32) && (encoded_size += PB._encoded_size(x.num_tasks, 2)) + return encoded_size +end + +struct CoordinationServiceConfig + service_type::String + service_leader::String + enable_health_check::Bool + cluster_register_timeout_in_ms::Int64 + heartbeat_timeout_in_ms::Int64 + coordinated_job_list::Vector{CoordinatedJob} + shutdown_barrier_timeout_in_ms::Int64 + agent_destruction_without_shutdown::Bool + recoverable_jobs::Vector{String} + allow_new_incarnation_to_reconnect::Bool +end +PB.reserved_fields(::Type{CoordinationServiceConfig}) = (names = String[], numbers = Union{Int,UnitRange{Int}}[6]) +PB.default_values(::Type{CoordinationServiceConfig}) = (;service_type = "", service_leader = "", enable_health_check = false, cluster_register_timeout_in_ms = zero(Int64), heartbeat_timeout_in_ms = zero(Int64), coordinated_job_list = Vector{CoordinatedJob}(), shutdown_barrier_timeout_in_ms = zero(Int64), agent_destruction_without_shutdown = false, recoverable_jobs = Vector{String}(), allow_new_incarnation_to_reconnect = false) +PB.field_numbers(::Type{CoordinationServiceConfig}) = (;service_type = 1, service_leader = 2, enable_health_check = 3, cluster_register_timeout_in_ms = 4, heartbeat_timeout_in_ms = 5, coordinated_job_list = 10, shutdown_barrier_timeout_in_ms = 7, agent_destruction_without_shutdown = 8, recoverable_jobs = 9, allow_new_incarnation_to_reconnect = 11) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:CoordinationServiceConfig}) + service_type = "" + service_leader = "" + enable_health_check = false + cluster_register_timeout_in_ms = zero(Int64) + heartbeat_timeout_in_ms = zero(Int64) + coordinated_job_list = PB.BufferedVector{CoordinatedJob}() + shutdown_barrier_timeout_in_ms = zero(Int64) + agent_destruction_without_shutdown = false + recoverable_jobs = PB.BufferedVector{String}() + allow_new_incarnation_to_reconnect = false + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + service_type = PB.decode(d, String) + elseif field_number == 2 + service_leader = PB.decode(d, String) + elseif field_number == 3 + enable_health_check = PB.decode(d, Bool) + elseif field_number == 4 + cluster_register_timeout_in_ms = PB.decode(d, Int64) + elseif field_number == 5 + heartbeat_timeout_in_ms = PB.decode(d, Int64) + elseif field_number == 10 + PB.decode!(d, coordinated_job_list) + elseif field_number == 7 + shutdown_barrier_timeout_in_ms = PB.decode(d, Int64) + elseif field_number == 8 + agent_destruction_without_shutdown = PB.decode(d, Bool) + elseif field_number == 9 + PB.decode!(d, recoverable_jobs) + elseif field_number == 11 + allow_new_incarnation_to_reconnect = PB.decode(d, Bool) + else + PB.skip(d, wire_type) + end + end + return CoordinationServiceConfig(service_type, service_leader, enable_health_check, cluster_register_timeout_in_ms, heartbeat_timeout_in_ms, coordinated_job_list[], shutdown_barrier_timeout_in_ms, agent_destruction_without_shutdown, recoverable_jobs[], allow_new_incarnation_to_reconnect) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::CoordinationServiceConfig) + initpos = position(e.io) + !isempty(x.service_type) && PB.encode(e, 1, x.service_type) + !isempty(x.service_leader) && PB.encode(e, 2, x.service_leader) + x.enable_health_check != false && PB.encode(e, 3, x.enable_health_check) + x.cluster_register_timeout_in_ms != zero(Int64) && PB.encode(e, 4, x.cluster_register_timeout_in_ms) + x.heartbeat_timeout_in_ms != zero(Int64) && PB.encode(e, 5, x.heartbeat_timeout_in_ms) + !isempty(x.coordinated_job_list) && PB.encode(e, 10, x.coordinated_job_list) + x.shutdown_barrier_timeout_in_ms != zero(Int64) && PB.encode(e, 7, x.shutdown_barrier_timeout_in_ms) + x.agent_destruction_without_shutdown != false && PB.encode(e, 8, x.agent_destruction_without_shutdown) + !isempty(x.recoverable_jobs) && PB.encode(e, 9, x.recoverable_jobs) + x.allow_new_incarnation_to_reconnect != false && PB.encode(e, 11, x.allow_new_incarnation_to_reconnect) + return position(e.io) - initpos +end +function PB._encoded_size(x::CoordinationServiceConfig) + encoded_size = 0 + !isempty(x.service_type) && (encoded_size += PB._encoded_size(x.service_type, 1)) + !isempty(x.service_leader) && (encoded_size += PB._encoded_size(x.service_leader, 2)) + x.enable_health_check != false && (encoded_size += PB._encoded_size(x.enable_health_check, 3)) + x.cluster_register_timeout_in_ms != zero(Int64) && (encoded_size += PB._encoded_size(x.cluster_register_timeout_in_ms, 4)) + x.heartbeat_timeout_in_ms != zero(Int64) && (encoded_size += PB._encoded_size(x.heartbeat_timeout_in_ms, 5)) + !isempty(x.coordinated_job_list) && (encoded_size += PB._encoded_size(x.coordinated_job_list, 10)) + x.shutdown_barrier_timeout_in_ms != zero(Int64) && (encoded_size += PB._encoded_size(x.shutdown_barrier_timeout_in_ms, 7)) + x.agent_destruction_without_shutdown != false && (encoded_size += PB._encoded_size(x.agent_destruction_without_shutdown, 8)) + !isempty(x.recoverable_jobs) && (encoded_size += PB._encoded_size(x.recoverable_jobs, 9)) + x.allow_new_incarnation_to_reconnect != false && (encoded_size += PB._encoded_size(x.allow_new_incarnation_to_reconnect, 11)) + return encoded_size +end diff --git a/src/protojl/tensorboard/tensorboard/cost_graph_pb.jl b/src/protojl/tensorboard/tensorboard/cost_graph_pb.jl new file mode 100644 index 0000000..aac5f09 --- /dev/null +++ b/src/protojl/tensorboard/tensorboard/cost_graph_pb.jl @@ -0,0 +1,285 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:24.424 +# original file: /home/lior/TensorBoardLogger.jl/gen/proto/tensorboard/compat/proto/cost_graph.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export var"CostGraphDef.Node.InputInfo", var"CostGraphDef.AggregatedCost" +export var"CostGraphDef.Node.OutputInfo", var"CostGraphDef.Node", CostGraphDef + +struct var"CostGraphDef.Node.InputInfo" + preceding_node::Int32 + preceding_port::Int32 +end +PB.default_values(::Type{var"CostGraphDef.Node.InputInfo"}) = (;preceding_node = zero(Int32), preceding_port = zero(Int32)) +PB.field_numbers(::Type{var"CostGraphDef.Node.InputInfo"}) = (;preceding_node = 1, preceding_port = 2) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"CostGraphDef.Node.InputInfo"}) + preceding_node = zero(Int32) + preceding_port = zero(Int32) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + preceding_node = PB.decode(d, Int32) + elseif field_number == 2 + preceding_port = PB.decode(d, Int32) + else + PB.skip(d, wire_type) + end + end + return var"CostGraphDef.Node.InputInfo"(preceding_node, preceding_port) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"CostGraphDef.Node.InputInfo") + initpos = position(e.io) + x.preceding_node != zero(Int32) && PB.encode(e, 1, x.preceding_node) + x.preceding_port != zero(Int32) && PB.encode(e, 2, x.preceding_port) + return position(e.io) - initpos +end +function PB._encoded_size(x::var"CostGraphDef.Node.InputInfo") + encoded_size = 0 + x.preceding_node != zero(Int32) && (encoded_size += PB._encoded_size(x.preceding_node, 1)) + x.preceding_port != zero(Int32) && (encoded_size += PB._encoded_size(x.preceding_port, 2)) + return encoded_size +end + +struct var"CostGraphDef.AggregatedCost" + cost::Float32 + dimension::String +end +PB.default_values(::Type{var"CostGraphDef.AggregatedCost"}) = (;cost = zero(Float32), dimension = "") +PB.field_numbers(::Type{var"CostGraphDef.AggregatedCost"}) = (;cost = 1, dimension = 2) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"CostGraphDef.AggregatedCost"}) + cost = zero(Float32) + dimension = "" + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + cost = PB.decode(d, Float32) + elseif field_number == 2 + dimension = PB.decode(d, String) + else + PB.skip(d, wire_type) + end + end + return var"CostGraphDef.AggregatedCost"(cost, dimension) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"CostGraphDef.AggregatedCost") + initpos = position(e.io) + x.cost != zero(Float32) && PB.encode(e, 1, x.cost) + !isempty(x.dimension) && PB.encode(e, 2, x.dimension) + return position(e.io) - initpos +end +function PB._encoded_size(x::var"CostGraphDef.AggregatedCost") + encoded_size = 0 + x.cost != zero(Float32) && (encoded_size += PB._encoded_size(x.cost, 1)) + !isempty(x.dimension) && (encoded_size += PB._encoded_size(x.dimension, 2)) + return encoded_size +end + +struct var"CostGraphDef.Node.OutputInfo" + size::Int64 + alias_input_port::Int64 + shape::Union{Nothing,TensorShapeProto} + dtype::var"#DataType".T +end +PB.default_values(::Type{var"CostGraphDef.Node.OutputInfo"}) = (;size = zero(Int64), alias_input_port = zero(Int64), shape = nothing, dtype = var"#DataType".DT_INVALID) +PB.field_numbers(::Type{var"CostGraphDef.Node.OutputInfo"}) = (;size = 1, alias_input_port = 2, shape = 3, dtype = 4) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"CostGraphDef.Node.OutputInfo"}) + size = zero(Int64) + alias_input_port = zero(Int64) + shape = Ref{Union{Nothing,TensorShapeProto}}(nothing) + dtype = var"#DataType".DT_INVALID + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + size = PB.decode(d, Int64) + elseif field_number == 2 + alias_input_port = PB.decode(d, Int64) + elseif field_number == 3 + PB.decode!(d, shape) + elseif field_number == 4 + dtype = PB.decode(d, var"#DataType".T) + else + PB.skip(d, wire_type) + end + end + return var"CostGraphDef.Node.OutputInfo"(size, alias_input_port, shape[], dtype) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"CostGraphDef.Node.OutputInfo") + initpos = position(e.io) + x.size != zero(Int64) && PB.encode(e, 1, x.size) + x.alias_input_port != zero(Int64) && PB.encode(e, 2, x.alias_input_port) + !isnothing(x.shape) && PB.encode(e, 3, x.shape) + x.dtype != var"#DataType".DT_INVALID && PB.encode(e, 4, x.dtype) + return position(e.io) - initpos +end +function PB._encoded_size(x::var"CostGraphDef.Node.OutputInfo") + encoded_size = 0 + x.size != zero(Int64) && (encoded_size += PB._encoded_size(x.size, 1)) + x.alias_input_port != zero(Int64) && (encoded_size += PB._encoded_size(x.alias_input_port, 2)) + !isnothing(x.shape) && (encoded_size += PB._encoded_size(x.shape, 3)) + x.dtype != var"#DataType".DT_INVALID && (encoded_size += PB._encoded_size(x.dtype, 4)) + return encoded_size +end + +struct var"CostGraphDef.Node" + name::String + device::String + id::Int32 + input_info::Vector{var"CostGraphDef.Node.InputInfo"} + output_info::Vector{var"CostGraphDef.Node.OutputInfo"} + temporary_memory_size::Int64 + persistent_memory_size::Int64 + host_temp_memory_size::Int64 + device_temp_memory_size::Int64 + device_persistent_memory_size::Int64 + compute_cost::Int64 + compute_time::Int64 + memory_time::Int64 + is_final::Bool + control_input::Vector{Int32} + inaccurate::Bool +end +PB.default_values(::Type{var"CostGraphDef.Node"}) = (;name = "", device = "", id = zero(Int32), input_info = Vector{var"CostGraphDef.Node.InputInfo"}(), output_info = Vector{var"CostGraphDef.Node.OutputInfo"}(), temporary_memory_size = zero(Int64), persistent_memory_size = zero(Int64), host_temp_memory_size = zero(Int64), device_temp_memory_size = zero(Int64), device_persistent_memory_size = zero(Int64), compute_cost = zero(Int64), compute_time = zero(Int64), memory_time = zero(Int64), is_final = false, control_input = Vector{Int32}(), inaccurate = false) +PB.field_numbers(::Type{var"CostGraphDef.Node"}) = (;name = 1, device = 2, id = 3, input_info = 4, output_info = 5, temporary_memory_size = 6, persistent_memory_size = 12, host_temp_memory_size = 10, device_temp_memory_size = 11, device_persistent_memory_size = 16, compute_cost = 9, compute_time = 14, memory_time = 15, is_final = 7, control_input = 8, inaccurate = 17) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"CostGraphDef.Node"}) + name = "" + device = "" + id = zero(Int32) + input_info = PB.BufferedVector{var"CostGraphDef.Node.InputInfo"}() + output_info = PB.BufferedVector{var"CostGraphDef.Node.OutputInfo"}() + temporary_memory_size = zero(Int64) + persistent_memory_size = zero(Int64) + host_temp_memory_size = zero(Int64) + device_temp_memory_size = zero(Int64) + device_persistent_memory_size = zero(Int64) + compute_cost = zero(Int64) + compute_time = zero(Int64) + memory_time = zero(Int64) + is_final = false + control_input = PB.BufferedVector{Int32}() + inaccurate = false + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + name = PB.decode(d, String) + elseif field_number == 2 + device = PB.decode(d, String) + elseif field_number == 3 + id = PB.decode(d, Int32) + elseif field_number == 4 + PB.decode!(d, input_info) + elseif field_number == 5 + PB.decode!(d, output_info) + elseif field_number == 6 + temporary_memory_size = PB.decode(d, Int64) + elseif field_number == 12 + persistent_memory_size = PB.decode(d, Int64) + elseif field_number == 10 + host_temp_memory_size = PB.decode(d, Int64) + elseif field_number == 11 + device_temp_memory_size = PB.decode(d, Int64) + elseif field_number == 16 + device_persistent_memory_size = PB.decode(d, Int64) + elseif field_number == 9 + compute_cost = PB.decode(d, Int64) + elseif field_number == 14 + compute_time = PB.decode(d, Int64) + elseif field_number == 15 + memory_time = PB.decode(d, Int64) + elseif field_number == 7 + is_final = PB.decode(d, Bool) + elseif field_number == 8 + PB.decode!(d, wire_type, control_input) + elseif field_number == 17 + inaccurate = PB.decode(d, Bool) + else + PB.skip(d, wire_type) + end + end + return var"CostGraphDef.Node"(name, device, id, input_info[], output_info[], temporary_memory_size, persistent_memory_size, host_temp_memory_size, device_temp_memory_size, device_persistent_memory_size, compute_cost, compute_time, memory_time, is_final, control_input[], inaccurate) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"CostGraphDef.Node") + initpos = position(e.io) + !isempty(x.name) && PB.encode(e, 1, x.name) + !isempty(x.device) && PB.encode(e, 2, x.device) + x.id != zero(Int32) && PB.encode(e, 3, x.id) + !isempty(x.input_info) && PB.encode(e, 4, x.input_info) + !isempty(x.output_info) && PB.encode(e, 5, x.output_info) + x.temporary_memory_size != zero(Int64) && PB.encode(e, 6, x.temporary_memory_size) + x.persistent_memory_size != zero(Int64) && PB.encode(e, 12, x.persistent_memory_size) + x.host_temp_memory_size != zero(Int64) && PB.encode(e, 10, x.host_temp_memory_size) + x.device_temp_memory_size != zero(Int64) && PB.encode(e, 11, x.device_temp_memory_size) + x.device_persistent_memory_size != zero(Int64) && PB.encode(e, 16, x.device_persistent_memory_size) + x.compute_cost != zero(Int64) && PB.encode(e, 9, x.compute_cost) + x.compute_time != zero(Int64) && PB.encode(e, 14, x.compute_time) + x.memory_time != zero(Int64) && PB.encode(e, 15, x.memory_time) + x.is_final != false && PB.encode(e, 7, x.is_final) + !isempty(x.control_input) && PB.encode(e, 8, x.control_input) + x.inaccurate != false && PB.encode(e, 17, x.inaccurate) + return position(e.io) - initpos +end +function PB._encoded_size(x::var"CostGraphDef.Node") + encoded_size = 0 + !isempty(x.name) && (encoded_size += PB._encoded_size(x.name, 1)) + !isempty(x.device) && (encoded_size += PB._encoded_size(x.device, 2)) + x.id != zero(Int32) && (encoded_size += PB._encoded_size(x.id, 3)) + !isempty(x.input_info) && (encoded_size += PB._encoded_size(x.input_info, 4)) + !isempty(x.output_info) && (encoded_size += PB._encoded_size(x.output_info, 5)) + x.temporary_memory_size != zero(Int64) && (encoded_size += PB._encoded_size(x.temporary_memory_size, 6)) + x.persistent_memory_size != zero(Int64) && (encoded_size += PB._encoded_size(x.persistent_memory_size, 12)) + x.host_temp_memory_size != zero(Int64) && (encoded_size += PB._encoded_size(x.host_temp_memory_size, 10)) + x.device_temp_memory_size != zero(Int64) && (encoded_size += PB._encoded_size(x.device_temp_memory_size, 11)) + x.device_persistent_memory_size != zero(Int64) && (encoded_size += PB._encoded_size(x.device_persistent_memory_size, 16)) + x.compute_cost != zero(Int64) && (encoded_size += PB._encoded_size(x.compute_cost, 9)) + x.compute_time != zero(Int64) && (encoded_size += PB._encoded_size(x.compute_time, 14)) + x.memory_time != zero(Int64) && (encoded_size += PB._encoded_size(x.memory_time, 15)) + x.is_final != false && (encoded_size += PB._encoded_size(x.is_final, 7)) + !isempty(x.control_input) && (encoded_size += PB._encoded_size(x.control_input, 8)) + x.inaccurate != false && (encoded_size += PB._encoded_size(x.inaccurate, 17)) + return encoded_size +end + +struct CostGraphDef + node::Vector{var"CostGraphDef.Node"} + cost::Vector{var"CostGraphDef.AggregatedCost"} +end +PB.default_values(::Type{CostGraphDef}) = (;node = Vector{var"CostGraphDef.Node"}(), cost = Vector{var"CostGraphDef.AggregatedCost"}()) +PB.field_numbers(::Type{CostGraphDef}) = (;node = 1, cost = 2) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:CostGraphDef}) + node = PB.BufferedVector{var"CostGraphDef.Node"}() + cost = PB.BufferedVector{var"CostGraphDef.AggregatedCost"}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, node) + elseif field_number == 2 + PB.decode!(d, cost) + else + PB.skip(d, wire_type) + end + end + return CostGraphDef(node[], cost[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::CostGraphDef) + initpos = position(e.io) + !isempty(x.node) && PB.encode(e, 1, x.node) + !isempty(x.cost) && PB.encode(e, 2, x.cost) + return position(e.io) - initpos +end +function PB._encoded_size(x::CostGraphDef) + encoded_size = 0 + !isempty(x.node) && (encoded_size += PB._encoded_size(x.node, 1)) + !isempty(x.cost) && (encoded_size += PB._encoded_size(x.cost, 2)) + return encoded_size +end diff --git a/src/protojl/tensorboard/tensorboard/cpp_shape_inference_pb.jl b/src/protojl/tensorboard/tensorboard/cpp_shape_inference_pb.jl new file mode 100644 index 0000000..e0e4fed --- /dev/null +++ b/src/protojl/tensorboard/tensorboard/cpp_shape_inference_pb.jl @@ -0,0 +1,161 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:24.424 +# original file: /home/lior/TensorBoardLogger.jl/gen/proto/tensorboard/compat/proto/cpp_shape_inference.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export CppShapeInferenceInputsNeeded, var"CppShapeInferenceResult.HandleShapeAndType" +export var"CppShapeInferenceResult.HandleData", CppShapeInferenceResult + +struct CppShapeInferenceInputsNeeded + input_tensors_needed::Vector{Int32} + input_tensors_as_shapes_needed::Vector{Int32} +end +PB.default_values(::Type{CppShapeInferenceInputsNeeded}) = (;input_tensors_needed = Vector{Int32}(), input_tensors_as_shapes_needed = Vector{Int32}()) +PB.field_numbers(::Type{CppShapeInferenceInputsNeeded}) = (;input_tensors_needed = 1, input_tensors_as_shapes_needed = 2) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:CppShapeInferenceInputsNeeded}) + input_tensors_needed = PB.BufferedVector{Int32}() + input_tensors_as_shapes_needed = PB.BufferedVector{Int32}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, wire_type, input_tensors_needed) + elseif field_number == 2 + PB.decode!(d, wire_type, input_tensors_as_shapes_needed) + else + PB.skip(d, wire_type) + end + end + return CppShapeInferenceInputsNeeded(input_tensors_needed[], input_tensors_as_shapes_needed[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::CppShapeInferenceInputsNeeded) + initpos = position(e.io) + !isempty(x.input_tensors_needed) && PB.encode(e, 1, x.input_tensors_needed) + !isempty(x.input_tensors_as_shapes_needed) && PB.encode(e, 2, x.input_tensors_as_shapes_needed) + return position(e.io) - initpos +end +function PB._encoded_size(x::CppShapeInferenceInputsNeeded) + encoded_size = 0 + !isempty(x.input_tensors_needed) && (encoded_size += PB._encoded_size(x.input_tensors_needed, 1)) + !isempty(x.input_tensors_as_shapes_needed) && (encoded_size += PB._encoded_size(x.input_tensors_as_shapes_needed, 2)) + return encoded_size +end + +struct var"CppShapeInferenceResult.HandleShapeAndType" + shape::Union{Nothing,TensorShapeProto} + dtype::var"#DataType".T + var"#type"::Union{Nothing,FullTypeDef} +end +PB.reserved_fields(::Type{var"CppShapeInferenceResult.HandleShapeAndType"}) = (names = String[], numbers = Union{Int,UnitRange{Int}}[3]) +PB.default_values(::Type{var"CppShapeInferenceResult.HandleShapeAndType"}) = (;shape = nothing, dtype = var"#DataType".DT_INVALID, var"#type" = nothing) +PB.field_numbers(::Type{var"CppShapeInferenceResult.HandleShapeAndType"}) = (;shape = 1, dtype = 2, var"#type" = 4) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"CppShapeInferenceResult.HandleShapeAndType"}) + shape = Ref{Union{Nothing,TensorShapeProto}}(nothing) + dtype = var"#DataType".DT_INVALID + var"#type" = Ref{Union{Nothing,FullTypeDef}}(nothing) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, shape) + elseif field_number == 2 + dtype = PB.decode(d, var"#DataType".T) + elseif field_number == 4 + PB.decode!(d, var"#type") + else + PB.skip(d, wire_type) + end + end + return var"CppShapeInferenceResult.HandleShapeAndType"(shape[], dtype, var"#type"[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"CppShapeInferenceResult.HandleShapeAndType") + initpos = position(e.io) + !isnothing(x.shape) && PB.encode(e, 1, x.shape) + x.dtype != var"#DataType".DT_INVALID && PB.encode(e, 2, x.dtype) + !isnothing(x.var"#type") && PB.encode(e, 4, x.var"#type") + return position(e.io) - initpos +end +function PB._encoded_size(x::var"CppShapeInferenceResult.HandleShapeAndType") + encoded_size = 0 + !isnothing(x.shape) && (encoded_size += PB._encoded_size(x.shape, 1)) + x.dtype != var"#DataType".DT_INVALID && (encoded_size += PB._encoded_size(x.dtype, 2)) + !isnothing(x.var"#type") && (encoded_size += PB._encoded_size(x.var"#type", 4)) + return encoded_size +end + +struct var"CppShapeInferenceResult.HandleData" + is_set::Bool + shape_and_type::Vector{var"CppShapeInferenceResult.HandleShapeAndType"} +end +PB.default_values(::Type{var"CppShapeInferenceResult.HandleData"}) = (;is_set = false, shape_and_type = Vector{var"CppShapeInferenceResult.HandleShapeAndType"}()) +PB.field_numbers(::Type{var"CppShapeInferenceResult.HandleData"}) = (;is_set = 1, shape_and_type = 2) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"CppShapeInferenceResult.HandleData"}) + is_set = false + shape_and_type = PB.BufferedVector{var"CppShapeInferenceResult.HandleShapeAndType"}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + is_set = PB.decode(d, Bool) + elseif field_number == 2 + PB.decode!(d, shape_and_type) + else + PB.skip(d, wire_type) + end + end + return var"CppShapeInferenceResult.HandleData"(is_set, shape_and_type[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"CppShapeInferenceResult.HandleData") + initpos = position(e.io) + x.is_set != false && PB.encode(e, 1, x.is_set) + !isempty(x.shape_and_type) && PB.encode(e, 2, x.shape_and_type) + return position(e.io) - initpos +end +function PB._encoded_size(x::var"CppShapeInferenceResult.HandleData") + encoded_size = 0 + x.is_set != false && (encoded_size += PB._encoded_size(x.is_set, 1)) + !isempty(x.shape_and_type) && (encoded_size += PB._encoded_size(x.shape_and_type, 2)) + return encoded_size +end + +struct CppShapeInferenceResult + shape::Union{Nothing,TensorShapeProto} + handle_data::Union{Nothing,var"CppShapeInferenceResult.HandleData"} +end +PB.reserved_fields(::Type{CppShapeInferenceResult}) = (names = String[], numbers = Union{Int,UnitRange{Int}}[2, 3]) +PB.default_values(::Type{CppShapeInferenceResult}) = (;shape = nothing, handle_data = nothing) +PB.field_numbers(::Type{CppShapeInferenceResult}) = (;shape = 1, handle_data = 4) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:CppShapeInferenceResult}) + shape = Ref{Union{Nothing,TensorShapeProto}}(nothing) + handle_data = Ref{Union{Nothing,var"CppShapeInferenceResult.HandleData"}}(nothing) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, shape) + elseif field_number == 4 + PB.decode!(d, handle_data) + else + PB.skip(d, wire_type) + end + end + return CppShapeInferenceResult(shape[], handle_data[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::CppShapeInferenceResult) + initpos = position(e.io) + !isnothing(x.shape) && PB.encode(e, 1, x.shape) + !isnothing(x.handle_data) && PB.encode(e, 4, x.handle_data) + return position(e.io) - initpos +end +function PB._encoded_size(x::CppShapeInferenceResult) + encoded_size = 0 + !isnothing(x.shape) && (encoded_size += PB._encoded_size(x.shape, 1)) + !isnothing(x.handle_data) && (encoded_size += PB._encoded_size(x.handle_data, 4)) + return encoded_size +end diff --git a/src/protojl/tensorboard/tensorboard/debug_pb.jl b/src/protojl/tensorboard/tensorboard/debug_pb.jl new file mode 100644 index 0000000..2a758e9 --- /dev/null +++ b/src/protojl/tensorboard/tensorboard/debug_pb.jl @@ -0,0 +1,188 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:24.223 +# original file: /home/lior/TensorBoardLogger.jl/gen/proto/tensorboard/compat/proto/debug.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export DebuggedSourceFile, DebugTensorWatch, DebuggedSourceFiles, DebugOptions + +struct DebuggedSourceFile + host::String + file_path::String + last_modified::Int64 + bytes::Int64 + lines::Vector{String} +end +PB.default_values(::Type{DebuggedSourceFile}) = (;host = "", file_path = "", last_modified = zero(Int64), bytes = zero(Int64), lines = Vector{String}()) +PB.field_numbers(::Type{DebuggedSourceFile}) = (;host = 1, file_path = 2, last_modified = 3, bytes = 4, lines = 5) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:DebuggedSourceFile}) + host = "" + file_path = "" + last_modified = zero(Int64) + bytes = zero(Int64) + lines = PB.BufferedVector{String}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + host = PB.decode(d, String) + elseif field_number == 2 + file_path = PB.decode(d, String) + elseif field_number == 3 + last_modified = PB.decode(d, Int64) + elseif field_number == 4 + bytes = PB.decode(d, Int64) + elseif field_number == 5 + PB.decode!(d, lines) + else + PB.skip(d, wire_type) + end + end + return DebuggedSourceFile(host, file_path, last_modified, bytes, lines[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::DebuggedSourceFile) + initpos = position(e.io) + !isempty(x.host) && PB.encode(e, 1, x.host) + !isempty(x.file_path) && PB.encode(e, 2, x.file_path) + x.last_modified != zero(Int64) && PB.encode(e, 3, x.last_modified) + x.bytes != zero(Int64) && PB.encode(e, 4, x.bytes) + !isempty(x.lines) && PB.encode(e, 5, x.lines) + return position(e.io) - initpos +end +function PB._encoded_size(x::DebuggedSourceFile) + encoded_size = 0 + !isempty(x.host) && (encoded_size += PB._encoded_size(x.host, 1)) + !isempty(x.file_path) && (encoded_size += PB._encoded_size(x.file_path, 2)) + x.last_modified != zero(Int64) && (encoded_size += PB._encoded_size(x.last_modified, 3)) + x.bytes != zero(Int64) && (encoded_size += PB._encoded_size(x.bytes, 4)) + !isempty(x.lines) && (encoded_size += PB._encoded_size(x.lines, 5)) + return encoded_size +end + +struct DebugTensorWatch + node_name::String + output_slot::Int32 + debug_ops::Vector{String} + debug_urls::Vector{String} + tolerate_debug_op_creation_failures::Bool +end +PB.default_values(::Type{DebugTensorWatch}) = (;node_name = "", output_slot = zero(Int32), debug_ops = Vector{String}(), debug_urls = Vector{String}(), tolerate_debug_op_creation_failures = false) +PB.field_numbers(::Type{DebugTensorWatch}) = (;node_name = 1, output_slot = 2, debug_ops = 3, debug_urls = 4, tolerate_debug_op_creation_failures = 5) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:DebugTensorWatch}) + node_name = "" + output_slot = zero(Int32) + debug_ops = PB.BufferedVector{String}() + debug_urls = PB.BufferedVector{String}() + tolerate_debug_op_creation_failures = false + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + node_name = PB.decode(d, String) + elseif field_number == 2 + output_slot = PB.decode(d, Int32) + elseif field_number == 3 + PB.decode!(d, debug_ops) + elseif field_number == 4 + PB.decode!(d, debug_urls) + elseif field_number == 5 + tolerate_debug_op_creation_failures = PB.decode(d, Bool) + else + PB.skip(d, wire_type) + end + end + return DebugTensorWatch(node_name, output_slot, debug_ops[], debug_urls[], tolerate_debug_op_creation_failures) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::DebugTensorWatch) + initpos = position(e.io) + !isempty(x.node_name) && PB.encode(e, 1, x.node_name) + x.output_slot != zero(Int32) && PB.encode(e, 2, x.output_slot) + !isempty(x.debug_ops) && PB.encode(e, 3, x.debug_ops) + !isempty(x.debug_urls) && PB.encode(e, 4, x.debug_urls) + x.tolerate_debug_op_creation_failures != false && PB.encode(e, 5, x.tolerate_debug_op_creation_failures) + return position(e.io) - initpos +end +function PB._encoded_size(x::DebugTensorWatch) + encoded_size = 0 + !isempty(x.node_name) && (encoded_size += PB._encoded_size(x.node_name, 1)) + x.output_slot != zero(Int32) && (encoded_size += PB._encoded_size(x.output_slot, 2)) + !isempty(x.debug_ops) && (encoded_size += PB._encoded_size(x.debug_ops, 3)) + !isempty(x.debug_urls) && (encoded_size += PB._encoded_size(x.debug_urls, 4)) + x.tolerate_debug_op_creation_failures != false && (encoded_size += PB._encoded_size(x.tolerate_debug_op_creation_failures, 5)) + return encoded_size +end + +struct DebuggedSourceFiles + source_files::Vector{DebuggedSourceFile} +end +PB.default_values(::Type{DebuggedSourceFiles}) = (;source_files = Vector{DebuggedSourceFile}()) +PB.field_numbers(::Type{DebuggedSourceFiles}) = (;source_files = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:DebuggedSourceFiles}) + source_files = PB.BufferedVector{DebuggedSourceFile}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, source_files) + else + PB.skip(d, wire_type) + end + end + return DebuggedSourceFiles(source_files[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::DebuggedSourceFiles) + initpos = position(e.io) + !isempty(x.source_files) && PB.encode(e, 1, x.source_files) + return position(e.io) - initpos +end +function PB._encoded_size(x::DebuggedSourceFiles) + encoded_size = 0 + !isempty(x.source_files) && (encoded_size += PB._encoded_size(x.source_files, 1)) + return encoded_size +end + +struct DebugOptions + debug_tensor_watch_opts::Vector{DebugTensorWatch} + global_step::Int64 + reset_disk_byte_usage::Bool +end +PB.default_values(::Type{DebugOptions}) = (;debug_tensor_watch_opts = Vector{DebugTensorWatch}(), global_step = zero(Int64), reset_disk_byte_usage = false) +PB.field_numbers(::Type{DebugOptions}) = (;debug_tensor_watch_opts = 4, global_step = 10, reset_disk_byte_usage = 11) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:DebugOptions}) + debug_tensor_watch_opts = PB.BufferedVector{DebugTensorWatch}() + global_step = zero(Int64) + reset_disk_byte_usage = false + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 4 + PB.decode!(d, debug_tensor_watch_opts) + elseif field_number == 10 + global_step = PB.decode(d, Int64) + elseif field_number == 11 + reset_disk_byte_usage = PB.decode(d, Bool) + else + PB.skip(d, wire_type) + end + end + return DebugOptions(debug_tensor_watch_opts[], global_step, reset_disk_byte_usage) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::DebugOptions) + initpos = position(e.io) + !isempty(x.debug_tensor_watch_opts) && PB.encode(e, 4, x.debug_tensor_watch_opts) + x.global_step != zero(Int64) && PB.encode(e, 10, x.global_step) + x.reset_disk_byte_usage != false && PB.encode(e, 11, x.reset_disk_byte_usage) + return position(e.io) - initpos +end +function PB._encoded_size(x::DebugOptions) + encoded_size = 0 + !isempty(x.debug_tensor_watch_opts) && (encoded_size += PB._encoded_size(x.debug_tensor_watch_opts, 4)) + x.global_step != zero(Int64) && (encoded_size += PB._encoded_size(x.global_step, 10)) + x.reset_disk_byte_usage != false && (encoded_size += PB._encoded_size(x.reset_disk_byte_usage, 11)) + return encoded_size +end diff --git a/src/protojl/tensorboard/tensorboard/event_pb.jl b/src/protojl/tensorboard/tensorboard/event_pb.jl new file mode 100644 index 0000000..88df3b1 --- /dev/null +++ b/src/protojl/tensorboard/tensorboard/event_pb.jl @@ -0,0 +1,401 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:24.777 +# original file: /home/lior/TensorBoardLogger.jl/gen/proto/tensorboard/compat/proto/event.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export var"SessionLog.SessionStatus", WorkerHealth, WatchdogConfig, RequestedExitCode +export SourceMetadata, WorkerShutdownMode, TaggedRunMetadata, var"LogMessage.Level" +export SessionLog, WorkerHeartbeatRequest, LogMessage, Event, WorkerHeartbeatResponse + +@enumx var"SessionLog.SessionStatus" STATUS_UNSPECIFIED=0 START=1 STOP=2 CHECKPOINT=3 + +@enumx WorkerHealth OK=0 RECEIVED_SHUTDOWN_SIGNAL=1 INTERNAL_ERROR=2 SHUTTING_DOWN=3 + +struct WatchdogConfig + timeout_ms::Int64 +end +PB.default_values(::Type{WatchdogConfig}) = (;timeout_ms = zero(Int64)) +PB.field_numbers(::Type{WatchdogConfig}) = (;timeout_ms = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:WatchdogConfig}) + timeout_ms = zero(Int64) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + timeout_ms = PB.decode(d, Int64) + else + PB.skip(d, wire_type) + end + end + return WatchdogConfig(timeout_ms) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::WatchdogConfig) + initpos = position(e.io) + x.timeout_ms != zero(Int64) && PB.encode(e, 1, x.timeout_ms) + return position(e.io) - initpos +end +function PB._encoded_size(x::WatchdogConfig) + encoded_size = 0 + x.timeout_ms != zero(Int64) && (encoded_size += PB._encoded_size(x.timeout_ms, 1)) + return encoded_size +end + +struct RequestedExitCode + exit_code::Int32 +end +PB.default_values(::Type{RequestedExitCode}) = (;exit_code = zero(Int32)) +PB.field_numbers(::Type{RequestedExitCode}) = (;exit_code = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:RequestedExitCode}) + exit_code = zero(Int32) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + exit_code = PB.decode(d, Int32) + else + PB.skip(d, wire_type) + end + end + return RequestedExitCode(exit_code) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::RequestedExitCode) + initpos = position(e.io) + x.exit_code != zero(Int32) && PB.encode(e, 1, x.exit_code) + return position(e.io) - initpos +end +function PB._encoded_size(x::RequestedExitCode) + encoded_size = 0 + x.exit_code != zero(Int32) && (encoded_size += PB._encoded_size(x.exit_code, 1)) + return encoded_size +end + +struct SourceMetadata + writer::String +end +PB.default_values(::Type{SourceMetadata}) = (;writer = "") +PB.field_numbers(::Type{SourceMetadata}) = (;writer = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:SourceMetadata}) + writer = "" + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + writer = PB.decode(d, String) + else + PB.skip(d, wire_type) + end + end + return SourceMetadata(writer) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::SourceMetadata) + initpos = position(e.io) + !isempty(x.writer) && PB.encode(e, 1, x.writer) + return position(e.io) - initpos +end +function PB._encoded_size(x::SourceMetadata) + encoded_size = 0 + !isempty(x.writer) && (encoded_size += PB._encoded_size(x.writer, 1)) + return encoded_size +end + +@enumx WorkerShutdownMode DEFAULT=0 NOT_CONFIGURED=1 WAIT_FOR_COORDINATOR=2 SHUTDOWN_AFTER_TIMEOUT=3 + +struct TaggedRunMetadata + tag::String + run_metadata::Vector{UInt8} +end +PB.default_values(::Type{TaggedRunMetadata}) = (;tag = "", run_metadata = UInt8[]) +PB.field_numbers(::Type{TaggedRunMetadata}) = (;tag = 1, run_metadata = 2) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:TaggedRunMetadata}) + tag = "" + run_metadata = UInt8[] + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + tag = PB.decode(d, String) + elseif field_number == 2 + run_metadata = PB.decode(d, Vector{UInt8}) + else + PB.skip(d, wire_type) + end + end + return TaggedRunMetadata(tag, run_metadata) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::TaggedRunMetadata) + initpos = position(e.io) + !isempty(x.tag) && PB.encode(e, 1, x.tag) + !isempty(x.run_metadata) && PB.encode(e, 2, x.run_metadata) + return position(e.io) - initpos +end +function PB._encoded_size(x::TaggedRunMetadata) + encoded_size = 0 + !isempty(x.tag) && (encoded_size += PB._encoded_size(x.tag, 1)) + !isempty(x.run_metadata) && (encoded_size += PB._encoded_size(x.run_metadata, 2)) + return encoded_size +end + +@enumx var"LogMessage.Level" UNKNOWN=0 DEBUGGING=10 INFO=20 WARN=30 ERROR=40 FATAL=50 +Base.depwarn("`var\"LogMessage.Level\"` is deprecated.", ((Base.Core).Typeof(var"LogMessage.Level")).name.mt.name) + +struct SessionLog + status::var"SessionLog.SessionStatus".T + checkpoint_path::String + msg::String +end +PB.default_values(::Type{SessionLog}) = (;status = var"SessionLog.SessionStatus".STATUS_UNSPECIFIED, checkpoint_path = "", msg = "") +PB.field_numbers(::Type{SessionLog}) = (;status = 1, checkpoint_path = 2, msg = 3) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:SessionLog}) + status = var"SessionLog.SessionStatus".STATUS_UNSPECIFIED + checkpoint_path = "" + msg = "" + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + status = PB.decode(d, var"SessionLog.SessionStatus".T) + elseif field_number == 2 + checkpoint_path = PB.decode(d, String) + elseif field_number == 3 + msg = PB.decode(d, String) + else + PB.skip(d, wire_type) + end + end + return SessionLog(status, checkpoint_path, msg) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::SessionLog) + initpos = position(e.io) + x.status != var"SessionLog.SessionStatus".STATUS_UNSPECIFIED && PB.encode(e, 1, x.status) + !isempty(x.checkpoint_path) && PB.encode(e, 2, x.checkpoint_path) + !isempty(x.msg) && PB.encode(e, 3, x.msg) + return position(e.io) - initpos +end +function PB._encoded_size(x::SessionLog) + encoded_size = 0 + x.status != var"SessionLog.SessionStatus".STATUS_UNSPECIFIED && (encoded_size += PB._encoded_size(x.status, 1)) + !isempty(x.checkpoint_path) && (encoded_size += PB._encoded_size(x.checkpoint_path, 2)) + !isempty(x.msg) && (encoded_size += PB._encoded_size(x.msg, 3)) + return encoded_size +end + +struct WorkerHeartbeatRequest + shutdown_mode::WorkerShutdownMode.T + watchdog_config::Union{Nothing,WatchdogConfig} + exit_code::Union{Nothing,RequestedExitCode} +end +PB.default_values(::Type{WorkerHeartbeatRequest}) = (;shutdown_mode = WorkerShutdownMode.DEFAULT, watchdog_config = nothing, exit_code = nothing) +PB.field_numbers(::Type{WorkerHeartbeatRequest}) = (;shutdown_mode = 1, watchdog_config = 2, exit_code = 3) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:WorkerHeartbeatRequest}) + shutdown_mode = WorkerShutdownMode.DEFAULT + watchdog_config = Ref{Union{Nothing,WatchdogConfig}}(nothing) + exit_code = Ref{Union{Nothing,RequestedExitCode}}(nothing) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + shutdown_mode = PB.decode(d, WorkerShutdownMode.T) + elseif field_number == 2 + PB.decode!(d, watchdog_config) + elseif field_number == 3 + PB.decode!(d, exit_code) + else + PB.skip(d, wire_type) + end + end + return WorkerHeartbeatRequest(shutdown_mode, watchdog_config[], exit_code[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::WorkerHeartbeatRequest) + initpos = position(e.io) + x.shutdown_mode != WorkerShutdownMode.DEFAULT && PB.encode(e, 1, x.shutdown_mode) + !isnothing(x.watchdog_config) && PB.encode(e, 2, x.watchdog_config) + !isnothing(x.exit_code) && PB.encode(e, 3, x.exit_code) + return position(e.io) - initpos +end +function PB._encoded_size(x::WorkerHeartbeatRequest) + encoded_size = 0 + x.shutdown_mode != WorkerShutdownMode.DEFAULT && (encoded_size += PB._encoded_size(x.shutdown_mode, 1)) + !isnothing(x.watchdog_config) && (encoded_size += PB._encoded_size(x.watchdog_config, 2)) + !isnothing(x.exit_code) && (encoded_size += PB._encoded_size(x.exit_code, 3)) + return encoded_size +end + +struct LogMessage + level::var"LogMessage.Level".T + message::String +end +Base.depwarn("`LogMessage` is deprecated.", ((Base.Core).Typeof(LogMessage)).name.mt.name) +PB.default_values(::Type{LogMessage}) = (;level = var"LogMessage.Level".UNKNOWN, message = "") +PB.field_numbers(::Type{LogMessage}) = (;level = 1, message = 2) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:LogMessage}) + level = var"LogMessage.Level".UNKNOWN + message = "" + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + level = PB.decode(d, var"LogMessage.Level".T) + elseif field_number == 2 + message = PB.decode(d, String) + else + PB.skip(d, wire_type) + end + end + return LogMessage(level, message) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::LogMessage) + initpos = position(e.io) + x.level != var"LogMessage.Level".UNKNOWN && PB.encode(e, 1, x.level) + !isempty(x.message) && PB.encode(e, 2, x.message) + return position(e.io) - initpos +end +function PB._encoded_size(x::LogMessage) + encoded_size = 0 + x.level != var"LogMessage.Level".UNKNOWN && (encoded_size += PB._encoded_size(x.level, 1)) + !isempty(x.message) && (encoded_size += PB._encoded_size(x.message, 2)) + return encoded_size +end + +struct Event + wall_time::Float64 + step::Int64 + what::Union{Nothing,OneOf{<:Union{String,Vector{UInt8},Summary,LogMessage,SessionLog,TaggedRunMetadata}}} + source_metadata::Union{Nothing,SourceMetadata} +end +PB.oneof_field_types(::Type{Event}) = (; + what = (;file_version=String, graph_def=Vector{UInt8}, summary=Summary, log_message=LogMessage, session_log=SessionLog, tagged_run_metadata=TaggedRunMetadata, meta_graph_def=Vector{UInt8}), +) +PB.default_values(::Type{Event}) = (;wall_time = zero(Float64), step = zero(Int64), file_version = "", graph_def = UInt8[], summary = nothing, log_message = nothing, session_log = nothing, tagged_run_metadata = nothing, meta_graph_def = UInt8[], source_metadata = nothing) +PB.field_numbers(::Type{Event}) = (;wall_time = 1, step = 2, file_version = 3, graph_def = 4, summary = 5, log_message = 6, session_log = 7, tagged_run_metadata = 8, meta_graph_def = 9, source_metadata = 10) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:Event}) + wall_time = zero(Float64) + step = zero(Int64) + what = nothing + source_metadata = Ref{Union{Nothing,SourceMetadata}}(nothing) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + wall_time = PB.decode(d, Float64) + elseif field_number == 2 + step = PB.decode(d, Int64) + elseif field_number == 3 + what = OneOf(:file_version, PB.decode(d, String)) + elseif field_number == 4 + what = OneOf(:graph_def, PB.decode(d, Vector{UInt8})) + elseif field_number == 5 + what = OneOf(:summary, PB.decode(d, Ref{Summary})) + elseif field_number == 6 + what = OneOf(:log_message, PB.decode(d, Ref{LogMessage})) + elseif field_number == 7 + what = OneOf(:session_log, PB.decode(d, Ref{SessionLog})) + elseif field_number == 8 + what = OneOf(:tagged_run_metadata, PB.decode(d, Ref{TaggedRunMetadata})) + elseif field_number == 9 + what = OneOf(:meta_graph_def, PB.decode(d, Vector{UInt8})) + elseif field_number == 10 + PB.decode!(d, source_metadata) + else + PB.skip(d, wire_type) + end + end + return Event(wall_time, step, what, source_metadata[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::Event) + initpos = position(e.io) + x.wall_time != zero(Float64) && PB.encode(e, 1, x.wall_time) + x.step != zero(Int64) && PB.encode(e, 2, x.step) + if isnothing(x.what); + elseif x.what.name === :file_version + PB.encode(e, 3, x.what[]::String) + elseif x.what.name === :graph_def + PB.encode(e, 4, x.what[]::Vector{UInt8}) + elseif x.what.name === :summary + PB.encode(e, 5, x.what[]::Summary) + elseif x.what.name === :log_message + PB.encode(e, 6, x.what[]::LogMessage) + elseif x.what.name === :session_log + PB.encode(e, 7, x.what[]::SessionLog) + elseif x.what.name === :tagged_run_metadata + PB.encode(e, 8, x.what[]::TaggedRunMetadata) + elseif x.what.name === :meta_graph_def + PB.encode(e, 9, x.what[]::Vector{UInt8}) + end + !isnothing(x.source_metadata) && PB.encode(e, 10, x.source_metadata) + return position(e.io) - initpos +end +function PB._encoded_size(x::Event) + encoded_size = 0 + x.wall_time != zero(Float64) && (encoded_size += PB._encoded_size(x.wall_time, 1)) + x.step != zero(Int64) && (encoded_size += PB._encoded_size(x.step, 2)) + if isnothing(x.what); + elseif x.what.name === :file_version + encoded_size += PB._encoded_size(x.what[]::String, 3) + elseif x.what.name === :graph_def + encoded_size += PB._encoded_size(x.what[]::Vector{UInt8}, 4) + elseif x.what.name === :summary + encoded_size += PB._encoded_size(x.what[]::Summary, 5) + elseif x.what.name === :log_message + encoded_size += PB._encoded_size(x.what[]::LogMessage, 6) + elseif x.what.name === :session_log + encoded_size += PB._encoded_size(x.what[]::SessionLog, 7) + elseif x.what.name === :tagged_run_metadata + encoded_size += PB._encoded_size(x.what[]::TaggedRunMetadata, 8) + elseif x.what.name === :meta_graph_def + encoded_size += PB._encoded_size(x.what[]::Vector{UInt8}, 9) + end + !isnothing(x.source_metadata) && (encoded_size += PB._encoded_size(x.source_metadata, 10)) + return encoded_size +end + +struct WorkerHeartbeatResponse + health_status::WorkerHealth.T + worker_log::Vector{Event} + hostname::String +end +PB.default_values(::Type{WorkerHeartbeatResponse}) = (;health_status = WorkerHealth.OK, worker_log = Vector{Event}(), hostname = "") +PB.field_numbers(::Type{WorkerHeartbeatResponse}) = (;health_status = 1, worker_log = 2, hostname = 3) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:WorkerHeartbeatResponse}) + health_status = WorkerHealth.OK + worker_log = PB.BufferedVector{Event}() + hostname = "" + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + health_status = PB.decode(d, WorkerHealth.T) + elseif field_number == 2 + PB.decode!(d, worker_log) + elseif field_number == 3 + hostname = PB.decode(d, String) + else + PB.skip(d, wire_type) + end + end + return WorkerHeartbeatResponse(health_status, worker_log[], hostname) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::WorkerHeartbeatResponse) + initpos = position(e.io) + x.health_status != WorkerHealth.OK && PB.encode(e, 1, x.health_status) + !isempty(x.worker_log) && PB.encode(e, 2, x.worker_log) + !isempty(x.hostname) && PB.encode(e, 3, x.hostname) + return position(e.io) - initpos +end +function PB._encoded_size(x::WorkerHeartbeatResponse) + encoded_size = 0 + x.health_status != WorkerHealth.OK && (encoded_size += PB._encoded_size(x.health_status, 1)) + !isempty(x.worker_log) && (encoded_size += PB._encoded_size(x.worker_log, 2)) + !isempty(x.hostname) && (encoded_size += PB._encoded_size(x.hostname, 3)) + return encoded_size +end diff --git a/src/protojl/tensorboard/tensorboard/full_type_pb.jl b/src/protojl/tensorboard/tensorboard/full_type_pb.jl new file mode 100644 index 0000000..cc3defc --- /dev/null +++ b/src/protojl/tensorboard/tensorboard/full_type_pb.jl @@ -0,0 +1,71 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:24.292 +# original file: /home/lior/TensorBoardLogger.jl/gen/proto/tensorboard/compat/proto/full_type.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export FullTypeId, FullTypeDef + +# Abstract types to help resolve mutually recursive definitions +abstract type var"##AbstractFullTypeDef" end + + +@enumx FullTypeId TFT_UNSET=0 TFT_VAR=1 TFT_ANY=2 TFT_PRODUCT=3 TFT_NAMED=4 TFT_FOR_EACH=20 TFT_CALLABLE=100 TFT_TENSOR=1000 TFT_ARRAY=1001 TFT_OPTIONAL=1002 TFT_LITERAL=1003 TFT_ENCODED=1004 TFT_SHAPE_TENSOR=1005 TFT_BOOL=200 TFT_UINT8=201 TFT_UINT16=202 TFT_UINT32=203 TFT_UINT64=204 TFT_INT8=205 TFT_INT16=206 TFT_INT32=207 TFT_INT64=208 TFT_HALF=209 TFT_FLOAT=210 TFT_DOUBLE=211 TFT_BFLOAT16=215 TFT_COMPLEX64=212 TFT_COMPLEX128=213 TFT_STRING=214 TFT_DATASET=10102 TFT_RAGGED=10103 TFT_ITERATOR=10104 TFT_MUTEX_LOCK=10202 TFT_LEGACY_VARIANT=10203 + +struct FullTypeDef <: var"##AbstractFullTypeDef" + type_id::FullTypeId.T + args::Vector{<:FullTypeDef} + attr::Union{Nothing,OneOf{<:Union{String,Int64}}} +end +PB.oneof_field_types(::Type{FullTypeDef}) = (; + attr = (;s=String, i=Int64), +) +PB.default_values(::Type{FullTypeDef}) = (;type_id = FullTypeId.TFT_UNSET, args = Vector{FullTypeDef}(), s = "", i = zero(Int64)) +PB.field_numbers(::Type{FullTypeDef}) = (;type_id = 1, args = 2, s = 3, i = 4) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:FullTypeDef}) + type_id = FullTypeId.TFT_UNSET + args = PB.BufferedVector{FullTypeDef}() + attr = nothing + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + type_id = PB.decode(d, FullTypeId.T) + elseif field_number == 2 + PB.decode!(d, args) + elseif field_number == 3 + attr = OneOf(:s, PB.decode(d, String)) + elseif field_number == 4 + attr = OneOf(:i, PB.decode(d, Int64)) + else + PB.skip(d, wire_type) + end + end + return FullTypeDef(type_id, args[], attr) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::FullTypeDef) + initpos = position(e.io) + x.type_id != FullTypeId.TFT_UNSET && PB.encode(e, 1, x.type_id) + !isempty(x.args) && PB.encode(e, 2, x.args) + if isnothing(x.attr); + elseif x.attr.name === :s + PB.encode(e, 3, x.attr[]::String) + elseif x.attr.name === :i + PB.encode(e, 4, x.attr[]::Int64) + end + return position(e.io) - initpos +end +function PB._encoded_size(x::FullTypeDef) + encoded_size = 0 + x.type_id != FullTypeId.TFT_UNSET && (encoded_size += PB._encoded_size(x.type_id, 1)) + !isempty(x.args) && (encoded_size += PB._encoded_size(x.args, 2)) + if isnothing(x.attr); + elseif x.attr.name === :s + encoded_size += PB._encoded_size(x.attr[]::String, 3) + elseif x.attr.name === :i + encoded_size += PB._encoded_size(x.attr[]::Int64, 4) + end + return encoded_size +end diff --git a/src/protojl/tensorboard/tensorboard/function_pb.jl b/src/protojl/tensorboard/tensorboard/function_pb.jl new file mode 100644 index 0000000..fec0461 --- /dev/null +++ b/src/protojl/tensorboard/tensorboard/function_pb.jl @@ -0,0 +1,220 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:24.778 +# original file: /home/lior/TensorBoardLogger.jl/gen/proto/tensorboard/compat/proto/function.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export RegisteredGradient, var"FunctionDef.ArgAttrs", GradientDef, FunctionDef +export FunctionDefLibrary + +struct RegisteredGradient + gradient_func::String + registered_op_type::String +end +PB.default_values(::Type{RegisteredGradient}) = (;gradient_func = "", registered_op_type = "") +PB.field_numbers(::Type{RegisteredGradient}) = (;gradient_func = 1, registered_op_type = 2) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:RegisteredGradient}) + gradient_func = "" + registered_op_type = "" + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + gradient_func = PB.decode(d, String) + elseif field_number == 2 + registered_op_type = PB.decode(d, String) + else + PB.skip(d, wire_type) + end + end + return RegisteredGradient(gradient_func, registered_op_type) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::RegisteredGradient) + initpos = position(e.io) + !isempty(x.gradient_func) && PB.encode(e, 1, x.gradient_func) + !isempty(x.registered_op_type) && PB.encode(e, 2, x.registered_op_type) + return position(e.io) - initpos +end +function PB._encoded_size(x::RegisteredGradient) + encoded_size = 0 + !isempty(x.gradient_func) && (encoded_size += PB._encoded_size(x.gradient_func, 1)) + !isempty(x.registered_op_type) && (encoded_size += PB._encoded_size(x.registered_op_type, 2)) + return encoded_size +end + +struct var"FunctionDef.ArgAttrs" + attr::Dict{String,AttrValue} +end +PB.default_values(::Type{var"FunctionDef.ArgAttrs"}) = (;attr = Dict{String,AttrValue}()) +PB.field_numbers(::Type{var"FunctionDef.ArgAttrs"}) = (;attr = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"FunctionDef.ArgAttrs"}) + attr = Dict{String,AttrValue}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, attr) + else + PB.skip(d, wire_type) + end + end + return var"FunctionDef.ArgAttrs"(attr) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"FunctionDef.ArgAttrs") + initpos = position(e.io) + !isempty(x.attr) && PB.encode(e, 1, x.attr) + return position(e.io) - initpos +end +function PB._encoded_size(x::var"FunctionDef.ArgAttrs") + encoded_size = 0 + !isempty(x.attr) && (encoded_size += PB._encoded_size(x.attr, 1)) + return encoded_size +end + +struct GradientDef + function_name::String + gradient_func::String +end +PB.default_values(::Type{GradientDef}) = (;function_name = "", gradient_func = "") +PB.field_numbers(::Type{GradientDef}) = (;function_name = 1, gradient_func = 2) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:GradientDef}) + function_name = "" + gradient_func = "" + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + function_name = PB.decode(d, String) + elseif field_number == 2 + gradient_func = PB.decode(d, String) + else + PB.skip(d, wire_type) + end + end + return GradientDef(function_name, gradient_func) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::GradientDef) + initpos = position(e.io) + !isempty(x.function_name) && PB.encode(e, 1, x.function_name) + !isempty(x.gradient_func) && PB.encode(e, 2, x.gradient_func) + return position(e.io) - initpos +end +function PB._encoded_size(x::GradientDef) + encoded_size = 0 + !isempty(x.function_name) && (encoded_size += PB._encoded_size(x.function_name, 1)) + !isempty(x.gradient_func) && (encoded_size += PB._encoded_size(x.gradient_func, 2)) + return encoded_size +end + +struct FunctionDef + signature::Union{Nothing,OpDef} + attr::Dict{String,AttrValue} + arg_attr::Dict{UInt32,var"FunctionDef.ArgAttrs"} + resource_arg_unique_id::Dict{UInt32,UInt32} + node_def::Vector{NodeDef} + ret::Dict{String,String} + control_ret::Dict{String,String} +end +PB.reserved_fields(::Type{FunctionDef}) = (names = String[], numbers = Union{Int,UnitRange{Int}}[2]) +PB.default_values(::Type{FunctionDef}) = (;signature = nothing, attr = Dict{String,AttrValue}(), arg_attr = Dict{UInt32,var"FunctionDef.ArgAttrs"}(), resource_arg_unique_id = Dict{UInt32,UInt32}(), node_def = Vector{NodeDef}(), ret = Dict{String,String}(), control_ret = Dict{String,String}()) +PB.field_numbers(::Type{FunctionDef}) = (;signature = 1, attr = 5, arg_attr = 7, resource_arg_unique_id = 8, node_def = 3, ret = 4, control_ret = 6) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:FunctionDef}) + signature = Ref{Union{Nothing,OpDef}}(nothing) + attr = Dict{String,AttrValue}() + arg_attr = Dict{UInt32,var"FunctionDef.ArgAttrs"}() + resource_arg_unique_id = Dict{UInt32,UInt32}() + node_def = PB.BufferedVector{NodeDef}() + ret = Dict{String,String}() + control_ret = Dict{String,String}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, signature) + elseif field_number == 5 + PB.decode!(d, attr) + elseif field_number == 7 + PB.decode!(d, arg_attr) + elseif field_number == 8 + PB.decode!(d, resource_arg_unique_id) + elseif field_number == 3 + PB.decode!(d, node_def) + elseif field_number == 4 + PB.decode!(d, ret) + elseif field_number == 6 + PB.decode!(d, control_ret) + else + PB.skip(d, wire_type) + end + end + return FunctionDef(signature[], attr, arg_attr, resource_arg_unique_id, node_def[], ret, control_ret) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::FunctionDef) + initpos = position(e.io) + !isnothing(x.signature) && PB.encode(e, 1, x.signature) + !isempty(x.attr) && PB.encode(e, 5, x.attr) + !isempty(x.arg_attr) && PB.encode(e, 7, x.arg_attr) + !isempty(x.resource_arg_unique_id) && PB.encode(e, 8, x.resource_arg_unique_id) + !isempty(x.node_def) && PB.encode(e, 3, x.node_def) + !isempty(x.ret) && PB.encode(e, 4, x.ret) + !isempty(x.control_ret) && PB.encode(e, 6, x.control_ret) + return position(e.io) - initpos +end +function PB._encoded_size(x::FunctionDef) + encoded_size = 0 + !isnothing(x.signature) && (encoded_size += PB._encoded_size(x.signature, 1)) + !isempty(x.attr) && (encoded_size += PB._encoded_size(x.attr, 5)) + !isempty(x.arg_attr) && (encoded_size += PB._encoded_size(x.arg_attr, 7)) + !isempty(x.resource_arg_unique_id) && (encoded_size += PB._encoded_size(x.resource_arg_unique_id, 8)) + !isempty(x.node_def) && (encoded_size += PB._encoded_size(x.node_def, 3)) + !isempty(x.ret) && (encoded_size += PB._encoded_size(x.ret, 4)) + !isempty(x.control_ret) && (encoded_size += PB._encoded_size(x.control_ret, 6)) + return encoded_size +end + +struct FunctionDefLibrary + var"#function"::Vector{FunctionDef} + gradient::Vector{GradientDef} + registered_gradients::Vector{RegisteredGradient} +end +PB.default_values(::Type{FunctionDefLibrary}) = (;var"#function" = Vector{FunctionDef}(), gradient = Vector{GradientDef}(), registered_gradients = Vector{RegisteredGradient}()) +PB.field_numbers(::Type{FunctionDefLibrary}) = (;var"#function" = 1, gradient = 2, registered_gradients = 3) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:FunctionDefLibrary}) + var"#function" = PB.BufferedVector{FunctionDef}() + gradient = PB.BufferedVector{GradientDef}() + registered_gradients = PB.BufferedVector{RegisteredGradient}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, var"#function") + elseif field_number == 2 + PB.decode!(d, gradient) + elseif field_number == 3 + PB.decode!(d, registered_gradients) + else + PB.skip(d, wire_type) + end + end + return FunctionDefLibrary(var"#function"[], gradient[], registered_gradients[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::FunctionDefLibrary) + initpos = position(e.io) + !isempty(x.var"#function") && PB.encode(e, 1, x.var"#function") + !isempty(x.gradient) && PB.encode(e, 2, x.gradient) + !isempty(x.registered_gradients) && PB.encode(e, 3, x.registered_gradients) + return position(e.io) - initpos +end +function PB._encoded_size(x::FunctionDefLibrary) + encoded_size = 0 + !isempty(x.var"#function") && (encoded_size += PB._encoded_size(x.var"#function", 1)) + !isempty(x.gradient) && (encoded_size += PB._encoded_size(x.gradient, 2)) + !isempty(x.registered_gradients) && (encoded_size += PB._encoded_size(x.registered_gradients, 3)) + return encoded_size +end diff --git a/src/protojl/tensorboard/tensorboard/graph_debug_info_pb.jl b/src/protojl/tensorboard/tensorboard/graph_debug_info_pb.jl new file mode 100644 index 0000000..bcf3b27 --- /dev/null +++ b/src/protojl/tensorboard/tensorboard/graph_debug_info_pb.jl @@ -0,0 +1,128 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:23.982 +# original file: /home/lior/TensorBoardLogger.jl/gen/proto/tensorboard/compat/proto/graph_debug_info.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export var"GraphDebugInfo.FileLineCol", var"GraphDebugInfo.StackTrace", GraphDebugInfo + +struct var"GraphDebugInfo.FileLineCol" + file_index::Int32 + line::Int32 + col::Int32 + func::String + code::String +end +PB.default_values(::Type{var"GraphDebugInfo.FileLineCol"}) = (;file_index = zero(Int32), line = zero(Int32), col = zero(Int32), func = "", code = "") +PB.field_numbers(::Type{var"GraphDebugInfo.FileLineCol"}) = (;file_index = 1, line = 2, col = 3, func = 4, code = 5) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"GraphDebugInfo.FileLineCol"}) + file_index = zero(Int32) + line = zero(Int32) + col = zero(Int32) + func = "" + code = "" + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + file_index = PB.decode(d, Int32) + elseif field_number == 2 + line = PB.decode(d, Int32) + elseif field_number == 3 + col = PB.decode(d, Int32) + elseif field_number == 4 + func = PB.decode(d, String) + elseif field_number == 5 + code = PB.decode(d, String) + else + PB.skip(d, wire_type) + end + end + return var"GraphDebugInfo.FileLineCol"(file_index, line, col, func, code) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"GraphDebugInfo.FileLineCol") + initpos = position(e.io) + x.file_index != zero(Int32) && PB.encode(e, 1, x.file_index) + x.line != zero(Int32) && PB.encode(e, 2, x.line) + x.col != zero(Int32) && PB.encode(e, 3, x.col) + !isempty(x.func) && PB.encode(e, 4, x.func) + !isempty(x.code) && PB.encode(e, 5, x.code) + return position(e.io) - initpos +end +function PB._encoded_size(x::var"GraphDebugInfo.FileLineCol") + encoded_size = 0 + x.file_index != zero(Int32) && (encoded_size += PB._encoded_size(x.file_index, 1)) + x.line != zero(Int32) && (encoded_size += PB._encoded_size(x.line, 2)) + x.col != zero(Int32) && (encoded_size += PB._encoded_size(x.col, 3)) + !isempty(x.func) && (encoded_size += PB._encoded_size(x.func, 4)) + !isempty(x.code) && (encoded_size += PB._encoded_size(x.code, 5)) + return encoded_size +end + +struct var"GraphDebugInfo.StackTrace" + file_line_cols::Vector{var"GraphDebugInfo.FileLineCol"} +end +PB.default_values(::Type{var"GraphDebugInfo.StackTrace"}) = (;file_line_cols = Vector{var"GraphDebugInfo.FileLineCol"}()) +PB.field_numbers(::Type{var"GraphDebugInfo.StackTrace"}) = (;file_line_cols = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"GraphDebugInfo.StackTrace"}) + file_line_cols = PB.BufferedVector{var"GraphDebugInfo.FileLineCol"}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, file_line_cols) + else + PB.skip(d, wire_type) + end + end + return var"GraphDebugInfo.StackTrace"(file_line_cols[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"GraphDebugInfo.StackTrace") + initpos = position(e.io) + !isempty(x.file_line_cols) && PB.encode(e, 1, x.file_line_cols) + return position(e.io) - initpos +end +function PB._encoded_size(x::var"GraphDebugInfo.StackTrace") + encoded_size = 0 + !isempty(x.file_line_cols) && (encoded_size += PB._encoded_size(x.file_line_cols, 1)) + return encoded_size +end + +struct GraphDebugInfo + files::Vector{String} + traces::Dict{String,var"GraphDebugInfo.StackTrace"} +end +PB.default_values(::Type{GraphDebugInfo}) = (;files = Vector{String}(), traces = Dict{String,var"GraphDebugInfo.StackTrace"}()) +PB.field_numbers(::Type{GraphDebugInfo}) = (;files = 1, traces = 2) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:GraphDebugInfo}) + files = PB.BufferedVector{String}() + traces = Dict{String,var"GraphDebugInfo.StackTrace"}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, files) + elseif field_number == 2 + PB.decode!(d, traces) + else + PB.skip(d, wire_type) + end + end + return GraphDebugInfo(files[], traces) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::GraphDebugInfo) + initpos = position(e.io) + !isempty(x.files) && PB.encode(e, 1, x.files) + !isempty(x.traces) && PB.encode(e, 2, x.traces) + return position(e.io) - initpos +end +function PB._encoded_size(x::GraphDebugInfo) + encoded_size = 0 + !isempty(x.files) && (encoded_size += PB._encoded_size(x.files, 1)) + !isempty(x.traces) && (encoded_size += PB._encoded_size(x.traces, 2)) + return encoded_size +end diff --git a/src/protojl/tensorboard/tensorboard/graph_pb.jl b/src/protojl/tensorboard/tensorboard/graph_pb.jl new file mode 100644 index 0000000..a216ec7 --- /dev/null +++ b/src/protojl/tensorboard/tensorboard/graph_pb.jl @@ -0,0 +1,62 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:24.778 +# original file: /home/lior/TensorBoardLogger.jl/gen/proto/tensorboard/compat/proto/graph.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export GraphDef + +struct GraphDef + node::Vector{NodeDef} + versions::Union{Nothing,VersionDef} + version::Int32 + library::Union{Nothing,FunctionDefLibrary} + debug_info::Union{Nothing,GraphDebugInfo} +end +PB.default_values(::Type{GraphDef}) = (;node = Vector{NodeDef}(), versions = nothing, version = zero(Int32), library = nothing, debug_info = nothing) +PB.field_numbers(::Type{GraphDef}) = (;node = 1, versions = 4, version = 3, library = 2, debug_info = 5) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:GraphDef}) + node = PB.BufferedVector{NodeDef}() + versions = Ref{Union{Nothing,VersionDef}}(nothing) + version = zero(Int32) + library = Ref{Union{Nothing,FunctionDefLibrary}}(nothing) + debug_info = Ref{Union{Nothing,GraphDebugInfo}}(nothing) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, node) + elseif field_number == 4 + PB.decode!(d, versions) + elseif field_number == 3 + version = PB.decode(d, Int32) + elseif field_number == 2 + PB.decode!(d, library) + elseif field_number == 5 + PB.decode!(d, debug_info) + else + PB.skip(d, wire_type) + end + end + return GraphDef(node[], versions[], version, library[], debug_info[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::GraphDef) + initpos = position(e.io) + !isempty(x.node) && PB.encode(e, 1, x.node) + !isnothing(x.versions) && PB.encode(e, 4, x.versions) + x.version != zero(Int32) && PB.encode(e, 3, x.version) + !isnothing(x.library) && PB.encode(e, 2, x.library) + !isnothing(x.debug_info) && PB.encode(e, 5, x.debug_info) + return position(e.io) - initpos +end +function PB._encoded_size(x::GraphDef) + encoded_size = 0 + !isempty(x.node) && (encoded_size += PB._encoded_size(x.node, 1)) + !isnothing(x.versions) && (encoded_size += PB._encoded_size(x.versions, 4)) + x.version != zero(Int32) && (encoded_size += PB._encoded_size(x.version, 3)) + !isnothing(x.library) && (encoded_size += PB._encoded_size(x.library, 2)) + !isnothing(x.debug_info) && (encoded_size += PB._encoded_size(x.debug_info, 5)) + return encoded_size +end diff --git a/src/protojl/tensorboard/tensorboard/histogram_pb.jl b/src/protojl/tensorboard/tensorboard/histogram_pb.jl new file mode 100644 index 0000000..5dcf8f2 --- /dev/null +++ b/src/protojl/tensorboard/tensorboard/histogram_pb.jl @@ -0,0 +1,74 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:24.224 +# original file: /home/lior/TensorBoardLogger.jl/gen/proto/tensorboard/compat/proto/histogram.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export HistogramProto + +struct HistogramProto + min::Float64 + max::Float64 + num::Float64 + sum::Float64 + sum_squares::Float64 + bucket_limit::Vector{Float64} + bucket::Vector{Float64} +end +PB.default_values(::Type{HistogramProto}) = (;min = zero(Float64), max = zero(Float64), num = zero(Float64), sum = zero(Float64), sum_squares = zero(Float64), bucket_limit = Vector{Float64}(), bucket = Vector{Float64}()) +PB.field_numbers(::Type{HistogramProto}) = (;min = 1, max = 2, num = 3, sum = 4, sum_squares = 5, bucket_limit = 6, bucket = 7) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:HistogramProto}) + min = zero(Float64) + max = zero(Float64) + num = zero(Float64) + sum = zero(Float64) + sum_squares = zero(Float64) + bucket_limit = PB.BufferedVector{Float64}() + bucket = PB.BufferedVector{Float64}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + min = PB.decode(d, Float64) + elseif field_number == 2 + max = PB.decode(d, Float64) + elseif field_number == 3 + num = PB.decode(d, Float64) + elseif field_number == 4 + sum = PB.decode(d, Float64) + elseif field_number == 5 + sum_squares = PB.decode(d, Float64) + elseif field_number == 6 + PB.decode!(d, wire_type, bucket_limit) + elseif field_number == 7 + PB.decode!(d, wire_type, bucket) + else + PB.skip(d, wire_type) + end + end + return HistogramProto(min, max, num, sum, sum_squares, bucket_limit[], bucket[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::HistogramProto) + initpos = position(e.io) + x.min != zero(Float64) && PB.encode(e, 1, x.min) + x.max != zero(Float64) && PB.encode(e, 2, x.max) + x.num != zero(Float64) && PB.encode(e, 3, x.num) + x.sum != zero(Float64) && PB.encode(e, 4, x.sum) + x.sum_squares != zero(Float64) && PB.encode(e, 5, x.sum_squares) + !isempty(x.bucket_limit) && PB.encode(e, 6, x.bucket_limit) + !isempty(x.bucket) && PB.encode(e, 7, x.bucket) + return position(e.io) - initpos +end +function PB._encoded_size(x::HistogramProto) + encoded_size = 0 + x.min != zero(Float64) && (encoded_size += PB._encoded_size(x.min, 1)) + x.max != zero(Float64) && (encoded_size += PB._encoded_size(x.max, 2)) + x.num != zero(Float64) && (encoded_size += PB._encoded_size(x.num, 3)) + x.sum != zero(Float64) && (encoded_size += PB._encoded_size(x.sum, 4)) + x.sum_squares != zero(Float64) && (encoded_size += PB._encoded_size(x.sum_squares, 5)) + !isempty(x.bucket_limit) && (encoded_size += PB._encoded_size(x.bucket_limit, 6)) + !isempty(x.bucket) && (encoded_size += PB._encoded_size(x.bucket, 7)) + return encoded_size +end diff --git a/src/protojl/tensorboard/tensorboard/meta_graph_pb.jl b/src/protojl/tensorboard/tensorboard/meta_graph_pb.jl new file mode 100644 index 0000000..8d7382e --- /dev/null +++ b/src/protojl/tensorboard/tensorboard/meta_graph_pb.jl @@ -0,0 +1,590 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:24.778 +# original file: /home/lior/TensorBoardLogger.jl/gen/proto/tensorboard/compat/proto/meta_graph.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export var"CollectionDef.BytesList", var"CollectionDef.Int64List" +export var"TensorInfo.CooSparse", var"CollectionDef.NodeList", var"CollectionDef.AnyList" +export var"CollectionDef.FloatList", var"MetaGraphDef.MetaInfoDef", CollectionDef +export MetaGraphDef, SignatureDef, TensorInfo, AssetFileDef +export var"TensorInfo.CompositeTensor" + +# Abstract types to help resolve mutually recursive definitions +abstract type var"##AbstractMetaGraphDef" end +abstract type var"##AbstractSignatureDef" end +abstract type var"##AbstractTensorInfo" end +abstract type var"##AbstractAssetFileDef" end +abstract type var"##AbstractTensorInfo.CompositeTensor" end + + +struct var"CollectionDef.BytesList" + value::Vector{Vector{UInt8}} +end +PB.default_values(::Type{var"CollectionDef.BytesList"}) = (;value = Vector{Vector{UInt8}}()) +PB.field_numbers(::Type{var"CollectionDef.BytesList"}) = (;value = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"CollectionDef.BytesList"}) + value = PB.BufferedVector{Vector{UInt8}}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, value) + else + PB.skip(d, wire_type) + end + end + return var"CollectionDef.BytesList"(value[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"CollectionDef.BytesList") + initpos = position(e.io) + !isempty(x.value) && PB.encode(e, 1, x.value) + return position(e.io) - initpos +end +function PB._encoded_size(x::var"CollectionDef.BytesList") + encoded_size = 0 + !isempty(x.value) && (encoded_size += PB._encoded_size(x.value, 1)) + return encoded_size +end + +struct var"CollectionDef.Int64List" + value::Vector{Int64} +end +PB.default_values(::Type{var"CollectionDef.Int64List"}) = (;value = Vector{Int64}()) +PB.field_numbers(::Type{var"CollectionDef.Int64List"}) = (;value = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"CollectionDef.Int64List"}) + value = PB.BufferedVector{Int64}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, wire_type, value) + else + PB.skip(d, wire_type) + end + end + return var"CollectionDef.Int64List"(value[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"CollectionDef.Int64List") + initpos = position(e.io) + !isempty(x.value) && PB.encode(e, 1, x.value) + return position(e.io) - initpos +end +function PB._encoded_size(x::var"CollectionDef.Int64List") + encoded_size = 0 + !isempty(x.value) && (encoded_size += PB._encoded_size(x.value, 1)) + return encoded_size +end + +struct var"TensorInfo.CooSparse" + values_tensor_name::String + indices_tensor_name::String + dense_shape_tensor_name::String +end +PB.default_values(::Type{var"TensorInfo.CooSparse"}) = (;values_tensor_name = "", indices_tensor_name = "", dense_shape_tensor_name = "") +PB.field_numbers(::Type{var"TensorInfo.CooSparse"}) = (;values_tensor_name = 1, indices_tensor_name = 2, dense_shape_tensor_name = 3) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"TensorInfo.CooSparse"}) + values_tensor_name = "" + indices_tensor_name = "" + dense_shape_tensor_name = "" + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + values_tensor_name = PB.decode(d, String) + elseif field_number == 2 + indices_tensor_name = PB.decode(d, String) + elseif field_number == 3 + dense_shape_tensor_name = PB.decode(d, String) + else + PB.skip(d, wire_type) + end + end + return var"TensorInfo.CooSparse"(values_tensor_name, indices_tensor_name, dense_shape_tensor_name) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"TensorInfo.CooSparse") + initpos = position(e.io) + !isempty(x.values_tensor_name) && PB.encode(e, 1, x.values_tensor_name) + !isempty(x.indices_tensor_name) && PB.encode(e, 2, x.indices_tensor_name) + !isempty(x.dense_shape_tensor_name) && PB.encode(e, 3, x.dense_shape_tensor_name) + return position(e.io) - initpos +end +function PB._encoded_size(x::var"TensorInfo.CooSparse") + encoded_size = 0 + !isempty(x.values_tensor_name) && (encoded_size += PB._encoded_size(x.values_tensor_name, 1)) + !isempty(x.indices_tensor_name) && (encoded_size += PB._encoded_size(x.indices_tensor_name, 2)) + !isempty(x.dense_shape_tensor_name) && (encoded_size += PB._encoded_size(x.dense_shape_tensor_name, 3)) + return encoded_size +end + +struct var"CollectionDef.NodeList" + value::Vector{String} +end +PB.default_values(::Type{var"CollectionDef.NodeList"}) = (;value = Vector{String}()) +PB.field_numbers(::Type{var"CollectionDef.NodeList"}) = (;value = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"CollectionDef.NodeList"}) + value = PB.BufferedVector{String}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, value) + else + PB.skip(d, wire_type) + end + end + return var"CollectionDef.NodeList"(value[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"CollectionDef.NodeList") + initpos = position(e.io) + !isempty(x.value) && PB.encode(e, 1, x.value) + return position(e.io) - initpos +end +function PB._encoded_size(x::var"CollectionDef.NodeList") + encoded_size = 0 + !isempty(x.value) && (encoded_size += PB._encoded_size(x.value, 1)) + return encoded_size +end + +struct var"CollectionDef.AnyList" + value::Vector{google.protobuf.var"#Any"} +end +PB.default_values(::Type{var"CollectionDef.AnyList"}) = (;value = Vector{google.protobuf.var"#Any"}()) +PB.field_numbers(::Type{var"CollectionDef.AnyList"}) = (;value = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"CollectionDef.AnyList"}) + value = PB.BufferedVector{google.protobuf.var"#Any"}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, value) + else + PB.skip(d, wire_type) + end + end + return var"CollectionDef.AnyList"(value[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"CollectionDef.AnyList") + initpos = position(e.io) + !isempty(x.value) && PB.encode(e, 1, x.value) + return position(e.io) - initpos +end +function PB._encoded_size(x::var"CollectionDef.AnyList") + encoded_size = 0 + !isempty(x.value) && (encoded_size += PB._encoded_size(x.value, 1)) + return encoded_size +end + +struct var"CollectionDef.FloatList" + value::Vector{Float32} +end +PB.default_values(::Type{var"CollectionDef.FloatList"}) = (;value = Vector{Float32}()) +PB.field_numbers(::Type{var"CollectionDef.FloatList"}) = (;value = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"CollectionDef.FloatList"}) + value = PB.BufferedVector{Float32}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, wire_type, value) + else + PB.skip(d, wire_type) + end + end + return var"CollectionDef.FloatList"(value[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"CollectionDef.FloatList") + initpos = position(e.io) + !isempty(x.value) && PB.encode(e, 1, x.value) + return position(e.io) - initpos +end +function PB._encoded_size(x::var"CollectionDef.FloatList") + encoded_size = 0 + !isempty(x.value) && (encoded_size += PB._encoded_size(x.value, 1)) + return encoded_size +end + +struct var"MetaGraphDef.MetaInfoDef" + meta_graph_version::String + stripped_op_list::Union{Nothing,OpList} + any_info::Union{Nothing,google.protobuf.var"#Any"} + tags::Vector{String} + tensorflow_version::String + tensorflow_git_version::String + stripped_default_attrs::Bool + function_aliases::Dict{String,String} +end +PB.default_values(::Type{var"MetaGraphDef.MetaInfoDef"}) = (;meta_graph_version = "", stripped_op_list = nothing, any_info = nothing, tags = Vector{String}(), tensorflow_version = "", tensorflow_git_version = "", stripped_default_attrs = false, function_aliases = Dict{String,String}()) +PB.field_numbers(::Type{var"MetaGraphDef.MetaInfoDef"}) = (;meta_graph_version = 1, stripped_op_list = 2, any_info = 3, tags = 4, tensorflow_version = 5, tensorflow_git_version = 6, stripped_default_attrs = 7, function_aliases = 8) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"MetaGraphDef.MetaInfoDef"}) + meta_graph_version = "" + stripped_op_list = Ref{Union{Nothing,OpList}}(nothing) + any_info = Ref{Union{Nothing,google.protobuf.var"#Any"}}(nothing) + tags = PB.BufferedVector{String}() + tensorflow_version = "" + tensorflow_git_version = "" + stripped_default_attrs = false + function_aliases = Dict{String,String}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + meta_graph_version = PB.decode(d, String) + elseif field_number == 2 + PB.decode!(d, stripped_op_list) + elseif field_number == 3 + PB.decode!(d, any_info) + elseif field_number == 4 + PB.decode!(d, tags) + elseif field_number == 5 + tensorflow_version = PB.decode(d, String) + elseif field_number == 6 + tensorflow_git_version = PB.decode(d, String) + elseif field_number == 7 + stripped_default_attrs = PB.decode(d, Bool) + elseif field_number == 8 + PB.decode!(d, function_aliases) + else + PB.skip(d, wire_type) + end + end + return var"MetaGraphDef.MetaInfoDef"(meta_graph_version, stripped_op_list[], any_info[], tags[], tensorflow_version, tensorflow_git_version, stripped_default_attrs, function_aliases) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"MetaGraphDef.MetaInfoDef") + initpos = position(e.io) + !isempty(x.meta_graph_version) && PB.encode(e, 1, x.meta_graph_version) + !isnothing(x.stripped_op_list) && PB.encode(e, 2, x.stripped_op_list) + !isnothing(x.any_info) && PB.encode(e, 3, x.any_info) + !isempty(x.tags) && PB.encode(e, 4, x.tags) + !isempty(x.tensorflow_version) && PB.encode(e, 5, x.tensorflow_version) + !isempty(x.tensorflow_git_version) && PB.encode(e, 6, x.tensorflow_git_version) + x.stripped_default_attrs != false && PB.encode(e, 7, x.stripped_default_attrs) + !isempty(x.function_aliases) && PB.encode(e, 8, x.function_aliases) + return position(e.io) - initpos +end +function PB._encoded_size(x::var"MetaGraphDef.MetaInfoDef") + encoded_size = 0 + !isempty(x.meta_graph_version) && (encoded_size += PB._encoded_size(x.meta_graph_version, 1)) + !isnothing(x.stripped_op_list) && (encoded_size += PB._encoded_size(x.stripped_op_list, 2)) + !isnothing(x.any_info) && (encoded_size += PB._encoded_size(x.any_info, 3)) + !isempty(x.tags) && (encoded_size += PB._encoded_size(x.tags, 4)) + !isempty(x.tensorflow_version) && (encoded_size += PB._encoded_size(x.tensorflow_version, 5)) + !isempty(x.tensorflow_git_version) && (encoded_size += PB._encoded_size(x.tensorflow_git_version, 6)) + x.stripped_default_attrs != false && (encoded_size += PB._encoded_size(x.stripped_default_attrs, 7)) + !isempty(x.function_aliases) && (encoded_size += PB._encoded_size(x.function_aliases, 8)) + return encoded_size +end + +struct CollectionDef + kind::Union{Nothing,OneOf{<:Union{var"CollectionDef.NodeList",var"CollectionDef.BytesList",var"CollectionDef.Int64List",var"CollectionDef.FloatList",var"CollectionDef.AnyList"}}} +end +PB.oneof_field_types(::Type{CollectionDef}) = (; + kind = (;node_list=var"CollectionDef.NodeList", bytes_list=var"CollectionDef.BytesList", int64_list=var"CollectionDef.Int64List", float_list=var"CollectionDef.FloatList", any_list=var"CollectionDef.AnyList"), +) +PB.default_values(::Type{CollectionDef}) = (;node_list = nothing, bytes_list = nothing, int64_list = nothing, float_list = nothing, any_list = nothing) +PB.field_numbers(::Type{CollectionDef}) = (;node_list = 1, bytes_list = 2, int64_list = 3, float_list = 4, any_list = 5) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:CollectionDef}) + kind = nothing + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + kind = OneOf(:node_list, PB.decode(d, Ref{var"CollectionDef.NodeList"})) + elseif field_number == 2 + kind = OneOf(:bytes_list, PB.decode(d, Ref{var"CollectionDef.BytesList"})) + elseif field_number == 3 + kind = OneOf(:int64_list, PB.decode(d, Ref{var"CollectionDef.Int64List"})) + elseif field_number == 4 + kind = OneOf(:float_list, PB.decode(d, Ref{var"CollectionDef.FloatList"})) + elseif field_number == 5 + kind = OneOf(:any_list, PB.decode(d, Ref{var"CollectionDef.AnyList"})) + else + PB.skip(d, wire_type) + end + end + return CollectionDef(kind) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::CollectionDef) + initpos = position(e.io) + if isnothing(x.kind); + elseif x.kind.name === :node_list + PB.encode(e, 1, x.kind[]::var"CollectionDef.NodeList") + elseif x.kind.name === :bytes_list + PB.encode(e, 2, x.kind[]::var"CollectionDef.BytesList") + elseif x.kind.name === :int64_list + PB.encode(e, 3, x.kind[]::var"CollectionDef.Int64List") + elseif x.kind.name === :float_list + PB.encode(e, 4, x.kind[]::var"CollectionDef.FloatList") + elseif x.kind.name === :any_list + PB.encode(e, 5, x.kind[]::var"CollectionDef.AnyList") + end + return position(e.io) - initpos +end +function PB._encoded_size(x::CollectionDef) + encoded_size = 0 + if isnothing(x.kind); + elseif x.kind.name === :node_list + encoded_size += PB._encoded_size(x.kind[]::var"CollectionDef.NodeList", 1) + elseif x.kind.name === :bytes_list + encoded_size += PB._encoded_size(x.kind[]::var"CollectionDef.BytesList", 2) + elseif x.kind.name === :int64_list + encoded_size += PB._encoded_size(x.kind[]::var"CollectionDef.Int64List", 3) + elseif x.kind.name === :float_list + encoded_size += PB._encoded_size(x.kind[]::var"CollectionDef.FloatList", 4) + elseif x.kind.name === :any_list + encoded_size += PB._encoded_size(x.kind[]::var"CollectionDef.AnyList", 5) + end + return encoded_size +end + +struct MetaGraphDef{T2<:Union{Nothing,var"##AbstractAssetFileDef"},T1<:Union{Nothing,var"##AbstractSignatureDef"}} <: var"##AbstractMetaGraphDef" + meta_info_def::Union{Nothing,var"MetaGraphDef.MetaInfoDef"} + graph_def::Union{Nothing,GraphDef} + saver_def::Union{Nothing,SaverDef} + collection_def::Dict{String,CollectionDef} + signature_def::Dict{String,T1} + asset_file_def::Vector{T2} + object_graph_def::Union{Nothing,SavedObjectGraph} +end +PB.default_values(::Type{MetaGraphDef}) = (;meta_info_def = nothing, graph_def = nothing, saver_def = nothing, collection_def = Dict{String,CollectionDef}(), signature_def = Dict{String,SignatureDef}(), asset_file_def = Vector{AssetFileDef}(), object_graph_def = nothing) +PB.field_numbers(::Type{MetaGraphDef}) = (;meta_info_def = 1, graph_def = 2, saver_def = 3, collection_def = 4, signature_def = 5, asset_file_def = 6, object_graph_def = 7) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:MetaGraphDef}) + meta_info_def = Ref{Union{Nothing,var"MetaGraphDef.MetaInfoDef"}}(nothing) + graph_def = Ref{Union{Nothing,GraphDef}}(nothing) + saver_def = Ref{Union{Nothing,SaverDef}}(nothing) + collection_def = Dict{String,CollectionDef}() + signature_def = Dict{String,SignatureDef}() + asset_file_def = PB.BufferedVector{AssetFileDef}() + object_graph_def = Ref{Union{Nothing,SavedObjectGraph}}(nothing) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, meta_info_def) + elseif field_number == 2 + PB.decode!(d, graph_def) + elseif field_number == 3 + PB.decode!(d, saver_def) + elseif field_number == 4 + PB.decode!(d, collection_def) + elseif field_number == 5 + PB.decode!(d, signature_def) + elseif field_number == 6 + PB.decode!(d, asset_file_def) + elseif field_number == 7 + PB.decode!(d, object_graph_def) + else + PB.skip(d, wire_type) + end + end + return MetaGraphDef(meta_info_def[], graph_def[], saver_def[], collection_def, signature_def, asset_file_def[], object_graph_def[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::MetaGraphDef) + initpos = position(e.io) + !isnothing(x.meta_info_def) && PB.encode(e, 1, x.meta_info_def) + !isnothing(x.graph_def) && PB.encode(e, 2, x.graph_def) + !isnothing(x.saver_def) && PB.encode(e, 3, x.saver_def) + !isempty(x.collection_def) && PB.encode(e, 4, x.collection_def) + !isempty(x.signature_def) && PB.encode(e, 5, x.signature_def) + !isempty(x.asset_file_def) && PB.encode(e, 6, x.asset_file_def) + !isnothing(x.object_graph_def) && PB.encode(e, 7, x.object_graph_def) + return position(e.io) - initpos +end +function PB._encoded_size(x::MetaGraphDef) + encoded_size = 0 + !isnothing(x.meta_info_def) && (encoded_size += PB._encoded_size(x.meta_info_def, 1)) + !isnothing(x.graph_def) && (encoded_size += PB._encoded_size(x.graph_def, 2)) + !isnothing(x.saver_def) && (encoded_size += PB._encoded_size(x.saver_def, 3)) + !isempty(x.collection_def) && (encoded_size += PB._encoded_size(x.collection_def, 4)) + !isempty(x.signature_def) && (encoded_size += PB._encoded_size(x.signature_def, 5)) + !isempty(x.asset_file_def) && (encoded_size += PB._encoded_size(x.asset_file_def, 6)) + !isnothing(x.object_graph_def) && (encoded_size += PB._encoded_size(x.object_graph_def, 7)) + return encoded_size +end + +struct SignatureDef{T2<:Union{Nothing,var"##AbstractTensorInfo"},T1<:Union{Nothing,var"##AbstractTensorInfo"}} <: var"##AbstractSignatureDef" + inputs::Dict{String,T1} + outputs::Dict{String,T2} + method_name::String +end +PB.default_values(::Type{SignatureDef}) = (;inputs = Dict{String,TensorInfo}(), outputs = Dict{String,TensorInfo}(), method_name = "") +PB.field_numbers(::Type{SignatureDef}) = (;inputs = 1, outputs = 2, method_name = 3) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:SignatureDef}) + inputs = Dict{String,TensorInfo}() + outputs = Dict{String,TensorInfo}() + method_name = "" + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, inputs) + elseif field_number == 2 + PB.decode!(d, outputs) + elseif field_number == 3 + method_name = PB.decode(d, String) + else + PB.skip(d, wire_type) + end + end + return SignatureDef(inputs, outputs, method_name) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::SignatureDef) + initpos = position(e.io) + !isempty(x.inputs) && PB.encode(e, 1, x.inputs) + !isempty(x.outputs) && PB.encode(e, 2, x.outputs) + !isempty(x.method_name) && PB.encode(e, 3, x.method_name) + return position(e.io) - initpos +end +function PB._encoded_size(x::SignatureDef) + encoded_size = 0 + !isempty(x.inputs) && (encoded_size += PB._encoded_size(x.inputs, 1)) + !isempty(x.outputs) && (encoded_size += PB._encoded_size(x.outputs, 2)) + !isempty(x.method_name) && (encoded_size += PB._encoded_size(x.method_name, 3)) + return encoded_size +end + +struct TensorInfo <: var"##AbstractTensorInfo" + encoding::Union{Nothing,OneOf{<:Union{String,var"TensorInfo.CooSparse",var"##AbstractTensorInfo.CompositeTensor"}}} + dtype::var"#DataType".T + tensor_shape::Union{Nothing,TensorShapeProto} +end +PB.oneof_field_types(::Type{TensorInfo}) = (; + encoding = (;name=String, coo_sparse=var"TensorInfo.CooSparse", composite_tensor=var"TensorInfo.CompositeTensor"), +) +PB.default_values(::Type{TensorInfo}) = (;name = "", coo_sparse = nothing, composite_tensor = nothing, dtype = var"#DataType".DT_INVALID, tensor_shape = nothing) +PB.field_numbers(::Type{TensorInfo}) = (;name = 1, coo_sparse = 4, composite_tensor = 5, dtype = 2, tensor_shape = 3) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:TensorInfo}) + encoding = nothing + dtype = var"#DataType".DT_INVALID + tensor_shape = Ref{Union{Nothing,TensorShapeProto}}(nothing) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + encoding = OneOf(:name, PB.decode(d, String)) + elseif field_number == 4 + encoding = OneOf(:coo_sparse, PB.decode(d, Ref{var"TensorInfo.CooSparse"})) + elseif field_number == 5 + encoding = OneOf(:composite_tensor, PB.decode(d, Ref{var"TensorInfo.CompositeTensor"})) + elseif field_number == 2 + dtype = PB.decode(d, var"#DataType".T) + elseif field_number == 3 + PB.decode!(d, tensor_shape) + else + PB.skip(d, wire_type) + end + end + return TensorInfo(encoding, dtype, tensor_shape[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::TensorInfo) + initpos = position(e.io) + if isnothing(x.encoding); + elseif x.encoding.name === :name + PB.encode(e, 1, x.encoding[]::String) + elseif x.encoding.name === :coo_sparse + PB.encode(e, 4, x.encoding[]::var"TensorInfo.CooSparse") + elseif x.encoding.name === :composite_tensor + PB.encode(e, 5, x.encoding[]::var"TensorInfo.CompositeTensor") + end + x.dtype != var"#DataType".DT_INVALID && PB.encode(e, 2, x.dtype) + !isnothing(x.tensor_shape) && PB.encode(e, 3, x.tensor_shape) + return position(e.io) - initpos +end +function PB._encoded_size(x::TensorInfo) + encoded_size = 0 + if isnothing(x.encoding); + elseif x.encoding.name === :name + encoded_size += PB._encoded_size(x.encoding[]::String, 1) + elseif x.encoding.name === :coo_sparse + encoded_size += PB._encoded_size(x.encoding[]::var"TensorInfo.CooSparse", 4) + elseif x.encoding.name === :composite_tensor + encoded_size += PB._encoded_size(x.encoding[]::var"TensorInfo.CompositeTensor", 5) + end + x.dtype != var"#DataType".DT_INVALID && (encoded_size += PB._encoded_size(x.dtype, 2)) + !isnothing(x.tensor_shape) && (encoded_size += PB._encoded_size(x.tensor_shape, 3)) + return encoded_size +end + +struct AssetFileDef <: var"##AbstractAssetFileDef" + tensor_info::Union{Nothing,TensorInfo} + filename::String +end +PB.default_values(::Type{AssetFileDef}) = (;tensor_info = nothing, filename = "") +PB.field_numbers(::Type{AssetFileDef}) = (;tensor_info = 1, filename = 2) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:AssetFileDef}) + tensor_info = Ref{Union{Nothing,TensorInfo}}(nothing) + filename = "" + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, tensor_info) + elseif field_number == 2 + filename = PB.decode(d, String) + else + PB.skip(d, wire_type) + end + end + return AssetFileDef(tensor_info[], filename) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::AssetFileDef) + initpos = position(e.io) + !isnothing(x.tensor_info) && PB.encode(e, 1, x.tensor_info) + !isempty(x.filename) && PB.encode(e, 2, x.filename) + return position(e.io) - initpos +end +function PB._encoded_size(x::AssetFileDef) + encoded_size = 0 + !isnothing(x.tensor_info) && (encoded_size += PB._encoded_size(x.tensor_info, 1)) + !isempty(x.filename) && (encoded_size += PB._encoded_size(x.filename, 2)) + return encoded_size +end + +struct var"TensorInfo.CompositeTensor" <: var"##AbstractTensorInfo.CompositeTensor" + type_spec::Union{Nothing,TypeSpecProto} + components::Vector{<:TensorInfo} +end +PB.default_values(::Type{var"TensorInfo.CompositeTensor"}) = (;type_spec = nothing, components = Vector{TensorInfo}()) +PB.field_numbers(::Type{var"TensorInfo.CompositeTensor"}) = (;type_spec = 1, components = 2) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"TensorInfo.CompositeTensor"}) + type_spec = Ref{Union{Nothing,TypeSpecProto}}(nothing) + components = PB.BufferedVector{TensorInfo}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, type_spec) + elseif field_number == 2 + PB.decode!(d, components) + else + PB.skip(d, wire_type) + end + end + return var"TensorInfo.CompositeTensor"(type_spec[], components[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"TensorInfo.CompositeTensor") + initpos = position(e.io) + !isnothing(x.type_spec) && PB.encode(e, 1, x.type_spec) + !isempty(x.components) && PB.encode(e, 2, x.components) + return position(e.io) - initpos +end +function PB._encoded_size(x::var"TensorInfo.CompositeTensor") + encoded_size = 0 + !isnothing(x.type_spec) && (encoded_size += PB._encoded_size(x.type_spec, 1)) + !isempty(x.components) && (encoded_size += PB._encoded_size(x.components, 2)) + return encoded_size +end diff --git a/src/protojl/tensorboard/tensorboard/node_def_pb.jl b/src/protojl/tensorboard/tensorboard/node_def_pb.jl new file mode 100644 index 0000000..abbd45d --- /dev/null +++ b/src/protojl/tensorboard/tensorboard/node_def_pb.jl @@ -0,0 +1,110 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:24.776 +# original file: /home/lior/TensorBoardLogger.jl/gen/proto/tensorboard/compat/proto/node_def.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export var"NodeDef.ExperimentalDebugInfo", NodeDef + +struct var"NodeDef.ExperimentalDebugInfo" + original_node_names::Vector{String} + original_func_names::Vector{String} +end +PB.default_values(::Type{var"NodeDef.ExperimentalDebugInfo"}) = (;original_node_names = Vector{String}(), original_func_names = Vector{String}()) +PB.field_numbers(::Type{var"NodeDef.ExperimentalDebugInfo"}) = (;original_node_names = 1, original_func_names = 2) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"NodeDef.ExperimentalDebugInfo"}) + original_node_names = PB.BufferedVector{String}() + original_func_names = PB.BufferedVector{String}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, original_node_names) + elseif field_number == 2 + PB.decode!(d, original_func_names) + else + PB.skip(d, wire_type) + end + end + return var"NodeDef.ExperimentalDebugInfo"(original_node_names[], original_func_names[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"NodeDef.ExperimentalDebugInfo") + initpos = position(e.io) + !isempty(x.original_node_names) && PB.encode(e, 1, x.original_node_names) + !isempty(x.original_func_names) && PB.encode(e, 2, x.original_func_names) + return position(e.io) - initpos +end +function PB._encoded_size(x::var"NodeDef.ExperimentalDebugInfo") + encoded_size = 0 + !isempty(x.original_node_names) && (encoded_size += PB._encoded_size(x.original_node_names, 1)) + !isempty(x.original_func_names) && (encoded_size += PB._encoded_size(x.original_func_names, 2)) + return encoded_size +end + +struct NodeDef + name::String + op::String + input::Vector{String} + device::String + attr::Dict{String,AttrValue} + experimental_debug_info::Union{Nothing,var"NodeDef.ExperimentalDebugInfo"} + experimental_type::Union{Nothing,FullTypeDef} +end +PB.default_values(::Type{NodeDef}) = (;name = "", op = "", input = Vector{String}(), device = "", attr = Dict{String,AttrValue}(), experimental_debug_info = nothing, experimental_type = nothing) +PB.field_numbers(::Type{NodeDef}) = (;name = 1, op = 2, input = 3, device = 4, attr = 5, experimental_debug_info = 6, experimental_type = 7) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:NodeDef}) + name = "" + op = "" + input = PB.BufferedVector{String}() + device = "" + attr = Dict{String,AttrValue}() + experimental_debug_info = Ref{Union{Nothing,var"NodeDef.ExperimentalDebugInfo"}}(nothing) + experimental_type = Ref{Union{Nothing,FullTypeDef}}(nothing) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + name = PB.decode(d, String) + elseif field_number == 2 + op = PB.decode(d, String) + elseif field_number == 3 + PB.decode!(d, input) + elseif field_number == 4 + device = PB.decode(d, String) + elseif field_number == 5 + PB.decode!(d, attr) + elseif field_number == 6 + PB.decode!(d, experimental_debug_info) + elseif field_number == 7 + PB.decode!(d, experimental_type) + else + PB.skip(d, wire_type) + end + end + return NodeDef(name, op, input[], device, attr, experimental_debug_info[], experimental_type[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::NodeDef) + initpos = position(e.io) + !isempty(x.name) && PB.encode(e, 1, x.name) + !isempty(x.op) && PB.encode(e, 2, x.op) + !isempty(x.input) && PB.encode(e, 3, x.input) + !isempty(x.device) && PB.encode(e, 4, x.device) + !isempty(x.attr) && PB.encode(e, 5, x.attr) + !isnothing(x.experimental_debug_info) && PB.encode(e, 6, x.experimental_debug_info) + !isnothing(x.experimental_type) && PB.encode(e, 7, x.experimental_type) + return position(e.io) - initpos +end +function PB._encoded_size(x::NodeDef) + encoded_size = 0 + !isempty(x.name) && (encoded_size += PB._encoded_size(x.name, 1)) + !isempty(x.op) && (encoded_size += PB._encoded_size(x.op, 2)) + !isempty(x.input) && (encoded_size += PB._encoded_size(x.input, 3)) + !isempty(x.device) && (encoded_size += PB._encoded_size(x.device, 4)) + !isempty(x.attr) && (encoded_size += PB._encoded_size(x.attr, 5)) + !isnothing(x.experimental_debug_info) && (encoded_size += PB._encoded_size(x.experimental_debug_info, 6)) + !isnothing(x.experimental_type) && (encoded_size += PB._encoded_size(x.experimental_type, 7)) + return encoded_size +end diff --git a/src/protojl/tensorboard/tensorboard/op_def_pb.jl b/src/protojl/tensorboard/tensorboard/op_def_pb.jl new file mode 100644 index 0000000..30ba31d --- /dev/null +++ b/src/protojl/tensorboard/tensorboard/op_def_pb.jl @@ -0,0 +1,320 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:24.776 +# original file: /home/lior/TensorBoardLogger.jl/gen/proto/tensorboard/compat/proto/op_def.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export var"OpDef.AttrDef", OpDeprecation, var"OpDef.ArgDef", OpDef, OpList + +struct var"OpDef.AttrDef" + name::String + var"#type"::String + default_value::Union{Nothing,AttrValue} + description::String + has_minimum::Bool + minimum::Int64 + allowed_values::Union{Nothing,AttrValue} +end +PB.default_values(::Type{var"OpDef.AttrDef"}) = (;name = "", var"#type" = "", default_value = nothing, description = "", has_minimum = false, minimum = zero(Int64), allowed_values = nothing) +PB.field_numbers(::Type{var"OpDef.AttrDef"}) = (;name = 1, var"#type" = 2, default_value = 3, description = 4, has_minimum = 5, minimum = 6, allowed_values = 7) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"OpDef.AttrDef"}) + name = "" + var"#type" = "" + default_value = Ref{Union{Nothing,AttrValue}}(nothing) + description = "" + has_minimum = false + minimum = zero(Int64) + allowed_values = Ref{Union{Nothing,AttrValue}}(nothing) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + name = PB.decode(d, String) + elseif field_number == 2 + var"#type" = PB.decode(d, String) + elseif field_number == 3 + PB.decode!(d, default_value) + elseif field_number == 4 + description = PB.decode(d, String) + elseif field_number == 5 + has_minimum = PB.decode(d, Bool) + elseif field_number == 6 + minimum = PB.decode(d, Int64) + elseif field_number == 7 + PB.decode!(d, allowed_values) + else + PB.skip(d, wire_type) + end + end + return var"OpDef.AttrDef"(name, var"#type", default_value[], description, has_minimum, minimum, allowed_values[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"OpDef.AttrDef") + initpos = position(e.io) + !isempty(x.name) && PB.encode(e, 1, x.name) + !isempty(x.var"#type") && PB.encode(e, 2, x.var"#type") + !isnothing(x.default_value) && PB.encode(e, 3, x.default_value) + !isempty(x.description) && PB.encode(e, 4, x.description) + x.has_minimum != false && PB.encode(e, 5, x.has_minimum) + x.minimum != zero(Int64) && PB.encode(e, 6, x.minimum) + !isnothing(x.allowed_values) && PB.encode(e, 7, x.allowed_values) + return position(e.io) - initpos +end +function PB._encoded_size(x::var"OpDef.AttrDef") + encoded_size = 0 + !isempty(x.name) && (encoded_size += PB._encoded_size(x.name, 1)) + !isempty(x.var"#type") && (encoded_size += PB._encoded_size(x.var"#type", 2)) + !isnothing(x.default_value) && (encoded_size += PB._encoded_size(x.default_value, 3)) + !isempty(x.description) && (encoded_size += PB._encoded_size(x.description, 4)) + x.has_minimum != false && (encoded_size += PB._encoded_size(x.has_minimum, 5)) + x.minimum != zero(Int64) && (encoded_size += PB._encoded_size(x.minimum, 6)) + !isnothing(x.allowed_values) && (encoded_size += PB._encoded_size(x.allowed_values, 7)) + return encoded_size +end + +struct OpDeprecation + version::Int32 + explanation::String +end +PB.default_values(::Type{OpDeprecation}) = (;version = zero(Int32), explanation = "") +PB.field_numbers(::Type{OpDeprecation}) = (;version = 1, explanation = 2) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:OpDeprecation}) + version = zero(Int32) + explanation = "" + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + version = PB.decode(d, Int32) + elseif field_number == 2 + explanation = PB.decode(d, String) + else + PB.skip(d, wire_type) + end + end + return OpDeprecation(version, explanation) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::OpDeprecation) + initpos = position(e.io) + x.version != zero(Int32) && PB.encode(e, 1, x.version) + !isempty(x.explanation) && PB.encode(e, 2, x.explanation) + return position(e.io) - initpos +end +function PB._encoded_size(x::OpDeprecation) + encoded_size = 0 + x.version != zero(Int32) && (encoded_size += PB._encoded_size(x.version, 1)) + !isempty(x.explanation) && (encoded_size += PB._encoded_size(x.explanation, 2)) + return encoded_size +end + +struct var"OpDef.ArgDef" + name::String + description::String + var"#type"::var"#DataType".T + type_attr::String + number_attr::String + type_list_attr::String + handle_data::Vector{var"ResourceHandleProto.DtypeAndShape"} + is_ref::Bool + experimental_full_type::Union{Nothing,FullTypeDef} +end +PB.default_values(::Type{var"OpDef.ArgDef"}) = (;name = "", description = "", var"#type" = var"#DataType".DT_INVALID, type_attr = "", number_attr = "", type_list_attr = "", handle_data = Vector{var"ResourceHandleProto.DtypeAndShape"}(), is_ref = false, experimental_full_type = nothing) +PB.field_numbers(::Type{var"OpDef.ArgDef"}) = (;name = 1, description = 2, var"#type" = 3, type_attr = 4, number_attr = 5, type_list_attr = 6, handle_data = 7, is_ref = 16, experimental_full_type = 17) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"OpDef.ArgDef"}) + name = "" + description = "" + var"#type" = var"#DataType".DT_INVALID + type_attr = "" + number_attr = "" + type_list_attr = "" + handle_data = PB.BufferedVector{var"ResourceHandleProto.DtypeAndShape"}() + is_ref = false + experimental_full_type = Ref{Union{Nothing,FullTypeDef}}(nothing) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + name = PB.decode(d, String) + elseif field_number == 2 + description = PB.decode(d, String) + elseif field_number == 3 + var"#type" = PB.decode(d, var"#DataType".T) + elseif field_number == 4 + type_attr = PB.decode(d, String) + elseif field_number == 5 + number_attr = PB.decode(d, String) + elseif field_number == 6 + type_list_attr = PB.decode(d, String) + elseif field_number == 7 + PB.decode!(d, handle_data) + elseif field_number == 16 + is_ref = PB.decode(d, Bool) + elseif field_number == 17 + PB.decode!(d, experimental_full_type) + else + PB.skip(d, wire_type) + end + end + return var"OpDef.ArgDef"(name, description, var"#type", type_attr, number_attr, type_list_attr, handle_data[], is_ref, experimental_full_type[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"OpDef.ArgDef") + initpos = position(e.io) + !isempty(x.name) && PB.encode(e, 1, x.name) + !isempty(x.description) && PB.encode(e, 2, x.description) + x.var"#type" != var"#DataType".DT_INVALID && PB.encode(e, 3, x.var"#type") + !isempty(x.type_attr) && PB.encode(e, 4, x.type_attr) + !isempty(x.number_attr) && PB.encode(e, 5, x.number_attr) + !isempty(x.type_list_attr) && PB.encode(e, 6, x.type_list_attr) + !isempty(x.handle_data) && PB.encode(e, 7, x.handle_data) + x.is_ref != false && PB.encode(e, 16, x.is_ref) + !isnothing(x.experimental_full_type) && PB.encode(e, 17, x.experimental_full_type) + return position(e.io) - initpos +end +function PB._encoded_size(x::var"OpDef.ArgDef") + encoded_size = 0 + !isempty(x.name) && (encoded_size += PB._encoded_size(x.name, 1)) + !isempty(x.description) && (encoded_size += PB._encoded_size(x.description, 2)) + x.var"#type" != var"#DataType".DT_INVALID && (encoded_size += PB._encoded_size(x.var"#type", 3)) + !isempty(x.type_attr) && (encoded_size += PB._encoded_size(x.type_attr, 4)) + !isempty(x.number_attr) && (encoded_size += PB._encoded_size(x.number_attr, 5)) + !isempty(x.type_list_attr) && (encoded_size += PB._encoded_size(x.type_list_attr, 6)) + !isempty(x.handle_data) && (encoded_size += PB._encoded_size(x.handle_data, 7)) + x.is_ref != false && (encoded_size += PB._encoded_size(x.is_ref, 16)) + !isnothing(x.experimental_full_type) && (encoded_size += PB._encoded_size(x.experimental_full_type, 17)) + return encoded_size +end + +struct OpDef + name::String + input_arg::Vector{var"OpDef.ArgDef"} + output_arg::Vector{var"OpDef.ArgDef"} + control_output::Vector{String} + attr::Vector{var"OpDef.AttrDef"} + deprecation::Union{Nothing,OpDeprecation} + summary::String + description::String + is_commutative::Bool + is_aggregate::Bool + is_stateful::Bool + allows_uninitialized_input::Bool + is_distributed_communication::Bool +end +PB.default_values(::Type{OpDef}) = (;name = "", input_arg = Vector{var"OpDef.ArgDef"}(), output_arg = Vector{var"OpDef.ArgDef"}(), control_output = Vector{String}(), attr = Vector{var"OpDef.AttrDef"}(), deprecation = nothing, summary = "", description = "", is_commutative = false, is_aggregate = false, is_stateful = false, allows_uninitialized_input = false, is_distributed_communication = false) +PB.field_numbers(::Type{OpDef}) = (;name = 1, input_arg = 2, output_arg = 3, control_output = 20, attr = 4, deprecation = 8, summary = 5, description = 6, is_commutative = 18, is_aggregate = 16, is_stateful = 17, allows_uninitialized_input = 19, is_distributed_communication = 21) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:OpDef}) + name = "" + input_arg = PB.BufferedVector{var"OpDef.ArgDef"}() + output_arg = PB.BufferedVector{var"OpDef.ArgDef"}() + control_output = PB.BufferedVector{String}() + attr = PB.BufferedVector{var"OpDef.AttrDef"}() + deprecation = Ref{Union{Nothing,OpDeprecation}}(nothing) + summary = "" + description = "" + is_commutative = false + is_aggregate = false + is_stateful = false + allows_uninitialized_input = false + is_distributed_communication = false + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + name = PB.decode(d, String) + elseif field_number == 2 + PB.decode!(d, input_arg) + elseif field_number == 3 + PB.decode!(d, output_arg) + elseif field_number == 20 + PB.decode!(d, control_output) + elseif field_number == 4 + PB.decode!(d, attr) + elseif field_number == 8 + PB.decode!(d, deprecation) + elseif field_number == 5 + summary = PB.decode(d, String) + elseif field_number == 6 + description = PB.decode(d, String) + elseif field_number == 18 + is_commutative = PB.decode(d, Bool) + elseif field_number == 16 + is_aggregate = PB.decode(d, Bool) + elseif field_number == 17 + is_stateful = PB.decode(d, Bool) + elseif field_number == 19 + allows_uninitialized_input = PB.decode(d, Bool) + elseif field_number == 21 + is_distributed_communication = PB.decode(d, Bool) + else + PB.skip(d, wire_type) + end + end + return OpDef(name, input_arg[], output_arg[], control_output[], attr[], deprecation[], summary, description, is_commutative, is_aggregate, is_stateful, allows_uninitialized_input, is_distributed_communication) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::OpDef) + initpos = position(e.io) + !isempty(x.name) && PB.encode(e, 1, x.name) + !isempty(x.input_arg) && PB.encode(e, 2, x.input_arg) + !isempty(x.output_arg) && PB.encode(e, 3, x.output_arg) + !isempty(x.control_output) && PB.encode(e, 20, x.control_output) + !isempty(x.attr) && PB.encode(e, 4, x.attr) + !isnothing(x.deprecation) && PB.encode(e, 8, x.deprecation) + !isempty(x.summary) && PB.encode(e, 5, x.summary) + !isempty(x.description) && PB.encode(e, 6, x.description) + x.is_commutative != false && PB.encode(e, 18, x.is_commutative) + x.is_aggregate != false && PB.encode(e, 16, x.is_aggregate) + x.is_stateful != false && PB.encode(e, 17, x.is_stateful) + x.allows_uninitialized_input != false && PB.encode(e, 19, x.allows_uninitialized_input) + x.is_distributed_communication != false && PB.encode(e, 21, x.is_distributed_communication) + return position(e.io) - initpos +end +function PB._encoded_size(x::OpDef) + encoded_size = 0 + !isempty(x.name) && (encoded_size += PB._encoded_size(x.name, 1)) + !isempty(x.input_arg) && (encoded_size += PB._encoded_size(x.input_arg, 2)) + !isempty(x.output_arg) && (encoded_size += PB._encoded_size(x.output_arg, 3)) + !isempty(x.control_output) && (encoded_size += PB._encoded_size(x.control_output, 20)) + !isempty(x.attr) && (encoded_size += PB._encoded_size(x.attr, 4)) + !isnothing(x.deprecation) && (encoded_size += PB._encoded_size(x.deprecation, 8)) + !isempty(x.summary) && (encoded_size += PB._encoded_size(x.summary, 5)) + !isempty(x.description) && (encoded_size += PB._encoded_size(x.description, 6)) + x.is_commutative != false && (encoded_size += PB._encoded_size(x.is_commutative, 18)) + x.is_aggregate != false && (encoded_size += PB._encoded_size(x.is_aggregate, 16)) + x.is_stateful != false && (encoded_size += PB._encoded_size(x.is_stateful, 17)) + x.allows_uninitialized_input != false && (encoded_size += PB._encoded_size(x.allows_uninitialized_input, 19)) + x.is_distributed_communication != false && (encoded_size += PB._encoded_size(x.is_distributed_communication, 21)) + return encoded_size +end + +struct OpList + op::Vector{OpDef} +end +PB.default_values(::Type{OpList}) = (;op = Vector{OpDef}()) +PB.field_numbers(::Type{OpList}) = (;op = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:OpList}) + op = PB.BufferedVector{OpDef}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, op) + else + PB.skip(d, wire_type) + end + end + return OpList(op[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::OpList) + initpos = position(e.io) + !isempty(x.op) && PB.encode(e, 1, x.op) + return position(e.io) - initpos +end +function PB._encoded_size(x::OpList) + encoded_size = 0 + !isempty(x.op) && (encoded_size += PB._encoded_size(x.op, 1)) + return encoded_size +end diff --git a/src/protojl/tensorboard/tensorboard/resource_handle_pb.jl b/src/protojl/tensorboard/tensorboard/resource_handle_pb.jl new file mode 100644 index 0000000..fa46f3b --- /dev/null +++ b/src/protojl/tensorboard/tensorboard/resource_handle_pb.jl @@ -0,0 +1,105 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:24.424 +# original file: /home/lior/TensorBoardLogger.jl/gen/proto/tensorboard/compat/proto/resource_handle.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export var"ResourceHandleProto.DtypeAndShape", ResourceHandleProto + +struct var"ResourceHandleProto.DtypeAndShape" + dtype::var"#DataType".T + shape::Union{Nothing,TensorShapeProto} +end +PB.default_values(::Type{var"ResourceHandleProto.DtypeAndShape"}) = (;dtype = var"#DataType".DT_INVALID, shape = nothing) +PB.field_numbers(::Type{var"ResourceHandleProto.DtypeAndShape"}) = (;dtype = 1, shape = 2) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"ResourceHandleProto.DtypeAndShape"}) + dtype = var"#DataType".DT_INVALID + shape = Ref{Union{Nothing,TensorShapeProto}}(nothing) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + dtype = PB.decode(d, var"#DataType".T) + elseif field_number == 2 + PB.decode!(d, shape) + else + PB.skip(d, wire_type) + end + end + return var"ResourceHandleProto.DtypeAndShape"(dtype, shape[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"ResourceHandleProto.DtypeAndShape") + initpos = position(e.io) + x.dtype != var"#DataType".DT_INVALID && PB.encode(e, 1, x.dtype) + !isnothing(x.shape) && PB.encode(e, 2, x.shape) + return position(e.io) - initpos +end +function PB._encoded_size(x::var"ResourceHandleProto.DtypeAndShape") + encoded_size = 0 + x.dtype != var"#DataType".DT_INVALID && (encoded_size += PB._encoded_size(x.dtype, 1)) + !isnothing(x.shape) && (encoded_size += PB._encoded_size(x.shape, 2)) + return encoded_size +end + +struct ResourceHandleProto + device::String + container::String + name::String + hash_code::UInt64 + maybe_type_name::String + dtypes_and_shapes::Vector{var"ResourceHandleProto.DtypeAndShape"} +end +PB.reserved_fields(::Type{ResourceHandleProto}) = (names = String[], numbers = Union{Int,UnitRange{Int}}[7]) +PB.default_values(::Type{ResourceHandleProto}) = (;device = "", container = "", name = "", hash_code = zero(UInt64), maybe_type_name = "", dtypes_and_shapes = Vector{var"ResourceHandleProto.DtypeAndShape"}()) +PB.field_numbers(::Type{ResourceHandleProto}) = (;device = 1, container = 2, name = 3, hash_code = 4, maybe_type_name = 5, dtypes_and_shapes = 6) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:ResourceHandleProto}) + device = "" + container = "" + name = "" + hash_code = zero(UInt64) + maybe_type_name = "" + dtypes_and_shapes = PB.BufferedVector{var"ResourceHandleProto.DtypeAndShape"}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + device = PB.decode(d, String) + elseif field_number == 2 + container = PB.decode(d, String) + elseif field_number == 3 + name = PB.decode(d, String) + elseif field_number == 4 + hash_code = PB.decode(d, UInt64) + elseif field_number == 5 + maybe_type_name = PB.decode(d, String) + elseif field_number == 6 + PB.decode!(d, dtypes_and_shapes) + else + PB.skip(d, wire_type) + end + end + return ResourceHandleProto(device, container, name, hash_code, maybe_type_name, dtypes_and_shapes[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::ResourceHandleProto) + initpos = position(e.io) + !isempty(x.device) && PB.encode(e, 1, x.device) + !isempty(x.container) && PB.encode(e, 2, x.container) + !isempty(x.name) && PB.encode(e, 3, x.name) + x.hash_code != zero(UInt64) && PB.encode(e, 4, x.hash_code) + !isempty(x.maybe_type_name) && PB.encode(e, 5, x.maybe_type_name) + !isempty(x.dtypes_and_shapes) && PB.encode(e, 6, x.dtypes_and_shapes) + return position(e.io) - initpos +end +function PB._encoded_size(x::ResourceHandleProto) + encoded_size = 0 + !isempty(x.device) && (encoded_size += PB._encoded_size(x.device, 1)) + !isempty(x.container) && (encoded_size += PB._encoded_size(x.container, 2)) + !isempty(x.name) && (encoded_size += PB._encoded_size(x.name, 3)) + x.hash_code != zero(UInt64) && (encoded_size += PB._encoded_size(x.hash_code, 4)) + !isempty(x.maybe_type_name) && (encoded_size += PB._encoded_size(x.maybe_type_name, 5)) + !isempty(x.dtypes_and_shapes) && (encoded_size += PB._encoded_size(x.dtypes_and_shapes, 6)) + return encoded_size +end diff --git a/src/protojl/tensorboard/tensorboard/rewriter_config_pb.jl b/src/protojl/tensorboard/tensorboard/rewriter_config_pb.jl new file mode 100644 index 0000000..3de7524 --- /dev/null +++ b/src/protojl/tensorboard/tensorboard/rewriter_config_pb.jl @@ -0,0 +1,361 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:24.775 +# original file: /home/lior/TensorBoardLogger.jl/gen/proto/tensorboard/compat/proto/rewriter_config.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export var"RewriterConfig.CustomGraphOptimizer", ScopedAllocatorOptions +export var"RewriterConfig.CpuLayout", var"RewriterConfig.Toggle" +export var"RewriterConfig.NumIterationsType", var"RewriterConfig.MemOptType" +export AutoParallelOptions, RewriterConfig + +struct var"RewriterConfig.CustomGraphOptimizer" + name::String + parameter_map::Dict{String,AttrValue} +end +PB.default_values(::Type{var"RewriterConfig.CustomGraphOptimizer"}) = (;name = "", parameter_map = Dict{String,AttrValue}()) +PB.field_numbers(::Type{var"RewriterConfig.CustomGraphOptimizer"}) = (;name = 1, parameter_map = 2) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"RewriterConfig.CustomGraphOptimizer"}) + name = "" + parameter_map = Dict{String,AttrValue}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + name = PB.decode(d, String) + elseif field_number == 2 + PB.decode!(d, parameter_map) + else + PB.skip(d, wire_type) + end + end + return var"RewriterConfig.CustomGraphOptimizer"(name, parameter_map) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"RewriterConfig.CustomGraphOptimizer") + initpos = position(e.io) + !isempty(x.name) && PB.encode(e, 1, x.name) + !isempty(x.parameter_map) && PB.encode(e, 2, x.parameter_map) + return position(e.io) - initpos +end +function PB._encoded_size(x::var"RewriterConfig.CustomGraphOptimizer") + encoded_size = 0 + !isempty(x.name) && (encoded_size += PB._encoded_size(x.name, 1)) + !isempty(x.parameter_map) && (encoded_size += PB._encoded_size(x.parameter_map, 2)) + return encoded_size +end + +struct ScopedAllocatorOptions + enable_op::Vector{String} +end +PB.default_values(::Type{ScopedAllocatorOptions}) = (;enable_op = Vector{String}()) +PB.field_numbers(::Type{ScopedAllocatorOptions}) = (;enable_op = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:ScopedAllocatorOptions}) + enable_op = PB.BufferedVector{String}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, enable_op) + else + PB.skip(d, wire_type) + end + end + return ScopedAllocatorOptions(enable_op[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::ScopedAllocatorOptions) + initpos = position(e.io) + !isempty(x.enable_op) && PB.encode(e, 1, x.enable_op) + return position(e.io) - initpos +end +function PB._encoded_size(x::ScopedAllocatorOptions) + encoded_size = 0 + !isempty(x.enable_op) && (encoded_size += PB._encoded_size(x.enable_op, 1)) + return encoded_size +end + +@enumx var"RewriterConfig.CpuLayout" NO_CONVERSION_ON_CPU=0 NCHW_TO_NHWC=1 NHWC_TO_NCHW=2 + +@enumx var"RewriterConfig.Toggle" DEFAULT=0 ON=1 OFF=2 AGGRESSIVE=3 EXPERIMENTAL_MLIR=4 EXPERIMENTAL_BOTH=5 + +@enumx var"RewriterConfig.NumIterationsType" DEFAULT_NUM_ITERS=0 ONE=1 TWO=2 + +@enumx var"RewriterConfig.MemOptType" DEFAULT_MEM_OPT=0 NO_MEM_OPT=1 MANUAL=2 SWAPPING_HEURISTICS=4 RECOMPUTATION_HEURISTICS=5 SCHEDULING_HEURISTICS=6 HEURISTICS=3 + +struct AutoParallelOptions + enable::Bool + num_replicas::Int32 +end +PB.default_values(::Type{AutoParallelOptions}) = (;enable = false, num_replicas = zero(Int32)) +PB.field_numbers(::Type{AutoParallelOptions}) = (;enable = 1, num_replicas = 2) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:AutoParallelOptions}) + enable = false + num_replicas = zero(Int32) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + enable = PB.decode(d, Bool) + elseif field_number == 2 + num_replicas = PB.decode(d, Int32) + else + PB.skip(d, wire_type) + end + end + return AutoParallelOptions(enable, num_replicas) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::AutoParallelOptions) + initpos = position(e.io) + x.enable != false && PB.encode(e, 1, x.enable) + x.num_replicas != zero(Int32) && PB.encode(e, 2, x.num_replicas) + return position(e.io) - initpos +end +function PB._encoded_size(x::AutoParallelOptions) + encoded_size = 0 + x.enable != false && (encoded_size += PB._encoded_size(x.enable, 1)) + x.num_replicas != zero(Int32) && (encoded_size += PB._encoded_size(x.num_replicas, 2)) + return encoded_size +end + +struct RewriterConfig + cpu_layout_conversion::var"RewriterConfig.CpuLayout".T + layout_optimizer::var"RewriterConfig.Toggle".T + constant_folding::var"RewriterConfig.Toggle".T + shape_optimization::var"RewriterConfig.Toggle".T + remapping::var"RewriterConfig.Toggle".T + common_subgraph_elimination::var"RewriterConfig.Toggle".T + arithmetic_optimization::var"RewriterConfig.Toggle".T + dependency_optimization::var"RewriterConfig.Toggle".T + loop_optimization::var"RewriterConfig.Toggle".T + function_optimization::var"RewriterConfig.Toggle".T + debug_stripper::var"RewriterConfig.Toggle".T + disable_model_pruning::Bool + scoped_allocator_optimization::var"RewriterConfig.Toggle".T + pin_to_host_optimization::var"RewriterConfig.Toggle".T + implementation_selector::var"RewriterConfig.Toggle".T + auto_mixed_precision::var"RewriterConfig.Toggle".T + auto_mixed_precision_mkl::var"RewriterConfig.Toggle".T + auto_mixed_precision_onednn_bfloat16::var"RewriterConfig.Toggle".T + auto_mixed_precision_cpu::var"RewriterConfig.Toggle".T + disable_meta_optimizer::Bool + use_plugin_optimizers::var"RewriterConfig.Toggle".T + experimental_conditional_code_motion::var"RewriterConfig.Toggle".T + meta_optimizer_iterations::var"RewriterConfig.NumIterationsType".T + min_graph_nodes::Int32 + experimental_disable_compressed_tensor_optimization::Bool + experimental_disable_folding_quantization_emulation::Bool + memory_optimization::var"RewriterConfig.MemOptType".T + memory_optimizer_target_node_name_scope::String + meta_optimizer_timeout_ms::Int64 + auto_parallel::Union{Nothing,AutoParallelOptions} + fail_on_optimizer_errors::Bool + scoped_allocator_opts::Union{Nothing,ScopedAllocatorOptions} + optimizers::Vector{String} + custom_optimizers::Vector{var"RewriterConfig.CustomGraphOptimizer"} + inter_optimizer_verifier_config::Union{Nothing,VerifierConfig} + post_optimization_verifier_config::Union{Nothing,VerifierConfig} +end +PB.default_values(::Type{RewriterConfig}) = (;cpu_layout_conversion = var"RewriterConfig.CpuLayout".NO_CONVERSION_ON_CPU, layout_optimizer = var"RewriterConfig.Toggle".DEFAULT, constant_folding = var"RewriterConfig.Toggle".DEFAULT, shape_optimization = var"RewriterConfig.Toggle".DEFAULT, remapping = var"RewriterConfig.Toggle".DEFAULT, common_subgraph_elimination = var"RewriterConfig.Toggle".DEFAULT, arithmetic_optimization = var"RewriterConfig.Toggle".DEFAULT, dependency_optimization = var"RewriterConfig.Toggle".DEFAULT, loop_optimization = var"RewriterConfig.Toggle".DEFAULT, function_optimization = var"RewriterConfig.Toggle".DEFAULT, debug_stripper = var"RewriterConfig.Toggle".DEFAULT, disable_model_pruning = false, scoped_allocator_optimization = var"RewriterConfig.Toggle".DEFAULT, pin_to_host_optimization = var"RewriterConfig.Toggle".DEFAULT, implementation_selector = var"RewriterConfig.Toggle".DEFAULT, auto_mixed_precision = var"RewriterConfig.Toggle".DEFAULT, auto_mixed_precision_mkl = var"RewriterConfig.Toggle".DEFAULT, auto_mixed_precision_onednn_bfloat16 = var"RewriterConfig.Toggle".DEFAULT, auto_mixed_precision_cpu = var"RewriterConfig.Toggle".DEFAULT, disable_meta_optimizer = false, use_plugin_optimizers = var"RewriterConfig.Toggle".DEFAULT, experimental_conditional_code_motion = var"RewriterConfig.Toggle".DEFAULT, meta_optimizer_iterations = var"RewriterConfig.NumIterationsType".DEFAULT_NUM_ITERS, min_graph_nodes = zero(Int32), experimental_disable_compressed_tensor_optimization = false, experimental_disable_folding_quantization_emulation = false, memory_optimization = var"RewriterConfig.MemOptType".DEFAULT_MEM_OPT, memory_optimizer_target_node_name_scope = "", meta_optimizer_timeout_ms = zero(Int64), auto_parallel = nothing, fail_on_optimizer_errors = false, scoped_allocator_opts = nothing, optimizers = Vector{String}(), custom_optimizers = Vector{var"RewriterConfig.CustomGraphOptimizer"}(), inter_optimizer_verifier_config = nothing, post_optimization_verifier_config = nothing) +PB.field_numbers(::Type{RewriterConfig}) = (;cpu_layout_conversion = 50, layout_optimizer = 1, constant_folding = 3, shape_optimization = 13, remapping = 14, common_subgraph_elimination = 24, arithmetic_optimization = 7, dependency_optimization = 8, loop_optimization = 9, function_optimization = 10, debug_stripper = 11, disable_model_pruning = 2, scoped_allocator_optimization = 15, pin_to_host_optimization = 18, implementation_selector = 22, auto_mixed_precision = 23, auto_mixed_precision_mkl = 25, auto_mixed_precision_onednn_bfloat16 = 31, auto_mixed_precision_cpu = 29, disable_meta_optimizer = 19, use_plugin_optimizers = 28, experimental_conditional_code_motion = 30, meta_optimizer_iterations = 12, min_graph_nodes = 17, experimental_disable_compressed_tensor_optimization = 26, experimental_disable_folding_quantization_emulation = 27, memory_optimization = 4, memory_optimizer_target_node_name_scope = 6, meta_optimizer_timeout_ms = 20, auto_parallel = 5, fail_on_optimizer_errors = 21, scoped_allocator_opts = 16, optimizers = 100, custom_optimizers = 200, inter_optimizer_verifier_config = 300, post_optimization_verifier_config = 301) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:RewriterConfig}) + cpu_layout_conversion = var"RewriterConfig.CpuLayout".NO_CONVERSION_ON_CPU + layout_optimizer = var"RewriterConfig.Toggle".DEFAULT + constant_folding = var"RewriterConfig.Toggle".DEFAULT + shape_optimization = var"RewriterConfig.Toggle".DEFAULT + remapping = var"RewriterConfig.Toggle".DEFAULT + common_subgraph_elimination = var"RewriterConfig.Toggle".DEFAULT + arithmetic_optimization = var"RewriterConfig.Toggle".DEFAULT + dependency_optimization = var"RewriterConfig.Toggle".DEFAULT + loop_optimization = var"RewriterConfig.Toggle".DEFAULT + function_optimization = var"RewriterConfig.Toggle".DEFAULT + debug_stripper = var"RewriterConfig.Toggle".DEFAULT + disable_model_pruning = false + scoped_allocator_optimization = var"RewriterConfig.Toggle".DEFAULT + pin_to_host_optimization = var"RewriterConfig.Toggle".DEFAULT + implementation_selector = var"RewriterConfig.Toggle".DEFAULT + auto_mixed_precision = var"RewriterConfig.Toggle".DEFAULT + auto_mixed_precision_mkl = var"RewriterConfig.Toggle".DEFAULT + auto_mixed_precision_onednn_bfloat16 = var"RewriterConfig.Toggle".DEFAULT + auto_mixed_precision_cpu = var"RewriterConfig.Toggle".DEFAULT + disable_meta_optimizer = false + use_plugin_optimizers = var"RewriterConfig.Toggle".DEFAULT + experimental_conditional_code_motion = var"RewriterConfig.Toggle".DEFAULT + meta_optimizer_iterations = var"RewriterConfig.NumIterationsType".DEFAULT_NUM_ITERS + min_graph_nodes = zero(Int32) + experimental_disable_compressed_tensor_optimization = false + experimental_disable_folding_quantization_emulation = false + memory_optimization = var"RewriterConfig.MemOptType".DEFAULT_MEM_OPT + memory_optimizer_target_node_name_scope = "" + meta_optimizer_timeout_ms = zero(Int64) + auto_parallel = Ref{Union{Nothing,AutoParallelOptions}}(nothing) + fail_on_optimizer_errors = false + scoped_allocator_opts = Ref{Union{Nothing,ScopedAllocatorOptions}}(nothing) + optimizers = PB.BufferedVector{String}() + custom_optimizers = PB.BufferedVector{var"RewriterConfig.CustomGraphOptimizer"}() + inter_optimizer_verifier_config = Ref{Union{Nothing,VerifierConfig}}(nothing) + post_optimization_verifier_config = Ref{Union{Nothing,VerifierConfig}}(nothing) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 50 + cpu_layout_conversion = PB.decode(d, var"RewriterConfig.CpuLayout".T) + elseif field_number == 1 + layout_optimizer = PB.decode(d, var"RewriterConfig.Toggle".T) + elseif field_number == 3 + constant_folding = PB.decode(d, var"RewriterConfig.Toggle".T) + elseif field_number == 13 + shape_optimization = PB.decode(d, var"RewriterConfig.Toggle".T) + elseif field_number == 14 + remapping = PB.decode(d, var"RewriterConfig.Toggle".T) + elseif field_number == 24 + common_subgraph_elimination = PB.decode(d, var"RewriterConfig.Toggle".T) + elseif field_number == 7 + arithmetic_optimization = PB.decode(d, var"RewriterConfig.Toggle".T) + elseif field_number == 8 + dependency_optimization = PB.decode(d, var"RewriterConfig.Toggle".T) + elseif field_number == 9 + loop_optimization = PB.decode(d, var"RewriterConfig.Toggle".T) + elseif field_number == 10 + function_optimization = PB.decode(d, var"RewriterConfig.Toggle".T) + elseif field_number == 11 + debug_stripper = PB.decode(d, var"RewriterConfig.Toggle".T) + elseif field_number == 2 + disable_model_pruning = PB.decode(d, Bool) + elseif field_number == 15 + scoped_allocator_optimization = PB.decode(d, var"RewriterConfig.Toggle".T) + elseif field_number == 18 + pin_to_host_optimization = PB.decode(d, var"RewriterConfig.Toggle".T) + elseif field_number == 22 + implementation_selector = PB.decode(d, var"RewriterConfig.Toggle".T) + elseif field_number == 23 + auto_mixed_precision = PB.decode(d, var"RewriterConfig.Toggle".T) + elseif field_number == 25 + auto_mixed_precision_mkl = PB.decode(d, var"RewriterConfig.Toggle".T) + elseif field_number == 31 + auto_mixed_precision_onednn_bfloat16 = PB.decode(d, var"RewriterConfig.Toggle".T) + elseif field_number == 29 + auto_mixed_precision_cpu = PB.decode(d, var"RewriterConfig.Toggle".T) + elseif field_number == 19 + disable_meta_optimizer = PB.decode(d, Bool) + elseif field_number == 28 + use_plugin_optimizers = PB.decode(d, var"RewriterConfig.Toggle".T) + elseif field_number == 30 + experimental_conditional_code_motion = PB.decode(d, var"RewriterConfig.Toggle".T) + elseif field_number == 12 + meta_optimizer_iterations = PB.decode(d, var"RewriterConfig.NumIterationsType".T) + elseif field_number == 17 + min_graph_nodes = PB.decode(d, Int32) + elseif field_number == 26 + experimental_disable_compressed_tensor_optimization = PB.decode(d, Bool) + elseif field_number == 27 + experimental_disable_folding_quantization_emulation = PB.decode(d, Bool) + elseif field_number == 4 + memory_optimization = PB.decode(d, var"RewriterConfig.MemOptType".T) + elseif field_number == 6 + memory_optimizer_target_node_name_scope = PB.decode(d, String) + elseif field_number == 20 + meta_optimizer_timeout_ms = PB.decode(d, Int64) + elseif field_number == 5 + PB.decode!(d, auto_parallel) + elseif field_number == 21 + fail_on_optimizer_errors = PB.decode(d, Bool) + elseif field_number == 16 + PB.decode!(d, scoped_allocator_opts) + elseif field_number == 100 + PB.decode!(d, optimizers) + elseif field_number == 200 + PB.decode!(d, custom_optimizers) + elseif field_number == 300 + PB.decode!(d, inter_optimizer_verifier_config) + elseif field_number == 301 + PB.decode!(d, post_optimization_verifier_config) + else + PB.skip(d, wire_type) + end + end + return RewriterConfig(cpu_layout_conversion, layout_optimizer, constant_folding, shape_optimization, remapping, common_subgraph_elimination, arithmetic_optimization, dependency_optimization, loop_optimization, function_optimization, debug_stripper, disable_model_pruning, scoped_allocator_optimization, pin_to_host_optimization, implementation_selector, auto_mixed_precision, auto_mixed_precision_mkl, auto_mixed_precision_onednn_bfloat16, auto_mixed_precision_cpu, disable_meta_optimizer, use_plugin_optimizers, experimental_conditional_code_motion, meta_optimizer_iterations, min_graph_nodes, experimental_disable_compressed_tensor_optimization, experimental_disable_folding_quantization_emulation, memory_optimization, memory_optimizer_target_node_name_scope, meta_optimizer_timeout_ms, auto_parallel[], fail_on_optimizer_errors, scoped_allocator_opts[], optimizers[], custom_optimizers[], inter_optimizer_verifier_config[], post_optimization_verifier_config[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::RewriterConfig) + initpos = position(e.io) + x.cpu_layout_conversion != var"RewriterConfig.CpuLayout".NO_CONVERSION_ON_CPU && PB.encode(e, 50, x.cpu_layout_conversion) + x.layout_optimizer != var"RewriterConfig.Toggle".DEFAULT && PB.encode(e, 1, x.layout_optimizer) + x.constant_folding != var"RewriterConfig.Toggle".DEFAULT && PB.encode(e, 3, x.constant_folding) + x.shape_optimization != var"RewriterConfig.Toggle".DEFAULT && PB.encode(e, 13, x.shape_optimization) + x.remapping != var"RewriterConfig.Toggle".DEFAULT && PB.encode(e, 14, x.remapping) + x.common_subgraph_elimination != var"RewriterConfig.Toggle".DEFAULT && PB.encode(e, 24, x.common_subgraph_elimination) + x.arithmetic_optimization != var"RewriterConfig.Toggle".DEFAULT && PB.encode(e, 7, x.arithmetic_optimization) + x.dependency_optimization != var"RewriterConfig.Toggle".DEFAULT && PB.encode(e, 8, x.dependency_optimization) + x.loop_optimization != var"RewriterConfig.Toggle".DEFAULT && PB.encode(e, 9, x.loop_optimization) + x.function_optimization != var"RewriterConfig.Toggle".DEFAULT && PB.encode(e, 10, x.function_optimization) + x.debug_stripper != var"RewriterConfig.Toggle".DEFAULT && PB.encode(e, 11, x.debug_stripper) + x.disable_model_pruning != false && PB.encode(e, 2, x.disable_model_pruning) + x.scoped_allocator_optimization != var"RewriterConfig.Toggle".DEFAULT && PB.encode(e, 15, x.scoped_allocator_optimization) + x.pin_to_host_optimization != var"RewriterConfig.Toggle".DEFAULT && PB.encode(e, 18, x.pin_to_host_optimization) + x.implementation_selector != var"RewriterConfig.Toggle".DEFAULT && PB.encode(e, 22, x.implementation_selector) + x.auto_mixed_precision != var"RewriterConfig.Toggle".DEFAULT && PB.encode(e, 23, x.auto_mixed_precision) + x.auto_mixed_precision_mkl != var"RewriterConfig.Toggle".DEFAULT && PB.encode(e, 25, x.auto_mixed_precision_mkl) + x.auto_mixed_precision_onednn_bfloat16 != var"RewriterConfig.Toggle".DEFAULT && PB.encode(e, 31, x.auto_mixed_precision_onednn_bfloat16) + x.auto_mixed_precision_cpu != var"RewriterConfig.Toggle".DEFAULT && PB.encode(e, 29, x.auto_mixed_precision_cpu) + x.disable_meta_optimizer != false && PB.encode(e, 19, x.disable_meta_optimizer) + x.use_plugin_optimizers != var"RewriterConfig.Toggle".DEFAULT && PB.encode(e, 28, x.use_plugin_optimizers) + x.experimental_conditional_code_motion != var"RewriterConfig.Toggle".DEFAULT && PB.encode(e, 30, x.experimental_conditional_code_motion) + x.meta_optimizer_iterations != var"RewriterConfig.NumIterationsType".DEFAULT_NUM_ITERS && PB.encode(e, 12, x.meta_optimizer_iterations) + x.min_graph_nodes != zero(Int32) && PB.encode(e, 17, x.min_graph_nodes) + x.experimental_disable_compressed_tensor_optimization != false && PB.encode(e, 26, x.experimental_disable_compressed_tensor_optimization) + x.experimental_disable_folding_quantization_emulation != false && PB.encode(e, 27, x.experimental_disable_folding_quantization_emulation) + x.memory_optimization != var"RewriterConfig.MemOptType".DEFAULT_MEM_OPT && PB.encode(e, 4, x.memory_optimization) + !isempty(x.memory_optimizer_target_node_name_scope) && PB.encode(e, 6, x.memory_optimizer_target_node_name_scope) + x.meta_optimizer_timeout_ms != zero(Int64) && PB.encode(e, 20, x.meta_optimizer_timeout_ms) + !isnothing(x.auto_parallel) && PB.encode(e, 5, x.auto_parallel) + x.fail_on_optimizer_errors != false && PB.encode(e, 21, x.fail_on_optimizer_errors) + !isnothing(x.scoped_allocator_opts) && PB.encode(e, 16, x.scoped_allocator_opts) + !isempty(x.optimizers) && PB.encode(e, 100, x.optimizers) + !isempty(x.custom_optimizers) && PB.encode(e, 200, x.custom_optimizers) + !isnothing(x.inter_optimizer_verifier_config) && PB.encode(e, 300, x.inter_optimizer_verifier_config) + !isnothing(x.post_optimization_verifier_config) && PB.encode(e, 301, x.post_optimization_verifier_config) + return position(e.io) - initpos +end +function PB._encoded_size(x::RewriterConfig) + encoded_size = 0 + x.cpu_layout_conversion != var"RewriterConfig.CpuLayout".NO_CONVERSION_ON_CPU && (encoded_size += PB._encoded_size(x.cpu_layout_conversion, 50)) + x.layout_optimizer != var"RewriterConfig.Toggle".DEFAULT && (encoded_size += PB._encoded_size(x.layout_optimizer, 1)) + x.constant_folding != var"RewriterConfig.Toggle".DEFAULT && (encoded_size += PB._encoded_size(x.constant_folding, 3)) + x.shape_optimization != var"RewriterConfig.Toggle".DEFAULT && (encoded_size += PB._encoded_size(x.shape_optimization, 13)) + x.remapping != var"RewriterConfig.Toggle".DEFAULT && (encoded_size += PB._encoded_size(x.remapping, 14)) + x.common_subgraph_elimination != var"RewriterConfig.Toggle".DEFAULT && (encoded_size += PB._encoded_size(x.common_subgraph_elimination, 24)) + x.arithmetic_optimization != var"RewriterConfig.Toggle".DEFAULT && (encoded_size += PB._encoded_size(x.arithmetic_optimization, 7)) + x.dependency_optimization != var"RewriterConfig.Toggle".DEFAULT && (encoded_size += PB._encoded_size(x.dependency_optimization, 8)) + x.loop_optimization != var"RewriterConfig.Toggle".DEFAULT && (encoded_size += PB._encoded_size(x.loop_optimization, 9)) + x.function_optimization != var"RewriterConfig.Toggle".DEFAULT && (encoded_size += PB._encoded_size(x.function_optimization, 10)) + x.debug_stripper != var"RewriterConfig.Toggle".DEFAULT && (encoded_size += PB._encoded_size(x.debug_stripper, 11)) + x.disable_model_pruning != false && (encoded_size += PB._encoded_size(x.disable_model_pruning, 2)) + x.scoped_allocator_optimization != var"RewriterConfig.Toggle".DEFAULT && (encoded_size += PB._encoded_size(x.scoped_allocator_optimization, 15)) + x.pin_to_host_optimization != var"RewriterConfig.Toggle".DEFAULT && (encoded_size += PB._encoded_size(x.pin_to_host_optimization, 18)) + x.implementation_selector != var"RewriterConfig.Toggle".DEFAULT && (encoded_size += PB._encoded_size(x.implementation_selector, 22)) + x.auto_mixed_precision != var"RewriterConfig.Toggle".DEFAULT && (encoded_size += PB._encoded_size(x.auto_mixed_precision, 23)) + x.auto_mixed_precision_mkl != var"RewriterConfig.Toggle".DEFAULT && (encoded_size += PB._encoded_size(x.auto_mixed_precision_mkl, 25)) + x.auto_mixed_precision_onednn_bfloat16 != var"RewriterConfig.Toggle".DEFAULT && (encoded_size += PB._encoded_size(x.auto_mixed_precision_onednn_bfloat16, 31)) + x.auto_mixed_precision_cpu != var"RewriterConfig.Toggle".DEFAULT && (encoded_size += PB._encoded_size(x.auto_mixed_precision_cpu, 29)) + x.disable_meta_optimizer != false && (encoded_size += PB._encoded_size(x.disable_meta_optimizer, 19)) + x.use_plugin_optimizers != var"RewriterConfig.Toggle".DEFAULT && (encoded_size += PB._encoded_size(x.use_plugin_optimizers, 28)) + x.experimental_conditional_code_motion != var"RewriterConfig.Toggle".DEFAULT && (encoded_size += PB._encoded_size(x.experimental_conditional_code_motion, 30)) + x.meta_optimizer_iterations != var"RewriterConfig.NumIterationsType".DEFAULT_NUM_ITERS && (encoded_size += PB._encoded_size(x.meta_optimizer_iterations, 12)) + x.min_graph_nodes != zero(Int32) && (encoded_size += PB._encoded_size(x.min_graph_nodes, 17)) + x.experimental_disable_compressed_tensor_optimization != false && (encoded_size += PB._encoded_size(x.experimental_disable_compressed_tensor_optimization, 26)) + x.experimental_disable_folding_quantization_emulation != false && (encoded_size += PB._encoded_size(x.experimental_disable_folding_quantization_emulation, 27)) + x.memory_optimization != var"RewriterConfig.MemOptType".DEFAULT_MEM_OPT && (encoded_size += PB._encoded_size(x.memory_optimization, 4)) + !isempty(x.memory_optimizer_target_node_name_scope) && (encoded_size += PB._encoded_size(x.memory_optimizer_target_node_name_scope, 6)) + x.meta_optimizer_timeout_ms != zero(Int64) && (encoded_size += PB._encoded_size(x.meta_optimizer_timeout_ms, 20)) + !isnothing(x.auto_parallel) && (encoded_size += PB._encoded_size(x.auto_parallel, 5)) + x.fail_on_optimizer_errors != false && (encoded_size += PB._encoded_size(x.fail_on_optimizer_errors, 21)) + !isnothing(x.scoped_allocator_opts) && (encoded_size += PB._encoded_size(x.scoped_allocator_opts, 16)) + !isempty(x.optimizers) && (encoded_size += PB._encoded_size(x.optimizers, 100)) + !isempty(x.custom_optimizers) && (encoded_size += PB._encoded_size(x.custom_optimizers, 200)) + !isnothing(x.inter_optimizer_verifier_config) && (encoded_size += PB._encoded_size(x.inter_optimizer_verifier_config, 300)) + !isnothing(x.post_optimization_verifier_config) && (encoded_size += PB._encoded_size(x.post_optimization_verifier_config, 301)) + return encoded_size +end diff --git a/src/protojl/tensorboard/tensorboard/rpc_options_pb.jl b/src/protojl/tensorboard/tensorboard/rpc_options_pb.jl new file mode 100644 index 0000000..7537185 --- /dev/null +++ b/src/protojl/tensorboard/tensorboard/rpc_options_pb.jl @@ -0,0 +1,68 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:24.224 +# original file: /home/lior/TensorBoardLogger.jl/gen/proto/tensorboard/compat/proto/rpc_options.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export RPCOptions + +struct RPCOptions + use_rpc_for_inprocess_master::Bool + compression_algorithm::String + compression_level::Int32 + cache_rpc_response::Bool + disable_session_connection_sharing::Bool + num_channels_per_target::Int32 +end +PB.default_values(::Type{RPCOptions}) = (;use_rpc_for_inprocess_master = false, compression_algorithm = "", compression_level = zero(Int32), cache_rpc_response = false, disable_session_connection_sharing = false, num_channels_per_target = zero(Int32)) +PB.field_numbers(::Type{RPCOptions}) = (;use_rpc_for_inprocess_master = 1, compression_algorithm = 2, compression_level = 3, cache_rpc_response = 4, disable_session_connection_sharing = 5, num_channels_per_target = 6) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:RPCOptions}) + use_rpc_for_inprocess_master = false + compression_algorithm = "" + compression_level = zero(Int32) + cache_rpc_response = false + disable_session_connection_sharing = false + num_channels_per_target = zero(Int32) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + use_rpc_for_inprocess_master = PB.decode(d, Bool) + elseif field_number == 2 + compression_algorithm = PB.decode(d, String) + elseif field_number == 3 + compression_level = PB.decode(d, Int32) + elseif field_number == 4 + cache_rpc_response = PB.decode(d, Bool) + elseif field_number == 5 + disable_session_connection_sharing = PB.decode(d, Bool) + elseif field_number == 6 + num_channels_per_target = PB.decode(d, Int32) + else + PB.skip(d, wire_type) + end + end + return RPCOptions(use_rpc_for_inprocess_master, compression_algorithm, compression_level, cache_rpc_response, disable_session_connection_sharing, num_channels_per_target) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::RPCOptions) + initpos = position(e.io) + x.use_rpc_for_inprocess_master != false && PB.encode(e, 1, x.use_rpc_for_inprocess_master) + !isempty(x.compression_algorithm) && PB.encode(e, 2, x.compression_algorithm) + x.compression_level != zero(Int32) && PB.encode(e, 3, x.compression_level) + x.cache_rpc_response != false && PB.encode(e, 4, x.cache_rpc_response) + x.disable_session_connection_sharing != false && PB.encode(e, 5, x.disable_session_connection_sharing) + x.num_channels_per_target != zero(Int32) && PB.encode(e, 6, x.num_channels_per_target) + return position(e.io) - initpos +end +function PB._encoded_size(x::RPCOptions) + encoded_size = 0 + x.use_rpc_for_inprocess_master != false && (encoded_size += PB._encoded_size(x.use_rpc_for_inprocess_master, 1)) + !isempty(x.compression_algorithm) && (encoded_size += PB._encoded_size(x.compression_algorithm, 2)) + x.compression_level != zero(Int32) && (encoded_size += PB._encoded_size(x.compression_level, 3)) + x.cache_rpc_response != false && (encoded_size += PB._encoded_size(x.cache_rpc_response, 4)) + x.disable_session_connection_sharing != false && (encoded_size += PB._encoded_size(x.disable_session_connection_sharing, 5)) + x.num_channels_per_target != zero(Int32) && (encoded_size += PB._encoded_size(x.num_channels_per_target, 6)) + return encoded_size +end diff --git a/src/protojl/tensorboard/tensorboard/saved_object_graph_pb.jl b/src/protojl/tensorboard/tensorboard/saved_object_graph_pb.jl new file mode 100644 index 0000000..9e50ed4 --- /dev/null +++ b/src/protojl/tensorboard/tensorboard/saved_object_graph_pb.jl @@ -0,0 +1,630 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:24.775 +# original file: /home/lior/TensorBoardLogger.jl/gen/proto/tensorboard/compat/proto/saved_object_graph.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export SavedAsset, CapturedTensor, SavedUserObject, SavedConcreteFunction, SaveableObject +export SavedResource, var"FunctionSpec.JitCompile", SavedConstant, FunctionSpec +export SavedBareConcreteFunction, SavedFunction, SavedObjectGraph, SavedVariable +export SavedObject + +# Abstract types to help resolve mutually recursive definitions +abstract type var"##AbstractSavedObjectGraph" end +abstract type var"##AbstractSavedVariable" end +abstract type var"##AbstractSavedObject" end + + +struct SavedAsset + asset_file_def_index::Int32 +end +PB.default_values(::Type{SavedAsset}) = (;asset_file_def_index = zero(Int32)) +PB.field_numbers(::Type{SavedAsset}) = (;asset_file_def_index = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:SavedAsset}) + asset_file_def_index = zero(Int32) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + asset_file_def_index = PB.decode(d, Int32) + else + PB.skip(d, wire_type) + end + end + return SavedAsset(asset_file_def_index) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::SavedAsset) + initpos = position(e.io) + x.asset_file_def_index != zero(Int32) && PB.encode(e, 1, x.asset_file_def_index) + return position(e.io) - initpos +end +function PB._encoded_size(x::SavedAsset) + encoded_size = 0 + x.asset_file_def_index != zero(Int32) && (encoded_size += PB._encoded_size(x.asset_file_def_index, 1)) + return encoded_size +end + +struct CapturedTensor + name::String + concrete_function::String +end +PB.default_values(::Type{CapturedTensor}) = (;name = "", concrete_function = "") +PB.field_numbers(::Type{CapturedTensor}) = (;name = 1, concrete_function = 2) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:CapturedTensor}) + name = "" + concrete_function = "" + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + name = PB.decode(d, String) + elseif field_number == 2 + concrete_function = PB.decode(d, String) + else + PB.skip(d, wire_type) + end + end + return CapturedTensor(name, concrete_function) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::CapturedTensor) + initpos = position(e.io) + !isempty(x.name) && PB.encode(e, 1, x.name) + !isempty(x.concrete_function) && PB.encode(e, 2, x.concrete_function) + return position(e.io) - initpos +end +function PB._encoded_size(x::CapturedTensor) + encoded_size = 0 + !isempty(x.name) && (encoded_size += PB._encoded_size(x.name, 1)) + !isempty(x.concrete_function) && (encoded_size += PB._encoded_size(x.concrete_function, 2)) + return encoded_size +end + +struct SavedUserObject + identifier::String + version::Union{Nothing,VersionDef} + metadata::String +end +PB.default_values(::Type{SavedUserObject}) = (;identifier = "", version = nothing, metadata = "") +PB.field_numbers(::Type{SavedUserObject}) = (;identifier = 1, version = 2, metadata = 3) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:SavedUserObject}) + identifier = "" + version = Ref{Union{Nothing,VersionDef}}(nothing) + metadata = "" + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + identifier = PB.decode(d, String) + elseif field_number == 2 + PB.decode!(d, version) + elseif field_number == 3 + metadata = PB.decode(d, String) + else + PB.skip(d, wire_type) + end + end + return SavedUserObject(identifier, version[], metadata) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::SavedUserObject) + initpos = position(e.io) + !isempty(x.identifier) && PB.encode(e, 1, x.identifier) + !isnothing(x.version) && PB.encode(e, 2, x.version) + !isempty(x.metadata) && PB.encode(e, 3, x.metadata) + return position(e.io) - initpos +end +function PB._encoded_size(x::SavedUserObject) + encoded_size = 0 + !isempty(x.identifier) && (encoded_size += PB._encoded_size(x.identifier, 1)) + !isnothing(x.version) && (encoded_size += PB._encoded_size(x.version, 2)) + !isempty(x.metadata) && (encoded_size += PB._encoded_size(x.metadata, 3)) + return encoded_size +end + +struct SavedConcreteFunction + bound_inputs::Vector{Int32} + canonicalized_input_signature::Union{Nothing,StructuredValue} + output_signature::Union{Nothing,StructuredValue} +end +PB.default_values(::Type{SavedConcreteFunction}) = (;bound_inputs = Vector{Int32}(), canonicalized_input_signature = nothing, output_signature = nothing) +PB.field_numbers(::Type{SavedConcreteFunction}) = (;bound_inputs = 2, canonicalized_input_signature = 3, output_signature = 4) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:SavedConcreteFunction}) + bound_inputs = PB.BufferedVector{Int32}() + canonicalized_input_signature = Ref{Union{Nothing,StructuredValue}}(nothing) + output_signature = Ref{Union{Nothing,StructuredValue}}(nothing) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 2 + PB.decode!(d, wire_type, bound_inputs) + elseif field_number == 3 + PB.decode!(d, canonicalized_input_signature) + elseif field_number == 4 + PB.decode!(d, output_signature) + else + PB.skip(d, wire_type) + end + end + return SavedConcreteFunction(bound_inputs[], canonicalized_input_signature[], output_signature[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::SavedConcreteFunction) + initpos = position(e.io) + !isempty(x.bound_inputs) && PB.encode(e, 2, x.bound_inputs) + !isnothing(x.canonicalized_input_signature) && PB.encode(e, 3, x.canonicalized_input_signature) + !isnothing(x.output_signature) && PB.encode(e, 4, x.output_signature) + return position(e.io) - initpos +end +function PB._encoded_size(x::SavedConcreteFunction) + encoded_size = 0 + !isempty(x.bound_inputs) && (encoded_size += PB._encoded_size(x.bound_inputs, 2)) + !isnothing(x.canonicalized_input_signature) && (encoded_size += PB._encoded_size(x.canonicalized_input_signature, 3)) + !isnothing(x.output_signature) && (encoded_size += PB._encoded_size(x.output_signature, 4)) + return encoded_size +end + +struct SaveableObject + save_function::Int32 + restore_function::Int32 +end +PB.default_values(::Type{SaveableObject}) = (;save_function = zero(Int32), restore_function = zero(Int32)) +PB.field_numbers(::Type{SaveableObject}) = (;save_function = 2, restore_function = 3) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:SaveableObject}) + save_function = zero(Int32) + restore_function = zero(Int32) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 2 + save_function = PB.decode(d, Int32) + elseif field_number == 3 + restore_function = PB.decode(d, Int32) + else + PB.skip(d, wire_type) + end + end + return SaveableObject(save_function, restore_function) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::SaveableObject) + initpos = position(e.io) + x.save_function != zero(Int32) && PB.encode(e, 2, x.save_function) + x.restore_function != zero(Int32) && PB.encode(e, 3, x.restore_function) + return position(e.io) - initpos +end +function PB._encoded_size(x::SaveableObject) + encoded_size = 0 + x.save_function != zero(Int32) && (encoded_size += PB._encoded_size(x.save_function, 2)) + x.restore_function != zero(Int32) && (encoded_size += PB._encoded_size(x.restore_function, 3)) + return encoded_size +end + +struct SavedResource + device::String +end +PB.default_values(::Type{SavedResource}) = (;device = "") +PB.field_numbers(::Type{SavedResource}) = (;device = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:SavedResource}) + device = "" + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + device = PB.decode(d, String) + else + PB.skip(d, wire_type) + end + end + return SavedResource(device) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::SavedResource) + initpos = position(e.io) + !isempty(x.device) && PB.encode(e, 1, x.device) + return position(e.io) - initpos +end +function PB._encoded_size(x::SavedResource) + encoded_size = 0 + !isempty(x.device) && (encoded_size += PB._encoded_size(x.device, 1)) + return encoded_size +end + +@enumx var"FunctionSpec.JitCompile" DEFAULT=0 ON=1 OFF=2 + +struct SavedConstant + operation::String +end +PB.default_values(::Type{SavedConstant}) = (;operation = "") +PB.field_numbers(::Type{SavedConstant}) = (;operation = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:SavedConstant}) + operation = "" + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + operation = PB.decode(d, String) + else + PB.skip(d, wire_type) + end + end + return SavedConstant(operation) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::SavedConstant) + initpos = position(e.io) + !isempty(x.operation) && PB.encode(e, 1, x.operation) + return position(e.io) - initpos +end +function PB._encoded_size(x::SavedConstant) + encoded_size = 0 + !isempty(x.operation) && (encoded_size += PB._encoded_size(x.operation, 1)) + return encoded_size +end + +struct FunctionSpec + fullargspec::Union{Nothing,StructuredValue} + is_method::Bool + input_signature::Union{Nothing,StructuredValue} + jit_compile::var"FunctionSpec.JitCompile".T +end +PB.reserved_fields(::Type{FunctionSpec}) = (names = String[], numbers = Union{Int,UnitRange{Int}}[3, 4]) +PB.default_values(::Type{FunctionSpec}) = (;fullargspec = nothing, is_method = false, input_signature = nothing, jit_compile = var"FunctionSpec.JitCompile".DEFAULT) +PB.field_numbers(::Type{FunctionSpec}) = (;fullargspec = 1, is_method = 2, input_signature = 5, jit_compile = 6) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:FunctionSpec}) + fullargspec = Ref{Union{Nothing,StructuredValue}}(nothing) + is_method = false + input_signature = Ref{Union{Nothing,StructuredValue}}(nothing) + jit_compile = var"FunctionSpec.JitCompile".DEFAULT + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, fullargspec) + elseif field_number == 2 + is_method = PB.decode(d, Bool) + elseif field_number == 5 + PB.decode!(d, input_signature) + elseif field_number == 6 + jit_compile = PB.decode(d, var"FunctionSpec.JitCompile".T) + else + PB.skip(d, wire_type) + end + end + return FunctionSpec(fullargspec[], is_method, input_signature[], jit_compile) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::FunctionSpec) + initpos = position(e.io) + !isnothing(x.fullargspec) && PB.encode(e, 1, x.fullargspec) + x.is_method != false && PB.encode(e, 2, x.is_method) + !isnothing(x.input_signature) && PB.encode(e, 5, x.input_signature) + x.jit_compile != var"FunctionSpec.JitCompile".DEFAULT && PB.encode(e, 6, x.jit_compile) + return position(e.io) - initpos +end +function PB._encoded_size(x::FunctionSpec) + encoded_size = 0 + !isnothing(x.fullargspec) && (encoded_size += PB._encoded_size(x.fullargspec, 1)) + x.is_method != false && (encoded_size += PB._encoded_size(x.is_method, 2)) + !isnothing(x.input_signature) && (encoded_size += PB._encoded_size(x.input_signature, 5)) + x.jit_compile != var"FunctionSpec.JitCompile".DEFAULT && (encoded_size += PB._encoded_size(x.jit_compile, 6)) + return encoded_size +end + +struct SavedBareConcreteFunction + concrete_function_name::String + argument_keywords::Vector{String} + allowed_positional_arguments::Int64 + function_spec::Union{Nothing,FunctionSpec} +end +PB.default_values(::Type{SavedBareConcreteFunction}) = (;concrete_function_name = "", argument_keywords = Vector{String}(), allowed_positional_arguments = zero(Int64), function_spec = nothing) +PB.field_numbers(::Type{SavedBareConcreteFunction}) = (;concrete_function_name = 1, argument_keywords = 2, allowed_positional_arguments = 3, function_spec = 4) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:SavedBareConcreteFunction}) + concrete_function_name = "" + argument_keywords = PB.BufferedVector{String}() + allowed_positional_arguments = zero(Int64) + function_spec = Ref{Union{Nothing,FunctionSpec}}(nothing) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + concrete_function_name = PB.decode(d, String) + elseif field_number == 2 + PB.decode!(d, argument_keywords) + elseif field_number == 3 + allowed_positional_arguments = PB.decode(d, Int64) + elseif field_number == 4 + PB.decode!(d, function_spec) + else + PB.skip(d, wire_type) + end + end + return SavedBareConcreteFunction(concrete_function_name, argument_keywords[], allowed_positional_arguments, function_spec[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::SavedBareConcreteFunction) + initpos = position(e.io) + !isempty(x.concrete_function_name) && PB.encode(e, 1, x.concrete_function_name) + !isempty(x.argument_keywords) && PB.encode(e, 2, x.argument_keywords) + x.allowed_positional_arguments != zero(Int64) && PB.encode(e, 3, x.allowed_positional_arguments) + !isnothing(x.function_spec) && PB.encode(e, 4, x.function_spec) + return position(e.io) - initpos +end +function PB._encoded_size(x::SavedBareConcreteFunction) + encoded_size = 0 + !isempty(x.concrete_function_name) && (encoded_size += PB._encoded_size(x.concrete_function_name, 1)) + !isempty(x.argument_keywords) && (encoded_size += PB._encoded_size(x.argument_keywords, 2)) + x.allowed_positional_arguments != zero(Int64) && (encoded_size += PB._encoded_size(x.allowed_positional_arguments, 3)) + !isnothing(x.function_spec) && (encoded_size += PB._encoded_size(x.function_spec, 4)) + return encoded_size +end + +struct SavedFunction + concrete_functions::Vector{String} + function_spec::Union{Nothing,FunctionSpec} +end +PB.default_values(::Type{SavedFunction}) = (;concrete_functions = Vector{String}(), function_spec = nothing) +PB.field_numbers(::Type{SavedFunction}) = (;concrete_functions = 1, function_spec = 2) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:SavedFunction}) + concrete_functions = PB.BufferedVector{String}() + function_spec = Ref{Union{Nothing,FunctionSpec}}(nothing) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, concrete_functions) + elseif field_number == 2 + PB.decode!(d, function_spec) + else + PB.skip(d, wire_type) + end + end + return SavedFunction(concrete_functions[], function_spec[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::SavedFunction) + initpos = position(e.io) + !isempty(x.concrete_functions) && PB.encode(e, 1, x.concrete_functions) + !isnothing(x.function_spec) && PB.encode(e, 2, x.function_spec) + return position(e.io) - initpos +end +function PB._encoded_size(x::SavedFunction) + encoded_size = 0 + !isempty(x.concrete_functions) && (encoded_size += PB._encoded_size(x.concrete_functions, 1)) + !isnothing(x.function_spec) && (encoded_size += PB._encoded_size(x.function_spec, 2)) + return encoded_size +end + +struct SavedObjectGraph{T1<:Union{Nothing,var"##AbstractSavedObject"}} <: var"##AbstractSavedObjectGraph" + nodes::Vector{T1} + concrete_functions::Dict{String,SavedConcreteFunction} +end +PB.default_values(::Type{SavedObjectGraph}) = (;nodes = Vector{SavedObject}(), concrete_functions = Dict{String,SavedConcreteFunction}()) +PB.field_numbers(::Type{SavedObjectGraph}) = (;nodes = 1, concrete_functions = 2) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:SavedObjectGraph}) + nodes = PB.BufferedVector{SavedObject}() + concrete_functions = Dict{String,SavedConcreteFunction}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, nodes) + elseif field_number == 2 + PB.decode!(d, concrete_functions) + else + PB.skip(d, wire_type) + end + end + return SavedObjectGraph(nodes[], concrete_functions) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::SavedObjectGraph) + initpos = position(e.io) + !isempty(x.nodes) && PB.encode(e, 1, x.nodes) + !isempty(x.concrete_functions) && PB.encode(e, 2, x.concrete_functions) + return position(e.io) - initpos +end +function PB._encoded_size(x::SavedObjectGraph) + encoded_size = 0 + !isempty(x.nodes) && (encoded_size += PB._encoded_size(x.nodes, 1)) + !isempty(x.concrete_functions) && (encoded_size += PB._encoded_size(x.concrete_functions, 2)) + return encoded_size +end + +struct SavedVariable <: var"##AbstractSavedVariable" + dtype::var"#DataType".T + shape::Union{Nothing,TensorShapeProto} + trainable::Bool + synchronization::VariableSynchronization.T + aggregation::VariableAggregation.T + name::String + device::String + experimental_distributed_variable_components::Vector{<:SavedVariable} +end +PB.default_values(::Type{SavedVariable}) = (;dtype = var"#DataType".DT_INVALID, shape = nothing, trainable = false, synchronization = VariableSynchronization.VARIABLE_SYNCHRONIZATION_AUTO, aggregation = VariableAggregation.VARIABLE_AGGREGATION_NONE, name = "", device = "", experimental_distributed_variable_components = Vector{SavedVariable}()) +PB.field_numbers(::Type{SavedVariable}) = (;dtype = 1, shape = 2, trainable = 3, synchronization = 4, aggregation = 5, name = 6, device = 7, experimental_distributed_variable_components = 8) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:SavedVariable}) + dtype = var"#DataType".DT_INVALID + shape = Ref{Union{Nothing,TensorShapeProto}}(nothing) + trainable = false + synchronization = VariableSynchronization.VARIABLE_SYNCHRONIZATION_AUTO + aggregation = VariableAggregation.VARIABLE_AGGREGATION_NONE + name = "" + device = "" + experimental_distributed_variable_components = PB.BufferedVector{SavedVariable}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + dtype = PB.decode(d, var"#DataType".T) + elseif field_number == 2 + PB.decode!(d, shape) + elseif field_number == 3 + trainable = PB.decode(d, Bool) + elseif field_number == 4 + synchronization = PB.decode(d, VariableSynchronization.T) + elseif field_number == 5 + aggregation = PB.decode(d, VariableAggregation.T) + elseif field_number == 6 + name = PB.decode(d, String) + elseif field_number == 7 + device = PB.decode(d, String) + elseif field_number == 8 + PB.decode!(d, experimental_distributed_variable_components) + else + PB.skip(d, wire_type) + end + end + return SavedVariable(dtype, shape[], trainable, synchronization, aggregation, name, device, experimental_distributed_variable_components[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::SavedVariable) + initpos = position(e.io) + x.dtype != var"#DataType".DT_INVALID && PB.encode(e, 1, x.dtype) + !isnothing(x.shape) && PB.encode(e, 2, x.shape) + x.trainable != false && PB.encode(e, 3, x.trainable) + x.synchronization != VariableSynchronization.VARIABLE_SYNCHRONIZATION_AUTO && PB.encode(e, 4, x.synchronization) + x.aggregation != VariableAggregation.VARIABLE_AGGREGATION_NONE && PB.encode(e, 5, x.aggregation) + !isempty(x.name) && PB.encode(e, 6, x.name) + !isempty(x.device) && PB.encode(e, 7, x.device) + !isempty(x.experimental_distributed_variable_components) && PB.encode(e, 8, x.experimental_distributed_variable_components) + return position(e.io) - initpos +end +function PB._encoded_size(x::SavedVariable) + encoded_size = 0 + x.dtype != var"#DataType".DT_INVALID && (encoded_size += PB._encoded_size(x.dtype, 1)) + !isnothing(x.shape) && (encoded_size += PB._encoded_size(x.shape, 2)) + x.trainable != false && (encoded_size += PB._encoded_size(x.trainable, 3)) + x.synchronization != VariableSynchronization.VARIABLE_SYNCHRONIZATION_AUTO && (encoded_size += PB._encoded_size(x.synchronization, 4)) + x.aggregation != VariableAggregation.VARIABLE_AGGREGATION_NONE && (encoded_size += PB._encoded_size(x.aggregation, 5)) + !isempty(x.name) && (encoded_size += PB._encoded_size(x.name, 6)) + !isempty(x.device) && (encoded_size += PB._encoded_size(x.device, 7)) + !isempty(x.experimental_distributed_variable_components) && (encoded_size += PB._encoded_size(x.experimental_distributed_variable_components, 8)) + return encoded_size +end + +struct SavedObject <: var"##AbstractSavedObject" + children::Vector{var"TrackableObjectGraph.TrackableObject.ObjectReference"} + dependencies::Vector{var"TrackableObjectGraph.TrackableObject.ObjectReference"} + slot_variables::Vector{var"TrackableObjectGraph.TrackableObject.SlotVariableReference"} + kind::Union{Nothing,OneOf{<:Union{SavedUserObject,SavedAsset,SavedFunction,var"##AbstractSavedVariable",SavedBareConcreteFunction,SavedConstant,SavedResource,CapturedTensor}}} + saveable_objects::Dict{String,SaveableObject} + registered_name::String + serialized_user_proto::Union{Nothing,google.protobuf.var"#Any"} + registered_saver::String +end +PB.reserved_fields(::Type{SavedObject}) = (names = ["attributes"], numbers = Union{Int,UnitRange{Int}}[2]) +PB.oneof_field_types(::Type{SavedObject}) = (; + kind = (;user_object=SavedUserObject, asset=SavedAsset, var"#function"=SavedFunction, variable=SavedVariable, bare_concrete_function=SavedBareConcreteFunction, constant=SavedConstant, resource=SavedResource, captured_tensor=CapturedTensor), +) +PB.default_values(::Type{SavedObject}) = (;children = Vector{var"TrackableObjectGraph.TrackableObject.ObjectReference"}(), dependencies = Vector{var"TrackableObjectGraph.TrackableObject.ObjectReference"}(), slot_variables = Vector{var"TrackableObjectGraph.TrackableObject.SlotVariableReference"}(), user_object = nothing, asset = nothing, var"#function" = nothing, variable = nothing, bare_concrete_function = nothing, constant = nothing, resource = nothing, captured_tensor = nothing, saveable_objects = Dict{String,SaveableObject}(), registered_name = "", serialized_user_proto = nothing, registered_saver = "") +PB.field_numbers(::Type{SavedObject}) = (;children = 1, dependencies = 15, slot_variables = 3, user_object = 4, asset = 5, var"#function" = 6, variable = 7, bare_concrete_function = 8, constant = 9, resource = 10, captured_tensor = 12, saveable_objects = 11, registered_name = 13, serialized_user_proto = 14, registered_saver = 16) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:SavedObject}) + children = PB.BufferedVector{var"TrackableObjectGraph.TrackableObject.ObjectReference"}() + dependencies = PB.BufferedVector{var"TrackableObjectGraph.TrackableObject.ObjectReference"}() + slot_variables = PB.BufferedVector{var"TrackableObjectGraph.TrackableObject.SlotVariableReference"}() + kind = nothing + saveable_objects = Dict{String,SaveableObject}() + registered_name = "" + serialized_user_proto = Ref{Union{Nothing,google.protobuf.var"#Any"}}(nothing) + registered_saver = "" + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, children) + elseif field_number == 15 + PB.decode!(d, dependencies) + elseif field_number == 3 + PB.decode!(d, slot_variables) + elseif field_number == 4 + kind = OneOf(:user_object, PB.decode(d, Ref{SavedUserObject})) + elseif field_number == 5 + kind = OneOf(:asset, PB.decode(d, Ref{SavedAsset})) + elseif field_number == 6 + kind = OneOf(:var"#function", PB.decode(d, Ref{SavedFunction})) + elseif field_number == 7 + kind = OneOf(:variable, PB.decode(d, Ref{SavedVariable})) + elseif field_number == 8 + kind = OneOf(:bare_concrete_function, PB.decode(d, Ref{SavedBareConcreteFunction})) + elseif field_number == 9 + kind = OneOf(:constant, PB.decode(d, Ref{SavedConstant})) + elseif field_number == 10 + kind = OneOf(:resource, PB.decode(d, Ref{SavedResource})) + elseif field_number == 12 + kind = OneOf(:captured_tensor, PB.decode(d, Ref{CapturedTensor})) + elseif field_number == 11 + PB.decode!(d, saveable_objects) + elseif field_number == 13 + registered_name = PB.decode(d, String) + elseif field_number == 14 + PB.decode!(d, serialized_user_proto) + elseif field_number == 16 + registered_saver = PB.decode(d, String) + else + PB.skip(d, wire_type) + end + end + return SavedObject(children[], dependencies[], slot_variables[], kind, saveable_objects, registered_name, serialized_user_proto[], registered_saver) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::SavedObject) + initpos = position(e.io) + !isempty(x.children) && PB.encode(e, 1, x.children) + !isempty(x.dependencies) && PB.encode(e, 15, x.dependencies) + !isempty(x.slot_variables) && PB.encode(e, 3, x.slot_variables) + if isnothing(x.kind); + elseif x.kind.name === :user_object + PB.encode(e, 4, x.kind[]::SavedUserObject) + elseif x.kind.name === :asset + PB.encode(e, 5, x.kind[]::SavedAsset) + elseif x.kind.name === :var"#function" + PB.encode(e, 6, x.kind[]::SavedFunction) + elseif x.kind.name === :variable + PB.encode(e, 7, x.kind[]::SavedVariable) + elseif x.kind.name === :bare_concrete_function + PB.encode(e, 8, x.kind[]::SavedBareConcreteFunction) + elseif x.kind.name === :constant + PB.encode(e, 9, x.kind[]::SavedConstant) + elseif x.kind.name === :resource + PB.encode(e, 10, x.kind[]::SavedResource) + elseif x.kind.name === :captured_tensor + PB.encode(e, 12, x.kind[]::CapturedTensor) + end + !isempty(x.saveable_objects) && PB.encode(e, 11, x.saveable_objects) + !isempty(x.registered_name) && PB.encode(e, 13, x.registered_name) + !isnothing(x.serialized_user_proto) && PB.encode(e, 14, x.serialized_user_proto) + !isempty(x.registered_saver) && PB.encode(e, 16, x.registered_saver) + return position(e.io) - initpos +end +function PB._encoded_size(x::SavedObject) + encoded_size = 0 + !isempty(x.children) && (encoded_size += PB._encoded_size(x.children, 1)) + !isempty(x.dependencies) && (encoded_size += PB._encoded_size(x.dependencies, 15)) + !isempty(x.slot_variables) && (encoded_size += PB._encoded_size(x.slot_variables, 3)) + if isnothing(x.kind); + elseif x.kind.name === :user_object + encoded_size += PB._encoded_size(x.kind[]::SavedUserObject, 4) + elseif x.kind.name === :asset + encoded_size += PB._encoded_size(x.kind[]::SavedAsset, 5) + elseif x.kind.name === :var"#function" + encoded_size += PB._encoded_size(x.kind[]::SavedFunction, 6) + elseif x.kind.name === :variable + encoded_size += PB._encoded_size(x.kind[]::SavedVariable, 7) + elseif x.kind.name === :bare_concrete_function + encoded_size += PB._encoded_size(x.kind[]::SavedBareConcreteFunction, 8) + elseif x.kind.name === :constant + encoded_size += PB._encoded_size(x.kind[]::SavedConstant, 9) + elseif x.kind.name === :resource + encoded_size += PB._encoded_size(x.kind[]::SavedResource, 10) + elseif x.kind.name === :captured_tensor + encoded_size += PB._encoded_size(x.kind[]::CapturedTensor, 12) + end + !isempty(x.saveable_objects) && (encoded_size += PB._encoded_size(x.saveable_objects, 11)) + !isempty(x.registered_name) && (encoded_size += PB._encoded_size(x.registered_name, 13)) + !isnothing(x.serialized_user_proto) && (encoded_size += PB._encoded_size(x.serialized_user_proto, 14)) + !isempty(x.registered_saver) && (encoded_size += PB._encoded_size(x.registered_saver, 16)) + return encoded_size +end diff --git a/src/protojl/tensorboard/tensorboard/saver_pb.jl b/src/protojl/tensorboard/tensorboard/saver_pb.jl new file mode 100644 index 0000000..2b0b658 --- /dev/null +++ b/src/protojl/tensorboard/tensorboard/saver_pb.jl @@ -0,0 +1,76 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:23.598 +# original file: /home/lior/TensorBoardLogger.jl/gen/proto/tensorboard/compat/proto/saver.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export var"SaverDef.CheckpointFormatVersion", SaverDef + +@enumx var"SaverDef.CheckpointFormatVersion" LEGACY=0 V1=1 V2=2 + +struct SaverDef + filename_tensor_name::String + save_tensor_name::String + restore_op_name::String + max_to_keep::Int32 + sharded::Bool + keep_checkpoint_every_n_hours::Float32 + version::var"SaverDef.CheckpointFormatVersion".T +end +PB.default_values(::Type{SaverDef}) = (;filename_tensor_name = "", save_tensor_name = "", restore_op_name = "", max_to_keep = zero(Int32), sharded = false, keep_checkpoint_every_n_hours = zero(Float32), version = var"SaverDef.CheckpointFormatVersion".LEGACY) +PB.field_numbers(::Type{SaverDef}) = (;filename_tensor_name = 1, save_tensor_name = 2, restore_op_name = 3, max_to_keep = 4, sharded = 5, keep_checkpoint_every_n_hours = 6, version = 7) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:SaverDef}) + filename_tensor_name = "" + save_tensor_name = "" + restore_op_name = "" + max_to_keep = zero(Int32) + sharded = false + keep_checkpoint_every_n_hours = zero(Float32) + version = var"SaverDef.CheckpointFormatVersion".LEGACY + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + filename_tensor_name = PB.decode(d, String) + elseif field_number == 2 + save_tensor_name = PB.decode(d, String) + elseif field_number == 3 + restore_op_name = PB.decode(d, String) + elseif field_number == 4 + max_to_keep = PB.decode(d, Int32) + elseif field_number == 5 + sharded = PB.decode(d, Bool) + elseif field_number == 6 + keep_checkpoint_every_n_hours = PB.decode(d, Float32) + elseif field_number == 7 + version = PB.decode(d, var"SaverDef.CheckpointFormatVersion".T) + else + PB.skip(d, wire_type) + end + end + return SaverDef(filename_tensor_name, save_tensor_name, restore_op_name, max_to_keep, sharded, keep_checkpoint_every_n_hours, version) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::SaverDef) + initpos = position(e.io) + !isempty(x.filename_tensor_name) && PB.encode(e, 1, x.filename_tensor_name) + !isempty(x.save_tensor_name) && PB.encode(e, 2, x.save_tensor_name) + !isempty(x.restore_op_name) && PB.encode(e, 3, x.restore_op_name) + x.max_to_keep != zero(Int32) && PB.encode(e, 4, x.max_to_keep) + x.sharded != false && PB.encode(e, 5, x.sharded) + x.keep_checkpoint_every_n_hours != zero(Float32) && PB.encode(e, 6, x.keep_checkpoint_every_n_hours) + x.version != var"SaverDef.CheckpointFormatVersion".LEGACY && PB.encode(e, 7, x.version) + return position(e.io) - initpos +end +function PB._encoded_size(x::SaverDef) + encoded_size = 0 + !isempty(x.filename_tensor_name) && (encoded_size += PB._encoded_size(x.filename_tensor_name, 1)) + !isempty(x.save_tensor_name) && (encoded_size += PB._encoded_size(x.save_tensor_name, 2)) + !isempty(x.restore_op_name) && (encoded_size += PB._encoded_size(x.restore_op_name, 3)) + x.max_to_keep != zero(Int32) && (encoded_size += PB._encoded_size(x.max_to_keep, 4)) + x.sharded != false && (encoded_size += PB._encoded_size(x.sharded, 5)) + x.keep_checkpoint_every_n_hours != zero(Float32) && (encoded_size += PB._encoded_size(x.keep_checkpoint_every_n_hours, 6)) + x.version != var"SaverDef.CheckpointFormatVersion".LEGACY && (encoded_size += PB._encoded_size(x.version, 7)) + return encoded_size +end diff --git a/src/protojl/tensorboard/tensorboard/step_stats_pb.jl b/src/protojl/tensorboard/tensorboard/step_stats_pb.jl new file mode 100644 index 0000000..c024337 --- /dev/null +++ b/src/protojl/tensorboard/tensorboard/step_stats_pb.jl @@ -0,0 +1,399 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:24.424 +# original file: /home/lior/TensorBoardLogger.jl/gen/proto/tensorboard/compat/proto/step_stats.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export MemoryStats, AllocationRecord, NodeOutput, AllocatorMemoryUsed, NodeExecStats +export DeviceStepStats, StepStats + +struct MemoryStats + temp_memory_size::Int64 + persistent_memory_size::Int64 + persistent_tensor_alloc_ids::Vector{Int64} + device_temp_memory_size::Int64 + device_persistent_memory_size::Int64 + device_persistent_tensor_alloc_ids::Vector{Int64} +end +PB.default_values(::Type{MemoryStats}) = (;temp_memory_size = zero(Int64), persistent_memory_size = zero(Int64), persistent_tensor_alloc_ids = Vector{Int64}(), device_temp_memory_size = zero(Int64), device_persistent_memory_size = zero(Int64), device_persistent_tensor_alloc_ids = Vector{Int64}()) +PB.field_numbers(::Type{MemoryStats}) = (;temp_memory_size = 1, persistent_memory_size = 3, persistent_tensor_alloc_ids = 5, device_temp_memory_size = 2, device_persistent_memory_size = 4, device_persistent_tensor_alloc_ids = 6) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:MemoryStats}) + temp_memory_size = zero(Int64) + persistent_memory_size = zero(Int64) + persistent_tensor_alloc_ids = PB.BufferedVector{Int64}() + device_temp_memory_size = zero(Int64) + device_persistent_memory_size = zero(Int64) + device_persistent_tensor_alloc_ids = PB.BufferedVector{Int64}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + temp_memory_size = PB.decode(d, Int64) + elseif field_number == 3 + persistent_memory_size = PB.decode(d, Int64) + elseif field_number == 5 + PB.decode!(d, wire_type, persistent_tensor_alloc_ids) + elseif field_number == 2 + device_temp_memory_size = PB.decode(d, Int64) + elseif field_number == 4 + device_persistent_memory_size = PB.decode(d, Int64) + elseif field_number == 6 + PB.decode!(d, wire_type, device_persistent_tensor_alloc_ids) + else + PB.skip(d, wire_type) + end + end + return MemoryStats(temp_memory_size, persistent_memory_size, persistent_tensor_alloc_ids[], device_temp_memory_size, device_persistent_memory_size, device_persistent_tensor_alloc_ids[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::MemoryStats) + initpos = position(e.io) + x.temp_memory_size != zero(Int64) && PB.encode(e, 1, x.temp_memory_size) + x.persistent_memory_size != zero(Int64) && PB.encode(e, 3, x.persistent_memory_size) + !isempty(x.persistent_tensor_alloc_ids) && PB.encode(e, 5, x.persistent_tensor_alloc_ids) + x.device_temp_memory_size != zero(Int64) && PB.encode(e, 2, x.device_temp_memory_size) + x.device_persistent_memory_size != zero(Int64) && PB.encode(e, 4, x.device_persistent_memory_size) + !isempty(x.device_persistent_tensor_alloc_ids) && PB.encode(e, 6, x.device_persistent_tensor_alloc_ids) + return position(e.io) - initpos +end +function PB._encoded_size(x::MemoryStats) + encoded_size = 0 + x.temp_memory_size != zero(Int64) && (encoded_size += PB._encoded_size(x.temp_memory_size, 1)) + x.persistent_memory_size != zero(Int64) && (encoded_size += PB._encoded_size(x.persistent_memory_size, 3)) + !isempty(x.persistent_tensor_alloc_ids) && (encoded_size += PB._encoded_size(x.persistent_tensor_alloc_ids, 5)) + x.device_temp_memory_size != zero(Int64) && (encoded_size += PB._encoded_size(x.device_temp_memory_size, 2)) + x.device_persistent_memory_size != zero(Int64) && (encoded_size += PB._encoded_size(x.device_persistent_memory_size, 4)) + !isempty(x.device_persistent_tensor_alloc_ids) && (encoded_size += PB._encoded_size(x.device_persistent_tensor_alloc_ids, 6)) + return encoded_size +end + +struct AllocationRecord + alloc_micros::Int64 + alloc_bytes::Int64 +end +PB.default_values(::Type{AllocationRecord}) = (;alloc_micros = zero(Int64), alloc_bytes = zero(Int64)) +PB.field_numbers(::Type{AllocationRecord}) = (;alloc_micros = 1, alloc_bytes = 2) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:AllocationRecord}) + alloc_micros = zero(Int64) + alloc_bytes = zero(Int64) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + alloc_micros = PB.decode(d, Int64) + elseif field_number == 2 + alloc_bytes = PB.decode(d, Int64) + else + PB.skip(d, wire_type) + end + end + return AllocationRecord(alloc_micros, alloc_bytes) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::AllocationRecord) + initpos = position(e.io) + x.alloc_micros != zero(Int64) && PB.encode(e, 1, x.alloc_micros) + x.alloc_bytes != zero(Int64) && PB.encode(e, 2, x.alloc_bytes) + return position(e.io) - initpos +end +function PB._encoded_size(x::AllocationRecord) + encoded_size = 0 + x.alloc_micros != zero(Int64) && (encoded_size += PB._encoded_size(x.alloc_micros, 1)) + x.alloc_bytes != zero(Int64) && (encoded_size += PB._encoded_size(x.alloc_bytes, 2)) + return encoded_size +end + +struct NodeOutput + slot::Int32 + tensor_description::Union{Nothing,TensorDescription} +end +PB.default_values(::Type{NodeOutput}) = (;slot = zero(Int32), tensor_description = nothing) +PB.field_numbers(::Type{NodeOutput}) = (;slot = 1, tensor_description = 3) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:NodeOutput}) + slot = zero(Int32) + tensor_description = Ref{Union{Nothing,TensorDescription}}(nothing) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + slot = PB.decode(d, Int32) + elseif field_number == 3 + PB.decode!(d, tensor_description) + else + PB.skip(d, wire_type) + end + end + return NodeOutput(slot, tensor_description[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::NodeOutput) + initpos = position(e.io) + x.slot != zero(Int32) && PB.encode(e, 1, x.slot) + !isnothing(x.tensor_description) && PB.encode(e, 3, x.tensor_description) + return position(e.io) - initpos +end +function PB._encoded_size(x::NodeOutput) + encoded_size = 0 + x.slot != zero(Int32) && (encoded_size += PB._encoded_size(x.slot, 1)) + !isnothing(x.tensor_description) && (encoded_size += PB._encoded_size(x.tensor_description, 3)) + return encoded_size +end + +struct AllocatorMemoryUsed + allocator_name::String + total_bytes::Int64 + peak_bytes::Int64 + live_bytes::Int64 + allocation_records::Vector{AllocationRecord} + allocator_bytes_in_use::Int64 +end +PB.default_values(::Type{AllocatorMemoryUsed}) = (;allocator_name = "", total_bytes = zero(Int64), peak_bytes = zero(Int64), live_bytes = zero(Int64), allocation_records = Vector{AllocationRecord}(), allocator_bytes_in_use = zero(Int64)) +PB.field_numbers(::Type{AllocatorMemoryUsed}) = (;allocator_name = 1, total_bytes = 2, peak_bytes = 3, live_bytes = 4, allocation_records = 6, allocator_bytes_in_use = 5) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:AllocatorMemoryUsed}) + allocator_name = "" + total_bytes = zero(Int64) + peak_bytes = zero(Int64) + live_bytes = zero(Int64) + allocation_records = PB.BufferedVector{AllocationRecord}() + allocator_bytes_in_use = zero(Int64) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + allocator_name = PB.decode(d, String) + elseif field_number == 2 + total_bytes = PB.decode(d, Int64) + elseif field_number == 3 + peak_bytes = PB.decode(d, Int64) + elseif field_number == 4 + live_bytes = PB.decode(d, Int64) + elseif field_number == 6 + PB.decode!(d, allocation_records) + elseif field_number == 5 + allocator_bytes_in_use = PB.decode(d, Int64) + else + PB.skip(d, wire_type) + end + end + return AllocatorMemoryUsed(allocator_name, total_bytes, peak_bytes, live_bytes, allocation_records[], allocator_bytes_in_use) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::AllocatorMemoryUsed) + initpos = position(e.io) + !isempty(x.allocator_name) && PB.encode(e, 1, x.allocator_name) + x.total_bytes != zero(Int64) && PB.encode(e, 2, x.total_bytes) + x.peak_bytes != zero(Int64) && PB.encode(e, 3, x.peak_bytes) + x.live_bytes != zero(Int64) && PB.encode(e, 4, x.live_bytes) + !isempty(x.allocation_records) && PB.encode(e, 6, x.allocation_records) + x.allocator_bytes_in_use != zero(Int64) && PB.encode(e, 5, x.allocator_bytes_in_use) + return position(e.io) - initpos +end +function PB._encoded_size(x::AllocatorMemoryUsed) + encoded_size = 0 + !isempty(x.allocator_name) && (encoded_size += PB._encoded_size(x.allocator_name, 1)) + x.total_bytes != zero(Int64) && (encoded_size += PB._encoded_size(x.total_bytes, 2)) + x.peak_bytes != zero(Int64) && (encoded_size += PB._encoded_size(x.peak_bytes, 3)) + x.live_bytes != zero(Int64) && (encoded_size += PB._encoded_size(x.live_bytes, 4)) + !isempty(x.allocation_records) && (encoded_size += PB._encoded_size(x.allocation_records, 6)) + x.allocator_bytes_in_use != zero(Int64) && (encoded_size += PB._encoded_size(x.allocator_bytes_in_use, 5)) + return encoded_size +end + +struct NodeExecStats + node_name::String + all_start_micros::Int64 + op_start_rel_micros::Int64 + op_end_rel_micros::Int64 + all_end_rel_micros::Int64 + memory::Vector{AllocatorMemoryUsed} + output::Vector{NodeOutput} + timeline_label::String + scheduled_micros::Int64 + thread_id::UInt32 + referenced_tensor::Vector{AllocationDescription} + memory_stats::Union{Nothing,MemoryStats} + all_start_nanos::Int64 + op_start_rel_nanos::Int64 + op_end_rel_nanos::Int64 + all_end_rel_nanos::Int64 + scheduled_nanos::Int64 +end +PB.default_values(::Type{NodeExecStats}) = (;node_name = "", all_start_micros = zero(Int64), op_start_rel_micros = zero(Int64), op_end_rel_micros = zero(Int64), all_end_rel_micros = zero(Int64), memory = Vector{AllocatorMemoryUsed}(), output = Vector{NodeOutput}(), timeline_label = "", scheduled_micros = zero(Int64), thread_id = zero(UInt32), referenced_tensor = Vector{AllocationDescription}(), memory_stats = nothing, all_start_nanos = zero(Int64), op_start_rel_nanos = zero(Int64), op_end_rel_nanos = zero(Int64), all_end_rel_nanos = zero(Int64), scheduled_nanos = zero(Int64)) +PB.field_numbers(::Type{NodeExecStats}) = (;node_name = 1, all_start_micros = 2, op_start_rel_micros = 3, op_end_rel_micros = 4, all_end_rel_micros = 5, memory = 6, output = 7, timeline_label = 8, scheduled_micros = 9, thread_id = 10, referenced_tensor = 11, memory_stats = 12, all_start_nanos = 13, op_start_rel_nanos = 14, op_end_rel_nanos = 15, all_end_rel_nanos = 16, scheduled_nanos = 17) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:NodeExecStats}) + node_name = "" + all_start_micros = zero(Int64) + op_start_rel_micros = zero(Int64) + op_end_rel_micros = zero(Int64) + all_end_rel_micros = zero(Int64) + memory = PB.BufferedVector{AllocatorMemoryUsed}() + output = PB.BufferedVector{NodeOutput}() + timeline_label = "" + scheduled_micros = zero(Int64) + thread_id = zero(UInt32) + referenced_tensor = PB.BufferedVector{AllocationDescription}() + memory_stats = Ref{Union{Nothing,MemoryStats}}(nothing) + all_start_nanos = zero(Int64) + op_start_rel_nanos = zero(Int64) + op_end_rel_nanos = zero(Int64) + all_end_rel_nanos = zero(Int64) + scheduled_nanos = zero(Int64) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + node_name = PB.decode(d, String) + elseif field_number == 2 + all_start_micros = PB.decode(d, Int64) + elseif field_number == 3 + op_start_rel_micros = PB.decode(d, Int64) + elseif field_number == 4 + op_end_rel_micros = PB.decode(d, Int64) + elseif field_number == 5 + all_end_rel_micros = PB.decode(d, Int64) + elseif field_number == 6 + PB.decode!(d, memory) + elseif field_number == 7 + PB.decode!(d, output) + elseif field_number == 8 + timeline_label = PB.decode(d, String) + elseif field_number == 9 + scheduled_micros = PB.decode(d, Int64) + elseif field_number == 10 + thread_id = PB.decode(d, UInt32) + elseif field_number == 11 + PB.decode!(d, referenced_tensor) + elseif field_number == 12 + PB.decode!(d, memory_stats) + elseif field_number == 13 + all_start_nanos = PB.decode(d, Int64) + elseif field_number == 14 + op_start_rel_nanos = PB.decode(d, Int64) + elseif field_number == 15 + op_end_rel_nanos = PB.decode(d, Int64) + elseif field_number == 16 + all_end_rel_nanos = PB.decode(d, Int64) + elseif field_number == 17 + scheduled_nanos = PB.decode(d, Int64) + else + PB.skip(d, wire_type) + end + end + return NodeExecStats(node_name, all_start_micros, op_start_rel_micros, op_end_rel_micros, all_end_rel_micros, memory[], output[], timeline_label, scheduled_micros, thread_id, referenced_tensor[], memory_stats[], all_start_nanos, op_start_rel_nanos, op_end_rel_nanos, all_end_rel_nanos, scheduled_nanos) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::NodeExecStats) + initpos = position(e.io) + !isempty(x.node_name) && PB.encode(e, 1, x.node_name) + x.all_start_micros != zero(Int64) && PB.encode(e, 2, x.all_start_micros) + x.op_start_rel_micros != zero(Int64) && PB.encode(e, 3, x.op_start_rel_micros) + x.op_end_rel_micros != zero(Int64) && PB.encode(e, 4, x.op_end_rel_micros) + x.all_end_rel_micros != zero(Int64) && PB.encode(e, 5, x.all_end_rel_micros) + !isempty(x.memory) && PB.encode(e, 6, x.memory) + !isempty(x.output) && PB.encode(e, 7, x.output) + !isempty(x.timeline_label) && PB.encode(e, 8, x.timeline_label) + x.scheduled_micros != zero(Int64) && PB.encode(e, 9, x.scheduled_micros) + x.thread_id != zero(UInt32) && PB.encode(e, 10, x.thread_id) + !isempty(x.referenced_tensor) && PB.encode(e, 11, x.referenced_tensor) + !isnothing(x.memory_stats) && PB.encode(e, 12, x.memory_stats) + x.all_start_nanos != zero(Int64) && PB.encode(e, 13, x.all_start_nanos) + x.op_start_rel_nanos != zero(Int64) && PB.encode(e, 14, x.op_start_rel_nanos) + x.op_end_rel_nanos != zero(Int64) && PB.encode(e, 15, x.op_end_rel_nanos) + x.all_end_rel_nanos != zero(Int64) && PB.encode(e, 16, x.all_end_rel_nanos) + x.scheduled_nanos != zero(Int64) && PB.encode(e, 17, x.scheduled_nanos) + return position(e.io) - initpos +end +function PB._encoded_size(x::NodeExecStats) + encoded_size = 0 + !isempty(x.node_name) && (encoded_size += PB._encoded_size(x.node_name, 1)) + x.all_start_micros != zero(Int64) && (encoded_size += PB._encoded_size(x.all_start_micros, 2)) + x.op_start_rel_micros != zero(Int64) && (encoded_size += PB._encoded_size(x.op_start_rel_micros, 3)) + x.op_end_rel_micros != zero(Int64) && (encoded_size += PB._encoded_size(x.op_end_rel_micros, 4)) + x.all_end_rel_micros != zero(Int64) && (encoded_size += PB._encoded_size(x.all_end_rel_micros, 5)) + !isempty(x.memory) && (encoded_size += PB._encoded_size(x.memory, 6)) + !isempty(x.output) && (encoded_size += PB._encoded_size(x.output, 7)) + !isempty(x.timeline_label) && (encoded_size += PB._encoded_size(x.timeline_label, 8)) + x.scheduled_micros != zero(Int64) && (encoded_size += PB._encoded_size(x.scheduled_micros, 9)) + x.thread_id != zero(UInt32) && (encoded_size += PB._encoded_size(x.thread_id, 10)) + !isempty(x.referenced_tensor) && (encoded_size += PB._encoded_size(x.referenced_tensor, 11)) + !isnothing(x.memory_stats) && (encoded_size += PB._encoded_size(x.memory_stats, 12)) + x.all_start_nanos != zero(Int64) && (encoded_size += PB._encoded_size(x.all_start_nanos, 13)) + x.op_start_rel_nanos != zero(Int64) && (encoded_size += PB._encoded_size(x.op_start_rel_nanos, 14)) + x.op_end_rel_nanos != zero(Int64) && (encoded_size += PB._encoded_size(x.op_end_rel_nanos, 15)) + x.all_end_rel_nanos != zero(Int64) && (encoded_size += PB._encoded_size(x.all_end_rel_nanos, 16)) + x.scheduled_nanos != zero(Int64) && (encoded_size += PB._encoded_size(x.scheduled_nanos, 17)) + return encoded_size +end + +struct DeviceStepStats + device::String + node_stats::Vector{NodeExecStats} + thread_names::Dict{UInt32,String} +end +PB.default_values(::Type{DeviceStepStats}) = (;device = "", node_stats = Vector{NodeExecStats}(), thread_names = Dict{UInt32,String}()) +PB.field_numbers(::Type{DeviceStepStats}) = (;device = 1, node_stats = 2, thread_names = 3) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:DeviceStepStats}) + device = "" + node_stats = PB.BufferedVector{NodeExecStats}() + thread_names = Dict{UInt32,String}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + device = PB.decode(d, String) + elseif field_number == 2 + PB.decode!(d, node_stats) + elseif field_number == 3 + PB.decode!(d, thread_names) + else + PB.skip(d, wire_type) + end + end + return DeviceStepStats(device, node_stats[], thread_names) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::DeviceStepStats) + initpos = position(e.io) + !isempty(x.device) && PB.encode(e, 1, x.device) + !isempty(x.node_stats) && PB.encode(e, 2, x.node_stats) + !isempty(x.thread_names) && PB.encode(e, 3, x.thread_names) + return position(e.io) - initpos +end +function PB._encoded_size(x::DeviceStepStats) + encoded_size = 0 + !isempty(x.device) && (encoded_size += PB._encoded_size(x.device, 1)) + !isempty(x.node_stats) && (encoded_size += PB._encoded_size(x.node_stats, 2)) + !isempty(x.thread_names) && (encoded_size += PB._encoded_size(x.thread_names, 3)) + return encoded_size +end + +struct StepStats + dev_stats::Vector{DeviceStepStats} +end +PB.default_values(::Type{StepStats}) = (;dev_stats = Vector{DeviceStepStats}()) +PB.field_numbers(::Type{StepStats}) = (;dev_stats = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:StepStats}) + dev_stats = PB.BufferedVector{DeviceStepStats}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, dev_stats) + else + PB.skip(d, wire_type) + end + end + return StepStats(dev_stats[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::StepStats) + initpos = position(e.io) + !isempty(x.dev_stats) && PB.encode(e, 1, x.dev_stats) + return position(e.io) - initpos +end +function PB._encoded_size(x::StepStats) + encoded_size = 0 + !isempty(x.dev_stats) && (encoded_size += PB._encoded_size(x.dev_stats, 1)) + return encoded_size +end diff --git a/src/protojl/tensorboard/tensorboard/struct_tb_pb.jl b/src/protojl/tensorboard/tensorboard/struct_tb_pb.jl new file mode 100644 index 0000000..02cb46e --- /dev/null +++ b/src/protojl/tensorboard/tensorboard/struct_tb_pb.jl @@ -0,0 +1,471 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:24.578 +# original file: /home/lior/TensorBoardLogger.jl/gen/proto/tensorboard/compat/proto/struct_tb.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export NoneValue, var"TypeSpecProto.TypeSpecClass", BoundedTensorSpecProto, TensorSpecProto +export ListValue, TypeSpecProto, NamedTupleValue, PairValue, DictValue, StructuredValue +export TupleValue + +# Abstract types to help resolve mutually recursive definitions +abstract type var"##AbstractListValue" end +abstract type var"##AbstractTypeSpecProto" end +abstract type var"##AbstractNamedTupleValue" end +abstract type var"##AbstractPairValue" end +abstract type var"##AbstractDictValue" end +abstract type var"##AbstractStructuredValue" end +abstract type var"##AbstractTupleValue" end + + +struct NoneValue end + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:NoneValue}) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + PB.skip(d, wire_type) + end + return NoneValue() +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::NoneValue) + initpos = position(e.io) + return position(e.io) - initpos +end +function PB._encoded_size(x::NoneValue) + encoded_size = 0 + return encoded_size +end + +@enumx var"TypeSpecProto.TypeSpecClass" UNKNOWN=0 SPARSE_TENSOR_SPEC=1 INDEXED_SLICES_SPEC=2 RAGGED_TENSOR_SPEC=3 TENSOR_ARRAY_SPEC=4 DATA_DATASET_SPEC=5 DATA_ITERATOR_SPEC=6 OPTIONAL_SPEC=7 PER_REPLICA_SPEC=8 VARIABLE_SPEC=9 ROW_PARTITION_SPEC=10 REGISTERED_TYPE_SPEC=12 EXTENSION_TYPE_SPEC=13 +PB.reserved_fields(::Type{var"TypeSpecProto.TypeSpecClass".T}) = (names = String[], numbers = Union{Int,UnitRange{Int}}[11]) + +struct BoundedTensorSpecProto + name::String + shape::Union{Nothing,TensorShapeProto} + dtype::var"#DataType".T + minimum::Union{Nothing,TensorProto} + maximum::Union{Nothing,TensorProto} +end +PB.default_values(::Type{BoundedTensorSpecProto}) = (;name = "", shape = nothing, dtype = var"#DataType".DT_INVALID, minimum = nothing, maximum = nothing) +PB.field_numbers(::Type{BoundedTensorSpecProto}) = (;name = 1, shape = 2, dtype = 3, minimum = 4, maximum = 5) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:BoundedTensorSpecProto}) + name = "" + shape = Ref{Union{Nothing,TensorShapeProto}}(nothing) + dtype = var"#DataType".DT_INVALID + minimum = Ref{Union{Nothing,TensorProto}}(nothing) + maximum = Ref{Union{Nothing,TensorProto}}(nothing) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + name = PB.decode(d, String) + elseif field_number == 2 + PB.decode!(d, shape) + elseif field_number == 3 + dtype = PB.decode(d, var"#DataType".T) + elseif field_number == 4 + PB.decode!(d, minimum) + elseif field_number == 5 + PB.decode!(d, maximum) + else + PB.skip(d, wire_type) + end + end + return BoundedTensorSpecProto(name, shape[], dtype, minimum[], maximum[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::BoundedTensorSpecProto) + initpos = position(e.io) + !isempty(x.name) && PB.encode(e, 1, x.name) + !isnothing(x.shape) && PB.encode(e, 2, x.shape) + x.dtype != var"#DataType".DT_INVALID && PB.encode(e, 3, x.dtype) + !isnothing(x.minimum) && PB.encode(e, 4, x.minimum) + !isnothing(x.maximum) && PB.encode(e, 5, x.maximum) + return position(e.io) - initpos +end +function PB._encoded_size(x::BoundedTensorSpecProto) + encoded_size = 0 + !isempty(x.name) && (encoded_size += PB._encoded_size(x.name, 1)) + !isnothing(x.shape) && (encoded_size += PB._encoded_size(x.shape, 2)) + x.dtype != var"#DataType".DT_INVALID && (encoded_size += PB._encoded_size(x.dtype, 3)) + !isnothing(x.minimum) && (encoded_size += PB._encoded_size(x.minimum, 4)) + !isnothing(x.maximum) && (encoded_size += PB._encoded_size(x.maximum, 5)) + return encoded_size +end + +struct TensorSpecProto + name::String + shape::Union{Nothing,TensorShapeProto} + dtype::var"#DataType".T +end +PB.default_values(::Type{TensorSpecProto}) = (;name = "", shape = nothing, dtype = var"#DataType".DT_INVALID) +PB.field_numbers(::Type{TensorSpecProto}) = (;name = 1, shape = 2, dtype = 3) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:TensorSpecProto}) + name = "" + shape = Ref{Union{Nothing,TensorShapeProto}}(nothing) + dtype = var"#DataType".DT_INVALID + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + name = PB.decode(d, String) + elseif field_number == 2 + PB.decode!(d, shape) + elseif field_number == 3 + dtype = PB.decode(d, var"#DataType".T) + else + PB.skip(d, wire_type) + end + end + return TensorSpecProto(name, shape[], dtype) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::TensorSpecProto) + initpos = position(e.io) + !isempty(x.name) && PB.encode(e, 1, x.name) + !isnothing(x.shape) && PB.encode(e, 2, x.shape) + x.dtype != var"#DataType".DT_INVALID && PB.encode(e, 3, x.dtype) + return position(e.io) - initpos +end +function PB._encoded_size(x::TensorSpecProto) + encoded_size = 0 + !isempty(x.name) && (encoded_size += PB._encoded_size(x.name, 1)) + !isnothing(x.shape) && (encoded_size += PB._encoded_size(x.shape, 2)) + x.dtype != var"#DataType".DT_INVALID && (encoded_size += PB._encoded_size(x.dtype, 3)) + return encoded_size +end + +struct ListValue{T1<:Union{Nothing,var"##AbstractStructuredValue"}} <: var"##AbstractListValue" + values::Vector{T1} +end +PB.default_values(::Type{ListValue}) = (;values = Vector{StructuredValue}()) +PB.field_numbers(::Type{ListValue}) = (;values = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:ListValue}) + values = PB.BufferedVector{StructuredValue}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, values) + else + PB.skip(d, wire_type) + end + end + return ListValue(values[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::ListValue) + initpos = position(e.io) + !isempty(x.values) && PB.encode(e, 1, x.values) + return position(e.io) - initpos +end +function PB._encoded_size(x::ListValue) + encoded_size = 0 + !isempty(x.values) && (encoded_size += PB._encoded_size(x.values, 1)) + return encoded_size +end + +struct TypeSpecProto{T1<:Union{Nothing,var"##AbstractStructuredValue"}} <: var"##AbstractTypeSpecProto" + type_spec_class::var"TypeSpecProto.TypeSpecClass".T + type_state::T1 + type_spec_class_name::String + num_flat_components::Int32 +end +PB.default_values(::Type{TypeSpecProto}) = (;type_spec_class = var"TypeSpecProto.TypeSpecClass".UNKNOWN, type_state = nothing, type_spec_class_name = "", num_flat_components = zero(Int32)) +PB.field_numbers(::Type{TypeSpecProto}) = (;type_spec_class = 1, type_state = 2, type_spec_class_name = 3, num_flat_components = 4) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:TypeSpecProto}) + type_spec_class = var"TypeSpecProto.TypeSpecClass".UNKNOWN + type_state = Ref{Union{Nothing,StructuredValue}}(nothing) + type_spec_class_name = "" + num_flat_components = zero(Int32) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + type_spec_class = PB.decode(d, var"TypeSpecProto.TypeSpecClass".T) + elseif field_number == 2 + PB.decode!(d, type_state) + elseif field_number == 3 + type_spec_class_name = PB.decode(d, String) + elseif field_number == 4 + num_flat_components = PB.decode(d, Int32) + else + PB.skip(d, wire_type) + end + end + return TypeSpecProto(type_spec_class, type_state[], type_spec_class_name, num_flat_components) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::TypeSpecProto) + initpos = position(e.io) + x.type_spec_class != var"TypeSpecProto.TypeSpecClass".UNKNOWN && PB.encode(e, 1, x.type_spec_class) + !isnothing(x.type_state) && PB.encode(e, 2, x.type_state) + !isempty(x.type_spec_class_name) && PB.encode(e, 3, x.type_spec_class_name) + x.num_flat_components != zero(Int32) && PB.encode(e, 4, x.num_flat_components) + return position(e.io) - initpos +end +function PB._encoded_size(x::TypeSpecProto) + encoded_size = 0 + x.type_spec_class != var"TypeSpecProto.TypeSpecClass".UNKNOWN && (encoded_size += PB._encoded_size(x.type_spec_class, 1)) + !isnothing(x.type_state) && (encoded_size += PB._encoded_size(x.type_state, 2)) + !isempty(x.type_spec_class_name) && (encoded_size += PB._encoded_size(x.type_spec_class_name, 3)) + x.num_flat_components != zero(Int32) && (encoded_size += PB._encoded_size(x.num_flat_components, 4)) + return encoded_size +end + +struct NamedTupleValue{T1<:Union{Nothing,var"##AbstractPairValue"}} <: var"##AbstractNamedTupleValue" + name::String + values::Vector{T1} +end +PB.default_values(::Type{NamedTupleValue}) = (;name = "", values = Vector{PairValue}()) +PB.field_numbers(::Type{NamedTupleValue}) = (;name = 1, values = 2) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:NamedTupleValue}) + name = "" + values = PB.BufferedVector{PairValue}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + name = PB.decode(d, String) + elseif field_number == 2 + PB.decode!(d, values) + else + PB.skip(d, wire_type) + end + end + return NamedTupleValue(name, values[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::NamedTupleValue) + initpos = position(e.io) + !isempty(x.name) && PB.encode(e, 1, x.name) + !isempty(x.values) && PB.encode(e, 2, x.values) + return position(e.io) - initpos +end +function PB._encoded_size(x::NamedTupleValue) + encoded_size = 0 + !isempty(x.name) && (encoded_size += PB._encoded_size(x.name, 1)) + !isempty(x.values) && (encoded_size += PB._encoded_size(x.values, 2)) + return encoded_size +end + +struct PairValue{T1<:Union{Nothing,var"##AbstractStructuredValue"}} <: var"##AbstractPairValue" + key::String + value::T1 +end +PB.default_values(::Type{PairValue}) = (;key = "", value = nothing) +PB.field_numbers(::Type{PairValue}) = (;key = 1, value = 2) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:PairValue}) + key = "" + value = Ref{Union{Nothing,StructuredValue}}(nothing) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + key = PB.decode(d, String) + elseif field_number == 2 + PB.decode!(d, value) + else + PB.skip(d, wire_type) + end + end + return PairValue(key, value[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::PairValue) + initpos = position(e.io) + !isempty(x.key) && PB.encode(e, 1, x.key) + !isnothing(x.value) && PB.encode(e, 2, x.value) + return position(e.io) - initpos +end +function PB._encoded_size(x::PairValue) + encoded_size = 0 + !isempty(x.key) && (encoded_size += PB._encoded_size(x.key, 1)) + !isnothing(x.value) && (encoded_size += PB._encoded_size(x.value, 2)) + return encoded_size +end + +struct DictValue{T1<:Union{Nothing,var"##AbstractStructuredValue"}} <: var"##AbstractDictValue" + fields::Dict{String,T1} +end +PB.default_values(::Type{DictValue}) = (;fields = Dict{String,StructuredValue}()) +PB.field_numbers(::Type{DictValue}) = (;fields = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:DictValue}) + fields = Dict{String,StructuredValue}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, fields) + else + PB.skip(d, wire_type) + end + end + return DictValue(fields) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::DictValue) + initpos = position(e.io) + !isempty(x.fields) && PB.encode(e, 1, x.fields) + return position(e.io) - initpos +end +function PB._encoded_size(x::DictValue) + encoded_size = 0 + !isempty(x.fields) && (encoded_size += PB._encoded_size(x.fields, 1)) + return encoded_size +end + +struct StructuredValue <: var"##AbstractStructuredValue" + kind::Union{Nothing,OneOf{<:Union{NoneValue,Float64,Int64,String,Bool,TensorShapeProto,var"#DataType".T,TensorSpecProto,var"##AbstractTypeSpecProto",BoundedTensorSpecProto,var"##AbstractListValue",var"##AbstractTupleValue",var"##AbstractDictValue",var"##AbstractNamedTupleValue",TensorProto}}} +end +PB.oneof_field_types(::Type{StructuredValue}) = (; + kind = (;none_value=NoneValue, float64_value=Float64, int64_value=Int64, string_value=String, bool_value=Bool, tensor_shape_value=TensorShapeProto, tensor_dtype_value=var"#DataType".T, tensor_spec_value=TensorSpecProto, type_spec_value=TypeSpecProto, bounded_tensor_spec_value=BoundedTensorSpecProto, list_value=ListValue, tuple_value=TupleValue, dict_value=DictValue, named_tuple_value=NamedTupleValue, tensor_value=TensorProto), +) +PB.default_values(::Type{StructuredValue}) = (;none_value = nothing, float64_value = zero(Float64), int64_value = zero(Int64), string_value = "", bool_value = false, tensor_shape_value = nothing, tensor_dtype_value = var"#DataType".DT_INVALID, tensor_spec_value = nothing, type_spec_value = nothing, bounded_tensor_spec_value = nothing, list_value = nothing, tuple_value = nothing, dict_value = nothing, named_tuple_value = nothing, tensor_value = nothing) +PB.field_numbers(::Type{StructuredValue}) = (;none_value = 1, float64_value = 11, int64_value = 12, string_value = 13, bool_value = 14, tensor_shape_value = 31, tensor_dtype_value = 32, tensor_spec_value = 33, type_spec_value = 34, bounded_tensor_spec_value = 35, list_value = 51, tuple_value = 52, dict_value = 53, named_tuple_value = 54, tensor_value = 55) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:StructuredValue}) + kind = nothing + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + kind = OneOf(:none_value, PB.decode(d, Ref{NoneValue})) + elseif field_number == 11 + kind = OneOf(:float64_value, PB.decode(d, Float64)) + elseif field_number == 12 + kind = OneOf(:int64_value, PB.decode(d, Int64, Val{:zigzag})) + elseif field_number == 13 + kind = OneOf(:string_value, PB.decode(d, String)) + elseif field_number == 14 + kind = OneOf(:bool_value, PB.decode(d, Bool)) + elseif field_number == 31 + kind = OneOf(:tensor_shape_value, PB.decode(d, Ref{TensorShapeProto})) + elseif field_number == 32 + kind = OneOf(:tensor_dtype_value, PB.decode(d, var"#DataType".T)) + elseif field_number == 33 + kind = OneOf(:tensor_spec_value, PB.decode(d, Ref{TensorSpecProto})) + elseif field_number == 34 + kind = OneOf(:type_spec_value, PB.decode(d, Ref{TypeSpecProto})) + elseif field_number == 35 + kind = OneOf(:bounded_tensor_spec_value, PB.decode(d, Ref{BoundedTensorSpecProto})) + elseif field_number == 51 + kind = OneOf(:list_value, PB.decode(d, Ref{ListValue})) + elseif field_number == 52 + kind = OneOf(:tuple_value, PB.decode(d, Ref{TupleValue})) + elseif field_number == 53 + kind = OneOf(:dict_value, PB.decode(d, Ref{DictValue})) + elseif field_number == 54 + kind = OneOf(:named_tuple_value, PB.decode(d, Ref{NamedTupleValue})) + elseif field_number == 55 + kind = OneOf(:tensor_value, PB.decode(d, Ref{TensorProto})) + else + PB.skip(d, wire_type) + end + end + return StructuredValue(kind) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::StructuredValue) + initpos = position(e.io) + if isnothing(x.kind); + elseif x.kind.name === :none_value + PB.encode(e, 1, x.kind[]::NoneValue) + elseif x.kind.name === :float64_value + PB.encode(e, 11, x.kind[]::Float64) + elseif x.kind.name === :int64_value + PB.encode(e, 12, x.kind[]::Int64, Val{:zigzag}) + elseif x.kind.name === :string_value + PB.encode(e, 13, x.kind[]::String) + elseif x.kind.name === :bool_value + PB.encode(e, 14, x.kind[]::Bool) + elseif x.kind.name === :tensor_shape_value + PB.encode(e, 31, x.kind[]::TensorShapeProto) + elseif x.kind.name === :tensor_dtype_value + PB.encode(e, 32, x.kind[]::var"#DataType".T) + elseif x.kind.name === :tensor_spec_value + PB.encode(e, 33, x.kind[]::TensorSpecProto) + elseif x.kind.name === :type_spec_value + PB.encode(e, 34, x.kind[]::TypeSpecProto) + elseif x.kind.name === :bounded_tensor_spec_value + PB.encode(e, 35, x.kind[]::BoundedTensorSpecProto) + elseif x.kind.name === :list_value + PB.encode(e, 51, x.kind[]::ListValue) + elseif x.kind.name === :tuple_value + PB.encode(e, 52, x.kind[]::TupleValue) + elseif x.kind.name === :dict_value + PB.encode(e, 53, x.kind[]::DictValue) + elseif x.kind.name === :named_tuple_value + PB.encode(e, 54, x.kind[]::NamedTupleValue) + elseif x.kind.name === :tensor_value + PB.encode(e, 55, x.kind[]::TensorProto) + end + return position(e.io) - initpos +end +function PB._encoded_size(x::StructuredValue) + encoded_size = 0 + if isnothing(x.kind); + elseif x.kind.name === :none_value + encoded_size += PB._encoded_size(x.kind[]::NoneValue, 1) + elseif x.kind.name === :float64_value + encoded_size += PB._encoded_size(x.kind[]::Float64, 11) + elseif x.kind.name === :int64_value + encoded_size += PB._encoded_size(x.kind[]::Int64, 12, Val{:zigzag}) + elseif x.kind.name === :string_value + encoded_size += PB._encoded_size(x.kind[]::String, 13) + elseif x.kind.name === :bool_value + encoded_size += PB._encoded_size(x.kind[]::Bool, 14) + elseif x.kind.name === :tensor_shape_value + encoded_size += PB._encoded_size(x.kind[]::TensorShapeProto, 31) + elseif x.kind.name === :tensor_dtype_value + encoded_size += PB._encoded_size(x.kind[]::var"#DataType".T, 32) + elseif x.kind.name === :tensor_spec_value + encoded_size += PB._encoded_size(x.kind[]::TensorSpecProto, 33) + elseif x.kind.name === :type_spec_value + encoded_size += PB._encoded_size(x.kind[]::TypeSpecProto, 34) + elseif x.kind.name === :bounded_tensor_spec_value + encoded_size += PB._encoded_size(x.kind[]::BoundedTensorSpecProto, 35) + elseif x.kind.name === :list_value + encoded_size += PB._encoded_size(x.kind[]::ListValue, 51) + elseif x.kind.name === :tuple_value + encoded_size += PB._encoded_size(x.kind[]::TupleValue, 52) + elseif x.kind.name === :dict_value + encoded_size += PB._encoded_size(x.kind[]::DictValue, 53) + elseif x.kind.name === :named_tuple_value + encoded_size += PB._encoded_size(x.kind[]::NamedTupleValue, 54) + elseif x.kind.name === :tensor_value + encoded_size += PB._encoded_size(x.kind[]::TensorProto, 55) + end + return encoded_size +end + +struct TupleValue <: var"##AbstractTupleValue" + values::Vector{<:StructuredValue} +end +PB.default_values(::Type{TupleValue}) = (;values = Vector{StructuredValue}()) +PB.field_numbers(::Type{TupleValue}) = (;values = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:TupleValue}) + values = PB.BufferedVector{StructuredValue}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, values) + else + PB.skip(d, wire_type) + end + end + return TupleValue(values[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::TupleValue) + initpos = position(e.io) + !isempty(x.values) && PB.encode(e, 1, x.values) + return position(e.io) - initpos +end +function PB._encoded_size(x::TupleValue) + encoded_size = 0 + !isempty(x.values) && (encoded_size += PB._encoded_size(x.values, 1)) + return encoded_size +end diff --git a/src/protojl/tensorboard/tensorboard/summary_pb.jl b/src/protojl/tensorboard/tensorboard/summary_pb.jl new file mode 100644 index 0000000..c1742e6 --- /dev/null +++ b/src/protojl/tensorboard/tensorboard/summary_pb.jl @@ -0,0 +1,344 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:24.774 +# original file: /home/lior/TensorBoardLogger.jl/gen/proto/tensorboard/compat/proto/summary.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export var"SummaryMetadata.PluginData", DataClass, var"Summary.Audio", var"Summary.Image" +export SummaryDescription, SummaryMetadata, var"Summary.Value", Summary + +struct var"SummaryMetadata.PluginData" + plugin_name::String + content::Vector{UInt8} +end +PB.default_values(::Type{var"SummaryMetadata.PluginData"}) = (;plugin_name = "", content = UInt8[]) +PB.field_numbers(::Type{var"SummaryMetadata.PluginData"}) = (;plugin_name = 1, content = 2) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"SummaryMetadata.PluginData"}) + plugin_name = "" + content = UInt8[] + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + plugin_name = PB.decode(d, String) + elseif field_number == 2 + content = PB.decode(d, Vector{UInt8}) + else + PB.skip(d, wire_type) + end + end + return var"SummaryMetadata.PluginData"(plugin_name, content) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"SummaryMetadata.PluginData") + initpos = position(e.io) + !isempty(x.plugin_name) && PB.encode(e, 1, x.plugin_name) + !isempty(x.content) && PB.encode(e, 2, x.content) + return position(e.io) - initpos +end +function PB._encoded_size(x::var"SummaryMetadata.PluginData") + encoded_size = 0 + !isempty(x.plugin_name) && (encoded_size += PB._encoded_size(x.plugin_name, 1)) + !isempty(x.content) && (encoded_size += PB._encoded_size(x.content, 2)) + return encoded_size +end + +@enumx DataClass DATA_CLASS_UNKNOWN=0 DATA_CLASS_SCALAR=1 DATA_CLASS_TENSOR=2 DATA_CLASS_BLOB_SEQUENCE=3 + +struct var"Summary.Audio" + sample_rate::Float32 + num_channels::Int64 + length_frames::Int64 + encoded_audio_string::Vector{UInt8} + content_type::String +end +PB.default_values(::Type{var"Summary.Audio"}) = (;sample_rate = zero(Float32), num_channels = zero(Int64), length_frames = zero(Int64), encoded_audio_string = UInt8[], content_type = "") +PB.field_numbers(::Type{var"Summary.Audio"}) = (;sample_rate = 1, num_channels = 2, length_frames = 3, encoded_audio_string = 4, content_type = 5) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"Summary.Audio"}) + sample_rate = zero(Float32) + num_channels = zero(Int64) + length_frames = zero(Int64) + encoded_audio_string = UInt8[] + content_type = "" + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + sample_rate = PB.decode(d, Float32) + elseif field_number == 2 + num_channels = PB.decode(d, Int64) + elseif field_number == 3 + length_frames = PB.decode(d, Int64) + elseif field_number == 4 + encoded_audio_string = PB.decode(d, Vector{UInt8}) + elseif field_number == 5 + content_type = PB.decode(d, String) + else + PB.skip(d, wire_type) + end + end + return var"Summary.Audio"(sample_rate, num_channels, length_frames, encoded_audio_string, content_type) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"Summary.Audio") + initpos = position(e.io) + x.sample_rate != zero(Float32) && PB.encode(e, 1, x.sample_rate) + x.num_channels != zero(Int64) && PB.encode(e, 2, x.num_channels) + x.length_frames != zero(Int64) && PB.encode(e, 3, x.length_frames) + !isempty(x.encoded_audio_string) && PB.encode(e, 4, x.encoded_audio_string) + !isempty(x.content_type) && PB.encode(e, 5, x.content_type) + return position(e.io) - initpos +end +function PB._encoded_size(x::var"Summary.Audio") + encoded_size = 0 + x.sample_rate != zero(Float32) && (encoded_size += PB._encoded_size(x.sample_rate, 1)) + x.num_channels != zero(Int64) && (encoded_size += PB._encoded_size(x.num_channels, 2)) + x.length_frames != zero(Int64) && (encoded_size += PB._encoded_size(x.length_frames, 3)) + !isempty(x.encoded_audio_string) && (encoded_size += PB._encoded_size(x.encoded_audio_string, 4)) + !isempty(x.content_type) && (encoded_size += PB._encoded_size(x.content_type, 5)) + return encoded_size +end + +struct var"Summary.Image" + height::Int32 + width::Int32 + colorspace::Int32 + encoded_image_string::Vector{UInt8} +end +PB.default_values(::Type{var"Summary.Image"}) = (;height = zero(Int32), width = zero(Int32), colorspace = zero(Int32), encoded_image_string = UInt8[]) +PB.field_numbers(::Type{var"Summary.Image"}) = (;height = 1, width = 2, colorspace = 3, encoded_image_string = 4) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"Summary.Image"}) + height = zero(Int32) + width = zero(Int32) + colorspace = zero(Int32) + encoded_image_string = UInt8[] + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + height = PB.decode(d, Int32) + elseif field_number == 2 + width = PB.decode(d, Int32) + elseif field_number == 3 + colorspace = PB.decode(d, Int32) + elseif field_number == 4 + encoded_image_string = PB.decode(d, Vector{UInt8}) + else + PB.skip(d, wire_type) + end + end + return var"Summary.Image"(height, width, colorspace, encoded_image_string) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"Summary.Image") + initpos = position(e.io) + x.height != zero(Int32) && PB.encode(e, 1, x.height) + x.width != zero(Int32) && PB.encode(e, 2, x.width) + x.colorspace != zero(Int32) && PB.encode(e, 3, x.colorspace) + !isempty(x.encoded_image_string) && PB.encode(e, 4, x.encoded_image_string) + return position(e.io) - initpos +end +function PB._encoded_size(x::var"Summary.Image") + encoded_size = 0 + x.height != zero(Int32) && (encoded_size += PB._encoded_size(x.height, 1)) + x.width != zero(Int32) && (encoded_size += PB._encoded_size(x.width, 2)) + x.colorspace != zero(Int32) && (encoded_size += PB._encoded_size(x.colorspace, 3)) + !isempty(x.encoded_image_string) && (encoded_size += PB._encoded_size(x.encoded_image_string, 4)) + return encoded_size +end + +struct SummaryDescription + type_hint::String +end +PB.default_values(::Type{SummaryDescription}) = (;type_hint = "") +PB.field_numbers(::Type{SummaryDescription}) = (;type_hint = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:SummaryDescription}) + type_hint = "" + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + type_hint = PB.decode(d, String) + else + PB.skip(d, wire_type) + end + end + return SummaryDescription(type_hint) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::SummaryDescription) + initpos = position(e.io) + !isempty(x.type_hint) && PB.encode(e, 1, x.type_hint) + return position(e.io) - initpos +end +function PB._encoded_size(x::SummaryDescription) + encoded_size = 0 + !isempty(x.type_hint) && (encoded_size += PB._encoded_size(x.type_hint, 1)) + return encoded_size +end + +struct SummaryMetadata + plugin_data::Union{Nothing,var"SummaryMetadata.PluginData"} + display_name::String + summary_description::String + data_class::DataClass.T +end +PB.default_values(::Type{SummaryMetadata}) = (;plugin_data = nothing, display_name = "", summary_description = "", data_class = DataClass.DATA_CLASS_UNKNOWN) +PB.field_numbers(::Type{SummaryMetadata}) = (;plugin_data = 1, display_name = 2, summary_description = 3, data_class = 4) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:SummaryMetadata}) + plugin_data = Ref{Union{Nothing,var"SummaryMetadata.PluginData"}}(nothing) + display_name = "" + summary_description = "" + data_class = DataClass.DATA_CLASS_UNKNOWN + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, plugin_data) + elseif field_number == 2 + display_name = PB.decode(d, String) + elseif field_number == 3 + summary_description = PB.decode(d, String) + elseif field_number == 4 + data_class = PB.decode(d, DataClass.T) + else + PB.skip(d, wire_type) + end + end + return SummaryMetadata(plugin_data[], display_name, summary_description, data_class) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::SummaryMetadata) + initpos = position(e.io) + !isnothing(x.plugin_data) && PB.encode(e, 1, x.plugin_data) + !isempty(x.display_name) && PB.encode(e, 2, x.display_name) + !isempty(x.summary_description) && PB.encode(e, 3, x.summary_description) + x.data_class != DataClass.DATA_CLASS_UNKNOWN && PB.encode(e, 4, x.data_class) + return position(e.io) - initpos +end +function PB._encoded_size(x::SummaryMetadata) + encoded_size = 0 + !isnothing(x.plugin_data) && (encoded_size += PB._encoded_size(x.plugin_data, 1)) + !isempty(x.display_name) && (encoded_size += PB._encoded_size(x.display_name, 2)) + !isempty(x.summary_description) && (encoded_size += PB._encoded_size(x.summary_description, 3)) + x.data_class != DataClass.DATA_CLASS_UNKNOWN && (encoded_size += PB._encoded_size(x.data_class, 4)) + return encoded_size +end + +struct var"Summary.Value" + node_name::String + tag::String + metadata::Union{Nothing,SummaryMetadata} + value::Union{Nothing,OneOf{<:Union{Float32,Vector{UInt8},var"Summary.Image",HistogramProto,var"Summary.Audio",TensorProto}}} +end +PB.oneof_field_types(::Type{var"Summary.Value"}) = (; + value = (;simple_value=Float32, obsolete_old_style_histogram=Vector{UInt8}, image=var"Summary.Image", histo=HistogramProto, audio=var"Summary.Audio", tensor=TensorProto), +) +PB.default_values(::Type{var"Summary.Value"}) = (;node_name = "", tag = "", metadata = nothing, simple_value = zero(Float32), obsolete_old_style_histogram = UInt8[], image = nothing, histo = nothing, audio = nothing, tensor = nothing) +PB.field_numbers(::Type{var"Summary.Value"}) = (;node_name = 7, tag = 1, metadata = 9, simple_value = 2, obsolete_old_style_histogram = 3, image = 4, histo = 5, audio = 6, tensor = 8) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"Summary.Value"}) + node_name = "" + tag = "" + metadata = Ref{Union{Nothing,SummaryMetadata}}(nothing) + value = nothing + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 7 + node_name = PB.decode(d, String) + elseif field_number == 1 + tag = PB.decode(d, String) + elseif field_number == 9 + PB.decode!(d, metadata) + elseif field_number == 2 + value = OneOf(:simple_value, PB.decode(d, Float32)) + elseif field_number == 3 + value = OneOf(:obsolete_old_style_histogram, PB.decode(d, Vector{UInt8})) + elseif field_number == 4 + value = OneOf(:image, PB.decode(d, Ref{var"Summary.Image"})) + elseif field_number == 5 + value = OneOf(:histo, PB.decode(d, Ref{HistogramProto})) + elseif field_number == 6 + value = OneOf(:audio, PB.decode(d, Ref{var"Summary.Audio"})) + elseif field_number == 8 + value = OneOf(:tensor, PB.decode(d, Ref{TensorProto})) + else + PB.skip(d, wire_type) + end + end + return var"Summary.Value"(node_name, tag, metadata[], value) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"Summary.Value") + initpos = position(e.io) + !isempty(x.node_name) && PB.encode(e, 7, x.node_name) + !isempty(x.tag) && PB.encode(e, 1, x.tag) + !isnothing(x.metadata) && PB.encode(e, 9, x.metadata) + if isnothing(x.value); + elseif x.value.name === :simple_value + PB.encode(e, 2, x.value[]::Float32) + elseif x.value.name === :obsolete_old_style_histogram + PB.encode(e, 3, x.value[]::Vector{UInt8}) + elseif x.value.name === :image + PB.encode(e, 4, x.value[]::var"Summary.Image") + elseif x.value.name === :histo + PB.encode(e, 5, x.value[]::HistogramProto) + elseif x.value.name === :audio + PB.encode(e, 6, x.value[]::var"Summary.Audio") + elseif x.value.name === :tensor + PB.encode(e, 8, x.value[]::TensorProto) + end + return position(e.io) - initpos +end +function PB._encoded_size(x::var"Summary.Value") + encoded_size = 0 + !isempty(x.node_name) && (encoded_size += PB._encoded_size(x.node_name, 7)) + !isempty(x.tag) && (encoded_size += PB._encoded_size(x.tag, 1)) + !isnothing(x.metadata) && (encoded_size += PB._encoded_size(x.metadata, 9)) + if isnothing(x.value); + elseif x.value.name === :simple_value + encoded_size += PB._encoded_size(x.value[]::Float32, 2) + elseif x.value.name === :obsolete_old_style_histogram + encoded_size += PB._encoded_size(x.value[]::Vector{UInt8}, 3) + elseif x.value.name === :image + encoded_size += PB._encoded_size(x.value[]::var"Summary.Image", 4) + elseif x.value.name === :histo + encoded_size += PB._encoded_size(x.value[]::HistogramProto, 5) + elseif x.value.name === :audio + encoded_size += PB._encoded_size(x.value[]::var"Summary.Audio", 6) + elseif x.value.name === :tensor + encoded_size += PB._encoded_size(x.value[]::TensorProto, 8) + end + return encoded_size +end + +struct Summary + value::Vector{var"Summary.Value"} +end +PB.default_values(::Type{Summary}) = (;value = Vector{var"Summary.Value"}()) +PB.field_numbers(::Type{Summary}) = (;value = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:Summary}) + value = PB.BufferedVector{var"Summary.Value"}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, value) + else + PB.skip(d, wire_type) + end + end + return Summary(value[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::Summary) + initpos = position(e.io) + !isempty(x.value) && PB.encode(e, 1, x.value) + return position(e.io) - initpos +end +function PB._encoded_size(x::Summary) + encoded_size = 0 + !isempty(x.value) && (encoded_size += PB._encoded_size(x.value, 1)) + return encoded_size +end diff --git a/src/protojl/tensorboard/tensorboard/tensor_description_pb.jl b/src/protojl/tensorboard/tensorboard/tensor_description_pb.jl new file mode 100644 index 0000000..e082f03 --- /dev/null +++ b/src/protojl/tensorboard/tensorboard/tensor_description_pb.jl @@ -0,0 +1,50 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:24.424 +# original file: /home/lior/TensorBoardLogger.jl/gen/proto/tensorboard/compat/proto/tensor_description.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export TensorDescription + +struct TensorDescription + dtype::var"#DataType".T + shape::Union{Nothing,TensorShapeProto} + allocation_description::Union{Nothing,AllocationDescription} +end +PB.default_values(::Type{TensorDescription}) = (;dtype = var"#DataType".DT_INVALID, shape = nothing, allocation_description = nothing) +PB.field_numbers(::Type{TensorDescription}) = (;dtype = 1, shape = 2, allocation_description = 4) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:TensorDescription}) + dtype = var"#DataType".DT_INVALID + shape = Ref{Union{Nothing,TensorShapeProto}}(nothing) + allocation_description = Ref{Union{Nothing,AllocationDescription}}(nothing) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + dtype = PB.decode(d, var"#DataType".T) + elseif field_number == 2 + PB.decode!(d, shape) + elseif field_number == 4 + PB.decode!(d, allocation_description) + else + PB.skip(d, wire_type) + end + end + return TensorDescription(dtype, shape[], allocation_description[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::TensorDescription) + initpos = position(e.io) + x.dtype != var"#DataType".DT_INVALID && PB.encode(e, 1, x.dtype) + !isnothing(x.shape) && PB.encode(e, 2, x.shape) + !isnothing(x.allocation_description) && PB.encode(e, 4, x.allocation_description) + return position(e.io) - initpos +end +function PB._encoded_size(x::TensorDescription) + encoded_size = 0 + x.dtype != var"#DataType".DT_INVALID && (encoded_size += PB._encoded_size(x.dtype, 1)) + !isnothing(x.shape) && (encoded_size += PB._encoded_size(x.shape, 2)) + !isnothing(x.allocation_description) && (encoded_size += PB._encoded_size(x.allocation_description, 4)) + return encoded_size +end diff --git a/src/protojl/tensorboard/tensorboard/tensor_pb.jl b/src/protojl/tensorboard/tensorboard/tensor_pb.jl new file mode 100644 index 0000000..a245583 --- /dev/null +++ b/src/protojl/tensorboard/tensorboard/tensor_pb.jl @@ -0,0 +1,187 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:24.489 +# original file: /home/lior/TensorBoardLogger.jl/gen/proto/tensorboard/compat/proto/tensor.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export TensorProto, VariantTensorDataProto + +# Abstract types to help resolve mutually recursive definitions +abstract type var"##AbstractTensorProto" end +abstract type var"##AbstractVariantTensorDataProto" end + + +struct TensorProto{T1<:Union{Nothing,var"##AbstractVariantTensorDataProto"}} <: var"##AbstractTensorProto" + dtype::var"#DataType".T + tensor_shape::Union{Nothing,TensorShapeProto} + version_number::Int32 + tensor_content::Vector{UInt8} + half_val::Vector{Int32} + float_val::Vector{Float32} + double_val::Vector{Float64} + int_val::Vector{Int32} + string_val::Vector{Vector{UInt8}} + scomplex_val::Vector{Float32} + int64_val::Vector{Int64} + bool_val::Vector{Bool} + dcomplex_val::Vector{Float64} + resource_handle_val::Vector{ResourceHandleProto} + variant_val::Vector{T1} + uint32_val::Vector{UInt32} + uint64_val::Vector{UInt64} + float8_val::Vector{UInt8} +end +PB.default_values(::Type{TensorProto}) = (;dtype = var"#DataType".DT_INVALID, tensor_shape = nothing, version_number = zero(Int32), tensor_content = UInt8[], half_val = Vector{Int32}(), float_val = Vector{Float32}(), double_val = Vector{Float64}(), int_val = Vector{Int32}(), string_val = Vector{Vector{UInt8}}(), scomplex_val = Vector{Float32}(), int64_val = Vector{Int64}(), bool_val = Vector{Bool}(), dcomplex_val = Vector{Float64}(), resource_handle_val = Vector{ResourceHandleProto}(), variant_val = Vector{VariantTensorDataProto}(), uint32_val = Vector{UInt32}(), uint64_val = Vector{UInt64}(), float8_val = UInt8[]) +PB.field_numbers(::Type{TensorProto}) = (;dtype = 1, tensor_shape = 2, version_number = 3, tensor_content = 4, half_val = 13, float_val = 5, double_val = 6, int_val = 7, string_val = 8, scomplex_val = 9, int64_val = 10, bool_val = 11, dcomplex_val = 12, resource_handle_val = 14, variant_val = 15, uint32_val = 16, uint64_val = 17, float8_val = 18) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:TensorProto}) + dtype = var"#DataType".DT_INVALID + tensor_shape = Ref{Union{Nothing,TensorShapeProto}}(nothing) + version_number = zero(Int32) + tensor_content = UInt8[] + half_val = PB.BufferedVector{Int32}() + float_val = PB.BufferedVector{Float32}() + double_val = PB.BufferedVector{Float64}() + int_val = PB.BufferedVector{Int32}() + string_val = PB.BufferedVector{Vector{UInt8}}() + scomplex_val = PB.BufferedVector{Float32}() + int64_val = PB.BufferedVector{Int64}() + bool_val = PB.BufferedVector{Bool}() + dcomplex_val = PB.BufferedVector{Float64}() + resource_handle_val = PB.BufferedVector{ResourceHandleProto}() + variant_val = PB.BufferedVector{VariantTensorDataProto}() + uint32_val = PB.BufferedVector{UInt32}() + uint64_val = PB.BufferedVector{UInt64}() + float8_val = UInt8[] + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + dtype = PB.decode(d, var"#DataType".T) + elseif field_number == 2 + PB.decode!(d, tensor_shape) + elseif field_number == 3 + version_number = PB.decode(d, Int32) + elseif field_number == 4 + tensor_content = PB.decode(d, Vector{UInt8}) + elseif field_number == 13 + PB.decode!(d, wire_type, half_val) + elseif field_number == 5 + PB.decode!(d, wire_type, float_val) + elseif field_number == 6 + PB.decode!(d, wire_type, double_val) + elseif field_number == 7 + PB.decode!(d, wire_type, int_val) + elseif field_number == 8 + PB.decode!(d, string_val) + elseif field_number == 9 + PB.decode!(d, wire_type, scomplex_val) + elseif field_number == 10 + PB.decode!(d, wire_type, int64_val) + elseif field_number == 11 + PB.decode!(d, wire_type, bool_val) + elseif field_number == 12 + PB.decode!(d, wire_type, dcomplex_val) + elseif field_number == 14 + PB.decode!(d, resource_handle_val) + elseif field_number == 15 + PB.decode!(d, variant_val) + elseif field_number == 16 + PB.decode!(d, wire_type, uint32_val) + elseif field_number == 17 + PB.decode!(d, wire_type, uint64_val) + elseif field_number == 18 + float8_val = PB.decode(d, Vector{UInt8}) + else + PB.skip(d, wire_type) + end + end + return TensorProto(dtype, tensor_shape[], version_number, tensor_content, half_val[], float_val[], double_val[], int_val[], string_val[], scomplex_val[], int64_val[], bool_val[], dcomplex_val[], resource_handle_val[], variant_val[], uint32_val[], uint64_val[], float8_val) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::TensorProto) + initpos = position(e.io) + x.dtype != var"#DataType".DT_INVALID && PB.encode(e, 1, x.dtype) + !isnothing(x.tensor_shape) && PB.encode(e, 2, x.tensor_shape) + x.version_number != zero(Int32) && PB.encode(e, 3, x.version_number) + !isempty(x.tensor_content) && PB.encode(e, 4, x.tensor_content) + !isempty(x.half_val) && PB.encode(e, 13, x.half_val) + !isempty(x.float_val) && PB.encode(e, 5, x.float_val) + !isempty(x.double_val) && PB.encode(e, 6, x.double_val) + !isempty(x.int_val) && PB.encode(e, 7, x.int_val) + !isempty(x.string_val) && PB.encode(e, 8, x.string_val) + !isempty(x.scomplex_val) && PB.encode(e, 9, x.scomplex_val) + !isempty(x.int64_val) && PB.encode(e, 10, x.int64_val) + !isempty(x.bool_val) && PB.encode(e, 11, x.bool_val) + !isempty(x.dcomplex_val) && PB.encode(e, 12, x.dcomplex_val) + !isempty(x.resource_handle_val) && PB.encode(e, 14, x.resource_handle_val) + !isempty(x.variant_val) && PB.encode(e, 15, x.variant_val) + !isempty(x.uint32_val) && PB.encode(e, 16, x.uint32_val) + !isempty(x.uint64_val) && PB.encode(e, 17, x.uint64_val) + !isempty(x.float8_val) && PB.encode(e, 18, x.float8_val) + return position(e.io) - initpos +end +function PB._encoded_size(x::TensorProto) + encoded_size = 0 + x.dtype != var"#DataType".DT_INVALID && (encoded_size += PB._encoded_size(x.dtype, 1)) + !isnothing(x.tensor_shape) && (encoded_size += PB._encoded_size(x.tensor_shape, 2)) + x.version_number != zero(Int32) && (encoded_size += PB._encoded_size(x.version_number, 3)) + !isempty(x.tensor_content) && (encoded_size += PB._encoded_size(x.tensor_content, 4)) + !isempty(x.half_val) && (encoded_size += PB._encoded_size(x.half_val, 13)) + !isempty(x.float_val) && (encoded_size += PB._encoded_size(x.float_val, 5)) + !isempty(x.double_val) && (encoded_size += PB._encoded_size(x.double_val, 6)) + !isempty(x.int_val) && (encoded_size += PB._encoded_size(x.int_val, 7)) + !isempty(x.string_val) && (encoded_size += PB._encoded_size(x.string_val, 8)) + !isempty(x.scomplex_val) && (encoded_size += PB._encoded_size(x.scomplex_val, 9)) + !isempty(x.int64_val) && (encoded_size += PB._encoded_size(x.int64_val, 10)) + !isempty(x.bool_val) && (encoded_size += PB._encoded_size(x.bool_val, 11)) + !isempty(x.dcomplex_val) && (encoded_size += PB._encoded_size(x.dcomplex_val, 12)) + !isempty(x.resource_handle_val) && (encoded_size += PB._encoded_size(x.resource_handle_val, 14)) + !isempty(x.variant_val) && (encoded_size += PB._encoded_size(x.variant_val, 15)) + !isempty(x.uint32_val) && (encoded_size += PB._encoded_size(x.uint32_val, 16)) + !isempty(x.uint64_val) && (encoded_size += PB._encoded_size(x.uint64_val, 17)) + !isempty(x.float8_val) && (encoded_size += PB._encoded_size(x.float8_val, 18)) + return encoded_size +end + +struct VariantTensorDataProto <: var"##AbstractVariantTensorDataProto" + type_name::String + metadata::Vector{UInt8} + tensors::Vector{<:TensorProto} +end +PB.default_values(::Type{VariantTensorDataProto}) = (;type_name = "", metadata = UInt8[], tensors = Vector{TensorProto}()) +PB.field_numbers(::Type{VariantTensorDataProto}) = (;type_name = 1, metadata = 2, tensors = 3) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:VariantTensorDataProto}) + type_name = "" + metadata = UInt8[] + tensors = PB.BufferedVector{TensorProto}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + type_name = PB.decode(d, String) + elseif field_number == 2 + metadata = PB.decode(d, Vector{UInt8}) + elseif field_number == 3 + PB.decode!(d, tensors) + else + PB.skip(d, wire_type) + end + end + return VariantTensorDataProto(type_name, metadata, tensors[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::VariantTensorDataProto) + initpos = position(e.io) + !isempty(x.type_name) && PB.encode(e, 1, x.type_name) + !isempty(x.metadata) && PB.encode(e, 2, x.metadata) + !isempty(x.tensors) && PB.encode(e, 3, x.tensors) + return position(e.io) - initpos +end +function PB._encoded_size(x::VariantTensorDataProto) + encoded_size = 0 + !isempty(x.type_name) && (encoded_size += PB._encoded_size(x.type_name, 1)) + !isempty(x.metadata) && (encoded_size += PB._encoded_size(x.metadata, 2)) + !isempty(x.tensors) && (encoded_size += PB._encoded_size(x.tensors, 3)) + return encoded_size +end diff --git a/src/protojl/tensorboard/tensorboard/tensor_shape_pb.jl b/src/protojl/tensorboard/tensorboard/tensor_shape_pb.jl new file mode 100644 index 0000000..9336dcc --- /dev/null +++ b/src/protojl/tensorboard/tensorboard/tensor_shape_pb.jl @@ -0,0 +1,80 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:24.100 +# original file: /home/lior/TensorBoardLogger.jl/gen/proto/tensorboard/compat/proto/tensor_shape.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export var"TensorShapeProto.Dim", TensorShapeProto + +struct var"TensorShapeProto.Dim" + size::Int64 + name::String +end +PB.default_values(::Type{var"TensorShapeProto.Dim"}) = (;size = zero(Int64), name = "") +PB.field_numbers(::Type{var"TensorShapeProto.Dim"}) = (;size = 1, name = 2) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"TensorShapeProto.Dim"}) + size = zero(Int64) + name = "" + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + size = PB.decode(d, Int64) + elseif field_number == 2 + name = PB.decode(d, String) + else + PB.skip(d, wire_type) + end + end + return var"TensorShapeProto.Dim"(size, name) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"TensorShapeProto.Dim") + initpos = position(e.io) + x.size != zero(Int64) && PB.encode(e, 1, x.size) + !isempty(x.name) && PB.encode(e, 2, x.name) + return position(e.io) - initpos +end +function PB._encoded_size(x::var"TensorShapeProto.Dim") + encoded_size = 0 + x.size != zero(Int64) && (encoded_size += PB._encoded_size(x.size, 1)) + !isempty(x.name) && (encoded_size += PB._encoded_size(x.name, 2)) + return encoded_size +end + +struct TensorShapeProto + dim::Vector{var"TensorShapeProto.Dim"} + unknown_rank::Bool +end +PB.default_values(::Type{TensorShapeProto}) = (;dim = Vector{var"TensorShapeProto.Dim"}(), unknown_rank = false) +PB.field_numbers(::Type{TensorShapeProto}) = (;dim = 2, unknown_rank = 3) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:TensorShapeProto}) + dim = PB.BufferedVector{var"TensorShapeProto.Dim"}() + unknown_rank = false + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 2 + PB.decode!(d, dim) + elseif field_number == 3 + unknown_rank = PB.decode(d, Bool) + else + PB.skip(d, wire_type) + end + end + return TensorShapeProto(dim[], unknown_rank) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::TensorShapeProto) + initpos = position(e.io) + !isempty(x.dim) && PB.encode(e, 2, x.dim) + x.unknown_rank != false && PB.encode(e, 3, x.unknown_rank) + return position(e.io) - initpos +end +function PB._encoded_size(x::TensorShapeProto) + encoded_size = 0 + !isempty(x.dim) && (encoded_size += PB._encoded_size(x.dim, 2)) + x.unknown_rank != false && (encoded_size += PB._encoded_size(x.unknown_rank, 3)) + return encoded_size +end diff --git a/src/protojl/tensorboard/tensorboard/tensorboard.jl b/src/protojl/tensorboard/tensorboard/tensorboard.jl new file mode 100644 index 0000000..a8254e7 --- /dev/null +++ b/src/protojl/tensorboard/tensorboard/tensorboard.jl @@ -0,0 +1,41 @@ +module tensorboard + +include("../google/google.jl") + +include("saver_pb.jl") +include("graph_debug_info_pb.jl") +include("tensor_shape_pb.jl") +include("trackable_object_graph_pb.jl") +include("allocation_description_pb.jl") +include("coordination_config_pb.jl") +include("debug_pb.jl") +include("rpc_options_pb.jl") +include("histogram_pb.jl") +include("types_pb.jl") +include("verifier_config_pb.jl") +include("versions_pb.jl") +include("variable_pb.jl") +include("full_type_pb.jl") +include("cluster_pb.jl") +include("tensor_description_pb.jl") +include("resource_handle_pb.jl") +include("cost_graph_pb.jl") +include("cpp_shape_inference_pb.jl") +include("step_stats_pb.jl") +include("tensor_pb.jl") +include("struct_tb_pb.jl") +include("attr_value_pb.jl") +include("summary_pb.jl") +include("saved_object_graph_pb.jl") +include("rewriter_config_pb.jl") +include("api_def_pb.jl") +include("node_def_pb.jl") +include("op_def_pb.jl") +include("tfprof_log_pb.jl") +include("event_pb.jl") +include("function_pb.jl") +include("graph_pb.jl") +include("meta_graph_pb.jl") +include("config_pb.jl") + +end # module tensorboard diff --git a/src/protojl/tensorboard/tensorboard/tfprof_log_pb.jl b/src/protojl/tensorboard/tensorboard/tfprof_log_pb.jl new file mode 100644 index 0000000..7980ae2 --- /dev/null +++ b/src/protojl/tensorboard/tensorboard/tfprof_log_pb.jl @@ -0,0 +1,627 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:24.776 +# original file: /home/lior/TensorBoardLogger.jl/gen/proto/tensorboard/compat/proto/tfprof_log.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export Tuple, Memory, var"CodeDef.Trace", ExecTime, ExecMemory, CodeDef, ExecProfile +export OpLogEntry, ProfileNode, OpLogProto, ProfileProto + +struct Tuple + int64_values::Vector{Int64} +end +PB.default_values(::Type{Tuple}) = (;int64_values = Vector{Int64}()) +PB.field_numbers(::Type{Tuple}) = (;int64_values = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:Tuple}) + int64_values = PB.BufferedVector{Int64}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, wire_type, int64_values) + else + PB.skip(d, wire_type) + end + end + return Tuple(int64_values[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::Tuple) + initpos = position(e.io) + !isempty(x.int64_values) && PB.encode(e, 1, x.int64_values) + return position(e.io) - initpos +end +function PB._encoded_size(x::Tuple) + encoded_size = 0 + !isempty(x.int64_values) && (encoded_size += PB._encoded_size(x.int64_values, 1)) + return encoded_size +end + +struct Memory + bytes::Int64 + ptr::UInt64 +end +PB.default_values(::Type{Memory}) = (;bytes = zero(Int64), ptr = zero(UInt64)) +PB.field_numbers(::Type{Memory}) = (;bytes = 1, ptr = 2) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:Memory}) + bytes = zero(Int64) + ptr = zero(UInt64) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + bytes = PB.decode(d, Int64) + elseif field_number == 2 + ptr = PB.decode(d, UInt64) + else + PB.skip(d, wire_type) + end + end + return Memory(bytes, ptr) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::Memory) + initpos = position(e.io) + x.bytes != zero(Int64) && PB.encode(e, 1, x.bytes) + x.ptr != zero(UInt64) && PB.encode(e, 2, x.ptr) + return position(e.io) - initpos +end +function PB._encoded_size(x::Memory) + encoded_size = 0 + x.bytes != zero(Int64) && (encoded_size += PB._encoded_size(x.bytes, 1)) + x.ptr != zero(UInt64) && (encoded_size += PB._encoded_size(x.ptr, 2)) + return encoded_size +end + +struct var"CodeDef.Trace" + file::String + file_id::Int64 + lineno::Int32 + var"#function"::String + function_id::Int64 + line::String + line_id::Int64 + func_start_line::Int32 +end +PB.default_values(::Type{var"CodeDef.Trace"}) = (;file = "", file_id = zero(Int64), lineno = zero(Int32), var"#function" = "", function_id = zero(Int64), line = "", line_id = zero(Int64), func_start_line = zero(Int32)) +PB.field_numbers(::Type{var"CodeDef.Trace"}) = (;file = 1, file_id = 6, lineno = 2, var"#function" = 3, function_id = 7, line = 4, line_id = 8, func_start_line = 5) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"CodeDef.Trace"}) + file = "" + file_id = zero(Int64) + lineno = zero(Int32) + var"#function" = "" + function_id = zero(Int64) + line = "" + line_id = zero(Int64) + func_start_line = zero(Int32) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + file = PB.decode(d, String) + elseif field_number == 6 + file_id = PB.decode(d, Int64) + elseif field_number == 2 + lineno = PB.decode(d, Int32) + elseif field_number == 3 + var"#function" = PB.decode(d, String) + elseif field_number == 7 + function_id = PB.decode(d, Int64) + elseif field_number == 4 + line = PB.decode(d, String) + elseif field_number == 8 + line_id = PB.decode(d, Int64) + elseif field_number == 5 + func_start_line = PB.decode(d, Int32) + else + PB.skip(d, wire_type) + end + end + return var"CodeDef.Trace"(file, file_id, lineno, var"#function", function_id, line, line_id, func_start_line) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"CodeDef.Trace") + initpos = position(e.io) + !isempty(x.file) && PB.encode(e, 1, x.file) + x.file_id != zero(Int64) && PB.encode(e, 6, x.file_id) + x.lineno != zero(Int32) && PB.encode(e, 2, x.lineno) + !isempty(x.var"#function") && PB.encode(e, 3, x.var"#function") + x.function_id != zero(Int64) && PB.encode(e, 7, x.function_id) + !isempty(x.line) && PB.encode(e, 4, x.line) + x.line_id != zero(Int64) && PB.encode(e, 8, x.line_id) + x.func_start_line != zero(Int32) && PB.encode(e, 5, x.func_start_line) + return position(e.io) - initpos +end +function PB._encoded_size(x::var"CodeDef.Trace") + encoded_size = 0 + !isempty(x.file) && (encoded_size += PB._encoded_size(x.file, 1)) + x.file_id != zero(Int64) && (encoded_size += PB._encoded_size(x.file_id, 6)) + x.lineno != zero(Int32) && (encoded_size += PB._encoded_size(x.lineno, 2)) + !isempty(x.var"#function") && (encoded_size += PB._encoded_size(x.var"#function", 3)) + x.function_id != zero(Int64) && (encoded_size += PB._encoded_size(x.function_id, 7)) + !isempty(x.line) && (encoded_size += PB._encoded_size(x.line, 4)) + x.line_id != zero(Int64) && (encoded_size += PB._encoded_size(x.line_id, 8)) + x.func_start_line != zero(Int32) && (encoded_size += PB._encoded_size(x.func_start_line, 5)) + return encoded_size +end + +struct ExecTime + times::Vector{Tuple} +end +PB.default_values(::Type{ExecTime}) = (;times = Vector{Tuple}()) +PB.field_numbers(::Type{ExecTime}) = (;times = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:ExecTime}) + times = PB.BufferedVector{Tuple}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, times) + else + PB.skip(d, wire_type) + end + end + return ExecTime(times[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::ExecTime) + initpos = position(e.io) + !isempty(x.times) && PB.encode(e, 1, x.times) + return position(e.io) - initpos +end +function PB._encoded_size(x::ExecTime) + encoded_size = 0 + !isempty(x.times) && (encoded_size += PB._encoded_size(x.times, 1)) + return encoded_size +end + +struct ExecMemory + memory_micros::Int64 + host_temp_bytes::Int64 + host_persistent_bytes::Int64 + accelerator_temp_bytes::Int64 + accelerator_persistent_bytes::Int64 + requested_bytes::Int64 + peak_bytes::Int64 + residual_bytes::Int64 + output_bytes::Int64 + allocator_bytes_in_use::Int64 + output_memory::Dict{Int32,Memory} +end +PB.default_values(::Type{ExecMemory}) = (;memory_micros = zero(Int64), host_temp_bytes = zero(Int64), host_persistent_bytes = zero(Int64), accelerator_temp_bytes = zero(Int64), accelerator_persistent_bytes = zero(Int64), requested_bytes = zero(Int64), peak_bytes = zero(Int64), residual_bytes = zero(Int64), output_bytes = zero(Int64), allocator_bytes_in_use = zero(Int64), output_memory = Dict{Int32,Memory}()) +PB.field_numbers(::Type{ExecMemory}) = (;memory_micros = 1, host_temp_bytes = 2, host_persistent_bytes = 3, accelerator_temp_bytes = 4, accelerator_persistent_bytes = 5, requested_bytes = 6, peak_bytes = 7, residual_bytes = 8, output_bytes = 9, allocator_bytes_in_use = 10, output_memory = 11) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:ExecMemory}) + memory_micros = zero(Int64) + host_temp_bytes = zero(Int64) + host_persistent_bytes = zero(Int64) + accelerator_temp_bytes = zero(Int64) + accelerator_persistent_bytes = zero(Int64) + requested_bytes = zero(Int64) + peak_bytes = zero(Int64) + residual_bytes = zero(Int64) + output_bytes = zero(Int64) + allocator_bytes_in_use = zero(Int64) + output_memory = Dict{Int32,Memory}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + memory_micros = PB.decode(d, Int64) + elseif field_number == 2 + host_temp_bytes = PB.decode(d, Int64) + elseif field_number == 3 + host_persistent_bytes = PB.decode(d, Int64) + elseif field_number == 4 + accelerator_temp_bytes = PB.decode(d, Int64) + elseif field_number == 5 + accelerator_persistent_bytes = PB.decode(d, Int64) + elseif field_number == 6 + requested_bytes = PB.decode(d, Int64) + elseif field_number == 7 + peak_bytes = PB.decode(d, Int64) + elseif field_number == 8 + residual_bytes = PB.decode(d, Int64) + elseif field_number == 9 + output_bytes = PB.decode(d, Int64) + elseif field_number == 10 + allocator_bytes_in_use = PB.decode(d, Int64) + elseif field_number == 11 + PB.decode!(d, output_memory) + else + PB.skip(d, wire_type) + end + end + return ExecMemory(memory_micros, host_temp_bytes, host_persistent_bytes, accelerator_temp_bytes, accelerator_persistent_bytes, requested_bytes, peak_bytes, residual_bytes, output_bytes, allocator_bytes_in_use, output_memory) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::ExecMemory) + initpos = position(e.io) + x.memory_micros != zero(Int64) && PB.encode(e, 1, x.memory_micros) + x.host_temp_bytes != zero(Int64) && PB.encode(e, 2, x.host_temp_bytes) + x.host_persistent_bytes != zero(Int64) && PB.encode(e, 3, x.host_persistent_bytes) + x.accelerator_temp_bytes != zero(Int64) && PB.encode(e, 4, x.accelerator_temp_bytes) + x.accelerator_persistent_bytes != zero(Int64) && PB.encode(e, 5, x.accelerator_persistent_bytes) + x.requested_bytes != zero(Int64) && PB.encode(e, 6, x.requested_bytes) + x.peak_bytes != zero(Int64) && PB.encode(e, 7, x.peak_bytes) + x.residual_bytes != zero(Int64) && PB.encode(e, 8, x.residual_bytes) + x.output_bytes != zero(Int64) && PB.encode(e, 9, x.output_bytes) + x.allocator_bytes_in_use != zero(Int64) && PB.encode(e, 10, x.allocator_bytes_in_use) + !isempty(x.output_memory) && PB.encode(e, 11, x.output_memory) + return position(e.io) - initpos +end +function PB._encoded_size(x::ExecMemory) + encoded_size = 0 + x.memory_micros != zero(Int64) && (encoded_size += PB._encoded_size(x.memory_micros, 1)) + x.host_temp_bytes != zero(Int64) && (encoded_size += PB._encoded_size(x.host_temp_bytes, 2)) + x.host_persistent_bytes != zero(Int64) && (encoded_size += PB._encoded_size(x.host_persistent_bytes, 3)) + x.accelerator_temp_bytes != zero(Int64) && (encoded_size += PB._encoded_size(x.accelerator_temp_bytes, 4)) + x.accelerator_persistent_bytes != zero(Int64) && (encoded_size += PB._encoded_size(x.accelerator_persistent_bytes, 5)) + x.requested_bytes != zero(Int64) && (encoded_size += PB._encoded_size(x.requested_bytes, 6)) + x.peak_bytes != zero(Int64) && (encoded_size += PB._encoded_size(x.peak_bytes, 7)) + x.residual_bytes != zero(Int64) && (encoded_size += PB._encoded_size(x.residual_bytes, 8)) + x.output_bytes != zero(Int64) && (encoded_size += PB._encoded_size(x.output_bytes, 9)) + x.allocator_bytes_in_use != zero(Int64) && (encoded_size += PB._encoded_size(x.allocator_bytes_in_use, 10)) + !isempty(x.output_memory) && (encoded_size += PB._encoded_size(x.output_memory, 11)) + return encoded_size +end + +struct CodeDef + traces::Vector{var"CodeDef.Trace"} +end +PB.default_values(::Type{CodeDef}) = (;traces = Vector{var"CodeDef.Trace"}()) +PB.field_numbers(::Type{CodeDef}) = (;traces = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:CodeDef}) + traces = PB.BufferedVector{var"CodeDef.Trace"}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, traces) + else + PB.skip(d, wire_type) + end + end + return CodeDef(traces[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::CodeDef) + initpos = position(e.io) + !isempty(x.traces) && PB.encode(e, 1, x.traces) + return position(e.io) - initpos +end +function PB._encoded_size(x::CodeDef) + encoded_size = 0 + !isempty(x.traces) && (encoded_size += PB._encoded_size(x.traces, 1)) + return encoded_size +end + +struct ExecProfile + run_count::Int64 + all_start_micros::Int64 + latest_end_micros::Int64 + accelerator_execs::Dict{String,ExecTime} + cpu_execs::Dict{String,ExecTime} + memory_execs::Vector{ExecMemory} + allocations::Vector{AllocationRecord} + devices::Vector{String} +end +PB.default_values(::Type{ExecProfile}) = (;run_count = zero(Int64), all_start_micros = zero(Int64), latest_end_micros = zero(Int64), accelerator_execs = Dict{String,ExecTime}(), cpu_execs = Dict{String,ExecTime}(), memory_execs = Vector{ExecMemory}(), allocations = Vector{AllocationRecord}(), devices = Vector{String}()) +PB.field_numbers(::Type{ExecProfile}) = (;run_count = 1, all_start_micros = 2, latest_end_micros = 3, accelerator_execs = 4, cpu_execs = 5, memory_execs = 7, allocations = 11, devices = 6) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:ExecProfile}) + run_count = zero(Int64) + all_start_micros = zero(Int64) + latest_end_micros = zero(Int64) + accelerator_execs = Dict{String,ExecTime}() + cpu_execs = Dict{String,ExecTime}() + memory_execs = PB.BufferedVector{ExecMemory}() + allocations = PB.BufferedVector{AllocationRecord}() + devices = PB.BufferedVector{String}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + run_count = PB.decode(d, Int64) + elseif field_number == 2 + all_start_micros = PB.decode(d, Int64) + elseif field_number == 3 + latest_end_micros = PB.decode(d, Int64) + elseif field_number == 4 + PB.decode!(d, accelerator_execs) + elseif field_number == 5 + PB.decode!(d, cpu_execs) + elseif field_number == 7 + PB.decode!(d, memory_execs) + elseif field_number == 11 + PB.decode!(d, allocations) + elseif field_number == 6 + PB.decode!(d, devices) + else + PB.skip(d, wire_type) + end + end + return ExecProfile(run_count, all_start_micros, latest_end_micros, accelerator_execs, cpu_execs, memory_execs[], allocations[], devices[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::ExecProfile) + initpos = position(e.io) + x.run_count != zero(Int64) && PB.encode(e, 1, x.run_count) + x.all_start_micros != zero(Int64) && PB.encode(e, 2, x.all_start_micros) + x.latest_end_micros != zero(Int64) && PB.encode(e, 3, x.latest_end_micros) + !isempty(x.accelerator_execs) && PB.encode(e, 4, x.accelerator_execs) + !isempty(x.cpu_execs) && PB.encode(e, 5, x.cpu_execs) + !isempty(x.memory_execs) && PB.encode(e, 7, x.memory_execs) + !isempty(x.allocations) && PB.encode(e, 11, x.allocations) + !isempty(x.devices) && PB.encode(e, 6, x.devices) + return position(e.io) - initpos +end +function PB._encoded_size(x::ExecProfile) + encoded_size = 0 + x.run_count != zero(Int64) && (encoded_size += PB._encoded_size(x.run_count, 1)) + x.all_start_micros != zero(Int64) && (encoded_size += PB._encoded_size(x.all_start_micros, 2)) + x.latest_end_micros != zero(Int64) && (encoded_size += PB._encoded_size(x.latest_end_micros, 3)) + !isempty(x.accelerator_execs) && (encoded_size += PB._encoded_size(x.accelerator_execs, 4)) + !isempty(x.cpu_execs) && (encoded_size += PB._encoded_size(x.cpu_execs, 5)) + !isempty(x.memory_execs) && (encoded_size += PB._encoded_size(x.memory_execs, 7)) + !isempty(x.allocations) && (encoded_size += PB._encoded_size(x.allocations, 11)) + !isempty(x.devices) && (encoded_size += PB._encoded_size(x.devices, 6)) + return encoded_size +end + +struct OpLogEntry + name::String + float_ops::Int64 + types::Vector{String} + code_def::Union{Nothing,CodeDef} +end +PB.default_values(::Type{OpLogEntry}) = (;name = "", float_ops = zero(Int64), types = Vector{String}(), code_def = nothing) +PB.field_numbers(::Type{OpLogEntry}) = (;name = 1, float_ops = 2, types = 3, code_def = 4) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:OpLogEntry}) + name = "" + float_ops = zero(Int64) + types = PB.BufferedVector{String}() + code_def = Ref{Union{Nothing,CodeDef}}(nothing) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + name = PB.decode(d, String) + elseif field_number == 2 + float_ops = PB.decode(d, Int64) + elseif field_number == 3 + PB.decode!(d, types) + elseif field_number == 4 + PB.decode!(d, code_def) + else + PB.skip(d, wire_type) + end + end + return OpLogEntry(name, float_ops, types[], code_def[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::OpLogEntry) + initpos = position(e.io) + !isempty(x.name) && PB.encode(e, 1, x.name) + x.float_ops != zero(Int64) && PB.encode(e, 2, x.float_ops) + !isempty(x.types) && PB.encode(e, 3, x.types) + !isnothing(x.code_def) && PB.encode(e, 4, x.code_def) + return position(e.io) - initpos +end +function PB._encoded_size(x::OpLogEntry) + encoded_size = 0 + !isempty(x.name) && (encoded_size += PB._encoded_size(x.name, 1)) + x.float_ops != zero(Int64) && (encoded_size += PB._encoded_size(x.float_ops, 2)) + !isempty(x.types) && (encoded_size += PB._encoded_size(x.types, 3)) + !isnothing(x.code_def) && (encoded_size += PB._encoded_size(x.code_def, 4)) + return encoded_size +end + +struct ProfileNode + name::String + op::String + id::Int64 + inputs::Dict{Int32,Int64} + input_shapes::Dict{Int32,Tuple} + outputs::Dict{Int32,Int64} + output_shapes::Dict{Int32,Tuple} + src_output_index::Dict{Int64,Int32} + shape::Vector{Int64} + op_types::Vector{String} + canonical_device::String + host_device::String + float_ops::Int64 + trace::Union{Nothing,CodeDef} + attrs::Dict{String,AttrValue} + execs::Dict{Int64,ExecProfile} +end +PB.default_values(::Type{ProfileNode}) = (;name = "", op = "", id = zero(Int64), inputs = Dict{Int32,Int64}(), input_shapes = Dict{Int32,Tuple}(), outputs = Dict{Int32,Int64}(), output_shapes = Dict{Int32,Tuple}(), src_output_index = Dict{Int64,Int32}(), shape = Vector{Int64}(), op_types = Vector{String}(), canonical_device = "", host_device = "", float_ops = zero(Int64), trace = nothing, attrs = Dict{String,AttrValue}(), execs = Dict{Int64,ExecProfile}()) +PB.field_numbers(::Type{ProfileNode}) = (;name = 1, op = 9, id = 13, inputs = 2, input_shapes = 16, outputs = 3, output_shapes = 15, src_output_index = 14, shape = 4, op_types = 5, canonical_device = 6, host_device = 7, float_ops = 8, trace = 10, attrs = 11, execs = 12) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:ProfileNode}) + name = "" + op = "" + id = zero(Int64) + inputs = Dict{Int32,Int64}() + input_shapes = Dict{Int32,Tuple}() + outputs = Dict{Int32,Int64}() + output_shapes = Dict{Int32,Tuple}() + src_output_index = Dict{Int64,Int32}() + shape = PB.BufferedVector{Int64}() + op_types = PB.BufferedVector{String}() + canonical_device = "" + host_device = "" + float_ops = zero(Int64) + trace = Ref{Union{Nothing,CodeDef}}(nothing) + attrs = Dict{String,AttrValue}() + execs = Dict{Int64,ExecProfile}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + name = PB.decode(d, String) + elseif field_number == 9 + op = PB.decode(d, String) + elseif field_number == 13 + id = PB.decode(d, Int64) + elseif field_number == 2 + PB.decode!(d, inputs) + elseif field_number == 16 + PB.decode!(d, input_shapes) + elseif field_number == 3 + PB.decode!(d, outputs) + elseif field_number == 15 + PB.decode!(d, output_shapes) + elseif field_number == 14 + PB.decode!(d, src_output_index) + elseif field_number == 4 + PB.decode!(d, wire_type, shape) + elseif field_number == 5 + PB.decode!(d, op_types) + elseif field_number == 6 + canonical_device = PB.decode(d, String) + elseif field_number == 7 + host_device = PB.decode(d, String) + elseif field_number == 8 + float_ops = PB.decode(d, Int64) + elseif field_number == 10 + PB.decode!(d, trace) + elseif field_number == 11 + PB.decode!(d, attrs) + elseif field_number == 12 + PB.decode!(d, execs) + else + PB.skip(d, wire_type) + end + end + return ProfileNode(name, op, id, inputs, input_shapes, outputs, output_shapes, src_output_index, shape[], op_types[], canonical_device, host_device, float_ops, trace[], attrs, execs) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::ProfileNode) + initpos = position(e.io) + !isempty(x.name) && PB.encode(e, 1, x.name) + !isempty(x.op) && PB.encode(e, 9, x.op) + x.id != zero(Int64) && PB.encode(e, 13, x.id) + !isempty(x.inputs) && PB.encode(e, 2, x.inputs) + !isempty(x.input_shapes) && PB.encode(e, 16, x.input_shapes) + !isempty(x.outputs) && PB.encode(e, 3, x.outputs) + !isempty(x.output_shapes) && PB.encode(e, 15, x.output_shapes) + !isempty(x.src_output_index) && PB.encode(e, 14, x.src_output_index) + !isempty(x.shape) && PB.encode(e, 4, x.shape) + !isempty(x.op_types) && PB.encode(e, 5, x.op_types) + !isempty(x.canonical_device) && PB.encode(e, 6, x.canonical_device) + !isempty(x.host_device) && PB.encode(e, 7, x.host_device) + x.float_ops != zero(Int64) && PB.encode(e, 8, x.float_ops) + !isnothing(x.trace) && PB.encode(e, 10, x.trace) + !isempty(x.attrs) && PB.encode(e, 11, x.attrs) + !isempty(x.execs) && PB.encode(e, 12, x.execs) + return position(e.io) - initpos +end +function PB._encoded_size(x::ProfileNode) + encoded_size = 0 + !isempty(x.name) && (encoded_size += PB._encoded_size(x.name, 1)) + !isempty(x.op) && (encoded_size += PB._encoded_size(x.op, 9)) + x.id != zero(Int64) && (encoded_size += PB._encoded_size(x.id, 13)) + !isempty(x.inputs) && (encoded_size += PB._encoded_size(x.inputs, 2)) + !isempty(x.input_shapes) && (encoded_size += PB._encoded_size(x.input_shapes, 16)) + !isempty(x.outputs) && (encoded_size += PB._encoded_size(x.outputs, 3)) + !isempty(x.output_shapes) && (encoded_size += PB._encoded_size(x.output_shapes, 15)) + !isempty(x.src_output_index) && (encoded_size += PB._encoded_size(x.src_output_index, 14)) + !isempty(x.shape) && (encoded_size += PB._encoded_size(x.shape, 4)) + !isempty(x.op_types) && (encoded_size += PB._encoded_size(x.op_types, 5)) + !isempty(x.canonical_device) && (encoded_size += PB._encoded_size(x.canonical_device, 6)) + !isempty(x.host_device) && (encoded_size += PB._encoded_size(x.host_device, 7)) + x.float_ops != zero(Int64) && (encoded_size += PB._encoded_size(x.float_ops, 8)) + !isnothing(x.trace) && (encoded_size += PB._encoded_size(x.trace, 10)) + !isempty(x.attrs) && (encoded_size += PB._encoded_size(x.attrs, 11)) + !isempty(x.execs) && (encoded_size += PB._encoded_size(x.execs, 12)) + return encoded_size +end + +struct OpLogProto + log_entries::Vector{OpLogEntry} + id_to_string::Dict{Int64,String} +end +PB.default_values(::Type{OpLogProto}) = (;log_entries = Vector{OpLogEntry}(), id_to_string = Dict{Int64,String}()) +PB.field_numbers(::Type{OpLogProto}) = (;log_entries = 1, id_to_string = 2) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:OpLogProto}) + log_entries = PB.BufferedVector{OpLogEntry}() + id_to_string = Dict{Int64,String}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, log_entries) + elseif field_number == 2 + PB.decode!(d, id_to_string) + else + PB.skip(d, wire_type) + end + end + return OpLogProto(log_entries[], id_to_string) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::OpLogProto) + initpos = position(e.io) + !isempty(x.log_entries) && PB.encode(e, 1, x.log_entries) + !isempty(x.id_to_string) && PB.encode(e, 2, x.id_to_string) + return position(e.io) - initpos +end +function PB._encoded_size(x::OpLogProto) + encoded_size = 0 + !isempty(x.log_entries) && (encoded_size += PB._encoded_size(x.log_entries, 1)) + !isempty(x.id_to_string) && (encoded_size += PB._encoded_size(x.id_to_string, 2)) + return encoded_size +end + +struct ProfileProto + nodes::Dict{Int64,ProfileNode} + has_trace::Bool + miss_accelerator_stream::Bool + steps::Vector{Int64} + id_to_string::Dict{Int64,String} +end +PB.default_values(::Type{ProfileProto}) = (;nodes = Dict{Int64,ProfileNode}(), has_trace = false, miss_accelerator_stream = false, steps = Vector{Int64}(), id_to_string = Dict{Int64,String}()) +PB.field_numbers(::Type{ProfileProto}) = (;nodes = 1, has_trace = 2, miss_accelerator_stream = 5, steps = 3, id_to_string = 4) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:ProfileProto}) + nodes = Dict{Int64,ProfileNode}() + has_trace = false + miss_accelerator_stream = false + steps = PB.BufferedVector{Int64}() + id_to_string = Dict{Int64,String}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, nodes) + elseif field_number == 2 + has_trace = PB.decode(d, Bool) + elseif field_number == 5 + miss_accelerator_stream = PB.decode(d, Bool) + elseif field_number == 3 + PB.decode!(d, wire_type, steps) + elseif field_number == 4 + PB.decode!(d, id_to_string) + else + PB.skip(d, wire_type) + end + end + return ProfileProto(nodes, has_trace, miss_accelerator_stream, steps[], id_to_string) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::ProfileProto) + initpos = position(e.io) + !isempty(x.nodes) && PB.encode(e, 1, x.nodes) + x.has_trace != false && PB.encode(e, 2, x.has_trace) + x.miss_accelerator_stream != false && PB.encode(e, 5, x.miss_accelerator_stream) + !isempty(x.steps) && PB.encode(e, 3, x.steps) + !isempty(x.id_to_string) && PB.encode(e, 4, x.id_to_string) + return position(e.io) - initpos +end +function PB._encoded_size(x::ProfileProto) + encoded_size = 0 + !isempty(x.nodes) && (encoded_size += PB._encoded_size(x.nodes, 1)) + x.has_trace != false && (encoded_size += PB._encoded_size(x.has_trace, 2)) + x.miss_accelerator_stream != false && (encoded_size += PB._encoded_size(x.miss_accelerator_stream, 5)) + !isempty(x.steps) && (encoded_size += PB._encoded_size(x.steps, 3)) + !isempty(x.id_to_string) && (encoded_size += PB._encoded_size(x.id_to_string, 4)) + return encoded_size +end diff --git a/src/protojl/tensorboard/tensorboard/trackable_object_graph_pb.jl b/src/protojl/tensorboard/tensorboard/trackable_object_graph_pb.jl new file mode 100644 index 0000000..a2b5d95 --- /dev/null +++ b/src/protojl/tensorboard/tensorboard/trackable_object_graph_pb.jl @@ -0,0 +1,252 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:24.159 +# original file: /home/lior/TensorBoardLogger.jl/gen/proto/tensorboard/compat/proto/trackable_object_graph.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export var"TrackableObjectGraph.TrackableObject.ObjectReference" +export var"TrackableObjectGraph.TrackableObject.SerializedTensor" +export var"TrackableObjectGraph.TrackableObject.SlotVariableReference", RegisteredSaver +export var"TrackableObjectGraph.TrackableObject", TrackableObjectGraph + +struct var"TrackableObjectGraph.TrackableObject.ObjectReference" + node_id::Int32 + local_name::String +end +PB.default_values(::Type{var"TrackableObjectGraph.TrackableObject.ObjectReference"}) = (;node_id = zero(Int32), local_name = "") +PB.field_numbers(::Type{var"TrackableObjectGraph.TrackableObject.ObjectReference"}) = (;node_id = 1, local_name = 2) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"TrackableObjectGraph.TrackableObject.ObjectReference"}) + node_id = zero(Int32) + local_name = "" + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + node_id = PB.decode(d, Int32) + elseif field_number == 2 + local_name = PB.decode(d, String) + else + PB.skip(d, wire_type) + end + end + return var"TrackableObjectGraph.TrackableObject.ObjectReference"(node_id, local_name) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"TrackableObjectGraph.TrackableObject.ObjectReference") + initpos = position(e.io) + x.node_id != zero(Int32) && PB.encode(e, 1, x.node_id) + !isempty(x.local_name) && PB.encode(e, 2, x.local_name) + return position(e.io) - initpos +end +function PB._encoded_size(x::var"TrackableObjectGraph.TrackableObject.ObjectReference") + encoded_size = 0 + x.node_id != zero(Int32) && (encoded_size += PB._encoded_size(x.node_id, 1)) + !isempty(x.local_name) && (encoded_size += PB._encoded_size(x.local_name, 2)) + return encoded_size +end + +struct var"TrackableObjectGraph.TrackableObject.SerializedTensor" + name::String + full_name::String + checkpoint_key::String +end +PB.reserved_fields(::Type{var"TrackableObjectGraph.TrackableObject.SerializedTensor"}) = (names = ["optional_restore"], numbers = Union{Int,UnitRange{Int}}[4]) +PB.default_values(::Type{var"TrackableObjectGraph.TrackableObject.SerializedTensor"}) = (;name = "", full_name = "", checkpoint_key = "") +PB.field_numbers(::Type{var"TrackableObjectGraph.TrackableObject.SerializedTensor"}) = (;name = 1, full_name = 2, checkpoint_key = 3) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"TrackableObjectGraph.TrackableObject.SerializedTensor"}) + name = "" + full_name = "" + checkpoint_key = "" + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + name = PB.decode(d, String) + elseif field_number == 2 + full_name = PB.decode(d, String) + elseif field_number == 3 + checkpoint_key = PB.decode(d, String) + else + PB.skip(d, wire_type) + end + end + return var"TrackableObjectGraph.TrackableObject.SerializedTensor"(name, full_name, checkpoint_key) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"TrackableObjectGraph.TrackableObject.SerializedTensor") + initpos = position(e.io) + !isempty(x.name) && PB.encode(e, 1, x.name) + !isempty(x.full_name) && PB.encode(e, 2, x.full_name) + !isempty(x.checkpoint_key) && PB.encode(e, 3, x.checkpoint_key) + return position(e.io) - initpos +end +function PB._encoded_size(x::var"TrackableObjectGraph.TrackableObject.SerializedTensor") + encoded_size = 0 + !isempty(x.name) && (encoded_size += PB._encoded_size(x.name, 1)) + !isempty(x.full_name) && (encoded_size += PB._encoded_size(x.full_name, 2)) + !isempty(x.checkpoint_key) && (encoded_size += PB._encoded_size(x.checkpoint_key, 3)) + return encoded_size +end + +struct var"TrackableObjectGraph.TrackableObject.SlotVariableReference" + original_variable_node_id::Int32 + slot_name::String + slot_variable_node_id::Int32 +end +PB.default_values(::Type{var"TrackableObjectGraph.TrackableObject.SlotVariableReference"}) = (;original_variable_node_id = zero(Int32), slot_name = "", slot_variable_node_id = zero(Int32)) +PB.field_numbers(::Type{var"TrackableObjectGraph.TrackableObject.SlotVariableReference"}) = (;original_variable_node_id = 1, slot_name = 2, slot_variable_node_id = 3) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"TrackableObjectGraph.TrackableObject.SlotVariableReference"}) + original_variable_node_id = zero(Int32) + slot_name = "" + slot_variable_node_id = zero(Int32) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + original_variable_node_id = PB.decode(d, Int32) + elseif field_number == 2 + slot_name = PB.decode(d, String) + elseif field_number == 3 + slot_variable_node_id = PB.decode(d, Int32) + else + PB.skip(d, wire_type) + end + end + return var"TrackableObjectGraph.TrackableObject.SlotVariableReference"(original_variable_node_id, slot_name, slot_variable_node_id) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"TrackableObjectGraph.TrackableObject.SlotVariableReference") + initpos = position(e.io) + x.original_variable_node_id != zero(Int32) && PB.encode(e, 1, x.original_variable_node_id) + !isempty(x.slot_name) && PB.encode(e, 2, x.slot_name) + x.slot_variable_node_id != zero(Int32) && PB.encode(e, 3, x.slot_variable_node_id) + return position(e.io) - initpos +end +function PB._encoded_size(x::var"TrackableObjectGraph.TrackableObject.SlotVariableReference") + encoded_size = 0 + x.original_variable_node_id != zero(Int32) && (encoded_size += PB._encoded_size(x.original_variable_node_id, 1)) + !isempty(x.slot_name) && (encoded_size += PB._encoded_size(x.slot_name, 2)) + x.slot_variable_node_id != zero(Int32) && (encoded_size += PB._encoded_size(x.slot_variable_node_id, 3)) + return encoded_size +end + +struct RegisteredSaver + name::String + object_name::String +end +PB.default_values(::Type{RegisteredSaver}) = (;name = "", object_name = "") +PB.field_numbers(::Type{RegisteredSaver}) = (;name = 1, object_name = 2) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:RegisteredSaver}) + name = "" + object_name = "" + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + name = PB.decode(d, String) + elseif field_number == 2 + object_name = PB.decode(d, String) + else + PB.skip(d, wire_type) + end + end + return RegisteredSaver(name, object_name) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::RegisteredSaver) + initpos = position(e.io) + !isempty(x.name) && PB.encode(e, 1, x.name) + !isempty(x.object_name) && PB.encode(e, 2, x.object_name) + return position(e.io) - initpos +end +function PB._encoded_size(x::RegisteredSaver) + encoded_size = 0 + !isempty(x.name) && (encoded_size += PB._encoded_size(x.name, 1)) + !isempty(x.object_name) && (encoded_size += PB._encoded_size(x.object_name, 2)) + return encoded_size +end + +struct var"TrackableObjectGraph.TrackableObject" + children::Vector{var"TrackableObjectGraph.TrackableObject.ObjectReference"} + attributes::Vector{var"TrackableObjectGraph.TrackableObject.SerializedTensor"} + slot_variables::Vector{var"TrackableObjectGraph.TrackableObject.SlotVariableReference"} + registered_saver::Union{Nothing,RegisteredSaver} + has_checkpoint_values::Union{Nothing,google.protobuf.BoolValue} +end +PB.default_values(::Type{var"TrackableObjectGraph.TrackableObject"}) = (;children = Vector{var"TrackableObjectGraph.TrackableObject.ObjectReference"}(), attributes = Vector{var"TrackableObjectGraph.TrackableObject.SerializedTensor"}(), slot_variables = Vector{var"TrackableObjectGraph.TrackableObject.SlotVariableReference"}(), registered_saver = nothing, has_checkpoint_values = nothing) +PB.field_numbers(::Type{var"TrackableObjectGraph.TrackableObject"}) = (;children = 1, attributes = 2, slot_variables = 3, registered_saver = 4, has_checkpoint_values = 5) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:var"TrackableObjectGraph.TrackableObject"}) + children = PB.BufferedVector{var"TrackableObjectGraph.TrackableObject.ObjectReference"}() + attributes = PB.BufferedVector{var"TrackableObjectGraph.TrackableObject.SerializedTensor"}() + slot_variables = PB.BufferedVector{var"TrackableObjectGraph.TrackableObject.SlotVariableReference"}() + registered_saver = Ref{Union{Nothing,RegisteredSaver}}(nothing) + has_checkpoint_values = Ref{Union{Nothing,google.protobuf.BoolValue}}(nothing) + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, children) + elseif field_number == 2 + PB.decode!(d, attributes) + elseif field_number == 3 + PB.decode!(d, slot_variables) + elseif field_number == 4 + PB.decode!(d, registered_saver) + elseif field_number == 5 + PB.decode!(d, has_checkpoint_values) + else + PB.skip(d, wire_type) + end + end + return var"TrackableObjectGraph.TrackableObject"(children[], attributes[], slot_variables[], registered_saver[], has_checkpoint_values[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::var"TrackableObjectGraph.TrackableObject") + initpos = position(e.io) + !isempty(x.children) && PB.encode(e, 1, x.children) + !isempty(x.attributes) && PB.encode(e, 2, x.attributes) + !isempty(x.slot_variables) && PB.encode(e, 3, x.slot_variables) + !isnothing(x.registered_saver) && PB.encode(e, 4, x.registered_saver) + !isnothing(x.has_checkpoint_values) && PB.encode(e, 5, x.has_checkpoint_values) + return position(e.io) - initpos +end +function PB._encoded_size(x::var"TrackableObjectGraph.TrackableObject") + encoded_size = 0 + !isempty(x.children) && (encoded_size += PB._encoded_size(x.children, 1)) + !isempty(x.attributes) && (encoded_size += PB._encoded_size(x.attributes, 2)) + !isempty(x.slot_variables) && (encoded_size += PB._encoded_size(x.slot_variables, 3)) + !isnothing(x.registered_saver) && (encoded_size += PB._encoded_size(x.registered_saver, 4)) + !isnothing(x.has_checkpoint_values) && (encoded_size += PB._encoded_size(x.has_checkpoint_values, 5)) + return encoded_size +end + +struct TrackableObjectGraph + nodes::Vector{var"TrackableObjectGraph.TrackableObject"} +end +PB.default_values(::Type{TrackableObjectGraph}) = (;nodes = Vector{var"TrackableObjectGraph.TrackableObject"}()) +PB.field_numbers(::Type{TrackableObjectGraph}) = (;nodes = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:TrackableObjectGraph}) + nodes = PB.BufferedVector{var"TrackableObjectGraph.TrackableObject"}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + PB.decode!(d, nodes) + else + PB.skip(d, wire_type) + end + end + return TrackableObjectGraph(nodes[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::TrackableObjectGraph) + initpos = position(e.io) + !isempty(x.nodes) && PB.encode(e, 1, x.nodes) + return position(e.io) - initpos +end +function PB._encoded_size(x::TrackableObjectGraph) + encoded_size = 0 + !isempty(x.nodes) && (encoded_size += PB._encoded_size(x.nodes, 1)) + return encoded_size +end diff --git a/src/protojl/tensorboard/tensorboard/types_pb.jl b/src/protojl/tensorboard/tensorboard/types_pb.jl new file mode 100644 index 0000000..3da0311 --- /dev/null +++ b/src/protojl/tensorboard/tensorboard/types_pb.jl @@ -0,0 +1,40 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:24.286 +# original file: /home/lior/TensorBoardLogger.jl/gen/proto/tensorboard/compat/proto/types.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export var"#DataType", SerializedDType + +@enumx var"#DataType" DT_INVALID=0 DT_FLOAT=1 DT_DOUBLE=2 DT_INT32=3 DT_UINT8=4 DT_INT16=5 DT_INT8=6 DT_STRING=7 DT_COMPLEX64=8 DT_INT64=9 DT_BOOL=10 DT_QINT8=11 DT_QUINT8=12 DT_QINT32=13 DT_BFLOAT16=14 DT_QINT16=15 DT_QUINT16=16 DT_UINT16=17 DT_COMPLEX128=18 DT_HALF=19 DT_RESOURCE=20 DT_VARIANT=21 DT_UINT32=22 DT_UINT64=23 DT_FLOAT8_E5M2=24 DT_FLOAT8_E4M3FN=25 DT_FLOAT_REF=101 DT_DOUBLE_REF=102 DT_INT32_REF=103 DT_UINT8_REF=104 DT_INT16_REF=105 DT_INT8_REF=106 DT_STRING_REF=107 DT_COMPLEX64_REF=108 DT_INT64_REF=109 DT_BOOL_REF=110 DT_QINT8_REF=111 DT_QUINT8_REF=112 DT_QINT32_REF=113 DT_BFLOAT16_REF=114 DT_QINT16_REF=115 DT_QUINT16_REF=116 DT_UINT16_REF=117 DT_COMPLEX128_REF=118 DT_HALF_REF=119 DT_RESOURCE_REF=120 DT_VARIANT_REF=121 DT_UINT32_REF=122 DT_UINT64_REF=123 DT_FLOAT8_E5M2_REF=124 DT_FLOAT8_E4M3FN_REF=125 + +struct SerializedDType + datatype::var"#DataType".T +end +PB.default_values(::Type{SerializedDType}) = (;datatype = var"#DataType".DT_INVALID) +PB.field_numbers(::Type{SerializedDType}) = (;datatype = 1) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:SerializedDType}) + datatype = var"#DataType".DT_INVALID + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + datatype = PB.decode(d, var"#DataType".T) + else + PB.skip(d, wire_type) + end + end + return SerializedDType(datatype) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::SerializedDType) + initpos = position(e.io) + x.datatype != var"#DataType".DT_INVALID && PB.encode(e, 1, x.datatype) + return position(e.io) - initpos +end +function PB._encoded_size(x::SerializedDType) + encoded_size = 0 + x.datatype != var"#DataType".DT_INVALID && (encoded_size += PB._encoded_size(x.datatype, 1)) + return encoded_size +end diff --git a/src/protojl/tensorboard/tensorboard/variable_pb.jl b/src/protojl/tensorboard/tensorboard/variable_pb.jl new file mode 100644 index 0000000..0fcdc8c --- /dev/null +++ b/src/protojl/tensorboard/tensorboard/variable_pb.jl @@ -0,0 +1,138 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:24.289 +# original file: /home/lior/TensorBoardLogger.jl/gen/proto/tensorboard/compat/proto/variable.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export VariableSynchronization, VariableAggregation, SaveSliceInfoDef, VariableDef + +@enumx VariableSynchronization VARIABLE_SYNCHRONIZATION_AUTO=0 VARIABLE_SYNCHRONIZATION_NONE=1 VARIABLE_SYNCHRONIZATION_ON_WRITE=2 VARIABLE_SYNCHRONIZATION_ON_READ=3 + +@enumx VariableAggregation VARIABLE_AGGREGATION_NONE=0 VARIABLE_AGGREGATION_SUM=1 VARIABLE_AGGREGATION_MEAN=2 VARIABLE_AGGREGATION_ONLY_FIRST_REPLICA=3 + +struct SaveSliceInfoDef + full_name::String + full_shape::Vector{Int64} + var_offset::Vector{Int64} + var_shape::Vector{Int64} +end +PB.default_values(::Type{SaveSliceInfoDef}) = (;full_name = "", full_shape = Vector{Int64}(), var_offset = Vector{Int64}(), var_shape = Vector{Int64}()) +PB.field_numbers(::Type{SaveSliceInfoDef}) = (;full_name = 1, full_shape = 2, var_offset = 3, var_shape = 4) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:SaveSliceInfoDef}) + full_name = "" + full_shape = PB.BufferedVector{Int64}() + var_offset = PB.BufferedVector{Int64}() + var_shape = PB.BufferedVector{Int64}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + full_name = PB.decode(d, String) + elseif field_number == 2 + PB.decode!(d, wire_type, full_shape) + elseif field_number == 3 + PB.decode!(d, wire_type, var_offset) + elseif field_number == 4 + PB.decode!(d, wire_type, var_shape) + else + PB.skip(d, wire_type) + end + end + return SaveSliceInfoDef(full_name, full_shape[], var_offset[], var_shape[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::SaveSliceInfoDef) + initpos = position(e.io) + !isempty(x.full_name) && PB.encode(e, 1, x.full_name) + !isempty(x.full_shape) && PB.encode(e, 2, x.full_shape) + !isempty(x.var_offset) && PB.encode(e, 3, x.var_offset) + !isempty(x.var_shape) && PB.encode(e, 4, x.var_shape) + return position(e.io) - initpos +end +function PB._encoded_size(x::SaveSliceInfoDef) + encoded_size = 0 + !isempty(x.full_name) && (encoded_size += PB._encoded_size(x.full_name, 1)) + !isempty(x.full_shape) && (encoded_size += PB._encoded_size(x.full_shape, 2)) + !isempty(x.var_offset) && (encoded_size += PB._encoded_size(x.var_offset, 3)) + !isempty(x.var_shape) && (encoded_size += PB._encoded_size(x.var_shape, 4)) + return encoded_size +end + +struct VariableDef + variable_name::String + initial_value_name::String + initializer_name::String + snapshot_name::String + save_slice_info_def::Union{Nothing,SaveSliceInfoDef} + is_resource::Bool + trainable::Bool + synchronization::VariableSynchronization.T + aggregation::VariableAggregation.T +end +PB.default_values(::Type{VariableDef}) = (;variable_name = "", initial_value_name = "", initializer_name = "", snapshot_name = "", save_slice_info_def = nothing, is_resource = false, trainable = false, synchronization = VariableSynchronization.VARIABLE_SYNCHRONIZATION_AUTO, aggregation = VariableAggregation.VARIABLE_AGGREGATION_NONE) +PB.field_numbers(::Type{VariableDef}) = (;variable_name = 1, initial_value_name = 6, initializer_name = 2, snapshot_name = 3, save_slice_info_def = 4, is_resource = 5, trainable = 7, synchronization = 8, aggregation = 9) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:VariableDef}) + variable_name = "" + initial_value_name = "" + initializer_name = "" + snapshot_name = "" + save_slice_info_def = Ref{Union{Nothing,SaveSliceInfoDef}}(nothing) + is_resource = false + trainable = false + synchronization = VariableSynchronization.VARIABLE_SYNCHRONIZATION_AUTO + aggregation = VariableAggregation.VARIABLE_AGGREGATION_NONE + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + variable_name = PB.decode(d, String) + elseif field_number == 6 + initial_value_name = PB.decode(d, String) + elseif field_number == 2 + initializer_name = PB.decode(d, String) + elseif field_number == 3 + snapshot_name = PB.decode(d, String) + elseif field_number == 4 + PB.decode!(d, save_slice_info_def) + elseif field_number == 5 + is_resource = PB.decode(d, Bool) + elseif field_number == 7 + trainable = PB.decode(d, Bool) + elseif field_number == 8 + synchronization = PB.decode(d, VariableSynchronization.T) + elseif field_number == 9 + aggregation = PB.decode(d, VariableAggregation.T) + else + PB.skip(d, wire_type) + end + end + return VariableDef(variable_name, initial_value_name, initializer_name, snapshot_name, save_slice_info_def[], is_resource, trainable, synchronization, aggregation) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::VariableDef) + initpos = position(e.io) + !isempty(x.variable_name) && PB.encode(e, 1, x.variable_name) + !isempty(x.initial_value_name) && PB.encode(e, 6, x.initial_value_name) + !isempty(x.initializer_name) && PB.encode(e, 2, x.initializer_name) + !isempty(x.snapshot_name) && PB.encode(e, 3, x.snapshot_name) + !isnothing(x.save_slice_info_def) && PB.encode(e, 4, x.save_slice_info_def) + x.is_resource != false && PB.encode(e, 5, x.is_resource) + x.trainable != false && PB.encode(e, 7, x.trainable) + x.synchronization != VariableSynchronization.VARIABLE_SYNCHRONIZATION_AUTO && PB.encode(e, 8, x.synchronization) + x.aggregation != VariableAggregation.VARIABLE_AGGREGATION_NONE && PB.encode(e, 9, x.aggregation) + return position(e.io) - initpos +end +function PB._encoded_size(x::VariableDef) + encoded_size = 0 + !isempty(x.variable_name) && (encoded_size += PB._encoded_size(x.variable_name, 1)) + !isempty(x.initial_value_name) && (encoded_size += PB._encoded_size(x.initial_value_name, 6)) + !isempty(x.initializer_name) && (encoded_size += PB._encoded_size(x.initializer_name, 2)) + !isempty(x.snapshot_name) && (encoded_size += PB._encoded_size(x.snapshot_name, 3)) + !isnothing(x.save_slice_info_def) && (encoded_size += PB._encoded_size(x.save_slice_info_def, 4)) + x.is_resource != false && (encoded_size += PB._encoded_size(x.is_resource, 5)) + x.trainable != false && (encoded_size += PB._encoded_size(x.trainable, 7)) + x.synchronization != VariableSynchronization.VARIABLE_SYNCHRONIZATION_AUTO && (encoded_size += PB._encoded_size(x.synchronization, 8)) + x.aggregation != VariableAggregation.VARIABLE_AGGREGATION_NONE && (encoded_size += PB._encoded_size(x.aggregation, 9)) + return encoded_size +end diff --git a/src/protojl/tensorboard/tensorboard/verifier_config_pb.jl b/src/protojl/tensorboard/tensorboard/verifier_config_pb.jl new file mode 100644 index 0000000..7c68b24 --- /dev/null +++ b/src/protojl/tensorboard/tensorboard/verifier_config_pb.jl @@ -0,0 +1,46 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:24.286 +# original file: /home/lior/TensorBoardLogger.jl/gen/proto/tensorboard/compat/proto/verifier_config.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export var"VerifierConfig.Toggle", VerifierConfig + +@enumx var"VerifierConfig.Toggle" DEFAULT=0 ON=1 OFF=2 + +struct VerifierConfig + verification_timeout_in_ms::Int64 + structure_verifier::var"VerifierConfig.Toggle".T +end +PB.default_values(::Type{VerifierConfig}) = (;verification_timeout_in_ms = zero(Int64), structure_verifier = var"VerifierConfig.Toggle".DEFAULT) +PB.field_numbers(::Type{VerifierConfig}) = (;verification_timeout_in_ms = 1, structure_verifier = 2) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:VerifierConfig}) + verification_timeout_in_ms = zero(Int64) + structure_verifier = var"VerifierConfig.Toggle".DEFAULT + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + verification_timeout_in_ms = PB.decode(d, Int64) + elseif field_number == 2 + structure_verifier = PB.decode(d, var"VerifierConfig.Toggle".T) + else + PB.skip(d, wire_type) + end + end + return VerifierConfig(verification_timeout_in_ms, structure_verifier) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::VerifierConfig) + initpos = position(e.io) + x.verification_timeout_in_ms != zero(Int64) && PB.encode(e, 1, x.verification_timeout_in_ms) + x.structure_verifier != var"VerifierConfig.Toggle".DEFAULT && PB.encode(e, 2, x.structure_verifier) + return position(e.io) - initpos +end +function PB._encoded_size(x::VerifierConfig) + encoded_size = 0 + x.verification_timeout_in_ms != zero(Int64) && (encoded_size += PB._encoded_size(x.verification_timeout_in_ms, 1)) + x.structure_verifier != var"VerifierConfig.Toggle".DEFAULT && (encoded_size += PB._encoded_size(x.structure_verifier, 2)) + return encoded_size +end diff --git a/src/protojl/tensorboard/tensorboard/versions_pb.jl b/src/protojl/tensorboard/tensorboard/versions_pb.jl new file mode 100644 index 0000000..2b924a7 --- /dev/null +++ b/src/protojl/tensorboard/tensorboard/versions_pb.jl @@ -0,0 +1,50 @@ +# Autogenerated using ProtoBuf.jl v1.0.11 on 2023-06-19T18:18:24.286 +# original file: /home/lior/TensorBoardLogger.jl/gen/proto/tensorboard/compat/proto/versions.proto (proto3 syntax) + +import ProtoBuf as PB +using ProtoBuf: OneOf +using ProtoBuf.EnumX: @enumx + +export VersionDef + +struct VersionDef + producer::Int32 + min_consumer::Int32 + bad_consumers::Vector{Int32} +end +PB.default_values(::Type{VersionDef}) = (;producer = zero(Int32), min_consumer = zero(Int32), bad_consumers = Vector{Int32}()) +PB.field_numbers(::Type{VersionDef}) = (;producer = 1, min_consumer = 2, bad_consumers = 3) + +function PB.decode(d::PB.AbstractProtoDecoder, ::Type{<:VersionDef}) + producer = zero(Int32) + min_consumer = zero(Int32) + bad_consumers = PB.BufferedVector{Int32}() + while !PB.message_done(d) + field_number, wire_type = PB.decode_tag(d) + if field_number == 1 + producer = PB.decode(d, Int32) + elseif field_number == 2 + min_consumer = PB.decode(d, Int32) + elseif field_number == 3 + PB.decode!(d, wire_type, bad_consumers) + else + PB.skip(d, wire_type) + end + end + return VersionDef(producer, min_consumer, bad_consumers[]) +end + +function PB.encode(e::PB.AbstractProtoEncoder, x::VersionDef) + initpos = position(e.io) + x.producer != zero(Int32) && PB.encode(e, 1, x.producer) + x.min_consumer != zero(Int32) && PB.encode(e, 2, x.min_consumer) + !isempty(x.bad_consumers) && PB.encode(e, 3, x.bad_consumers) + return position(e.io) - initpos +end +function PB._encoded_size(x::VersionDef) + encoded_size = 0 + x.producer != zero(Int32) && (encoded_size += PB._encoded_size(x.producer, 1)) + x.min_consumer != zero(Int32) && (encoded_size += PB._encoded_size(x.min_consumer, 2)) + !isempty(x.bad_consumers) && (encoded_size += PB._encoded_size(x.bad_consumers, 3)) + return encoded_size +end diff --git a/src/protojl/tensorboard/tfprof_log_pb.jl b/src/protojl/tensorboard/tfprof_log_pb.jl deleted file mode 100644 index e1701ad..0000000 --- a/src/protojl/tensorboard/tfprof_log_pb.jl +++ /dev/null @@ -1,1023 +0,0 @@ -# syntax: proto3 -using ProtoBuf -import ProtoBuf.meta - -mutable struct CodeDef_Trace <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function CodeDef_Trace(; kwargs...) - obj = new(meta(CodeDef_Trace), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct CodeDef_Trace -const __meta_CodeDef_Trace = Ref{ProtoMeta}() -function meta(::Type{CodeDef_Trace}) - ProtoBuf.metalock() do - if !isassigned(__meta_CodeDef_Trace) - __meta_CodeDef_Trace[] = target = ProtoMeta(CodeDef_Trace) - fnum = Int[1,6,2,3,7,4,8,5] - allflds = Pair{Symbol,Union{Type,String}}[:file => AbstractString, :file_id => Int64, :lineno => Int32, :_function => AbstractString, :function_id => Int64, :line => AbstractString, :line_id => Int64, :func_start_line => Int32] - meta(target, CodeDef_Trace, allflds, ProtoBuf.DEF_REQ, fnum, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_CodeDef_Trace[] - end -end -function Base.getproperty(obj::CodeDef_Trace, name::Symbol) - if name === :file - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :file_id - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :lineno - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :_function - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :function_id - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :line - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :line_id - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :func_start_line - return (obj.__protobuf_jl_internal_values[name])::Int32 - else - getfield(obj, name) - end -end - -mutable struct CodeDef <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function CodeDef(; kwargs...) - obj = new(meta(CodeDef), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct CodeDef -const __meta_CodeDef = Ref{ProtoMeta}() -function meta(::Type{CodeDef}) - ProtoBuf.metalock() do - if !isassigned(__meta_CodeDef) - __meta_CodeDef[] = target = ProtoMeta(CodeDef) - allflds = Pair{Symbol,Union{Type,String}}[:traces => Base.Vector{CodeDef_Trace}] - meta(target, CodeDef, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_CodeDef[] - end -end -function Base.getproperty(obj::CodeDef, name::Symbol) - if name === :traces - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{CodeDef_Trace} - else - getfield(obj, name) - end -end - -mutable struct OpLogEntry <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function OpLogEntry(; kwargs...) - obj = new(meta(OpLogEntry), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct OpLogEntry -const __meta_OpLogEntry = Ref{ProtoMeta}() -function meta(::Type{OpLogEntry}) - ProtoBuf.metalock() do - if !isassigned(__meta_OpLogEntry) - __meta_OpLogEntry[] = target = ProtoMeta(OpLogEntry) - allflds = Pair{Symbol,Union{Type,String}}[:name => AbstractString, :float_ops => Int64, :types => Base.Vector{AbstractString}, :code_def => CodeDef] - meta(target, OpLogEntry, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_OpLogEntry[] - end -end -function Base.getproperty(obj::OpLogEntry, name::Symbol) - if name === :name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :float_ops - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :types - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{AbstractString} - elseif name === :code_def - return (obj.__protobuf_jl_internal_values[name])::CodeDef - else - getfield(obj, name) - end -end - -mutable struct OpLogProto_IdToStringEntry <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function OpLogProto_IdToStringEntry(; kwargs...) - obj = new(meta(OpLogProto_IdToStringEntry), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct OpLogProto_IdToStringEntry (mapentry) -const __meta_OpLogProto_IdToStringEntry = Ref{ProtoMeta}() -function meta(::Type{OpLogProto_IdToStringEntry}) - ProtoBuf.metalock() do - if !isassigned(__meta_OpLogProto_IdToStringEntry) - __meta_OpLogProto_IdToStringEntry[] = target = ProtoMeta(OpLogProto_IdToStringEntry) - allflds = Pair{Symbol,Union{Type,String}}[:key => Int64, :value => AbstractString] - meta(target, OpLogProto_IdToStringEntry, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_OpLogProto_IdToStringEntry[] - end -end -function Base.getproperty(obj::OpLogProto_IdToStringEntry, name::Symbol) - if name === :key - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :value - return (obj.__protobuf_jl_internal_values[name])::AbstractString - else - getfield(obj, name) - end -end - -mutable struct OpLogProto <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function OpLogProto(; kwargs...) - obj = new(meta(OpLogProto), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct OpLogProto -const __meta_OpLogProto = Ref{ProtoMeta}() -function meta(::Type{OpLogProto}) - ProtoBuf.metalock() do - if !isassigned(__meta_OpLogProto) - __meta_OpLogProto[] = target = ProtoMeta(OpLogProto) - allflds = Pair{Symbol,Union{Type,String}}[:log_entries => Base.Vector{OpLogEntry}, :id_to_string => Base.Dict{Int64,AbstractString}] - meta(target, OpLogProto, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_OpLogProto[] - end -end -function Base.getproperty(obj::OpLogProto, name::Symbol) - if name === :log_entries - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{OpLogEntry} - elseif name === :id_to_string - return (obj.__protobuf_jl_internal_values[name])::Base.Dict{Int64,AbstractString} - else - getfield(obj, name) - end -end - -mutable struct Tuple <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function Tuple(; kwargs...) - obj = new(meta(Tuple), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct Tuple -const __meta_Tuple = Ref{ProtoMeta}() -function meta(::Type{Tuple}) - ProtoBuf.metalock() do - if !isassigned(__meta_Tuple) - __meta_Tuple[] = target = ProtoMeta(Tuple) - pack = Symbol[:int64_values] - allflds = Pair{Symbol,Union{Type,String}}[:int64_values => Base.Vector{Int64}] - meta(target, Tuple, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, pack, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_Tuple[] - end -end -function Base.getproperty(obj::Tuple, name::Symbol) - if name === :int64_values - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Int64} - else - getfield(obj, name) - end -end - -mutable struct ProfileNode_OutputShapesEntry <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function ProfileNode_OutputShapesEntry(; kwargs...) - obj = new(meta(ProfileNode_OutputShapesEntry), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct ProfileNode_OutputShapesEntry (mapentry) -const __meta_ProfileNode_OutputShapesEntry = Ref{ProtoMeta}() -function meta(::Type{ProfileNode_OutputShapesEntry}) - ProtoBuf.metalock() do - if !isassigned(__meta_ProfileNode_OutputShapesEntry) - __meta_ProfileNode_OutputShapesEntry[] = target = ProtoMeta(ProfileNode_OutputShapesEntry) - allflds = Pair{Symbol,Union{Type,String}}[:key => Int32, :value => Tuple] - meta(target, ProfileNode_OutputShapesEntry, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_ProfileNode_OutputShapesEntry[] - end -end -function Base.getproperty(obj::ProfileNode_OutputShapesEntry, name::Symbol) - if name === :key - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :value - return (obj.__protobuf_jl_internal_values[name])::Tuple - else - getfield(obj, name) - end -end - -mutable struct ProfileNode_InputShapesEntry <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function ProfileNode_InputShapesEntry(; kwargs...) - obj = new(meta(ProfileNode_InputShapesEntry), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct ProfileNode_InputShapesEntry (mapentry) -const __meta_ProfileNode_InputShapesEntry = Ref{ProtoMeta}() -function meta(::Type{ProfileNode_InputShapesEntry}) - ProtoBuf.metalock() do - if !isassigned(__meta_ProfileNode_InputShapesEntry) - __meta_ProfileNode_InputShapesEntry[] = target = ProtoMeta(ProfileNode_InputShapesEntry) - allflds = Pair{Symbol,Union{Type,String}}[:key => Int32, :value => Tuple] - meta(target, ProfileNode_InputShapesEntry, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_ProfileNode_InputShapesEntry[] - end -end -function Base.getproperty(obj::ProfileNode_InputShapesEntry, name::Symbol) - if name === :key - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :value - return (obj.__protobuf_jl_internal_values[name])::Tuple - else - getfield(obj, name) - end -end - -mutable struct ExecTime <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function ExecTime(; kwargs...) - obj = new(meta(ExecTime), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct ExecTime -const __meta_ExecTime = Ref{ProtoMeta}() -function meta(::Type{ExecTime}) - ProtoBuf.metalock() do - if !isassigned(__meta_ExecTime) - __meta_ExecTime[] = target = ProtoMeta(ExecTime) - allflds = Pair{Symbol,Union{Type,String}}[:times => Base.Vector{Tuple}] - meta(target, ExecTime, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_ExecTime[] - end -end -function Base.getproperty(obj::ExecTime, name::Symbol) - if name === :times - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Tuple} - else - getfield(obj, name) - end -end - -mutable struct ExecProfile_AcceleratorExecsEntry <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function ExecProfile_AcceleratorExecsEntry(; kwargs...) - obj = new(meta(ExecProfile_AcceleratorExecsEntry), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct ExecProfile_AcceleratorExecsEntry (mapentry) -const __meta_ExecProfile_AcceleratorExecsEntry = Ref{ProtoMeta}() -function meta(::Type{ExecProfile_AcceleratorExecsEntry}) - ProtoBuf.metalock() do - if !isassigned(__meta_ExecProfile_AcceleratorExecsEntry) - __meta_ExecProfile_AcceleratorExecsEntry[] = target = ProtoMeta(ExecProfile_AcceleratorExecsEntry) - allflds = Pair{Symbol,Union{Type,String}}[:key => AbstractString, :value => ExecTime] - meta(target, ExecProfile_AcceleratorExecsEntry, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_ExecProfile_AcceleratorExecsEntry[] - end -end -function Base.getproperty(obj::ExecProfile_AcceleratorExecsEntry, name::Symbol) - if name === :key - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :value - return (obj.__protobuf_jl_internal_values[name])::ExecTime - else - getfield(obj, name) - end -end - -mutable struct ExecProfile_CpuExecsEntry <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function ExecProfile_CpuExecsEntry(; kwargs...) - obj = new(meta(ExecProfile_CpuExecsEntry), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct ExecProfile_CpuExecsEntry (mapentry) -const __meta_ExecProfile_CpuExecsEntry = Ref{ProtoMeta}() -function meta(::Type{ExecProfile_CpuExecsEntry}) - ProtoBuf.metalock() do - if !isassigned(__meta_ExecProfile_CpuExecsEntry) - __meta_ExecProfile_CpuExecsEntry[] = target = ProtoMeta(ExecProfile_CpuExecsEntry) - allflds = Pair{Symbol,Union{Type,String}}[:key => AbstractString, :value => ExecTime] - meta(target, ExecProfile_CpuExecsEntry, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_ExecProfile_CpuExecsEntry[] - end -end -function Base.getproperty(obj::ExecProfile_CpuExecsEntry, name::Symbol) - if name === :key - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :value - return (obj.__protobuf_jl_internal_values[name])::ExecTime - else - getfield(obj, name) - end -end - -mutable struct Memory <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function Memory(; kwargs...) - obj = new(meta(Memory), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct Memory -const __meta_Memory = Ref{ProtoMeta}() -function meta(::Type{Memory}) - ProtoBuf.metalock() do - if !isassigned(__meta_Memory) - __meta_Memory[] = target = ProtoMeta(Memory) - allflds = Pair{Symbol,Union{Type,String}}[:bytes => Int64, :ptr => UInt64] - meta(target, Memory, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_Memory[] - end -end -function Base.getproperty(obj::Memory, name::Symbol) - if name === :bytes - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :ptr - return (obj.__protobuf_jl_internal_values[name])::UInt64 - else - getfield(obj, name) - end -end - -mutable struct ExecMemory_OutputMemoryEntry <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function ExecMemory_OutputMemoryEntry(; kwargs...) - obj = new(meta(ExecMemory_OutputMemoryEntry), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct ExecMemory_OutputMemoryEntry (mapentry) -const __meta_ExecMemory_OutputMemoryEntry = Ref{ProtoMeta}() -function meta(::Type{ExecMemory_OutputMemoryEntry}) - ProtoBuf.metalock() do - if !isassigned(__meta_ExecMemory_OutputMemoryEntry) - __meta_ExecMemory_OutputMemoryEntry[] = target = ProtoMeta(ExecMemory_OutputMemoryEntry) - allflds = Pair{Symbol,Union{Type,String}}[:key => Int32, :value => Memory] - meta(target, ExecMemory_OutputMemoryEntry, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_ExecMemory_OutputMemoryEntry[] - end -end -function Base.getproperty(obj::ExecMemory_OutputMemoryEntry, name::Symbol) - if name === :key - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :value - return (obj.__protobuf_jl_internal_values[name])::Memory - else - getfield(obj, name) - end -end - -mutable struct ExecMemory <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function ExecMemory(; kwargs...) - obj = new(meta(ExecMemory), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct ExecMemory -const __meta_ExecMemory = Ref{ProtoMeta}() -function meta(::Type{ExecMemory}) - ProtoBuf.metalock() do - if !isassigned(__meta_ExecMemory) - __meta_ExecMemory[] = target = ProtoMeta(ExecMemory) - allflds = Pair{Symbol,Union{Type,String}}[:memory_micros => Int64, :host_temp_bytes => Int64, :host_persistent_bytes => Int64, :accelerator_temp_bytes => Int64, :accelerator_persistent_bytes => Int64, :requested_bytes => Int64, :peak_bytes => Int64, :residual_bytes => Int64, :output_bytes => Int64, :allocator_bytes_in_use => Int64, :output_memory => Base.Dict{Int32,Memory}] - meta(target, ExecMemory, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_ExecMemory[] - end -end -function Base.getproperty(obj::ExecMemory, name::Symbol) - if name === :memory_micros - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :host_temp_bytes - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :host_persistent_bytes - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :accelerator_temp_bytes - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :accelerator_persistent_bytes - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :requested_bytes - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :peak_bytes - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :residual_bytes - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :output_bytes - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :allocator_bytes_in_use - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :output_memory - return (obj.__protobuf_jl_internal_values[name])::Base.Dict{Int32,Memory} - else - getfield(obj, name) - end -end - -mutable struct ExecProfile <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function ExecProfile(; kwargs...) - obj = new(meta(ExecProfile), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct ExecProfile -const __meta_ExecProfile = Ref{ProtoMeta}() -function meta(::Type{ExecProfile}) - ProtoBuf.metalock() do - if !isassigned(__meta_ExecProfile) - __meta_ExecProfile[] = target = ProtoMeta(ExecProfile) - fnum = Int[1,2,3,4,5,7,11,6] - allflds = Pair{Symbol,Union{Type,String}}[:run_count => Int64, :all_start_micros => Int64, :latest_end_micros => Int64, :accelerator_execs => Base.Dict{AbstractString,ExecTime}, :cpu_execs => Base.Dict{AbstractString,ExecTime}, :memory_execs => Base.Vector{ExecMemory}, :allocations => Base.Vector{AllocationRecord}, :devices => Base.Vector{AbstractString}] - meta(target, ExecProfile, allflds, ProtoBuf.DEF_REQ, fnum, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_ExecProfile[] - end -end -function Base.getproperty(obj::ExecProfile, name::Symbol) - if name === :run_count - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :all_start_micros - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :latest_end_micros - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :accelerator_execs - return (obj.__protobuf_jl_internal_values[name])::Base.Dict{AbstractString,ExecTime} - elseif name === :cpu_execs - return (obj.__protobuf_jl_internal_values[name])::Base.Dict{AbstractString,ExecTime} - elseif name === :memory_execs - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{ExecMemory} - elseif name === :allocations - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{AllocationRecord} - elseif name === :devices - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{AbstractString} - else - getfield(obj, name) - end -end - -mutable struct ProfileNode_ExecsEntry <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function ProfileNode_ExecsEntry(; kwargs...) - obj = new(meta(ProfileNode_ExecsEntry), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct ProfileNode_ExecsEntry (mapentry) -const __meta_ProfileNode_ExecsEntry = Ref{ProtoMeta}() -function meta(::Type{ProfileNode_ExecsEntry}) - ProtoBuf.metalock() do - if !isassigned(__meta_ProfileNode_ExecsEntry) - __meta_ProfileNode_ExecsEntry[] = target = ProtoMeta(ProfileNode_ExecsEntry) - allflds = Pair{Symbol,Union{Type,String}}[:key => Int64, :value => ExecProfile] - meta(target, ProfileNode_ExecsEntry, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_ProfileNode_ExecsEntry[] - end -end -function Base.getproperty(obj::ProfileNode_ExecsEntry, name::Symbol) - if name === :key - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :value - return (obj.__protobuf_jl_internal_values[name])::ExecProfile - else - getfield(obj, name) - end -end - -mutable struct ProfileNode_InputsEntry <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function ProfileNode_InputsEntry(; kwargs...) - obj = new(meta(ProfileNode_InputsEntry), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct ProfileNode_InputsEntry (mapentry) -const __meta_ProfileNode_InputsEntry = Ref{ProtoMeta}() -function meta(::Type{ProfileNode_InputsEntry}) - ProtoBuf.metalock() do - if !isassigned(__meta_ProfileNode_InputsEntry) - __meta_ProfileNode_InputsEntry[] = target = ProtoMeta(ProfileNode_InputsEntry) - allflds = Pair{Symbol,Union{Type,String}}[:key => Int32, :value => Int64] - meta(target, ProfileNode_InputsEntry, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_ProfileNode_InputsEntry[] - end -end -function Base.getproperty(obj::ProfileNode_InputsEntry, name::Symbol) - if name === :key - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :value - return (obj.__protobuf_jl_internal_values[name])::Int64 - else - getfield(obj, name) - end -end - -mutable struct ProfileNode_OutputsEntry <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function ProfileNode_OutputsEntry(; kwargs...) - obj = new(meta(ProfileNode_OutputsEntry), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct ProfileNode_OutputsEntry (mapentry) -const __meta_ProfileNode_OutputsEntry = Ref{ProtoMeta}() -function meta(::Type{ProfileNode_OutputsEntry}) - ProtoBuf.metalock() do - if !isassigned(__meta_ProfileNode_OutputsEntry) - __meta_ProfileNode_OutputsEntry[] = target = ProtoMeta(ProfileNode_OutputsEntry) - allflds = Pair{Symbol,Union{Type,String}}[:key => Int32, :value => Int64] - meta(target, ProfileNode_OutputsEntry, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_ProfileNode_OutputsEntry[] - end -end -function Base.getproperty(obj::ProfileNode_OutputsEntry, name::Symbol) - if name === :key - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :value - return (obj.__protobuf_jl_internal_values[name])::Int64 - else - getfield(obj, name) - end -end - -mutable struct ProfileNode_SrcOutputIndexEntry <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function ProfileNode_SrcOutputIndexEntry(; kwargs...) - obj = new(meta(ProfileNode_SrcOutputIndexEntry), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct ProfileNode_SrcOutputIndexEntry (mapentry) -const __meta_ProfileNode_SrcOutputIndexEntry = Ref{ProtoMeta}() -function meta(::Type{ProfileNode_SrcOutputIndexEntry}) - ProtoBuf.metalock() do - if !isassigned(__meta_ProfileNode_SrcOutputIndexEntry) - __meta_ProfileNode_SrcOutputIndexEntry[] = target = ProtoMeta(ProfileNode_SrcOutputIndexEntry) - allflds = Pair{Symbol,Union{Type,String}}[:key => Int64, :value => Int32] - meta(target, ProfileNode_SrcOutputIndexEntry, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_ProfileNode_SrcOutputIndexEntry[] - end -end -function Base.getproperty(obj::ProfileNode_SrcOutputIndexEntry, name::Symbol) - if name === :key - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :value - return (obj.__protobuf_jl_internal_values[name])::Int32 - else - getfield(obj, name) - end -end - -mutable struct ProfileNode_AttrsEntry <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function ProfileNode_AttrsEntry(; kwargs...) - obj = new(meta(ProfileNode_AttrsEntry), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct ProfileNode_AttrsEntry (mapentry) -const __meta_ProfileNode_AttrsEntry = Ref{ProtoMeta}() -function meta(::Type{ProfileNode_AttrsEntry}) - ProtoBuf.metalock() do - if !isassigned(__meta_ProfileNode_AttrsEntry) - __meta_ProfileNode_AttrsEntry[] = target = ProtoMeta(ProfileNode_AttrsEntry) - allflds = Pair{Symbol,Union{Type,String}}[:key => AbstractString, :value => AttrValue] - meta(target, ProfileNode_AttrsEntry, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_ProfileNode_AttrsEntry[] - end -end -function Base.getproperty(obj::ProfileNode_AttrsEntry, name::Symbol) - if name === :key - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :value - return (obj.__protobuf_jl_internal_values[name])::AttrValue - else - getfield(obj, name) - end -end - -mutable struct ProfileNode <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function ProfileNode(; kwargs...) - obj = new(meta(ProfileNode), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct ProfileNode -const __meta_ProfileNode = Ref{ProtoMeta}() -function meta(::Type{ProfileNode}) - ProtoBuf.metalock() do - if !isassigned(__meta_ProfileNode) - __meta_ProfileNode[] = target = ProtoMeta(ProfileNode) - fnum = Int[1,9,13,2,16,3,15,14,4,5,6,7,8,10,11,12] - pack = Symbol[:shape] - allflds = Pair{Symbol,Union{Type,String}}[:name => AbstractString, :op => AbstractString, :id => Int64, :inputs => Base.Dict{Int32,Int64}, :input_shapes => Base.Dict{Int32,Tuple}, :outputs => Base.Dict{Int32,Int64}, :output_shapes => Base.Dict{Int32,Tuple}, :src_output_index => Base.Dict{Int64,Int32}, :shape => Base.Vector{Int64}, :op_types => Base.Vector{AbstractString}, :canonical_device => AbstractString, :host_device => AbstractString, :float_ops => Int64, :trace => CodeDef, :attrs => Base.Dict{AbstractString,AttrValue}, :execs => Base.Dict{Int64,ExecProfile}] - meta(target, ProfileNode, allflds, ProtoBuf.DEF_REQ, fnum, ProtoBuf.DEF_VAL, pack, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_ProfileNode[] - end -end -function Base.getproperty(obj::ProfileNode, name::Symbol) - if name === :name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :op - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :id - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :inputs - return (obj.__protobuf_jl_internal_values[name])::Base.Dict{Int32,Int64} - elseif name === :input_shapes - return (obj.__protobuf_jl_internal_values[name])::Base.Dict{Int32,Tuple} - elseif name === :outputs - return (obj.__protobuf_jl_internal_values[name])::Base.Dict{Int32,Int64} - elseif name === :output_shapes - return (obj.__protobuf_jl_internal_values[name])::Base.Dict{Int32,Tuple} - elseif name === :src_output_index - return (obj.__protobuf_jl_internal_values[name])::Base.Dict{Int64,Int32} - elseif name === :shape - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Int64} - elseif name === :op_types - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{AbstractString} - elseif name === :canonical_device - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :host_device - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :float_ops - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :trace - return (obj.__protobuf_jl_internal_values[name])::CodeDef - elseif name === :attrs - return (obj.__protobuf_jl_internal_values[name])::Base.Dict{AbstractString,AttrValue} - elseif name === :execs - return (obj.__protobuf_jl_internal_values[name])::Base.Dict{Int64,ExecProfile} - else - getfield(obj, name) - end -end - -mutable struct ProfileProto_NodesEntry <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function ProfileProto_NodesEntry(; kwargs...) - obj = new(meta(ProfileProto_NodesEntry), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct ProfileProto_NodesEntry (mapentry) -const __meta_ProfileProto_NodesEntry = Ref{ProtoMeta}() -function meta(::Type{ProfileProto_NodesEntry}) - ProtoBuf.metalock() do - if !isassigned(__meta_ProfileProto_NodesEntry) - __meta_ProfileProto_NodesEntry[] = target = ProtoMeta(ProfileProto_NodesEntry) - allflds = Pair{Symbol,Union{Type,String}}[:key => Int64, :value => ProfileNode] - meta(target, ProfileProto_NodesEntry, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_ProfileProto_NodesEntry[] - end -end -function Base.getproperty(obj::ProfileProto_NodesEntry, name::Symbol) - if name === :key - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :value - return (obj.__protobuf_jl_internal_values[name])::ProfileNode - else - getfield(obj, name) - end -end - -mutable struct ProfileProto_IdToStringEntry <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function ProfileProto_IdToStringEntry(; kwargs...) - obj = new(meta(ProfileProto_IdToStringEntry), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct ProfileProto_IdToStringEntry (mapentry) -const __meta_ProfileProto_IdToStringEntry = Ref{ProtoMeta}() -function meta(::Type{ProfileProto_IdToStringEntry}) - ProtoBuf.metalock() do - if !isassigned(__meta_ProfileProto_IdToStringEntry) - __meta_ProfileProto_IdToStringEntry[] = target = ProtoMeta(ProfileProto_IdToStringEntry) - allflds = Pair{Symbol,Union{Type,String}}[:key => Int64, :value => AbstractString] - meta(target, ProfileProto_IdToStringEntry, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_ProfileProto_IdToStringEntry[] - end -end -function Base.getproperty(obj::ProfileProto_IdToStringEntry, name::Symbol) - if name === :key - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :value - return (obj.__protobuf_jl_internal_values[name])::AbstractString - else - getfield(obj, name) - end -end - -mutable struct ProfileProto <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function ProfileProto(; kwargs...) - obj = new(meta(ProfileProto), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct ProfileProto -const __meta_ProfileProto = Ref{ProtoMeta}() -function meta(::Type{ProfileProto}) - ProtoBuf.metalock() do - if !isassigned(__meta_ProfileProto) - __meta_ProfileProto[] = target = ProtoMeta(ProfileProto) - fnum = Int[1,2,5,3,4] - pack = Symbol[:steps] - allflds = Pair{Symbol,Union{Type,String}}[:nodes => Base.Dict{Int64,ProfileNode}, :has_trace => Bool, :miss_accelerator_stream => Bool, :steps => Base.Vector{Int64}, :id_to_string => Base.Dict{Int64,AbstractString}] - meta(target, ProfileProto, allflds, ProtoBuf.DEF_REQ, fnum, ProtoBuf.DEF_VAL, pack, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_ProfileProto[] - end -end -function Base.getproperty(obj::ProfileProto, name::Symbol) - if name === :nodes - return (obj.__protobuf_jl_internal_values[name])::Base.Dict{Int64,ProfileNode} - elseif name === :has_trace - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :miss_accelerator_stream - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :steps - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Int64} - elseif name === :id_to_string - return (obj.__protobuf_jl_internal_values[name])::Base.Dict{Int64,AbstractString} - else - getfield(obj, name) - end -end - -export CodeDef_Trace, CodeDef, OpLogEntry, OpLogProto_IdToStringEntry, OpLogProto, ProfileProto_NodesEntry, ProfileProto_IdToStringEntry, ProfileProto, ProfileNode_InputsEntry, ProfileNode_InputShapesEntry, ProfileNode_OutputsEntry, ProfileNode_OutputShapesEntry, ProfileNode_SrcOutputIndexEntry, ProfileNode_AttrsEntry, ProfileNode_ExecsEntry, ProfileNode, ExecProfile_AcceleratorExecsEntry, ExecProfile_CpuExecsEntry, ExecProfile, ExecTime, ExecMemory_OutputMemoryEntry, ExecMemory, Tuple, Memory -# mapentries: "ProfileNode_AttrsEntry" => ("AbstractString", "AttrValue"), "ProfileNode_ExecsEntry" => ("Int64", "ExecProfile"), "ProfileNode_InputsEntry" => ("Int32", "Int64"), "ProfileNode_InputShapesEntry" => ("Int32", "Tuple"), "ExecProfile_CpuExecsEntry" => ("AbstractString", "ExecTime"), "ExecMemory_OutputMemoryEntry" => ("Int32", "Memory"), "ProfileNode_SrcOutputIndexEntry" => ("Int64", "Int32"), "ProfileProto_NodesEntry" => ("Int64", "ProfileNode"), "ExecProfile_AcceleratorExecsEntry" => ("AbstractString", "ExecTime"), "ProfileNode_OutputsEntry" => ("Int32", "Int64"), "OpLogProto_IdToStringEntry" => ("Int64", "AbstractString"), "ProfileNode_OutputShapesEntry" => ("Int32", "Tuple"), "ProfileProto_IdToStringEntry" => ("Int64", "AbstractString") diff --git a/src/protojl/tensorboard/trackable_object_graph_pb.jl b/src/protojl/tensorboard/trackable_object_graph_pb.jl deleted file mode 100644 index be7fc93..0000000 --- a/src/protojl/tensorboard/trackable_object_graph_pb.jl +++ /dev/null @@ -1,206 +0,0 @@ -# syntax: proto3 -using ProtoBuf -import ProtoBuf.meta - -mutable struct TrackableObjectGraph_TrackableObject_ObjectReference <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function TrackableObjectGraph_TrackableObject_ObjectReference(; kwargs...) - obj = new(meta(TrackableObjectGraph_TrackableObject_ObjectReference), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct TrackableObjectGraph_TrackableObject_ObjectReference -const __meta_TrackableObjectGraph_TrackableObject_ObjectReference = Ref{ProtoMeta}() -function meta(::Type{TrackableObjectGraph_TrackableObject_ObjectReference}) - ProtoBuf.metalock() do - if !isassigned(__meta_TrackableObjectGraph_TrackableObject_ObjectReference) - __meta_TrackableObjectGraph_TrackableObject_ObjectReference[] = target = ProtoMeta(TrackableObjectGraph_TrackableObject_ObjectReference) - allflds = Pair{Symbol,Union{Type,String}}[:node_id => Int32, :local_name => AbstractString] - meta(target, TrackableObjectGraph_TrackableObject_ObjectReference, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_TrackableObjectGraph_TrackableObject_ObjectReference[] - end -end -function Base.getproperty(obj::TrackableObjectGraph_TrackableObject_ObjectReference, name::Symbol) - if name === :node_id - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :local_name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - else - getfield(obj, name) - end -end - -mutable struct TrackableObjectGraph_TrackableObject_SerializedTensor <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function TrackableObjectGraph_TrackableObject_SerializedTensor(; kwargs...) - obj = new(meta(TrackableObjectGraph_TrackableObject_SerializedTensor), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct TrackableObjectGraph_TrackableObject_SerializedTensor -const __meta_TrackableObjectGraph_TrackableObject_SerializedTensor = Ref{ProtoMeta}() -function meta(::Type{TrackableObjectGraph_TrackableObject_SerializedTensor}) - ProtoBuf.metalock() do - if !isassigned(__meta_TrackableObjectGraph_TrackableObject_SerializedTensor) - __meta_TrackableObjectGraph_TrackableObject_SerializedTensor[] = target = ProtoMeta(TrackableObjectGraph_TrackableObject_SerializedTensor) - allflds = Pair{Symbol,Union{Type,String}}[:name => AbstractString, :full_name => AbstractString, :checkpoint_key => AbstractString, :optional_restore => Bool] - meta(target, TrackableObjectGraph_TrackableObject_SerializedTensor, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_TrackableObjectGraph_TrackableObject_SerializedTensor[] - end -end -function Base.getproperty(obj::TrackableObjectGraph_TrackableObject_SerializedTensor, name::Symbol) - if name === :name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :full_name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :checkpoint_key - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :optional_restore - return (obj.__protobuf_jl_internal_values[name])::Bool - else - getfield(obj, name) - end -end - -mutable struct TrackableObjectGraph_TrackableObject_SlotVariableReference <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function TrackableObjectGraph_TrackableObject_SlotVariableReference(; kwargs...) - obj = new(meta(TrackableObjectGraph_TrackableObject_SlotVariableReference), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct TrackableObjectGraph_TrackableObject_SlotVariableReference -const __meta_TrackableObjectGraph_TrackableObject_SlotVariableReference = Ref{ProtoMeta}() -function meta(::Type{TrackableObjectGraph_TrackableObject_SlotVariableReference}) - ProtoBuf.metalock() do - if !isassigned(__meta_TrackableObjectGraph_TrackableObject_SlotVariableReference) - __meta_TrackableObjectGraph_TrackableObject_SlotVariableReference[] = target = ProtoMeta(TrackableObjectGraph_TrackableObject_SlotVariableReference) - allflds = Pair{Symbol,Union{Type,String}}[:original_variable_node_id => Int32, :slot_name => AbstractString, :slot_variable_node_id => Int32] - meta(target, TrackableObjectGraph_TrackableObject_SlotVariableReference, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_TrackableObjectGraph_TrackableObject_SlotVariableReference[] - end -end -function Base.getproperty(obj::TrackableObjectGraph_TrackableObject_SlotVariableReference, name::Symbol) - if name === :original_variable_node_id - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :slot_name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :slot_variable_node_id - return (obj.__protobuf_jl_internal_values[name])::Int32 - else - getfield(obj, name) - end -end - -mutable struct TrackableObjectGraph_TrackableObject <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function TrackableObjectGraph_TrackableObject(; kwargs...) - obj = new(meta(TrackableObjectGraph_TrackableObject), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct TrackableObjectGraph_TrackableObject -const __meta_TrackableObjectGraph_TrackableObject = Ref{ProtoMeta}() -function meta(::Type{TrackableObjectGraph_TrackableObject}) - ProtoBuf.metalock() do - if !isassigned(__meta_TrackableObjectGraph_TrackableObject) - __meta_TrackableObjectGraph_TrackableObject[] = target = ProtoMeta(TrackableObjectGraph_TrackableObject) - allflds = Pair{Symbol,Union{Type,String}}[:children => Base.Vector{TrackableObjectGraph_TrackableObject_ObjectReference}, :attributes => Base.Vector{TrackableObjectGraph_TrackableObject_SerializedTensor}, :slot_variables => Base.Vector{TrackableObjectGraph_TrackableObject_SlotVariableReference}] - meta(target, TrackableObjectGraph_TrackableObject, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_TrackableObjectGraph_TrackableObject[] - end -end -function Base.getproperty(obj::TrackableObjectGraph_TrackableObject, name::Symbol) - if name === :children - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{TrackableObjectGraph_TrackableObject_ObjectReference} - elseif name === :attributes - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{TrackableObjectGraph_TrackableObject_SerializedTensor} - elseif name === :slot_variables - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{TrackableObjectGraph_TrackableObject_SlotVariableReference} - else - getfield(obj, name) - end -end - -mutable struct TrackableObjectGraph <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function TrackableObjectGraph(; kwargs...) - obj = new(meta(TrackableObjectGraph), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct TrackableObjectGraph -const __meta_TrackableObjectGraph = Ref{ProtoMeta}() -function meta(::Type{TrackableObjectGraph}) - ProtoBuf.metalock() do - if !isassigned(__meta_TrackableObjectGraph) - __meta_TrackableObjectGraph[] = target = ProtoMeta(TrackableObjectGraph) - allflds = Pair{Symbol,Union{Type,String}}[:nodes => Base.Vector{TrackableObjectGraph_TrackableObject}] - meta(target, TrackableObjectGraph, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_TrackableObjectGraph[] - end -end -function Base.getproperty(obj::TrackableObjectGraph, name::Symbol) - if name === :nodes - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{TrackableObjectGraph_TrackableObject} - else - getfield(obj, name) - end -end - -export TrackableObjectGraph_TrackableObject_ObjectReference, TrackableObjectGraph_TrackableObject_SerializedTensor, TrackableObjectGraph_TrackableObject_SlotVariableReference, TrackableObjectGraph_TrackableObject, TrackableObjectGraph diff --git a/src/protojl/tensorboard/types_pb.jl b/src/protojl/tensorboard/types_pb.jl deleted file mode 100644 index 1e4ed86..0000000 --- a/src/protojl/tensorboard/types_pb.jl +++ /dev/null @@ -1,60 +0,0 @@ -# syntax: proto3 -using ProtoBuf -import ProtoBuf.meta - -const _DataType = (;[ - Symbol("DT_INVALID") => Int32(0), - Symbol("DT_FLOAT") => Int32(1), - Symbol("DT_DOUBLE") => Int32(2), - Symbol("DT_INT32") => Int32(3), - Symbol("DT_UINT8") => Int32(4), - Symbol("DT_INT16") => Int32(5), - Symbol("DT_INT8") => Int32(6), - Symbol("DT_STRING") => Int32(7), - Symbol("DT_COMPLEX64") => Int32(8), - Symbol("DT_INT64") => Int32(9), - Symbol("DT_BOOL") => Int32(10), - Symbol("DT_QINT8") => Int32(11), - Symbol("DT_QUINT8") => Int32(12), - Symbol("DT_QINT32") => Int32(13), - Symbol("DT_BFLOAT16") => Int32(14), - Symbol("DT_QINT16") => Int32(15), - Symbol("DT_QUINT16") => Int32(16), - Symbol("DT_UINT16") => Int32(17), - Symbol("DT_COMPLEX128") => Int32(18), - Symbol("DT_HALF") => Int32(19), - Symbol("DT_RESOURCE") => Int32(20), - Symbol("DT_VARIANT") => Int32(21), - Symbol("DT_UINT32") => Int32(22), - Symbol("DT_UINT64") => Int32(23), - Symbol("DT_FLOAT_REF") => Int32(101), - Symbol("DT_DOUBLE_REF") => Int32(102), - Symbol("DT_INT32_REF") => Int32(103), - Symbol("DT_UINT8_REF") => Int32(104), - Symbol("DT_INT16_REF") => Int32(105), - Symbol("DT_INT8_REF") => Int32(106), - Symbol("DT_STRING_REF") => Int32(107), - Symbol("DT_COMPLEX64_REF") => Int32(108), - Symbol("DT_INT64_REF") => Int32(109), - Symbol("DT_BOOL_REF") => Int32(110), - Symbol("DT_QINT8_REF") => Int32(111), - Symbol("DT_QUINT8_REF") => Int32(112), - Symbol("DT_QINT32_REF") => Int32(113), - Symbol("DT_BFLOAT16_REF") => Int32(114), - Symbol("DT_QINT16_REF") => Int32(115), - Symbol("DT_QUINT16_REF") => Int32(116), - Symbol("DT_UINT16_REF") => Int32(117), - Symbol("DT_COMPLEX128_REF") => Int32(118), - Symbol("DT_HALF_REF") => Int32(119), - Symbol("DT_RESOURCE_REF") => Int32(120), - Symbol("DT_VARIANT_REF") => Int32(121), - Symbol("DT_UINT32_REF") => Int32(122), - Symbol("DT_UINT64_REF") => Int32(123), -]...) - -const SpecializedType = (;[ - Symbol("ST_INVALID") => Int32(0), - Symbol("ST_TENSOR_LIST") => Int32(1), -]...) - -export _DataType, SpecializedType diff --git a/src/protojl/tensorboard/variable_pb.jl b/src/protojl/tensorboard/variable_pb.jl deleted file mode 100644 index 18a1d2c..0000000 --- a/src/protojl/tensorboard/variable_pb.jl +++ /dev/null @@ -1,117 +0,0 @@ -# syntax: proto3 -using ProtoBuf -import ProtoBuf.meta - -const VariableSynchronization = (;[ - Symbol("VARIABLE_SYNCHRONIZATION_AUTO") => Int32(0), - Symbol("VARIABLE_SYNCHRONIZATION_NONE") => Int32(1), - Symbol("VARIABLE_SYNCHRONIZATION_ON_WRITE") => Int32(2), - Symbol("VARIABLE_SYNCHRONIZATION_ON_READ") => Int32(3), -]...) - -const VariableAggregation = (;[ - Symbol("VARIABLE_AGGREGATION_NONE") => Int32(0), - Symbol("VARIABLE_AGGREGATION_SUM") => Int32(1), - Symbol("VARIABLE_AGGREGATION_MEAN") => Int32(2), - Symbol("VARIABLE_AGGREGATION_ONLY_FIRST_REPLICA") => Int32(3), -]...) - -mutable struct SaveSliceInfoDef <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function SaveSliceInfoDef(; kwargs...) - obj = new(meta(SaveSliceInfoDef), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct SaveSliceInfoDef -const __meta_SaveSliceInfoDef = Ref{ProtoMeta}() -function meta(::Type{SaveSliceInfoDef}) - ProtoBuf.metalock() do - if !isassigned(__meta_SaveSliceInfoDef) - __meta_SaveSliceInfoDef[] = target = ProtoMeta(SaveSliceInfoDef) - pack = Symbol[:full_shape,:var_offset,:var_shape] - allflds = Pair{Symbol,Union{Type,String}}[:full_name => AbstractString, :full_shape => Base.Vector{Int64}, :var_offset => Base.Vector{Int64}, :var_shape => Base.Vector{Int64}] - meta(target, SaveSliceInfoDef, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, pack, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_SaveSliceInfoDef[] - end -end -function Base.getproperty(obj::SaveSliceInfoDef, name::Symbol) - if name === :full_name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :full_shape - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Int64} - elseif name === :var_offset - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Int64} - elseif name === :var_shape - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Int64} - else - getfield(obj, name) - end -end - -mutable struct VariableDef <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function VariableDef(; kwargs...) - obj = new(meta(VariableDef), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct VariableDef -const __meta_VariableDef = Ref{ProtoMeta}() -function meta(::Type{VariableDef}) - ProtoBuf.metalock() do - if !isassigned(__meta_VariableDef) - __meta_VariableDef[] = target = ProtoMeta(VariableDef) - fnum = Int[1,6,2,3,4,5,7,8,9] - allflds = Pair{Symbol,Union{Type,String}}[:variable_name => AbstractString, :initial_value_name => AbstractString, :initializer_name => AbstractString, :snapshot_name => AbstractString, :save_slice_info_def => SaveSliceInfoDef, :is_resource => Bool, :trainable => Bool, :synchronization => Int32, :aggregation => Int32] - meta(target, VariableDef, allflds, ProtoBuf.DEF_REQ, fnum, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_VariableDef[] - end -end -function Base.getproperty(obj::VariableDef, name::Symbol) - if name === :variable_name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :initial_value_name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :initializer_name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :snapshot_name - return (obj.__protobuf_jl_internal_values[name])::AbstractString - elseif name === :save_slice_info_def - return (obj.__protobuf_jl_internal_values[name])::SaveSliceInfoDef - elseif name === :is_resource - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :trainable - return (obj.__protobuf_jl_internal_values[name])::Bool - elseif name === :synchronization - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :aggregation - return (obj.__protobuf_jl_internal_values[name])::Int32 - else - getfield(obj, name) - end -end - -export VariableSynchronization, VariableAggregation, VariableDef, SaveSliceInfoDef diff --git a/src/protojl/tensorboard/verifier_config_pb.jl b/src/protojl/tensorboard/verifier_config_pb.jl deleted file mode 100644 index 70b9b5d..0000000 --- a/src/protojl/tensorboard/verifier_config_pb.jl +++ /dev/null @@ -1,50 +0,0 @@ -# syntax: proto3 -using ProtoBuf -import ProtoBuf.meta - -const VerifierConfig_Toggle = (;[ - Symbol("DEFAULT") => Int32(0), - Symbol("ON") => Int32(1), - Symbol("OFF") => Int32(2), -]...) - -mutable struct VerifierConfig <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function VerifierConfig(; kwargs...) - obj = new(meta(VerifierConfig), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct VerifierConfig -const __meta_VerifierConfig = Ref{ProtoMeta}() -function meta(::Type{VerifierConfig}) - ProtoBuf.metalock() do - if !isassigned(__meta_VerifierConfig) - __meta_VerifierConfig[] = target = ProtoMeta(VerifierConfig) - allflds = Pair{Symbol,Union{Type,String}}[:verification_timeout_in_ms => Int64, :structure_verifier => Int32] - meta(target, VerifierConfig, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, ProtoBuf.DEF_PACK, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_VerifierConfig[] - end -end -function Base.getproperty(obj::VerifierConfig, name::Symbol) - if name === :verification_timeout_in_ms - return (obj.__protobuf_jl_internal_values[name])::Int64 - elseif name === :structure_verifier - return (obj.__protobuf_jl_internal_values[name])::Int32 - else - getfield(obj, name) - end -end - -export VerifierConfig_Toggle, VerifierConfig diff --git a/src/protojl/tensorboard/versions_pb.jl b/src/protojl/tensorboard/versions_pb.jl deleted file mode 100644 index 50984e4..0000000 --- a/src/protojl/tensorboard/versions_pb.jl +++ /dev/null @@ -1,47 +0,0 @@ -# syntax: proto3 -using ProtoBuf -import ProtoBuf.meta - -mutable struct VersionDef <: ProtoType - __protobuf_jl_internal_meta::ProtoMeta - __protobuf_jl_internal_values::Dict{Symbol,Any} - __protobuf_jl_internal_defaultset::Set{Symbol} - - function VersionDef(; kwargs...) - obj = new(meta(VersionDef), Dict{Symbol,Any}(), Set{Symbol}()) - values = obj.__protobuf_jl_internal_values - symdict = obj.__protobuf_jl_internal_meta.symdict - for nv in kwargs - fldname, fldval = nv - fldtype = symdict[fldname].jtyp - (fldname in keys(symdict)) || error(string(typeof(obj), " has no field with name ", fldname)) - values[fldname] = isa(fldval, fldtype) ? fldval : convert(fldtype, fldval) - end - obj - end -end # mutable struct VersionDef -const __meta_VersionDef = Ref{ProtoMeta}() -function meta(::Type{VersionDef}) - ProtoBuf.metalock() do - if !isassigned(__meta_VersionDef) - __meta_VersionDef[] = target = ProtoMeta(VersionDef) - pack = Symbol[:bad_consumers] - allflds = Pair{Symbol,Union{Type,String}}[:producer => Int32, :min_consumer => Int32, :bad_consumers => Base.Vector{Int32}] - meta(target, VersionDef, allflds, ProtoBuf.DEF_REQ, ProtoBuf.DEF_FNUM, ProtoBuf.DEF_VAL, pack, ProtoBuf.DEF_WTYPES, ProtoBuf.DEF_ONEOFS, ProtoBuf.DEF_ONEOF_NAMES) - end - __meta_VersionDef[] - end -end -function Base.getproperty(obj::VersionDef, name::Symbol) - if name === :producer - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :min_consumer - return (obj.__protobuf_jl_internal_values[name])::Int32 - elseif name === :bad_consumers - return (obj.__protobuf_jl_internal_values[name])::Base.Vector{Int32} - else - getfield(obj, name) - end -end - -export VersionDef diff --git a/src/utils.jl b/src/utils.jl index f0a7129..bc11dd7 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -6,15 +6,9 @@ function masked_crc32c(data) return UInt32(((x >> 15) | UInt32(x << 17)) + 0xa282ead8) end -function serialize_proto(data::ProtoType) +function serialize_proto(data) pb = PipeBuffer() - _writeproto(pb, data) - pb.data -end - -function serialize_proto(data::Any) - pb = PipeBuffer() - write(pb, data) + encode(ProtoEncoder(pb), data) pb.data end diff --git a/test/runtests.jl b/test/runtests.jl index e0de271..686df40 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -11,8 +11,10 @@ ENV["GKSwstype"] = "100" ENV["DATADEPS_ALWAYS_ACCEPT"] = true LOG_DIRS = Any["test_logs/"] +test_s3 = false # Minio breaks on my system -if VERSION >= v"1.5" + +if VERSION >= v"1.5" && test_s3 using Minio # Setup Minio server to test s3 paths minio_server = Minio.Server(mktempdir(); address="localhost:9001") @@ -35,7 +37,7 @@ end ss = TensorBoardLogger.scalar_summary("test", 12.0) @test isa(ss, TensorBoardLogger.Summary_Value) - @test ss.simple_value == 12.0 + @test ss.value.value == Float32(12.0) @test ss.tag == "test" log_value(logger, "float32", 1.25f0, step=step) @@ -72,11 +74,11 @@ end ss = TensorBoardLogger.histogram_summary("test", edges, histvals) @test isa(ss, TensorBoardLogger.Summary_Value) @test ss.tag == "test" - @test isa(ss.histo, TensorBoardLogger.HistogramProto) - @test ss.histo.min == minimum(edges) - @test ss.histo.max == maximum(edges) - @test all(ss.histo.bucket_limit.== edges[2:end]) - @test all(ss.histo.bucket.== histvals) + @test isa(ss.value.value, TensorBoardLogger.HistogramProto) + @test ss.value.value.min == minimum(edges) + @test ss.value.value.max == maximum(edges) + @test all(ss.value.value.bucket_limit .== edges[2:end]) + @test all(ss.value.value.bucket .== histvals) log_histogram(logger, "hist/cust", data_tuple, step=step) log_histogram(logger, "hist/cust", rand(100), step=step) @@ -277,7 +279,7 @@ end add_edge!(g, 4, 6) add_edge!(g, 5, 6) add_edge!(g, 5, 7) - log_graph(logger, g, step = step, nodedevice = ["cpu", "cpu", "gpu", "gpu", "gpu", "gpu", "cpu"], nodevalue = [1, "tf", 3.14, [1.0 2.0; 3.0 4.0], true, +, (10, "julia", 12.4)]) + @test_broken log_graph(logger, g, step = step, nodedevice = ["cpu", "cpu", "gpu", "gpu", "gpu", "gpu", "cpu"], nodevalue = [1, "tf", 3.14, [1.0 2.0; 3.0 4.0], true, +, (10, "julia", 12.4)]) close.(values(logger.all_files)) end @@ -330,6 +332,6 @@ end end -if VERSION >= v"1.5" +if VERSION >= v"1.5" && test_s3 kill(minio_server) end From 24a487815bdab80c0e3c32c19e5f48de06709d78 Mon Sep 17 00:00:00 2001 From: Lior Blech Date: Tue, 20 Jun 2023 22:14:50 +0300 Subject: [PATCH 03/66] update version --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index 2de19ca..4a9c1ea 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "TensorBoardLogger" uuid = "899adc3e-224a-11e9-021f-63837185c80f" authors = ["Filippo Vicentini "] -version = "0.1.20" +version = "0.2.30" [deps] CRC32c = "8bf52ea8-c179-5cab-976a-9e18b702a9bc" From d42fd949af683d98d1804e922e743d58f6a46dc1 Mon Sep 17 00:00:00 2001 From: Lior Blech Date: Tue, 20 Jun 2023 22:20:05 +0300 Subject: [PATCH 04/66] correct version --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index 4a9c1ea..86ee6b6 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "TensorBoardLogger" uuid = "899adc3e-224a-11e9-021f-63837185c80f" authors = ["Filippo Vicentini "] -version = "0.2.30" +version = "0.1.30" [deps] CRC32c = "8bf52ea8-c179-5cab-976a-9e18b702a9bc" From 5f6c556e0cd9164fb7bb3a641617d1ce5955c7bd Mon Sep 17 00:00:00 2001 From: Lior Blech Date: Tue, 20 Jun 2023 22:25:59 +0300 Subject: [PATCH 05/66] irrelevant comment (mine) --- src/Deserialization/deserialization.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Deserialization/deserialization.jl b/src/Deserialization/deserialization.jl index 0d87795..fbb8c47 100644 --- a/src/Deserialization/deserialization.jl +++ b/src/Deserialization/deserialization.jl @@ -193,7 +193,7 @@ function Base.iterate(iter::SummaryDeserializingIterator, state=1) tag, val, state = lookahead_deserialize(tag, val, evs, state, :histo) elseif typ === :image val = deserialize_image_summary(summary) - tag, val, state = lookahead_deserialize(tag, val, evs, state, :image) ## ??? ### The lookahead deserializer for images is broken. It is also not clear where this will actually be useful or intuitive for users + tag, val, state = lookahead_deserialize(tag, val, evs, state, :image) elseif typ === :audio val = deserialize_audio_summary(summary) elseif typ === :tensor From 875fdb47be6dd02a613d0d160b579faa62788715 Mon Sep 17 00:00:00 2001 From: Carlo Lucibello Date: Tue, 20 Jun 2023 22:58:29 +0200 Subject: [PATCH 06/66] suppress warning due to unused type parameter (#122) --- src/logger_dispatch.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/logger_dispatch.jl b/src/logger_dispatch.jl index 7c0831c..a6b3c77 100644 --- a/src/logger_dispatch.jl +++ b/src/logger_dispatch.jl @@ -76,7 +76,7 @@ summary_impl(name, value::Any) = text_summary(name, value) ########## For things going to LogHistograms ######################## # Only consider 1D histograms for histogram plotting -preprocess(name, hist::Histogram{T,1}, data) where T = push!(data, name=>hist) +preprocess(name, hist::Histogram{<:Any,1}, data) = push!(data, name=>hist) summary_impl(name, hist::Histogram) = histogram_summary(name, hist) # TODO: maybe deprecate? tuple means histogram (only if bins/weights match) From 9f09fc1b43181662706b9f1529edbbbd757ae4d8 Mon Sep 17 00:00:00 2001 From: Lior Blech Date: Fri, 23 Jun 2023 21:25:13 +0300 Subject: [PATCH 07/66] bump tests to >= Julia 1.6 --- .github/workflows/UnitTest.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/UnitTest.yml b/.github/workflows/UnitTest.yml index f779697..bdb712d 100644 --- a/.github/workflows/UnitTest.yml +++ b/.github/workflows/UnitTest.yml @@ -13,7 +13,7 @@ jobs: fail-fast: false matrix: os: [macos-latest, ubuntu-latest] - julia_version: ["1.3", "1", "nightly"] + julia_version: ["1.6", "1", "nightly"] runs-on: ${{ matrix.os }} env: From 360e9f4c23b6a209478c6465be90095dacf6ef71 Mon Sep 17 00:00:00 2001 From: Lior Blech Date: Mon, 26 Jun 2023 23:48:16 +0300 Subject: [PATCH 08/66] Apply suggestions from code review Co-authored-by: Frames White --- gen/compile_proto.jl | 2 -- src/Deserialization/deserialization.jl | 4 ---- src/Deserialization/images.jl | 2 +- 3 files changed, 1 insertion(+), 7 deletions(-) diff --git a/gen/compile_proto.jl b/gen/compile_proto.jl index b1df237..9393ad5 100644 --- a/gen/compile_proto.jl +++ b/gen/compile_proto.jl @@ -38,8 +38,6 @@ function process_module(cur_module::AbstractString; base_module::AbstractString= infiles = split.(string.(glob("*.proto", src_dir/input_path)), '/') .|> (a -> a[3:end]) .|> a -> joinpath(a...) mkpath(module_out_dir) - strip_currdir(str::String) = string(strip(str, ['.','/'])) - # relative_paths = string.(infiles) .|> strip_currdir relative_paths = string.(infiles) search_directories = joinpath(@__DIR__, "proto") output_directory = string(module_out_dir) diff --git a/src/Deserialization/deserialization.jl b/src/Deserialization/deserialization.jl index fbb8c47..4284fc7 100644 --- a/src/Deserialization/deserialization.jl +++ b/src/Deserialization/deserialization.jl @@ -250,12 +250,8 @@ function map_summaries(fun::Function, logdir; purge=true, tags=nothing, steps=no steps !== nothing && step ∉ steps && continue iter = SummaryDeserializingIterator(event.what.value, smart) - # fullnames = String[] for (name, val) in iter tags !== nothing && name ∉ tags && continue - # fullname = "$(name)_$(step)" - # fullname in fullnames ? continue : push!(fullnames, fullname) - fun(name, step, val) end end diff --git a/src/Deserialization/images.jl b/src/Deserialization/images.jl index dccb4f3..cc8c072 100644 --- a/src/Deserialization/images.jl +++ b/src/Deserialization/images.jl @@ -14,7 +14,7 @@ function lookahead_deserialize_image_summary(old_tag, old_val, evs::Summary, state = state_old + 1 iter_result = iterate(evs, state) - while !(iter_result isa Nothing) + while iter_result !== nothing ((tag, summary), state) = iter_result # iteration body typ = summary_type(summary) From 2896bf52b3a07162c485ed9195073c4293a6daef Mon Sep 17 00:00:00 2001 From: Lior Blech Date: Mon, 26 Jun 2023 23:49:51 +0300 Subject: [PATCH 09/66] Apply suggestions from code review Co-authored-by: Frames White --- Project.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Project.toml b/Project.toml index 86ee6b6..b7b1b47 100644 --- a/Project.toml +++ b/Project.toml @@ -14,10 +14,10 @@ StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" [compat] FileIO = "1.2.3" ImageCore = "0.8.1, 0.9" -ProtoBuf = "0.10, 0.11, 1.0.11" +ProtoBuf = "1.0.11" Requires = "0.5, 1" StatsBase = "0.27, 0.28, 0.29, 0.30, 0.31, 0.32, 0.33, 0.34" -julia = "1.3, 1.9" +julia = "1.6" [extras] Minio = "4281f0d9-7ae0-406e-9172-b7277c1efa20" From 2155634406426f1500c902ab0c70e38f5c1487ed Mon Sep 17 00:00:00 2001 From: Lior Blech Date: Wed, 28 Jun 2023 16:09:53 +0300 Subject: [PATCH 10/66] convert indentation to spaces --- src/Optional/LogGraph.jl | 188 +++++++++++++++++++-------------------- 1 file changed, 94 insertions(+), 94 deletions(-) diff --git a/src/Optional/LogGraph.jl b/src/Optional/LogGraph.jl index f79690b..e6e2f02 100644 --- a/src/Optional/LogGraph.jl +++ b/src/Optional/LogGraph.jl @@ -2,107 +2,107 @@ using .tensorboard: NodeDef, AttrValue, NameAttrList using .tensorboard: var"AttrValue.ListValue" as AttrValue_ListValue """ - log_graph + log_graph """ function log_graph(logger::TBLogger, g::AbstractGraph; step = nothing, nodelabel::Vector{String} = map(string, vertices(g)), nodeop::Vector{String} = map(string, vertices(g)), nodedevice::Vector{String} = fill("cpu", nv(g)), nodevalue::Vector{Any} = fill(nothing, nv(g))) - nv(g) == length(nodelabel) || throw(ArgumentError("length of nodelable must be same as number of vertices")) - nv(g) == length(nodeop) || throw(ArgumentError("length of nodeop must be same as number of vertices")) - nv(g) == length(nodedevice) || throw(ArgumentError("length of nodedevice must be same as number of vertices")) - nv(g) == length(nodevalue) || throw(ArgumentError("length of nodevalue must be same as number of vertices")) - summ = SummaryCollection(graph_summary(g, nodelabel, nodeop, nodedevice, nodevalue)) + nv(g) == length(nodelabel) || throw(ArgumentError("length of nodelable must be same as number of vertices")) + nv(g) == length(nodeop) || throw(ArgumentError("length of nodeop must be same as number of vertices")) + nv(g) == length(nodedevice) || throw(ArgumentError("length of nodedevice must be same as number of vertices")) + nv(g) == length(nodevalue) || throw(ArgumentError("length of nodevalue must be same as number of vertices")) + summ = SummaryCollection(graph_summary(g, nodelabel, nodeop, nodedevice, nodevalue)) write_event(logger.file, make_event(logger, summ, step=step)) end function graph_summary(g, nodelabel, nodeop, nodedevice, nodevalue) - nodes = Vector{NodeDef}() - for v in vertices(g) - name = nodelabel[v] - op = nodeop[v] - input = [nodelabel[x] for x in inneighbors(g, v)] - device = nodedevice[v] - attr = Dict{String, AttrValue}() - x = nodevalue[v] - if isa(x, AbstractString) - attr["value"] = AttrValue(OneOf(:s, Vector{UInt8}(x))) - attr["dtype"] = AttrValue(OneOf(:_type,jltype2tf(typeof(x)))) - elseif isa(x, Integer) - attr["value"] = AttrValue(OneOf(:i,Int64(x))) - attr["dtype"] = AttrValue(OneOf(:_type, jltype2tf(typeof(x)))) - elseif isa(x, Real) - attr["value"] = AttrValue(OneOf(:f, Float32(x))) - attr["dtype"] = AttrValue(OneOf(:_type, jltype2tf(typeof(x)))) - elseif isa(x, Bool) - attr["value"] = AttrValue(OneOf(:b, x)) - attr["dtype"] = AttrValue(OneOf(:_type, jltype2tf(typeof(x)))) - elseif isa(x, AbstractArray) - shape = TensorShapeProto([TensorShapeProto_Dim(d, "") for d in (collect(size(x)))], false) - t = TensorProto(dtype = jltype2tf(eltype(x)), tensor_shape = shape, tensor_content = serialize_proto(string(x))) - attr["value"] = AttrValue(OneOf(:tensor, t)) - listvalue = AttrValue_ListValue(Vector{Vector{UInt8}}(), - Vector{Int64}(), - Vector{Float32}(), - Vector{Bool}(), - Vector{var"#DataType".T}(), - [shape], - Vector{TensorProto}(), - Vector{NameAttrList}()) - attr["_output_shapes"] = AttrValue(OneOf(:list, listvalue)) - elseif isa(x, Tuple) - listvalue = AttrValue_ListValue([Vector{UInt8}(repr(y)) for y in x], - Vector{Int64}(), - Vector{Float32}(), - Vector{Bool}(), - Vector{var"#DataType".T}(), - Vector{TensorShapeProto}(), - Vector{TensorProto}(), - Vector{NameAttrList}()) - attr["value"] = AttrValue(OneOf(:list, listvalue)) - shape = TensorShapeProto([TensorShapeProto_Dim(length(x), "")], false) - listvalue = AttrValue_ListValue(Vector{Vector{UInt8}}(), - Vector{Int64}(), - Vector{Float32}(), - Vector{Bool}(), - Vector{var"#DataType".T}(), - [shape], - Vector{TensorProto}(), - Vector{NameAttrList}()) - attr["_output_shapes"] = AttrValue(OneOf(:list, listvalue)) - elseif isa(x, Function) - attr["value"] = AttrValue(OneOf(:func, NameAttrList(name = repr(x)))) - else - #donothing - end - node = NodeDef(name, op, input, device, attr, nothing, nothing) - push!(nodes, node) - end - GraphDef(nodes, nothing, 0, nothing, nothing) + nodes = Vector{NodeDef}() + for v in vertices(g) + name = nodelabel[v] + op = nodeop[v] + input = [nodelabel[x] for x in inneighbors(g, v)] + device = nodedevice[v] + attr = Dict{String, AttrValue}() + x = nodevalue[v] + if isa(x, AbstractString) + attr["value"] = AttrValue(OneOf(:s, Vector{UInt8}(x))) + attr["dtype"] = AttrValue(OneOf(:_type,jltype2tf(typeof(x)))) + elseif isa(x, Integer) + attr["value"] = AttrValue(OneOf(:i,Int64(x))) + attr["dtype"] = AttrValue(OneOf(:_type, jltype2tf(typeof(x)))) + elseif isa(x, Real) + attr["value"] = AttrValue(OneOf(:f, Float32(x))) + attr["dtype"] = AttrValue(OneOf(:_type, jltype2tf(typeof(x)))) + elseif isa(x, Bool) + attr["value"] = AttrValue(OneOf(:b, x)) + attr["dtype"] = AttrValue(OneOf(:_type, jltype2tf(typeof(x)))) + elseif isa(x, AbstractArray) + shape = TensorShapeProto([TensorShapeProto_Dim(d, "") for d in (collect(size(x)))], false) + t = TensorProto(dtype = jltype2tf(eltype(x)), tensor_shape = shape, tensor_content = serialize_proto(string(x))) + attr["value"] = AttrValue(OneOf(:tensor, t)) + listvalue = AttrValue_ListValue(Vector{Vector{UInt8}}(), + Vector{Int64}(), + Vector{Float32}(), + Vector{Bool}(), + Vector{var"#DataType".T}(), + [shape], + Vector{TensorProto}(), + Vector{NameAttrList}()) + attr["_output_shapes"] = AttrValue(OneOf(:list, listvalue)) + elseif isa(x, Tuple) + listvalue = AttrValue_ListValue([Vector{UInt8}(repr(y)) for y in x], + Vector{Int64}(), + Vector{Float32}(), + Vector{Bool}(), + Vector{var"#DataType".T}(), + Vector{TensorShapeProto}(), + Vector{TensorProto}(), + Vector{NameAttrList}()) + attr["value"] = AttrValue(OneOf(:list, listvalue)) + shape = TensorShapeProto([TensorShapeProto_Dim(length(x), "")], false) + listvalue = AttrValue_ListValue(Vector{Vector{UInt8}}(), + Vector{Int64}(), + Vector{Float32}(), + Vector{Bool}(), + Vector{var"#DataType".T}(), + [shape], + Vector{TensorProto}(), + Vector{NameAttrList}()) + attr["_output_shapes"] = AttrValue(OneOf(:list, listvalue)) + elseif isa(x, Function) + attr["value"] = AttrValue(OneOf(:func, NameAttrList(name = repr(x)))) + else + #donothing + end + node = NodeDef(name, op, input, device, attr, nothing, nothing) + push!(nodes, node) + end + GraphDef(nodes, nothing, 0, nothing, nothing) end function jltype2tf(dtype::DataType) - nodetype = - dtype == UInt8 ? _DataType.DT_UINT8 : - dtype == UInt16 ? _DataType.DT_UINT16 : - dtype == UInt32 ? _DataType.DT_UINT32 : - dtype == UInt64 ? _DataType.DT_UINT64 : - dtype == Int8 ? _DataType.DT_INT8 : - dtype == Int16 ? _DataType.DT_INT16 : - dtype == Int32 ? _DataType.DT_INT32 : - dtype == Int64 ? _DataType.DT_INT64 : - dtype == Float16 ? _DataType.DT_BFLOAT16 : - dtype == Float32 ? _DataType.DT_FLOAT : - dtype == Float64 ? _DataType.DT_DOUBLE : - dtype <: AbstractString ? _DataType.DT_STRING : - dtype == Bool ? _DataType.DT_BOOL : - dtype ∈ [Complex{Float32}, - Complex{Float16}, - Complex{UInt8}, - Complex{UInt16}, - Complex{UInt32}, - Complex{Int8}, - Complex{Int16}, - Complex{Int32}] ? _DataType.DT_COMPLEX64 : - dtype ∈ [Complex{Float64}, - Complex{UInt64}, - Complex{Int64}] ? _DataType.DT_COMPLEX128 : - _DataType.DT_INVALID + nodetype = + dtype == UInt8 ? _DataType.DT_UINT8 : + dtype == UInt16 ? _DataType.DT_UINT16 : + dtype == UInt32 ? _DataType.DT_UINT32 : + dtype == UInt64 ? _DataType.DT_UINT64 : + dtype == Int8 ? _DataType.DT_INT8 : + dtype == Int16 ? _DataType.DT_INT16 : + dtype == Int32 ? _DataType.DT_INT32 : + dtype == Int64 ? _DataType.DT_INT64 : + dtype == Float16 ? _DataType.DT_BFLOAT16 : + dtype == Float32 ? _DataType.DT_FLOAT : + dtype == Float64 ? _DataType.DT_DOUBLE : + dtype <: AbstractString ? _DataType.DT_STRING : + dtype == Bool ? _DataType.DT_BOOL : + dtype ∈ [Complex{Float32}, + Complex{Float16}, + Complex{UInt8}, + Complex{UInt16}, + Complex{UInt32}, + Complex{Int8}, + Complex{Int16}, + Complex{Int32}] ? _DataType.DT_COMPLEX64 : + dtype ∈ [Complex{Float64}, + Complex{UInt64}, + Complex{Int64}] ? _DataType.DT_COMPLEX128 : + _DataType.DT_INVALID end From b2a763b74a53cd46fb827ba4e0a3c93cb2a8b74c Mon Sep 17 00:00:00 2001 From: Lior Blech Date: Wed, 28 Jun 2023 18:15:02 +0300 Subject: [PATCH 11/66] indentation with spaces --- src/TBLogger.jl | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/TBLogger.jl b/src/TBLogger.jl index efa1bf2..d998160 100644 --- a/src/TBLogger.jl +++ b/src/TBLogger.jl @@ -66,7 +66,7 @@ function TBLogger(logdir="tensorboard_logs/run", overwrite=tb_increment; end """ - init_logdir(logdir, [overwrite=tb_increment]) + init_logdir(logdir, [overwrite=tb_increment]) Creates a folder at path `logdir`. If the folder already exhists the behaviour is determined by `overwrite`. @@ -99,7 +99,7 @@ function init_logdir(logdir, overwrite=tb_increment) end """ - create_eventfile(logdir, [purge_step=nothing; time=time()]) -> IO + create_eventfile(logdir, [purge_step=nothing; time=time()]) -> IO Creates a protobuffer events file in the logdir and returns the IO buffer for writing to it. If `purge_step::Int` is passed then a special event is written @@ -129,7 +129,7 @@ function create_eventfile(logdir, purge_step=nothing, time=time(); prepend="") ev_0 = Event(time, 0, OneOf(:file_version,"brain.Event:2"), source_metadata[]) write_event(file, ev_0) end - return fname, file + return fname, file end """ @@ -193,7 +193,7 @@ Can be overidden by passing `log_step_increment=some_increment` when logging. set_step_increment!(lg::TBLogger, Δstep) = lg.step_increment = Δstep """ - increment_step!(lg, Δ_Step) -> Int + increment_step!(lg, Δ_Step) -> Int Increments the step counter in the logger by `Δ_Step` and returns the new value. """ @@ -253,7 +253,7 @@ CoreLogging.min_enabled_level(lg::TBLogger) = lg.min_level CoreLogging.shouldlog(lg::TBLogger, level, _module, group, id) = true function CoreLogging.handle_message(lg::TBLogger, level, message, _module, group, - id, file, line; kwargs...) + id, file, line; kwargs...) # Unpack the message summ = SummaryCollection() i_step = lg.step_increment # :log_step_increment default value @@ -283,18 +283,18 @@ end ######################### Methods for pretty printing ########################## Base.show(io::IO, tbl::TBLogger) = begin - str = "TBLogger(\"$(tbl.logdir)\"), min_level=$(tbl.min_level), "* - "purge_step=$(tbl.global_step))" + str = "TBLogger(\"$(tbl.logdir)\"), min_level=$(tbl.min_level), "* + "purge_step=$(tbl.global_step))" Base.print(io, str) end Base.show(io::IO, mime::MIME"text/plain", tbl::TBLogger) = begin - str = """ - TBLogger: - - Log level : $(tbl.min_level) - - Current step : $(tbl.global_step) - - Output : $(tbl.logdir) - - open files : $(length(tbl.all_files)) - """ + str = """ + TBLogger: + - Log level : $(tbl.min_level) + - Current step : $(tbl.global_step) + - Output : $(tbl.logdir) + - open files : $(length(tbl.all_files)) + """ Base.print(io, str) end From 6e4174f4402cc684ee97e7d3d0f00cf2554c7cbf Mon Sep 17 00:00:00 2001 From: Frames White Date: Fri, 30 Jun 2023 00:11:58 +0800 Subject: [PATCH 12/66] Update Project.toml --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index b7b1b47..e0d46e2 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "TensorBoardLogger" uuid = "899adc3e-224a-11e9-021f-63837185c80f" authors = ["Filippo Vicentini "] -version = "0.1.30" +version = "0.1.21" [deps] CRC32c = "8bf52ea8-c179-5cab-976a-9e18b702a9bc" From 7678145823f52341ecef9fb5970a57599cb1e37c Mon Sep 17 00:00:00 2001 From: Frames White Date: Fri, 30 Jun 2023 00:16:54 +0800 Subject: [PATCH 13/66] Update Project.toml --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index e0d46e2..fab19bc 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "TensorBoardLogger" uuid = "899adc3e-224a-11e9-021f-63837185c80f" authors = ["Filippo Vicentini "] -version = "0.1.21" +version = "0.1.20" [deps] CRC32c = "8bf52ea8-c179-5cab-976a-9e18b702a9bc" From 1d933fd73362c0d99fa64f7e6652fea6a2e80540 Mon Sep 17 00:00:00 2001 From: Lior Blech Date: Fri, 30 Jun 2023 11:20:00 +0300 Subject: [PATCH 14/66] fix logger interface for histograms and simplify the code --- examples/Histograms.jl | 9 +++---- src/Loggers/LogHistograms.jl | 46 ++++-------------------------------- src/TensorBoardLogger.jl | 2 +- src/logger_dispatch.jl | 13 ++-------- 4 files changed, 13 insertions(+), 57 deletions(-) diff --git a/examples/Histograms.jl b/examples/Histograms.jl index 5f98c41..88545ce 100644 --- a/examples/Histograms.jl +++ b/examples/Histograms.jl @@ -10,9 +10,10 @@ with_logger(logger) do x0 = 0.5+i/30; s0 = 0.5/(i/20); edges = collect(-5:0.1:5) centers = collect(edges[1:end-1] .+0.05) - histvals = [exp(-((c-x0)/s0)^2) for c = centers] + histvals = s0 * randn(length(centers)) .+ x0 data_tuple = (edges, histvals) - @info "histogram/loggerinterface" autobin=rand(10).+0.1*i manualbin=data_tuple + @info "histogram/loggerinterface" autobin=s0 .* randn(100) .+ x0 + @info "histogram/loggerinterface" manualbin=data_tuple end end @@ -21,8 +22,8 @@ for i in 1:100 x0 = 0.5+i/30; s0 = 0.5/(i/20); edges = collect(-5:0.1:5) centers = collect(edges[1:end-1] .+0.05) - histvals = [exp(-((c-x0)/s0)^2) for c = centers] + histvals = s0 * randn(length(centers)) .+ x0 data_tuple = (edges, histvals) - log_histogram(logger, "histogram/explicitinterface/autobin", rand(10).+0.1*i, step = i) #automatic bins + log_histogram(logger, "histogram/explicitinterface/autobin", s0 .* randn(100) .+ x0, step = i) #automatic bins log_histogram(logger, "histogram/explicitinterface/manualbin", data_tuple, step = i) #manual bins end diff --git a/src/Loggers/LogHistograms.jl b/src/Loggers/LogHistograms.jl index add2134..8273fd8 100644 --- a/src/Loggers/LogHistograms.jl +++ b/src/Loggers/LogHistograms.jl @@ -12,7 +12,8 @@ be used to bin the data. function log_histogram(logger::TBLogger, name::AbstractString, (bins,weights)::Tuple{AbstractVector, AbstractArray}; step=nothing) weights = collect(vec(weights)) - summ = SummaryCollection(histogram_summary(name, collect(bins), weights)) + hist = fit(Histogram, weights, bins) + summ = SummaryCollection(histogram_summary(name, hist)) write_event(logger.file, make_event(logger, summ, step=step)) end @@ -24,27 +25,12 @@ Bins the values found in `data` and logs them as an histogram under the tag """ function log_histogram(logger::TBLogger, name::AbstractString, data::AbstractArray; step=nothing) - data = vec(data) - hvals = fit(Histogram, data) - summ = SummaryCollection(histogram_summary(name, collect(hvals.edges[1]), hvals.weights)) + data = collect(vec(data)) + hist = fit(Histogram, data) + summ = SummaryCollection(histogram_summary(name, hist)) write_event(logger.file, make_event(logger, summ, step=step)) end -""" - log_vector(logger, name, data::Vector; step=step(logger)) - -Logs the vector found in `data` as an histogram under the name `name`. -""" -function log_vector(logger::TBLogger, name::AbstractString, data::AbstractVector; step=nothing) - summ = SummaryCollection(histogram_summary(name, collect(0:length(data)),data)) - write_event(logger.file, make_event(logger, summ, step=step)) -end - -function histogram_summary(name::AbstractString, edges::AbstractVector{<:Number}, hist_vals::AbstractVector{<:Number}) - @assert length(edges) == length(hist_vals)+1 - return histogram_summary(name, Histogram(edges, hist_vals)) -end - function histogram_summary(name::AbstractString, hist::Histogram{T,1}) where T edges = first(hist.edges) hist_vals = hist.weights @@ -59,25 +45,3 @@ function histogram_summary(name::AbstractString, hist::Histogram{T,1}) where T hist_vals) return Summary_Value(name, name, nothing, OneOf(:histo, hp)) end - -# Writes to an Histogram summary the flattened version of the array. -# Also stores the shape of the array as a field in a plugin, which allows to -# reconstruct the original shape when read back into Julia -function histogram_arr_summary(name::AbstractString, tensor::AbstractArray) - - smpd = SummaryMetadata_PluginData(TB_PLUGIN_JLARRAY_NAME, reinterpret(UInt8, collect(size(tensor)))) - sm = SummaryMetadata(smpd, name, "", DataClass.DATA_CLASS_TENSOR) - - num = length(tensor) - edges = collect(0:num) - histsum = sum(tensor) - histsumsqr = sum(tensor.^2) - hp = HistogramProto(minimum(edges), maximum(edges), - num, - histsum, - histsumsqr, - edges[2:end], - vec(tensor)) - - return Summary_Value(name, name, sm, OneOf(:histo, hp)) -end diff --git a/src/TensorBoardLogger.jl b/src/TensorBoardLogger.jl index 758d74d..be7efc2 100644 --- a/src/TensorBoardLogger.jl +++ b/src/TensorBoardLogger.jl @@ -20,7 +20,7 @@ using Base.CoreLogging: CoreLogging, AbstractLogger, LogLevel, Info, NullLogger export TBLogger, reset!, set_step!, increment_step!, set_step_increment! -export log_histogram, log_value, log_vector, log_text, log_image, log_images, +export log_histogram, log_value, log_text, log_image, log_images, log_audio, log_audios, log_graph, log_embeddings, log_custom_scalar export map_summaries, TBReader diff --git a/src/logger_dispatch.jl b/src/logger_dispatch.jl index a6b3c77..a5fb929 100644 --- a/src/logger_dispatch.jl +++ b/src/logger_dispatch.jl @@ -79,18 +79,9 @@ summary_impl(name, value::Any) = text_summary(name, value) preprocess(name, hist::Histogram{<:Any,1}, data) = push!(data, name=>hist) summary_impl(name, hist::Histogram) = histogram_summary(name, hist) -# TODO: maybe deprecate? tuple means histogram (only if bins/weights match) -function preprocess(name, (bins,weights)::Tuple{AbstractVector,AbstractVector}, data) - # if ... this is an histogram - if length(bins) == length(weights)+1 - return preprocess(name, Histogram(bins,weights), data) - end - preprocess(name*"/1", bins, data) - preprocess(name*"/2", weights, data) -end +preprocess(name, (bins,weights)::Tuple{AbstractVector{<:Real},AbstractVector{<:Real}}, data) = return preprocess(name, fit(Histogram, weights, bins), data) -preprocess(name, val::AbstractArray{<:Real}, data) = push!(data, name=>val) -summary_impl(name, val::AbstractArray{<:Real}) = histogram_arr_summary(name, val) +preprocess(name, val::AbstractArray{<:Real}, data) = return preprocess(name, fit(Histogram, val), data) # Split complex numbers into real/complex pairs preprocess(name, val::AbstractArray{<:Complex}, data) = push!(data, name*"/re"=>real.(val), name*"/im"=>imag.(val)) From c14fa603f303d6b23a0b22d9aceb6b91e605d9d8 Mon Sep 17 00:00:00 2001 From: Lior Blech Date: Fri, 30 Jun 2023 17:27:23 +0300 Subject: [PATCH 15/66] remove redundant deserialization due to removing custom serialization --- src/Deserialization/histograms.jl | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/Deserialization/histograms.jl b/src/Deserialization/histograms.jl index 3126524..dd00b9a 100644 --- a/src/Deserialization/histograms.jl +++ b/src/Deserialization/histograms.jl @@ -1,16 +1,4 @@ function deserialize_histogram_summary(summary::Summary_Value) - # custom deserialization - if hasproperty(summary, :metadata) - histo = summary.value.value - if summary.metadata.plugin_data.plugin_name == TB_PLUGIN_JLARRAY_NAME - val = reshape(histo.bucket, - reinterpret(Int, - summary.metadata.plugin_data.content)...) - - return val - end - end - # deserialize histogramproto hist_proto = summary.value.value bin_edges = similar(hist_proto.bucket_limit, length(hist_proto.bucket_limit)+1) From 2eb1483c9873056f31ac842b46c0fe8e8194eadc Mon Sep 17 00:00:00 2001 From: Lior Blech Date: Fri, 30 Jun 2023 17:27:54 +0300 Subject: [PATCH 16/66] flatten matrices before doing histogram --- src/logger_dispatch.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/logger_dispatch.jl b/src/logger_dispatch.jl index a5fb929..6453b93 100644 --- a/src/logger_dispatch.jl +++ b/src/logger_dispatch.jl @@ -81,7 +81,7 @@ summary_impl(name, hist::Histogram) = histogram_summary(name, hist) preprocess(name, (bins,weights)::Tuple{AbstractVector{<:Real},AbstractVector{<:Real}}, data) = return preprocess(name, fit(Histogram, weights, bins), data) -preprocess(name, val::AbstractArray{<:Real}, data) = return preprocess(name, fit(Histogram, val), data) +preprocess(name, val::AbstractArray{<:Real}, data) = return preprocess(name, fit(Histogram, collect(vec(val))), data) # Split complex numbers into real/complex pairs preprocess(name, val::AbstractArray{<:Complex}, data) = push!(data, name*"/re"=>real.(val), name*"/im"=>imag.(val)) From 1f2764f47dca066ca5aef7206eaee9034986fe21 Mon Sep 17 00:00:00 2001 From: Lior Blech Date: Fri, 30 Jun 2023 17:28:16 +0300 Subject: [PATCH 17/66] update tests to reflect internal code changes --- test/runtests.jl | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test/runtests.jl b/test/runtests.jl index 686df40..bf390ad 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -5,6 +5,7 @@ using TestImages using ImageCore using FileIO using LightGraphs +using StatsBase: fit, Histogram ENV["DATADEPS_ALWAYS_ACCEPT"] = true ENV["GKSwstype"] = "100" @@ -70,20 +71,19 @@ end centers = collect(edges[1:end-1] .+0.05) histvals = [exp(-((c-x0)/s0)^2) for c=centers] data_tuple = (edges, histvals) - - ss = TensorBoardLogger.histogram_summary("test", edges, histvals) + hist = fit(Histogram, histvals, edges) + ss = TensorBoardLogger.histogram_summary("test", hist) @test isa(ss, TensorBoardLogger.Summary_Value) @test ss.tag == "test" @test isa(ss.value.value, TensorBoardLogger.HistogramProto) @test ss.value.value.min == minimum(edges) @test ss.value.value.max == maximum(edges) @test all(ss.value.value.bucket_limit .== edges[2:end]) - @test all(ss.value.value.bucket .== histvals) + @test ss.value.value.bucket == hist.weights log_histogram(logger, "hist/cust", data_tuple, step=step) log_histogram(logger, "hist/cust", rand(100), step=step) log_histogram(logger, "hist/cust", rand(10,10), step=step) - log_vector(logger, "hist/cust", rand(10), step=step) close.(values(logger.all_files)) end @@ -93,7 +93,7 @@ end vals = rand(10) @test data == preprocess("test1", vals, data) @test first(data[1]) == "test1" - @test last(data[1]) == vals + @test last(data[1]) == fit(Histogram, collect(vec(vals))) vals = rand(ComplexF32, 10) preprocess("test2", vals, data) @@ -104,7 +104,7 @@ end vals = rand(10, 10) preprocess("test2", vals, data) - @test last(data[4]) == vals + @test last(data[4]) == fit(Histogram, collect(vec(vals))) end From d5842d17802e3b8b42d295ccd31c4f14ed4b0d32 Mon Sep 17 00:00:00 2001 From: Lior Blech Date: Wed, 28 Jun 2023 18:19:51 +0300 Subject: [PATCH 18/66] add native support for Gadfly plots --- Project.toml | 5 ++++- README.md | 6 +++--- docs/src/index.md | 1 + examples/Gadfly.jl | 14 ++++++++++++++ src/Optional/Gadfly.jl | 15 +++++++++++++++ src/TensorBoardLogger.jl | 10 ++++++++++ 6 files changed, 47 insertions(+), 4 deletions(-) create mode 100644 examples/Gadfly.jl create mode 100644 src/Optional/Gadfly.jl diff --git a/Project.toml b/Project.toml index fab19bc..1b56f8d 100644 --- a/Project.toml +++ b/Project.toml @@ -20,13 +20,16 @@ StatsBase = "0.27, 0.28, 0.29, 0.30, 0.31, 0.32, 0.33, 0.34" julia = "1.6" [extras] -Minio = "4281f0d9-7ae0-406e-9172-b7277c1efa20" ImageMagick = "6218d12a-5da1-5696-b52f-db25d2ecc6d1" LightGraphs = "093fc24a-ae57-5d10-9952-331d41423f4d" Logging = "56ddb016-857b-54e1-b83d-db4d58db5568" MLDatasets = "eb30cadb-4394-5ae3-aed4-317e484a6458" +Minio = "4281f0d9-7ae0-406e-9172-b7277c1efa20" Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" PyPlot = "d330b81b-6aea-500a-939a-2ce795aea3ee" +Gadfly = "c91e804a-d5a3-530f-b6f0-dfbca275c004" +Cairo="159f3aea-2a34-519c-b102-8c37f9878175" +Fontconfig="186bb1d3-e1f7-5a2c-a377-96d770f13627" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" TestImages = "5e47fb64-e119-507b-a336-dd2b206d9990" Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" diff --git a/README.md b/README.md index 396e664..fb4b251 100644 --- a/README.md +++ b/README.md @@ -39,8 +39,8 @@ logger in Julia: You can log to TensorBoard any type. Numeric types will be logged as scalar, arrays will be binned into histograms, images and audio will be logged as such, -and we even support [Plots](https://github.com/JuliaPlots/Plots.jl) and -[PyPlot](https://github.com/JuliaPlots/Plots.jl) figures! +and we even support [Plots](https://github.com/JuliaPlots/Plots.jl), +[PyPlot](https://github.com/JuliaPlots/Plots.jl) and [Gadfly](https://github.com/GiovineItalia/Gadfly.jl) figures! For details about how types are logged by default, or how to customize this behaviour for your custom types, refer to the documentation or the examples folder. @@ -71,7 +71,7 @@ end ``` ## Integration with third party packages -We also support native logging of the types defined by a few third-party packages, such as `Plots` and `PyPlot` plots. +We also support native logging of the types defined by a few third-party packages, such as `Plots`, `PyPlot` and `Gadfly` plots. If there are other libraries that you think we should include in the list, please open an issue. ## Roadmap diff --git a/docs/src/index.md b/docs/src/index.md index 9102b45..69d6741 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -111,6 +111,7 @@ at [Reading back TensorBoard data](@ref) We also support logging custom types from a the following third-party libraries: - [Plots.jl](https://github.com/JuliaPlots/Plots.jl): the `Plots.Plot` type will be rendered to PNG at the resolution specified by the object and logged as an image - [PyPlot.jl](https://github.com/JuliaPy/PyPlot.jl): the `PyPlot.Figure` type will be rendered to PNG at the resolution specified by the object and logged as an image + - [Gadfly.jl](https://github.com/GiovineItalia/Gadfly.jl) type will be rendered to PNG at the resolution specified by the object and logged as an image. `Cairo` and `Fontconfig` packages must be imported for this functionality to work as it is required by `Gadfly`. - [Tracker.jl](https://github.com/FluxML/Tracker.jl): the `TrackedReal` and `TrackedArray` types will be logged as vector data - [ValueHistories.jl](https://github.com/JuliaML/ValueHistories.jl): the `MVHistory` type is used to store the deserialized content of .proto files. diff --git a/examples/Gadfly.jl b/examples/Gadfly.jl new file mode 100644 index 0000000..aff9608 --- /dev/null +++ b/examples/Gadfly.jl @@ -0,0 +1,14 @@ +using TensorBoardLogger #import the TensorBoardLogger package +using Logging #import Logging package +using Gadfly, Cairo, Fontconfig + +logger = TBLogger("Gadflylogs", tb_append) #create tensorboard logger + +################log scalars example: y = x²################ +#using logger interface +x = rand(100) +y = rand(100) +p = plot(x=x, y=y, Geom.point); +with_logger(logger) do + @info "gadfly" plot=p +end \ No newline at end of file diff --git a/src/Optional/Gadfly.jl b/src/Optional/Gadfly.jl new file mode 100644 index 0000000..d40423d --- /dev/null +++ b/src/Optional/Gadfly.jl @@ -0,0 +1,15 @@ +import .Gadfly: Plot, render, draw +function Base.convert(t::Type{PngImage}, plot::Gadfly.Plot) + pb = PipeBuffer(); + show(pb, MIME("image/png"), render(plot)); + # draw(Gadfly.PNG(pb), plot); # leaving here for now, does same thing + return PngImage(pb) +end + +preprocess(name, plot::Gadfly.Plot, data) = preprocess(name, convert(PngImage, plot), data) +preprocess(name, plots::AbstractArray{<:Gadfly.Plot}, data) = begin + for (i, plot)=enumerate(plots) + preprocess(name*"/$i", plot, data) + end + return data +end \ No newline at end of file diff --git a/src/TensorBoardLogger.jl b/src/TensorBoardLogger.jl index 758d74d..fa1091f 100644 --- a/src/TensorBoardLogger.jl +++ b/src/TensorBoardLogger.jl @@ -102,6 +102,16 @@ function __init__() @require PyPlot="d330b81b-6aea-500a-939a-2ce795aea3ee" begin include("Optional/PyPlot.jl") end + @require Gadfly="c91e804a-d5a3-530f-b6f0-dfbca275c004" begin + @require Fontconfig="186bb1d3-e1f7-5a2c-a377-96d770f13627" begin + @require Cairo="159f3aea-2a34-519c-b102-8c37f9878175" begin + using .Cairo + using .Fontconfig + include("Optional/Gadfly.jl") + end + end + end + # @require Gadfly="c91e804a-d5a3-530f-b6f0-dfbca275c004" include("Optional/Gadfly.jl") @require Tracker="9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" begin include("Optional/Tracker.jl") end From 2d554c4333c80fbb451d90d066999392c7e6fa30 Mon Sep 17 00:00:00 2001 From: Lior Blech Date: Wed, 5 Jul 2023 17:45:09 +0300 Subject: [PATCH 19/66] add helper function, docs and example code --- examples/Scalars.jl | 25 ++++++++++++++++++++ src/TBLogger.jl | 50 ++++++++++++++++++++++++++++++++++++++++ src/TensorBoardLogger.jl | 2 +- 3 files changed, 76 insertions(+), 1 deletion(-) diff --git a/examples/Scalars.jl b/examples/Scalars.jl index 36461c4..e44a3f3 100644 --- a/examples/Scalars.jl +++ b/examples/Scalars.jl @@ -23,3 +23,28 @@ with_logger(logger) do @info "scalar/complex" y = z end end + + +################control step increments with context################ +with_logger(logger) do + for epoch in 1:10 + for i=1:100 + # increments global_step by default + with_TBLogger_hold_step() do + # all of these are logged at the same global_step + # and the logger global_step is only then increased + @info "train1/scalar" val=i + @info "train2/scalar" val2=i/2 + @info "train3/scalar" val3=100-i + end + end + # step increment at end can be disabled for easy train/test sync + with_TBLogger_hold_step(;step_at_end=false) do + # all of these are logged at the same global_step + # and the logger global_step is only then increased + @info "test1/scalar" epoch=epoch + @info "test2/scalar" epoch2=epoch^2 + @info "test3/scalar" epoch3=epoch^3 + end + end +end diff --git a/src/TBLogger.jl b/src/TBLogger.jl index d998160..49148de 100644 --- a/src/TBLogger.jl +++ b/src/TBLogger.jl @@ -298,3 +298,53 @@ Base.show(io::IO, mime::MIME"text/plain", tbl::TBLogger) = begin """ Base.print(io, str) end + +""" +`with_TBLogger_hold_step(f, [step]; step_at_end::Bool=true)` +Context function to ease control of logging steps and synchronization. +Amount of step increment can be controlled via `set_step_increment!``. + +Example: +```julia +with_logger(lg) do + for epoch in 1:10 + for i=1:100 + # increments global_step by default + with_TBLogger_hold_step() do + # all of these are logged at the same global_step + # and the logger global_step is only then increased + @info "train1/scalar" i=i + @info "train2/scalar" i2=i^2 + @info "train3/scalar" i3=i^3 + end + end + # step increment at end can be disabled for easy train/test sync + with_TBLogger_hold_step(;step_at_end=false) do + # all of these are logged at the same global_step + # and the logger global_step is only then increased + @info "test1/scalar" i=i + @info "test2/scalar" i2=i^2 + @info "test3/scalar" i3=i^3 + end + end +end +``` + +""" +function with_TBLogger_hold_step(f, step::Int; step_at_end::Bool=true) + logger = CoreLogging.current_logger() + @assert logger isa TBLogger "with_TBLogger_hold_step: current logger is not a TBLogger, cannot establish current step automatically" + curr_step = logger.global_step + curr_increment = logger.step_increment + set_step!(logger, step) + set_step_increment!(logger, 0) + f() + set_step!(logger, curr_step) + set_step_increment!(logger, curr_increment) + step_at_end && increment_step!(logger, curr_increment) +end +function with_TBLogger_hold_step(f; step_at_end::Bool=true) + logger = CoreLogging.current_logger() + @assert logger isa TBLogger "with_TBLogger_hold_step: current logger is not a TBLogger, cannot establish current step automatically" + with_TBLogger_hold_step(f, logger.global_step; step_at_end=step_at_end) +end \ No newline at end of file diff --git a/src/TensorBoardLogger.jl b/src/TensorBoardLogger.jl index 758d74d..0a1dd5d 100644 --- a/src/TensorBoardLogger.jl +++ b/src/TensorBoardLogger.jl @@ -19,7 +19,7 @@ using Base.CoreLogging: CoreLogging, AbstractLogger, LogLevel, Info, handle_message, shouldlog, min_enabled_level, catch_exceptions, with_logger, NullLogger -export TBLogger, reset!, set_step!, increment_step!, set_step_increment! +export TBLogger, reset!, set_step!, increment_step!, set_step_increment!, with_TBLogger_hold_step export log_histogram, log_value, log_vector, log_text, log_image, log_images, log_audio, log_audios, log_graph, log_embeddings, log_custom_scalar export map_summaries, TBReader From 65badd35e97783acb8ed0d15a9826b0d76398e57 Mon Sep 17 00:00:00 2001 From: Lior Blech Date: Thu, 6 Jul 2023 10:34:19 +0300 Subject: [PATCH 20/66] Update src/TBLogger.jl assertions may be removed depending how optiions are set Co-authored-by: Frames White --- src/TBLogger.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/TBLogger.jl b/src/TBLogger.jl index 49148de..dc80994 100644 --- a/src/TBLogger.jl +++ b/src/TBLogger.jl @@ -345,6 +345,6 @@ function with_TBLogger_hold_step(f, step::Int; step_at_end::Bool=true) end function with_TBLogger_hold_step(f; step_at_end::Bool=true) logger = CoreLogging.current_logger() - @assert logger isa TBLogger "with_TBLogger_hold_step: current logger is not a TBLogger, cannot establish current step automatically" + isa(logger, TBLogger) || error("with_TBLogger_hold_step: current logger is not a TBLogger, cannot establish current step automatically") with_TBLogger_hold_step(f, logger.global_step; step_at_end=step_at_end) end \ No newline at end of file From 37ed708bd91933fa5fd2dd062e002b19125e9f11 Mon Sep 17 00:00:00 2001 From: Lior Blech Date: Wed, 5 Jul 2023 17:45:09 +0300 Subject: [PATCH 21/66] add helper function, docs and example code --- examples/Scalars.jl | 25 ++++++++++++++++++++ src/TBLogger.jl | 50 ++++++++++++++++++++++++++++++++++++++++ src/TensorBoardLogger.jl | 2 +- 3 files changed, 76 insertions(+), 1 deletion(-) diff --git a/examples/Scalars.jl b/examples/Scalars.jl index 36461c4..e44a3f3 100644 --- a/examples/Scalars.jl +++ b/examples/Scalars.jl @@ -23,3 +23,28 @@ with_logger(logger) do @info "scalar/complex" y = z end end + + +################control step increments with context################ +with_logger(logger) do + for epoch in 1:10 + for i=1:100 + # increments global_step by default + with_TBLogger_hold_step() do + # all of these are logged at the same global_step + # and the logger global_step is only then increased + @info "train1/scalar" val=i + @info "train2/scalar" val2=i/2 + @info "train3/scalar" val3=100-i + end + end + # step increment at end can be disabled for easy train/test sync + with_TBLogger_hold_step(;step_at_end=false) do + # all of these are logged at the same global_step + # and the logger global_step is only then increased + @info "test1/scalar" epoch=epoch + @info "test2/scalar" epoch2=epoch^2 + @info "test3/scalar" epoch3=epoch^3 + end + end +end diff --git a/src/TBLogger.jl b/src/TBLogger.jl index d998160..49148de 100644 --- a/src/TBLogger.jl +++ b/src/TBLogger.jl @@ -298,3 +298,53 @@ Base.show(io::IO, mime::MIME"text/plain", tbl::TBLogger) = begin """ Base.print(io, str) end + +""" +`with_TBLogger_hold_step(f, [step]; step_at_end::Bool=true)` +Context function to ease control of logging steps and synchronization. +Amount of step increment can be controlled via `set_step_increment!``. + +Example: +```julia +with_logger(lg) do + for epoch in 1:10 + for i=1:100 + # increments global_step by default + with_TBLogger_hold_step() do + # all of these are logged at the same global_step + # and the logger global_step is only then increased + @info "train1/scalar" i=i + @info "train2/scalar" i2=i^2 + @info "train3/scalar" i3=i^3 + end + end + # step increment at end can be disabled for easy train/test sync + with_TBLogger_hold_step(;step_at_end=false) do + # all of these are logged at the same global_step + # and the logger global_step is only then increased + @info "test1/scalar" i=i + @info "test2/scalar" i2=i^2 + @info "test3/scalar" i3=i^3 + end + end +end +``` + +""" +function with_TBLogger_hold_step(f, step::Int; step_at_end::Bool=true) + logger = CoreLogging.current_logger() + @assert logger isa TBLogger "with_TBLogger_hold_step: current logger is not a TBLogger, cannot establish current step automatically" + curr_step = logger.global_step + curr_increment = logger.step_increment + set_step!(logger, step) + set_step_increment!(logger, 0) + f() + set_step!(logger, curr_step) + set_step_increment!(logger, curr_increment) + step_at_end && increment_step!(logger, curr_increment) +end +function with_TBLogger_hold_step(f; step_at_end::Bool=true) + logger = CoreLogging.current_logger() + @assert logger isa TBLogger "with_TBLogger_hold_step: current logger is not a TBLogger, cannot establish current step automatically" + with_TBLogger_hold_step(f, logger.global_step; step_at_end=step_at_end) +end \ No newline at end of file diff --git a/src/TensorBoardLogger.jl b/src/TensorBoardLogger.jl index fa1091f..46da229 100644 --- a/src/TensorBoardLogger.jl +++ b/src/TensorBoardLogger.jl @@ -19,7 +19,7 @@ using Base.CoreLogging: CoreLogging, AbstractLogger, LogLevel, Info, handle_message, shouldlog, min_enabled_level, catch_exceptions, with_logger, NullLogger -export TBLogger, reset!, set_step!, increment_step!, set_step_increment! +export TBLogger, reset!, set_step!, increment_step!, set_step_increment!, with_TBLogger_hold_step export log_histogram, log_value, log_vector, log_text, log_image, log_images, log_audio, log_audios, log_graph, log_embeddings, log_custom_scalar export map_summaries, TBReader From 3f45cbd944908ac2ef01411340758d6167c5b00b Mon Sep 17 00:00:00 2001 From: Lior Blech Date: Thu, 6 Jul 2023 10:34:19 +0300 Subject: [PATCH 22/66] Update src/TBLogger.jl assertions may be removed depending how optiions are set Co-authored-by: Frames White --- src/TBLogger.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/TBLogger.jl b/src/TBLogger.jl index 49148de..dc80994 100644 --- a/src/TBLogger.jl +++ b/src/TBLogger.jl @@ -345,6 +345,6 @@ function with_TBLogger_hold_step(f, step::Int; step_at_end::Bool=true) end function with_TBLogger_hold_step(f; step_at_end::Bool=true) logger = CoreLogging.current_logger() - @assert logger isa TBLogger "with_TBLogger_hold_step: current logger is not a TBLogger, cannot establish current step automatically" + isa(logger, TBLogger) || error("with_TBLogger_hold_step: current logger is not a TBLogger, cannot establish current step automatically") with_TBLogger_hold_step(f, logger.global_step; step_at_end=step_at_end) end \ No newline at end of file From 59fce6039e5ffddb17bb11dee6e79dcf340436da Mon Sep 17 00:00:00 2001 From: Jamie Mair Date: Fri, 14 Jul 2023 07:27:50 +0100 Subject: [PATCH 23/66] Update docstring of `TBLogger` to describe the `tb_append` option --- src/TBLogger.jl | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/TBLogger.jl b/src/TBLogger.jl index dc80994..d27fc7f 100644 --- a/src/TBLogger.jl +++ b/src/TBLogger.jl @@ -38,7 +38,8 @@ export tb_append, tb_overwrite, tb_increment Creates a TensorBoardLogger in the folder `logdir`. The second (optional) argument specifies the behaviour if the `logdir` already exhists: the default choice `tb_increment` appends an increasing number 1,2... to `logdir`. Other -choices are `tb_overwrite`, which overwrites the previous folder, and `tb_append`. +choices are `tb_overwrite`, which overwrites the previous folder, and `tb_append`, +which adds to any existing logs. Optional keyword argument `prefix` can be passed to prepend a path to the file name (note, not the log directory). See `create_eventfile()` @@ -347,4 +348,4 @@ function with_TBLogger_hold_step(f; step_at_end::Bool=true) logger = CoreLogging.current_logger() isa(logger, TBLogger) || error("with_TBLogger_hold_step: current logger is not a TBLogger, cannot establish current step automatically") with_TBLogger_hold_step(f, logger.global_step; step_at_end=step_at_end) -end \ No newline at end of file +end From 551581ca5a091aabf5c7661dc8fc927011c3f505 Mon Sep 17 00:00:00 2001 From: Jamie Mair Date: Tue, 11 Jul 2023 19:48:14 +0100 Subject: [PATCH 24/66] Started working on adding an API to use the hparams plugin Signed-off-by: Jamie Mair --- src/TensorBoardLogger.jl | 1 + src/hparams.jl | 53 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 src/hparams.jl diff --git a/src/TensorBoardLogger.jl b/src/TensorBoardLogger.jl index 46da229..3039e86 100644 --- a/src/TensorBoardLogger.jl +++ b/src/TensorBoardLogger.jl @@ -51,6 +51,7 @@ include("protojl/tensorboard/plugins/text/tensorboard/tensorboard.jl") using .tensorboard_plugin_text: TextPluginData include("protojl/tensorboard/plugins/hparams/tensorboard/tensorboard.jl") using .tensorboard_plugin_hparams +include("hparams.jl") include("protojl/tensorboard/plugins/custom_scalar/tensorboard/tensorboard.jl") using .tensorboard_plugin_custom_scalar diff --git a/src/hparams.jl b/src/hparams.jl new file mode 100644 index 0000000..8c4ddb0 --- /dev/null +++ b/src/hparams.jl @@ -0,0 +1,53 @@ +import .tensorboard_plugin_hparams.hparams: Interval, MetricInfo, MetricName, HParamInfo +import .tensorboard_plugin_hparams.hparams: var"#DataType" as HParamDataType +import .tensorboard_plugin_hparams.google.protobuf: ListValue as HListValue, OneOf as HOneOf, Value as HValue +struct HParamRealDomain + min_value::Float64 + max_value::Float64 +end +struct HParamSetDomain{T<:Union{String, Bool, Float64}} + values::Vector{T} +end + +default_domain(::Val{Bool}) = HParamSetDomain([true, false]) +default_domain(::Val{Float64}) = HParamRealDomain(typemin(Float64), typemax(Float64)) +default_domain(::Val{String}) = nothing + +_to_proto_hparam_dtype(::Val{Bool}) = HParamDataType.DATA_TYPE_BOOL +_to_proto_hparam_dtype(::Val{String}) = HParamDataType.DATA_TYPE_STRING +_to_proto_hparam_dtype(::Val{Float64}) = HParamDataType.DATA_TYPE_FLOAT64 + +function _convert_value(v::T) where {T<:Union{String, Bool, Float64}} + if T == String + return HValue(HOneOf(:string_value, v)) + elseif T == Bool + return HValue(HOneOf(:bool_value, v)) + elseif T == Float64 + return HValue(HOneOf(:number_value, v)) + end +end + +_convert_hparam_domain(::Nothing) = nothing +_convert_hparam_domain(domain::HParamRealDomain) = HOneOf(:domain_interval, Interval(domain.min_value, domain.max_value)) +_convert_hparam_domain(domain::HParamSetDomain) = HOneOf(:domain_discrete, HListValue([_convert_value(v) for v in domain.values])) + + +function hparam_info(name, datatype; displayname="", description="", domain=nothing) + if isnothing(domain) + domain = default_domain(Val(datatype)) + else + if isa(domain, HParamRealDomain) + @assert datatype==Float64 "Real domains require Float64" + elseif isa(domain, HParamSetDomain{String}) + @assert datatype==String "Domains with strings require a datatype of String" + elseif isa(domain, HParamSetDomain{Bool}) + @assert datatype==Bool "Domains with bools require a datatype of Bool" + elseif isa(domain, HParamSetDomain{Float64}) + @assert datatype==Float64 "Domains with floats require a datatype of Float64" + end + end + + dtype = _to_proto_hparam_dtype(Val(datatype)) + converted_domain = _convert_hparam_domain(domain) + return HParamInfo(name, displayname, description, dtype, converted_domain) +end \ No newline at end of file From e4efbf85a5b144574e4e2d6ebade852b3eba1b52 Mon Sep 17 00:00:00 2001 From: Jamie Mair Date: Wed, 12 Jul 2023 11:35:06 +0100 Subject: [PATCH 25/66] Added vscode settings folder to gitignore Signed-off-by: Jamie Mair --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index c8b4677..68f0601 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,5 @@ docs/Manifest.toml gen/proto gen/protojl + +.vscode/ \ No newline at end of file From 49e179777b73e806f6244dfe2b382530276ab0e7 Mon Sep 17 00:00:00 2001 From: Jamie Mair Date: Wed, 12 Jul 2023 11:29:06 +0000 Subject: [PATCH 26/66] First draft attempt at adding hyperparameter support Signed-off-by: Jamie Mair --- src/hparams.jl | 73 +++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 67 insertions(+), 6 deletions(-) diff --git a/src/hparams.jl b/src/hparams.jl index 8c4ddb0..ad32b41 100644 --- a/src/hparams.jl +++ b/src/hparams.jl @@ -1,4 +1,4 @@ -import .tensorboard_plugin_hparams.hparams: Interval, MetricInfo, MetricName, HParamInfo +import .tensorboard_plugin_hparams.hparams: Interval, MetricInfo, MetricName, HParamInfo, Experiment, HParams import .tensorboard_plugin_hparams.hparams: var"#DataType" as HParamDataType import .tensorboard_plugin_hparams.google.protobuf: ListValue as HListValue, OneOf as HOneOf, Value as HValue struct HParamRealDomain @@ -8,6 +8,19 @@ end struct HParamSetDomain{T<:Union{String, Bool, Float64}} values::Vector{T} end +Base.@kwdef struct HParamConfig + name::String + datatype::DataType + displayname::String = "" + description::String = "" + domain::Union{Nothing, HParamRealDomain, HParamSetDomain} +end +Base.@kwdef struct MetricConfig + name::String + datatype::DataType + displayname::String = "" + description::String = "" +end default_domain(::Val{Bool}) = HParamSetDomain([true, false]) default_domain(::Val{Float64}) = HParamRealDomain(typemin(Float64), typemax(Float64)) @@ -32,9 +45,10 @@ _convert_hparam_domain(domain::HParamRealDomain) = HOneOf(:domain_interval, Inte _convert_hparam_domain(domain::HParamSetDomain) = HOneOf(:domain_discrete, HListValue([_convert_value(v) for v in domain.values])) -function hparam_info(name, datatype; displayname="", description="", domain=nothing) - if isnothing(domain) +function hparam_info(c::HParamConfig) + domain = if isnothing(c.domain) domain = default_domain(Val(datatype)) + domain else if isa(domain, HParamRealDomain) @assert datatype==Float64 "Real domains require Float64" @@ -45,9 +59,56 @@ function hparam_info(name, datatype; displayname="", description="", domain=noth elseif isa(domain, HParamSetDomain{Float64}) @assert datatype==Float64 "Domains with floats require a datatype of Float64" end + + c.domain end - dtype = _to_proto_hparam_dtype(Val(datatype)) + dtype = _to_proto_hparam_dtype(Val(c.datatype)) converted_domain = _convert_hparam_domain(domain) - return HParamInfo(name, displayname, description, dtype, converted_domain) -end \ No newline at end of file + return HParamInfo(c.name, c.displayname, c.description, dtype, converted_domain) +end +function decode_metric_name(name) + if contains(name, '/') + return (split(name, '/', limit=2)...) + else + return ("", name) + end +end +function metric_info(c::MetricConfig) + dtype = _to_proto_hparam_dtype(Val(c.datatype)) + + group, tag = decode_metric_name(c.name) + mname = MetricName(group, tag) + return MetricInfo(mname, c.displayname, c.description, dtype) +end + +function init_hparams!(logger::TBLogger, param_configs::AbstractArray{HParamConfig}, metric_configs::AbstractArray{MetricConfig}; name="", description="", user="") + # Convert to proto types + hparam_infos = hparam_info.(param_configs) + metric_infos = metric_configs.(metric_configs) + # Create the proto experiment type to serialise + experiment = Experiment(name, description, user, zero(Float64), hparam_infos, metric_infos) + + # Write this event to a separate file + filename = add_eventfile(logger, "hparams_config") + eventfile = logger.all_files[filename] + write_event(eventfile, experiment) + nothing +end + +function write_hparams!(logger::TBLogger, hparams::Dict{String, Any}) + # Check the input types + for v in values(hparams) + @assert typeof(v) <: Union{Bool, String, Float64} "Hyperparameters must be of types String, Bool or Float64" + end + # Convert to protobuf types + hparams = HParams(Dict{String, HValue}(k=>_convert_value(v) for (k,v) in hparams)) + + # Write the configuration to a new event file + filename = add_eventfile(logger, "hparams") + eventfile = logger.all_files[filename] + write_event(eventfile, hparams) + nothing +end + +export init_hparams!, write_hparams!, HParamRealDomain, HParamSetDomain, HParamConfig, MetricConfig \ No newline at end of file From 4cc8112b23e1be1357102f93df39fc69f9d19d2a Mon Sep 17 00:00:00 2001 From: Jamie Mair Date: Wed, 12 Jul 2023 14:31:22 +0000 Subject: [PATCH 27/66] First pass at implementing hparams with unit tests for initialisation Signed-off-by: Jamie Mair --- src/TensorBoardLogger.jl | 2 +- src/hparams.jl | 58 +++++++++++++++++++++++++--------------- test/runtests.jl | 4 +++ test/test_hparams.jl | 27 +++++++++++++++++++ 4 files changed, 69 insertions(+), 22 deletions(-) create mode 100644 test/test_hparams.jl diff --git a/src/TensorBoardLogger.jl b/src/TensorBoardLogger.jl index 3039e86..dd0f29c 100644 --- a/src/TensorBoardLogger.jl +++ b/src/TensorBoardLogger.jl @@ -51,7 +51,6 @@ include("protojl/tensorboard/plugins/text/tensorboard/tensorboard.jl") using .tensorboard_plugin_text: TextPluginData include("protojl/tensorboard/plugins/hparams/tensorboard/tensorboard.jl") using .tensorboard_plugin_hparams -include("hparams.jl") include("protojl/tensorboard/plugins/custom_scalar/tensorboard/tensorboard.jl") using .tensorboard_plugin_custom_scalar @@ -63,6 +62,7 @@ include("ImageFormat.jl") const TB_PLUGIN_JLARRAY_NAME = "_jl_tbl_array_sz" include("TBLogger.jl") +include("hparams.jl") include("utils.jl") # CRC Utils include("event.jl") include("Loggers/base.jl") diff --git a/src/hparams.jl b/src/hparams.jl index ad32b41..71fd5a5 100644 --- a/src/hparams.jl +++ b/src/hparams.jl @@ -1,5 +1,5 @@ import .tensorboard_plugin_hparams.hparams: Interval, MetricInfo, MetricName, HParamInfo, Experiment, HParams -import .tensorboard_plugin_hparams.hparams: var"#DataType" as HParamDataType +import .tensorboard_plugin_hparams.hparams: var"#DataType" as HParamDataType, DatasetType as HDatasetType import .tensorboard_plugin_hparams.google.protobuf: ListValue as HListValue, OneOf as HOneOf, Value as HValue struct HParamRealDomain min_value::Float64 @@ -13,11 +13,10 @@ Base.@kwdef struct HParamConfig datatype::DataType displayname::String = "" description::String = "" - domain::Union{Nothing, HParamRealDomain, HParamSetDomain} + domain::Union{Nothing, HParamRealDomain, HParamSetDomain} = nothing end Base.@kwdef struct MetricConfig name::String - datatype::DataType displayname::String = "" description::String = "" end @@ -46,9 +45,10 @@ _convert_hparam_domain(domain::HParamSetDomain) = HOneOf(:domain_discrete, HList function hparam_info(c::HParamConfig) - domain = if isnothing(c.domain) + datatype = c.datatype + domain = c.domain + if isnothing(c.domain) domain = default_domain(Val(datatype)) - domain else if isa(domain, HParamRealDomain) @assert datatype==Float64 "Real domains require Float64" @@ -59,40 +59,37 @@ function hparam_info(c::HParamConfig) elseif isa(domain, HParamSetDomain{Float64}) @assert datatype==Float64 "Domains with floats require a datatype of Float64" end - - c.domain end - dtype = _to_proto_hparam_dtype(Val(c.datatype)) + dtype = _to_proto_hparam_dtype(Val(datatype)) converted_domain = _convert_hparam_domain(domain) return HParamInfo(c.name, c.displayname, c.description, dtype, converted_domain) end function decode_metric_name(name) if contains(name, '/') - return (split(name, '/', limit=2)...) + return (split(name, '/', limit=2)...,) else return ("", name) end end -function metric_info(c::MetricConfig) - dtype = _to_proto_hparam_dtype(Val(c.datatype)) - +function metric_info(c::MetricConfig) group, tag = decode_metric_name(c.name) mname = MetricName(group, tag) - return MetricInfo(mname, c.displayname, c.description, dtype) + return MetricInfo(mname, c.displayname, c.description, HDatasetType.DATASET_UNKNOWN) end function init_hparams!(logger::TBLogger, param_configs::AbstractArray{HParamConfig}, metric_configs::AbstractArray{MetricConfig}; name="", description="", user="") # Convert to proto types hparam_infos = hparam_info.(param_configs) - metric_infos = metric_configs.(metric_configs) + metric_infos = metric_info.(metric_configs) # Create the proto experiment type to serialise experiment = Experiment(name, description, user, zero(Float64), hparam_infos, metric_infos) - # Write this event to a separate file - filename = add_eventfile(logger, "hparams_config") - eventfile = logger.all_files[filename] - write_event(eventfile, experiment) + # # Write this event to a separate file + # filename = add_eventfile(logger, "hparams_config") + # eventfile = logger.all_files[filename] + # Write to existing file + write_generic_event(logger.file, experiment) nothing end @@ -105,10 +102,29 @@ function write_hparams!(logger::TBLogger, hparams::Dict{String, Any}) hparams = HParams(Dict{String, HValue}(k=>_convert_value(v) for (k,v) in hparams)) # Write the configuration to a new event file - filename = add_eventfile(logger, "hparams") - eventfile = logger.all_files[filename] - write_event(eventfile, hparams) + # filename = add_eventfile(logger, "hparams") + # eventfile = logger.all_files[filename] + # Write to existing file + write_generic_event(logger.file, hparams) nothing end +function write_generic_event(out::IO, event) + data = PipeBuffer(); + encode(ProtoEncoder(data), event) + + #header + header = collect(reinterpret(UInt8, [data.size])) + crc_header = reinterpret(UInt8, UInt32[masked_crc32c(header)]) + crc_data = reinterpret(UInt8, UInt32[masked_crc32c(data.data)]) + + write(out, header) + write(out, crc_header) + write(out, data.data) + write(out, crc_data) + flush(out) +end + +write_generic_event(logger::TBLogger, event) = write_generic_event(logger.file, event) + export init_hparams!, write_hparams!, HParamRealDomain, HParamSetDomain, HParamConfig, MetricConfig \ No newline at end of file diff --git a/test/runtests.jl b/test/runtests.jl index 686df40..f674e37 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -201,6 +201,10 @@ end close.(values(logger.all_files)) end + @testset "Hyperparameter logging" begin + include("test_hparams.jl") + end + @testset "Image processing interface" begin #2-d image data = Vector{Pair{String,Any}}() diff --git a/test/test_hparams.jl b/test/test_hparams.jl new file mode 100644 index 0000000..8e63c98 --- /dev/null +++ b/test/test_hparams.jl @@ -0,0 +1,27 @@ +using TensorBoardLogger, Logging +using TensorBoardLogger: preprocess, summary_impl +using Test + +test_hparams_log_dir = "test_hparams_logs/" + +@testset "Initialialise Hparams (default domains, no metrics)" begin + isdir(test_hparams_log_dir) && rm(test_hparams_log_dir, force=true, recursive=true) + + # Create a new logger + logger = TBLogger(test_hparams_log_dir*"hparams") + + alpha_config = HParamConfig(; name="alpha", datatype=Float64) + beta_config = HParamConfig(; name="beta", datatype=String) + gamma_config = HParamConfig(; name="gamma", datatype=Bool) + + hparams_config = [alpha_config, beta_config, gamma_config] + metric_config = [MetricConfig(; name="loss")] + + @test typeof(init_hparams!(logger, hparams_config, metric_config)) === Nothing + + # Check that the init didn't create a new file + @test length(logger.all_files) == 1 + + # close all event files + close.(values(logger.all_files)) +end \ No newline at end of file From 6a2269b4712f25f542cdb8840d03fe745f53f925 Mon Sep 17 00:00:00 2001 From: Jamie Mair Date: Wed, 12 Jul 2023 17:48:41 +0000 Subject: [PATCH 28/66] Pkg sorted the project file Signed-off-by: Jamie Mair --- Project.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Project.toml b/Project.toml index 1b56f8d..28ee51e 100644 --- a/Project.toml +++ b/Project.toml @@ -20,6 +20,9 @@ StatsBase = "0.27, 0.28, 0.29, 0.30, 0.31, 0.32, 0.33, 0.34" julia = "1.6" [extras] +Cairo = "159f3aea-2a34-519c-b102-8c37f9878175" +Fontconfig = "186bb1d3-e1f7-5a2c-a377-96d770f13627" +Gadfly = "c91e804a-d5a3-530f-b6f0-dfbca275c004" ImageMagick = "6218d12a-5da1-5696-b52f-db25d2ecc6d1" LightGraphs = "093fc24a-ae57-5d10-9952-331d41423f4d" Logging = "56ddb016-857b-54e1-b83d-db4d58db5568" @@ -27,9 +30,6 @@ MLDatasets = "eb30cadb-4394-5ae3-aed4-317e484a6458" Minio = "4281f0d9-7ae0-406e-9172-b7277c1efa20" Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" PyPlot = "d330b81b-6aea-500a-939a-2ce795aea3ee" -Gadfly = "c91e804a-d5a3-530f-b6f0-dfbca275c004" -Cairo="159f3aea-2a34-519c-b102-8c37f9878175" -Fontconfig="186bb1d3-e1f7-5a2c-a377-96d770f13627" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" TestImages = "5e47fb64-e119-507b-a336-dd2b206d9990" Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" From 099c947c25f69f4b0ebfedcd9aa3824866e9db73 Mon Sep 17 00:00:00 2001 From: Jamie Mair Date: Wed, 12 Jul 2023 17:49:13 +0000 Subject: [PATCH 29/66] Almost fixed hyperparameters Signed-off-by: Jamie Mair --- src/hparams.jl | 104 +++++++++++++++++++++++-------------------- test/test_hparams.jl | 39 +++++++++------- 2 files changed, 80 insertions(+), 63 deletions(-) diff --git a/src/hparams.jl b/src/hparams.jl index 71fd5a5..6086982 100644 --- a/src/hparams.jl +++ b/src/hparams.jl @@ -1,6 +1,9 @@ import .tensorboard_plugin_hparams.hparams: Interval, MetricInfo, MetricName, HParamInfo, Experiment, HParams import .tensorboard_plugin_hparams.hparams: var"#DataType" as HParamDataType, DatasetType as HDatasetType import .tensorboard_plugin_hparams.google.protobuf: ListValue as HListValue, OneOf as HOneOf, Value as HValue +import .tensorboard_plugin_hparams.hparams as HP +import .tensorboard: DataClass + struct HParamRealDomain min_value::Float64 max_value::Float64 @@ -21,8 +24,10 @@ Base.@kwdef struct MetricConfig description::String = "" end -default_domain(::Val{Bool}) = HParamSetDomain([true, false]) -default_domain(::Val{Float64}) = HParamRealDomain(typemin(Float64), typemax(Float64)) +# default_domain(::Val{Bool}) = HParamSetDomain([false, true]) +# default_domain(::Val{Float64}) = HParamRealDomain(typemin(Float64), typemax(Float64)) +default_domain(::Val{Bool}) = nothing +default_domain(::Val{Float64}) = nothing default_domain(::Val{String}) = nothing _to_proto_hparam_dtype(::Val{Bool}) = HParamDataType.DATA_TYPE_BOOL @@ -30,12 +35,14 @@ _to_proto_hparam_dtype(::Val{String}) = HParamDataType.DATA_TYPE_STRING _to_proto_hparam_dtype(::Val{Float64}) = HParamDataType.DATA_TYPE_FLOAT64 function _convert_value(v::T) where {T<:Union{String, Bool, Float64}} - if T == String + if v isa String return HValue(HOneOf(:string_value, v)) - elseif T == Bool + elseif v isa Bool return HValue(HOneOf(:bool_value, v)) - elseif T == Float64 + elseif v isa Float64 return HValue(HOneOf(:number_value, v)) + else + error("Unrecognised type!") end end @@ -73,58 +80,59 @@ function decode_metric_name(name) end end function metric_info(c::MetricConfig) - group, tag = decode_metric_name(c.name) - mname = MetricName(group, tag) + # group, tag = decode_metric_name(c.name) + mname = MetricName("", c.name) return MetricInfo(mname, c.displayname, c.description, HDatasetType.DATASET_UNKNOWN) end -function init_hparams!(logger::TBLogger, param_configs::AbstractArray{HParamConfig}, metric_configs::AbstractArray{MetricConfig}; name="", description="", user="") - # Convert to proto types - hparam_infos = hparam_info.(param_configs) - metric_infos = metric_info.(metric_configs) - # Create the proto experiment type to serialise - experiment = Experiment(name, description, user, zero(Float64), hparam_infos, metric_infos) - - # # Write this event to a separate file - # filename = add_eventfile(logger, "hparams_config") - # eventfile = logger.all_files[filename] - # Write to existing file - write_generic_event(logger.file, experiment) - nothing +function encode_bytes(content::HP.HParamsPluginData) + data = PipeBuffer(); + encode(ProtoEncoder(data), content) + return take!(data) end -function write_hparams!(logger::TBLogger, hparams::Dict{String, Any}) - # Check the input types +function write_hparams!(logger::TBLogger, hparams::Dict{String, Any}, metrics::AbstractArray{String}) + PLUGIN_NAME = "hparams" + PLUGIN_DATA_VERSION = 0 + + EXPERIMENT_TAG = "_hparams_/experiment" + SESSION_START_INFO_TAG = "_hparams_/session_start_info" + SESSION_END_INFO_TAG = "_hparams_/session_end_info" + + # Check for datatypes for v in values(hparams) @assert typeof(v) <: Union{Bool, String, Float64} "Hyperparameters must be of types String, Bool or Float64" end - # Convert to protobuf types - hparams = HParams(Dict{String, HValue}(k=>_convert_value(v) for (k,v) in hparams)) - - # Write the configuration to a new event file - # filename = add_eventfile(logger, "hparams") - # eventfile = logger.all_files[filename] - # Write to existing file - write_generic_event(logger.file, hparams) - nothing -end -function write_generic_event(out::IO, event) - data = PipeBuffer(); - encode(ProtoEncoder(data), event) - - #header - header = collect(reinterpret(UInt8, [data.size])) - crc_header = reinterpret(UInt8, UInt32[masked_crc32c(header)]) - crc_data = reinterpret(UInt8, UInt32[masked_crc32c(data.data)]) - - write(out, header) - write(out, crc_header) - write(out, data.data) - write(out, crc_data) - flush(out) + hparam_infos = [hparam_info(HParamConfig(; name=k, datatype=typeof(v))) for (k, v) in hparams] + metric_infos = [metric_info(MetricConfig(; name=metric)) for metric in metrics] + + hparams_dict = Dict{String, HValue}(k=>_convert_value(v) for (k,v) in hparams) + + session_start_info = HP.SessionStartInfo(hparams_dict, "", "", "", zero(Float64)) + session_start_content = HP.HParamsPluginData(PLUGIN_DATA_VERSION, HOneOf(:session_start_info, session_start_info)) + session_start_md = SummaryMetadata(SummaryMetadata_PluginData(PLUGIN_NAME, encode_bytes(session_start_content)), PLUGIN_NAME, "", DataClass.DATA_CLASS_UNKNOWN) + session_start_summary = Summary([Summary_Value("", SESSION_START_INFO_TAG, session_start_md, nothing)]) + + experiment = HP.Experiment("", "", "", zero(Float64), hparam_infos, metric_infos) + experiment_content = HP.HParamsPluginData(PLUGIN_DATA_VERSION, HOneOf(:experiment, experiment)) + experiment_md = SummaryMetadata(SummaryMetadata_PluginData(PLUGIN_NAME, encode_bytes(experiment_content)), PLUGIN_NAME, "", DataClass.DATA_CLASS_UNKNOWN) + experiment_summary = Summary([Summary_Value("", EXPERIMENT_TAG, experiment_md, nothing)]) + + session_end_info = HP.SessionEndInfo(HP.Status.STATUS_SUCCESS, zero(Float64)) + # session_end_info = HP.SessionEndInfo(HP.Status.STATUS_SUCCESS, zero(Float64)) + session_end_content = HP.HParamsPluginData(PLUGIN_DATA_VERSION, HOneOf(:session_end_info, session_end_info)) + session_end_md = SummaryMetadata(SummaryMetadata_PluginData(PLUGIN_NAME, encode_bytes(session_end_content)), PLUGIN_NAME, "", DataClass.DATA_CLASS_UNKNOWN) + session_end_summary = Summary([Summary_Value("", SESSION_END_INFO_TAG, session_end_md, nothing)]) + + # file = add_eventfile(logger, "hparams") + # eventfile = logger.all_files[file] + for s in (session_start_summary, experiment_summary, session_end_summary) + event = Event(zero(Float64), zero(Int64), OneOf(:summary, s), nothing) + write_event(logger, event) + end + nothing end -write_generic_event(logger::TBLogger, event) = write_generic_event(logger.file, event) -export init_hparams!, write_hparams!, HParamRealDomain, HParamSetDomain, HParamConfig, MetricConfig \ No newline at end of file +export write_hparams! \ No newline at end of file diff --git a/test/test_hparams.jl b/test/test_hparams.jl index 8e63c98..58fc087 100644 --- a/test/test_hparams.jl +++ b/test/test_hparams.jl @@ -1,27 +1,36 @@ using TensorBoardLogger, Logging -using TensorBoardLogger: preprocess, summary_impl using Test test_hparams_log_dir = "test_hparams_logs/" -@testset "Initialialise Hparams (default domains, no metrics)" begin +@testset "Write Hparams" begin isdir(test_hparams_log_dir) && rm(test_hparams_log_dir, force=true, recursive=true) # Create a new logger - logger = TBLogger(test_hparams_log_dir*"hparams") - - alpha_config = HParamConfig(; name="alpha", datatype=Float64) - beta_config = HParamConfig(; name="beta", datatype=String) - gamma_config = HParamConfig(; name="gamma", datatype=Bool) + for (i, trial_id) in enumerate(["run1", "run2", "run3"]) + logger = TBLogger(test_hparams_log_dir*trial_id, tb_append) - hparams_config = [alpha_config, beta_config, gamma_config] - metric_config = [MetricConfig(; name="loss")] + # Add in the a dummy loss metric + with_logger(logger) do + for x in 1:20 + @info "scalar" loss = i*sqrt(x) + end + end - @test typeof(init_hparams!(logger, hparams_config, metric_config)) === Nothing + # Setup example hyperparameters + # hparams_config = Dict{String, Any}( + # "alpha"=>0.5, + # "id"=>Float64(i), + # "is_testing"=>(i%2==0) + # ) + hparams_config = Dict{String, Any}( + "id"=>Float64(i), + ) + metrics = ["scalar/loss"] + + @test typeof(write_hparams!(logger, hparams_config, metrics)) === Nothing - # Check that the init didn't create a new file - @test length(logger.all_files) == 1 - - # close all event files - close.(values(logger.all_files)) + # # Check that a new event file has been created + # @test length(logger.all_files) == 2 + end end \ No newline at end of file From 234dc12f9ba5da74f8e1ae8822e6387c00cb37a2 Mon Sep 17 00:00:00 2001 From: Jamie Mair Date: Thu, 13 Jul 2023 10:56:28 +0000 Subject: [PATCH 30/66] Cleaned up the hparams code a little Signed-off-by: Jamie Mair --- src/hparams.jl | 24 ++++++------------------ 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/src/hparams.jl b/src/hparams.jl index 6086982..c358cea 100644 --- a/src/hparams.jl +++ b/src/hparams.jl @@ -24,10 +24,8 @@ Base.@kwdef struct MetricConfig description::String = "" end -# default_domain(::Val{Bool}) = HParamSetDomain([false, true]) -# default_domain(::Val{Float64}) = HParamRealDomain(typemin(Float64), typemax(Float64)) -default_domain(::Val{Bool}) = nothing -default_domain(::Val{Float64}) = nothing +default_domain(::Val{Bool}) = HParamSetDomain([false, true]) +default_domain(::Val{Float64}) = HParamRealDomain(typemin(Float64), typemax(Float64)) default_domain(::Val{String}) = nothing _to_proto_hparam_dtype(::Val{Bool}) = HParamDataType.DATA_TYPE_BOOL @@ -72,15 +70,7 @@ function hparam_info(c::HParamConfig) converted_domain = _convert_hparam_domain(domain) return HParamInfo(c.name, c.displayname, c.description, dtype, converted_domain) end -function decode_metric_name(name) - if contains(name, '/') - return (split(name, '/', limit=2)...,) - else - return ("", name) - end -end -function metric_info(c::MetricConfig) - # group, tag = decode_metric_name(c.name) +function metric_info(c::MetricConfig) mname = MetricName("", c.name) return MetricInfo(mname, c.displayname, c.description, HDatasetType.DATASET_UNKNOWN) end @@ -107,7 +97,8 @@ function write_hparams!(logger::TBLogger, hparams::Dict{String, Any}, metrics::A hparam_infos = [hparam_info(HParamConfig(; name=k, datatype=typeof(v))) for (k, v) in hparams] metric_infos = [metric_info(MetricConfig(; name=metric)) for metric in metrics] - hparams_dict = Dict{String, HValue}(k=>_convert_value(v) for (k,v) in hparams) + + hparams_dict = Dict{String, Any}(k=>_convert_value(v) for (k,v) in hparams) session_start_info = HP.SessionStartInfo(hparams_dict, "", "", "", zero(Float64)) session_start_content = HP.HParamsPluginData(PLUGIN_DATA_VERSION, HOneOf(:session_start_info, session_start_info)) @@ -120,14 +111,11 @@ function write_hparams!(logger::TBLogger, hparams::Dict{String, Any}, metrics::A experiment_summary = Summary([Summary_Value("", EXPERIMENT_TAG, experiment_md, nothing)]) session_end_info = HP.SessionEndInfo(HP.Status.STATUS_SUCCESS, zero(Float64)) - # session_end_info = HP.SessionEndInfo(HP.Status.STATUS_SUCCESS, zero(Float64)) session_end_content = HP.HParamsPluginData(PLUGIN_DATA_VERSION, HOneOf(:session_end_info, session_end_info)) session_end_md = SummaryMetadata(SummaryMetadata_PluginData(PLUGIN_NAME, encode_bytes(session_end_content)), PLUGIN_NAME, "", DataClass.DATA_CLASS_UNKNOWN) session_end_summary = Summary([Summary_Value("", SESSION_END_INFO_TAG, session_end_md, nothing)]) - # file = add_eventfile(logger, "hparams") - # eventfile = logger.all_files[file] - for s in (session_start_summary, experiment_summary, session_end_summary) + for s in (experiment_summary, session_start_summary, session_end_summary) event = Event(zero(Float64), zero(Int64), OneOf(:summary, s), nothing) write_event(logger, event) end From 3323b7d58060cd2c0a989fc38e84128707933d1d Mon Sep 17 00:00:00 2001 From: Jamie Mair Date: Thu, 13 Jul 2023 14:40:11 +0000 Subject: [PATCH 31/66] Switched to make_event instead Signed-off-by: Jamie Mair --- src/hparams.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hparams.jl b/src/hparams.jl index c358cea..7f80d17 100644 --- a/src/hparams.jl +++ b/src/hparams.jl @@ -116,7 +116,7 @@ function write_hparams!(logger::TBLogger, hparams::Dict{String, Any}, metrics::A session_end_summary = Summary([Summary_Value("", SESSION_END_INFO_TAG, session_end_md, nothing)]) for s in (experiment_summary, session_start_summary, session_end_summary) - event = Event(zero(Float64), zero(Int64), OneOf(:summary, s), nothing) + event = make_event(logger, s) write_event(logger, event) end nothing From b8fbbb68a0942215e2cc539552d5ec5f207eee52 Mon Sep 17 00:00:00 2001 From: Jamie Mair Date: Sun, 16 Jul 2023 10:13:50 +0100 Subject: [PATCH 32/66] Removed .gitignore from readme Signed-off-by: Jamie Mair --- .gitignore | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 68f0601..0bf4d23 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,4 @@ test/test_logs docs/Manifest.toml gen/proto -gen/protojl - -.vscode/ \ No newline at end of file +gen/protojl \ No newline at end of file From 867b10534c5bd0de52e8248e7d8b945db6c2c73d Mon Sep 17 00:00:00 2001 From: Jamie Mair Date: Sun, 16 Jul 2023 11:24:35 +0100 Subject: [PATCH 33/66] Tidy up and use normal PB OneOf, switch to allowing Real instead of just Float64 --- src/hparams.jl | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/hparams.jl b/src/hparams.jl index 7f80d17..6faf3a7 100644 --- a/src/hparams.jl +++ b/src/hparams.jl @@ -1,6 +1,6 @@ import .tensorboard_plugin_hparams.hparams: Interval, MetricInfo, MetricName, HParamInfo, Experiment, HParams import .tensorboard_plugin_hparams.hparams: var"#DataType" as HParamDataType, DatasetType as HDatasetType -import .tensorboard_plugin_hparams.google.protobuf: ListValue as HListValue, OneOf as HOneOf, Value as HValue +import .tensorboard_plugin_hparams.google.protobuf: ListValue as HListValue, Value as HValue import .tensorboard_plugin_hparams.hparams as HP import .tensorboard: DataClass @@ -29,24 +29,24 @@ default_domain(::Val{Float64}) = HParamRealDomain(typemin(Float64), typemax(Floa default_domain(::Val{String}) = nothing _to_proto_hparam_dtype(::Val{Bool}) = HParamDataType.DATA_TYPE_BOOL -_to_proto_hparam_dtype(::Val{String}) = HParamDataType.DATA_TYPE_STRING _to_proto_hparam_dtype(::Val{Float64}) = HParamDataType.DATA_TYPE_FLOAT64 +_to_proto_hparam_dtype(::Val{String}) = HParamDataType.DATA_TYPE_STRING -function _convert_value(v::T) where {T<:Union{String, Bool, Float64}} +function _convert_value(v::T) where {T<:Union{String, Bool, Real}} if v isa String - return HValue(HOneOf(:string_value, v)) + return HValue(OneOf(:string_value, v)) elseif v isa Bool - return HValue(HOneOf(:bool_value, v)) - elseif v isa Float64 - return HValue(HOneOf(:number_value, v)) + return HValue(OneOf(:bool_value, v)) + elseif v isa Real + return HValue(OneOf(:number_value, Float64(v))) else error("Unrecognised type!") end end _convert_hparam_domain(::Nothing) = nothing -_convert_hparam_domain(domain::HParamRealDomain) = HOneOf(:domain_interval, Interval(domain.min_value, domain.max_value)) -_convert_hparam_domain(domain::HParamSetDomain) = HOneOf(:domain_discrete, HListValue([_convert_value(v) for v in domain.values])) +_convert_hparam_domain(domain::HParamRealDomain) = OneOf(:domain_interval, Interval(domain.min_value, domain.max_value)) +_convert_hparam_domain(domain::HParamSetDomain) = OneOf(:domain_discrete, HListValue([_convert_value(v) for v in domain.values])) function hparam_info(c::HParamConfig) @@ -62,7 +62,7 @@ function hparam_info(c::HParamConfig) elseif isa(domain, HParamSetDomain{Bool}) @assert datatype==Bool "Domains with bools require a datatype of Bool" elseif isa(domain, HParamSetDomain{Float64}) - @assert datatype==Float64 "Domains with floats require a datatype of Float64" + @assert datatype<:Real "Domains with floats require a datatype a Real datatype" end end @@ -91,7 +91,7 @@ function write_hparams!(logger::TBLogger, hparams::Dict{String, Any}, metrics::A # Check for datatypes for v in values(hparams) - @assert typeof(v) <: Union{Bool, String, Float64} "Hyperparameters must be of types String, Bool or Float64" + @assert typeof(v) <: Union{Bool, String, Real} "Hyperparameters must be of types String, Bool or Real" end hparam_infos = [hparam_info(HParamConfig(; name=k, datatype=typeof(v))) for (k, v) in hparams] @@ -101,18 +101,18 @@ function write_hparams!(logger::TBLogger, hparams::Dict{String, Any}, metrics::A hparams_dict = Dict{String, Any}(k=>_convert_value(v) for (k,v) in hparams) session_start_info = HP.SessionStartInfo(hparams_dict, "", "", "", zero(Float64)) - session_start_content = HP.HParamsPluginData(PLUGIN_DATA_VERSION, HOneOf(:session_start_info, session_start_info)) + session_start_content = HP.HParamsPluginData(PLUGIN_DATA_VERSION, OneOf(:session_start_info, session_start_info)) session_start_md = SummaryMetadata(SummaryMetadata_PluginData(PLUGIN_NAME, encode_bytes(session_start_content)), PLUGIN_NAME, "", DataClass.DATA_CLASS_UNKNOWN) session_start_summary = Summary([Summary_Value("", SESSION_START_INFO_TAG, session_start_md, nothing)]) experiment = HP.Experiment("", "", "", zero(Float64), hparam_infos, metric_infos) - experiment_content = HP.HParamsPluginData(PLUGIN_DATA_VERSION, HOneOf(:experiment, experiment)) - experiment_md = SummaryMetadata(SummaryMetadata_PluginData(PLUGIN_NAME, encode_bytes(experiment_content)), PLUGIN_NAME, "", DataClass.DATA_CLASS_UNKNOWN) + experiment_content = HP.HParamsPluginData(PLUGIN_DATA_VERSION, OneOf(:experiment, experiment)) + experiment_md = SummaryMetadata(SummaryMetadata_PluginData(PLUGIN_NAME, encode_bytes(experiment_content)), "", "", DataClass.DATA_CLASS_UNKNOWN) experiment_summary = Summary([Summary_Value("", EXPERIMENT_TAG, experiment_md, nothing)]) session_end_info = HP.SessionEndInfo(HP.Status.STATUS_SUCCESS, zero(Float64)) - session_end_content = HP.HParamsPluginData(PLUGIN_DATA_VERSION, HOneOf(:session_end_info, session_end_info)) - session_end_md = SummaryMetadata(SummaryMetadata_PluginData(PLUGIN_NAME, encode_bytes(session_end_content)), PLUGIN_NAME, "", DataClass.DATA_CLASS_UNKNOWN) + session_end_content = HP.HParamsPluginData(PLUGIN_DATA_VERSION, OneOf(:session_end_info, session_end_info)) + session_end_md = SummaryMetadata(SummaryMetadata_PluginData(PLUGIN_NAME, encode_bytes(session_end_content)), "", "", DataClass.DATA_CLASS_UNKNOWN) session_end_summary = Summary([Summary_Value("", SESSION_END_INFO_TAG, session_end_md, nothing)]) for s in (experiment_summary, session_start_summary, session_end_summary) From 89a34e985297ea52fa255252a47dc91e88ff1471 Mon Sep 17 00:00:00 2001 From: Jamie Mair Date: Sun, 16 Jul 2023 11:30:49 +0100 Subject: [PATCH 34/66] Simplified imports --- src/hparams.jl | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/hparams.jl b/src/hparams.jl index 6faf3a7..5bd0be1 100644 --- a/src/hparams.jl +++ b/src/hparams.jl @@ -1,8 +1,6 @@ -import .tensorboard_plugin_hparams.hparams: Interval, MetricInfo, MetricName, HParamInfo, Experiment, HParams import .tensorboard_plugin_hparams.hparams: var"#DataType" as HParamDataType, DatasetType as HDatasetType import .tensorboard_plugin_hparams.google.protobuf: ListValue as HListValue, Value as HValue import .tensorboard_plugin_hparams.hparams as HP -import .tensorboard: DataClass struct HParamRealDomain min_value::Float64 @@ -45,7 +43,7 @@ function _convert_value(v::T) where {T<:Union{String, Bool, Real}} end _convert_hparam_domain(::Nothing) = nothing -_convert_hparam_domain(domain::HParamRealDomain) = OneOf(:domain_interval, Interval(domain.min_value, domain.max_value)) +_convert_hparam_domain(domain::HParamRealDomain) = OneOf(:domain_interval, HP.Interval(domain.min_value, domain.max_value)) _convert_hparam_domain(domain::HParamSetDomain) = OneOf(:domain_discrete, HListValue([_convert_value(v) for v in domain.values])) @@ -68,11 +66,11 @@ function hparam_info(c::HParamConfig) dtype = _to_proto_hparam_dtype(Val(datatype)) converted_domain = _convert_hparam_domain(domain) - return HParamInfo(c.name, c.displayname, c.description, dtype, converted_domain) + return HP.HParamInfo(c.name, c.displayname, c.description, dtype, converted_domain) end function metric_info(c::MetricConfig) - mname = MetricName("", c.name) - return MetricInfo(mname, c.displayname, c.description, HDatasetType.DATASET_UNKNOWN) + mname = HP.MetricName("", c.name) + return HP.MetricInfo(mname, c.displayname, c.description, HDatasetType.DATASET_UNKNOWN) end function encode_bytes(content::HP.HParamsPluginData) From cf31314c434c0ae657a0b574f66c96d42be98156 Mon Sep 17 00:00:00 2001 From: Jamie Mair Date: Sun, 16 Jul 2023 11:35:44 +0100 Subject: [PATCH 35/66] Moved export and wrote a docstring for the API method --- src/TensorBoardLogger.jl | 2 +- src/hparams.jl | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/TensorBoardLogger.jl b/src/TensorBoardLogger.jl index dd0f29c..903eff8 100644 --- a/src/TensorBoardLogger.jl +++ b/src/TensorBoardLogger.jl @@ -21,7 +21,7 @@ using Base.CoreLogging: CoreLogging, AbstractLogger, LogLevel, Info, export TBLogger, reset!, set_step!, increment_step!, set_step_increment!, with_TBLogger_hold_step export log_histogram, log_value, log_vector, log_text, log_image, log_images, - log_audio, log_audios, log_graph, log_embeddings, log_custom_scalar + log_audio, log_audios, log_graph, log_embeddings, log_custom_scalar, write_hparams! export map_summaries, TBReader export ImageFormat, L, CL, LC, LN, NL, NCL, NLC, CLN, LCN, HW, WH, HWC, WHC, diff --git a/src/hparams.jl b/src/hparams.jl index 5bd0be1..9366386 100644 --- a/src/hparams.jl +++ b/src/hparams.jl @@ -79,6 +79,17 @@ function encode_bytes(content::HP.HParamsPluginData) return take!(data) end +""" + write_hparams!(logger::TBLogger, hparams::Dict{String, Any}, metrics::AbstractArray{String}) + +Writes the supplied hyperparameters to the logger, along with noting all metrics that should be tracked. + +The value of `hparams` can be a `String`, `Bool` or a subtype of `Real`. All `Real` values are converted +to `Float64` when writing the logs. + +`metrics` should be a list of tags, which correspond to scalars that have been logged. Tensorboard will +automatically extract the latest metric logged to use for this value. +""" function write_hparams!(logger::TBLogger, hparams::Dict{String, Any}, metrics::AbstractArray{String}) PLUGIN_NAME = "hparams" PLUGIN_DATA_VERSION = 0 @@ -118,7 +129,4 @@ function write_hparams!(logger::TBLogger, hparams::Dict{String, Any}, metrics::A write_event(logger, event) end nothing -end - - -export write_hparams! \ No newline at end of file +end \ No newline at end of file From a357f359974905078421b54284ce25730399c48f Mon Sep 17 00:00:00 2001 From: Jamie Mair Date: Sun, 16 Jul 2023 11:50:56 +0100 Subject: [PATCH 36/66] Removed typing from dict --- src/hparams.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hparams.jl b/src/hparams.jl index 9366386..ccbd8d8 100644 --- a/src/hparams.jl +++ b/src/hparams.jl @@ -107,7 +107,7 @@ function write_hparams!(logger::TBLogger, hparams::Dict{String, Any}, metrics::A metric_infos = [metric_info(MetricConfig(; name=metric)) for metric in metrics] - hparams_dict = Dict{String, Any}(k=>_convert_value(v) for (k,v) in hparams) + hparams_dict = Dict(k=>_convert_value(v) for (k,v) in hparams) session_start_info = HP.SessionStartInfo(hparams_dict, "", "", "", zero(Float64)) session_start_content = HP.HParamsPluginData(PLUGIN_DATA_VERSION, OneOf(:session_start_info, session_start_info)) From c02cd5ae4d188d6c38c449737b8c73dc0e67064a Mon Sep 17 00:00:00 2001 From: Jamie Mair Date: Sun, 16 Jul 2023 11:58:19 +0100 Subject: [PATCH 37/66] Added a note of what to do next --- src/hparams.jl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/hparams.jl b/src/hparams.jl index ccbd8d8..ca20de6 100644 --- a/src/hparams.jl +++ b/src/hparams.jl @@ -108,6 +108,8 @@ function write_hparams!(logger::TBLogger, hparams::Dict{String, Any}, metrics::A hparams_dict = Dict(k=>_convert_value(v) for (k,v) in hparams) + # NOTE: THE ABOVE DICTIONARY IS NOT BEING SERIALISED TO THE FILE PROPERLY, + # WE MAY NEED TO EXPLICITLY WRITE AN ENCODER/DECODER FOR THIS TYPE. session_start_info = HP.SessionStartInfo(hparams_dict, "", "", "", zero(Float64)) session_start_content = HP.HParamsPluginData(PLUGIN_DATA_VERSION, OneOf(:session_start_info, session_start_info)) From 532fa36f24bd8838593a33935b0b97341b1943ca Mon Sep 17 00:00:00 2001 From: Jamie Mair Date: Mon, 17 Jul 2023 09:14:40 +0100 Subject: [PATCH 38/66] Fixed typo in project toml for `gen` --- gen/Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gen/Project.toml b/gen/Project.toml index 4fc75dd..f957966 100644 --- a/gen/Project.toml +++ b/gen/Project.toml @@ -4,5 +4,5 @@ FilePathsBase = "48062228-2e41-5def-b9a4-89aafe57970f" Glob = "c27321d9-0574-5035-807b-f59d2c89b15c" ProtoBuf = "3349acd9-ac6a-5e09-bcdb-63829b23a429" -[comapt] +[compat] ProtoBuf = "0.9.1" From 58ba28cbd1d815599542a97f9f32cd95dac7ec7f Mon Sep 17 00:00:00 2001 From: Jamie Mair Date: Mon, 17 Jul 2023 12:47:29 +0100 Subject: [PATCH 39/66] Convert reals to floats to comply with hparams plugin --- src/hparams.jl | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/hparams.jl b/src/hparams.jl index ca20de6..589b320 100644 --- a/src/hparams.jl +++ b/src/hparams.jl @@ -99,8 +99,12 @@ function write_hparams!(logger::TBLogger, hparams::Dict{String, Any}, metrics::A SESSION_END_INFO_TAG = "_hparams_/session_end_info" # Check for datatypes - for v in values(hparams) + for (k,v) in hparams @assert typeof(v) <: Union{Bool, String, Real} "Hyperparameters must be of types String, Bool or Real" + # Cast to other values + if !(typeof(v) <: Bool) && typeof(v) <: Real + hparams[k] = Float64(v) + end end hparam_infos = [hparam_info(HParamConfig(; name=k, datatype=typeof(v))) for (k, v) in hparams] From 7e5b00cc92c06fda3d32e32471d0f9000da0a148 Mon Sep 17 00:00:00 2001 From: Jamie Mair Date: Mon, 17 Jul 2023 12:48:01 +0100 Subject: [PATCH 40/66] Move initialisations to match how they are written to the file --- src/hparams.jl | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/hparams.jl b/src/hparams.jl index 589b320..cb587b4 100644 --- a/src/hparams.jl +++ b/src/hparams.jl @@ -115,17 +115,18 @@ function write_hparams!(logger::TBLogger, hparams::Dict{String, Any}, metrics::A # NOTE: THE ABOVE DICTIONARY IS NOT BEING SERIALISED TO THE FILE PROPERLY, # WE MAY NEED TO EXPLICITLY WRITE AN ENCODER/DECODER FOR THIS TYPE. - session_start_info = HP.SessionStartInfo(hparams_dict, "", "", "", zero(Float64)) - session_start_content = HP.HParamsPluginData(PLUGIN_DATA_VERSION, OneOf(:session_start_info, session_start_info)) - session_start_md = SummaryMetadata(SummaryMetadata_PluginData(PLUGIN_NAME, encode_bytes(session_start_content)), PLUGIN_NAME, "", DataClass.DATA_CLASS_UNKNOWN) - session_start_summary = Summary([Summary_Value("", SESSION_START_INFO_TAG, session_start_md, nothing)]) - experiment = HP.Experiment("", "", "", zero(Float64), hparam_infos, metric_infos) + experiment = HP.Experiment("", "", "", time(), hparam_infos, metric_infos) experiment_content = HP.HParamsPluginData(PLUGIN_DATA_VERSION, OneOf(:experiment, experiment)) experiment_md = SummaryMetadata(SummaryMetadata_PluginData(PLUGIN_NAME, encode_bytes(experiment_content)), "", "", DataClass.DATA_CLASS_UNKNOWN) experiment_summary = Summary([Summary_Value("", EXPERIMENT_TAG, experiment_md, nothing)]) - session_end_info = HP.SessionEndInfo(HP.Status.STATUS_SUCCESS, zero(Float64)) + session_start_info = HP.SessionStartInfo(hparams_dict, "", "", "", time()) + session_start_content = HP.HParamsPluginData(PLUGIN_DATA_VERSION, OneOf(:session_start_info, session_start_info)) + session_start_md = SummaryMetadata(SummaryMetadata_PluginData(PLUGIN_NAME, encode_bytes(session_start_content)), "", "", DataClass.DATA_CLASS_UNKNOWN) + session_start_summary = Summary([Summary_Value("", SESSION_START_INFO_TAG, session_start_md, nothing)]) + + session_end_info = HP.SessionEndInfo(HP.Status.STATUS_SUCCESS, time()) session_end_content = HP.HParamsPluginData(PLUGIN_DATA_VERSION, OneOf(:session_end_info, session_end_info)) session_end_md = SummaryMetadata(SummaryMetadata_PluginData(PLUGIN_NAME, encode_bytes(session_end_content)), "", "", DataClass.DATA_CLASS_UNKNOWN) session_end_summary = Summary([Summary_Value("", SESSION_END_INFO_TAG, session_end_md, nothing)]) From 627db331b7dc946388004489ec4c52cfaebe7ee0 Mon Sep 17 00:00:00 2001 From: Jamie Mair Date: Mon, 17 Jul 2023 12:48:21 +0100 Subject: [PATCH 41/66] Add an overload for writing the dictionary --- src/hparams.jl | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/hparams.jl b/src/hparams.jl index cb587b4..bbe3834 100644 --- a/src/hparams.jl +++ b/src/hparams.jl @@ -1,6 +1,7 @@ import .tensorboard_plugin_hparams.hparams: var"#DataType" as HParamDataType, DatasetType as HDatasetType import .tensorboard_plugin_hparams.google.protobuf: ListValue as HListValue, Value as HValue import .tensorboard_plugin_hparams.hparams as HP +import ProtoBuf as PB struct HParamRealDomain min_value::Float64 @@ -79,6 +80,19 @@ function encode_bytes(content::HP.HParamsPluginData) return take!(data) end +# Overload the dictionary encoder +function PB.encode(e::ProtoEncoder, i::Int, x::Dict{String,HValue}) + PB.Codecs.encode_tag(e, i, PB.Codecs.LENGTH_DELIMITED) + PB.Codecs.vbyte_encode(e.io, UInt32(PB.Codecs._encoded_size(x))) + + for (k, v) in x + PB.Codecs.encode(e, 1, k) + PB.Codecs.encode(e, 2, v) + end + return nothing +end + + """ write_hparams!(logger::TBLogger, hparams::Dict{String, Any}, metrics::AbstractArray{String}) From 08c89cd98fe28b9769083ff9bef0551bc2f83b68 Mon Sep 17 00:00:00 2001 From: Jamie Mair Date: Mon, 17 Jul 2023 14:55:00 +0100 Subject: [PATCH 42/66] Implemented a new encoder for the hyperparameter dict - needs cleaning --- src/hparams.jl | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/hparams.jl b/src/hparams.jl index bbe3834..07d349f 100644 --- a/src/hparams.jl +++ b/src/hparams.jl @@ -82,15 +82,24 @@ end # Overload the dictionary encoder function PB.encode(e::ProtoEncoder, i::Int, x::Dict{String,HValue}) - PB.Codecs.encode_tag(e, i, PB.Codecs.LENGTH_DELIMITED) - PB.Codecs.vbyte_encode(e.io, UInt32(PB.Codecs._encoded_size(x))) - + # PB.Codecs.encode_tag(e, i, PB.Codecs.LENGTH_DELIMITED) + # remaining_size = PB.Codecs._encoded_size(x, i) - 2 # remove two for the field name and length + # PB.Codecs.vbyte_encode(e.io, UInt32(remaining_size)) + for (k, v) in x + PB.Codecs.encode_tag(e, 1, PB.Codecs.LENGTH_DELIMITED) + total_size = PB.Codecs._encoded_size(k, 1) + PB.Codecs._encoded_size(v, 2) + PB.Codecs.vbyte_encode(e.io, UInt32(total_size)) # Add two for the wire type and length PB.Codecs.encode(e, 1, k) PB.Codecs.encode(e, 2, v) end return nothing end +function PB.Codecs._encoded_size(x::Dict{String,HValue}, i::Int) + # Field number and length is another 2 bytes + # There are two bytes for each key value pair extra + return mapreduce((xi) -> 2 + PB.Codecs._encoded_size(xi.first, 1) + PB.Codecs._encoded_size(xi.second, 2), +, x, init=0) +end """ From 13daad7957fd116494305de011087b515f1297a0 Mon Sep 17 00:00:00 2001 From: Jamie Mair Date: Mon, 17 Jul 2023 15:03:20 +0100 Subject: [PATCH 43/66] Tidied up the functional code and added explanations --- src/hparams.jl | 43 +++++++++++++++++++------------------------ 1 file changed, 19 insertions(+), 24 deletions(-) diff --git a/src/hparams.jl b/src/hparams.jl index 07d349f..d709170 100644 --- a/src/hparams.jl +++ b/src/hparams.jl @@ -7,7 +7,7 @@ struct HParamRealDomain min_value::Float64 max_value::Float64 end -struct HParamSetDomain{T<:Union{String, Bool, Float64}} +struct HParamSetDomain{T<:Union{String,Bool,Float64}} values::Vector{T} end Base.@kwdef struct HParamConfig @@ -15,7 +15,7 @@ Base.@kwdef struct HParamConfig datatype::DataType displayname::String = "" description::String = "" - domain::Union{Nothing, HParamRealDomain, HParamSetDomain} = nothing + domain::Union{Nothing,HParamRealDomain,HParamSetDomain} = nothing end Base.@kwdef struct MetricConfig name::String @@ -31,7 +31,7 @@ _to_proto_hparam_dtype(::Val{Bool}) = HParamDataType.DATA_TYPE_BOOL _to_proto_hparam_dtype(::Val{Float64}) = HParamDataType.DATA_TYPE_FLOAT64 _to_proto_hparam_dtype(::Val{String}) = HParamDataType.DATA_TYPE_STRING -function _convert_value(v::T) where {T<:Union{String, Bool, Real}} +function _convert_value(v::T) where {T<:Union{String,Bool,Real}} if v isa String return HValue(OneOf(:string_value, v)) elseif v isa Bool @@ -47,7 +47,6 @@ _convert_hparam_domain(::Nothing) = nothing _convert_hparam_domain(domain::HParamRealDomain) = OneOf(:domain_interval, HP.Interval(domain.min_value, domain.max_value)) _convert_hparam_domain(domain::HParamSetDomain) = OneOf(:domain_discrete, HListValue([_convert_value(v) for v in domain.values])) - function hparam_info(c::HParamConfig) datatype = c.datatype domain = c.domain @@ -55,16 +54,16 @@ function hparam_info(c::HParamConfig) domain = default_domain(Val(datatype)) else if isa(domain, HParamRealDomain) - @assert datatype==Float64 "Real domains require Float64" + @assert datatype == Float64 "Real domains require Float64" elseif isa(domain, HParamSetDomain{String}) - @assert datatype==String "Domains with strings require a datatype of String" + @assert datatype == String "Domains with strings require a datatype of String" elseif isa(domain, HParamSetDomain{Bool}) - @assert datatype==Bool "Domains with bools require a datatype of Bool" + @assert datatype == Bool "Domains with bools require a datatype of Bool" elseif isa(domain, HParamSetDomain{Float64}) - @assert datatype<:Real "Domains with floats require a datatype a Real datatype" + @assert datatype <: Real "Domains with floats require a datatype a Real datatype" end end - + dtype = _to_proto_hparam_dtype(Val(datatype)) converted_domain = _convert_hparam_domain(domain) return HP.HParamInfo(c.name, c.displayname, c.description, dtype, converted_domain) @@ -75,17 +74,15 @@ function metric_info(c::MetricConfig) end function encode_bytes(content::HP.HParamsPluginData) - data = PipeBuffer(); + data = PipeBuffer() encode(ProtoEncoder(data), content) return take!(data) end -# Overload the dictionary encoder +# Dictionary serialisation in ProtoBuf does not work for this specific map type +# and must be overloaded so that it can be parsed. The format was derived by +# looking at the binary output of a log file created by tensorboardX. function PB.encode(e::ProtoEncoder, i::Int, x::Dict{String,HValue}) - # PB.Codecs.encode_tag(e, i, PB.Codecs.LENGTH_DELIMITED) - # remaining_size = PB.Codecs._encoded_size(x, i) - 2 # remove two for the field name and length - # PB.Codecs.vbyte_encode(e.io, UInt32(remaining_size)) - for (k, v) in x PB.Codecs.encode_tag(e, 1, PB.Codecs.LENGTH_DELIMITED) total_size = PB.Codecs._encoded_size(k, 1) + PB.Codecs._encoded_size(v, 2) @@ -95,6 +92,8 @@ function PB.encode(e::ProtoEncoder, i::Int, x::Dict{String,HValue}) end return nothing end +# Similarly, we must overload the size calculation to take into account the new +# format. function PB.Codecs._encoded_size(x::Dict{String,HValue}, i::Int) # Field number and length is another 2 bytes # There are two bytes for each key value pair extra @@ -113,7 +112,7 @@ to `Float64` when writing the logs. `metrics` should be a list of tags, which correspond to scalars that have been logged. Tensorboard will automatically extract the latest metric logged to use for this value. """ -function write_hparams!(logger::TBLogger, hparams::Dict{String, Any}, metrics::AbstractArray{String}) +function write_hparams!(logger::TBLogger, hparams::Dict{String,Any}, metrics::AbstractArray{String}) PLUGIN_NAME = "hparams" PLUGIN_DATA_VERSION = 0 @@ -122,9 +121,9 @@ function write_hparams!(logger::TBLogger, hparams::Dict{String, Any}, metrics::A SESSION_END_INFO_TAG = "_hparams_/session_end_info" # Check for datatypes - for (k,v) in hparams - @assert typeof(v) <: Union{Bool, String, Real} "Hyperparameters must be of types String, Bool or Real" - # Cast to other values + for (k, v) in hparams + @assert typeof(v) <: Union{Bool,String,Real} "Hyperparameters must be of types String, Bool or Real" + # Cast non-supported numerical values to Float64 if !(typeof(v) <: Bool) && typeof(v) <: Real hparams[k] = Float64(v) end @@ -133,12 +132,8 @@ function write_hparams!(logger::TBLogger, hparams::Dict{String, Any}, metrics::A hparam_infos = [hparam_info(HParamConfig(; name=k, datatype=typeof(v))) for (k, v) in hparams] metric_infos = [metric_info(MetricConfig(; name=metric)) for metric in metrics] - - hparams_dict = Dict(k=>_convert_value(v) for (k,v) in hparams) - # NOTE: THE ABOVE DICTIONARY IS NOT BEING SERIALISED TO THE FILE PROPERLY, - # WE MAY NEED TO EXPLICITLY WRITE AN ENCODER/DECODER FOR THIS TYPE. + hparams_dict = Dict(k => _convert_value(v) for (k, v) in hparams) - experiment = HP.Experiment("", "", "", time(), hparam_infos, metric_infos) experiment_content = HP.HParamsPluginData(PLUGIN_DATA_VERSION, OneOf(:experiment, experiment)) experiment_md = SummaryMetadata(SummaryMetadata_PluginData(PLUGIN_NAME, encode_bytes(experiment_content)), "", "", DataClass.DATA_CLASS_UNKNOWN) From 0aae85b2ba5581eb747cf97b0a0940f5940508bc Mon Sep 17 00:00:00 2001 From: Jamie Mair Date: Mon, 17 Jul 2023 15:08:48 +0100 Subject: [PATCH 44/66] Made the test cases cover more ground --- test/test_hparams.jl | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/test/test_hparams.jl b/test/test_hparams.jl index 58fc087..26811be 100644 --- a/test/test_hparams.jl +++ b/test/test_hparams.jl @@ -7,7 +7,7 @@ test_hparams_log_dir = "test_hparams_logs/" isdir(test_hparams_log_dir) && rm(test_hparams_log_dir, force=true, recursive=true) # Create a new logger - for (i, trial_id) in enumerate(["run1", "run2", "run3"]) + for (i, trial_id) in enumerate(["run$k" for k in 1:20]) logger = TBLogger(test_hparams_log_dir*trial_id, tb_append) # Add in the a dummy loss metric @@ -18,13 +18,14 @@ test_hparams_log_dir = "test_hparams_logs/" end # Setup example hyperparameters - # hparams_config = Dict{String, Any}( - # "alpha"=>0.5, - # "id"=>Float64(i), - # "is_testing"=>(i%2==0) - # ) hparams_config = Dict{String, Any}( "id"=>Float64(i), + "alpha"=>0.5, + "p1"=>rand(), + "p2"=>sqrt(rand()), + "p3"=>rand()^5, + "optimisations"=>(i%2==0), + "method"=>rand(("MC", "SGD")) ) metrics = ["scalar/loss"] From 6aedb0374926548fe4651f46c58fd9cefcb24136 Mon Sep 17 00:00:00 2001 From: Jamie Mair Date: Mon, 17 Jul 2023 15:17:56 +0100 Subject: [PATCH 45/66] Updated the hparams script --- examples/HParams.jl | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 examples/HParams.jl diff --git a/examples/HParams.jl b/examples/HParams.jl new file mode 100644 index 0000000..cb836bb --- /dev/null +++ b/examples/HParams.jl @@ -0,0 +1,38 @@ +using TensorBoardLogger #import the TensorBoardLogger package +using Logging #import Logging package +using Random # Exports randn + +# Run 10 experiments to see a plot +for j in 1:10 + logger = TBLogger("random_walks/run$j", tb_append) + + sigma = 0.05 + epochs = 50 + bias = (rand()*2 - 1) # create a random bias + use_seed = false + # Add in the a dummy loss metric + with_logger(logger) do + x = 0.0 + for i in 1:epochs + x += sigma * randn() + bias + @info "scalar" loss = x + end + end + + # Hyperparameter is a dictionary of parameter names to their values. This + # supports numerical types, bools and strings. Non-bool numerical types + # are converted to Float64 to be displayed. + hparams_config = Dict{String, Any}( + "sigma"=>sigma, + "epochs"=>epochs, + "bias"=>bias, + "use_seed"=>use_seed, + "method"=>"MC" + ) + # Specify a list of tags that you want to show up in the hyperparameter + # comparison + metrics = ["scalar/loss"] + + # Write the hyperparameters and metrics config to the logger. + write_hparams!(logger, hparams_config, metrics) +end \ No newline at end of file From afbd961e3a4b3fa79bcf42da0617e4b8558177bf Mon Sep 17 00:00:00 2001 From: Jamie Mair Date: Mon, 17 Jul 2023 15:21:12 +0100 Subject: [PATCH 46/66] Tweak params for hparams example script --- examples/HParams.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/HParams.jl b/examples/HParams.jl index cb836bb..ef3254b 100644 --- a/examples/HParams.jl +++ b/examples/HParams.jl @@ -6,9 +6,9 @@ using Random # Exports randn for j in 1:10 logger = TBLogger("random_walks/run$j", tb_append) - sigma = 0.05 - epochs = 50 - bias = (rand()*2 - 1) # create a random bias + sigma = 0.1 + epochs = 200 + bias = (rand()*2 - 1) / 10 # create a random bias use_seed = false # Add in the a dummy loss metric with_logger(logger) do From c4e50fbc533d84a34c0ea19068b12dd8e4f3cc7a Mon Sep 17 00:00:00 2001 From: Jamie Mair Date: Mon, 17 Jul 2023 15:54:10 +0100 Subject: [PATCH 47/66] Fixed restrictive type information --- src/hparams.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hparams.jl b/src/hparams.jl index d709170..fdac4b1 100644 --- a/src/hparams.jl +++ b/src/hparams.jl @@ -112,7 +112,7 @@ to `Float64` when writing the logs. `metrics` should be a list of tags, which correspond to scalars that have been logged. Tensorboard will automatically extract the latest metric logged to use for this value. """ -function write_hparams!(logger::TBLogger, hparams::Dict{String,Any}, metrics::AbstractArray{String}) +function write_hparams!(logger::TBLogger, hparams::Dict{String,<:Any}, metrics::AbstractArray{String}) PLUGIN_NAME = "hparams" PLUGIN_DATA_VERSION = 0 From dac9c1e10e6252bfb2f25c3f6c1a34a777117b88 Mon Sep 17 00:00:00 2001 From: Jamie Mair Date: Mon, 17 Jul 2023 15:54:41 +0100 Subject: [PATCH 48/66] Added some very simple docs to detail usage of API --- docs/make.jl | 3 +- docs/src/examples/hyperparameter_tuning.md | 53 +++++++++++++++++++++ docs/src/examples/tuning.png | Bin 0 -> 275869 bytes docs/src/hyperparameter_api.md | 12 +++++ docs/src/index.md | 9 ++-- 5 files changed, 73 insertions(+), 4 deletions(-) create mode 100644 docs/src/examples/hyperparameter_tuning.md create mode 100644 docs/src/examples/tuning.png create mode 100644 docs/src/hyperparameter_api.md diff --git a/docs/make.jl b/docs/make.jl index 1a7f092..f2c06c7 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -10,7 +10,8 @@ makedocs( "Backends" => "custom_behaviour.md", "Reading back data" => "deserialization.md", "Extending" => "extending_behaviour.md", - "Explicit Interface" => "explicit_interface.md" + "Explicit Interface" => "explicit_interface.md", + "Hyperparameter API" => "hyperparameter_api.md" ], "Examples" => Any[ "Flux.jl" => "examples/flux.md" diff --git a/docs/src/examples/hyperparameter_tuning.md b/docs/src/examples/hyperparameter_tuning.md new file mode 100644 index 0000000..0a86d61 --- /dev/null +++ b/docs/src/examples/hyperparameter_tuning.md @@ -0,0 +1,53 @@ +# Hyperparameter Tuning + +We will start this example by setting up a simple random walk experiment, and seeing the effect of the hyperparameter `bias` on the results. + +First, import the packages we will need with: +```julia +using TensorBoardLogger, Logging +using Random +``` +Next, we will create a function which runs the experiment and logs the results, include the hyperparameters stored in the `config` dictionary. +```julia +function run_experiment(id, config) + logger = TBLogger("random_walk/run$id", tb_append) + + # Specify all the metrics we want to track in a list + metric_names = ["scalar/position"] + write_hparams!(logger, config, metric_names) + + epochs = config["epochs"] + sigma = config["sigma"] + bias = config["bias"] + with_logger(logger) do + x = 0.0 + for i in 1:epochs + x += sigma * randn() + bias + @info "scalar" position = x + end + end + nothing +end +``` +Now we can write a script which runs an experiment over a set of parameter values. +```julia +id = 0 +for bias in LinRange(-0.1, 0.1, 11) + for epochs in [50, 100] + config = Dict( + "bias"=>bias, + "epochs"=>epochs, + "sigma"=>0.1 + ) + run_experiment(id, config) + id += 1 + end +end +``` + +Below is an example of the dashboard you get when you open Tensorboard with the command: +```sh +tensorboard --logdir=random_walk +``` + +![tuning plot](tuning.png) diff --git a/docs/src/examples/tuning.png b/docs/src/examples/tuning.png new file mode 100644 index 0000000000000000000000000000000000000000..7c0acd29e396f8eb110a52098f9683e6ff89a7bc GIT binary patch literal 275869 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
    c-=?QZdAcFjXc^k_ zD|rvhsf0%28DB!YvNifgpZzBK#q%QcRiV?}+u}_V%9K)@p{g8j*eF3M1M05nG2ms$ z>m7j;03R=1m<)>oYy+<^jhgR`&8O!AeGccti=uy4rIQmGrjXUBnH1lmqkxa$Xp^*8 z?KxKmHJ&%~R9dfw5)!2~m6W=G=7U4jF!G&8{jvj9)MNYQvbQeh1s+Lq+T)*)NKK_KGC0_x>vk$_{Mylb%hW)DIY)fpA{(0~&8 zIG>Sihvx&ssQM2O*C^NPw#o9Z4Fz?Xqj^U)i}h|qpmaf+fsR4CXtpUqcD|ho59Wz) ze`20_T5#`FMe)a#T$aIU@g*jD&A{R6?VKy@=zf1KsIHAI7^U89`2pP4rBP$&)N_u4 zQHX7vz?gp8TbB#3mZD@(i`1oxjvCV=u0C>f^-)t9D$GqCMRz8o8wxE^x&Ime-s8QI z8Cue|kZY3jhR4bP5JQqjlvo!wCnaYJQ$U0QYz)>TK>etD@bL7P!{GHclite%IWd|( z*GzuJ0NPVq`=3p{p3H{&w|hgce`e>FPp(i#z7L!HU6W+6e8=k_B6Cp%F=Q(>yp;+Z zFz2_$V~QtY0DH(o443=7ZZeDjutqT5ML%s$<_WByCXuWI;MEQZW>5c~#MggIsTx|> zdpvU7uhBM7FW#CWEGPj2JQbSSs;sAwJKrBG+T6pqM^m$q$JXd-(yek@D`bcwO-BSQPITAX`{O zk(dBuR<4FA-)YP2#5Ua2Ulc0)ewR-bQXyG1apwi`4KV@ppa*S|Qzb9u8&<&s2fzWT zl95V|@Q%S%c2{h6tT_dTxF`Q3C+y)4oZyfFK?nu8&n!|K_kt}TIruGJEj5iLsk0#~ zyacLLXCv#GLEH{#uzLXD1f~S=z2pTG|6b(yX&XWolDyILbzjahfpFp}-9ylNRTy$@g<3my3fWFn?GfJ9TW9)D#Is9BfdQ)=j$X4s0x zKuu)myGMfL^s2z3=rsT3NerRH4neRUXi}pe^8x!BkJ& ze%G~hXSV?U3L@N0~`t7O`RBIy$j zF6F1qc>*Q?da3qnewu%^04Ua3#M!0I z>NNqVH#03Q#)T5s7X6^b`NnO?4G# zoPS;e3+(d!-(N`Ks&OmygNyl}cUQjsfAOvLoEoefkH2^Q1y)_Nn-eEyAT*=@U&j1V z$d$%*RZb1DRE(bc$xgVNKJ2(-Xqe1iJ!?5o|34f1vM(1{`M)h@z8`edm-~yWruE`Y zs3(`P+&_CiomqREuPHPGyO%lL)zuZ^rr+wED11{9-+a_d(ru>NQN@|jpS{wz(P(&c z^1HHz{6B9l^1ON`=FcwuokLb$h(qaT&_87Uh0PD}fAd_UH^lmu{~l%wO3tS7e~0n^ z*8C|i*6erZCBJ?9_DWH)>1kN5qeZGKtAc_;p+Q}Bk1+fHzF-gX>Sy~WewSS%y!-!U z?!j)%=T&G9e?Qq&8CXR%zUUpAx&4n3?ky7M4f`@k2NFDd{5ZHz98KVzBI5ilCPpTS z-?{^V_-Wo9`^S1J7Kg#bJAz(hFk6Yrz;%Vf*{i$MWg&oSZK90Lda7b&F_dRD&d?Ln z=xl$5nT5rEJv+|f@@Q_Hv^~NciAZU!sB+me z;f9}@=$2c`j{VZFy1qhpA`o}xv*QdNfd%1_vD&SC*B%7VxkE_XvN2MS@YML$_Ecq# zUZqX#*=iDtn<2gMXQPAFUJL?y;TS3d7ff$LI{v2)%daLYtd)ul>Rh%;+HtXOVT92< z5B%|inZfJAzS_~|#L3}E1?D)%_N0m>DW?bz)VVva_9nH53(QiF zpf0R;rYa+OP1}Bd=%o!Lppi-uc8nK?39E>onGK8E!p~SICMJ^Y+i0vNN&}R*tNeN3 zr@r9h(W$8jrbyAIR55qub9h?>z0yejTg<;}nW1aLd1N?5_viP!c`Q1=v3y?Z$4u*M zhZNVfnMR6Hjs$5NxCRs!K3QB^I@@g~PI&Q&)Sx(SAWJ?vA)zzHdA9Rp&g)uFLhE0n zEUG9;d=F0o23f9#_KC&iq`HNm>aQ85DiS2T;5DN4>q9vjb#9K}KwGmS#k+bEo&zUc z=oOe_78g&=)5uXTF_E2h+vK`BNW0#hut*yyhiGHuYZY|`F?znrk_%U!{1C^j|9Aao zQom!0adV(?BI`_zv&B+d_oz72Ck>>9_jwdXJf9WT27T11j4W%k`+Sbi~TcEXtu09&oI|D}P?C3BW z&Q<#Z8H=z;gT-daM>-shXhUZl$4Ch7RL%S1yIfzMxUOXcO^d&Go^hOZ9Mk`pxXN9> z{7vcaPW9&6NC6c%ei^kGjWd^kfAYW=hm{y#25@vCZgmbTiq3Lza^bWC71nyAh3}d{ z481Eg!`s{2JKUZUuuS{=R}kY{bTsC8IfQDe!WtT6OF;XA-4d-|<5VRX>2|b1ao2@> z-eWWV42lZ$ZO{-{>_nspgyGO;130>Ie1EPaL<3mld^QHK%TMRg^&o6l=p@W|1LZ8>ZqTM>aJ}i7!7RZ+B;`{PJ z!x=Iyat;+ap>?%xE1hu<12`e)iCcRT_xBrwW-y6!cyILgvezVsyBae4wRS*O`t^#hay$D5jRy)`4O}354+GlVjAJN`Y39vfH$dwaxV3sGgqJx_>@4n#bwO zb;ojL`93PSxH#w=ujrj`^rLxdgi&re!m%I{S;UOuw8d3?N{yW^8%l{`1wJ`j=RO1; z3PL_tyVxKK^9M4`D>cr*Ett;cug^r81@xd-fQ%?8LCpQwcBB3uzro$Ja8gWQU>i!8 z#G0(M?E{{gtD12uFE1~kf=1j!us2D-Vtp_hBaE8Ym*Z{zQ_ErYpRW^|MzjszfNVMe z9LW863ncQqj-<=QNvrYS55?0W%OPX?mGzh5Aj>%{caWs7eKI%*^s7BUh};*n^9Jjs zsJZM+-hw%zW>bK-m3$gv1%Ay9a!B{uKvseflr@x+%cMVD@+RQYJkNu{J+Qx1gK861 zW+yjU?MbkjtxW)d_zW`o1Ou%4y5OAa-`gk#Cp&Q+Giod1>Jq(laCWzd5$pooERP;O z^x0c#uQ?J14-((0Jy5nB$!}GWxb*+|Y1(-X_IY!3`$v1&$cJ!RK9{RAEIMUuMgg4uTE`i@WG-Hu(=O52)4ir@;%64on2jzI5{`9QzE15il=O9!hgO=a+q(x zEG;bsr@(-Mqq$+{hY!WXQa}obN=)qfp%5J++Gbrj({_D1cO4ZQ+XnK4ul1DZ>Ac@g znDGDg{V0>E3jIXFS$9<3jpb@D_PYu03-;^Jf}2Sy<6ePw@lUCMyV(wfr5`oE4E_P@ z%pG&gQLumaPu^sQT-J->vp4R>{`m2Ol<%~eSi)|zsIt^*;u(n1HfDbKe_ zt&c;xLu*p2>N5fBP!J6hqR` zHSPoWAwa=9j7@>I9VWz`Zw+`Ok1YJLo|1|_wila>I}kDR7jBjHWaoASp!e8uP)Tzi z&?RI#T@`YiCbyX&ZG{b!AtCn7bU3=3Qr(fua2 zeR!(%dDSFC9Qka_OUmy2_oEX|nS=TDlY4-80yV$ZIc?KiMEmsl8?$JqxCJ0Mu{>G@ zii>*&`?uN_k&mnajv{`NuM?1yXDuf?PehxSb%F%;}~rdu1(mz2#zn9 z3l`tWEd~(%0}FM+r_wtPV5bcgxT15k*L(*JdQlBtB3b1%_vf;o-#r5IKkKy=+XnH! z5%Xc8$p-^B24i4C?j_zRH93YK?4*8{GMo)5IX#Oq}{w4^Q5 z0*L-FR2K`fPHO4PeWFvWQHGK(17=%=9yCjdRC8++i1H?!tYjysmqa`0jasI6Y1}IH zOnwQB!M>C`e~KEr<#e2p>j;jpuuciI8*SnwV(+9gAR+zs04D~0S+nq;0e!}EBXX_t zYN__2L?S7a3m=d%0qw)n(Vmv~d{|=UuS+h8`y%fT)ftp>`Cf~RT^eAi=D%nFy&VR& z!6xB?m9u`~Cja$O=*xpPQ5(<#*Gd}(zaL6?xK$`d&3PSEweUQrH>3FPnBEPj&POk^ zo1!$+H{_0Zo_o~CEV%Rte3^ra)DF_!h%bZZif8cTF5j;H5zFf23EuTC_El1>NudY6 z>3|uMw)kjQ3Pu2PBAY$9R&r^qf2v)-30Gl(-)T&U6A6MmyVsYlfNc@cAYLo9>P}IQ zQ1D}5srxhwhl$YfTRi~vD7fZsMYd}!!_DoPxCKt6E{>=r>aYteZq19K4R27FLa3+D zWDq|Ff`_%-Q(IMY_=AP%uLPQr!0&J()Aa%%tSh?2t@XQ>-7PxEve^hRu{kA&PEB|C zCN~dk3iQdL-0&>{sMas7mOSR})rN?eorM|VrvatzHoPLzO13CE41hH;T}QtocVvq; zdwPD1Zm(gBiP|FqIs;WyCT$;@@W$5pRP8YJ!vK@o3=*lx0;fPVx@>IwT-_p4PgUv)k_06J%|q{<>f zAKw#ZD4Vl1u|13_02@+UcIVu9j*s|zkDRdF4PVqkLe}L<24Hr{2UHzj4lQd{ABI~uYa zKDTXpzJ>>QbmBxRRDWEf9_CW}wReLuNG+fBhB84+ zORjZKB?D+Qt6VU0SK!1X2>Kv79Cm>L%#Q&m03elNt(`Z-7;it$(tLEW4m|0Wy?F4UsF^}3dGK$$of|w&jVUh8HzeFM6no~fzSo0a)Ih(9+2YX zVnopHvDRY=R#{nyIJW88pAKH#79vF|#~I2*$Do6m@BO%S?Sf&3vkk((CxvWwslTEU zl@HSSB&by8a7xOKjkXOLV9JzlAs@`=&J+ zBBi4Lr1f#*46-jP;}*4^ z0Y#1?xsK>}@idNX2iW1V8sJ@|08-~2{h0K+Px?Qy1H%ZmBTTRvJY~iWv$s!@7N-Rd zt3!92a@0KD0-f&~Cz7>YXHVjWn`b)`_Z>nw5q(IAg4Qf(9BNTzjz$hYDT~ahQDG{w zhVIVQlJ+GCR0)s<_(v?!TrdL(IN&c^r+?)3^-M3n|1mWYw2Lu1n;n2KzUq4}QEuEf zy+y<}53V_aR&APWOVWFIZvPLBr4JCFdWamm-vVNNpu-F|sDO~TwU+=n8UU2#Ame0c z8DZV5*{F1RK|08F$fGHW%m?MVq#?!6fN~{XuilZ878CFZk|$X#N74!(W!8r1X0D@; z2kKmc>H@W{UjsM{1KBpCs28A~Ew0;rz)L9+L@yecax$Y`gogom+nw;Lp-~1T<2JXW zr!%rXwu8{ErJC}Az*>}7ikqCqpASg#GlK(L2u`H%n9%Lgs=I?ChBrF(=sL?OK;zz4 z5q0Zg5BqLQF?UT3;M$K|h)`@X^4ow`1F_4FN0?Q?wNc$mXm#gV3P15LPLFAivCn|n z@d!t!k6P-nuNfonKfD<7+B>W!0}_cthNa)nox%N4pgPyvTh^~jC<_^HzO2s#oThj+ zF{kz0Edi?p-o9XfoR-T$Fp#!0kwE&Q&UV|q-2>dmKtStlO<~X4TKsk+;B~;g#Yh>5 zJ;UlRS+G?3UKlA^G#dj~9wRm8786U)eT^4vBhOGO1b|La&1cB~N}px%>=(WRG>>lQ zxxt;pyrDj3$orCc16?p-BkrUSpgY>t`kYDxBGHeOfU^GEs^b+;>sx6R8Z1E{F$^yA z7pp+q(Vdeqx*4Wh_T~_tzq&kx<%3=H-1$XB9Zy|yl^8O&E%zQ zK6b93%;q??Dg%zPl(9hW<8cZQkAjdAe)ssSD=mSp{v{9$7Y)#s`y9M@#_{qdK0GvB z)>0}Th1A~#XA07t9FFxt2~lCAcz0*6m#S^w znWbHF-Utz(?I$m7~HC65;(w60SFfPTgqoO zdV`x4I^-kk^%9sx<a)wP|BOV1*sRU<-pGtHZKD7eH7s6 z(>1Nbj=DGFMZ6kJ1E<+|clg8I7V01Gn+@o^sA^G3KeDNm35O8Eg?{wM>q0gw`!|&V z9#74A6%-pEQf2BnJU-%EOC_g1x?L!CGa4{CSx;L2feyLuz0s(1O`_YyJ}lgc81nI> z%WUhzx91SWVqK(pI^b%o2i(iJ@B-w)=ipL(^a7<;7@p=wBBMm(_r2ID4CuWV+mYg} ze+Zi9W|1Gr)6xBt27y(_u&qLUof@k49?G+~Fb2WSywGS)q#@xWl?N(Pdv6glc@2H; zvwfs+`Ax)Vuj64MR@ zh;XO48yHH7q7`1Upg<=Tf3SPFZ~WQp(gZ`-YGC@kPmV`^rSNK3V4KA%rlc4 znuC)G>17~!#LD#QMhpLttL{2DrwvLr@olqWF_+MNzJ3%>(KrFjMdYky*j5Bo zePFfRaAAWw_eILuRvtnA06p4*Z@8OJzNyW5=~{%#Vlpjr)y-g4>dBYr@Pb@~UA1x}cLkArPM!k5* zWu>jBsp`)3d4plTXGL zTXx3+eo+-fg;JXy^p4Zp-eM1llUBz zJ#6mA==WArZPVgZVy?^!wmX>J*vUD28O5j@O=4=-*qwn8^y0k#mRcaTKS*2y*?3^|M-xey!KlMdcP+*@pri0tP9L=aDBwnU1*w;}9>)T3#&Dq6qp1L8BgRR8M?10A{K^zukCYfv`X=$zRqR&| z*DZ>n*cPI>x;0{MoA@PI2_U~v&Fw@L*(4ojyxDQ!w9bA`kTar+#KTi=lq~WT09@l% zW?SrCHNemlRsQtVGt)lF0KNAM9((6)CeI7rKOZczGz-H=x3)UqLNq!eRDx7vLh`$Z z!Q=(Q8p*eQ-b_z{KNCoj>86)DNIFk02lEM}Cw+Nl!tcT^o?Q9yhWT=)}Z%6B-c!?XvVaN$fSP^(Eo#)s%5%xscEXP5Zd*h>pe zQJN3$4uT;a)VFnIEkBZm=|dKPc^Cb zo$KPM(jD4uAeV{UMJYl+PD%~WMDHEC<64nH(eEvARZ_nhR8p|HkOMJKSavaRX&_C} zTmI=5RG^yAN}A}10|e|YZZm4jPZc)j?|`ANk8kdz^KJQ*uQN;QS#fTh_k;GKR1_Aj zvGi&L$Q_I=w%f#0BSw$a1=t@c{)cSsV&N*O)c9dFu>5NHy&4b--M?gJ{gr>vtvND7 za|@gi6X8lxA6bWk#g`kYtxg;bbW#A??jb6NQ8Z&750MaDABSdZi41$Fq;2=4C`XM> zFMt^vH$*R`a=-LC+WWv(A(%Y-HN+KD@%`JTvYmz=rOUT3z)Wzc7{1b)VB0sZB?bCO zpdxcpX4M^PRCa3UBQo0cuWNmD7Mhk{zL}5G4{I`JGKZE7SnR^~>m@X#S)J=b2+WY!2Mh%S5J$Cx=Lqizh!$+-T*a{T5 zY|&FRhY7N3EW&Ruj*l3PoAqHk`qB{HyuS{UU~;QD48L zR54YHeBVfSrrk7)*gnHEZLHrVawn`C;*%w+dm-SpqAX!!lc0aGS6hU^^RE`*ZINnv zoA~cZym*vhut9yn0h;~fy)HUdxcv2~r|SL*yK?Xi2fy-dbWs#cVJlaA!XNlm?cx8? zlIC?tYXO(Yyx58BZvs$%;$H8X4gXbkhH*pYo;A%0stA{BH79?B%~p#^w5C4euC&V= zU7U`lg5N?uw!50~IxmI}eAmm>6w68wdD0+WF$eQ~Ky{V*XT3A4Br=D@VBbTNHM(lw z>qa;mT%h%l(RA;?#qA2K?xb!UN6RPQ_+r<^Z1Tf{T9;?=?hkS{g^m(%wE+pbi6x4L zJQdK9m79tKX^gYe=4URq90=3pRV?f`^ZnXamp2>)4SU-M)+t_rGV z=CQ@dxy2&g*=-<~1v+Lh6q<(EjVHzJ^CGCb#Et1vE?EXikq!Ne-DT(Z>r%#HJWt>$ zp2Q35t|E#7iT}~F!SPL7lX$1>@#EUwI$GpBR=z^%dV`rw(5Ht~A=!Qt^rYZVC;8Wg z5z|aQ@+1UaEtNL6HGD|Di(5g{rmQFHvS((2#q@G5ny%k{#wVxU`UYvWP0-M5x|_vM z7X~Wn&#S9f6l>eXVPe1m?``TfAOr%q=CKpC`(!}F1qN0_=~vYUm;A-68dDq<09vZM zaS6(QUP^H?zU198FhIV6EoS1u7_(em^kXg*16Zp+T0Ya6R>=i{rM8)TQfRd7IXeob z8};CFVCWROL>1u6JdeG2^xU?q*Hh&EMI)bW2C57w)J;%^3*zZr-Q%~B=K~3NuNVxz zQ?youQs=VzpY~Q*1v5nJJL{GK=>*^?7Oy92P=5&bwLgA&?0gQ}$lSj>Se+M&?Ct);HfI$IGjEq@#># zAVDMY(rMFasd^UGhrB#DvK3F;bgT>d@};9YYeCEF0Tz>(oQhb>)mMm$UNbU};7;zg zM&Kt?k23P~FaQ1NIC$m!aHx=3^nq)}(&a-MLs@;9|NbzGWG5YVC^j{heY1{@q#*h4 zPbbj?+`PzwMQ?U}8DU#6G!Eao{T#abda@i6H)j0LLthbfjQ(iP@^6QDalYAYyk0cm zbwAFd{Pz)sR!VN73A?9GvVsdyG;><7{`ZaM9P7M)wJ8dpXxN_a*WyK{rvp6nGS8q+ zxX%4#b$_KB0~-ftX?y#PkQ=hr$f&710AKg6#)&I7 zHkN?;DaO*Z;q4;X0Qp)b{1_zKWb%z}dPX9vhKlh(T?rl#v- z#cAuOl74qcXlQ_HKuPD%M-ur+h8y1f=aNdYprn=66QwwA^Z5oJu*9HfHkDhy-Ht3N zx!-pHI#{RDhMq++Cf#-pP6Oxv*SsP$%5EMtqRA3hwMk&1W=*DQlt2G?09u!Tj-SBG z%Zo#+up=kUv#T?j4Ud>uV1!2aGrN|SmW#Xlb0BB&JYB%S;MT8h2_&S8=eMQ>)^Txj zduD;S-_+D}L!JW)lnHF&)6h?~B3(Yfowl9sEu8_O$7`gMy}dDD$TfexPcW!+Gq$j3 z2TBACLFb+O$H&K~XJ=|al)(BrzM%#MSMu=i`1woipQCp$+^FJEDRDfZz?fa%Qbuc0 zVA|!YK9X%(de2J608}k2i>;v^=j%DIQ$>YjC$g2|*tH6E@=bxDLGkr#0$yHT|G+>K z8yjWd6>nCYoSXzjM93&9+b+>3k2Q1eF)%Rv+#fS=4+kGiG>BtYyXDttMBJMo-AcxOiGZQd5&$#A)kB1#m+SdpoRj-DoWU$1nTp6>dgG1_7h^eG3bV zTeoi6IXEl=p^eeu+CZ|X>o?%G&j5#RGgJLNWBlg1fbgEEv}FVWltmzCY6PmVQuA){ zF}~1$OpfRtK8$S_OWfG6y%7{|{x~0oL=|zWvSKicq1nR76|S zBHBxXG*mPcB`w-zmWGrCHd(~{{f}Yil z{)v-8&5&C6u>Jit6%@?;_qUomczRj?{(fojfB$REM|tZG;@M`MP^-OR#x`u1Gm*-g za+sE`OzUgfagODZIcEJZM+h*iNm%&14O|%m7=(m`w8k}V{=HPs8DXZ>7cah3 z^;fkb#?jr_O33oC+WmX@ac(cThaBYu|^|uv*n??wUacj zd(L*Sh;7XO`$I~#OfBN%Wn>n4cz7h#FgKYf!Nzrlaj|!eSAeEqc~&7{yc*tN79rNUOpQe88Lxt zX#ar&r!6hRv;_Y7=n`2foRaXoTzg~uy1JS#vHhQ8P_}tlY*HT`>!!rtF*?jRLo+HJ=I{ zdN;JSwMjS)Q4lTi^7B(OGb=x)a;ZIdZOjjd5E^<^b~q9%yqWjJYXtwxfr0C@Y`*Q} z=cir1eEGI*+tT9K#@6_}F)qDp|7Ugb9;bzjUa++-yHMMXc#i11ZTT;RSHS3zv9z)!+Cgf;Fe zc3R?oDFJ~XScx_;Gpk{TS+?eh!9!yPT?=V*TY=r5i1I5mKCa~M z9@I=p8*bgYb?y3f+rEZ9R#sNoPE@vKS80$&np;}L?7P?C>nU(p(TIwQ;$wbB)=&)> zeuNY7tL4=eeSLi_U&&ZsBadDNcT`kV2#?k>FLwD`#{3L;P^TsaS}0iR2sj7vFw{<* zUHbV8x?wd zaSHvjH^un$Hw)(5b}WMz5gy5{_$XCTlFGm>p}UU7V9oA_h1KLa+aqb$O3WiV;kkt8 zI`*ADcdh~sQAH&sC5@7=U&G-)HL4Ii|z(vQ2J-(4k zjdG!zXuYg}ql1u_OYyy<}{P_fy5l_?EJOWV=;Dx3v z_UVJj$jhCUBJjAi+j!3Cj~hMy9bOdHDPMA_z`j>=a1f>-$E(^K;z9AKo18x%m1J`l z8{xrE1N<1q0}WU}p)*y+!b~|A`!+)zy`P zB4p*7HCVtP_>ED2REF->Q7LJJQSV&ib1K}Ji-)=+Y))HS&wbdphnIK7x^+9bxl1!{ z^LRx>Y{gjvwC?%%=?|dneBhA27@=24RYX8kw3_NASb;kML>g{1^0e*$DzZ!G`GZE* zn-W=?@k&%U;o^0VC#r4#S)X*L9WK{$0jtmaJ9465o@?Cu$+j|FM0vywS5SGdU!XEg zKK2MNFR$Rng5Qf#x|+2mPTu_Gy~?%fYC!}C<5RLqNIXD})O>06MZ#Al&iG5N=FHnW_hm+@^+=oPJ*r z|5Gf8XdTYRmU&_GO=``us~4?*e>)vr5dH9&!g^(8<#17(sDD+ZrK`D(0!L|sJ|LRE zE-t?Q`0-;aF(dd*zZAH;zI@Q9+wlCPa$SOIy20Mx=a!F)Q}PIhGD)Ne$d7TNZ)F{e zm0LSK-ha+T(z2EVp?JRjPe7w9?WxlTmgd;GGvNfU6CQ7dW!(*#>vr?iK6mbH1d7q! zyM^3c&^@i(=;MGZL0bVD#o?+gO|>t1|6cG^(UOb5KI5=5;&6A~QI~oIm_;Fhg;>u~ z1Gcrd7d_U99h#U}{v9!b6hknUQdX~C4FmCeu4p%zAU0XeO#6v}ldxmH$A3P4es3Ea z@1e{i5gdVOXlUpmT(U4#^5u7>u%)Xm&jUCQyZD?EYC-z~oeNqf1ffg0Mq?ys|cOB>5xKrgjs=yFl-C&>@0pr&c z%9Sfu?u%dAJ2T!Nix5W=9tH6e+pcJSZbr3>(ef!maQ!pgJIIb{_C0FI^KVO7JXPM_ zSZm+;P3!lr8I}XQdoXLv#by~H;Vc*w6!h#w>J>b3{?qSP5KAsrdB4LCS{!&O6gKQT zc6h;lTMI+*KC90Mi+wja_e5R-1lmdB1j1(?`W}84!i<6($HWnWIza)r;k?uH89snn zS`hwL+_#D&Hhl>S2gG;b{4Cdr^9ZT3c&Ms_EjjkyGZTX&6?}!XbaaP6Gr(HB4>s{- z-$`-L%j=JXX>#h+8)Tv%jVUaM55>m(AG2(X=I190M^ZfJ{9e4^N3M{|vFmbzIa%x7 z?95=HkmFD7qPK5#voEm9`qH1mkLCFp*SPt0jI1Anw1)&%sw={#;1mi@Jo6noa?k%9 zx`B^%`PkNMY>RAcY!JyQ_r>fJEU7h!=5>!X*jqhjtSK%N1C^*+_dEWi$2LULhFAIu zA}-Rd@Y#Bw+qZ8EH}y7U@$K8U?|1fui9BBE7HYW%=q-qMvLSn!#G0ua>$WS^#K=;| z$A5Qm0F(JMONL`-rk;Ac?D%ton*`t3cYk>E?OQZV^%_r)@7Zfq;9poMjY|P&0##U9 zSzBvmY9Q@=sH_C)q2Hq?e9YO!I)8q;@8GaSAodOozs1KL1VDgY5mDV4AuBJR?lI>A z*Kr;1rAwDY=OTW8bW>3rPQ!zXm#;JZ{NfZTGSRs55iVie^wNV)PW!PB)HD`qGBzr- zmOGPm1DtNkve~$03khAdRwb>iQK$__2SZG3EXlEBZ5e3DeNCHzO0A~!JC~7F=10C% ziI$4|@x!9kZA2ARR^`V>htY>3MFHdR;DF<7_~C^xxa=zHVfO9EQw$@!>oE#+}a*%S{97Ju>n|m!^Vwb9<$j= z5(f^1BUK;Gu`{cRmac}U|5kp!Bxo59Zf+lhyWzQsZ;4y0@6?`C9)90(^KXI4k;UE1 zI(&sBI;0o>t)jP(-@*Mi0LIxZ!#kM#3!D&M8uw5b@+h_DJ^rhwIrab!_X;p+Rp zxs9ydt@FGS>CWpfaIgHjR^21=(NB0u* z$y^7ThXy%zq?ZfXk#55V84C;Ux8CbZzI+Mu@}dAM>EgLAOg9$#`1-POa9kT2x=<$~ zUDnWW*T-jt%;Cd1o(mqnX`^3*^R%95^MF=O{QD@Fes6db0&i<;gAt$VkhMTQlp})C zJU*VxWaLI&icp$>n9ZyIl7yj-fq`2A0c*i({z9`8fbzx-8;bDcqQ6$*n*@Y}I{LG| znZLQRlyqceXJ=pNDi0OzLoZkO<~@3GIbPfxHmpr(n?l=<3K%2=*@7f1(0h~9)3vWI z*`WPO;pPU;6KJvlAdUgl<2A^>jZjsSVX3uj-8KbqF$jT1;r)mo>&~4!hh6X*r&=pi z`stoBeN;lFeYE5VbaI{sgZ4geolM-r1D6I2d>hZ7KkrPhIDP_Y2$gWsbHX<=OS;f9 zF-_NB`;-0^)Wq#ZS5Ou&=kT0*nj$I7@%Dh@&yYseKmTfaKOyVS?|e{w1~Ib@H^a^hcqea^)v&zNLu{NOxVbmfrW;Fp3_ zVw`vBYB}__|NfQc{h!zSpR3*8osy?dpJos^y#(0H)pr8@8m0FIOeR4L*z@lHb9sM3iib@g){EC;?7R->>Xj0FYB@m)nlg?0}b=8ORk(RFhQL`)#F zq|eQpZA~_XX77CHn)96Rpvmn99lP97WYh;aOhJpjqcMy;kl}dj>6WM60_U4tb6w1oRcCtnTH z5TS^%VQ>2S#-Nr3eltCI{6KnX#V_6Uw|}a$g~iTu1iMEyMAzRtBFOi2<=Zu?Hi`-g zuS-h2kyp_p`3~2jj*PIgvcAzyL?*UsdKmzAAiSd_kf0q(_&)3MAa;3vY-myo+`U5o zcLB?ut>KhJE9Z-}v>3FFkWfiDRFH-A=UjM=3bsj0OHYsW$piapZd+Y;b7L~ipNfr* zEr(M}zhQc6Dixha+qQ2{&B##ExHvOz{p{H@1r?P}knssiN|44MpM13sJ6R!<;mJSy zO|9%>ICG%(6YZ5CgrlR4o}{7BO|z(B^WC)jMrpR5KpK9AH3(-_+Q^GSb=Anou}E`Cw^&e!QxMIBBjx}3u0*r5 zE`C0FZse@tkdGW#6J$VIusi@4vGX~M6b9${0W|52?%q@w0O#}<3HL}fqU(t|Jlx)p ztpA1fOM3jogh~I`OkwMK3-D`=wOP*S)ylf>}#mR zw(ArFb_Ppw-UUzNY^&$OoPniyejy7m%YHGjE+yXJ1xpt{1t|onO@K53_wH?3%Oq@! z%O#|R37sJwv-4Bcp1=uLQ&RX4CY5bx3*2W2#7fePUxmCpi@r;q^0!4rKN^y^f-9&` zF^UFJlE7W)*tZ!R#zQ=VB}JbZ|2R7HxWez z>Eor%xAVKU3YxA!MiI?#1^;LLHRBPALh@Ni+f{K+)F)BdRk@>4iTi9?RZz_&>1FOp z*2_E%DkLH8L$m%sYkozxZO0Im`Ura{Z)V_?L4g~i7f!W-fx&%%?D_e5H}ni9bO4VM zE(ohk*|C2=0}$q-#fy{B--Wd!@DMOK;uiS|^m@Iis90@eWCTbq16}9F^QoF|f#7^P z+S^I~!+{gDeoRMCe+0dnDq}1XPOsnH+z2)V-{yzpJo0T}UbNV8>C&Y{PBeyq*W)v_oU1+j>gq;g6>GDLYYaqho=a6i~#796WK&Qha)zU&J!sh1&J=1aM z>!x&`8z^Egp2&9*K@#%cCKilEqM-WoOHUWtDtg{@c9QxbQe5X8Tj}a^(49#31KXMk z5=be8n_AzNiig_`T`U0@c^1dm$=NwxVUp(8w?Y;j9UYHZsyxBw>f1qE_!VtJX|F{coc%qKI^aV&~{6-H^8i8w~VqB)Cl$LjLtTKIdOu_z-J$kmrs1M zWz#0vXeoD#rk8sP=f<~!B0V+SS%#Kg+ERmW^gKRMV-k)(KC9g&7))A5% zD$Xg?f+$YBaB>!37;Kfqk5@uPN|uj66Lj_{q^>(E7sdJ%&lj5l6pA@GMi6aWm3`AV zn=99?Ge>?V6&^Sr#ARVpyM5>OaKC!|7@KC%|mD-eAx(D0Q4o;Oh7Yl z0kPI?KS1(|=MdDlY4>qRS&Jc^f=`dO+#loTw;CwUZK~^@u+`^} z4sRpSlMNtK^yyP5>){);n>U;LK0>-ckK|e}D72~Q6h}Ryf{#fyJ&p->P5X}@rT7Gd zTJHK5tnmJU_$5&MuCueV$VMhb*H)4Oesa=j6?mtZ0l;pOFE9mwCYU8JO2q}dP#wYx z1*O{wlzuk(W1GQl(tOXKXpP0DAsRB9tS>DC14{YTkZ5tmS|n5%85z5_a#=e$pl3@w zX$n!j@cUV`WG8q~eUg*+oNIVS&ZI&s&Bw~hfZMleaZ7?EG=u{nNQ^k2rM4H7@-OR~ z$5t;i(b_|YK;?J+&K<3Ufjvmv#qZzW5Hu^Ne1tq&=RObwG^~Y+uC5QT9m#|XGGT;v z&sIps;Q2tDMj%O#fC&?F8MOeXha|ZMT!9$Tm7SdUJ!YMVzy|OMbbj#C1A_;f)k58p0cR7UD=RAzlFx>}I&wl^ zf8+M;q@!320y*xy`PHRr;U&^S?pkpV6$hPnfvH0>PTX&fw4V?yWN(Ama0X&BX+TFU z24JJ9B1WUh$u#ln%hk-xOdiWAVQhAgv^O9Wpq3zs4-X*04tWZRQOt8*qP4a4%lH~b zCMMsU9I;PNbwu+)wRVy0zm zd>gy2PrT9Y1?7&Z3n?iW|mPfetQZyqyya4I^G zT`uLOA_@9J>5JDN)EMrp8R@!H9UT~@%EBq0-p4pxGsu-Zo^k%}!F`;P7YCXx^(b8I z=Uem2&~N=Y+m;W{YM>o`?<~8cyHbn8$j;urV|HrfGkE#qPxk7+(!$dv`~As>zWtv9VFFj*?ut zYE=xh1UKl|)wacKVq}a2M2>sN`%?3hCPb!!LR6Qx{@Ak`w7HBjo(p)=t+I4?mgxTZ%lU5{I9^4~lh=>HNb9Q_4_QR-Z(3PF}Jv_)n*y5q> z_fra{eaQrf>DCR~wy9u%2t@oMWBv;O4rkt91XGW`Y4h;+<8dX?hXS$kxH}%*G!6*z zuwEqm=)reDGj1NWiU>PXddB@wPg~oe)2G=$R*2?r`IkpwSSUr^aNU>S-#S|Twt4Is z6H7})AWiT}Y6A7#l6dy0$L|{se$Dg)VX0EQJ2*PydnWKK$*qnT4W&j(8M;&Unsc7})^j z$RamYS6@FJGg9WqQatI9LSbk?ZphBf?f$@bxKj*e{Y@w_>EM}(eSxoVmM~~UUO1M8 zy@3qijiC{?Snh)P>2pXzAzd%GZ`=0b#S3GQ+YkyLkZKDVZ+NKfZBGtIki;0+LXxS} zqNOT9oZbuwP#t+2^z`X&&spkn2zlGY?5+h$O{1n*QMa)0dxNXGRAb`D*l94H8g*mun8{5p^ew6RIa%oF4g(_N=DQKh1C3vHWb zn>v|#x|on#%dTD~iaE)z*o3X_6DPGI@in&NzjVpqlJ2U=3LiRl!gmMX2_~crAjCre ztPc^Qfgm};x^L*|>5;nXFJZo6R!D| z`kA8uMp+YrB>xdi#ky_#UjtofK2sj@0ZNAuV~*VD(El|QYyU(iC912}7~Cj`(=co2&Q?viV7@yEM@JNHt;~TweaDI0bFn->o@0atDC50@U^o z!13@dT&f6?0GXPRY9bGq`Ua0%GdZ7=kLxOx>h4x+i^(A%h~bn|rOyA40xeO_Kw!M; z-47)e#Zd(+VpJAyT3hGCN)}@e6Hk<%pR(^;f3{JV~?olbdC0v4n!63evM9@FZex}!Cx*l8AWys(VVod+{77G`^-NBbK2jx7@W7jqQ;sOAmZ7uHz! zo*6+%{)xLyS%6-Ca{t^FYcy9J|-}%o+Ks%huwi zmIHh`|NNP!EoN;H%v+svxdHASpJR|5JeF6Nx1`m*wd6UWp($195bEX z^P{HzSPu0)8=Y(7B1XB53i2$^cgMPaVzCw&&v>K)W?N8HlnXL+$05lQDyTp%=q14V zs7aNfre`ekp|>E9ZmLImAq=`5{eCE$fCyeRif_}DxArxG>aOPjnRVODNQA2lp#s(&27YNd!kY(aOw;un? zniw)qN%ay{0{TNS4yx*4D4$W3_@x0#T#j}4UtWjaE$nOd=cXp{#P-rOP&szLJ_{hy zAHm-6>O4}4fhIDD8zPyqtKyzE4vf@wbB|v)=qZZtycRw3l=E?iNl8TIgBN@zK_zs) zoh+w%PJe#cv&#FHy#2fk@7}70Ntb&ur}FKz?a~z&mar}Q(aI4VN$5BAgkWa%x@=pM zx@tV47-+&gx>d_ z*)U2uRc}mDdih|@tFrmqeJTspE6;w)h&7r}>WxPT&!V8TD$ z7o4$3sM@-9D~W`7N-F7Y-~&LA4direan|VU%(uiL0_i-E)P-`Yjd)${ezEZ}N%q|| zEnIYObQ1DG4nX}AI##x+mQUvJ>p+%cTVka~USs;OeHPrSZ{VYyY3?cGjjdS` zm#=(B;rR7PzqZ$HeQx^(M69fRPxDLU^L_bBAFs1zy`1WNWaGJ}GZjoMgmJs^v@{R) z5y)^Oan?N9!^5phK7uZ@5>q$ld|T-+^H~`qju%_IryzG8r04A-d;t>&oJ3| zCH?wuMBhO>BS%L^GZcA54JWinlZcPRaEwGB4KWGAEk^WoqC-N2!Q?V!TNNl$;2*Rh zq#=_>3`kRO3gQs{2~CI(IRbPXRzCWSD@PSZOtwE4^CE1kaxWTT2i`fMI-~RH(pfmMw<4 zOT~5`1O!4Es?G_=alObsMx^C<@ zc#&G2d$z;VRt5s>#0z5@@Qv+o)d@y6SqN`{oQK(1@*q#`e=&7-jm3;5qPWn2KcQP`5GX~Zfv;(`#xQDJFVP0{eQVX0;S&d zgv#qK_!mUCfLuF_=SzWd&It>m7t$E9lcDIkf$E%sI_V6s0ueQ#bG^WLJrs5;4ua~N zgqvgK>eaC*9VsyC*A{v%804&To_bJ7>!-u1U)MJ}9UK-$L&A9>ZG?%y(q+pu6I2*? zIG3c!v(yrn7*8MN@&Knop7U;mLIUqbW{6?P+;5vWAzR^}A@c*tLq_Mu-o1NIz~}zs2bn{- zV&zIj+j)%3JDTT2HOSc6Yj8s3n}sAO{3Pxi~qg*op`Nepjz9{yU9r76m%U2b%jgXcxn-ykF<}AwxCf zYve}7V-vym!x(G(l@%4`)V#kH6;Jj0l}qw%jaW$DbQ<9q^yB5ud6W_&I3ucEpm-9J zTl)L^iDd*{1TLuDVAH^PXg$!MQ?%1E{1yR79(3B8xO(aoiU8Ts#9+?Ev$U*EfbV4P zHE=d)Ga*zo4uu`$C>$uwJ;6`rIdXVXX6ia7cEa?u!&$Ej^#MkHvSExI54NA0?FTqT zQB3c^6;UnOLwmwiNf5*$Rnuo*SCL({t4BwfmYMM!)A;8{jvU9(I=Qc^2f`6zG~MJ|xJ600>e-ehCz;9v^Y z2CN=eV@Jq69giH*Lw24&akifnGbJY{!)B6*7MTo-nk#TNnZP571{^V4wy{i~&XC#q zXi9=wWcV%t3pAfV7b1}g2RRlIihlQTf5hWXjSx0S3Y}XWff`=U`1Zfz|q%z_Aw#J zQ$jPrH7imtZTNiY2NV19ZV$UEP_GDZr$AjWogBl~(vlHCJp%rrqqB3#?bFuVf|_p| z4XEC3jz(FnI=3`<#vi-_jBaf>f>?p&`c0j^Hi3NHyun+Cl|6|qAJQsOkX~A!`+Zj@ zPy)j-P=0q$M9i=GxnE6B^f=Oqy`HPps{2UKytu^=qrJtILp1?|wrxSF1ekRhiIi$@ zg@HHW*eezuP#XzV;q(DIet`xOgOew9bL=>YoB(f9n;%~R zCD@z6uk(h|`F-_IEK7>a&h*w*F4m8Tu^i`&r91y#!n7?d9shE#xBqMkXuK!VaEh{O z^;opziXb+hLcDhyt&wL~vrKAkR12T91mx=lM@LSWJ9LcPL!}pH>oOh=A>?IBCU^Qa zXNwjW7svlphR*suRL8Ka-WfHmGSWjB+LJIww;RESjA}$eYwzy9asB#I;!#H$A#w!r zX?t&PSkgW;UU)b+ELLF`E5FC54j~G_fH13oj*G!R%ujZ#hxO|*$0Dc>4G-7)tS>t@m#f1jB^9)=`hfCi zrT4pH&fpN!CBcnDK7Ps^)7^*X`F`+HsW(Ua40-CTargy~dFFaZ+Uu|0j2#WD7et!L z66yIv(8sWfB5SLW6%L?sBEli>i5Fh$r6!5>?zur(RKKHa?VYU?35YC-Kb7(SYKLc7 zp>ATd2hm4p5yCnF2_inAX#Bs;BSI}VN=Hi7t6c~M0sV%wr9piokO3WOP}+-N|AJTm z>&-TpSBZpe@vR_V&Q&2w0D0HMa5<~yQ9QK0#pnLB;_uL^0PHOV>h5iB;4BuU!Dh8; za=+enu9~cKGLyKJ(Gc5IY2CD{%Umy@_5KT!2OQlhjy9F7`*)@COWYwqPozIBWQew` zI;}R^!DfS^zTTW1;I{4^!*B3`{q~jKevsENx;e-#;h2fM+tVg0YPEz9Qs!TyTc$p3 zsHdiyOzEr@j2zqItUK0ccoV2O-MV^{d8Ksm)aumi{rVk!Cw+q!KQ(hv@++-Sn%Eii zi#Qna$*J@HRdHg-u(})&-OkXPEqL&lUAl(dVUDe&o^vPlTwue$?Ik=dLCmp<%%?p| zMFd|Bd%vM%x|j1?``a8h+4zrxAx*-6eM{6t5Z{7Vj>4oLYY_#!OQPE0;|^VUwn70TJpOz ziaIh2Lw8Po_f&ONIunXBgwo>tK3T4Rf7O39ZKn1zZvox{hfin`Y&9row=p~U8XV)e z^+WJte!)LLyPusXTubE#?DS`v492b&=*v~1UV~nfnVAYeBhq- zVH7eSf`pv-Bprn%Y0^MkgPr0u2KN$)@xueLJ4;t@#)ZqkVAxPl9f6Ts4_>tk5}XO4 zf$*6@+?%&&u?4>(pnPt63~~xgx_;n(2w@F)0~>!F6cu<^Bsq>ZO(vTc$N++1P&IuMXp+RoWiTeT-D-QwlE^8UbGm&`9J)w=HcrV(bIPt zj2n@T(dD_;Yvbv6x&L?pu+?C~$f6%3el=`N8U|>V7_4m$Qz#%LWvD^lh6o2V#()y= z79uDwA~Z7^iD2Km0t3&DltUa@Sn>zNbcEu$4f!PILtWiQ_%-yP48gy<{vc$$5w;Ij za2WjCAdZGvQtsG4tNiPl*(P3?w?FFBy@%h&5xr&i?=KkRee_L%YcfRumMWx9h zu{n7~kHO9j%&^t{7hi4Ylh)WH3Md9u2R8u;k1gFa{f$#smy?T7`(`fHe{@3{V{2+#lR%RhSgRYZLC>^Ri~G_Y zvh8n^WN!8-IZ;SRL%m2UUihUB;oMIG9y!hQXKB@=XYnnhYxBGATT$xU-+;U(1fvvo zj~oaA3jofSkwzTi#Lxl&k(hvzE)__Htfel5GoYqHg3dpctus!)|~6aI!U3v>Rvr+D9FbyICAlL`=3hY*4&5Y|TvVYp`Q5#s>` zhVGr}Q7Xs{G@tWbMTv-kwu5(IaX}5%0Z+&{OUu^qDDb}VyO~H@4w&g$8aiKppbYW3)bzpNAN-jC&|tSN(ZeXi(6b_0qGi zp>`nd0lY3ll4_2;4g7Wu>p@wud zT39FmNfS@T`}gm!4@ddNXw_34K)(~u66^&6f`T#F_YObn75lY4hQ8CFFem&woG`Wc zoWuwKg^L?HGSDZiQu8}FIF@YOxDoLAFeGsSetyziOZ?0rLI~pyf3QF7Eg%@aqerF< zO%ZJf@D$=;CN;&`9CX%IfD}_yQHg`ko=jwbQv=(M_>fTRv|*k(YE)Xd5c2Z!KBt+% zW^V8h5dw6vTE6^q{j7D17cUk$j*$wLh|nw6uP^!V!5^8o2DgmeSo}2h;GPwpEIGw` zg|uwvx!OMIjx?`j2A4qkO5VMD_YsD_f|&tvbjOrJ9gODFrR6o~pBoicA*#_x*K@8i-bTAauGRe#$x3zV2koO_L z=g$vVrJWVI-*%C>xHx%801Bk)W<*lN;W0<(f`R5H&`hUGB?{3~Fu4&0rf`1R4-Rbd z!jI=CUmfQjOyWMUG=P)4*=ZPjCyGS?B7!PVfW5!XdKl*RMZ_XWcpBo^0Fuynb0))YXkErty`x8jy+0hyQRl!2@P6Z=LeQq(UpGBVfB6Kp6x$_`=S zjH6rR=wn_07X4@zS{s&M_a$16DgiG~F>n)^m?Cnvo**{TCQfWa&^6Fc#D|AK@G8Jj zhRwGqFuFP|(&y$L0265>X>uly*{1;oGJ~2-K*NS!ubiA50|Udu#6)jUBMo1dz<)<9 z71&s{xXa}0`J|+Oaq2Dd_cCw`#m&tRa3DTDKPe9QLEb@w?vl#PRC~l*()$N@fie6Q zI9}AzQTTpeU`;d}Rxv3b&8Chb(vg7}B$xrZM7xhO!eKz(8&djAdmmhR*px?~9^V7j z@Kfe93ewgG7{Lga05=z5I$%VF74ca&l0*#dMQkAPi%IG0*CfZAH+01J-vf&mwI z;nLm6$e5Iwk5U8JO2D@L2(y&i}av17k{Ol8!#QGR@)JvuW#AGEs!k!^qU+1sU*o6QdiREd}f>X@Ej{kH85d z@8(F>cuNe(z%nr9Ed{d)?mcpwG#k#T56Ii@?ry!_>FMdS>$4v{VqLau*-vDJT+%&8 zr~^!6K`E>^r!lm~p|D!}*Q@T6_>ArryaJC9 zRABNWZ)d`-_Tqg^6i_tfwv{lW|LE;)>*~55AI}LV4P+kH#=Q2iah1SlmEk`(Fb7S3 zSj((SVj3_I3X-DNuf0IBB)y%8$}oPj2*p@}#}F9gYOp`i&gII;%J;#;E8pd%5!@m+ zHar|$!z?4g3O)^o*0SXxdg&EaRl6X4KojY}fEfU_`u;DCjWv#Q51Jc#%hVfa%}WjB zzXQnT+@%q09OZ#{-*C>Wv(pqRNm8gNkY9;~7cRFY+fBxF3k!?7scBq;_GT}HgU8af z2&;Cy36XQ@R%T|!fWZuytU-n;u(K~dxH~FM)cnUTS6;JXx$zqIrMg19Ujberwq|Z_ z+I{Q^J*fUY7Z|UX?iCc=;O_2@^-V}1{sb`S5aW|@-e56q43`VdKeb3udV;i>!AFl% zE+{By=YP<}j^(6jAqx{DW7m(P6&@-kCMN#={u!q~eEz(@QKXyD`Ij%#Kz-D#L;Io8 z=a_fxl^D0A2wziXf+FVl;C&==+S(!0Gu$aowT+D>pFiJ+*XROT>T$r2VCUVk^jB}F zbfB6_m=%heMT+~O&^>Q<=%1N(YiHjcr%K_@v-cL_nNQWuBNDX$jE3RDIhSVV_FQ6OHWi)!;N0}?!%$> zB((AWep%0sb#>G12A=B#ewEyYb+of zv5JZ5wnVvCMmE~cZ4(!NwM|Qxxax0h6Vp7xx#4>J!_+0$xBM=IAxVfOT*Px)CoeBg zK_7a<^s$HA)uAKAL)s%lzYZUMYap-F*<*HmSVdJ8{XU%lOlS4*+A@HD%Ui7F?PIuT zM#Ax~9>6*a;cywTONb?InFJcF-C|^~{%viHT1G#&72sdShAxWD*?r z{9&yJd-m*6R95alx~Ih=RJhP8|kP>~PFK&HYU-P;P9Olvc;}D8uf8 z>y`i=m>9wgib863=rCxC$R4(9GW4RPvParKkjz7e*=6vtAXgY)uA*aMsfOP_a~`$B zkLDa9JVG-hJmlQ(gM-yTawy2w6DJ^?ZwyRK==pHiYnWGxPcj98>{G|)_tRpC=%kh{yK*}%#ry3?rUPJYzH#wcgoj{Qp-f~h>S0}w31mKhPfZhUg zvHFP<_jA`(0jZ0*jB?{+llDK@_hF}F9Lq+jLwJ3p{&w6M;a-kDbb`lr8;Y3S8IDTB z#CQjMx!-AM2l4llK6x>_Bj+9+pt{(>MhDgkMr*!rd8FdNAC@wQg@lJIIXGlA7~vt} zL!g<41&(RNv}|++k<$Y~?G2|T(x4JN*8(CUz#0Z~zfS(~Em`jQNIYA_yN4ARH!aTq(H?E>};oZ|c-xg|?3iTEG+x>{c;X;l{cl71~Mx2FOMU-7QGBh9BlXqQ}JQ*W>rm&0xvD~eeUU-0tfJn+9 zaf(rsUjES9hfF+zW)_nE@wq^Vtc9obVB523!e0Md=S09FP&r@4S72oCJ2D^)PC6KvKgz4=EBR^ z;u~350&!wdfZR#qEB3-P2Anf

    XQJ3RIt(!k#g~pNJnBUb;n*>@YGyb~+mm2r7 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 z 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 Uw2mcH9t~a+qOy Date: Mon, 17 Jul 2023 16:17:32 +0100 Subject: [PATCH 49/66] Completed the documentation for the feature --- Project.toml | 2 +- docs/make.jl | 3 ++- docs/src/examples/hyperparameter_tuning.md | 2 +- docs/src/{hyperparameter_api.md => hyperparameters.md} | 6 ++---- docs/src/index.md | 2 +- 5 files changed, 7 insertions(+), 8 deletions(-) rename docs/src/{hyperparameter_api.md => hyperparameters.md} (80%) diff --git a/Project.toml b/Project.toml index 28ee51e..a85d392 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "TensorBoardLogger" uuid = "899adc3e-224a-11e9-021f-63837185c80f" authors = ["Filippo Vicentini "] -version = "0.1.20" +version = "0.1.21" [deps] CRC32c = "8bf52ea8-c179-5cab-976a-9e18b702a9bc" diff --git a/docs/make.jl b/docs/make.jl index f2c06c7..a9d1882 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -11,11 +11,12 @@ makedocs( "Reading back data" => "deserialization.md", "Extending" => "extending_behaviour.md", "Explicit Interface" => "explicit_interface.md", - "Hyperparameter API" => "hyperparameter_api.md" + "Hyperparameter logging" => "hyperparameters.md" ], "Examples" => Any[ "Flux.jl" => "examples/flux.md" "Optim.jl" => "examples/optim.md" + "Hyperparameter tuning" => "examples/hyperparameter_tuning.md" ] ], format = Documenter.HTML( diff --git a/docs/src/examples/hyperparameter_tuning.md b/docs/src/examples/hyperparameter_tuning.md index 0a86d61..4d1155d 100644 --- a/docs/src/examples/hyperparameter_tuning.md +++ b/docs/src/examples/hyperparameter_tuning.md @@ -1,4 +1,4 @@ -# Hyperparameter Tuning +# Hyperparameter tuning We will start this example by setting up a simple random walk experiment, and seeing the effect of the hyperparameter `bias` on the results. diff --git a/docs/src/hyperparameter_api.md b/docs/src/hyperparameters.md similarity index 80% rename from docs/src/hyperparameter_api.md rename to docs/src/hyperparameters.md index 3a68451..9a9e3bf 100644 --- a/docs/src/hyperparameter_api.md +++ b/docs/src/hyperparameters.md @@ -1,12 +1,10 @@ -# Hyperparameter Experiments +# Hyperparameter logging In additition to logging the experiments, you may wish to also visualise the effect of hyperparameters on some plotted metrics. This can be done by logging the hyperparameters via the `write_hparams!` function, which takes a dictionary mapping hyperparameter names to their values (currently limited to `Real`, `Bool` or `String` types), along with the names of any metrics that you want to view the effects of. You can see how the HParams dashboard in Tensorboard can be used to tune hyperparameters on the [tensorboard website](https://www.tensorflow.org/tensorboard/hyperparameter_tuning_with_hparams). -![hparams dashboard view](https://www.tensorflow.org/tensorboard/images/hparams_parallel_coordinates.png?raw=1) - -## HParams API +## API ```@docs write_hparams! ``` diff --git a/docs/src/index.md b/docs/src/index.md index c8dd661..bcb5215 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -121,5 +121,5 @@ As an alternative, you can also log data to TensorBoard through its functional i ## Hyperparameter tuning -Many experiments rely on hyperparameters, which can be difficult to tune. Tensorboard allows you to visualise the effect of your hyperparameters on your metrics, giving you an intuition for the correct hyperparameters for your task. For information on this API, see the [Hyperparameter API](@ref). +Many experiments rely on hyperparameters, which can be difficult to tune. Tensorboard allows you to visualise the effect of your hyperparameters on your metrics, giving you an intuition for the correct hyperparameters for your task. For information on this API, see the [Hyperparameter logging](@ref) manual page. From 881a2fdfec360459709b05d152d27ba80fe62e80 Mon Sep 17 00:00:00 2001 From: Frames White Date: Tue, 18 Jul 2023 02:18:13 +0800 Subject: [PATCH 50/66] Update Project.toml --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index 1b56f8d..2666f58 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "TensorBoardLogger" uuid = "899adc3e-224a-11e9-021f-63837185c80f" authors = ["Filippo Vicentini "] -version = "0.1.20" +version = "0.1.21" [deps] CRC32c = "8bf52ea8-c179-5cab-976a-9e18b702a9bc" From 022c3b8dff84be4ced26911647d1b06e6fec847f Mon Sep 17 00:00:00 2001 From: Jamie Mair Date: Tue, 18 Jul 2023 09:41:53 +0100 Subject: [PATCH 51/66] Fixed assumption of single byte size This allows the key (hyperparameter name) to be much longer than 127 bytes. --- src/hparams.jl | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/hparams.jl b/src/hparams.jl index fdac4b1..67b7d08 100644 --- a/src/hparams.jl +++ b/src/hparams.jl @@ -82,6 +82,7 @@ end # Dictionary serialisation in ProtoBuf does not work for this specific map type # and must be overloaded so that it can be parsed. The format was derived by # looking at the binary output of a log file created by tensorboardX. +# These protobuf overloads should be removed once https://github.com/JuliaIO/ProtoBuf.jl/pull/234 is merged. function PB.encode(e::ProtoEncoder, i::Int, x::Dict{String,HValue}) for (k, v) in x PB.Codecs.encode_tag(e, 1, PB.Codecs.LENGTH_DELIMITED) @@ -92,12 +93,14 @@ function PB.encode(e::ProtoEncoder, i::Int, x::Dict{String,HValue}) end return nothing end + # Similarly, we must overload the size calculation to take into account the new # format. -function PB.Codecs._encoded_size(x::Dict{String,HValue}, i::Int) - # Field number and length is another 2 bytes - # There are two bytes for each key value pair extra - return mapreduce((xi) -> 2 + PB.Codecs._encoded_size(xi.first, 1) + PB.Codecs._encoded_size(xi.second, 2), +, x, init=0) +function PB.Codecs._encoded_size(d::Dict{String,HValue}, i::Int) + mapreduce(x->begin + total_size = PB.Codecs._encoded_size(x.first, 1) + PB.Codecs._encoded_size(x.second, 2) + return 1 + PB.Codecs._varint_size(total_size) + total_size + end, +, d, init=0) end From c5e2a3fa1d9d8e7d8d059311c37f2e0226226e17 Mon Sep 17 00:00:00 2001 From: Jamie Mair Date: Tue, 18 Jul 2023 09:42:28 +0100 Subject: [PATCH 52/66] Added a decode implementation as well --- src/hparams.jl | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/hparams.jl b/src/hparams.jl index 67b7d08..9e05a51 100644 --- a/src/hparams.jl +++ b/src/hparams.jl @@ -103,6 +103,23 @@ function PB.Codecs._encoded_size(d::Dict{String,HValue}, i::Int) end, +, d, init=0) end +function PB.Codecs.decode!(d::ProtoDecoder, buffer::Dict{String,HValue}) + len = PB.Codecs.vbyte_decode(d.io, UInt32) + endpos = position(d.io) + len + while position(d.io) < endpos + pair_field_number, pair_wire_type = PB.Codecs.decode_tag(d) + pair_len = PB.Codecs.vbyte_decode(d.io, UInt32) + pair_end_pos = position(d.io) + pair_len + field_number, wire_type = PB.Codecs.decode_tag(d) + key = PB.Codecs.decode(d, K) + field_number, wire_type = PB.Codecs.decode_tag(d) + val = PB.Codecs.decode(d, Ref{V}) + @assert position(d.io) == pair_end_pos + buffer[key] = val + end + @assert position(d.io) == endpos + nothing +end """ write_hparams!(logger::TBLogger, hparams::Dict{String, Any}, metrics::AbstractArray{String}) From 0a6f14c09bcefc18266eec71c3e2d352254c6e67 Mon Sep 17 00:00:00 2001 From: Jamie Mair Date: Tue, 18 Jul 2023 10:01:00 +0100 Subject: [PATCH 53/66] Added a unit test to ensure the hparams content is being serialised corrected --- test/test_hparams.jl | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/test/test_hparams.jl b/test/test_hparams.jl index 26811be..8b301b1 100644 --- a/test/test_hparams.jl +++ b/test/test_hparams.jl @@ -1,5 +1,6 @@ using TensorBoardLogger, Logging using Test +import ProtoBuf as PB test_hparams_log_dir = "test_hparams_logs/" @@ -34,4 +35,46 @@ test_hparams_log_dir = "test_hparams_logs/" # # Check that a new event file has been created # @test length(logger.all_files) == 2 end +end + +@testset "Serialise hparams" begin + hparams_config = Dict{String, Any}( + "id"=>Float64(1), + "alpha"=>0.5, + "p1"=>0.1, + "optimisations"=>false, + "method"=>"MC" + ) + metrics = ["scalar/loss"] + + PLUGIN_NAME = "hparams" + PLUGIN_DATA_VERSION = 0 + + EXPERIMENT_TAG = "_hparams_/experiment" + SESSION_START_INFO_TAG = "_hparams_/session_start_info" + SESSION_END_INFO_TAG = "_hparams_/session_end_info" + + hparam_infos = [TensorBoardLogger.hparam_info(TensorBoardLogger.HParamConfig(; name=k, datatype=typeof(v))) for (k, v) in hparams_config] + metric_infos = [TensorBoardLogger.metric_info(TensorBoardLogger.MetricConfig(; name=metric)) for metric in metrics] + + + hparams_dict = Dict(k => TensorBoardLogger._convert_value(v) for (k, v) in hparams_config) + + session_start_info = TensorBoardLogger.HP.SessionStartInfo(hparams_dict, "", "", "", zero(Float64)) + session_start_content = TensorBoardLogger.HP.HParamsPluginData(PLUGIN_DATA_VERSION, TensorBoardLogger.OneOf(:session_start_info, session_start_info)) + + expected_bytes = UInt8[0x1a, 0x5b, 0x0a, 0x0e, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x04, 0x1a, 0x02, 0x4d, 0x43, 0x0a, 0x12, 0x0a, 0x05, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x12, 0x09, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x3f, 0x0a, 0x0f, 0x0a, 0x02, 0x69, 0x64, 0x12, 0x09, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x0a, 0x13, 0x0a, 0x0d, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x02, 0x20, 0x00, 0x0a, 0x0f, 0x0a, 0x02, 0x70, 0x31, 0x12, 0x09, 0x11, 0x9a, 0x99, 0x99, 0x99, 0x99, 0x99, 0xb9, 0x3f] + + @test TensorBoardLogger.encode_bytes(session_start_content) == expected_bytes + + d = TensorBoardLogger.ProtoDecoder(IOBuffer(expected_bytes)) + decoded_content = PB.Codecs.decode(d, TensorBoardLogger.HP.HParamsPluginData) + decoded_session_info = decoded_content.data.value + + @test all(haskey(decoded_session_info.hparams, k) for k in keys(hparams_config)) + + for (k, hv) in decoded_session_info.hparams + decoded_v = hv.kind.value + @test hparams_config[k] == decoded_v + end end \ No newline at end of file From 1dfa89f2ff49c6ed120072ceb0860bdc991a3693 Mon Sep 17 00:00:00 2001 From: Jamie Mair Date: Tue, 18 Jul 2023 14:12:46 +0100 Subject: [PATCH 54/66] Separated the hparams encoding/decoding tests --- test/test_hparams.jl | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/test/test_hparams.jl b/test/test_hparams.jl index 8b301b1..6a5c8ce 100644 --- a/test/test_hparams.jl +++ b/test/test_hparams.jl @@ -37,7 +37,9 @@ test_hparams_log_dir = "test_hparams_logs/" end end -@testset "Serialise hparams" begin +const hparams_metadata_encoded_bytes = UInt8[0x1a, 0x5b, 0x0a, 0x0e, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x04, 0x1a, 0x02, 0x4d, 0x43, 0x0a, 0x12, 0x0a, 0x05, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x12, 0x09, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x3f, 0x0a, 0x0f, 0x0a, 0x02, 0x69, 0x64, 0x12, 0x09, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x0a, 0x13, 0x0a, 0x0d, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x02, 0x20, 0x00, 0x0a, 0x0f, 0x0a, 0x02, 0x70, 0x31, 0x12, 0x09, 0x11, 0x9a, 0x99, 0x99, 0x99, 0x99, 0x99, 0xb9, 0x3f] + +@testset "Encoding hparams metadata" begin hparams_config = Dict{String, Any}( "id"=>Float64(1), "alpha"=>0.5, @@ -62,19 +64,28 @@ end session_start_info = TensorBoardLogger.HP.SessionStartInfo(hparams_dict, "", "", "", zero(Float64)) session_start_content = TensorBoardLogger.HP.HParamsPluginData(PLUGIN_DATA_VERSION, TensorBoardLogger.OneOf(:session_start_info, session_start_info)) - - expected_bytes = UInt8[0x1a, 0x5b, 0x0a, 0x0e, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x04, 0x1a, 0x02, 0x4d, 0x43, 0x0a, 0x12, 0x0a, 0x05, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x12, 0x09, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x3f, 0x0a, 0x0f, 0x0a, 0x02, 0x69, 0x64, 0x12, 0x09, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x0a, 0x13, 0x0a, 0x0d, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x02, 0x20, 0x00, 0x0a, 0x0f, 0x0a, 0x02, 0x70, 0x31, 0x12, 0x09, 0x11, 0x9a, 0x99, 0x99, 0x99, 0x99, 0x99, 0xb9, 0x3f] - @test TensorBoardLogger.encode_bytes(session_start_content) == expected_bytes + @test TensorBoardLogger.encode_bytes(session_start_content) == hparams_metadata_encoded_bytes +end - d = TensorBoardLogger.ProtoDecoder(IOBuffer(expected_bytes)) + +@testset "Decoding hparams metadata" begin + expected_hparams_config = Dict{String, Any}( + "id"=>Float64(1), + "alpha"=>0.5, + "p1"=>0.1, + "optimisations"=>false, + "method"=>"MC" + ) + + d = TensorBoardLogger.ProtoDecoder(IOBuffer(deepcopy(hparams_metadata_encoded_bytes))) decoded_content = PB.Codecs.decode(d, TensorBoardLogger.HP.HParamsPluginData) decoded_session_info = decoded_content.data.value - @test all(haskey(decoded_session_info.hparams, k) for k in keys(hparams_config)) + @test all(haskey(decoded_session_info.hparams, k) for k in keys(expected_hparams_config)) for (k, hv) in decoded_session_info.hparams decoded_v = hv.kind.value - @test hparams_config[k] == decoded_v + @test expected_hparams_config[k] == decoded_v end end \ No newline at end of file From 837668623e8e5fad029572f89a51db59941c8e85 Mon Sep 17 00:00:00 2001 From: Jamie Mair Date: Fri, 21 Jul 2023 10:28:41 +0100 Subject: [PATCH 55/66] Fixed serialisation bug by avoiding using the raw buffer The raw buffer is sometimes expanded for performance reasons, which leaves the buffer with additional zeros. This fix just returns the written bytes of the PipeBuffer, instead of including the extra padding. --- src/event.jl | 9 ++++----- src/utils.jl | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/event.jl b/src/event.jl index 25c4811..26e6ebc 100644 --- a/src/event.jl +++ b/src/event.jl @@ -29,17 +29,16 @@ format. The format follows the following rule (in bytes) #4 N..N+8 UInt32 masked_CRC of #3 """ function write_event(out::IO, event::Event) - data = PipeBuffer(); - encode(ProtoEncoder(data), event) + event_bytes = serialize_proto(event) #header - header = collect(reinterpret(UInt8, [data.size])) + header = collect(reinterpret(UInt8, [length(event_bytes)])) crc_header = reinterpret(UInt8, UInt32[masked_crc32c(header)]) - crc_data = reinterpret(UInt8, UInt32[masked_crc32c(data.data)]) + crc_data = reinterpret(UInt8, UInt32[masked_crc32c(event_bytes)]) write(out, header) write(out, crc_header) - write(out, data.data) + write(out, event_bytes) write(out, crc_data) flush(out) end diff --git a/src/utils.jl b/src/utils.jl index bc11dd7..f44f9d9 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -9,7 +9,7 @@ end function serialize_proto(data) pb = PipeBuffer() encode(ProtoEncoder(pb), data) - pb.data + return view(pb.data, 1:pb.size) # Do not return additional zeros end """ From a04d836687c16e2e26df272ec2199253066b71b7 Mon Sep 17 00:00:00 2001 From: Jamie Mair Date: Fri, 21 Jul 2023 10:30:15 +0100 Subject: [PATCH 56/66] Moved the hparams plugin to use the standard serialisation --- src/hparams.jl | 12 +++--------- test/test_hparams.jl | 2 +- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/hparams.jl b/src/hparams.jl index 9e05a51..f0fc738 100644 --- a/src/hparams.jl +++ b/src/hparams.jl @@ -73,12 +73,6 @@ function metric_info(c::MetricConfig) return HP.MetricInfo(mname, c.displayname, c.description, HDatasetType.DATASET_UNKNOWN) end -function encode_bytes(content::HP.HParamsPluginData) - data = PipeBuffer() - encode(ProtoEncoder(data), content) - return take!(data) -end - # Dictionary serialisation in ProtoBuf does not work for this specific map type # and must be overloaded so that it can be parsed. The format was derived by # looking at the binary output of a log file created by tensorboardX. @@ -156,17 +150,17 @@ function write_hparams!(logger::TBLogger, hparams::Dict{String,<:Any}, metrics:: experiment = HP.Experiment("", "", "", time(), hparam_infos, metric_infos) experiment_content = HP.HParamsPluginData(PLUGIN_DATA_VERSION, OneOf(:experiment, experiment)) - experiment_md = SummaryMetadata(SummaryMetadata_PluginData(PLUGIN_NAME, encode_bytes(experiment_content)), "", "", DataClass.DATA_CLASS_UNKNOWN) + experiment_md = SummaryMetadata(SummaryMetadata_PluginData(PLUGIN_NAME, serialize_proto(experiment_content)), "", "", DataClass.DATA_CLASS_UNKNOWN) experiment_summary = Summary([Summary_Value("", EXPERIMENT_TAG, experiment_md, nothing)]) session_start_info = HP.SessionStartInfo(hparams_dict, "", "", "", time()) session_start_content = HP.HParamsPluginData(PLUGIN_DATA_VERSION, OneOf(:session_start_info, session_start_info)) - session_start_md = SummaryMetadata(SummaryMetadata_PluginData(PLUGIN_NAME, encode_bytes(session_start_content)), "", "", DataClass.DATA_CLASS_UNKNOWN) + session_start_md = SummaryMetadata(SummaryMetadata_PluginData(PLUGIN_NAME, serialize_proto(session_start_content)), "", "", DataClass.DATA_CLASS_UNKNOWN) session_start_summary = Summary([Summary_Value("", SESSION_START_INFO_TAG, session_start_md, nothing)]) session_end_info = HP.SessionEndInfo(HP.Status.STATUS_SUCCESS, time()) session_end_content = HP.HParamsPluginData(PLUGIN_DATA_VERSION, OneOf(:session_end_info, session_end_info)) - session_end_md = SummaryMetadata(SummaryMetadata_PluginData(PLUGIN_NAME, encode_bytes(session_end_content)), "", "", DataClass.DATA_CLASS_UNKNOWN) + session_end_md = SummaryMetadata(SummaryMetadata_PluginData(PLUGIN_NAME, serialize_proto(session_end_content)), "", "", DataClass.DATA_CLASS_UNKNOWN) session_end_summary = Summary([Summary_Value("", SESSION_END_INFO_TAG, session_end_md, nothing)]) for s in (experiment_summary, session_start_summary, session_end_summary) diff --git a/test/test_hparams.jl b/test/test_hparams.jl index 6a5c8ce..17b959e 100644 --- a/test/test_hparams.jl +++ b/test/test_hparams.jl @@ -65,7 +65,7 @@ const hparams_metadata_encoded_bytes = UInt8[0x1a, 0x5b, 0x0a, 0x0e, 0x0a, 0x06, session_start_info = TensorBoardLogger.HP.SessionStartInfo(hparams_dict, "", "", "", zero(Float64)) session_start_content = TensorBoardLogger.HP.HParamsPluginData(PLUGIN_DATA_VERSION, TensorBoardLogger.OneOf(:session_start_info, session_start_info)) - @test TensorBoardLogger.encode_bytes(session_start_content) == hparams_metadata_encoded_bytes + @test TensorBoardLogger.serialize_proto(session_start_content) == hparams_metadata_encoded_bytes end From e7992a4b77d2ba79e31df209752af211c8f09039 Mon Sep 17 00:00:00 2001 From: Jamie Mair Date: Fri, 21 Jul 2023 10:31:59 +0100 Subject: [PATCH 57/66] Bumped version with the bugfix --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index a85d392..2bd7038 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "TensorBoardLogger" uuid = "899adc3e-224a-11e9-021f-63837185c80f" authors = ["Filippo Vicentini "] -version = "0.1.21" +version = "0.1.22" [deps] CRC32c = "8bf52ea8-c179-5cab-976a-9e18b702a9bc" From f75bfe2545b6a5a70983b5407eab642f0b0dbb34 Mon Sep 17 00:00:00 2001 From: Lior Blech Date: Fri, 21 Jul 2023 12:44:41 +0300 Subject: [PATCH 58/66] bring back "log_vector" --- src/Loggers/LogHistograms.jl | 11 +++++++++++ src/TensorBoardLogger.jl | 2 +- test/runtests.jl | 1 + 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/Loggers/LogHistograms.jl b/src/Loggers/LogHistograms.jl index 8273fd8..1a1f61a 100644 --- a/src/Loggers/LogHistograms.jl +++ b/src/Loggers/LogHistograms.jl @@ -31,6 +31,17 @@ function log_histogram(logger::TBLogger, name::AbstractString, data::AbstractArr write_event(logger.file, make_event(logger, summ, step=step)) end +""" + log_vector(logger, name, data::Vector; step=step(logger)) +Logs the vector found in `data` as an histogram under the name `name`. +""" +function log_vector(logger::TBLogger, name::AbstractString, data::AbstractVector; step=nothing) + # @warn "TensorBoardLogger Depracation Warning: log_vector does not correctly log vectors. Use bar diagrams instead using a plotting library." + hist = Histogram(collect(0:length(data)), data) + summ = SummaryCollection(histogram_summary(name, hist)) + write_event(logger.file, make_event(logger, summ, step=step)) +end + function histogram_summary(name::AbstractString, hist::Histogram{T,1}) where T edges = first(hist.edges) hist_vals = hist.weights diff --git a/src/TensorBoardLogger.jl b/src/TensorBoardLogger.jl index be7efc2..758d74d 100644 --- a/src/TensorBoardLogger.jl +++ b/src/TensorBoardLogger.jl @@ -20,7 +20,7 @@ using Base.CoreLogging: CoreLogging, AbstractLogger, LogLevel, Info, NullLogger export TBLogger, reset!, set_step!, increment_step!, set_step_increment! -export log_histogram, log_value, log_text, log_image, log_images, +export log_histogram, log_value, log_vector, log_text, log_image, log_images, log_audio, log_audios, log_graph, log_embeddings, log_custom_scalar export map_summaries, TBReader diff --git a/test/runtests.jl b/test/runtests.jl index bf390ad..e96e03d 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -84,6 +84,7 @@ end log_histogram(logger, "hist/cust", data_tuple, step=step) log_histogram(logger, "hist/cust", rand(100), step=step) log_histogram(logger, "hist/cust", rand(10,10), step=step) + log_vector(logger, "hist/cust", rand(10), step=step) close.(values(logger.all_files)) end From f5f08779e0d428dacbacd7ab3a73c40150a22d31 Mon Sep 17 00:00:00 2001 From: Lior Blech Date: Fri, 21 Jul 2023 12:55:47 +0300 Subject: [PATCH 59/66] remove comment --- src/Loggers/LogHistograms.jl | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Loggers/LogHistograms.jl b/src/Loggers/LogHistograms.jl index 1a1f61a..613c19d 100644 --- a/src/Loggers/LogHistograms.jl +++ b/src/Loggers/LogHistograms.jl @@ -36,7 +36,6 @@ end Logs the vector found in `data` as an histogram under the name `name`. """ function log_vector(logger::TBLogger, name::AbstractString, data::AbstractVector; step=nothing) - # @warn "TensorBoardLogger Depracation Warning: log_vector does not correctly log vectors. Use bar diagrams instead using a plotting library." hist = Histogram(collect(0:length(data)), data) summ = SummaryCollection(histogram_summary(name, hist)) write_event(logger.file, make_event(logger, summ, step=step)) From 2b2807e46a99ffc55137fb28c74dd7568fd37a40 Mon Sep 17 00:00:00 2001 From: Jamie Mair Date: Sat, 22 Jul 2023 08:11:49 +0100 Subject: [PATCH 60/66] Update src/utils.jl Co-authored-by: Lior Blech --- src/utils.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.jl b/src/utils.jl index f44f9d9..e774629 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -9,7 +9,7 @@ end function serialize_proto(data) pb = PipeBuffer() encode(ProtoEncoder(pb), data) - return view(pb.data, 1:pb.size) # Do not return additional zeros + return take!(pb) # Do not return additional zeros end """ From d0f92836263b83384f6d796a7fae3bc4efed8d7c Mon Sep 17 00:00:00 2001 From: Lior Blech Date: Tue, 25 Jul 2023 19:09:03 +0300 Subject: [PATCH 61/66] delete tuple preprocess path for hsitograms --- src/logger_dispatch.jl | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/logger_dispatch.jl b/src/logger_dispatch.jl index 6453b93..8dd1da9 100644 --- a/src/logger_dispatch.jl +++ b/src/logger_dispatch.jl @@ -79,8 +79,6 @@ summary_impl(name, value::Any) = text_summary(name, value) preprocess(name, hist::Histogram{<:Any,1}, data) = push!(data, name=>hist) summary_impl(name, hist::Histogram) = histogram_summary(name, hist) -preprocess(name, (bins,weights)::Tuple{AbstractVector{<:Real},AbstractVector{<:Real}}, data) = return preprocess(name, fit(Histogram, weights, bins), data) - preprocess(name, val::AbstractArray{<:Real}, data) = return preprocess(name, fit(Histogram, collect(vec(val))), data) # Split complex numbers into real/complex pairs From e12902202551389cf5984d4a1021df849f2a3619 Mon Sep 17 00:00:00 2001 From: Lior Blech Date: Tue, 25 Jul 2023 20:03:26 +0300 Subject: [PATCH 62/66] update docs --- docs/src/custom_behaviour.md | 2 +- docs/src/extending_behaviour.md | 2 +- docs/src/index.md | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/src/custom_behaviour.md b/docs/src/custom_behaviour.md index f3a2d8a..85ef75c 100644 --- a/docs/src/custom_behaviour.md +++ b/docs/src/custom_behaviour.md @@ -5,7 +5,7 @@ value is sent to: - `::AbstractVector{<:Real}` -> [Histogram backend](https://www.tensorflow.org/guide/tensorboard_histograms) as a vector - `::StatsBase.Histogram` -> [Histogram backend](https://www.tensorflow.org/guide/tensorboard_histograms) - - `(bin_edges, weights)::Tuple{AbstractVector,AbstractVector}` where `length(bin_edges)==length(weights)+1`, is interpreted as an histogram. (*Will be deprecated.* Please use `TBHistogram(edges, weights)` for this). + - `::Real` -> Scalar backend - `::AbstractArray{<:Colorant}` -> [Image backend](https://www.tensorflow.org/tensorboard/r2/image_summaries) - `::Any` -> Text Backend diff --git a/docs/src/extending_behaviour.md b/docs/src/extending_behaviour.md index a9537a5..b28cabb 100644 --- a/docs/src/extending_behaviour.md +++ b/docs/src/extending_behaviour.md @@ -12,7 +12,7 @@ At the end of this step, every pair in `objects` will be logged to a specific backend, according to the following rules: - `::AbstractVector{<:Real}` -> [Histogram backend](https://www.tensorflow.org/guide/tensorboard_histograms) as a vector - - `::Tuple{AbstractVector,AbstractVector}` [Histogram backend](https://www.tensorflow.org/guide/tensorboard_histograms) as an histogram + - `::Real` -> Scalar backend - `::AbstractArray{<:Colorant}` -> [Image backend](https://www.tensorflow.org/tensorboard/r2/image_summaries) - `::Any` -> Text Backend diff --git a/docs/src/index.md b/docs/src/index.md index 9102b45..1ff1c17 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -111,6 +111,7 @@ at [Reading back TensorBoard data](@ref) We also support logging custom types from a the following third-party libraries: - [Plots.jl](https://github.com/JuliaPlots/Plots.jl): the `Plots.Plot` type will be rendered to PNG at the resolution specified by the object and logged as an image - [PyPlot.jl](https://github.com/JuliaPy/PyPlot.jl): the `PyPlot.Figure` type will be rendered to PNG at the resolution specified by the object and logged as an image + - [Gadfly.jl](https://github.com/GiovineItalia/Gadfly.jl): the `Gadfly.Plot` type will be rendered to PNG at the resolution specified by the object and logged as an image - [Tracker.jl](https://github.com/FluxML/Tracker.jl): the `TrackedReal` and `TrackedArray` types will be logged as vector data - [ValueHistories.jl](https://github.com/JuliaML/ValueHistories.jl): the `MVHistory` type is used to store the deserialized content of .proto files. From c22fe2036e69dd14d4a8a2bd79e45ddbb39709e9 Mon Sep 17 00:00:00 2001 From: Tor Erlend Fjelde Date: Mon, 18 Sep 2023 21:21:03 +0100 Subject: [PATCH 63/66] added skip for summaries with nothing in deserializtaion iterator --- src/Deserialization/deserialization.jl | 6 ++++++ test/test_hparams.jl | 15 +++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/Deserialization/deserialization.jl b/src/Deserialization/deserialization.jl index 4284fc7..16335b1 100644 --- a/src/Deserialization/deserialization.jl +++ b/src/Deserialization/deserialization.jl @@ -187,6 +187,12 @@ function Base.iterate(iter::SummaryDeserializingIterator, state=1) (tag, summary), i_state = res + # This can happen in certain cases, e.g. if hyperparameters have been recorded. + if summary.value === nothing + # Hence, we just skip it. + return Base.iterate(iter, state + 1) + end + typ = summary_type(summary) if typ === :histo val = deserialize_histogram_summary(summary) diff --git a/test/test_hparams.jl b/test/test_hparams.jl index 17b959e..46ec760 100644 --- a/test/test_hparams.jl +++ b/test/test_hparams.jl @@ -88,4 +88,19 @@ end decoded_v = hv.kind.value @test expected_hparams_config[k] == decoded_v end +end + +@testset "Reading with hparams present (#137)" begin + # https://github.com/JuliaLogging/TensorBoardLogger.jl/issues/137 + lg = TBLogger(joinpath(mktempdir(), "logs")) + TensorBoardLogger.write_hparams!( + lg, + Dict("hi" => 1.0), + ["x/val"] + ) + with_logger(lg) do + @info "x" val=3.0 + end + hist = convert(MVHistory, lg) + @test haskey(hist, "x/val") end \ No newline at end of file From e5088ae2c711104e509ee1dac5dd5c8f13754671 Mon Sep 17 00:00:00 2001 From: Tor Erlend Fjelde Date: Mon, 18 Sep 2023 21:21:45 +0100 Subject: [PATCH 64/66] bump patch version --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index 2bd7038..03f1caf 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "TensorBoardLogger" uuid = "899adc3e-224a-11e9-021f-63837185c80f" authors = ["Filippo Vicentini "] -version = "0.1.22" +version = "0.1.23" [deps] CRC32c = "8bf52ea8-c179-5cab-976a-9e18b702a9bc" From fca3ac549c426ab59a957475902deca3f09c6341 Mon Sep 17 00:00:00 2001 From: Tor Erlend Fjelde Date: Wed, 4 Oct 2023 11:41:40 +0100 Subject: [PATCH 65/66] loaded ValueHistories --- test/runtests.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/test/runtests.jl b/test/runtests.jl index ca969bf..b098713 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -6,6 +6,7 @@ using ImageCore using FileIO using LightGraphs using StatsBase: fit, Histogram +using ValueHistories: MVHistory ENV["DATADEPS_ALWAYS_ACCEPT"] = true ENV["GKSwstype"] = "100" From 599e147f2a1231f9ff8aec36ded5103f45f31c8c Mon Sep 17 00:00:00 2001 From: Tor Erlend Fjelde Date: Wed, 4 Oct 2023 13:45:57 +0100 Subject: [PATCH 66/66] fixed incorrect usage of haskey for MvHistory in tests --- test/test_hparams.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test_hparams.jl b/test/test_hparams.jl index 46ec760..587de69 100644 --- a/test/test_hparams.jl +++ b/test/test_hparams.jl @@ -102,5 +102,5 @@ end @info "x" val=3.0 end hist = convert(MVHistory, lg) - @test haskey(hist, "x/val") -end \ No newline at end of file + @test haskey(hist, Symbol("x/val")) +end