// File: /workspace/github_c_makefile_star2_O3/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 0xa9b13
movq %r14, %rdi
callq 0x34fea
testb %al, %al
jne 0xa9fc9
testq %rbx, %rbx
je 0xa9fc4
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 0x48d7c
movl %eax, %r13d
testl %eax, %eax
sete %al
movq (%r12), %rdi
testq %rdi, %rdi
setne %cl
andb %al, %cl
cmpb $0x1, %cl
jne 0xa9e54
leaq 0x8(%rsp), %r12
callq 0x49700
testq %rax, %rax
je 0xa9da5
movq 0x20(%rbx), %r13
movq 0x8(%rsp), %rdi
callq 0x415a1
movq %rax, %rdi
callq 0x3bb5d
movq %r13, %rdi
movq %rax, %rsi
callq 0x775ed
testq %rax, %rax
jne 0xa9da5
movb 0x10(%rbx), %r12b
movq 0x8(%rsp), %rdi
callq 0x415e5
movq %rax, 0x20(%rsp)
movq %rdx, 0x28(%rsp)
movl $0x1, %edi
movl $0x188, %esi            # imm = 0x188
leaq 0x524b0(%rip), %rdx     # 0xfc0e4
movl $0x91, %ecx
callq 0x359a6
movq %rax, %r13
leaq 0x20(%rsp), %rdi
callq 0x7e19f
movq %rax, %rbp
movl $0x8, %edi
callq 0x6ef7c
movq %rax, (%r13)
movl $0x8, %edi
callq 0x6ef7c
movq %rax, 0x8(%r13)
movl $0x8, %edi
callq 0x6ef7c
movq %rax, 0x10(%r13)
movl $0x8, %edi
callq 0x6ef7c
movq %rax, 0x18(%r13)
movl $0x8, %edi
callq 0x6ef7c
movq %rax, 0x20(%r13)
callq 0xacabc
movq %rax, 0x28(%r13)
callq 0xacabc
movq %rax, 0x30(%r13)
callq 0xacabc
movq %rax, 0x38(%r13)
callq 0xacabc
movq %rax, 0x40(%r13)
cmpb $0x1, %r12b
jne 0xa9d44
movups 0x20(%rsp), %xmm0
movups %xmm0, 0x68(%r13)
movq %rbp, %rdi
callq 0x70cd4
movq %rax, 0x98(%r13)
movq %rbp, %rdi
callq 0x70cd4
movq %rax, 0xa0(%r13)
movq %rbp, %rdi
callq 0x70cd4
movq %rax, 0xa8(%r13)
movq %rbp, %rdi
callq 0x70cd4
movq %rax, 0xb0(%r13)
movq %rbp, %rdi
callq 0x70cd4
movq %rax, 0xb8(%r13)
movq %rbp, %rdi
callq 0x70cd4
movq %rax, 0xc0(%r13)
movq %rbp, %rdi
callq 0x70cd4
movq %rax, 0xc8(%r13)
movq %rbp, %rdi
callq 0x70cd4
movq %rax, 0xd0(%r13)
callq 0xacd38
movq %rax, 0x168(%r13)
callq 0xacd38
movq %rax, 0x170(%r13)
callq 0xacd38
movq %rax, 0x178(%r13)
callq 0xacd38
movq %rax, 0x180(%r13)
movq 0x20(%rbx), %rbp
movq 0x8(%rsp), %rdi
callq 0x415a1
movq %rax, %rdi
callq 0x3bb5d
movq %rax, %rdi
callq 0x728c0
movq %rbp, %rdi
movq %rax, %rsi
movq %r13, %rdx
callq 0x77628
leaq 0x8(%rsp), %r12
movq 0x8(%rsp), %rdi
callq 0x40c37
testq %rax, %rax
je 0xa9e0f
movq %rax, %r13
movq 0x20(%rbx), %rbp
movq 0x8(%rsp), %rdi
callq 0x415a1
movq %rax, %rdi
callq 0x3bb5d
movq %rbp, %rdi
movq %rax, %rsi
callq 0x775ed
testq %rax, %rax
je 0xa9fb5
movq %rax, 0x10(%rsp)
movq %r13, %rdi
callq 0x40075
movq %r13, %rdi
leaq 0x10(%rsp), %rsi
leaq 0x1e0(%rip), %rdx       # 0xa9fdd
xorl %ecx, %ecx
xorl %r8d, %r8d
callq 0x3fd29
testl %eax, %eax
jne 0xa9fba
testq %r15, %r15
je 0xa9e24
movq 0x8(%rsp), %rdi
movq %r15, %rsi
movq %r14, %rdx
callq 0x41698
movq 0x8(%rsp), %rdi
callq 0x4210c
movq (%rbx), %rdi
movq %r12, %rsi
movq %r14, %rdx
callq 0x48d7c
movl %eax, %r13d
testl %eax, %eax
sete %al
jne 0xa9e54
movq 0x8(%rsp), %rdi
testq %rdi, %rdi
jne 0xa9bd3
testb %al, %al
je 0xa9fa0
movq 0x20(%rbx), %rdi
leaq 0x43d(%rip), %rsi       # 0xaa2a4
movq %rbx, %rdx
xorl %ecx, %ecx
callq 0x776d9
testl %eax, %eax
jne 0xa9fce
leaq 0x8(%rsp), %r12
movq 0x8(%rbx), %rdi
movq %r12, %rsi
movq %r14, %rdx
callq 0x48d7c
movl %eax, %r13d
testl %eax, %eax
jne 0xa9f5d
movq 0x8(%rsp), %rdi
testq %rdi, %rdi
je 0xa9f5d
callq 0x40c37
testq %rax, %rax
je 0xa9f2b
movq %rax, %r13
movq 0x20(%rbx), %rbp
movq 0x8(%rsp), %rdi
callq 0x415a1
movq %rax, %rdi
callq 0x3bb5d
movq %rbp, %rdi
movq %rax, %rsi
callq 0x775ed
testq %rax, %rax
je 0xa9f08
movq %rax, 0x30(%rsp)
movq %r13, %rdi
callq 0x40075
movq %r13, %rdi
leaq 0x30(%rsp), %rsi
leaq 0x90c(%rip), %rdx       # 0xaa801
xorl %ecx, %ecx
xorl %r8d, %r8d
callq 0x3fd29
testl %eax, %eax
je 0xa9f2b
jmp 0xa9fbf
movq 0x8(%rsp), %rdi
callq 0x415a1
movq %rax, %rdi
callq 0x3bb5d
leaq 0x52205(%rip), %rdi     # 0xfc126
movq %rax, %rsi
xorl %eax, %eax
callq 0x3d110
testq %r15, %r15
je 0xa9f45
movq 0x8(%rsp), %rdi
movq %r15, %rsi
movq %r14, %rdx
callq 0x41698
movl %eax, %r13d
jmp 0xa9f48
xorl %r13d, %r13d
movq 0x8(%rsp), %rdi
callq 0x4210c
testl %r13d, %r13d
je 0xa9e7e
jmp 0xa9fa0
testl %r13d, %r13d
jne 0xa9fa0
movq 0x20(%rbx), %rdi
leaq 0xf27(%rip), %rsi       # 0xaae94
xorl %r13d, %r13d
movq %rbx, %rdx
xorl %ecx, %ecx
callq 0x776d9
testl %eax, %eax
jne 0xa9fd3
cmpb $0x1, 0x10(%rbx)
jne 0xa9fa0
movq 0x20(%rbx), %rdi
leaq 0x1021(%rip), %rsi      # 0xaafb0
xorl %r13d, %r13d
movq %rbx, %rdx
xorl %ecx, %ecx
callq 0x776d9
testl %eax, %eax
jne 0xa9fd8
movl %r13d, %eax
addq $0xa8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
callq 0x24843
callq 0x2480a
callq 0x24927
callq 0x24960
callq 0x247d1
callq 0x2487c
callq 0x248b5
callq 0x248ee