You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
2.4 KiB
71 lines
2.4 KiB
2 years ago
|
#!/usr/local/bin/python3
|
||
|
"""Script to generate a fixture of a box falling on a saw."""
|
||
|
|
||
|
import pathlib
|
||
|
|
||
|
from fixture_utils import *
|
||
|
|
||
|
DEFAULT_NCP_TIME_EPSILON = 1e-4 # or 0
|
||
|
DEFAULT_NCP_UPDATE_TYPE = "g_gradient" # linearize or g_gradient
|
||
|
DEFAULT_LCP_SOLVER = "lcp_newton"
|
||
|
|
||
|
NCP_UPDATE_TYPES = ["linearize", "g_gradient"]
|
||
|
LCP_SOLVERS = ["lcp_gauss_seidel", "lcp_mosek", "lcp_newton"]
|
||
|
|
||
|
|
||
|
def main():
|
||
|
"""Parse command-line arguments to generate the desired fixture."""
|
||
|
parser = argparse.ArgumentParser(
|
||
|
description="convert a barrier fixture to a NCP fixture")
|
||
|
parser.add_argument("input_path",
|
||
|
type=pathlib.Path,
|
||
|
help="input fixture to convert")
|
||
|
parser.add_argument("--time-epsilon",
|
||
|
type=float,
|
||
|
default=DEFAULT_NCP_TIME_EPSILON,
|
||
|
help="time epsilon used in the NCP STIV formulation")
|
||
|
parser.add_argument("--update-type",
|
||
|
choices=NCP_UPDATE_TYPES,
|
||
|
default=DEFAULT_NCP_UPDATE_TYPE,
|
||
|
help="updated type of the NCP")
|
||
|
parser.add_argument("--lcp-solver",
|
||
|
choices=LCP_SOLVERS,
|
||
|
default=DEFAULT_LCP_SOLVER,
|
||
|
help="solver for LCP")
|
||
|
parser.add_argument("--out-path",
|
||
|
metavar="path/to/output.json",
|
||
|
type=pathlib.Path,
|
||
|
default=None,
|
||
|
help="path to save the fixture")
|
||
|
args = parser.parse_args()
|
||
|
|
||
|
if args.out_path is None:
|
||
|
args.out_path = args.input_path.parent / (
|
||
|
args.input_path.stem + "-ncp" + args.input_path.suffix)
|
||
|
args.out_path.parent.mkdir(parents=True, exist_ok=True)
|
||
|
|
||
|
with open(args.input_path, "r") as input_fixture:
|
||
|
fixture = json.load(input_fixture)
|
||
|
|
||
|
fixture["scene_type"] = "volume_rb_problem"
|
||
|
fixture["ncp_solver"] = {
|
||
|
"max_iterations": 1000,
|
||
|
"do_line_search": False,
|
||
|
"solve_for_active_cstr": True,
|
||
|
"convergence_tolerance": -1,
|
||
|
"update_type": args.update_type,
|
||
|
"lcp_solver": args.lcp_solver
|
||
|
}
|
||
|
fixture["volume_constraint"] = {
|
||
|
"detection_method": "hash_grid",
|
||
|
"volume_epsilon": 1e-10,
|
||
|
"custom_hashgrid_cellsize": -1,
|
||
|
"time_epsilon": args.time_epsilon
|
||
|
}
|
||
|
|
||
|
save_fixture(fixture, args.out_path)
|
||
|
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
main()
|