在 PyDrake 中使用 autodiff 时无法检查不可行的约束
Unable to check infeasible constraints when using autodiff in PyDrake
我正在使用 SNOPT 解决 PyDrake 中的一个问题,我得到了看起来合理的解决方案,但是当我这样做时 result.is_success()
它返回 False
,所以我希望调查它为什么认为问题没有解决。我假设我在某处有一个不好的约束,所以我用下面的代码来做到这一点:
result = mp.Solve(prog)
if not result.is_success():
print("INFEASIBLE:")
infeasible = result.GetInfeasibleConstraints(prog)
for c in infeasible:
print(c)
但是,它在调用 result.GetInfeasibleConstraints(prog)
时退出并出现以下错误:
Traceback (most recent call last):
File "test_drake_distribution.py", line 250, in <module>
infeasible = result.GetInfeasibleConstraints(prog)
File "/home/adam/.miniconda3/envs/drake/lib/python3.6/site-packages/pydrake/solvers/_mathematicalprogram_extra.py", line 34, in _check_array_type
f"{var_name} must be of scalar type {expected_name}, but unable "
RuntimeError: PyFunctionConstraint: Output must be of scalar type float, but unable to infer scalar type.
它说的是真的,因为我的约束函数利用了 Drake 中的自动差异功能,所以它们返回的数组 dtype=AutoDiffXd
。如果是这种情况,是否意味着我不能使用约束不可行性检查器?关于在我使用 autodiff 时能够检查不可行约束的任何建议?
我假设您使用 python 函数编写约束。我建议写这个 python 函数来处理 float 和 autodiffxd,所以像这样
def my_evaluator(x: np.ndarray):
if x.dtype == np.object:
# This is the autodiff case
elif x.dtype == np.float:
# This is the float case
我正在使用 SNOPT 解决 PyDrake 中的一个问题,我得到了看起来合理的解决方案,但是当我这样做时 result.is_success()
它返回 False
,所以我希望调查它为什么认为问题没有解决。我假设我在某处有一个不好的约束,所以我用下面的代码来做到这一点:
result = mp.Solve(prog)
if not result.is_success():
print("INFEASIBLE:")
infeasible = result.GetInfeasibleConstraints(prog)
for c in infeasible:
print(c)
但是,它在调用 result.GetInfeasibleConstraints(prog)
时退出并出现以下错误:
Traceback (most recent call last):
File "test_drake_distribution.py", line 250, in <module>
infeasible = result.GetInfeasibleConstraints(prog)
File "/home/adam/.miniconda3/envs/drake/lib/python3.6/site-packages/pydrake/solvers/_mathematicalprogram_extra.py", line 34, in _check_array_type
f"{var_name} must be of scalar type {expected_name}, but unable "
RuntimeError: PyFunctionConstraint: Output must be of scalar type float, but unable to infer scalar type.
它说的是真的,因为我的约束函数利用了 Drake 中的自动差异功能,所以它们返回的数组 dtype=AutoDiffXd
。如果是这种情况,是否意味着我不能使用约束不可行性检查器?关于在我使用 autodiff 时能够检查不可行约束的任何建议?
我假设您使用 python 函数编写约束。我建议写这个 python 函数来处理 float 和 autodiffxd,所以像这样
def my_evaluator(x: np.ndarray):
if x.dtype == np.object:
# This is the autodiff case
elif x.dtype == np.float:
# This is the float case