// File: /workspace/github_c_makefile_star2_O1/genometools[P]genometools/src/extended/stream_evaluator.c
// Function: gt_stream_evaluator_evaluate
int gt_stream_evaluator_evaluate(GtStreamEvaluator *se, bool verbose,
                                 bool exondiff, bool exondiffcollapsed,
                                 GtNodeVisitor *nv, GtError *err)
{
  GtGenomeNode *gn;
  GtFeatureNode *fn;
  Slot *slot;
  ProcessRealFeatureInfo real_info;
  ProcessPredictedFeatureInfo predicted_info;
  int had_err;

  gt_error_check(err);
  gt_assert(se);

  /* init */
  real_info.nuceval = se->nuceval;
  real_info.verbose = verbose;
  predicted_info.nuceval = se->nuceval;
  predicted_info.verbose = verbose;
  predicted_info.exondiff = exondiff;
  predicted_info.exondiffcollapsed = exondiffcollapsed;
  predicted_info.LTRdelta = se->LTRdelta;
  predicted_info.mRNA_gene_evaluator = se->mRNA_gene_evaluator;
  predicted_info.CDS_gene_evaluator = se->CDS_gene_evaluator;
  predicted_info.mRNA_mRNA_evaluator = se->mRNA_mRNA_evaluator;
  predicted_info.CDS_mRNA_evaluator = se->CDS_mRNA_evaluator;
  predicted_info.LTR_evaluator  = se->LTR_evaluator;
  predicted_info.mRNA_exon_evaluators = se->mRNA_exon_evaluators;
  predicted_info.mRNA_exon_evaluators_collapsed =
    se->mRNA_exon_evaluators_collapsed;
  predicted_info.CDS_exon_evaluators = se->CDS_exon_evaluators;
  predicted_info.CDS_exon_evaluators_collapsed =
    se->CDS_exon_evaluators_collapsed;
  predicted_info.wrong_genes = &se->wrong_genes;
  predicted_info.wrong_mRNAs = &se->wrong_mRNAs;
  predicted_info.wrong_LTRs  = &se->wrong_LTRs;

  /* process the reference stream completely */
  while (!(had_err = gt_node_stream_next(se->reference, &gn, err)) && gn) {
    if (gt_region_node_try_cast(gn)) {
      /* each sequence region gets its own ``slot'' */
      if (!(slot = gt_hashmap_get(se->slots,
                                  gt_str_get(gt_genome_node_get_seqid(gn))))) {
        slot = slot_new(se->nuceval, gt_genome_node_get_range(gn));
        gt_hashmap_add(se->slots,
                       gt_cstr_dup(gt_str_get(gt_genome_node_get_seqid(gn))),
                       slot);
      }
      gt_assert(slot);
    }
    /* we consider only genome features */
    if ((fn = gt_feature_node_try_cast(gn))) {
      /* each sequence must have its own ``slot'' at this point */
      slot = gt_hashmap_get(se->slots,
                            gt_str_get(gt_genome_node_get_seqid(gn)));
      gt_assert(slot);
      /* store the exons */
      real_info.slot = slot;
      gt_feature_node_determine_transcripttypes(fn);
      had_err = gt_feature_node_traverse_children(fn, &real_info,
                                                  process_real_feature, false,
                                                  NULL);
      gt_assert(!had_err); /* cannot happen, process_real_feature() is sane */
    }
    if (nv)
      gt_genome_node_accept(gn, nv, err);
    gt_genome_node_delete(gn);
  }

  /* set the actuals and sort them */
  if (!had_err) {
    had_err = gt_hashmap_foreach(se->slots, set_actuals_and_sort_them, se,
                                 NULL);
    gt_assert(!had_err); /* set_actuals_and_sort_them() is sane */
  }

  /* process the prediction stream */
  if (!had_err) {
    while (!had_err &&
             !(had_err = gt_node_stream_next(se->prediction, &gn, err)) &&
                gn) {
      /* we consider only genome features */
      if ((fn = gt_feature_node_try_cast(gn))) {
        /* get (real) slot */
        slot = gt_hashmap_get(se->slots,
                              gt_str_get(gt_genome_node_get_seqid(gn)));
        if (slot) {
          predicted_info.slot = slot;
          gt_feature_node_determine_transcripttypes(fn);
          had_err = gt_feature_node_traverse_children(fn, &predicted_info,
                                                      process_predicted_feature,
                                                      false, NULL);
          gt_assert(!had_err); /* cannot happen, process_predicted_feature() is
                               sane */
        }
        else {
          /* we got no (real) slot */
          gt_warning("sequence id \"%s\" (with predictions) not given in "
                     "reference", gt_str_get(gt_genome_node_get_seqid(gn)));
        }
      }
      if (nv)
        had_err = gt_genome_node_accept(gn, nv, err);
      gt_genome_node_delete(gn);
    }
  }

  /* determine the missing mRNAs */
  if (!had_err) {
    had_err = gt_hashmap_foreach(se->slots, determine_missing_features, se,
                                 NULL);
    gt_assert(!had_err); /* determine_missing_features() is sane */
  }

  /* compute the nucleotides values */
  if (!had_err && se->nuceval) {
    had_err = gt_hashmap_foreach(se->slots, compute_nucleotides_values, se,
                                 NULL);
    gt_assert(!had_err); /* compute_nucleotides_values() is sane */
  }

  return had_err;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0xa8, %rsp
movq %r9, %r14
movq %r8, %r15
movl %ecx, %ebp
movl %edx, %r12d
movl %esi, %r13d
movq %rdi, %rbx
testq %r9, %r9
je 0xaa5df
movq %r14, %rdi
callq 0x3566a
testb %al, %al
jne 0xaaab1
testq %rbx, %rbx
je 0xaaaac
movb 0x10(%rbx), %al
movb %al, 0x18(%rsp)
movb %r13b, 0x19(%rsp)
movb %al, 0x38(%rsp)
movb %r13b, 0x39(%rsp)
movb %r12b, 0x3a(%rsp)
movb %bpl, 0x3b(%rsp)
movq 0x18(%rbx), %rax
movq %rax, 0x40(%rsp)
movups 0x28(%rbx), %xmm0
movups %xmm0, 0x48(%rsp)
movups 0x38(%rbx), %xmm0
movups %xmm0, 0x58(%rsp)
movups 0x48(%rbx), %xmm0
movups %xmm0, 0x68(%rsp)
movups 0x58(%rbx), %xmm0
movups %xmm0, 0x78(%rsp)
movq 0x68(%rbx), %rax
movq %rax, 0x88(%rsp)
leaq 0x78(%rbx), %rax
movq %rax, 0x90(%rsp)
leaq 0x88(%rbx), %rax
movq %rax, 0x98(%rsp)
leaq 0x98(%rbx), %rax
movq %rax, 0xa0(%rsp)
movq (%rbx), %rdi
leaq 0x8(%rsp), %r12
movq %r12, %rsi
movq %r14, %rdx
callq 0x499e4
movl %eax, %r13d
testl %eax, %eax
sete %al
movq (%r12), %rdi
testq %rdi, %rdi
setne %cl
andb %al, %cl
cmpb $0x1, %cl
jne 0xaa929
leaq 0x8(%rsp), %r12
callq 0x4a358
testq %rax, %rax
je 0xaa87a
movq 0x20(%rbx), %r13
movq 0x8(%rsp), %rdi
callq 0x41f3f
movq %rax, %rdi
callq 0x3c40b
movq %r13, %rdi
movq %rax, %rsi
callq 0x77109
testq %rax, %rax
jne 0xaa87a
movb 0x10(%rbx), %r12b
movq 0x8(%rsp), %rdi
callq 0x41f83
movq %rax, 0x20(%rsp)
movq %rdx, 0x28(%rsp)
movl $0x1, %edi
movl $0x188, %esi            # imm = 0x188
leaq 0x51a74(%rip), %rdx     # 0xfc174
movl $0x91, %ecx
callq 0x3601f
movq %rax, %r13
leaq 0x20(%rsp), %rdi
callq 0x7e05b
movq %rax, %rbp
movl $0x8, %edi
callq 0x6e93c
movq %rax, (%r13)
movl $0x8, %edi
callq 0x6e93c
movq %rax, 0x8(%r13)
movl $0x8, %edi
callq 0x6e93c
movq %rax, 0x10(%r13)
movl $0x8, %edi
callq 0x6e93c
movq %rax, 0x18(%r13)
movl $0x8, %edi
callq 0x6e93c
movq %rax, 0x20(%r13)
callq 0xad608
movq %rax, 0x28(%r13)
callq 0xad608
movq %rax, 0x30(%r13)
callq 0xad608
movq %rax, 0x38(%r13)
callq 0xad608
movq %rax, 0x40(%r13)
cmpb $0x1, %r12b
jne 0xaa810
movups 0x20(%rsp), %xmm0
movups %xmm0, 0x68(%r13)
movq %rbp, %rdi
callq 0x70724
movq %rax, 0x98(%r13)
movq %rbp, %rdi
callq 0x70724
movq %rax, 0xa0(%r13)
movq %rbp, %rdi
callq 0x70724
movq %rax, 0xa8(%r13)
movq %rbp, %rdi
callq 0x70724
movq %rax, 0xb0(%r13)
movq %rbp, %rdi
callq 0x70724
movq %rax, 0xb8(%r13)
movq %rbp, %rdi
callq 0x70724
movq %rax, 0xc0(%r13)
movq %rbp, %rdi
callq 0x70724
movq %rax, 0xc8(%r13)
movq %rbp, %rdi
callq 0x70724
movq %rax, 0xd0(%r13)
callq 0xad884
movq %rax, 0x168(%r13)
callq 0xad884
movq %rax, 0x170(%r13)
callq 0xad884
movq %rax, 0x178(%r13)
callq 0xad884
movq %rax, 0x180(%r13)
movq 0x20(%rbx), %rbp
movq 0x8(%rsp), %rdi
callq 0x41f3f
movq %rax, %rdi
callq 0x3c40b
movq %rax, %rdi
callq 0x722dc
movq %rbp, %rdi
movq %rax, %rsi
movq %r13, %rdx
callq 0x77144
testq %r13, %r13
leaq 0x8(%rsp), %r12
je 0xaaaa2
movq 0x8(%rsp), %rdi
callq 0x415c0
testq %rax, %rax
je 0xaa8e4
movq %rax, %r13
movq 0x20(%rbx), %rbp
movq 0x8(%rsp), %rdi
callq 0x41f3f
movq %rax, %rdi
callq 0x3c40b
movq %rbp, %rdi
movq %rax, %rsi
callq 0x77109
testq %rax, %rax
je 0xaaa98
movq %rax, 0x10(%rsp)
movq %r13, %rdi
callq 0x409df
movq %r13, %rdi
leaq 0x10(%rsp), %rsi
leaq 0x1f3(%rip), %rdx       # 0xaaac5
xorl %ecx, %ecx
xorl %r8d, %r8d
callq 0x4068e
testl %eax, %eax
jne 0xaaa9d
testq %r15, %r15
je 0xaa8f9
movq 0x8(%rsp), %rdi
movq %r15, %rsi
movq %r14, %rdx
callq 0x42036
movq 0x8(%rsp), %rdi
callq 0x42ade
movq (%rbx), %rdi
movq %r12, %rsi
movq %r14, %rdx
callq 0x499e4
movl %eax, %r13d
testl %eax, %eax
sete %al
jne 0xaa929
movq 0x8(%rsp), %rdi
testq %rdi, %rdi
jne 0xaa69f
testb %al, %al
je 0xaa94d
movq 0x20(%rbx), %rdi
leaq 0x454(%rip), %rsi       # 0xaad8c
xorl %r13d, %r13d
movq %rbx, %rdx
xorl %ecx, %ecx
callq 0x771f5
testl %eax, %eax
jne 0xaaab6
testl %r13d, %r13d
jne 0xaaa38
leaq 0x8(%rsp), %r12
movq 0x8(%rbx), %rdi
movq %r12, %rsi
movq %r14, %rdx
callq 0x499e4
movl %eax, %r13d
testl %eax, %eax
jne 0xaaa38
movq 0x8(%rsp), %rdi
testq %rdi, %rdi
je 0xaaa38
callq 0x415c0
testq %rax, %rax
je 0xaaa08
movq %rax, %r13
movq 0x20(%rbx), %rbp
movq 0x8(%rsp), %rdi
callq 0x41f3f
movq %rax, %rdi
callq 0x3c40b
movq %rbp, %rdi
movq %rax, %rsi
callq 0x77109
testq %rax, %rax
je 0xaa9e5
movq %rax, 0x30(%rsp)
movq %r13, %rdi
callq 0x409df
movq %r13, %rdi
leaq 0x30(%rsp), %rsi
leaq 0x917(%rip), %rdx       # 0xab2e9
xorl %ecx, %ecx
xorl %r8d, %r8d
callq 0x4068e
testl %eax, %eax
je 0xaaa08
jmp 0xaaaa7
movq 0x8(%rsp), %rdi
callq 0x41f3f
movq %rax, %rdi
callq 0x3c40b
leaq 0x517b8(%rip), %rdi     # 0xfc1b6
movq %rax, %rsi
xorl %eax, %eax
callq 0x3da84
testq %r15, %r15
je 0xaaa22
movq 0x8(%rsp), %rdi
movq %r15, %rsi
movq %r14, %rdx
callq 0x42036
movl %eax, %r13d
jmp 0xaaa25
xorl %r13d, %r13d
movq 0x8(%rsp), %rdi
callq 0x42ade
testl %r13d, %r13d
je 0xaa95b
testl %r13d, %r13d
jne 0xaaa59
movq 0x20(%rbx), %rdi
leaq 0xf37(%rip), %rsi       # 0xab97f
xorl %r13d, %r13d
movq %rbx, %rdx
xorl %ecx, %ecx
callq 0x771f5
testl %eax, %eax
jne 0xaaabb
testl %r13d, %r13d
jne 0xaaa83
xorl %r13d, %r13d
cmpb $0x1, 0x10(%rbx)
jne 0xaaa83
movq 0x20(%rbx), %rdi
leaq 0x1029(%rip), %rsi      # 0xaba9b
xorl %r13d, %r13d
movq %rbx, %rdx
xorl %ecx, %ecx
callq 0x771f5
testl %eax, %eax
jne 0xaaac0
movl %r13d, %eax
addq $0xa8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
callq 0x24954
callq 0x2491b
callq 0x248e2
callq 0x249c6
callq 0x24a71
callq 0x248a9
callq 0x2498d
callq 0x249ff
callq 0x24a38