// File: /workspace/github_c_makefile_star2_O0/genometools[P]genometools/src/mgth/mg_compute_gene_prediction.c
// Function: mg_compute_gene_prediction
int mg_compute_gene_prediction(CombinedScoreMatrixEntry
                               **combinedscore_matrix,
                               PathMatrixEntry **path_matrix,
                               GtUword contig_len,
                               HitInformation *hit_information,
                               ParseStruct *parsestruct_ptr, GtError * err)
{
  int had_err = 0;

  /* Variablen zur Bestimmung des Maximums der letzten Path-Matrix-Spalte */
  double max_lastcolumn = DBL_MIN,
    max_tmp;

  /* Zaehlvariablen fuer die Zeilen */
  unsigned short row_index,
    row_idx,
    real_frame = 0;

  /* Zaehlvariable fuer die Haeufigkeiten der einzelnen Frames sowie
     Variable fuer den Frame-Score */
  GtUword *frame_counter,
    real_frame_score;

  /* Struktur zur Speicherung der kodierenden Bereiche (from-to - Werte) */
  RegionStruct **regionmatrix;

  /* GtArray fuer das Speichern der Frames des optimalen Pfades */
  GtArray *frame_path_array;
  frame_path_array = gt_array_new(sizeof (unsigned short));

  gt_error_check(err);

  /* Bestimmen des/der Max-Werte(s) der letzten Spalte der path_matrix */
  for (row_index = 0; row_index < 7; row_index++)
  {
    max_tmp = path_matrix[row_index][contig_len - 1].score;

    if (max_tmp > max_lastcolumn)
    {
      max_lastcolumn = max_tmp;
    }
  }

  /* ausgehend von den Max-Werten startet die Vorhersage codierender
     Bereiche */
  for (row_index = 0; row_index < 7; row_index++)
  {
    /* Matrix-Score der aktuellen Zeile entspricht dem Max-Wert */
    if (path_matrix[row_index][contig_len - 1].score == max_lastcolumn)
    {
      gt_array2dim_calloc(regionmatrix, 7, 1);
      /* frame-counter zaehlt die Auftritts-haeufigkeiten der einzelnen
         Frames im opt. Pfad */
      frame_counter = gt_calloc(7, sizeof (GtUword));
      real_frame_score = 0;

      for (row_idx = 0; row_idx < 7; row_idx++)
      {
        regionmatrix[row_idx][0].from = gt_array_new(sizeof (GtUword));
        regionmatrix[row_idx][0].to = gt_array_new(sizeof (GtUword));
      }
      /* Aufruf der Genvorhersagemethode */
      gene_prediction(row_index,
                      contig_len - 1,
                      max_lastcolumn,
                      path_matrix,
                      combinedscore_matrix,
                      frame_path_array,
                      hit_information,
                      parsestruct_ptr, regionmatrix, frame_counter, err);

      /* Falls es fuer Frame X kodierende Abschnitte gibt, werden diese
         von hinten nach vorne in der regionmatrix abgespeichert - hier
         werden sie nun umgedreht, um sie in aufsteigender Form vorliegen
         zu haben */
      for (row_idx = 0; row_idx < 7; row_idx++)
      {
        if (gt_array_size(regionmatrix[row_idx][0].from) > 0)
        {
          gt_array_reverse(regionmatrix[row_idx][0].from);
          gt_array_reverse(regionmatrix[row_idx][0].to);
        }
      }

      /* XXX bestimmen des vermutlich realen Frames - Verbesserung
         moeglich? XXX */
      for (row_idx = 0; row_idx < 7; row_idx++)
      {
        if ((frame_counter[row_idx] > real_frame_score)
            && (gt_array_size(regionmatrix[row_idx][0].from) > 0))
        {
          real_frame_score = frame_counter[row_idx];
          real_frame = row_idx;
        }
      }

      /* Aufruf der Funktion, in der auf moegliche Frame-Shifts geprueft
         wird */
      had_err =
        frameshiftprocessing(parsestruct_ptr, regionmatrix, real_frame,
                             err);

      if (!had_err)
      {
        /* Aufruf der Funktion, in der auf moegliche Vereinbarkeit
           kodierender Bereiche geprueft wird */
        genemergeprocessing(parsestruct_ptr, regionmatrix, err);

        /* Aufruf der Ausgabefunktion und Ausgabe der Ergebnisse */
        mg_outputwriter(parsestruct_ptr, combinedscore_matrix,
                        hit_information, regionmatrix, 'h', err);

        for (row_idx = 0; row_idx < 7; row_idx++)
        {
          gt_array_delete(regionmatrix[row_idx][0].from);
          gt_array_delete(regionmatrix[row_idx][0].to);
        }
      }
      gt_array2dim_delete(regionmatrix);
      gt_free(frame_counter);
    }
  }
  gt_array_delete(frame_path_array);

  return had_err;
}

// Assembly:
pushq %rbx
subq $0xa0, %rsp
movq %rdi, 0x98(%rsp)
movq %rsi, 0x90(%rsp)
movq %rdx, 0x88(%rsp)
movq %rcx, 0x80(%rsp)
movq %r8, 0x78(%rsp)
movq %r9, 0x70(%rsp)
movl $0x0, 0x6c(%rsp)
movsd 0x32796(%rip), %xmm0    # 0x51e248
movsd %xmm0, 0x60(%rsp)
movw $0x0, 0x52(%rsp)
movl $0x2, %edi
callq 0x80990
movq %rax, 0x30(%rsp)
cmpq $0x0, 0x70(%rsp)
je 0x4ebb1e
movq 0x70(%rsp), %rdi
callq 0xd8a60
testb $0x1, %al
jne 0x4ebae6
jmp 0x4ebb1e
movq 0x1504b3(%rip), %rax    # 0x63bfa0
movq (%rax), %rdi
leaq 0x2a51c(%rip), %rsi     # 0x516013
leaq 0x2a6c1(%rip), %rdx     # 0x5161bf
leaq 0xd039a(%rip), %rcx     # 0x5bbe9f
leaq 0xd03ae(%rip), %r8      # 0x5bbeba
movl $0x73, %r9d
movb $0x0, %al
callq 0x199f0
callq 0x19370
jmp 0x4ebb20
movw $0x0, 0x56(%rsp)
movzwl 0x56(%rsp), %eax
cmpl $0x7, %eax
jge 0x4ebb8b
movq 0x90(%rsp), %rax
movzwl 0x56(%rsp), %ecx
movq (%rax,%rcx,8), %rax
movq 0x88(%rsp), %rcx
subq $0x1, %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movsd (%rax), %xmm0
movsd %xmm0, 0x58(%rsp)
movsd 0x58(%rsp), %xmm0
ucomisd 0x60(%rsp), %xmm0
jbe 0x4ebb79
movsd 0x58(%rsp), %xmm0
movsd %xmm0, 0x60(%rsp)
jmp 0x4ebb7b
movw 0x56(%rsp), %ax
addw $0x1, %ax
movw %ax, 0x56(%rsp)
jmp 0x4ebb27
movw $0x0, 0x56(%rsp)
movzwl 0x56(%rsp), %eax
cmpl $0x7, %eax
jge 0x4ebf3a
movq 0x90(%rsp), %rax
movzwl 0x56(%rsp), %ecx
movq (%rax,%rcx,8), %rax
movq 0x88(%rsp), %rcx
subq $0x1, %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movsd (%rax), %xmm0
ucomisd 0x60(%rsp), %xmm0
jne 0x4ebf25
jp 0x4ebf25
movl $0x38, %edi
leaq 0xd02d4(%rip), %rsi     # 0x5bbeba
movl $0x87, %edx
callq 0xe80f0
movq %rax, 0x38(%rsp)
movl $0x7, %edi
movl $0x10, %esi
leaq 0xd02b4(%rip), %rdx     # 0x5bbeba
movl $0x87, %ecx
callq 0xe83c0
movq %rax, %rcx
movq 0x38(%rsp), %rax
movq %rcx, (%rax)
movq $0x1, 0x28(%rsp)
cmpq $0x7, 0x28(%rsp)
jae 0x4ebc60
movq 0x38(%rsp), %rax
movq 0x28(%rsp), %rcx
subq $0x1, %rcx
movq (%rax,%rcx,8), %rdx
addq $0x10, %rdx
movq 0x38(%rsp), %rax
movq 0x28(%rsp), %rcx
movq %rdx, (%rax,%rcx,8)
movq 0x28(%rsp), %rax
addq $0x1, %rax
movq %rax, 0x28(%rsp)
jmp 0x4ebc24
movl $0x7, %edi
movl $0x8, %esi
leaq 0xd0249(%rip), %rdx     # 0x5bbeba
movl $0x8a, %ecx
callq 0xe83c0
movq %rax, 0x48(%rsp)
movq $0x0, 0x40(%rsp)
movw $0x0, 0x54(%rsp)
movzwl 0x54(%rsp), %eax
cmpl $0x7, %eax
jge 0x4ebce7
movl $0x8, %edi
callq 0x80990
movq %rax, %rcx
movq 0x38(%rsp), %rax
movzwl 0x54(%rsp), %edx
movq (%rax,%rdx,8), %rax
movq %rcx, (%rax)
movl $0x8, %edi
callq 0x80990
movq %rax, %rcx
movq 0x38(%rsp), %rax
movzwl 0x54(%rsp), %edx
movq (%rax,%rdx,8), %rax
movq %rcx, 0x8(%rax)
movw 0x54(%rsp), %ax
addw $0x1, %ax
movw %ax, 0x54(%rsp)
jmp 0x4ebc90
movw 0x56(%rsp), %di
movq 0x88(%rsp), %rsi
subq $0x1, %rsi
movsd 0x60(%rsp), %xmm0
movq 0x90(%rsp), %rdx
movq 0x98(%rsp), %rcx
movq 0x30(%rsp), %r8
movq 0x80(%rsp), %r9
movq 0x78(%rsp), %rbx
movq 0x38(%rsp), %r11
movq 0x48(%rsp), %r10
movq 0x70(%rsp), %rax
movzwl %di, %edi
movq %rbx, (%rsp)
movq %r11, 0x8(%rsp)
movq %r10, 0x10(%rsp)
movq %rax, 0x18(%rsp)
callq 0x4ebf60
movw $0x0, 0x54(%rsp)
movzwl 0x54(%rsp), %eax
cmpl $0x7, %eax
jge 0x4ebdb6
movq 0x38(%rsp), %rax
movzwl 0x54(%rsp), %ecx
movq (%rax,%rcx,8), %rax
movq (%rax), %rdi
callq 0x81370
cmpq $0x0, %rax
jbe 0x4ebda4
movq 0x38(%rsp), %rax
movzwl 0x54(%rsp), %ecx
movq (%rax,%rcx,8), %rax
movq (%rax), %rdi
callq 0x80f40
movq 0x38(%rsp), %rax
movzwl 0x54(%rsp), %ecx
movq (%rax,%rcx,8), %rax
movq 0x8(%rax), %rdi
callq 0x80f40
jmp 0x4ebda6
movw 0x54(%rsp), %ax
addw $0x1, %ax
movw %ax, 0x54(%rsp)
jmp 0x4ebd51
movw $0x0, 0x54(%rsp)
movzwl 0x54(%rsp), %eax
cmpl $0x7, %eax
jge 0x4ebe27
movq 0x48(%rsp), %rax
movzwl 0x54(%rsp), %ecx
movq (%rax,%rcx,8), %rax
cmpq 0x40(%rsp), %rax
jbe 0x4ebe15
movq 0x38(%rsp), %rax
movzwl 0x54(%rsp), %ecx
movq (%rax,%rcx,8), %rax
movq (%rax), %rdi
callq 0x81370
cmpq $0x0, %rax
jbe 0x4ebe15
movq 0x48(%rsp), %rax
movzwl 0x54(%rsp), %ecx
movq (%rax,%rcx,8), %rax
movq %rax, 0x40(%rsp)
movw 0x54(%rsp), %ax
movw %ax, 0x52(%rsp)
jmp 0x4ebe17
movw 0x54(%rsp), %ax
addw $0x1, %ax
movw %ax, 0x54(%rsp)
jmp 0x4ebdbd
movq 0x78(%rsp), %rdi
movq 0x38(%rsp), %rsi
movw 0x52(%rsp), %ax
movq 0x70(%rsp), %rcx
movswl %ax, %edx
callq 0x4ecc20
movl %eax, 0x6c(%rsp)
cmpl $0x0, 0x6c(%rsp)
jne 0x4ebee0
movq 0x78(%rsp), %rdi
movq 0x38(%rsp), %rsi
movq 0x70(%rsp), %rdx
callq 0x4ed3e0
movq 0x78(%rsp), %rdi
movq 0x98(%rsp), %rsi
movq 0x80(%rsp), %rdx
movq 0x38(%rsp), %rcx
movq 0x70(%rsp), %r9
movl $0x68, %r8d
callq 0x316b90
movw $0x0, 0x54(%rsp)
movzwl 0x54(%rsp), %eax
cmpl $0x7, %eax
jge 0x4ebede
movq 0x38(%rsp), %rax
movzwl 0x54(%rsp), %ecx
movq (%rax,%rcx,8), %rax
movq (%rax), %rdi
callq 0x81f80
movq 0x38(%rsp), %rax
movzwl 0x54(%rsp), %ecx
movq (%rax,%rcx,8), %rax
movq 0x8(%rax), %rdi
callq 0x81f80
movw 0x54(%rsp), %ax
addw $0x1, %ax
movw %ax, 0x54(%rsp)
jmp 0x4ebe97
jmp 0x4ebee0
movq 0x38(%rsp), %rax
movq (%rax), %rdi
leaq 0xcffcb(%rip), %rsi     # 0x5bbeba
movl $0xcb, %edx
callq 0xe88c0
movq 0x38(%rsp), %rdi
leaq 0xcffb5(%rip), %rsi     # 0x5bbeba
movl $0xcb, %edx
callq 0xe88c0
movq 0x48(%rsp), %rdi
leaq 0xcff9f(%rip), %rsi     # 0x5bbeba
movl $0xcc, %edx
callq 0xe88c0
jmp 0x4ebf27
movw 0x56(%rsp), %ax
addw $0x1, %ax
movw %ax, 0x56(%rsp)
jmp 0x4ebb92
movq 0x30(%rsp), %rdi
callq 0x81f80
movl 0x6c(%rsp), %eax
addq $0xa0, %rsp
popq %rbx
retq
nopw %cs:(%rax,%rax)