This repository is the implementation of Amortized Synthesis of Constrained Configurations Using a Differentiable Surrogate, NeurIPS 2021, Spotlight.
@InProceedings{amorsyn,
title={{Amortized Synthesis of Constrained Configurations Using a Differentiable Surrogate}},
author={Sun, Xingyuan and Xue, Tianju and Rusinkiewicz, Szymon and Adams, Ryan P},
booktitle={Advances in Neural Information Processing Systems (NeurIPS)},
year={2021}
}
There are 3 folders:
extruder_path
contains the code to generate synthetic data for case study extruder path planning,soft_robot
contains the code to generate synthetic data for case study constrained soft robot inverse kinematics, which is developed from AmorFEA,amortized_synthesis
contains the code of our amortized synthesis algorithm.
To set up the Python environment using conda
on Ubuntu/macOS:
git clone git@github.com:xingyuansun/amorsyn.git # clone the code repository
cd amorsyn
conda create -n amorsyn python=3.8
conda activate amorsyn
conda install -c conda-forge fenics # install dependencies
conda install -c conda-forge dolfin-adjoint
conda install pytorch torchvision -c pytorch
pip install matplotlib
pip install tqdm
pip install scipy
pip install ruamel.yaml
pip install tensorboard
pip install meshio
pip install extruder_path/segment_intersection # install the local library
echo "def get_repo_dir():" > repo_dir.py # write repo directory to `repo_dir.py`
echo " return '$PWD'" >> repo_dir.py
Besides, please add the path to this repository to PYTHONPATH
before executing any Python script:
export PYTHONPATH=$PYTHONPATH:$PWD
If you would like to generate your own dataset or evaluate your trained model for extruder path planning,
please download the simulator using the following link and compile it according to its README file:
3D printing simulator.
Make sure to put the path to the 3D printing simulator in the
get_exec_file_path
function in extruder_path/yaml_executor.py
.
You may directly download the pre-generated datasets using the following links, unzip them,
and put them in the data
folder:
carbon fiber dataset (data/carbon-fiber
),
Kevlar dataset (data/kevlar
).
mkdir data
cd data
wget https://amorsyn.cs.princeton.edu/carbon-fiber.zip
wget https://amorsyn.cs.princeton.edu/kevlar.zip
unzip carbon-fiber.zip
unzip kevlar.zip
rm carbon-fiber.zip
rm kevlar.zip
Please set up the simulator first (check "Bullet 3D printing simulator"). To generate extruder paths, run
python yaml_generator.py
in the extruder_path
folder, with num_samples
set to the number of paths you need.
The script will automatically generate config files for the simulator for both carbon fiber and Kevlar.
To run the simulator on the generated extruder paths, run
python yaml_executor.py
in the extruder_path
folder.
You may have to run it multiple times for different materials,
each time specifying a material (carbon-fiber
or kevlar
).
Use amortized_synthesis/train.py
and amortized_synthesis/test.py
(make sure you have Bullet 3D printing simulator set up),
which creates a new folder under amortized_synthesis/runs
, named by timestamp.
The folder contains:
opt.json
: config of this run,*.pt
(when runningtrain.py
): saved PyTorch model, numbered by epoch numbers,results
(when runningtest.py
): results on all test samples, with a summary at the end.
In the following, we use carbon fiber as an example, and you may change it to Kevlar.
Training:
python train.py --task 3d-printing --model_name decoder --mlp_hidden_sizes 500 200 100 50 25 --batch_size 1 --train_val_test_split 9000 500 500 --device 'cpu' --pt_material carbon-fiber --num_epochs 10 --learning_rate_decay 0.95
Training:
python train.py --task 3d-printing --model_name encoder --mlp_hidden_sizes 500 200 100 50 25 --batch_size 1 --train_val_test_split 9000 500 500 --device 'cpu' --smooth_weight {} --pt_material carbon-fiber --num_epochs 10 --trained_decoder_path {} --learning_rate_decay 0.95
with your own smooth_weight
and trained_decoder_path
.
Evaluation:
python test.py --task 3d-printing --model_name encoder --mlp_hidden_sizes 500 200 100 50 25 --batch_size 1 --train_val_test_split 9000 500 500 --device 'cpu' --pt_material carbon-fiber --trained_model_path {} --pool_size 16
with your own trained_model_path
.
Training:
python train.py --task 3d-printing --model_name baseline --mlp_hidden_sizes 500 200 100 50 25 --batch_size 1 --train_val_test_split 9000 500 500 --device 'cpu' --smooth_weight {} --pt_material carbon-fiber --num_epochs 10 --learning_rate_decay 0.95
with your own smooth_weight
.
Evaluation:
python test.py --task 3d-printing --model_name baseline --mlp_hidden_sizes 500 200 100 50 25 --batch_size 1 --train_val_test_split 9000 500 500 --device 'cpu' --pt_material carbon-fiber --trained_model_path {} --pool_size 16
with your own trained_model_path
.
Training: we need a trained decoder.
Evaluation:
python test.py --task 3d-printing --model_name optimizer --mlp_hidden_sizes 500 200 100 50 25 --batch_size 1 --train_val_test_split 9000 500 500 --device 'cpu' --pool_size 16 --smooth_weight {} --pt_material carbon-fiber --trained_model_path {} --bfgs_gtol 1e-7
with your own smooth_weight
and trained_model_path
.
Pre-trained models of extruder path planning can be downloaded from here. Note that we provide 3 runs with different random initializations of the neural network.
You may directly download the pre-generated dataset using the following link, unzip it,
and put it in the data
folder:
Soft robot dataset (data/soft-robot
).
mkdir data
cd data
wget https://amorsyn.cs.princeton.edu/soft-robot.zip
unzip soft-robot.zip
rm soft-robot.zip
If you would like to generate your own dataset, run
python data_generator.py
in the soft_robot
folder, with num_dp
set to the number of data samples needed.
You may run it multiple times/simultaneously.
Similarly, use amortized_synthesis/train.py
and amortized_synthesis/test.py
.
Training:
python train.py --task soft-robot --model_name decoder --mlp_hidden_sizes 128 256 128 --batch_size 8 --train_val_test_split 36000 3000 1000 --device 'cpu' --num_epochs 200 --learning_rate_decay 0.98
Training:
python train.py --task soft-robot --model_name encoder --mlp_hidden_sizes 128 256 128 --batch_size 8 --train_val_test_split 36000 3000 1000 --device 'cpu' --trained_decoder_path {} --rb_has_obstacle --rb_obstacle_penalty_weight 0.5 --smooth_weight {} --num_epochs 200 --learning_rate_decay 0.98
with your own trained_decoder_path
and smooth_weight
.
Evaluation:
python test.py --task soft-robot --model_name encoder --mlp_hidden_sizes 128 256 128 --batch_size 1 --train_val_test_split 36000 3000 1000 --device 'cpu' --trained_model_path {} --rb_has_obstacle
with your own trained_model_path
.
Training:
python train.py --task soft-robot --model_name baseline --mlp_hidden_sizes 128 256 128 --batch_size 8 --train_val_test_split 36000 3000 1000 --device 'cpu' --rb_has_obstacle --rb_obstacle_penalty_weight 0.5 --smooth_weight {} --num_epochs 200 --learning_rate_decay 0.98
with your own smooth_weight
.
Evaluation:
python test.py --task soft-robot --model_name baseline --mlp_hidden_sizes 128 256 128 --batch_size 1 --train_val_test_split 36000 3000 1000 --device 'cpu' --trained_model_path {} --rb_has_obstacle
with your own trained_model_path
.
Training: we need a trained decoder.
Evaluation:
python test.py --task soft-robot --model_name optimizer --mlp_hidden_sizes 128 256 128 --batch_size 1 --train_val_test_split 36000 3000 1000 --device 'cpu' --trained_model_path {} --bfgs_gtol 1e-7 --single_process_optimization --rb_has_obstacle --rb_obstacle_penalty_weight 0.5 --smooth_weight {}
with your own trained_model_path
and smooth_weight
.
Pre-trained models of constrained soft robot inverse kinematics can be downloaded from here. Note that we provide 3 runs with different random initialization of the neural network.
This repository is licensed under the MIT license.