add gradient generate function