gradient abstraction