Decoding Linear Codes Via Optimization And Graph-Based Techniques