Skip to content
Snippets Groups Projects
elasticDemand.gms 2.36 KiB
$ondotl

Set i(*);
ALIAS (i,j);

PARAMETER
  alpha(i)     Parameter of MAIDADS
  beta(i)      Parameter of MAIDADS
  kappa        Parameter of MAIDADS
  delta(i)     Parameter of MAIDADS
  tau(i)       Parameter of MAIDADS
  omega        Parameter of MAIDADS
  previousU
  previousSubs(i)
  previousDisc(i)
;

$gdxin %gdx_parameters% 
$load i, alpha, beta, kappa, delta, tau, omega
$gdxin

VARIABLE
  u                  Utility;

POSITIVE VARIABLE
  DiscretionaryC(i)  Discretionary consumption
  SubsistenceC(i)    Subsistence consumption
  w(i)               Budget share by commodity
;

PARAMETER
  p(i)               Price,
  m                  GDP per capita
  maxIncomePropFoodSpend	Maximum proportion of income spent on food,
  desiredConsumpFactor	Affordable consumption used when below minimum subsistence level 
;

$gdxin %gdx_prices_and_gdp% 
*$gdxin "../../GAMS/PricesAndGdp.gdx" 
$load maxIncomePropFoodSpend, p=price, m=gdp_pc, previousU, previousSubs, previousDisc
$gdxin

display maxIncomePropFoodSpend, p, m, alpha, beta, kappa, delta, tau, omega;

w.up(j) = 1;

EQUATIONS
  EQ_w(i)      "Definition of budget share"
  EQ_u         "Implicit definition of utility"
  EQ_DiscretionaryC(i)
  EQ_SubsistenceC(j)
;

EQ_w(j)..
  w(j) =e= (SubsistenceC(j)+DiscretionaryC(j))*p(j)/m;

EQ_u..
  sum(i, (alpha(i)+beta(i)*exp(u))/(1+exp(u))*log(DiscretionaryC(i)))-u =e= kappa ;

EQ_DiscretionaryC(i)$p(i).. DiscretionaryC(i) =e=
    [(alpha(i)+beta(i)*exp(u))/(1+exp(u))]/p(i)*
    [m-sum(j,p(j)*SubsistenceC(j))];

EQ_SubsistenceC(j)..
  SubsistenceC(j) =e= (delta(j)+tau(j)*exp(omega*u))/(1+exp(omega*u));

model MAIDADS_Sim "MAIDADS model for simulation" /
      EQ_w.w
      EQ_u.u
      EQ_DiscretionaryC.DiscretionaryC
      EQ_SubsistenceC.SubsistenceC
 / ;

MAIDADS_Sim.optfile = 1;
option cns=path;

desiredConsumpFactor =  m * maxIncomePropFoodSpend / sum(i, p(i)*delta(i));
display desiredConsumpFactor;

Scalar ms 'model status', ss 'solve status'; 
u = previousU;

If (desiredConsumpFactor > 1.0,
	SubsistenceC(i)  = previousSubs(i);
	DiscretionaryC(i) = previousDisc(i);
	DiscretionaryC.LO(i) = 1E-11;
	SubsistenceC.LO(j) = 0;
	w(j) = (SubsistenceC(j)+DiscretionaryC(j))*p(j)/m;
	desiredConsumpFactor = 1;
	
	solve MAIDADS_Sim using cns;
	
	ms=MAIDADS_Sim.modelstat;
	ss=MAIDADS_Sim.solvestat;

else
	SubsistenceC(i)  = delta(i) * desiredConsumpFactor;
);

display SubsistenceC.l, DiscretionaryC.l;