summaryrefslogtreecommitdiff
path: root/lib/initial_finite.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/initial_finite.c')
-rw-r--r--lib/initial_finite.c145
1 files changed, 123 insertions, 22 deletions
diff --git a/lib/initial_finite.c b/lib/initial_finite.c
index fb120f0..6ea76ef 100644
--- a/lib/initial_finite.c
+++ b/lib/initial_finite.c
@@ -23,6 +23,40 @@ q_t *initialize_R(q_t q) {
return R;
}
+R_t *transformation_bringing_to_zero(q_t q, R_t n_transformations, q_t *transformations) {
+ R_t *destination = (R_t *)malloc(q * sizeof(R_t));
+
+ for (q_t i = 0; i < q; i++) {
+ for (R_t j = 0; j < n_transformations; j++) {
+ if (transformations[q * j + i] == 0) {
+ destination[i] = j;
+ }
+ }
+ }
+
+ return destination;
+}
+
+R_t find_involutions(R_t *destination, q_t q, R_t n_transformations, q_t *transformations) {
+ R_t n_involutions = 0;
+
+ for (R_t i = 1; i < n_transformations; i++) {
+ bool is_involution = true;
+ for (q_t j = 0; j < q; j++) {
+ if (j != transformations[q * i + transformations[q * i + j]]) {
+ is_involution = false;
+ break;
+ }
+ }
+ if (is_involution) {
+ destination[n_involutions] = i;
+ n_involutions++;
+ }
+ }
+
+ return n_involutions;
+}
+
state_finite_t *initial_finite_prepare_ising(D_t D, L_t L, double T, double *H) {
state_finite_t *s = (state_finite_t *)calloc(1, sizeof(state_finite_t));
@@ -38,11 +72,26 @@ state_finite_t *initial_finite_prepare_ising(D_t D, L_t L, double T, double *H)
}
s->q = 2;
- s->n_transformations = 1;
- s->transformations = (q_t *)malloc(2 * sizeof(q_t));
- s->transformations[0] = 1;
- s->transformations[1] = 0;
+ s->n_transformations = 2;
+ s->transformations = (q_t *)malloc(2 * 2 * sizeof(q_t));
+ s->transformations[0] = 0;
+ s->transformations[1] = 1;
+ s->transformations[2] = 1;
+ s->transformations[3] = 0;
+
+ s->n_involutions = 1;
+ s->involutions = (R_t *)malloc(1 * sizeof(R_t));
+ s->involutions[0] = 1;
+
+ s->transform_site_to_zero = (R_t *)malloc(2 * sizeof(R_t));
+ s->transform_site_to_zero[0] = 0;
+ s->transform_site_to_zero[1] = 1;
+
+ s->n_bond_types = 2;
+ s->bond_with_zero_type = (q_t *)malloc(2 * sizeof(q_t));
+ s->bond_with_zero_type[0] = 0;
+ s->bond_with_zero_type[1] = 1;
s->T = T;
s->J = (double *)malloc(2 * sizeof(double));
@@ -81,19 +130,34 @@ state_finite_t *initial_finite_prepare_potts(D_t D, L_t L, q_t q, double T, doub
}
s->q = q;
- s->n_transformations = q;
- s->transformations = dihedral_gen_transformations(q);
+ s->n_transformations = factorial(q);
+ s->transformations = symmetric_gen_transformations(q);
+ s->involutions = (R_t *)malloc(s->n_transformations * sizeof(R_t));
+ s->n_involutions = find_involutions(s->involutions, q, s->n_transformations, s->transformations);
+
+ s->transform_site_to_zero = transformation_bringing_to_zero(q, s->n_transformations, s->transformations);
+
+ s->n_bond_types = 2;
+
+ s->bond_with_zero_type = (q_t *)malloc(q * sizeof(q_t));
+
+ s->bond_with_zero_type[0] = 0;
+
+ for (q_t i = 1; i < q; i++) {
+ s->bond_with_zero_type[i] = 1;
+ }
s->T = T;
- s->J = (double *)calloc(q, sizeof(double));
+ s->J = (double *)calloc(2, sizeof(double));
s->J[0] = 1.0;
+ s->J[1] = 0.0;
s->H = (double *)malloc(q * sizeof(double));
for (q_t i = 0; i < q; i++) {
s->H[i] = H[i];
}
- s->J_probs = Jprobs_from_J(q, T, s->J);
+ s->J_probs = Jprobs_from_J(s->n_bond_types, T, s->J);
s->H_probs = Jprobs_from_J(q, T, s->H);
s->spins = (q_t *)calloc(s->nv, sizeof(q_t));
@@ -101,7 +165,7 @@ state_finite_t *initial_finite_prepare_potts(D_t D, L_t L, q_t q, double T, doub
s->M = (v_t *)calloc(q, sizeof(v_t));
s->M[0] = s->nv; // everyone starts in state 0, remember?
- s->B = (v_t *)calloc(q, sizeof(v_t));
+ s->B = (v_t *)calloc(s->n_bond_types, sizeof(v_t));
s->B[0] = s->ne; // everyone starts in state 0, remember?
return s;
@@ -122,13 +186,30 @@ state_finite_t *initial_finite_prepare_clock(D_t D, L_t L, q_t q, double T, doub
}
s->q = q;
- s->n_transformations = q;
+
+ s->n_transformations = 2 * q;
s->transformations = dihedral_gen_transformations(q);
+ s->n_involutions = q;
+ s->involutions = dihedral_gen_involutions(q);
+
+ s->transform_site_to_zero = transformation_bringing_to_zero(q, s->n_transformations, s->transformations);
+ s->bond_with_zero_type = malloc(q * sizeof(q_t));
+
+ s->n_bond_types = q / 2 + 1;
+
+ for (q_t i = 0; i < q / 2 + 1; i++) {
+ s->bond_with_zero_type[i] = i;
+ }
+
+ for (q_t i = 1; i < (q + 1) / 2; i++) {
+ s->bond_with_zero_type[q - i] = i;
+ }
+
s->T = T;
- s->J = (double *)malloc(q * sizeof(double));
+ s->J = (double *)malloc(s->n_bond_types * sizeof(double));
- for (q_t i = 0; i < q; i++) {
+ for (q_t i = 0; i < s->n_bond_types; i++) {
s->J[i] = cos(2 * M_PI * i / ((double)q));
}
@@ -138,7 +219,7 @@ state_finite_t *initial_finite_prepare_clock(D_t D, L_t L, q_t q, double T, doub
s->H[i] = H[i];
}
- s->J_probs = Jprobs_from_J(q, T, s->J);
+ s->J_probs = Jprobs_from_J(s->n_bond_types, T, s->J);
s->H_probs = Jprobs_from_J(q, T, s->H);
s->spins = (q_t *)calloc(s->nv, sizeof(q_t));
@@ -146,7 +227,7 @@ state_finite_t *initial_finite_prepare_clock(D_t D, L_t L, q_t q, double T, doub
s->M = (v_t *)calloc(q, sizeof(v_t));
s->M[0] = s->nv; // everyone starts in state 0, remember?
- s->B = (v_t *)calloc(q, sizeof(v_t));
+ s->B = (v_t *)calloc(s->n_bond_types, sizeof(v_t));
s->B[0] = s->ne; // everyone starts in state 0, remember?
return s;
@@ -168,17 +249,30 @@ state_finite_t *initial_finite_prepare_dgm(D_t D, L_t L, q_t q, double T, double
}
s->q = q;
- s->n_transformations = q;
+
+ s->n_transformations = 2 * q;
s->transformations = dihedral_gen_transformations(q);
+ s->n_involutions = q;
+ s->involutions = dihedral_gen_involutions(q);
- s->T = T;
- s->J = (double *)malloc(q * sizeof(double));
+ s->transform_site_to_zero = transformation_bringing_to_zero(q, s->n_transformations, s->transformations);
+ s->bond_with_zero_type = malloc(q * sizeof(q_t));
+
+ s->n_bond_types = q / 2 + 1;
for (q_t i = 0; i < q / 2 + 1; i++) {
- s->J[i] = -pow(i, 2);
+ s->bond_with_zero_type[i] = i;
}
- for (q_t i = 1; i < (q + 1) / 2; i++) {
- s->J[q - i] = -pow(i, 2);
+
+ for (q_t i = 1; i < (q + 1) / 2; i++) {
+ s->bond_with_zero_type[(int)q - (int)i] = i;
+ }
+
+ s->T = T;
+ s->J = (double *)malloc(s->n_bond_types * sizeof(double));
+
+ for (q_t i = 0; i < s->n_bond_types; i++) {
+ s->J[i] = -pow(i, 2);
}
s->H = (double *)malloc(q * sizeof(double));
@@ -186,7 +280,7 @@ state_finite_t *initial_finite_prepare_dgm(D_t D, L_t L, q_t q, double T, double
s->H[i] = H[i];
}
- s->J_probs = Jprobs_from_J(q, T, s->J);
+ s->J_probs = Jprobs_from_J(s->n_bond_types, T, s->J);
s->H_probs = Jprobs_from_J(q, T, s->H);
s->spins = (q_t *)calloc(s->nv, sizeof(q_t));
@@ -194,6 +288,8 @@ state_finite_t *initial_finite_prepare_dgm(D_t D, L_t L, q_t q, double T, double
s->M = (v_t *)calloc(q, sizeof(v_t));
s->M[0] = s->nv; // everyone starts in state 0, remember?
+ s->B = (v_t *)calloc(s->n_bond_types, sizeof(v_t));
+ s->B[0] = s->nv; // everyone starts in state 0, remember?
return s;
}
@@ -201,8 +297,10 @@ state_finite_t *initial_finite_prepare_dgm(D_t D, L_t L, q_t q, double T, double
double state_finite_energy(state_finite_t *s) {
double E = 0;
- for (q_t i = 0; i < s->q; i++) {
+ for (q_t i = 0; i < s->n_bond_types; i++) {
E += s->J[i] * s->B[i];
+ }
+ for (q_t i = 0; i < s->q; i++) {
E += s->H[i] * s->M[i];
}
@@ -220,6 +318,9 @@ void state_finite_free(state_finite_t *s) {
free(s->M);
free(s->B);
free(s->transformations);
+ free(s->involutions);
+ free(s->transform_site_to_zero);
+ free(s->bond_with_zero_type);
free(s);
}