--- license: apache-2.0 base_model: Qwen/Qwen2.5-Math-7B tags: - operations-research - optimization - linear-programming - integer-programming - lora - dpo - peft language: - en library_name: peft pipeline_tag: text-generation --- # OptimAI A 7B model fine-tuned to formulate and solve operations research problems (LP, IP, network flow, queueing, stochastic optimization). Built on Qwen2.5-Math-7B with a two-stage training pipeline: supervised fine-tuning (SFT) followed by Direct Preference Optimization (DPO). Distributed as a LoRA adapter (~646 MB). ## Intended use - Formulating optimization problems from natural-language descriptions - Solving small LPs, IPs, shortest-path, max-flow, knapsack, and similar OR problems end-to-end - Studying optimality conditions (KKT, dual formulations, sensitivity analysis) - Educational support for OR / optimization students Not a replacement for a real solver. Use this to set up the problem; verify with Gurobi, CPLEX, OR-Tools, or SciPy. ## Evaluation Evaluated on a held-out set of 60 OR problems across three categories: closed_form (n=20, auto-graded), open_conceptual (n=20, qualitative), long_form (n=20, qualitative). Closed-form numeric accuracy (final-answer grader, last 5 lines of completion only): | Model | Closed-form score | |---|---| | SFT-only | 48.3% | | SFT + DPO (this model) | 55.4% | DPO gives a +7.1 percentage point absolute improvement (~15% relative). Across 20 closed-form items, DPO improved 7, regressed 5, tied 8. ### Example: A01 (LP formulation) Prompt: "A factory produces A and B. A needs 2h labor, 3 units material, profit $5. B needs 1h labor, 2 units material, profit $4. Available: 100h labor, 200 units material. Maximize profit." Expected: x_A=40, x_B=20, profit=280 SFT (incorrect): "the optimal solution is x_A = 20 and x_B = 60, which gives a total profit of $340" DPO (correct): "the maximum profit occurs at the point (x_A, x_B) = (40, 20), yielding a total profit of $280" ## How to use from peft import PeftModel from transformers import AutoModelForCausalLM, AutoTokenizer import torch base = AutoModelForCausalLM.from_pretrained( "Qwen/Qwen2.5-Math-7B", torch_dtype=torch.bfloat16, device_map="auto", trust_remote_code=True, ) model = PeftModel.from_pretrained(base, "billwang37/WWang-Lab-OptimAI") tokenizer = AutoTokenizer.from_pretrained("billwang37/WWang-Lab-OptimAI", trust_remote_code=True) prompt = "Maximize 3x + 5y subject to x + 2y <= 14, 3x - y >= 0, x - y <= 2, x,y >= 0." inputs = tokenizer(prompt, return_tensors="pt").to(model.device) out = model.generate(**inputs, max_new_tokens=1024, do_sample=False) print(tokenizer.decode(out[0], skip_special_tokens=True)) ## Training details - Base model: Qwen/Qwen2.5-Math-7B - SFT data: ~6k OR problems with worked solutions - DPO data: ~1.2k preference pairs (chosen vs rejected) - Method: LoRA adapter via PEFT + TRL - Hardware: Single A100 (40 GB) on OU OSCER cluster - SFT runtime: ~4 hours (3 epochs) - DPO runtime: ~30 minutes ## Limitations - 60-problem eval set is small; numbers are a directional signal, not a definitive benchmark - Grader checks numbers, not reasoning - Can produce confidently wrong answers, especially on integer programming and combinatorial graph problems - LoRA adapter format; you must load Qwen2.5-Math-7B base separately - English-only ## License Apache-2.0, inherited from the base model.