void mlx_function()

in tools/MuPad/example_gmm_objective_mex_d2_K3.cxx [14:197]


void mlx_function(mlx_inputs& ins, mlx_outputs& outs)
{
    mlx_array<mlx_double> in(ins[0]);
    mlx_array<mlx_double> data(ins[1]);
    mlx_array<mlx_logical> jacobian(ins[2]);
    bool do_jacobian = jacobian[0];

    mlx_assert(in.cols == data.cols);
    mlx_assert(in.rows == 18);
    mlx_assert(data.rows == 5);

    mwSize out_rows = 1 + (do_jacobian ? 18 : 0);
    mwSize out_cols = 1 * in.cols;
    mlx_make_array<mlx_double> out(out_rows, out_cols);

    double const* in_ptr = in.data;
    double const* data_ptr = data.data;
    double* out_ptr = out.data;

    if (do_jacobian) {
        // const mwSize out_rows = 18 + 1;
        const mwSize out_step = (18 + 1) * 1;
        for(mwSize c_in = 0; c_in < in.cols; ++c_in,
                in_ptr += in.rows,
                data_ptr += data.rows,
                out_ptr += out_step) {
              /* inner loop do_jac=1 */
    double x1 = in_ptr[0];
    double x2 = in_ptr[1];
    double x3 = in_ptr[2];
    double x4 = in_ptr[3];
    double x5 = in_ptr[4];
    double x6 = in_ptr[5];
    double x7 = in_ptr[6];
    double x8 = in_ptr[7];
    double x9 = in_ptr[8];
    double x10 = in_ptr[9];
    double x11 = in_ptr[10];
    double x12 = in_ptr[11];
    double x13 = in_ptr[12];
    double x14 = in_ptr[13];
    double x15 = in_ptr[14];
    double x16 = in_ptr[15];
    double x17 = in_ptr[16];
    double x18 = in_ptr[17];
    double data1 = data_ptr[0];
    double data2 = data_ptr[1];
    double data3 = data_ptr[2];
    double data4 = data_ptr[3];
    double data5 = data_ptr[4];
    double t3 = data1-x4;
    double t14 = exp(x11);
    double t21 = t3*x12;
    double t22 = data2-x5;
    double t23 = t14*t22;
    double t2 = t21+t23;
    double t5 = data1-x6;
    double t15 = exp(x14);
    double t30 = t5*x15;
    double t31 = data2-x7;
    double t32 = t15*t31;
    double t4 = t30+t32;
    double t7 = data1-x8;
    double t16 = exp(x17);
    double t37 = t7*x18;
    double t38 = data2-x9;
    double t39 = t16*t38;
    double t6 = t37+t39;
    double t8 = x10*2.0;
    double t9 = exp(t8);
    double t10 = x13*2.0;
    double t11 = exp(t10);
    double t12 = x16*2.0;
    double t13 = exp(t12);
    double t17 = exp(x1);
    double t18 = exp(x2);
    double t19 = exp(x3);
    double t20 = t17+t18+t19;
    double t24 = t2*t2;
    double t25 = t3*t3;
    double t28 = t24*(1.0/2.0);
    double t29 = t9*t25*(1.0/2.0);
    double t26 = -data3-t28-t29+x1+x10+x11;
    double t27 = exp(t26);
    double t33 = t4*t4;
    double t34 = t5*t5;
    double t46 = t33*(1.0/2.0);
    double t47 = t11*t34*(1.0/2.0);
    double t35 = -data3-t46-t47+x2+x13+x14;
    double t36 = exp(t35);
    double t40 = t6*t6;
    double t41 = t7*t7;
    double t48 = t40*(1.0/2.0);
    double t49 = t13*t41*(1.0/2.0);
    double t42 = -data3-t48-t49+x3+x16+x17;
    double t43 = exp(t42);
    double t44 = t27+t36+t43;
    double t45 = 1.0/t20;
    double t50 = 1.0/t44;
    double t51 = data1*2.0;
    double t52 = exp(x10);
    double t53 = x11*2.0;
    double t54 = exp(t53);
    double t55 = exp(x13);
    double t56 = x14*2.0;
    double t57 = exp(t56);
    double t58 = exp(x16);
    double t59 = x17*2.0;
    double t60 = exp(t59);
  out_ptr[0] = data3-log(t20)+log(t44)-data5*(t14+t52)-data5*(t15+t55)-data5*(t16+t58)+data4*(t9+t54+x12*x12)+data4*(t11+t57+x15*x15)+data4*(t13+t60+x18*x18);
  out_ptr[1] = -t17*t45+t27*t50;
  out_ptr[2] = -t18*t45+t36*t50;
  out_ptr[3] = -t19*t45+t43*t50;
  out_ptr[4] = t27*t50*(t2*x12+t9*(t51-x4*2.0)*(1.0/2.0));
  out_ptr[5] = t2*t14*t27*t50;
  out_ptr[6] = t36*t50*(t4*x15+t11*(t51-x6*2.0)*(1.0/2.0));
  out_ptr[7] = t4*t15*t36*t50;
  out_ptr[8] = t43*t50*(t6*x18+t13*(t51-x8*2.0)*(1.0/2.0));
  out_ptr[9] = t6*t16*t43*t50;
  out_ptr[10] = data4*t9*2.0-data5*t52-t27*t50*(t9*t25-1.0);
  out_ptr[11] = -data5*t14+data4*t54*2.0-t27*t50*(t2*t14*t22-1.0);
  out_ptr[12] = data4*x12*2.0-t2*t3*t27*t50;
  out_ptr[13] = data4*t11*2.0-data5*t55-t36*t50*(t11*t34-1.0);
  out_ptr[14] = -data5*t15+data4*t57*2.0-t36*t50*(t4*t15*t31-1.0);
  out_ptr[15] = data4*x15*2.0-t4*t5*t36*t50;
  out_ptr[16] = data4*t13*2.0-data5*t58-t43*t50*(t13*t41-1.0);
  out_ptr[17] = -data5*t16+data4*t60*2.0-t43*t50*(t6*t16*t38-1.0);
  out_ptr[18] = data4*x18*2.0-t6*t7*t43*t50;

#line 39 "au_autodiff_generate_template.cpp"
        }
    } else {
        const mwSize out_step = 1;
        for(mwSize c_in = 0; c_in < in.cols; ++c_in,
                in_ptr += in.rows,
                data_ptr += data.rows,
                out_ptr += out_step) {
              /* inner loop do_jac=0 */
    double x1 = in_ptr[0];
    double x2 = in_ptr[1];
    double x3 = in_ptr[2];
    double x4 = in_ptr[3];
    double x5 = in_ptr[4];
    double x6 = in_ptr[5];
    double x7 = in_ptr[6];
    double x8 = in_ptr[7];
    double x9 = in_ptr[8];
    double x10 = in_ptr[9];
    double x11 = in_ptr[10];
    double x12 = in_ptr[11];
    double x13 = in_ptr[12];
    double x14 = in_ptr[13];
    double x15 = in_ptr[14];
    double x16 = in_ptr[15];
    double x17 = in_ptr[16];
    double x18 = in_ptr[17];
    double data1 = data_ptr[0];
    double data2 = data_ptr[1];
    double data3 = data_ptr[2];
    double data4 = data_ptr[3];
    double data5 = data_ptr[4];
    double t3 = data1-x4;
    double t14 = exp(x11);
    double t2 = t3*x12+t14*(data2-x5);
    double t5 = data1-x6;
    double t15 = exp(x14);
    double t4 = t5*x15+t15*(data2-x7);
    double t7 = data1-x8;
    double t16 = exp(x17);
    double t6 = t7*x18+t16*(data2-x9);
    double t8 = x10*2.0;
    double t9 = exp(t8);
    double t10 = x13*2.0;
    double t11 = exp(t10);
    double t12 = x16*2.0;
    double t13 = exp(t12);
    out_ptr[0] = data3+log(exp(-data3+x1+x10+x11-(t3*t3)*t9*(1.0/2.0)-(t2*t2)*(1.0/2.0))+exp(-data3+x2+x13+x14-(t5*t5)*t11*(1.0/2.0)-(t4*t4)*(1.0/2.0))+exp(-data3+x3+x16+x17-(t7*t7)*t13*(1.0/2.0)-(t6*t6)*(1.0/2.0)))-log(exp(x1)+exp(x2)+exp(x3))-data5*(t14+exp(x10))-data5*(t15+exp(x13))-data5*(t16+exp(x16))+data4*(t9+exp(x11*2.0)+x12*x12)+data4*(t11+exp(x14*2.0)+x15*x15)+data4*(t13+exp(x17*2.0)+x18*x18);

#line 48 "au_autodiff_generate_template.cpp"
        }
    }
    
    outs[0] = out;
}