Source: https://ocw.mit.edu/courses/6-251j-introduction-to-mathematical-programming-fall-2009/caaa61d752a49c7564f2c3b0755e80e3_MIT6_251JF09_rec02.pdf