Introduction to Nonsmooth Optimization: Theory, Practice and Software