/* subroutine lossfunction: loss function for nested optimization */
program synth_ll
        version 9.2
        args todo b lnf
        tempname loss loss_final loss_var bb VV H c A l u wsol
        *matrix list `b'

       /* get abs constrained weights and create V */
        mata: getabs("`b'")
        mat `bb' = matout
        mat `VV' = diag(`bb')

       /* Set up quadratic programming */
        mat `H' =  ($Xco)' * `VV' * $Xco
        mat `c' = (-1 * (($Xtr)' * `VV' * $Xco))'
        mat `A' = J(1,rowsof(`c'),1)
        mat `l' = J(rowsof(`c'),1,0)
        mat `u' = J(rowsof(`c'),1,1)

      /* Initialize read out matrix  */
      matrix `wsol' = `l'

     /* do quadratic programming step  */
      plugin call synthopt , `c' `H'  `A' $bslack `l' `u' $bd $marg $maxit $sig `wsol'

     /* Compute loss */
      mat `loss' = ($Ztr - $Zco * `wsol')' * ( $Ztr - $Zco * `wsol')
      qui svmat  double `loss' ,names(`loss_var')
      qui gen    double `loss_final' = -1 * `loss_var'
      qui mlsum  `lnf'  = `loss_final' if `loss_var' ~=.
*      sum    `loss_final'
      qui drop   `loss_final' `loss_var'
end /* main program ends finally */

/* subroutine quadratic programming (C++ plugin) */
program synthopt, plugin