onnx/onnx

Parser treats a float attribute as int and produces invalid model

クローズ

#5,748 opened on 2023/11/10

 (2 件のコメント) (0 件のリアクション) (1 人の担当者)Python (3,585 件のフォーク)batch import
bugcontributions welcomegood first issuemodule: parser

Repository metrics

Stars
 (16,592 個のスター)
PR merge metrics
 (平均マージ 1d 23h) (30d で 80 merged PRs)

説明

The print-parse round trip of the following model will produce a ModelProto with a node that has its ord attribute defined both as a float and an int. It should have been a float attribute.

The bug is discovered via https://github.com/microsoft/onnxruntime/issues/18338

Code to reproduce

import google.protobuf.text_format
import onnx
import difflib

onnx_model_text = """
ir_version: 8
producer_name: "pytorch"
producer_version: "2.2.0"
graph {
  node {
    output: "_val_1"
    name: "Constant_0"
    op_type: "Constant"
    attribute {
      name: "value_ints"
      ints: -1
      type: INTS
    }
    doc_string: ""
  }
  node {
    input: "input_0"
    input: "_val_1"
    output: "_val_2"
    name: "Reshape_1"
    op_type: "Reshape"
    attribute {
      name: "allowzero"
      i: 0
      type: INT
    }
    doc_string: ""
  }
  node {
    input: "_val_2"
    output: "_val_3"
    name: "_aten_linalg_vector_norm_no_dim_onnx_2"
    op_type: "_aten_linalg_vector_norm_no_dim_onnx"
    attribute {
      name: "keepdim"
      i: 0
      type: INT
    }
    attribute {
      name: "ord"
      f: 2.0
      type: FLOAT
    }
    doc_string: ""
    domain: "pkg.onnxscript.torch_lib"
  }
  name: "main_graph"
  input {
    name: "input_0"
    type {
      tensor_type {
        elem_type: 10
        shape {
        }
      }
    }
  }
  output {
    name: "_val_3"
    type {
      tensor_type {
        elem_type: 10
        shape {
        }
      }
    }
  }
  value_info {
    name: "_val_1"
    type {
      tensor_type {
        elem_type: 7
        shape {
          dim {
            dim_value: 1
          }
        }
      }
    }
  }
  value_info {
    name: "_val_2"
    type {
      tensor_type {
        elem_type: 10
        shape {
          dim {
            dim_value: 1
          }
        }
      }
    }
  }
}
opset_import {
  domain: "pkg.onnxscript.torch_lib"
  version: 1
}
opset_import {
  domain: ""
  version: 18
}
opset_import {
  domain: "pkg.onnxscript.torch_lib.common"
  version: 1
}
functions {
  name: "_aten_linalg_vector_norm_no_dim_onnx"
  input: "self"
  output: "result_29"
  attribute: "ord"
  attribute: "keepdim"
  node {
    input: "self"
    output: "tmp"
    name: "n0"
    op_type: "Shape"
    domain: ""
  }
  node {
    input: "tmp"
    output: "self_rank"
    name: "n1"
    op_type: "Size"
    domain: ""
  }
  node {
    output: "int64_0"
    name: "n2"
    op_type: "Constant"
    attribute {
      name: "value"
      t {
        data_type: 7
        int64_data: 0
        name: "int64_0"
      }
      type: TENSOR
    }
    domain: ""
  }
  node {
    input: "int64_0"
    input: "self_rank"
    output: "int64_0_cast"
    name: "n3"
    op_type: "CastLike"
    domain: ""
  }
  node {
    input: "self_rank"
    input: "int64_0_cast"
    output: "cond"
    name: "n4"
    op_type: "Equal"
    domain: ""
  }
  node {
    input: "cond"
    output: "self_2"
    name: "n5"
    op_type: "If"
    attribute {
      name: "then_branch"
      g {
        node {
          output: "int64_0_1d"
          name: "n0"
          op_type: "Constant"
          attribute {
            name: "value"
            t {
              dims: 1
              data_type: 7
              int64_data: 0
              name: "int64_0_1d"
            }
            type: TENSOR
          }
          domain: ""
        }
        node {
          input: "self"
          input: "int64_0_1d"
          output: "self_0"
          name: "n1"
          op_type: "Unsqueeze"
          domain: ""
        }
        name: "thenGraph_4"
        output {
          name: "self_0"
          type {
          }
        }
      }
      type: GRAPH
    }
    attribute {
      name: "else_branch"
      g {
        node {
          input: "self"
          output: "self_1"
          name: "n0"
          op_type: "Identity"
          domain: ""
        }
        name: "elseGraph_4"
        output {
          name: "self_1"
          type {
          }
        }
      }
      type: GRAPH
    }
    domain: ""
  }
  node {
    input: "self_2"
    output: "self_3"
    name: "n6"
    op_type: "Abs"
    domain: ""
  }
  node {
    output: "ord"
    name: "n7"
    op_type: "Constant"
    attribute {
      name: "value_float"
      type: FLOAT
      ref_attr_name: "ord"
    }
    domain: ""
  }
  node {
    input: "ord"
    output: "ord_4"
    name: "n8"
    op_type: "Cast"
    attribute {
      name: "to"
      i: 1
      type: INT
    }
    domain: ""
  }
  node {
    input: "ord_4"
    output: "cond_5"
    name: "n9"
    op_type: "IsInf"
    attribute {
      name: "detect_negative"
      i: 0
      type: INT
    }
    attribute {
      name: "detect_positive"
      i: 1
      type: INT
    }
    domain: ""
  }
  node {
    input: "cond_5"
    output: "result_24"
    name: "n10"
    op_type: "If"
    attribute {
      name: "then_branch"
      g {
        node {
          input: "self_3"
          output: "result"
          name: "n0"
          op_type: "ReduceMax"
          attribute {
            name: "keepdims"
            type: INT
            ref_attr_name: "keepdim"
          }
          domain: ""
        }
        name: "thenGraph_9"
        output {
          name: "result"
          type {
          }
        }
      }
      type: GRAPH
    }
    attribute {
      name: "else_branch"
      g {
        node {
          input: "ord_4"
          output: "cond_6"
          name: "n0"
          op_type: "IsInf"
          attribute {
            name: "detect_negative"
            i: 1
            type: INT
          }
          attribute {
            name: "detect_positive"
            i: 0
            type: INT
          }
          domain: ""
        }
        node {
          input: "cond_6"
          output: "result_23"
          name: "n1"
          op_type: "If"
          attribute {
            name: "then_branch"
            g {
              node {
                input: "self_3"
                output: "result_7"
                name: "n0"
                op_type: "ReduceMin"
                attribute {
                  name: "keepdims"
                  type: INT
                  ref_attr_name: "keepdim"
                }
                domain: ""
              }
              name: "thenGraph_11"
              output {
                name: "result_7"
                type {
                }
              }
            }
            type: GRAPH
          }
          attribute {
            name: "else_branch"
            g {
              node {
                output: "const"
                name: "n0"
                op_type: "Constant"
                attribute {
                  name: "value"
                  t {
                    data_type: 1
                    float_data: 0.0
                    name: "const"
                  }
                  type: TENSOR
                }
                domain: ""
              }
              node {
                input: "const"
                input: "ord_4"
                output: "const_cast"
                name: "n1"
                op_type: "CastLike"
                domain: ""
              }
              node {
                input: "ord_4"
                input: "const_cast"
                output: "cond_8"
                name: "n2"
                op_type: "Equal"
                domain: ""
              }
              node {
                input: "cond_8"
                output: "result_22"
                name: "n3"
                op_type: "If"
                attribute {
                  name: "then_branch"
                  g {
                    node {
                      input: "self_3"
                      output: "self_bool"
                      name: "n0"
                      op_type: "Cast"
                      attribute {
                        name: "to"
                        i: 9
                        type: INT
                      }
                      domain: ""
                    }
                    node {
                      input: "self_bool"
                      input: "self_3"
                      output: "self_0_1"
                      name: "n1"
                      op_type: "CastLike"
                      domain: ""
                    }
                    node {
                      input: "self_0_1"
                      output: "result_9"
                      name: "n2"
                      op_type: "ReduceSum"
                      attribute {
                        name: "keepdims"
                        i: 0
                        type: INT
                      }
                      domain: ""
                    }
                    name: "thenGraph_13"
                    output {
                      name: "result_9"
                      type {
                      }
                    }
                  }
                  type: GRAPH
                }
                attribute {
                  name: "else_branch"
                  g {
                    node {
                      output: "const_10"
                      name: "n0"
                      op_type: "Constant"
                      attribute {
                        name: "value"
                        t {
                          data_type: 1
                          float_data: 1.0
                          name: "const_10"
                        }
                        type: TENSOR
                      }
                      domain: ""
                    }
                    node {
                      input: "const_10"
                      input: "ord_4"
                      output: "const_10_cast"
                      name: "n1"
                      op_type: "CastLike"
                      domain: ""
                    }
                    node {
                      input: "ord_4"
                      input: "const_10_cast"
                      output: "cond_11"
                      name: "n2"
                      op_type: "Equal"
                      domain: ""
                    }
                    node {
                      input: "cond_11"
                      output: "result_21"
                      name: "n3"
                      op_type: "If"
                      attribute {
                        name: "then_branch"
                        g {
                          node {
                            input: "self_3"
                            output: "result_12"
                            name: "n0"
                            op_type: "ReduceL1"
                            attribute {
                              name: "keepdims"
                              type: INT
                              ref_attr_name: "keepdim"
                            }
                            domain: ""
                          }
                          name: "thenGraph_18"
                          output {
                            name: "result_12"
                            type {
                            }
                          }
                        }
                        type: GRAPH
                      }
                      attribute {
                        name: "else_branch"
                        g {
                          node {
                            output: "const_13"
                            name: "n0"
                            op_type: "Constant"
                            attribute {
                              name: "value"
                              t {
                                data_type: 1
                                float_data: 2.0
                                name: "const_13"
                              }
                              type: TENSOR
                            }
                            domain: ""
                          }
                          node {
                            input: "const_13"
                            input: "ord_4"
                            output: "const_13_cast"
                            name: "n1"
                            op_type: "CastLike"
                            domain: ""
                          }
                          node {
                            input: "ord_4"
                            input: "const_13_cast"
                            output: "cond_14"
                            name: "n2"
                            op_type: "Equal"
                            domain: ""
                          }
                          node {
                            input: "cond_14"
                            output: "result_20"
                            name: "n3"
                            op_type: "If"
                            attribute {
                              name: "then_branch"
                              g {
                                node {
                                  input: "self_3"
                                  output: "result_15"
                                  name: "n0"
                                  op_type: "ReduceL2"
                                  attribute {
                                    name: "keepdims"
                                    type: INT
                                    ref_attr_name: "keepdim"
                                  }
                                  domain: ""
                                }
                                name: "thenGraph_20"
                                output {
                                  name: "result_15"
                                  type {
                                  }
                                }
                              }
                              type: GRAPH
                            }
                            attribute {
                              name: "else_branch"
                              g {
                                node {
                                  input: "ord_4"
                                  input: "self_3"
                                  output: "ord_float"
                                  name: "n0"
                                  op_type: "CastLike"
                                  domain: ""
                                }
                                node {
                                  input: "self_3"
                                  input: "ord_float"
                                  output: "self_pow"
                                  name: "n1"
                                  op_type: "Pow"
                                  domain: ""
                                }
                                node {
                                  input: "self_pow"
                                  output: "tmp_16"
                                  name: "n2"
                                  op_type: "ReduceSum"
                                  attribute {
                                    name: "keepdims"
                                    type: INT
                                    ref_attr_name: "keepdim"
                                  }
                                  domain: ""
                                }
                                node {
                                  output: "const_17"
                                  name: "n3"
                                  op_type: "Constant"
                                  attribute {
                                    name: "value"
                                    t {
                                      data_type: 1
                                      float_data: 1.0
                                      name: "const_17"
                                    }
                                    type: TENSOR
                                  }
                                  domain: ""
                                }
                                node {
                                  input: "const_17"
                                  input: "ord_float"
                                  output: "const_17_cast"
                                  name: "n4"
                                  op_type: "CastLike"
                                  domain: ""
                                }
                                node {
                                  input: "const_17_cast"
                                  input: "ord_float"
                                  output: "tmp_18"
                                  name: "n5"
                                  op_type: "Div"
                                  domain: ""
                                }
                                node {
                                  input: "tmp_16"
                                  input: "tmp_18"
                                  output: "result_19"
                                  name: "n6"
                                  op_type: "Pow"
                                  domain: ""
                                }
                                name: "elseGraph_20"
                                output {
                                  name: "result_19"
                                  type {
                                  }
                                }
                              }
                              type: GRAPH
                            }
                            domain: ""
                          }
                          name: "elseGraph_18"
                          output {
                            name: "result_20"
                            type {
                            }
                          }
                        }
                        type: GRAPH
                      }
                      domain: ""
                    }
                    name: "elseGraph_13"
                    output {
                      name: "result_21"
                      type {
                      }
                    }
                  }
                  type: GRAPH
                }
                domain: ""
              }
              name: "elseGraph_11"
              output {
                name: "result_22"
                type {
                }
              }
            }
            type: GRAPH
          }
          domain: ""
        }
        name: "elseGraph_9"
        output {
          name: "result_23"
          type {
          }
        }
      }
      type: GRAPH
    }
    domain: ""
  }
  node {
    output: "int64_0_25"
    name: "n11"
    op_type: "Constant"
    attribute {
      name: "value"
      t {
        data_type: 7
        int64_data: 0
        name: "int64_0_25"
      }
      type: TENSOR
    }
    domain: ""
  }
  node {
    input: "int64_0_25"
    input: "self_rank"
    output: "int64_0_25_cast"
    name: "n12"
    op_type: "CastLike"
    domain: ""
  }
  node {
    input: "self_rank"
    input: "int64_0_25_cast"
    output: "cond_26"
    name: "n13"
    op_type: "Equal"
    domain: ""
  }
  node {
    input: "cond_26"
    output: "result_29"
    name: "n14"
    op_type: "If"
    attribute {
      name: "then_branch"
      g {
        node {
          input: "result_24"
          output: "result_27"
          name: "n0"
          op_type: "Squeeze"
          domain: ""
        }
        name: "thenGraph_27"
        output {
          name: "result_27"
          type {
          }
        }
      }
      type: GRAPH
    }
    attribute {
      name: "else_branch"
      g {
        node {
          input: "result_24"
          output: "result_28"
          name: "n0"
          op_type: "Identity"
          domain: ""
        }
        name: "elseGraph_27"
        output {
          name: "result_28"
          type {
          }
        }
      }
      type: GRAPH
    }
    domain: ""
  }
  opset_import {
    domain: ""
    version: 18
  }
  domain: "pkg.onnxscript.torch_lib"
}
functions {
  name: "Rank"
  input: "input"
  output: "return_val"
  node {
    input: "input"
    output: "tmp"
    name: "n0"
    op_type: "Shape"
    domain: ""
  }
  node {
    input: "tmp"
    output: "return_val"
    name: "n1"
    op_type: "Size"
    domain: ""
  }
  doc_string: "Take the rank of the input tensor."
  opset_import {
    domain: ""
    version: 18
  }
  domain: "pkg.onnxscript.torch_lib.common"
}
functions {
  name: "IsScalar"
  input: "input"
  output: "return_val"
  node {
    input: "input"
    output: "tmp"
    name: "n0"
    op_type: "Shape"
    domain: ""
  }
  node {
    input: "tmp"
    output: "tmp_0"
    name: "n1"
    op_type: "Size"
    domain: ""
  }
  node {
    output: "tmp_1"
    name: "n2"
    op_type: "Constant"
    attribute {
      name: "value_int"
      i: 0
      type: INT
    }
    domain: ""
  }
  node {
    input: "tmp_0"
    input: "tmp_1"
    output: "return_val"
    name: "n3"
    op_type: "Equal"
    domain: ""
  }
  doc_string: "Return whether the input has rank 0, or is a scalar."
  opset_import {
    domain: ""
    version: 18
  }
  domain: "pkg.onnxscript.torch_lib.common"
}

"""


onnx_model = onnx.ModelProto()
google.protobuf.text_format.Parse(onnx_model_text, onnx_model)

onnx_text = onnx.printer.to_text(onnx_model)
# print(onnx_text)
parsed = onnx.parser.parse_model(onnx_text)

parsed_text_proto = str(parsed)



d = difflib.Differ()
diff = d.compare(onnx_model_text.splitlines(), parsed_text_proto.splitlines())

print("\n".join(diff))

Note that the 'ord' field has both f and i

image

Full diff of the before and after textproto

- 
  ir_version: 8
  producer_name: "pytorch"
  producer_version: "2.2.0"
  graph {
    node {
      output: "_val_1"
-     name: "Constant_0"
      op_type: "Constant"
      attribute {
        name: "value_ints"
        ints: -1
        type: INTS
      }
-     doc_string: ""
?       ^^^^^  -

+     domain: ""
?       ^^

    }
    node {
      input: "input_0"
      input: "_val_1"
      output: "_val_2"
-     name: "Reshape_1"
      op_type: "Reshape"
      attribute {
        name: "allowzero"
        i: 0
        type: INT
      }
-     doc_string: ""
?       ^^^^^  -

+     domain: ""
?       ^^

    }
    node {
      input: "_val_2"
      output: "_val_3"
-     name: "_aten_linalg_vector_norm_no_dim_onnx_2"
      op_type: "_aten_linalg_vector_norm_no_dim_onnx"
      attribute {
        name: "keepdim"
        i: 0
        type: INT
      }
      attribute {
        name: "ord"
        f: 2.0
+       i: 2
        type: FLOAT
      }
-     doc_string: ""
      domain: "pkg.onnxscript.torch_lib"
    }
    name: "main_graph"
    input {
      name: "input_0"
      type {
        tensor_type {
          elem_type: 10
          shape {
          }
        }
      }
    }
    output {
      name: "_val_3"
      type {
        tensor_type {
          elem_type: 10
          shape {
          }
        }
      }
    }
    value_info {
      name: "_val_1"
      type {
        tensor_type {
          elem_type: 7
          shape {
            dim {
              dim_value: 1
            }
          }
        }
      }
    }
    value_info {
      name: "_val_2"
      type {
        tensor_type {
          elem_type: 10
          shape {
            dim {
              dim_value: 1
            }
          }
        }
      }
    }
  }
  opset_import {
    domain: "pkg.onnxscript.torch_lib"
    version: 1
  }
  opset_import {
    domain: ""
    version: 18
  }
  opset_import {
    domain: "pkg.onnxscript.torch_lib.common"
    version: 1
  }
  functions {
    name: "_aten_linalg_vector_norm_no_dim_onnx"
    input: "self"
    output: "result_29"
    attribute: "ord"
    attribute: "keepdim"
    node {
      input: "self"
      output: "tmp"
-     name: "n0"
      op_type: "Shape"
      domain: ""
    }
    node {
      input: "tmp"
      output: "self_rank"
-     name: "n1"
      op_type: "Size"
      domain: ""
    }
    node {
      output: "int64_0"
-     name: "n2"
      op_type: "Constant"
      attribute {
        name: "value"
        t {
          data_type: 7
          int64_data: 0
          name: "int64_0"
        }
        type: TENSOR
      }
      domain: ""
    }
    node {
      input: "int64_0"
      input: "self_rank"
      output: "int64_0_cast"
-     name: "n3"
      op_type: "CastLike"
      domain: ""
    }
    node {
      input: "self_rank"
      input: "int64_0_cast"
      output: "cond"
-     name: "n4"
      op_type: "Equal"
      domain: ""
    }
    node {
      input: "cond"
      output: "self_2"
-     name: "n5"
      op_type: "If"
      attribute {
        name: "then_branch"
        g {
          node {
            output: "int64_0_1d"
-           name: "n0"
            op_type: "Constant"
            attribute {
              name: "value"
              t {
                dims: 1
                data_type: 7
                int64_data: 0
                name: "int64_0_1d"
              }
              type: TENSOR
            }
            domain: ""
          }
          node {
            input: "self"
            input: "int64_0_1d"
            output: "self_0"
-           name: "n1"
            op_type: "Unsqueeze"
            domain: ""
          }
          name: "thenGraph_4"
          output {
            name: "self_0"
-           type {
-           }
          }
        }
        type: GRAPH
      }
      attribute {
        name: "else_branch"
        g {
          node {
            input: "self"
            output: "self_1"
-           name: "n0"
            op_type: "Identity"
            domain: ""
          }
          name: "elseGraph_4"
          output {
            name: "self_1"
-           type {
-           }
          }
        }
        type: GRAPH
      }
      domain: ""
    }
    node {
      input: "self_2"
      output: "self_3"
-     name: "n6"
      op_type: "Abs"
      domain: ""
    }
    node {
      output: "ord"
-     name: "n7"
      op_type: "Constant"
      attribute {
        name: "value_float"
        type: FLOAT
        ref_attr_name: "ord"
      }
      domain: ""
    }
    node {
      input: "ord"
      output: "ord_4"
-     name: "n8"
      op_type: "Cast"
      attribute {
        name: "to"
        i: 1
        type: INT
      }
      domain: ""
    }
    node {
      input: "ord_4"
      output: "cond_5"
-     name: "n9"
      op_type: "IsInf"
      attribute {
        name: "detect_negative"
        i: 0
        type: INT
      }
      attribute {
        name: "detect_positive"
        i: 1
        type: INT
      }
      domain: ""
    }
    node {
      input: "cond_5"
      output: "result_24"
-     name: "n10"
      op_type: "If"
      attribute {
        name: "then_branch"
        g {
          node {
            input: "self_3"
            output: "result"
-           name: "n0"
            op_type: "ReduceMax"
            attribute {
              name: "keepdims"
              type: INT
              ref_attr_name: "keepdim"
            }
            domain: ""
          }
          name: "thenGraph_9"
          output {
            name: "result"
-           type {
-           }
          }
        }
        type: GRAPH
      }
      attribute {
        name: "else_branch"
        g {
          node {
            input: "ord_4"
            output: "cond_6"
-           name: "n0"
            op_type: "IsInf"
            attribute {
              name: "detect_negative"
              i: 1
              type: INT
            }
            attribute {
              name: "detect_positive"
              i: 0
              type: INT
            }
            domain: ""
          }
          node {
            input: "cond_6"
            output: "result_23"
-           name: "n1"
            op_type: "If"
            attribute {
              name: "then_branch"
              g {
                node {
                  input: "self_3"
                  output: "result_7"
-                 name: "n0"
                  op_type: "ReduceMin"
                  attribute {
                    name: "keepdims"
                    type: INT
                    ref_attr_name: "keepdim"
                  }
                  domain: ""
                }
                name: "thenGraph_11"
                output {
                  name: "result_7"
-                 type {
-                 }
                }
              }
              type: GRAPH
            }
            attribute {
              name: "else_branch"
              g {
                node {
                  output: "const"
-                 name: "n0"
                  op_type: "Constant"
                  attribute {
                    name: "value"
                    t {
                      data_type: 1
                      float_data: 0.0
                      name: "const"
                    }
                    type: TENSOR
                  }
                  domain: ""
                }
                node {
                  input: "const"
                  input: "ord_4"
                  output: "const_cast"
-                 name: "n1"
                  op_type: "CastLike"
                  domain: ""
                }
                node {
                  input: "ord_4"
                  input: "const_cast"
                  output: "cond_8"
-                 name: "n2"
                  op_type: "Equal"
                  domain: ""
                }
                node {
                  input: "cond_8"
                  output: "result_22"
-                 name: "n3"
                  op_type: "If"
                  attribute {
                    name: "then_branch"
                    g {
                      node {
                        input: "self_3"
                        output: "self_bool"
-                       name: "n0"
                        op_type: "Cast"
                        attribute {
                          name: "to"
                          i: 9
                          type: INT
                        }
                        domain: ""
                      }
                      node {
                        input: "self_bool"
                        input: "self_3"
                        output: "self_0_1"
-                       name: "n1"
                        op_type: "CastLike"
                        domain: ""
                      }
                      node {
                        input: "self_0_1"
                        output: "result_9"
-                       name: "n2"
                        op_type: "ReduceSum"
                        attribute {
                          name: "keepdims"
                          i: 0
                          type: INT
                        }
                        domain: ""
                      }
                      name: "thenGraph_13"
                      output {
                        name: "result_9"
-                       type {
-                       }
                      }
                    }
                    type: GRAPH
                  }
                  attribute {
                    name: "else_branch"
                    g {
                      node {
                        output: "const_10"
-                       name: "n0"
                        op_type: "Constant"
                        attribute {
                          name: "value"
                          t {
                            data_type: 1
                            float_data: 1.0
                            name: "const_10"
                          }
                          type: TENSOR
                        }
                        domain: ""
                      }
                      node {
                        input: "const_10"
                        input: "ord_4"
                        output: "const_10_cast"
-                       name: "n1"
                        op_type: "CastLike"
                        domain: ""
                      }
                      node {
                        input: "ord_4"
                        input: "const_10_cast"
                        output: "cond_11"
-                       name: "n2"
                        op_type: "Equal"
                        domain: ""
                      }
                      node {
                        input: "cond_11"
                        output: "result_21"
-                       name: "n3"
                        op_type: "If"
                        attribute {
                          name: "then_branch"
                          g {
                            node {
                              input: "self_3"
                              output: "result_12"
-                             name: "n0"
                              op_type: "ReduceL1"
                              attribute {
                                name: "keepdims"
                                type: INT
                                ref_attr_name: "keepdim"
                              }
                              domain: ""
                            }
                            name: "thenGraph_18"
                            output {
                              name: "result_12"
-                             type {
-                             }
                            }
                          }
                          type: GRAPH
                        }
                        attribute {
                          name: "else_branch"
                          g {
                            node {
                              output: "const_13"
-                             name: "n0"
                              op_type: "Constant"
                              attribute {
                                name: "value"
                                t {
                                  data_type: 1
                                  float_data: 2.0
                                  name: "const_13"
                                }
                                type: TENSOR
                              }
                              domain: ""
                            }
                            node {
                              input: "const_13"
                              input: "ord_4"
                              output: "const_13_cast"
-                             name: "n1"
                              op_type: "CastLike"
                              domain: ""
                            }
                            node {
                              input: "ord_4"
                              input: "const_13_cast"
                              output: "cond_14"
-                             name: "n2"
                              op_type: "Equal"
                              domain: ""
                            }
                            node {
                              input: "cond_14"
                              output: "result_20"
-                             name: "n3"
                              op_type: "If"
                              attribute {
                                name: "then_branch"
                                g {
                                  node {
                                    input: "self_3"
                                    output: "result_15"
-                                   name: "n0"
                                    op_type: "ReduceL2"
                                    attribute {
                                      name: "keepdims"
                                      type: INT
                                      ref_attr_name: "keepdim"
                                    }
                                    domain: ""
                                  }
                                  name: "thenGraph_20"
                                  output {
                                    name: "result_15"
-                                   type {
-                                   }
                                  }
                                }
                                type: GRAPH
                              }
                              attribute {
                                name: "else_branch"
                                g {
                                  node {
                                    input: "ord_4"
                                    input: "self_3"
                                    output: "ord_float"
-                                   name: "n0"
                                    op_type: "CastLike"
                                    domain: ""
                                  }
                                  node {
                                    input: "self_3"
                                    input: "ord_float"
                                    output: "self_pow"
-                                   name: "n1"
                                    op_type: "Pow"
                                    domain: ""
                                  }
                                  node {
                                    input: "self_pow"
                                    output: "tmp_16"
-                                   name: "n2"
                                    op_type: "ReduceSum"
                                    attribute {
                                      name: "keepdims"
                                      type: INT
                                      ref_attr_name: "keepdim"
                                    }
                                    domain: ""
                                  }
                                  node {
                                    output: "const_17"
-                                   name: "n3"
                                    op_type: "Constant"
                                    attribute {
                                      name: "value"
                                      t {
                                        data_type: 1
                                        float_data: 1.0
                                        name: "const_17"
                                      }
                                      type: TENSOR
                                    }
                                    domain: ""
                                  }
                                  node {
                                    input: "const_17"
                                    input: "ord_float"
                                    output: "const_17_cast"
-                                   name: "n4"
                                    op_type: "CastLike"
                                    domain: ""
                                  }
                                  node {
                                    input: "const_17_cast"
                                    input: "ord_float"
                                    output: "tmp_18"
-                                   name: "n5"
                                    op_type: "Div"
                                    domain: ""
                                  }
                                  node {
                                    input: "tmp_16"
                                    input: "tmp_18"
                                    output: "result_19"
-                                   name: "n6"
                                    op_type: "Pow"
                                    domain: ""
                                  }
                                  name: "elseGraph_20"
                                  output {
                                    name: "result_19"
-                                   type {
-                                   }
                                  }
                                }
                                type: GRAPH
                              }
                              domain: ""
                            }
                            name: "elseGraph_18"
                            output {
                              name: "result_20"
-                             type {
-                             }
                            }
                          }
                          type: GRAPH
                        }
                        domain: ""
                      }
                      name: "elseGraph_13"
                      output {
                        name: "result_21"
-                       type {
-                       }
                      }
                    }
                    type: GRAPH
                  }
                  domain: ""
                }
                name: "elseGraph_11"
                output {
                  name: "result_22"
-                 type {
-                 }
                }
              }
              type: GRAPH
            }
            domain: ""
          }
          name: "elseGraph_9"
          output {
            name: "result_23"
-           type {
-           }
          }
        }
        type: GRAPH
      }
      domain: ""
    }
    node {
      output: "int64_0_25"
-     name: "n11"
      op_type: "Constant"
      attribute {
        name: "value"
        t {
          data_type: 7
          int64_data: 0
          name: "int64_0_25"
        }
        type: TENSOR
      }
      domain: ""
    }
    node {
      input: "int64_0_25"
      input: "self_rank"
      output: "int64_0_25_cast"
-     name: "n12"
      op_type: "CastLike"
      domain: ""
    }
    node {
      input: "self_rank"
      input: "int64_0_25_cast"
      output: "cond_26"
-     name: "n13"
      op_type: "Equal"
      domain: ""
    }
    node {
      input: "cond_26"
      output: "result_29"
-     name: "n14"
      op_type: "If"
      attribute {
        name: "then_branch"
        g {
          node {
            input: "result_24"
            output: "result_27"
-           name: "n0"
            op_type: "Squeeze"
            domain: ""
          }
          name: "thenGraph_27"
          output {
            name: "result_27"
-           type {
-           }
          }
        }
        type: GRAPH
      }
      attribute {
        name: "else_branch"
        g {
          node {
            input: "result_24"
            output: "result_28"
-           name: "n0"
            op_type: "Identity"
            domain: ""
          }
          name: "elseGraph_27"
          output {
            name: "result_28"
-           type {
-           }
          }
        }
        type: GRAPH
      }
      domain: ""
    }
    opset_import {
      domain: ""
      version: 18
    }
    domain: "pkg.onnxscript.torch_lib"
  }
  functions {
    name: "Rank"
    input: "input"
    output: "return_val"
    node {
      input: "input"
      output: "tmp"
-     name: "n0"
      op_type: "Shape"
      domain: ""
    }
    node {
      input: "tmp"
      output: "return_val"
-     name: "n1"
      op_type: "Size"
      domain: ""
    }
-   doc_string: "Take the rank of the input tensor."
    opset_import {
      domain: ""
      version: 18
    }
    domain: "pkg.onnxscript.torch_lib.common"
  }
  functions {
    name: "IsScalar"
    input: "input"
    output: "return_val"
    node {
      input: "input"
      output: "tmp"
-     name: "n0"
      op_type: "Shape"
      domain: ""
    }
    node {
      input: "tmp"
      output: "tmp_0"
-     name: "n1"
      op_type: "Size"
      domain: ""
    }
    node {
      output: "tmp_1"
-     name: "n2"
      op_type: "Constant"
      attribute {
        name: "value_int"
        i: 0
        type: INT
      }
      domain: ""
    }
    node {
      input: "tmp_0"
      input: "tmp_1"
      output: "return_val"
-     name: "n3"
      op_type: "Equal"
      domain: ""
    }
-   doc_string: "Return whether the input has rank 0, or is a scalar."
    opset_import {
      domain: ""
      version: 18
    }
    domain: "pkg.onnxscript.torch_lib.common"
  }

コントリビューターガイド