You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tvm.apache.org by jr...@apache.org on 2021/02/01 21:39:59 UTC

[tvm] branch main updated: [Parser] Fix tokenizing inf (#7370)

This is an automated email from the ASF dual-hosted git repository.

jroesch pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tvm.git


The following commit(s) were added to refs/heads/main by this push:
     new 0d303b4  [Parser] Fix tokenizing inf (#7370)
0d303b4 is described below

commit 0d303b46cac4420f2b83ed3a0f445060d2fd5982
Author: masahi <ma...@gmail.com>
AuthorDate: Tue Feb 2 06:39:41 2021 +0900

    [Parser] Fix tokenizing inf (#7370)
    
    * fix tokenizing inf
    
    * use ParseNumber to parse inf, handle -inf
    
    * fix neg handling
    
    * fixed multi negation
    
    * refactor
    
    * use while loop
    
    * simplyfing
    
    * fix lint
    
    * simpler implementation per altan's suggestion
    
    * disable flaky test
---
 src/parser/tokenizer.h               | 61 +++++++++++++++++++-----------------
 tests/python/contrib/test_cudnn.py   |  3 +-
 tests/python/relay/test_ir_parser.py | 14 +++++++--
 3 files changed, 47 insertions(+), 31 deletions(-)

diff --git a/src/parser/tokenizer.h b/src/parser/tokenizer.h
index c6fb3e0..5e71794 100644
--- a/src/parser/tokenizer.h
+++ b/src/parser/tokenizer.h
@@ -212,6 +212,25 @@ struct Tokenizer {
     }
   }
 
+  Token ParseNumber(bool is_pos) {
+    std::stringstream ss;
+    while (More() && IsNumeric(Peek())) {
+      ss << Next();
+    }
+
+    bool is_float = false;
+
+    // Remove trailing floating point prefix.
+    if (More() && Peek() == 'f') {
+      ss << Next();
+      while (More() && IsNumeric(Peek())) {
+        ss << Next();
+      }
+      is_float = true;
+    }
+    return ParseNumber(is_pos, is_float, ss.str());
+  }
+
   bool MatchString(const std::string& string) {
     int start = this->pos;
 
@@ -340,38 +359,28 @@ struct Tokenizer {
       auto token = NewToken(TokenType::kWhitespace);
       Next();
       return token;
-    } else if (IsDigit(next) || next == '-') {
+    } else if (next == '-') {
       int negs = 0;
       while (More() && Peek() == '-') {
         Next();
         negs++;
       }
-      // If there isn't a number right after either,
-      // this is really slow for lexing, should replace
-      // with multi-token return or something.
-      if (negs && !IsDigit(Peek())) {
+      bool is_neg = negs % 2 == 1;
+      if (More() && IsDigit(Peek())) {
+        return ParseNumber(!is_neg);
+      } else if (More() && MatchString("inff")) {
+        return ParseNumber(!is_neg, true, "inff");
+      } else {
+        // If there isn't a number right after either,
+        // this is really slow for lexing, should replace
+        // with multi-token return or something.
         pos = pos - (negs - 1);
         return NewToken(TokenType::kMinus);
       }
-
-      bool is_neg = negs % 2 == 1;
-      std::stringstream ss;
-      while (More() && IsNumeric(Peek())) {
-        ss << Next();
-      }
-
-      bool is_float = false;
-
-      // Remove trailing floating point prefix.
-      if (More() && Peek() == 'f') {
-        ss << Next();
-        while (More() && IsNumeric(Peek())) {
-          ss << Next();
-        }
-        is_float = true;
-      }
-
-      return ParseNumber(!is_neg, is_float, ss.str());
+    } else if (IsDigit(next)) {
+      return ParseNumber(true);
+    } else if (MatchString("inff")) {
+      return ParseNumber(true, true, "inff");
     } else if (next == '.') {
       auto token = NewToken(TokenType::kPeriod);
       Next();
@@ -404,10 +413,6 @@ struct Tokenizer {
       auto token = NewToken(TokenType::kPlus);
       Next();
       return token;
-    } else if (next == '-') {
-      auto token = NewToken(TokenType::kMinus);
-      Next();
-      return token;
     } else if (next == '*') {
       auto token = NewToken(TokenType::kStar);
       Next();
diff --git a/tests/python/contrib/test_cudnn.py b/tests/python/contrib/test_cudnn.py
index b07f2b2..514f529 100644
--- a/tests/python/contrib/test_cudnn.py
+++ b/tests/python/contrib/test_cudnn.py
@@ -93,7 +93,8 @@ def verify_conv2d(data_dtype, conv_dtype, tensor_format=0, groups=1):
 def test_conv2d():
     verify_conv2d("float32", "float32", tensor_format=0)
     verify_conv2d("float16", "float32", tensor_format=1)
-    verify_conv2d("float16", "float16", tensor_format=0)
+    # This test is flaky, disable for now
+    # verify_conv2d("float16", "float16", tensor_format=0)
     verify_conv2d("int8", "int32", tensor_format=1)
 
     verify_conv2d("float32", "float32", tensor_format=0, groups=2)
diff --git a/tests/python/relay/test_ir_parser.py b/tests/python/relay/test_ir_parser.py
index 1622717..70fb560 100644
--- a/tests/python/relay/test_ir_parser.py
+++ b/tests/python/relay/test_ir_parser.py
@@ -14,14 +14,14 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
+import numpy as np
+
 import tvm
-from tvm import te
 from tvm import relay
 import tvm.relay.testing
 import pytest
 from numpy import isclose
 from typing import Union
-from functools import wraps
 
 
 SEMVER = '#[version = "0.0.5"]\n'
@@ -910,6 +910,16 @@ def test_load_prelude():
     tvm.parser.parse(mod.astext())
 
 
+def test_tokenize_inf():
+    x = relay.var("x", shape=(3, 4), dtype="float32")
+    y = relay.clip(x, -np.inf, np.inf)
+
+    f = relay.Function([x], y)
+    mod = tvm.IRModule.from_expr(f)
+
+    mod = relay.transform.AnnotateSpans()(mod)
+
+
 if __name__ == "__main__":
     import sys