*!Author: P. Wilner Jeanty
*!Date: January 17, 2010
program define spmlreg_sac
	version 11.0
	args lnf $spmlreg_ARGS
	tempvar L0 L1 L2 L3 rhowy
	if $spmlreg_w1==0 {
		qui gen double `rhowy'=`rho'*wy_`e(depvar)'
		qui gen double `L0'=`rho'*spmlreg_eigv
		qui gen double `L3'= `rho'*`lambda'*spmlreg_w2w2y
	}
	else {
		qui gen double `rhowy'=`rho'*spmlreg_w1y
		qui gen double `L0'=`rho'*spmlreg_eigv1
		qui gen double `L3'= `rho'*`lambda'*spmlreg_w2w1y
	}
	qui gen double `L1'=`lambda'*spmlreg_eigv
	qui gen double `L2'=`lambda'*wy_`e(depvar)'
	forv i=1/$spmlreg_nv {
        	tempvar X`i' XX`i'
        	qui gen double `X`i''=`beta`i''*`:word `i' of `:colnames(spmlreg_matols)''
        	local LIST1 "`LIST1'`X`i''-"
        	qui gen double `XX`i''=`lambda'*`beta`i''*spmlreg_wx`i'
        	local LIST2 "`LIST2'`XX`i''+"
	}
	qui replace `lnf'=ln(1-`L0') + ln(1-`L1')-0.5*ln(2*_pi)-0.5*ln(`sigma'^2)-  ///
                (0.5/(`sigma'^2))*((`e(depvar)' -`rhowy' - `L2' + `L3' -`LIST1'   ///
                `beta0'+`LIST2'`lambda'*`beta0')^2) if $ML_samp==1

end