I see your point and it seems fair.

In the current implementation, one solution I can think of is leveraging the 
`check` function:

```python
import tvm
from tvm import relay
from tvm.relay.dataflow_pattern import *

def check(pre):
    return (pre.args[0].checked_type.dtype == 'float32' and
            pre.args[1].checked_type.dtype == 'float32')

pat = is_op('add')(wildcard(), wildcard())

x = relay.var('x', shape=(10, 10), dtype='float32')
out = relay.add(x, x)
func = relay.Function([x], out)
mod = tvm.IRModule()
mod['main'] = func
mod = relay.transform.InferType()(mod)

print(pat.partition(mod['main'].body, check=check))
```

In short, you can implement a check function which does any forms of checking 
by looking into the matched subgraph.

In case you only need to know if matching or not and do not want to partition 
the graph, you can use `rewrite` to mimic the above functionality:

```python
import tvm
from tvm import relay
from tvm.relay.dataflow_pattern import *

class MyCallback(DFPatternCallback):
    def __init__(self):
        self.in1 = wildcard()
        self.in2 = wildcard()
        self.pattern = is_op('add')(self.in1, self.in2)
        self.match = False

    def callback(self, pre, post, node_map):
        if (node_map[self.in1][0].checked_type.dtype == 'float32' and
            node_map[self.in2][0].checked_type.dtype == 'float32'):
            self.match = True
        return post


x = relay.var('x', shape=(10, 10), dtype='float32')
out = relay.add(x, x)
func = relay.Function([x], out)
mod = tvm.IRModule()
mod['main'] = func
mod = relay.transform.InferType()(mod)

callback = MyCallback()
rewrite(callback, mod['main'].body)
print(callback.match)
```

When matching the pattern, `rewrite` will call the callback function for graph 
mutation. You can of course add any checks here and maintain your own "match" 
status.

While the above solutions are working, there are definitely imperfect, 
especially when the pattern is complex. In long term, we may want to support 
partial type matching in the pattern language.

cc @mbrookhart





---
[Visit 
Topic](https://discuss.tvm.ai/t/pattenlang-how-to-match-op-according-to-element-type-of-input-and-output/6846/6)
 to respond.

You are receiving this because you enabled mailing list mode.

To unsubscribe from these emails, [click 
here](https://discuss.tvm.ai/email/unsubscribe/718dc81d65775478e665cb3058af7b1e63259f83066a372388f9677b39fec672).

Reply via email to