*! version 2.0.0 09jul2009
*! author: Partha Deb
* version 1.1.0 25feb2009
* version 1.0.0 04feb2009

************************************************
*** ml for mixed logit                       ***
************************************************

program mtreatreg_mmlogit_lf
	version 10.1

	forvalues i=1/`=neq' {
		local L_g `"`L_g' g`i'"'
		local L_xbT `"`L_xbT' xbT`i'"'
	}

	forvalues j=1/`=neq' {
		forvalues i=`j'/`=neq' {
			local L_h `"`L_h' h`i'`j'"'
			local L_nH `"`L_nH' nH`i'`j'"'
		}
	}

	args todo b lnf g negH `L_g'

	tempvar lnL gi `L_xbT' `L_h' `L_nH'

	qui gen double `lnL'=.

	forvalues j=1/`=neq' {
		forvalues i=`j'/`=neq' {
			qui gen double `h`i'`j'' = .
		}
	}

	forvalues i=1/`=neq' {
		mleval `xbT`i'' = `b', eq(`i')
		local xbTnames `xbTnames' `xbT`i''
		local G `G' `g`i''
	}

	forvalues j=1/`=neq' {
		forvalues i=`j'/`=neq' {
			local H `H' `h`i'`j''
		}
	}

	mata: mtreatreg_mmlogit_lf("`lnL'","`G'","`H'" ///
		,"`xbTnames'","neq","nobs","sim",yT,_mtreatreg_rmat)

	mlsum `lnf' = `lnL'

	local k = colsof(`b')
	local c 1
	matrix `g' = J(1,`k',0)

	forvalues i = 1/`=neq' {
		mlvecsum `lnf' `gi' = `g`i'', eq(`i')
		matrix `g'[1,`c'] = `gi'
		local c = `c' + colsof(`gi')
	}

	forvalues j = 1/`=neq' {
		forvalues i = `j'/`=neq' {
			mlmatsum `lnf' `nH`i'`j'' = -`h`i'`j'', eq(`i',`j')
		}
	}

	// collect hessian terms into matrix
	local np = colsof(`b')
	local c 1
	matrix `negH' = J(`np',`np',.)
	
	forvalues j = 1/`=neq' {
		local r = `c'
		forvalues i = `j'/`=neq' {
			matrix `negH'[`r',`c'] = `nH`i'`j''
			if (`i'>`j') {
				matrix `negH'[`c',`r'] = `nH`i'`j'''
			}
			local r = `r' + rowsof(`nH`i'`j'')
		}
		local c = `c' + colsof(`nH`j'`j'')
	}

end