// File: /workspace/github_c_makefile_star2_O0/olcaytaner[P]Isell/softtree.c
// Function: gradient_descent_soft_tree
void gradient_descent_soft_tree(Decisionnodeptr rootnode, Decisionnodeptr node, Softregtree_parameterptr param, double eta, double lambda)
{
 int i, j, k, *array, datasize;
 double o, r, multiplier, delta, feature_value;
 Instanceptr inst; 
 Decisionnodeptr tmpnode;
 datasize = data_size(rootnode->instances);
 node->w = random_matrix(current_dataset->multifeaturecount, 1, -0.01, +0.01);
 if (param->leaftype == CONSTANTLEAF)
  {
   node->left->w0 = produce_random_value(-0.01, +0.01);
   node->right->w0 = 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 = sigmoid(soft_tree_output(rootnode, inst));
     r = give_classno(inst);
     multiplier = eta * (r - o);
     tmpnode = node;
     while (tmpnode->parent)
      {
       multiplier *= tmpnode->weight;
       tmpnode = tmpnode->parent;
      }
     if (param->leaftype == CONSTANTLEAF)
      {
       node->left->w0 += multiplier * node->left->weight;
       node->right->w0 += 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 0x4629d(%rip), %rax     # 0x105840
movq (%rax), %rax
movl 0x1c0(%rax), %edi
movl $0x1, %esi
movsd 0x2349f(%rip), %xmm0    # 0xe2a58
movsd 0x22a5f(%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, 0x38(%rax)
movq -0x88(%rbp), %rcx
movq %rcx, 0x40(%rax)
movq -0x18(%rbp), %rax
cmpl $0x0, (%rax)
jne 0xbf645
movsd 0x23453(%rip), %xmm0    # 0xe2a58
movsd 0x22a13(%rip), %xmm1    # 0xe2020
callq 0x545a0
movq -0x10(%rbp), %rax
movq (%rax), %rax
movsd %xmm0, 0x48(%rax)
movsd 0x23432(%rip), %xmm0    # 0xe2a58
movsd 0x229f2(%rip), %xmm1    # 0xe2020
callq 0x545a0
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movsd %xmm0, 0x48(%rax)
jmp 0xbf712
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq %rax, -0xc8(%rbp)
leaq 0x461e6(%rip), %rax     # 0x105840
movq (%rax), %rax
movl 0x1c0(%rax), %edi
movl $0x1, %esi
movsd 0x233e8(%rip), %xmm0    # 0xe2a58
movsd 0x229a8(%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, 0x38(%rax)
movq -0x98(%rbp), %rcx
movq %rcx, 0x40(%rax)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0xc0(%rbp)
leaq 0x4617f(%rip), %rax     # 0x105840
movq (%rax), %rax
movl 0x1c0(%rax), %edi
movl $0x1, %esi
movsd 0x23381(%rip), %xmm0    # 0xe2a58
movsd 0x22941(%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, 0x38(%rax)
movq -0xa8(%rbp), %rcx
movq %rcx, 0x40(%rax)
movl $0x0, -0x2c(%rbp)
movl -0x2c(%rbp), %eax
movq -0x18(%rbp), %rcx
cmpl 0x4(%rcx), %eax
jge 0xbfb8f
movl -0x44(%rbp), %edi
callq 0x54600
movq %rax, -0x40(%rbp)
movl $0x0, -0x30(%rbp)
movl -0x30(%rbp), %eax
cmpl -0x44(%rbp), %eax
jge 0xbfb65
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 0xbed30
callq 0x7aab0
movsd %xmm0, -0x50(%rbp)
movq -0x78(%rbp), %rdi
callq 0x43530
cvtsi2sd %eax, %xmm0
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 0xbf7d9
movq -0x80(%rbp), %rax
movsd 0x78(%rax), %xmm0
mulsd -0x60(%rbp), %xmm0
movsd %xmm0, -0x60(%rbp)
movq -0x80(%rbp), %rax
movq 0x18(%rax), %rax
movq %rax, -0x80(%rbp)
jmp 0xbf7ad
movq -0x18(%rbp), %rax
cmpl $0x0, (%rax)
jne 0xbf838
movsd -0x60(%rbp), %xmm0
movq -0x10(%rbp), %rax
movq (%rax), %rax
movsd 0x78(%rax), %xmm2
movq -0x10(%rbp), %rax
movq (%rax), %rax
movsd 0x48(%rax), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, 0x48(%rax)
movsd -0x60(%rbp), %xmm0
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movsd 0x78(%rax), %xmm2
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movsd 0x48(%rax), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, 0x48(%rax)
movl $0x0, -0x34(%rbp)
movl -0x34(%rbp), %eax
leaq 0x45ff7(%rip), %rcx     # 0x105840
movq (%rcx), %rcx
cmpl 0x1c0(%rcx), %eax
jge 0xbfb55
cmpl $0x0, -0x34(%rbp)
je 0xbf874
movq -0x78(%rbp), %rdi
movl -0x34(%rbp), %esi
subl $0x1, %esi
callq 0x42c40
movsd %xmm0, -0x70(%rbp)
jmp 0xbf881
movsd 0x2279c(%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 0xbf8fa
movsd -0x68(%rbp), %xmm0
movq -0x10(%rbp), %rax
movq (%rax), %rax
movsd 0x68(%rax), %xmm1
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
subsd 0x68(%rax), %xmm1
mulsd %xmm1, %xmm0
movq -0x10(%rbp), %rax
movq (%rax), %rax
mulsd 0x78(%rax), %xmm0
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movsd 0x78(%rax), %xmm2
movq -0x10(%rbp), %rax
movq 0x40(%rax), %rax
movslq -0x34(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movsd (%rax), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, (%rax)
jmp 0xbfad2
movq -0x18(%rbp), %rax
cmpl $0x1, 0x20(%rax)
jne 0xbfa3e
movsd -0x70(%rbp), %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jbe 0xbf9ac
movsd 0x226f6(%rip), %xmm0    # 0xe2018
subsd -0x28(%rbp), %xmm0
mulsd -0x68(%rbp), %xmm0
movq -0x10(%rbp), %rax
movq (%rax), %rax
movsd 0x68(%rax), %xmm1
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
subsd 0x68(%rax), %xmm1
mulsd %xmm1, %xmm0
movq -0x10(%rbp), %rax
movq (%rax), %rax
mulsd 0x78(%rax), %xmm0
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
mulsd 0x78(%rax), %xmm0
cvtsi2sdl -0x44(%rbp), %xmm1
divsd %xmm1, %xmm0
movsd -0x20(%rbp), %xmm1
mulsd -0x28(%rbp), %xmm1
leaq 0x45ec4(%rip), %rax     # 0x105840
movq (%rax), %rax
cvtsi2sdl 0x1c0(%rax), %xmm2
divsd %xmm2, %xmm1
addsd %xmm1, %xmm0
movq -0x10(%rbp), %rax
movq 0x40(%rax), %rax
movslq -0x34(%rbp), %rcx
movq (%rax,%rcx,8), %rax
addsd (%rax), %xmm0
movsd %xmm0, (%rax)
jmp 0xbfa39
movsd 0x22664(%rip), %xmm0    # 0xe2018
subsd -0x28(%rbp), %xmm0
mulsd -0x68(%rbp), %xmm0
movq -0x10(%rbp), %rax
movq (%rax), %rax
movsd 0x68(%rax), %xmm1
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
subsd 0x68(%rax), %xmm1
mulsd %xmm1, %xmm0
movq -0x10(%rbp), %rax
movq (%rax), %rax
mulsd 0x78(%rax), %xmm0
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
mulsd 0x78(%rax), %xmm0
cvtsi2sdl -0x44(%rbp), %xmm1
divsd %xmm1, %xmm0
movsd -0x20(%rbp), %xmm1
mulsd -0x28(%rbp), %xmm1
leaq 0x45e32(%rip), %rax     # 0x105840
movq (%rax), %rax
cvtsi2sdl 0x1c0(%rax), %xmm2
divsd %xmm2, %xmm1
subsd %xmm1, %xmm0
movq -0x10(%rbp), %rax
movq 0x40(%rax), %rax
movslq -0x34(%rbp), %rcx
movq (%rax,%rcx,8), %rax
addsd (%rax), %xmm0
movsd %xmm0, (%rax)
jmp 0xbfad0
movsd 0x225d2(%rip), %xmm0    # 0xe2018
subsd -0x28(%rbp), %xmm0
mulsd -0x68(%rbp), %xmm0
movq -0x10(%rbp), %rax
movq (%rax), %rax
movsd 0x68(%rax), %xmm1
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
subsd 0x68(%rax), %xmm1
mulsd %xmm1, %xmm0
movq -0x10(%rbp), %rax
movq (%rax), %rax
mulsd 0x78(%rax), %xmm0
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
mulsd 0x78(%rax), %xmm0
cvtsi2sdl -0x44(%rbp), %xmm1
divsd %xmm1, %xmm0
movsd -0x20(%rbp), %xmm1
mulsd -0x28(%rbp), %xmm1
mulsd -0x70(%rbp), %xmm1
leaq 0x45d9b(%rip), %rax     # 0x105840
movq (%rax), %rax
cvtsi2sdl 0x1c0(%rax), %xmm2
divsd %xmm2, %xmm1
addsd %xmm1, %xmm0
movq -0x10(%rbp), %rax
movq 0x40(%rax), %rax
movslq -0x34(%rbp), %rcx
movq (%rax,%rcx,8), %rax
addsd (%rax), %xmm0
movsd %xmm0, (%rax)
jmp 0xbfad2
movq -0x18(%rbp), %rax
cmpl $0x0, (%rax)
je 0xbfb45
movsd -0x68(%rbp), %xmm0
movq -0x10(%rbp), %rax
movq (%rax), %rax
movsd 0x78(%rax), %xmm2
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq 0x40(%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 0x78(%rax), %xmm2
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x40(%rax), %rax
movslq -0x34(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movsd (%rax), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, (%rax)
jmp 0xbfb47
movl -0x34(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x34(%rbp)
jmp 0xbf83f
jmp 0xbfb57
movl -0x30(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x30(%rbp)
jmp 0xbf73c
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 0xbf719
addq $0xd0, %rsp
popq %rbp
retq
nopl (%rax,%rax)