コード例 #1
0
ファイル: scrolling.c プロジェクト: Limsik/e17
void
scrolling_free(Scrolling *s)
{
  if (!s) return;

  if (s->elts[0]) elements_free(s->elts[0]);
  if (s->elts[1]) elements_free(s->elts[1]);
  if (s->elts[2]) elements_free(s->elts[2]);
  free(s);
}
コード例 #2
0
slint sort_permute_forward(elements_t *s, elements_t *sx, slint *perm, slint offset, slint mask_bit) /* sl_proto, sl_func sort_permute_forward */
{
  elements_t _sx;

  if (s == NULL) return -1;

  if (s->size < 2) return 0;

  rti_tstart(rti_tid_sort_permute_forward);

  if (sx == NULL || sx->size < 1)
  {
    sx = &_sx;
    elements_alloc(sx, 1, SLCM_ALL);
  }

  if (mask_bit < 0) sort_permute_forward_(s, sx, perm, offset);
  else sort_permute_forward_masked(s, sx, perm, offset, 1L << xmin(mask_bit, (sizeof(slint) * 8) - 1));

  if (sx == &_sx) elements_free(sx);

  rti_tstop(rti_tid_sort_permute_forward);

  return 0;
}
コード例 #3
0
slint_t sort_radix_ma(elements_t *s, elements_t *sx, slint_t rhigh, slint_t rlow, slint_t rwidth) /* sl_proto, sl_func sort_radix_ma */
{
  elements_t _sx;


  if (s == NULL) return -1;

  if (s->size < 2) return 0;

  rti_tstart(rti_tid_sort_radix);

  if (sx == NULL || sx->size < 1)
  {
    sx = &_sx;
    elements_alloc(sx, 1, SLCM_ALL);

  } else if (sx->size < 1) return -1;

  if (rhigh < 0) rhigh = key_radix_high;
  if (rlow < 0) rlow = key_radix_low;
  if (rwidth <= 0) rwidth = sort_radix_width_default;

  rs_rec_ma(s, sx, rhigh, rlow, xmin(rwidth, sort_radix_width_max));

  if (sx == &_sx) elements_free(sx);

  rti_tstop(rti_tid_sort_radix);

  return 0;
}
コード例 #4
0
ファイル: scrolling.c プロジェクト: Limsik/e17
Scrolling *
scrolling_new(Game *g, int nbr)
{
  Scrolling *s;
  Evas_Coord gw;
  Evas_Coord gh;

  if (nbr <= 0) return NULL;

  s = (Scrolling *)calloc(1, sizeof(Scrolling));
  if (!s) return NULL;

  game_size_get(g, &gw, &gh);

  s->elts[0] = elements_new(game_evas_get(g), gw, gh, nbr, SCROLLING_LEFT);
  if (!s->elts[0])
    goto free_s;

  s->elts[1] = elements_new(game_evas_get(g), gw, gh, nbr, SCROLLING_RIGHT);
  if (!s->elts[1])
    goto free_elts_0;

  s->g = g;

  s->nebula = edje_object_add(game_evas_get(s->g));
  if (edje_object_file_set(s->nebula, "theme.edj", "nebula"))
    {
      double r;
      Evas_Coord w;
      Evas_Coord h;

      srand(time(NULL));
      edje_object_size_min_get(s->nebula, &w, &h);
      r = (double)(gw - 40 - w) * (double)rand() / (double)RAND_MAX;
      evas_object_move (s->nebula, 20 + (Evas_Coord)r, -h);
      evas_object_resize(s->nebula, w, h);
      evas_object_layer_set(s->nebula, -8);
      evas_object_show (s->nebula);
      ecore_timer_add(0.06, _nebula_move_cb, s);
    }

  return s;

 free_elts_0:
  elements_free(s->elts[0]);
 free_s:
  free(s);

  return NULL;
}
コード例 #5
0
slint sort_radix_af(elements_t *s, elements_t *sx, slint rhigh, slint rlow, slint rwidth) /* sl_proto, sl_func sort_radix_af */
{
  elements_t _sx;

  slint finalize = 1;

#ifdef insertsort_finalize_adaptive
  finalize = 0;
#endif /* insertsort_finalize_adaptive */

  if (s == NULL) return -1;

  if (s->size < 2) return 0;

  rti_tstart(rti_tid_sort_radix);

  if (sx == NULL || sx->size < 1)
  {
    sx = &_sx;
    elements_alloc(sx, 1, SLCM_ALL);
  }

  if (rhigh < 0) rhigh = key_radix_high;
  if (rlow < 0) rlow = key_radix_low;
  if (rwidth <= 0) rwidth = sort_radix_width_default;

  rs_rec_af(s, sx, rhigh, rlow, xmin(rwidth, sort_radix_width_max), &finalize);

#ifdef insertsort_finalize
  if (sort_radix_threshold_rec > 1 && finalize) rs_rec_insertsort_af(s, sx, rhigh, rlow);
#endif /* insertsort_finalize */

  if (sx == &_sx) elements_free(sx);

  rti_tstop(rti_tid_sort_radix);

  return 0;
}
コード例 #6
0
slint_t binning_radix_destroy(binning_t *bm) /* sl_proto, sl_func binning_radix_destroy */
{
  elements_free(&bm->bd.radix.sx);

  return 0;
}
コード例 #7
0
slint_t mpi_select_sample_regular(elements_t *s, slint_t nparts, partcond_t *pconds, slint_t nsamples, splitter_t *sp, int size, int rank, MPI_Comm comm) /* sl_proto, sl_func mpi_select_sample_regular */
{
  slint_t i, j;
  slweight_t w, wi, wold;

  const slint_t nslocal = nsamples;
  const slint_t nsglobal = nslocal * size;

  const slint_t nsplitter = nparts - 1;

#ifdef elem_weight
  slpwkey_t lskeys[nslocal];
  slpwkey_t gskeys[nsglobal];
#else
  slkey_pure_t lskeys[nslocal];
  slkey_pure_t gskeys[nsglobal];
#endif
  slkey_pure_t skeys[nsplitter];

  slint_t lgcounts[2];
#ifdef elem_weight
  slweight_t lgweights[2];
#endif

  partcond_intern_t pci[nparts];

  elements_t gs, e;

#ifdef elem_weight
  slint_t doweights;
#else
# define doweights  0
#endif


#ifdef elem_weight
  doweights = ((pconds->pcm & (SLPC_WEIGHTS_MM|SLPC_WEIGHTS_LH)) != 0);
#endif

#ifdef elem_weight
  if (doweights) mpi_elements_get_counts_and_weights(s, 1, lgcounts, lgweights, -1, size, rank, comm);
  else
#endif
    mpi_elements_get_counts(s, &lgcounts[0], &lgcounts[1], -1, size, rank, comm);

  init_partconds_intern(nparts, pci, pconds, nparts, lgcounts[1], elem_weight_ifelse(doweights?lgweights[1]:0, 0));

  SL_TRACE_IF(MSS_TRACE_IF, "counts: %" slint_fmt " / %" slint_fmt, lgcounts[0], lgcounts[1]);
#ifdef elem_weight
  if (doweights)
    SL_TRACE_IF(MSS_TRACE_IF, "weights: %" slweight_fmt " / %" slweight_fmt "", lgweights[0], lgweights[1]);
#endif

#ifdef elem_weight
  j = 0;
  w = 0;
  wold = 0;
  for (i = 0; i < nslocal; ++i)
  {
    wi = (i + 1) * lgweights[0] / (nslocal + 1);

    while (w < wi && j < lgcounts[0])
    {
      w += elem_weight(s, j);
      ++j;
    }
    
    if (j < lgcounts[0]) lskeys[i].pkey = *key_get_pure(elem_key_at(s, j));
    else lskeys[i].pkey = *key_get_pure(elem_key_at(s, j - 1)) + 1;

    lskeys[i].weight = w - wold;
    
    wold = w;

/*    printf("%" slint_fmt ": key: %" slint_fmt " / weight: %" slweight_fmt "\n", i, lskeys[i].pkey, lskeys[i].weight);*/
  }
#else
  for (i = 0; i < nslocal; ++i) lskeys[i] = *key_get_pure(elem_key_at(s, sl_pivot_equal(s->size, i + 1, nslocal)));
#endif

#ifdef elem_weight
  MPI_Gather(lskeys, nslocal, pwkey_mpi_datatype, gskeys, nslocal, pwkey_mpi_datatype, MSS_ROOT, comm);
#else
  MPI_Gather(lskeys, nslocal, pkey_mpi_datatype, gskeys, nslocal, pkey_mpi_datatype, MSS_ROOT, comm);
#endif

  if (rank == MSS_ROOT)
  {
    elements_alloc(&gs, nsglobal, SLCM_ALL);

    gs.size = nsglobal;
#ifdef elem_weight
    for (i = 0; i < nsglobal; ++i)
    {
      key_set_pure(elem_key_at(&gs, i), gskeys[i].pkey);
      elem_weight(&gs, i) = gskeys[i].weight;
    }
#else
    for (i = 0; i < nsglobal; ++i) key_set_pure(elem_key_at(&gs, i), gskeys[i]);
#endif

    sort_radix(&gs, NULL, -1, -1, -1);

/*    printf("samples:\n");
    elements_print_all(&gs);*/

#ifdef elem_weight
    j = 0;
    w = 0;
    for (i = 0; i < nsplitter; ++i)
    {
      wi = (i + 1) * lgweights[1] / (nsplitter + 1);

      while (w < wi && j < nsglobal)
      {
        w += elem_weight(&gs, j);
        ++j;
      }

      if (j > 0 && (wi - w + elem_weight(&gs, j - 1)) <= (w - wi))
      {
        w -= elem_weight(&gs, j - 1);
        --j;
      }
      skeys[i] = *key_get_pure(elem_key_at(&gs, j - 1));

/*      printf("%" slint_fmt ": key: %" slint_fmt " / weight: %" slweight_fmt "\n", i, skeys[i], w);*/
    }
    
    skeys[i] = *key_get_pure(elem_key_at(&gs, sl_pivot_equal(gs.size, i + 1, nsplitter)));
#else
    for (i = 0; i < nsplitter; ++i) skeys[i] = *key_get_pure(elem_key_at(&gs, sl_pivot_equal(gs.size, i + 1, nsplitter)));
#endif

    elements_free(&gs);
  }

#ifdef elem_weight
  MPI_Bcast(&skeys, nsplitter, pwkey_mpi_datatype, MSS_ROOT, comm);
#else
  MPI_Bcast(&skeys, nsplitter, pkey_mpi_datatype, MSS_ROOT, comm);
#endif

  sp->displs[0] = 0;
  for (i = 0; i < nsplitter; ++i)
  {
    elem_assign_at(s, sp->displs[i], &e);
    e.size = s->size - sp->displs[i];

    sp->displs[i + 1] = sp->displs[i] + sl_search_binary_lt(&e, &skeys[i]);

    printf("%d: %" slint_fmt ": %" sl_key_pure_type_fmt " -> displs[%" slint_fmt "] = %d\n", rank, i, skeys[i], i + 1, sp->displs[i + 1]);
  }
  
  return 0;
}