This notebook addresses the case where each of the four $2$-torsion points has exactly one double zero above it.
We recall that in $\mathcal{H}(2^4)$, $d_{opt} = 9$.
import re
#This loads all of the 1-cylinder diagrams in (all connected components of the stratum) H(2,2) formatted as python lists
H2_2_cyl_diags = [[[[0, 5, 3, 1, 2, 4], [0, 5, 3, 1, 2, 4]]],
[[[0, 5, 2, 1, 4, 3], [0, 4, 2, 1, 5, 3]]],
[[[0, 5, 2, 3, 1, 4], [0, 3, 1, 5, 2, 4]]],
[[[0, 5, 3, 2, 1, 4], [0, 1, 3, 4, 5, 2]]]]
#This loads all of the functions for processing cylinder diagrams
#Only the general cylinder diagram functions are needed in this case
%run ./ST5_fcns/cyl_diag_fcns.ipynb
#In the previous case finding a simple zero sufficed to extract potential odd length saddle connections
#In this case it's the switch from one zero to another that marks an odd saddle connection
def extract_switch(vertex_labels):
cyl_bot = vertex_labels[0][0]
cyl_bot_int = [int(j[1:]) for j in cyl_bot]
# print(cyl_bot_int)
length = len(cyl_bot)
switch_list = []
for i in enumerate(cyl_bot_int):
if i[1] == cyl_bot_int[(i[0]+1)%length]:
switch_list += [0]
else:
switch_list += [1]
return switch_list
def strat_odd_sc_2t4(master_list):
#This is the main function to run to get the processed data
#The data consists of
total = []
for i in master_list:
print(i, ' from master')
print(vertex_labels(i))
total.append((i,[extract_switch(vertex_labels(i))]))
return total
#This runs instantly and constructs all of the binary lists
H2_2_vertex_data = strat_odd_sc_2t4(H2_2_cyl_diags)
Among partitions of $18$ into $6$ numbers the minimum of the maximum numbers among all partitions is $2d_{opt}/6 = 3$, which is $3$ in this case.
Solving $18 - 2(3) - 2t_0 \geq 0$ implies that the largest value of $t_0$ is $6$.
Since the situation is symmetric, the same bound applies to $s_0$.
In summary:
$$3 \leq s_0, t_0 \leq 6$$
Unlike the cases where $d_{opt}$ was even, this case has very few restrictions on the partitions. There must be at least two odd numbers in the partitions, but any positive even number is permissible. Therefore, we rewrite the usual partition functions without the usual restrictions.
def partition_pre(n, d, t_max = None, depth=0):
#Function pulled from https://stackoverflow.com/questions/10035752/elegant-python-code-for-integer-partitioning
#Written by Nico Schlömer
if t_max == None:
t_max = n+1
if d == depth:
return [[]]
return [
item + [i]
for i in range(1,min(n+1,t_max+1))
for item in partition_pre(n-i, d, t_max = t_max, depth=depth+1)
]
def t_max_check(part, t_max):
for j in part:
if j > t_max:
return False
return True
def partition(n, d, t_max):
#Function pulled from https://stackoverflow.com/questions/10035752/elegant-python-code-for-integer-partitioning
#Written by Nico Schlömer
#Key in the if statement below is that the functions are sorted in terms of computational complexity
#The fastest check is performed first and the most intensive last
return [[n-sum(p)] + p for p in partition_pre(n-1, d-1, t_max = t_max)
if t_max_check([n-sum(p)] + p, t_max)]
def odd_number_count_check(part):
if sum([j%2 for j in part]) >= 2:
return True
else:
return False
def create_sc_partition_file_big_tuple(t_tuple_begin, d_opt, part_length, filename_root):
width = 2*d_opt
t_list_begin = list(t_tuple_begin)
n = width - sum(t_list_begin)
d = part_length-len(t_list_begin)
end_part_list = partition(n, d, t_max = t_list_begin[0])
part_list = [tuple(t_list_begin + part) for part in end_part_list
if odd_number_count_check(t_list_begin + part)]
file_tag = ''
for t in t_list_begin:
file_tag += str(t) + '_'
file_tag = file_tag[:-1]
filename = filename_root + file_tag
with open(filename, 'w') as file:
file.write(str(part_list))
print(filename + ' written')
return 'done'
def create_sc_partition_file(t_tuple_begin, d_opt, part_length, filename_root, t0_range):
width = 2*d_opt
try:
t_tuple_begin_list = list(t_tuple_begin)
except:
t_tuple_begin_list = [int(t_tuple_begin)]
if len(t_tuple_begin_list) > 0:
return create_sc_partition_file_big_tuple(t_tuple_begin_list, width, part_length, filename_root)
else:
total = []
for t0 in t0_range:
t_list_begin = [t0]
n = width - t0
d = part_length - 1
end_part_list = partition(n, d, t_max = t_list_begin[0])
part_list = [tuple(t_list_begin + part) for part in end_part_list
if odd_number_count_check(t_list_begin + part)]
total += part_list
with open(filename_root, 'w') as file:
file.write(str(total))
print(filename_root + ' written')
return 'done'
if True:
create_sc_partition_file((), part_length = 6, t0_range = range(3,7), d_opt = 9,
filename_root = 'ST5_data//H_2t4//4_branch_point//partitions//H2_2_part')
#Load the partitions
if True:
with open('ST5_data//H_2t4//4_branch_point//partitions//H2_2_part', 'r') as file:
H2_2_part = eval(file.read())
#This loads all of the align_list functions needed for nearly every case
#This includes the align_list evaluate function
%run ./ST5_fcns/align_list_fcns.ipynb
if True:
for t in range(3,7):
align_list_write_file(H2_2_part, H2_2_vertex_data,
'ST5_data//H_2t4//4_branch_point//align_list//H_2_2_align_list',
t0 = t)
#This loads all of the visible_align_list functions needed for nearly every case
%run ./ST5_fcns/align_list_visible_fcns.ipynb
if True:
generate_all_align_list_visible_files(range(3,7), range(3,7), 9,
'ST5_data//H_2t4//4_branch_point//',
'align_list//H_2_2_align_list_',
'align_list_visible//H_2_2_align_list_')
#At this point, none of the files above need to be loaded for this to run.
#Once the files above are generated, the file sizes are small enough that these can be loaded on the fly.
#This loads all of the visible_align_list functions needed for nearly every case
%run ./ST5_fcns/combine_align_list_visible_fcns.ipynb
if True:
combine_align_list_visible_write_file(s_range = range(3,7),
s_filename_root = 'align_list_visible//H_2_2_align_list_',
t_range = range(3,7),
t_filename_root = 'align_list_visible//H_2_2_align_list_',
d_opt = 9,
root_dir = 'ST5_data//H_2t4//4_branch_point//')
#This loads all of the vertical permutation check functions needed for nearly every case
#This function can be run once admissible_list is written and without needing to load any other file
%run ./ST5_fcns/vert_perm_check_fcns.ipynb
#This checks that all (both) of the vertical permutations have the correct length of 2*d_opt
if True:
vert_perm_check_file(9, 'ST5_data//H_2t4//4_branch_point//')
if True:
all_vert_perm_check_file(9, 'ST5_data//H_2t4//4_branch_point//')
%run ./ST5_fcns/slope_test_fcn.ipynb
if True:
final_list = slope_test(9, 'ST5_data//H_2t4//4_branch_point//')