/*************************************************************************/
/* SUBSIM: Subsidy Simulation Stata Toolkit  (Version 2.1)               */
/*************************************************************************/
/* Conceived by Dr. Araar Abdelkrim[1] and Dr. Paolo Verme[2]            */
/* World Bank Group (2012-2014)		                                 */
/* 									 */
/* [1] email : aabd@ecn.ulaval.ca                                        */
/* [1] Phone : 1 418 656 7507                                            */
/*									 */
/* [2] email : pverme@worldbank.org                                      */
/*************************************************************************/




#delim ;


capture program drop lore2;
program define lore2, rclass;
version 9.2;
args www yyy rank type min max gr ng;
quietly {;
preserve;
if ("`gr'" ~="") qui keep if (`gr'==gn1[`ng']);
if ("`rank'" == "-1") sort `yyy';
if ("`rank'" ~= "-1") sort `rank';
cap drop if `yyy'>=.;
cap drop if `www'>=.;
if (_N<101) qui set obs 101;
cap drop _ww;
cap drop _wy;
cap drop _lp;
if ("`type'"=="abs") {;
qui sum `yyy' [aw=`www'];
qui replace `yyy' = `yyy' - `r(mean)';
};
gen _ww = sum(`www');
gen _wy = sum(`www'*`yyy');
local suma = _wy[_N];
cap drop _pc;
qui sum _ww;
gen _pc=_ww/r(max);
if ("`type'"~="gen" | "`type'"~="abs")  qui sum `yyy' [aw=`www'];
if ("`type'"=="gen" | "`type'"=="abs")  qui sum `www';
local suma = `suma'/`r(sum)';
gen _lp=_wy/r(sum);
cap drop _finlp;
gen _finlp=0;
local i = 1;
local step=(`max'-`min')/100;
local i = 1;
forvalues j=0/100 {;
local pcf=`min'+`j' *`step';
local av=`j'+1;
while (`pcf' > _pc[`i']) {;
local i=`i'+1;
};
local ar=`i'-1;
if (`i'> 1) local lpi=_lp[`ar']+((_lp[`i']-_lp[`ar'])/(_pc[`i']-_pc[`ar']))*(`pcf'-_pc[`ar']);
if (`i'==1) local lpi=0+((_lp[`i'])/(_pc[`i']))*(`pcf');
qui replace _finlp=`lpi' in `av';
};
qui keep in 1/101;
set matsize 101;
cap matrix drop _xx;
mkmat _finlp, matrix (_xx);
restore;
};
end;

capture program drop clore;
program define clore, rclass;
version 9.2;
syntax varlist(min=1)[, HWeight(varname) HSize(varname) HGroup(varname)
 RANK(varname) MIN(real 0) MAX(real 1) type(string) DIF(string)
 LRES(int 0)  SRES(string) DGRA(int 1) SGRA(string) EGRA(string) POP(string) *];

if (`min' < 0) {;
 di as err "min should be >=0"; exit;
};
if (`max' > 1) {;
 di as err "max should be <=1"; exit;
};

if (`max' <= `min') {;
 di as err "max should be greater than min"; exit;
};
if ("`dif'"=="no") local dif="";

_get_gropts , graphopts(`options') ;
	local options `"`s(graphopts)'"';
	
if ("`hgroup'"!="") {;
preserve;
capture {;
local lvgroup:value label `hgroup';
if ("`lvgroup'"!="") {;
uselabel `lvgroup' , replace;
qui count;
forvalues i=1/`r(N)' {;
local tem=value[`i'];
local grlab`tem' = label[`i'];
};
};
};
restore;
preserve;
qui tabulate `hgroup', matrow(gn);
svmat int gn;
global indica=r(r);
tokenize `varlist';
};
if ("`hgroup'"=="") {;
tokenize `varlist';
_nargs    `varlist';
preserve;
};


qui svyset ;
if ( "`r(settings)'"==", clear") qui svyset _n, vce(linearized);
local hweight=""; 
cap qui svy: total `1'; 
local hweight=`"`e(wvar)'"';
cap ereturn clear; 


local l45=$indica+1;
local _cory  = "";
local label = "";
if ("`dif'"=="" & "`type'"~="gen" & "`type'"~="abs") local legline =  "45° line";
local cl=1;
if ("`rank'"!=""){;
forvalues k = 1/$indica {;
 local cl = `cl'*("``k''"!="`rank'");
};
};
if (($indica==1|"`hgroup'"~="") & "`rank'"=="`1'") local cl=2;
quietly{; 

local tit1="Lorenz"; 
local tit2="L"; 
local tit3="";
local tit4="";
if ("`rank'"!="" & `cl'!=2) {;
local tit1="Concentration";
local tit2="C";
if (`cl'==0 & "`hgroup'"=="" )  local tit1="Lorenz and Concentration";
};
if ("`type'"=="gen") {;
local tit3="Generalised ";
local tit4="G";
};
if ("`type'"=="abs") {;
local tit4="A";
local tit3="Absolute ";
};
if ("`dif'"=="c1") {;
local tit0="Difference Between ";
};
local tit_s="";
if ($indica>1) local tit_s="s";
local ftitle = "`tit0'`tit3'"+"`tit1' Curve`tit_s'";
local ytitle = "`tit4'`tit2'(p)";
if (`cl'==0 & "`hgroup'"=="") local ytitle = "`tit4'L(p) & `tit4'C(p)";
if (("`dif'"=="ds") & ("`type'"~="gen") & ("`type'"~="abs")  & ("`group'"=="") ) {;
local ftitle = "Deficit share curve`tit_s'";
local ytitle = "p - `tit4'`tit2'(p)";
if (`cl'==0 & "`hgroup'"=="" )  local ytitle = "p - `tit4'L(p) & p - `tit4'C(p) ";
};
if ("`dif'"=="c1")        local ytitle ="Difference";
if ("`ctitle'"  ~="")     local ftitle ="`ctitle'";
tempvar fw;
gen `fw'=1;
if ("`hsize'"   ~="")     replace `fw'=`fw'*`hsize';
if ("`hweight'" ~="")     replace `fw'=`fw'*`hweight';
local xtitle = "Percentiles (p)";
if ("`cytitle'"  ~="") local ytitle ="`cytitle'";
if ("`cxtitle'"  ~="") local xtitle ="`cxtitle'";

qui count;
if (r(N)<101) set obs 101;

if ("`dif'"=="" & "`type'"~="gen" & "`type'"~="abs" ) local _cory = "`_cory'" + " _corx";

if ("`hgroup'"!="") {;
if ("`rank'"=="") local rank = -1;
if ("`type'"=="") local type = "no";
if ("`min'"=="")  local min  = 0;
if ("`max'"=="")  local max  = 1;
lore2 `fw' `1' `rank' `type' `min' `max' ;
svmat float _xx;
cap matrix drop _xx;
rename _xx1 _corypop;
if ("`dif'"~="c1" & "`pop'" != "no") {;
local _cory  = "`_cory'" + " _corypop";
local legendp = "Population";
};
if ("`dif'"=="c1") {;
gen _dct=_cory;
replace _corypop=0;
local _cory  = "`_cory'" + " _corypop";
};
if ("`dif'"=="ds") local legendp = "Population";
};



forvalues k = 1/$indica {;
local _cory  = "`_cory'" + " _cory`k'";
local f=`k';
if ("`dif'"=="c1" & "`hgroup'"=="")  local f =`k'-1;
if ("`rank'"=="") local rank = -1;
if ("`type'"=="") local type = "no";
if ("`min'"=="")  local min  = 0;
if ("`max'"=="")  local max  = 1;
if ("`hgroup'"=="") {;
local label`f'  =  "``k''";

local titd="L";
if ("``k''"=="`rank'" & "`rank'"!="-1" ) local titd="L";
if ("``k''"!="`rank'" & "`rank'"!="-1")  local titd="C";
local titd1="L";
if ("`1'"=="`rank'" & "`rank'"!="-1") local titd1="L";
if ("`1'"!="`rank'" & "`rank'"!="-1") local titd1="C";

if (("`dif'"=="ds") & ("`type'"~="gen") & ("`type'"~="abs")  & ("`group'"=="")) local comt="p-";
if ("`dif'"=="c1") local comt="-`tit4'`titd1'_`1'";
if (`cl'==0 ) local adtit="`comt'`tit4'`titd'(p):";
local label`f'  ="`adtit' ``k''";

if ("`dif'"=="c1")  local adtit="`comt'";
if ("`dif'"=="c1")  local label`f'  = "`tit4'`titd'_``k'' `adtit'";
lore2 `fw' ``k'' `rank' `type' `min' `max' ;

};
if ("`hgroup'"!="") {;
local kk = gn1[`k'];
local k1 = gn1[1];
local label`f'  : label (`hgroup') `kk';
local labelg1   : label (`hgroup') `k1';
if ( "`label1'"   == "")   local labelg1    = "Group: `k1'";
if ( "`label`f''" == "")   local label`f'   = "Group: `kk'";
local titd="L";
if ("`1'"!="`rank'" & "`rank'"!="-1") local titd="C";
if ("`dif'"=="c1") {;
local adtit="`tit4'`titd'_`label`f'' - `tit4'`titd'_Population";
local label`f'  ="`adtit'";
};
lore2 `fw' `1' `rank' `type' `min' `max' `hgroup' `k';
};
svmat float _xx;
cap matrix drop _xx;
rename _xx1 _cory`k';
};
local m5=(`max'-`min')/5;
local step=(`max'-`min')/100;
gen _corx = `min'+(_n-1)*`step';
qui keep in 1/101;
if (("`dif'"=="ds") & ("`type'"~="gen") & ("`type'"~="abs") ) {;
foreach var of varlist _cory* {;
if ("`dif'"=="ds")  qui replace `var' =  _corx - `var';
};
};
 }; // end of quietly 

 
if ("`dif'"=="c1" ) {;
if ("`hgroup'"=="")  {;
gen _dct=_cory1;
};
forvalues k = 1/$indica {;
qui replace _cory`k'=_cory`k'-_dct;
};
local legline  ="Null horizontal line";
};

local legend legend(nodraw);
if ("`legline'" ~="")  local lg1="label(1 `legline') ";
                       local j=1;
if ("`legline'" ~="")  local j=2;
if ("`legendp'" ~="" )  local lg`j'="label(`j' `legendp') ";



local j=0; 
if ("`legline'" ~="" | "`legendp'"~="") local j=1; 
if ("`legline'" ~="" & "`legendp'"~="" ) local j=2;

forvalues i=1/$indica {;
local k=`j'+`i';
local lg`k'="label(`k' `label`i'') ";
};
	
if( `lres' == 1) {;
set more off;
list _corx _cory*;
};
quietly {;
if (`dgra'!=0) {; 
line `_cory'  _corx, 
legend(
`lg1'  `lg2'  `lg3' `lg4' 
`lg5'  `lg6'  `lg7' `lg8' 
`lg9'  `lg10'  `lg11' `lg12'
)
title(`ftitle')
ytitle(`ytitle')
xtitle(`xtitle') 
xscale(range(`min' `max'))
xlabel(`min'(`m5')`max', labsize(small))
ylabel(, labsize(small))
plotregion(margin(zero))
legend(size(small))
`options'		
;
};
cap matrix drop _xx;
if( "`sres'" ~= "") {;
keep _corx _cory*;
save `"`sres'"', replace;
};

if( "`sgra'" ~= "") {;
graph save `"`sgra'"', replace;
};

if( "`egra'" ~= "") {;
graph export `"`egra'"', replace;
};


restore;
}; // end of quietly
end;