Exemple #1
0
int
solve_spiro(spiro_seg *s, int nseg)
{
    bandmat *m;
    double *v;
    int *perm;
    int nmat = count_vec(s, nseg);
    int n_alloc = nmat;
    double norm;
    int i;

    if (nmat == 0)
	return 0;
    if (s[0].ty != '{' && s[0].ty != 'v')
	n_alloc *= 3;
    if (n_alloc < 5)
	n_alloc = 5;
    m = (bandmat *)malloc(sizeof(bandmat) * n_alloc);
    v = (double *)malloc(sizeof(double) * n_alloc);
    perm = (int *)malloc(sizeof(int) * n_alloc);

    for (i = 0; i < 10; i++) {
	norm = spiro_iter(s, m, perm, v, nseg);
#ifdef VERBOSE
	printf("%% norm = %g\n", norm);
#endif
	if (norm < 1e-12) break;
    }

    free(m);
    free(v);
    free(perm);
    return 0;
}
 int longestPalindrome(string s) {
     vector<int> count_vec(58, 0);
     for(char c: s) {
         ++count_vec[c - 'A'];
     }
     int odd = 0;
     int result = 0;
     for(int x: count_vec) {
         odd |= x;
         result += x >> 1;
     }
     result <<= 1;
     result += odd & 1;
     return result;
 }
Exemple #3
0
static int
solve_spiro(spiro_seg *s, int nseg)
{
    int i, converged, nmat, n_alloc;
    bandmat *m;
    double *v;
    int *perm;
    double norm;

    nmat = count_vec(s, nseg);
    n_alloc = nmat;

    if (nmat == 0)
	return 1; /* just means no convergence problems */
    if (s[0].ty != '{' && s[0].ty != 'v')
	n_alloc *= 3;
    if (n_alloc < 5)
	n_alloc = 5;
    m = (bandmat *)malloc(sizeof(bandmat) * n_alloc);
    v = (double *)malloc(sizeof(double) * n_alloc);
    perm = (int *)malloc(sizeof(int) * n_alloc);

    i = converged = 0; /* not solved (yet) */
    if ( m!=NULL && v!=NULL && perm!=NULL ) {
	while (i++ < 60) {
	    norm = spiro_iter(s, m, perm, v, nseg, nmat);
#ifdef VERBOSE
	    printf("iteration #%d, %% norm = %g\n", i, norm);
#endif
	    if (check_finiteness(s, nseg)) break;
	    if (norm < 1e-12) { converged = 1; break; }
	}
#ifdef VERBOSE
	if (converged==0)
	    fprintf(stderr, "ERROR: LibSpiro: failed to converge after %d attempts to converge.\n", i);
    } else {
	fprintf(stderr, "ERROR: LibSpiro: failed to alloc memory.\n");
#endif
    }

    free(m);
    free(v);
    free(perm);
    return converged;
}
Exemple #4
0
int main() {
    std::string line;

    while (std::getline(std::cin, line))
    {
        size_t size;
        void* addrlist[16];

        int r = sscanf(
            line.data(),
            "malloc_tracker ### profile "
            "%zu %p %p %p %p %p %p %p %p %p %p %p %p %p %p %p %p\n",
            &size,
            &addrlist[0], &addrlist[1], &addrlist[2], &addrlist[3],
            &addrlist[4], &addrlist[5], &addrlist[6], &addrlist[7],
            &addrlist[8], &addrlist[9], &addrlist[10], &addrlist[11],
            &addrlist[12], &addrlist[13], &addrlist[14], &addrlist[15]);

        if (r != 17) continue;

        for (size_t i = 0; i < 16; ++i)
        {
            if (!addrlist[i]) break;
            count_map[Entry { addrlist[i], i, size }]++;
        }
    }

    std::vector<EntrySize> count_vec(count_map.begin(), count_map.end());

    std::sort(count_vec.begin(), count_vec.end());

    for (size_t i = count_vec.size() - 10000; i < count_vec.size(); ++i)
    {
        const EntrySize& es = count_vec[i];

        std::cout << es.second << '\t'
                  << es.first.size << '\t'
                  << es.first.ptr << '\t'
                  << es.first.depth << '\n';
    }

    return 0;
}
Exemple #5
0
static double
spiro_iter(spiro_seg *s, bandmat *m, int *perm, double *v, int n)
{
    int cyclic = s[0].ty != '{' && s[0].ty != 'v';
    int i, j, jj;
    int nmat = count_vec(s, n);
    double norm;
    int n_invert;

    for (i = 0; i < nmat; i++) {
	v[i] = 0.;
	for (j = 0; j < 11; j++)
	    m[i].a[j] = 0.;
	for (j = 0; j < 5; j++)
	    m[i].al[j] = 0.;
    }

    j = 0;
    if (s[0].ty == 'o')
	jj = nmat - 2;
    else if (s[0].ty == 'c')
	jj = nmat - 1;
    else
	jj = 0;
    for (i = 0; i < n; i++) {
	char ty0 = s[i].ty;
	char ty1 = s[i + 1].ty;
	int jinc = compute_jinc(ty0, ty1);
	double th = s[i].bend_th;
	double ends[2][4];
	double derivs[4][2][4];
	int jthl = -1, jk0l = -1, jk1l = -1, jk2l = -1;
	int jthr = -1, jk0r = -1, jk1r = -1, jk2r = -1;

	compute_pderivs(&s[i], ends, derivs, jinc);

	/* constraints crossing left */
	if (ty0 == 'o' || ty0 == 'c' || ty0 == '[' || ty0 == ']') {
	    jthl = jj++;
	    jj %= nmat;
	    jk0l = jj++;
	}
	if (ty0 == 'o') {
	    jj %= nmat;
	    jk1l = jj++;
	    jk2l = jj++;
	}

	/* constraints on left */
	if ((ty0 == '[' || ty0 == 'v' || ty0 == '{' || ty0 == 'c') &&
	    jinc == 4) {
	    if (ty0 != 'c')
		jk1l = jj++;
	    jk2l = jj++;
	}

	/* constraints on right */
	if ((ty1 == ']' || ty1 == 'v' || ty1 == '}' || ty1 == 'c') &&
	    jinc == 4) {
	    if (ty1 != 'c')
		jk1r = jj++;
	    jk2r = jj++;
	}

	/* constraints crossing right */
	if (ty1 == 'o' || ty1 == 'c' || ty1 == '[' || ty1 == ']') {
	    jthr = jj;
	    jk0r = (jj + 1) % nmat;
	}
	if (ty1 == 'o') {
	    jk1r = (jj + 2) % nmat;
	    jk2r = (jj + 3) % nmat;
	}

	add_mat_line(m, v, derivs[0][0], th - ends[0][0], 1, j, jthl, jinc, nmat);
	add_mat_line(m, v, derivs[1][0], ends[0][1], -1, j, jk0l, jinc, nmat);
	add_mat_line(m, v, derivs[2][0], ends[0][2], -1, j, jk1l, jinc, nmat);
	add_mat_line(m, v, derivs[3][0], ends[0][3], -1, j, jk2l, jinc, nmat);
	add_mat_line(m, v, derivs[0][1], -ends[1][0], 1, j, jthr, jinc, nmat);
	add_mat_line(m, v, derivs[1][1], -ends[1][1], 1, j, jk0r, jinc, nmat);
	add_mat_line(m, v, derivs[2][1], -ends[1][2], 1, j, jk1r, jinc, nmat);
	add_mat_line(m, v, derivs[3][1], -ends[1][3], 1, j, jk2r, jinc, nmat);
	j += jinc;
    }
    if (cyclic) {
	memcpy(m + nmat, m, sizeof(bandmat) * nmat);
	memcpy(m + 2 * nmat, m, sizeof(bandmat) * nmat);
	memcpy(v + nmat, v, sizeof(double) * nmat);
	memcpy(v + 2 * nmat, v, sizeof(double) * nmat);
	n_invert = 3 * nmat;
	j = nmat;
    } else {
	n_invert = nmat;
	j = 0;
    }
/*
#define VERBOSE
*/
#ifdef VERBOSE
    for (i = 0; i < n; i++) {
	int k;
	for (k = 0; k < 11; k++)
	    printf(" %2.4f", m[i].a[k]);
	printf(": %2.4f\n", v[i]);
    }
    printf("---\n");
#endif
    bandec11(m, perm, n_invert);
    banbks11(m, perm, v, n_invert);
    norm = 0.;
    for (i = 0; i < n; i++) {
	char ty0 = s[i].ty;
	char ty1 = s[i + 1].ty;
	int jinc = compute_jinc(ty0, ty1);
	int k;

	for (k = 0; k < jinc; k++) {
	    double dk = v[j++];

#ifdef VERBOSE
	    printf("s[%d].ks[%d] += %f\n", i, k, dk);
#endif
	    s[i].ks[k] += dk;
	    norm += dk * dk;
	}
    }
    return norm;
}