add function & update optimize