// File: /workspace/github_c_makefile_star2_O0/olcaytaner[P]Isell/softregtree.c
// Function: gradient_descent_soft_regtree
void gradient_descent_soft_regtree(Regressionnodeptr rootnode, Regressionnodeptr node, Softregtree_parameterptr param, double eta, double lambda)
{
 int i, j, k, *array, datasize;
 double o, r, multiplier, delta, feature_value;
 Instanceptr inst; 
 Regressionnodeptr tmpnode;
 datasize = data_size(rootnode->instances);
 node->w = random_matrix(current_dataset->multifeaturecount, 1, -0.01, +0.01);
 if (param->leaftype == CONSTANTLEAF)
  {
   node->left->regressionvalue = produce_random_value(-0.01, +0.01);
   node->right->regressionvalue = produce_random_value(-0.01, +0.01);
  }
 else
  {
   node->left->w = random_matrix(current_dataset->multifeaturecount, 1, -0.01, +0.01);
   node->right->w = random_matrix(current_dataset->multifeaturecount, 1, -0.01, +0.01);
  }
 for (i = 0; i < param->epochs; i++)
  {
   array = random_array(datasize);
   for (j = 0; j < datasize; j++)
    {
     inst = data_x(rootnode->instances, array[j]);
     o = soft_regtree_output(rootnode, inst);
     r = give_regressionvalue(inst);
     multiplier = eta * (r - o);
     tmpnode = node;
     while (tmpnode->parent)
      {
       multiplier *= tmpnode->weight;
       tmpnode = tmpnode->parent;
      }
     if (param->leaftype == CONSTANTLEAF)
      {
       node->left->regressionvalue += multiplier * node->left->weight;
       node->right->regressionvalue += multiplier * node->right->weight;
      }
     for (k = 0; k < current_dataset->multifeaturecount; k++)
      {      
       if (k != 0)
         feature_value = real_feature(inst, k - 1);
       else
         feature_value = 1;
       delta = multiplier * feature_value;
       if (param->regularization == NO_REGULARIZATION)
         node->w.values[k][0] += delta * (node->left->output - node->right->output) * node->left->weight * node->right->weight;
       else
         if (param->regularization == L1_REGULARIZATION)
          {
           if (feature_value > 0)
             node->w.values[k][0] += ((1 - lambda) * delta * (node->left->output - node->right->output) * node->left->weight * node->right->weight) / datasize + eta * lambda / current_dataset->multifeaturecount;
           else
             node->w.values[k][0] += ((1 - lambda) * delta * (node->left->output - node->right->output) * node->left->weight * node->right->weight) / datasize - eta * lambda / current_dataset->multifeaturecount;
          }
         else
           node->w.values[k][0] += ((1 - lambda) * delta * (node->left->output - node->right->output) * node->left->weight * node->right->weight) / datasize + (eta * lambda * feature_value) / current_dataset->multifeaturecount;           
       if (param->leaftype != CONSTANTLEAF)
        { 
         node->left->w.values[k][0] += delta * node->left->weight;
         node->right->w.values[k][0] += delta * node->right->weight;
        }
      }
    }
   safe_free(array);   
   eta = eta * param->etadecrease;
  }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xd0, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movsd %xmm0, -0x20(%rbp)
movsd %xmm1, -0x28(%rbp)
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rdi
callq 0x449f0
movl %eax, -0x44(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0xb8(%rbp)
leaq 0x47a3d(%rip), %rax     # 0x105840
movq (%rax), %rax
movl 0x1c0(%rax), %edi
movl $0x1, %esi
movsd 0x24c3f(%rip), %xmm0    # 0xe2a58
movsd 0x241ff(%rip), %xmm1    # 0xe2020
callq 0x5a130
movq %rax, %rcx
movq -0xb8(%rbp), %rax
movq %rcx, -0x90(%rbp)
movq %rdx, -0x88(%rbp)
movq -0x90(%rbp), %rcx
movq %rcx, 0x30(%rax)
movq -0x88(%rbp), %rcx
movq %rcx, 0x38(%rax)
movq -0x18(%rbp), %rax
cmpl $0x0, (%rax)
jne 0xbdea5
movsd 0x24bf3(%rip), %xmm0    # 0xe2a58
movsd 0x241b3(%rip), %xmm1    # 0xe2020
callq 0x545a0
movq -0x10(%rbp), %rax
movq (%rax), %rax
movsd %xmm0, 0x70(%rax)
movsd 0x24bd2(%rip), %xmm0    # 0xe2a58
movsd 0x24192(%rip), %xmm1    # 0xe2020
callq 0x545a0
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movsd %xmm0, 0x70(%rax)
jmp 0xbdf72
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq %rax, -0xc8(%rbp)
leaq 0x47986(%rip), %rax     # 0x105840
movq (%rax), %rax
movl 0x1c0(%rax), %edi
movl $0x1, %esi
movsd 0x24b88(%rip), %xmm0    # 0xe2a58
movsd 0x24148(%rip), %xmm1    # 0xe2020
callq 0x5a130
movq %rax, %rcx
movq -0xc8(%rbp), %rax
movq %rcx, -0xa0(%rbp)
movq %rdx, -0x98(%rbp)
movq -0xa0(%rbp), %rcx
movq %rcx, 0x30(%rax)
movq -0x98(%rbp), %rcx
movq %rcx, 0x38(%rax)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0xc0(%rbp)
leaq 0x4791f(%rip), %rax     # 0x105840
movq (%rax), %rax
movl 0x1c0(%rax), %edi
movl $0x1, %esi
movsd 0x24b21(%rip), %xmm0    # 0xe2a58
movsd 0x240e1(%rip), %xmm1    # 0xe2020
callq 0x5a130
movq %rax, %rcx
movq -0xc0(%rbp), %rax
movq %rcx, -0xb0(%rbp)
movq %rdx, -0xa8(%rbp)
movq -0xb0(%rbp), %rcx
movq %rcx, 0x30(%rax)
movq -0xa8(%rbp), %rcx
movq %rcx, 0x38(%rax)
movl $0x0, -0x2c(%rbp)
movl -0x2c(%rbp), %eax
movq -0x18(%rbp), %rcx
cmpl 0x4(%rcx), %eax
jge 0xbe3e6
movl -0x44(%rbp), %edi
callq 0x54600
movq %rax, -0x40(%rbp)
movl $0x0, -0x30(%rbp)
movl -0x30(%rbp), %eax
cmpl -0x44(%rbp), %eax
jge 0xbe3bc
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rdi
movq -0x40(%rbp), %rax
movslq -0x30(%rbp), %rcx
movl (%rax,%rcx,4), %esi
callq 0x46c40
movq %rax, -0x78(%rbp)
movq -0x8(%rbp), %rdi
movq -0x78(%rbp), %rsi
callq 0xbdbf0
movsd %xmm0, -0x50(%rbp)
movq -0x78(%rbp), %rdi
callq 0x43580
movsd %xmm0, -0x58(%rbp)
movsd -0x20(%rbp), %xmm0
movsd -0x58(%rbp), %xmm1
subsd -0x50(%rbp), %xmm1
mulsd %xmm1, %xmm0
movsd %xmm0, -0x60(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x80(%rbp)
movq -0x80(%rbp), %rax
cmpq $0x0, 0x18(%rax)
je 0xbe030
movq -0x80(%rbp), %rax
movsd 0x48(%rax), %xmm0
mulsd -0x60(%rbp), %xmm0
movsd %xmm0, -0x60(%rbp)
movq -0x80(%rbp), %rax
movq 0x18(%rax), %rax
movq %rax, -0x80(%rbp)
jmp 0xbe004
movq -0x18(%rbp), %rax
cmpl $0x0, (%rax)
jne 0xbe08f
movsd -0x60(%rbp), %xmm0
movq -0x10(%rbp), %rax
movq (%rax), %rax
movsd 0x48(%rax), %xmm2
movq -0x10(%rbp), %rax
movq (%rax), %rax
movsd 0x70(%rax), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, 0x70(%rax)
movsd -0x60(%rbp), %xmm0
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movsd 0x48(%rax), %xmm2
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movsd 0x70(%rax), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, 0x70(%rax)
movl $0x0, -0x34(%rbp)
movl -0x34(%rbp), %eax
leaq 0x477a0(%rip), %rcx     # 0x105840
movq (%rcx), %rcx
cmpl 0x1c0(%rcx), %eax
jge 0xbe3ac
cmpl $0x0, -0x34(%rbp)
je 0xbe0cb
movq -0x78(%rbp), %rdi
movl -0x34(%rbp), %esi
subl $0x1, %esi
callq 0x42c40
movsd %xmm0, -0x70(%rbp)
jmp 0xbe0d8
movsd 0x23f45(%rip), %xmm0    # 0xe2018
movsd %xmm0, -0x70(%rbp)
movsd -0x60(%rbp), %xmm0
mulsd -0x70(%rbp), %xmm0
movsd %xmm0, -0x68(%rbp)
movq -0x18(%rbp), %rax
cmpl $0x0, 0x20(%rax)
jne 0xbe151
movsd -0x68(%rbp), %xmm0
movq -0x10(%rbp), %rax
movq (%rax), %rax
movsd 0x40(%rax), %xmm1
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
subsd 0x40(%rax), %xmm1
mulsd %xmm1, %xmm0
movq -0x10(%rbp), %rax
movq (%rax), %rax
mulsd 0x48(%rax), %xmm0
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movsd 0x48(%rax), %xmm2
movq -0x10(%rbp), %rax
movq 0x38(%rax), %rax
movslq -0x34(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movsd (%rax), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, (%rax)
jmp 0xbe329
movq -0x18(%rbp), %rax
cmpl $0x1, 0x20(%rax)
jne 0xbe295
movsd -0x70(%rbp), %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jbe 0xbe203
movsd 0x23e9f(%rip), %xmm0    # 0xe2018
subsd -0x28(%rbp), %xmm0
mulsd -0x68(%rbp), %xmm0
movq -0x10(%rbp), %rax
movq (%rax), %rax
movsd 0x40(%rax), %xmm1
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
subsd 0x40(%rax), %xmm1
mulsd %xmm1, %xmm0
movq -0x10(%rbp), %rax
movq (%rax), %rax
mulsd 0x48(%rax), %xmm0
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
mulsd 0x48(%rax), %xmm0
cvtsi2sdl -0x44(%rbp), %xmm1
divsd %xmm1, %xmm0
movsd -0x20(%rbp), %xmm1
mulsd -0x28(%rbp), %xmm1
leaq 0x4766d(%rip), %rax     # 0x105840
movq (%rax), %rax
cvtsi2sdl 0x1c0(%rax), %xmm2
divsd %xmm2, %xmm1
addsd %xmm1, %xmm0
movq -0x10(%rbp), %rax
movq 0x38(%rax), %rax
movslq -0x34(%rbp), %rcx
movq (%rax,%rcx,8), %rax
addsd (%rax), %xmm0
movsd %xmm0, (%rax)
jmp 0xbe290
movsd 0x23e0d(%rip), %xmm0    # 0xe2018
subsd -0x28(%rbp), %xmm0
mulsd -0x68(%rbp), %xmm0
movq -0x10(%rbp), %rax
movq (%rax), %rax
movsd 0x40(%rax), %xmm1
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
subsd 0x40(%rax), %xmm1
mulsd %xmm1, %xmm0
movq -0x10(%rbp), %rax
movq (%rax), %rax
mulsd 0x48(%rax), %xmm0
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
mulsd 0x48(%rax), %xmm0
cvtsi2sdl -0x44(%rbp), %xmm1
divsd %xmm1, %xmm0
movsd -0x20(%rbp), %xmm1
mulsd -0x28(%rbp), %xmm1
leaq 0x475db(%rip), %rax     # 0x105840
movq (%rax), %rax
cvtsi2sdl 0x1c0(%rax), %xmm2
divsd %xmm2, %xmm1
subsd %xmm1, %xmm0
movq -0x10(%rbp), %rax
movq 0x38(%rax), %rax
movslq -0x34(%rbp), %rcx
movq (%rax,%rcx,8), %rax
addsd (%rax), %xmm0
movsd %xmm0, (%rax)
jmp 0xbe327
movsd 0x23d7b(%rip), %xmm0    # 0xe2018
subsd -0x28(%rbp), %xmm0
mulsd -0x68(%rbp), %xmm0
movq -0x10(%rbp), %rax
movq (%rax), %rax
movsd 0x40(%rax), %xmm1
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
subsd 0x40(%rax), %xmm1
mulsd %xmm1, %xmm0
movq -0x10(%rbp), %rax
movq (%rax), %rax
mulsd 0x48(%rax), %xmm0
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
mulsd 0x48(%rax), %xmm0
cvtsi2sdl -0x44(%rbp), %xmm1
divsd %xmm1, %xmm0
movsd -0x20(%rbp), %xmm1
mulsd -0x28(%rbp), %xmm1
mulsd -0x70(%rbp), %xmm1
leaq 0x47544(%rip), %rax     # 0x105840
movq (%rax), %rax
cvtsi2sdl 0x1c0(%rax), %xmm2
divsd %xmm2, %xmm1
addsd %xmm1, %xmm0
movq -0x10(%rbp), %rax
movq 0x38(%rax), %rax
movslq -0x34(%rbp), %rcx
movq (%rax,%rcx,8), %rax
addsd (%rax), %xmm0
movsd %xmm0, (%rax)
jmp 0xbe329
movq -0x18(%rbp), %rax
cmpl $0x0, (%rax)
je 0xbe39c
movsd -0x68(%rbp), %xmm0
movq -0x10(%rbp), %rax
movq (%rax), %rax
movsd 0x48(%rax), %xmm2
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq 0x38(%rax), %rax
movslq -0x34(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movsd (%rax), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, (%rax)
movsd -0x68(%rbp), %xmm0
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movsd 0x48(%rax), %xmm2
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x38(%rax), %rax
movslq -0x34(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movsd (%rax), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, (%rax)
jmp 0xbe39e
movl -0x34(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x34(%rbp)
jmp 0xbe096
jmp 0xbe3ae
movl -0x30(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x30(%rbp)
jmp 0xbdf9c
movq -0x40(%rbp), %rdi
callq 0x52e80
movsd -0x20(%rbp), %xmm0
movq -0x18(%rbp), %rax
mulsd 0x10(%rax), %xmm0
movsd %xmm0, -0x20(%rbp)
movl -0x2c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x2c(%rbp)
jmp 0xbdf79
addq $0xd0, %rsp
popq %rbp
retq
nop