Algorithm-PageRank-XS

 view release on metacpan or  search on metacpan

XS.xs  view on Meta::CPAN

      else
        array_push(tmp, from);
    }

void
iterate(SV * num)
  CODE:
  Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
              "iterate() is not supported by Algorithm::PageRank::XS.");

SV *
result(pagerank p)
  PREINIT:
    HV * results;
    SV * curkey, * curval;
    int i;
    char * reskey;
    STRLEN len;
    Array * result;
    SV ** res;
  INIT:
    results = (AV *)sv_2mortal((SV *)newAV());
  CODE:
    if (p->num_elements < 2)
      croak("Only one element in pagerank table.");

    result = page_rank(p->main_table, p->num_elements, p->alpha, p->convergence,
                       p->max_tries);
    if (!result) {
      /* To prevent us from running twice. */
      clear(aTHX_ p);
      croak("pageRank calculation failed.");
    }

    results = newHV();
    curkey = sv_newmortal();
    for (i = 0; i < array_len(result); i++) {
      sv_setuv(curkey, i);
      reskey = SvPV(curkey, len);
      res = hv_fetch(p->rev_map, reskey, len, 0);
      if (res == NULL) {
        clear(aTHX_ p);
        croak("pageRank calculation failed -- couldn't find label");
      }

      reskey = SvPV(*res, len);

      curval = newSVnv(array_get(result, i));
      hv_store(results, reskey, len, curval, 0);
    }
    array_delete(result);
    RETVAL = newRV((SV *)results);
    clear(aTHX_ p);
  OUTPUT:
    RETVAL

void
DESTROY(pagerank p)
  PREINIT:
        SV *x;
  PPCODE:
        hv_undef(p->dim_map);
        hv_undef(p->rev_map);
        table_delete(p->main_table);
        Safefree(p);

BOOT:
  if (MAX_SIZE < 0) croak("signed size_t?");



( run in 2.360 seconds using v1.01-cache-2.11-cpan-71847e10f99 )