Hi Praveen, You can try the IIS option. If there are linear constraints that are inconsistent, the solver will find them. In your case, the output I get from: solve with NLP / iis=on; expand / iis; is ... Constraint mn_CON[APR]: 802.70742685 <= mn[APR] <= 835.47099529 Constraint mn_CON[JUL]: 0.6282405263 <= mn[JUL] <= 0.6538829968 I also added new constants so that you can control the deltas over several solves and see what the minimal feasible range is, e.g.: num tgtDelta init .02; con mn_CON {m in MTH_I}: MTH_VOL_TGT * (1 - tgtDelta) <= mn <= MTH_VOL_TGT * (1 + tgtDelta) ; I have also introduced two intermediary sets so that your code can be a little bit shorter and you only define X and Y variables with the price is non-missing: set RMCCMM = {RGN_I, MTH_I, CNTRY_I, CLS_I, MKT_I, MKTTYPE_I}; ... set RMCCMMwithPRICE = {<r,m,p,c,k,t> in RMCCMM: price[r,m,p,c,k,t] ~= .}; num dmdAndPriceDelta init 0.3; var x {<r,m,p,c,k,t> in RMCCMMwithPRICE} >= DMD[r,m,p,c,k,t] * (1 - dmdAndPriceDelta) <= DMD[r,m,p,c,k,t] * (1 + dmdAndPriceDelta); var y {<r,m,p,c,k,t> in RMCCMMwithPRICE} >= PRICE[r,m,p,c,k,t] * (1 - dmdAndPriceDelta) <= PRICE[r,m,p,c,k,t] * (1 + dmdAndPriceDelta); Here is the new complete (optmodel part only) listing: proc optmodel; /* declare index sets and read values from data sets*/ set <str> RGN_I; read data TABLE_RGN nomiss into RGN_I = [RGN]; set <str> MTH_I; read data TABLE_MN nomiss into MTH_I = [MTH]; set <str> CNTRY_I; read data TABLE_PS nomiss into CNTRY_I = [CNTRY]; set <str> CLS_I; read data TABLE_CM nomiss into CLS_I = [CLS]; set <str> MKT_I; read data TABLE_ND nomiss into MKT_I = [MKT]; set <str> MKTTYPE_I; read data TABLE_OT nomiss into MKTTYPE_I = [MKTTYPE]; set RMCCMM = {RGN_I, MTH_I, CNTRY_I, CLS_I, MKT_I, MKTTYPE_I}; /* declare parameters and read from data sets */ num DMD {RMCCMM}init .; read data TABLE1 nomiss into [RGN MTH CNTRY CLS MKT MKTTYPE] DMD; num PRICE {RMCCMM}init .; read data TABLE1 nomiss into [RGN MTH CNTRY CLS MKT MKTTYPE] PRICE; num RGN_VALUE_TGT {RGN_I}init .; read data RGN_TGT nomiss into RGN_I =[RGN] RGN_VALUE_TGT; num RGN_PRICE_TGT {RGN_I}init .; read data RGN_TGT nomiss into RGN_I =[RGN] RGN_PRICE_TGT; num MTH_VOL_TGT {MTH_I}init .; read data MTH_TGT nomiss into MTH_I =[MTH] MTH_VOL_TGT; /* test that the data is read*/ print RGN_VALUE_TGT RGN_PRICE_TGT; print MTH_VOL_TGT; /*print DMD PRICE; */ set RMCCMMwithPRICE = {<r,m,p,c,k,t> in RMCCMM: price[r,m,p,c,k,t] ~= .}; /* declare variables */ num dmdAndPriceDelta init 0.3; var x {<r,m,p,c,k,t> in RMCCMMwithPRICE} >= DMD[r,m,p,c,k,t] * (1 - dmdAndPriceDelta) <= DMD[r,m,p,c,k,t] * (1 + dmdAndPriceDelta); var y {<r,m,p,c,k,t> in RMCCMMwithPRICE} >= PRICE[r,m,p,c,k,t] * (1 - dmdAndPriceDelta) <= PRICE[r,m,p,c,k,t] * (1 + dmdAndPriceDelta); impvar z {rc in RGN_I} = sum{<r,m,p,c,k,t> in RMCCMMwithPRICE} x[r,m,p,c,k,t] * y[r,m,p,c,k,t]; impvar mn {mt in MTH_I} = sum{<r,m,p,c,k,t> in RMCCMMwithPRICE} x[r,m,p,c,k,t]; print x y z mn; /* define constraints */ num tgtDelta init .02; con mn_CON {m in MTH_I}: MTH_VOL_TGT * (1 - tgtDelta) <= mn <= MTH_VOL_TGT * (1 + tgtDelta) ; /* objective function */ var Error {RGN_I}; con Error_CON {r in RGN_I}: Error = z - if RGN_VALUE_TGT = . then 0 else RGN_VALUE_TGT ; min MSE = sum{r in RGN_I} Error **2; solve with nlp/iis=on; expand/iis; /*print x y mn z;*/ quit; As for how this would scale, it is always difficult to tell. The best thing to do is experiment. When the problem was feasible the small version was pretty quick, but 500K rows could be different. When I changed your impvar z and mn declarations to slice by RGN and MTH, I get feasible solutions. See if this makes sense in your application: impvar z {r in RGN_I} = sum{<(r),m,p,c,k,t> in RMCCMMwithPRICE} x[r,m,p,c,k,t] * y[r,m,p,c,k,t]; impvar mn {m in MTH_I} = sum{<r,(m),p,c,k,t> in RMCCMMwithPRICE} x[r,m,p,c,k,t];
... View more