检查失败:GetOpGradFactory()->insert({op, func}).second MapAccumulate 的重复梯度

Check failed: GetOpGradFactory()->insert({op, func}).second Duplicated gradient for MapAccumulate

注: 我也在这里发布了这个问题 https://openmodelica.org/forum/default-topic/2570-linux-mint,-python-3-6-omc-server-is-down-please-start-it,我希望也能接触到更多有 tensorflow 经验的人。


我想在 Modelica 模型.

中使用 Tensorflow C++ API

为此,我用 C++ 创建了一个 class 来封装 Tensorflow 的细节。 此外,同一个文件包含 3 个函数(调用构造函数、析构函数和一个使用我 class 的现有实例的函数。这些函数在各自的头文件中声明 "extern"(仅当被读取时一个 C++ 编译器,我使用 __cplusplus 来区分)。

然后我使用 g++ 将所述文件(class 和 3 个函数)编译成 .so(我确实使用了 -fPIC 和 -shared)。在 /usr/lib 中,我创建了一个指向所述共享对象库的符号链接。

(为了完整起见,我应该提到我在使用 "LibraryDirectory" 和 "IncludeDirectory" 注释时遇到了问题。这就是为什么我创建符号链接到我将传递给 g++/ 的所有目录的内容gcc 使用 -L 和 -I(对于我的测试程序)直接进入 Model/Resources/Library 和 Model/Resources/Include 目录。因为没有更多的编译错误,我认为这没问题。)

现在奇怪的是:

我可以在用gcc编译的测试程序中使用这3个函数。我将它与所有 Tensorflow 库(以及上面的 libm、libstdc++ 和我的 .so)链接起来,它按预期工作。 但是,当我尝试在 a) Modelica Class(构造函数和析构函数)和 b) 使用 "external" 函数调用的函数中使用这 3 个函数时,它可以正常编译,但会出现运行时错误:


标准输出 | OM编辑信息 |

/tmp/OpenModelica_fred/OMEdit/TestCpp-port=44382-logFormat=xmltcp-override=startTime=0,stopTime=1,stepSize=0.002,tolerance=1e-6,solver=dassl,outputFormat=mat,variableFilter=。 * -r=TestCpp_res.mat -w -lv=LOG_STATS

标准输出 |错误 |

2018-11-22 10:47:00.153977: F tensorflow/core/framework/function.cc:1440] 检查失败:GetOpGradFactory()->insert({op, func}).second Duplicated gradient for地图累积

标准输出 |错误 |

进程崩溃

标准输出 |错误 |

进程崩溃
模拟过程失败。退出代码 6.


这怎么可能?我无法使用导致相同错误的 3 个函数在我的测试程序中执行任何操作。 OMC 生成的可执行文件可以对我不在我的测试程序中的它们做什么?

我找到了将 /usr/bin 中的符号链接 "clang" 指向 "gcc" 的解决方案。

有关说明,请查看 https://openmodelica.org/forum/default-topic/2570-linux-mint,-python-3-6-omc-server-is-down-please-start-it