/* -*- mode: C; mode: folding; fill-column: 70; -*- */
/* Copyright 2010,  Georgia Institute of Technology, USA. */
/* See COPYING for license. */
#include "compat.h"
#include <stdlib.h>

#include "xalloc.h"
#include "prng.h"
#include "rmat.h"
#include "generator/splittable_mrg.h"
#include "generator/permutation_gen.h"
#include "generator/graph_generator.h"

void
kronecker_edgelist (int64_t *IJ_in, int64_t nedge, int64_t SCALE,
		    double A, double B, double C)
{
  const int64_t nvtx = 1L<<SCALE;
  mrg_state state;
  int64_t * restrict IJ = IJ_in;
  int64_t * restrict vperm = NULL;
  int64_t k;
  double D;

  D = 1.0 - (A+B+C);

  vperm = xmalloc_large_ext (nvtx * sizeof (*vperm));

#if !defined(__MTA__)
  double initiator[] = {A, B, C, D};

  OMP("omp parallel") {
    generate_kronecker (omp_get_thread_num (), omp_get_num_threads (),
			prng_seed, SCALE, nedge, initiator, IJ);
  }
#else /* __MTA__ */
  int64_t rank, size;
  MTA("mta use 100 streams") MTA("mta for all streams rank of size") {
    double tinitiator[] = {A, B, C, D};
    generate_kronecker (rank, size, prng_seed, SCALE, nedge, tinitiator, IJ);
  }
#endif

  OMP("omp parallel") {
    permute_vertex_labels (IJ, nedge, nvtx, prng_state, vperm);

    OMP("omp barrier");
    OMP("omp master") xfree_large (vperm);

    permute_edgelist (IJ, nedge, prng_state);
  }
}