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); }
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; }
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; }
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; }
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; }
slint_t binning_radix_destroy(binning_t *bm) /* sl_proto, sl_func binning_radix_destroy */ { elements_free(&bm->bd.radix.sx); return 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; }