新版本Taichi ``` import taichi_glsl as tg ```报错

在0.8版本的时候用了taichi_glsl库函数,即import taichi_glsl as tg,没啥问题。今天更新了[Taichi] version 1.0.1,发现调用import taichi_glsl as tg报错了,报错如下:

[Taichi] version 1.0.1, llvm 10.0.0, commit 1c3619d9, win, python 3.9.7
[TaiGLSL] version 0.0.11
Traceback (most recent call last):
  File "D:\Taichi\B\20211227.py", line 11, in <module>
    import taichi_glsl as tg
  File "D:\Miniconda\envs\Taichi\lib\site-packages\taichi_glsl\__init__.py", line 10, in <module>
    from .hack import *
  File "D:\Miniconda\envs\Taichi\lib\site-packages\taichi_glsl\hack.py", line 24, in <module>
    _old_element_wise_binary = ti.Matrix.element_wise_binary
AttributeError: type object 'Matrix' has no attribute 'element_wise_binary'

代码如下:

import taichi      as ti
import taichi_glsl as tg

怎么办呢?

这样更新了一下

Installing collected packages: taichi
  Attempting uninstall: taichi
    Found existing installation: taichi 0.8.7
    Uninstalling taichi-0.8.7:
      Successfully uninstalled taichi-0.8.7
Successfully installed taichi-1.0.1

Hi @MierDa , 目前我们打算放弃 taichi_glsl 这个库。目前其中的很多功能,Taichi已经支持,可以考虑直接使用一些类 glsl的小函数。

可以看一下Taichi 1.0发布的Release notes: Release v1.0.0 · taichi-dev/taichi · GitHub 里面的 import taichi.math as tm 就是为了替代 taichi_glsl

有没有tichi.math的详细库函数说明呢,比如我想知道正负号判断,或者向量计算的一些算法,之前用的taichi-glsl,现在换成tichi.math函数。有没有文档说明,我去一对一的替换一下。

Hi @MierDa , 目前确实没有一个taichi_glsl 与 taichi.math 函数如何对应的详细说明。

目前Taichi math里面实现的函数可以参考:taichi/test_api.py at ed22d64f18eece247f8206f7fbba7236043c0e4b · taichi-dev/taichi · GitHub

具体的函数用法,可以参考Taichi API

我们后面也会完善一下文档。

奥,麻烦禹老师能不能帮我看看这2个函数在新版本太极怎么实现啊,我有点懵。tg.scalar.isnan,tg.vector.normalize,第一个是判断正负数的符号的,另外一个是向量归一化的。

tm.sign() = tg.scalar.isnan? tm.nornalize = tg.vector.normalize?看上去是这样吗?

isnan 是判断一个数字是不是 Nan。 sign 应该是判断符号的。后面的normalized 应该一样。

你可以搜一下Taichi API, 里面会有一些小示例。比如:ti.vector.normalized

>>> a = ti.Vector([3, 4], ti.f32)
>>> a.normalized()
[0.6, 0.8]

好的,我去找一找,thanks!

我觉得可以把之前glsl的这个函数搬进自己的def里面

@ti.func
def isnan(x):
    '''
    Determine whether the parameter is a number.

    For each element element i of the result, `isnan` returns True
    if x[i] is posititve or negative floating point NaN (Not a Number)
    and False otherwise.

    :parameter x:
        Specifies the value to test for NaN.

    :return:
        The return value is computed as `not (x >= 0 or x <= 0)`.
    '''
    return not (x >= 0 or x <= 0)