pythondrake

Error setting find_lagrangian_options in CspaceFreePolytope.BinarySearchOptions()


I'm trying to use C-Iris certificates to shrink polytopes to their maximum volume that can be certified to be collision-free. In doing so, I am following the steps in the deepnote C-Iris implementation examples: link to notebook

There, the BinarySearchOptions are defined as follows:

# The options for when we search for new planes and positivity certificates given the polytopes
find_separation_certificate_given_polytope_options = CspaceFreePolytope.FindSeparationCertificateGivenPolytopeOptions()
find_separation_certificate_given_polytope_options.num_threads = -1
find_separation_certificate_given_polytope_options.verbose = False
find_separation_certificate_given_polytope_options.solver_options = solver_options
find_separation_certificate_given_polytope_options.ignore_redundant_C = False
find_separation_certificate_given_polytope_options.solver_id = solver_id

binary_search_options = CspaceFreePolytope.BinarySearchOptions()
binary_search_options.find_lagrangian_options = find_separation_certificate_given_polytope_options
binary_search_options.scale_min = 1e-3
binary_search_options.scale_max = 1.0
binary_search_options.max_iter = 5

In my code, I have modified the implementation to support a newer drake version (1.35.0):

# Separation certificate options
find_separation_certificate_given_polytope_options = CspaceFreePolytope.FindSeparationCertificateGivenPolytopeOptions()
find_separation_certificate_given_polytope_options.parallelism = Parallelism()
find_separation_certificate_given_polytope_options.verbose = False
find_separation_certificate_given_polytope_options.solver_options = solver_options
find_separation_certificate_given_polytope_options.ignore_redundant_C = False
find_separation_certificate_given_polytope_options.solver_id = solver_id

# Binary search configuration
binary_search_options = CspaceFreePolytope.BinarySearchOptions()
binary_search_options.find_lagrangian_options = find_separation_certificate_given_polytope_options
binary_search_options.scale_min = 1e-4
binary_search_options.scale_max = 1.0
binary_search_options.max_iter = 10
binary_search_options.convergence_tol = 1e-6

However, this error is returned:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
/tmp/ipykernel_57731/3587994562.py in <module>
     42 # Binary search configuration
     43 binary_search_options = CspaceFreePolytope.BinarySearchOptions()
---> 44 binary_search_options.find_lagrangian_options = find_separation_certificate_given_polytope_options
     45 binary_search_options.scale_min = 1e-4
     46 binary_search_options.scale_max = 1.0

AttributeError: can't set attribute

When I comment the find_lagrangian_options line, the BinarySearch() algorithm works, but it only finds significantly smaller regions than the original polytope (0.0024% of the volume), while the original regions are fairly accurate and such a small shrinkage could not be the maximum.

I was wondering if this result could be due to having removed the line binary_search_options.find_lagrangian_options = find_separation_certificate_given_polytope_options, and if so, what the proposed solution would be.


Solution

  • The find_lagrangian_options binding is currently "def_readonly" which means it cannot be re-assigned.

    Setting the nested options directly like binary_search_options.find_lagrangian_options.verbose = False should still work.