关于稀疏数据结构snode.deactivate_all()报错疑问

老师们,求问下;
b_snode=ti.root.dense(ti.i, 3).bitmasked(ti.j,20)
这样定义的稀疏数据结构,在调用b_snode.deactivate_all()方法时报错是什么原因?

RuntimeError: [D:/a/taichi/taichi/taichi/transforms/type_check.cpp:visit@192] [$15] S5 has 1 indices. Indexed with 2.

可以麻烦贴一下完整可复现这个问题的代码吗? :grinning:

很简单其实主要就上面那两行

import taichi as ti
ti.init(arch=ti.cuda)

edg_cout=ti.field(dtype=ti.i32 )
b_snode=ti.root.pointer(ti.i, 3).bitmasked(ti.j,20)
b_snode.place(edg_cout)
b_snode.deactivate_all()

另外试了这样也不行

b_snode=ti.root.pointer(ti.i, 3)
b_snode.bitmasked(ti.j,20).place(edg_cout)
b_snode.deactivate_all()

好像ti.deactivate_all_snodes()就可以,

今天又遇到另外一个问题 :joy:,关于ti.static的
简化过得demo代码如下:
主要是第11行使用ti.static就得不到正确结果,去掉就有正确的print输出;
(另外这代码里用range-for loop而没用struct-for loop来遍历稀疏数据,主要是struct-for loop不支持嵌套,要报错啊 :weary:

import taichi as ti
import numpy as np

ti.init(arch=ti.cuda)

vex_conn_field = ti.field(dtype=ti.i32)
ti.root.pointer(ti.ij, (10, 20)).place(vex_conn_field)
@ti.func
def vex_is_conn( v1id, v2id):
   rst = False
   for i in ti.static(range(20)):
   # for i in range(20):
       if  vex_conn_field[v2id - 1, i] == v1id:
           rst = True
           break
   return rst
@ti.func
def getCommonVertexNum(u,v):
   cnt = 0
   for i in ti.static(range(20)):
       it =vex_conn_field[u-1,i]
       if  it>0 and vex_is_conn(it,v):
           cnt += 1

   return cnt

@ti.func
def calVAndDeltaV(v1,v2):
    c=getCommonVertexNum(v1, v2)

    if c==2:
        print(v1,v2)

@ti.kernel
def cal_vdeltav( m:ti.i32):
    for i  in range(m):
      if vex_conn_field[i,0]>0:
         for j  in range(20):
             calVAndDeltaV(i+1, vex_conn_field[i,j])
@ti.kernel
def init(m:ti.i32,arr:ti.ext_arr()):
    for i in range(m):
        for j in ti.static(range(20)):
           if arr[i,j]>0:
               vex_conn_field[i,j]=arr[i,j]



conn_vals=np.array([[2, 3, 4, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [1, 3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [1, 2, 4, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [1, 2, 3, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [1, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])

init(6,conn_vals)
cal_vdeltav(6)

好像dense和bitmaske不能被deactivate,只有pointer可以。可能应该要这样写:

edg_cout=ti.field(dtype=ti.i32 )
b_snode=ti.root.pointer(ti.i, 3)
b_snode_2=b_snode.bitmasked(ti.j,20)
b_snode_2.place(edg_cout)
b_snode.deactivate_all()

试了下还是报这个错

试了一下,把 j 改成 i 就行了。两层都是 i 或者都是 j 就行。

嗯,这样是不报错了,但是数据结构是一维的了,这样也没法用了,现在我用的b_snode=ti.root.pointer(ti.ij, (3,20))形式的了,