def i_op(code, *args)
      options = if args.last.is_a?(Hash)
        args.pop
      else
        {}
      end

      args << options.merge(internal: true)
      Graph.get_default_graph.add_op!(code.to_sym, *args)
    end
def i_op(code, *args)
      options = if args.last.is_a?(Hash)
        args.pop
      else
        {}
      end

      args << options.merge(internal: true)
      Graph.get_default_graph.add_op!(code.to_sym, *args)
    end
same as op but with a marker that it was internal generated