first lines for cab.update function
This commit is contained in:
parent
b729a4eeee
commit
acbf651697
@ -7,6 +7,8 @@ from typing import Iterable
|
|||||||
SIGNATURE = 0
|
SIGNATURE = 0
|
||||||
SIGMA = 1
|
SIGMA = 1
|
||||||
|
|
||||||
|
# 9.11 (9.8)
|
||||||
|
# 9.15 (9.9)
|
||||||
|
|
||||||
|
|
||||||
class SignatureFunction(object):
|
class SignatureFunction(object):
|
||||||
@ -21,40 +23,57 @@ class SignatureFunction(object):
|
|||||||
|
|
||||||
msg = "Signature function is defined on the interval [0, 1)."
|
msg = "Signature function is defined on the interval [0, 1)."
|
||||||
assert all(k < 1 for k, v in values), msg
|
assert all(k < 1 for k, v in values), msg
|
||||||
|
counter2 = collections.Counter({ k : v for k, v in values})
|
||||||
for k, v in values:
|
for k, v in values:
|
||||||
counter[k] += v
|
counter[k] += v
|
||||||
|
assert counter2 == counter
|
||||||
self.cnt_signature_jumps = counter
|
self.cnt_signature_jumps = counter
|
||||||
|
self.tikz_plot("bum.tex")
|
||||||
|
|
||||||
def sum_of_absolute_values(self):
|
|
||||||
return sum([abs(i) for i in self.cnt_signature_jumps.values()])
|
|
||||||
|
|
||||||
def is_zero_everywhere(self):
|
def is_zero_everywhere(self):
|
||||||
return not any(self.cnt_signature_jumps.values())
|
return not any(self.cnt_signature_jumps.values())
|
||||||
|
|
||||||
def double_cover(self):
|
def double_cover(self):
|
||||||
# to read values for t^2
|
# to read values for t^2
|
||||||
|
items = self.cnt_signature_jumps.items()
|
||||||
|
counter = collections.Counter({ (1 + k) / 2 : v for k, v in items})
|
||||||
|
counter.update(collections.Counter({ k / 2 : v for k, v in items}))
|
||||||
new_data = []
|
new_data = []
|
||||||
for jump_arg, jump in self.cnt_signature_jumps.items():
|
for jump_arg, jump in self.cnt_signature_jumps.items():
|
||||||
if jump != 0:
|
if jump != 0:
|
||||||
new_data.append((jump_arg/2, jump))
|
new_data.append((jump_arg/2, jump))
|
||||||
new_data.append((1/2 + jump_arg/2, jump))
|
new_data.append((1/2 + jump_arg/2, jump))
|
||||||
|
assert SignatureFunction(values=new_data) == SignatureFunction(counter=counter)
|
||||||
return SignatureFunction(values=new_data)
|
return SignatureFunction(values=new_data)
|
||||||
|
|
||||||
def square_root(self):
|
def square_root(self):
|
||||||
# to read values for t^(1/2)
|
# to read values for t^(1/2)
|
||||||
new_data = []
|
new_data = []
|
||||||
for jump_arg, jump in self.cnt_signature_jumps.items():
|
for jump_arg, jump in self.cnt_signature_jumps.items():
|
||||||
if jump_arg < 1/2 and jump != 0:
|
if jump_arg < 1/2:
|
||||||
new_data.append((2 * jump_arg, jump))
|
new_data.append((2 * jump_arg, jump))
|
||||||
|
|
||||||
|
counter = collections.Counter()
|
||||||
|
for jump_arg, jump in self.cnt_signature_jumps.items():
|
||||||
|
if jump_arg < 1/2:
|
||||||
|
counter[2 * jump_arg] = jump
|
||||||
|
assert SignatureFunction(values=new_data) == SignatureFunction(counter=counter)
|
||||||
|
|
||||||
|
|
||||||
return SignatureFunction(values=new_data)
|
return SignatureFunction(values=new_data)
|
||||||
|
|
||||||
def minus_square_root(self):
|
def minus_square_root(self):
|
||||||
# to read values for t^(1/2)
|
# to read values for t^(1/2)
|
||||||
|
items = self.cnt_signature_jumps.items()
|
||||||
|
|
||||||
counter = collections.Counter()
|
counter = collections.Counter()
|
||||||
for jump_arg, jump in self.cnt_signature_jumps.items():
|
for jump_arg, jump in self.cnt_signature_jumps.items():
|
||||||
if jump_arg >= 1/2 and jump != 0:
|
if jump_arg >= 1/2:
|
||||||
counter[mod_one(2 * jump_arg)] = jump
|
counter[mod_one(2 * jump_arg)] = jump
|
||||||
|
counter2 = collections.Counter({ mod_one(2 * k) : v for k, v in items if k >= 1/2 })
|
||||||
|
assert counter2 == counter
|
||||||
|
|
||||||
return SignatureFunction(counter=counter)
|
return SignatureFunction(counter=counter)
|
||||||
|
|
||||||
def is_big(self):
|
def is_big(self):
|
||||||
@ -63,12 +82,7 @@ class SignatureFunction(object):
|
|||||||
items = sorted(self.cnt_signature_jumps.items())
|
items = sorted(self.cnt_signature_jumps.items())
|
||||||
for arg, jump in items:
|
for arg, jump in items:
|
||||||
current += 2 * jump
|
current += 2 * jump
|
||||||
msg = "current = " + str(current) + ", jump = " + str(jump)
|
assert current == self(arg) + jump
|
||||||
msg += "\n" + str(self(arg))
|
|
||||||
result = [jump for jump_arg, jump in self.cnt_signature_jumps.items() if jump_arg < mod_one(arg)]
|
|
||||||
msg += "\nresult = " + str(sum(result))
|
|
||||||
msg += "\narg = " + str(arg)
|
|
||||||
assert current == self(arg) + jump, msg
|
|
||||||
if abs(current) > abs(max):
|
if abs(current) > abs(max):
|
||||||
max = current
|
max = current
|
||||||
# if abs(max) > 9:
|
# if abs(max) > 9:
|
||||||
@ -81,6 +95,7 @@ class SignatureFunction(object):
|
|||||||
for jump_arg, jump in self.cnt_signature_jumps.items():
|
for jump_arg, jump in self.cnt_signature_jumps.items():
|
||||||
new_data.append((mod_one(jump_arg + shift), jump))
|
new_data.append((mod_one(jump_arg + shift), jump))
|
||||||
sf = SignatureFunction(values=new_data)
|
sf = SignatureFunction(values=new_data)
|
||||||
|
|
||||||
counter = collections.Counter({mod_one(k + shift) : v \
|
counter = collections.Counter({mod_one(k + shift) : v \
|
||||||
for k,v in self.cnt_signature_jumps.items()})
|
for k,v in self.cnt_signature_jumps.items()})
|
||||||
assert SignatureFunction(counter=counter) == \
|
assert SignatureFunction(counter=counter) == \
|
||||||
@ -128,18 +143,29 @@ class SignatureFunction(object):
|
|||||||
|
|
||||||
def total_sign_jump(self):
|
def total_sign_jump(self):
|
||||||
# Total signature jump is the sum of all jumps.
|
# Total signature jump is the sum of all jumps.
|
||||||
|
result = sum([j[1] for j in self.to_list()])
|
||||||
|
assert result == sum(v for _, v in self.cnt_signature_jumps.items())
|
||||||
return sum([j[1] for j in self.to_list()])
|
return sum([j[1] for j in self.to_list()])
|
||||||
|
|
||||||
def to_list(self):
|
def to_list(self):
|
||||||
# Return signature jumps formated as a list
|
# Return signature jumps formated as a list
|
||||||
|
assert sorted(self.cnt_signature_jumps.items(), key = lambda x: x[0]) == \
|
||||||
|
sorted(self.cnt_signature_jumps.items())
|
||||||
return sorted(self.cnt_signature_jumps.items(), key = lambda x: x[0])
|
return sorted(self.cnt_signature_jumps.items(), key = lambda x: x[0])
|
||||||
|
|
||||||
def step_function_data(self):
|
def step_function_data(self):
|
||||||
# Transform the signature jump data to a format understandable
|
# Transform the signature jump data to a format understandable
|
||||||
# by the plot function.
|
# by the plot function.
|
||||||
l = self.to_list()
|
l = self.to_list()
|
||||||
|
assert l == sorted(self.cnt_signature_jumps.items())
|
||||||
vals = ([(d[0], sum(2 * j[1] for j in l[:l.index(d)+1])) for d in l] +
|
vals = ([(d[0], sum(2 * j[1] for j in l[:l.index(d)+1])) for d in l] +
|
||||||
[(0,self.cnt_signature_jumps[0]), (1,self.total_sign_jump())])
|
[(0,self.cnt_signature_jumps[0]), (1,self.total_sign_jump())])
|
||||||
|
print("step_function_data")
|
||||||
|
print(vals)
|
||||||
|
counter = copy(self.cnt_signature_jumps)
|
||||||
|
counter[0] = self.cnt_signature_jumps[0]
|
||||||
|
counter[1] = self.total_sign_jump()
|
||||||
|
print(sorted(counter.items()))
|
||||||
return vals
|
return vals
|
||||||
|
|
||||||
def plot(self):
|
def plot(self):
|
||||||
@ -147,7 +173,7 @@ class SignatureFunction(object):
|
|||||||
plot_step_function(self.step_function_data())
|
plot_step_function(self.step_function_data())
|
||||||
|
|
||||||
def tikz_plot(self, file_name):
|
def tikz_plot(self, file_name):
|
||||||
# Draw the graph of the signature and transform it into TiKz.
|
# Draw the graph of the signature and transform it into TiKz.
|
||||||
# header of the LaTeX file
|
# header of the LaTeX file
|
||||||
|
|
||||||
with open(file_name, "w") as output_file:
|
with open(file_name, "w") as output_file:
|
||||||
@ -156,10 +182,12 @@ class SignatureFunction(object):
|
|||||||
output_file.write("\\begin{document}\n")
|
output_file.write("\\begin{document}\n")
|
||||||
output_file.write("\\begin{tikzpicture}\n")
|
output_file.write("\\begin{tikzpicture}\n")
|
||||||
data = sorted(self.step_function_data())
|
data = sorted(self.step_function_data())
|
||||||
|
print("data")
|
||||||
|
print(data)
|
||||||
output_file.write(" \\datavisualization[scientific axes,visualize as smooth line,\n")
|
output_file.write(" \\datavisualization[scientific axes,visualize as smooth line,\n")
|
||||||
output_file.write(" x axis={ticks={none,major={at={")
|
output_file.write(" x axis={ticks={none,major={at={")
|
||||||
output_file.write(", " + str(N(data[0][0],digits=4)) + " as \\(" + str(data[0][0]) + "\\)")
|
output_file.write(", " + str(N(data[0][0],digits=4)) + " as \\(" + str(data[0][0]) + "\\)")
|
||||||
for jump_arg,jump in data:
|
for jump_arg, jump in data:
|
||||||
output_file.write(", " + str(N(jump_arg,digits=4)) + " as \\(" + str(jump_arg) + "\\)")
|
output_file.write(", " + str(N(jump_arg,digits=4)) + " as \\(" + str(jump_arg) + "\\)")
|
||||||
output_file.write("}}}}\n")
|
output_file.write("}}}}\n")
|
||||||
output_file.write(" ]\n")
|
output_file.write(" ]\n")
|
||||||
@ -191,9 +219,28 @@ class TorusCable(object):
|
|||||||
self.q_vector = q_vector
|
self.q_vector = q_vector
|
||||||
k = k_vector
|
k = k_vector
|
||||||
self.knot_sum = eval(knot_formula)
|
self.knot_sum = eval(knot_formula)
|
||||||
self.knot_description = self.get_knot_descrption()
|
self.knot_description = self.set_knot_descrption()
|
||||||
self.__sigma_function = None
|
self.__sigma_function = None
|
||||||
|
# TBD property function
|
||||||
self.signature_as_function_of_theta = None
|
self.signature_as_function_of_theta = None
|
||||||
|
self.signature_as_function_of_theta = self.get_signature_as_function_of_theta()
|
||||||
|
# self.signature_as_function_of_theta = None
|
||||||
|
|
||||||
|
def update(self, other):
|
||||||
|
# TBD knot_formula etc.
|
||||||
|
number_of_summands = len(self.knot_sum)
|
||||||
|
self.knot_description += " # " + other.knot_description
|
||||||
|
self.knot_formula = self.knot_formula[:-1] + ",\n" + \
|
||||||
|
other.knot_formula[1:]
|
||||||
|
print(self.knot_sum)
|
||||||
|
self.knot_sum += other.knot_sum
|
||||||
|
# self.signature_as_function_of_theta = \
|
||||||
|
# self.get_signature_as_function_of_theta() + \
|
||||||
|
# other.get_signature_as_function_of_theta()
|
||||||
|
print(self.knot_description)
|
||||||
|
print(self.knot_formula)
|
||||||
|
print(self.knot_sum)
|
||||||
|
|
||||||
|
|
||||||
def __get_sigma_function(self):
|
def __get_sigma_function(self):
|
||||||
k_1, k_2, k_3, k_4 = [abs(k) for k in self.k_vector]
|
k_1, k_2, k_3, k_4 = [abs(k) for k in self.k_vector]
|
||||||
@ -273,12 +320,18 @@ class TorusCable(object):
|
|||||||
print("one vector " + str(thetas))
|
print("one vector " + str(thetas))
|
||||||
print("max sf " + str(sf.is_big()))
|
print("max sf " + str(sf.is_big()))
|
||||||
print()
|
print()
|
||||||
assert untwisted_part.is_zero_everywhere()
|
# assert untwisted_part.is_zero_everywhere()
|
||||||
|
|
||||||
if verbose:
|
if verbose:
|
||||||
print()
|
print()
|
||||||
print(str(thetas))
|
print(str(thetas))
|
||||||
print(sf)
|
print(sf)
|
||||||
|
msg = "tota signature jump = " + str(sf.total_sign_jump())
|
||||||
|
msg += "\nfunction\n" + str(sf)
|
||||||
|
assert sf.total_sign_jump() == 0, msg
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return sf
|
return sf
|
||||||
signature_as_function_of_theta.__doc__ =\
|
signature_as_function_of_theta.__doc__ =\
|
||||||
signature_as_function_of_theta_docstring
|
signature_as_function_of_theta_docstring
|
||||||
@ -354,7 +407,7 @@ class TorusCable(object):
|
|||||||
return SignatureFunction(values=w)
|
return SignatureFunction(values=w)
|
||||||
|
|
||||||
|
|
||||||
def get_knot_descrption(self):
|
def set_knot_descrption(self):
|
||||||
description = ""
|
description = ""
|
||||||
for knot in self.knot_sum:
|
for knot in self.knot_sum:
|
||||||
if knot[0] < 0:
|
if knot[0] < 0:
|
||||||
@ -728,12 +781,12 @@ TorusCable.get_number_of_combinations_of_theta.__doc__ = \
|
|||||||
and q_j is the last q parameter for the component (a single cable)
|
and q_j is the last q parameter for the component (a single cable)
|
||||||
"""
|
"""
|
||||||
|
|
||||||
TorusCable.get_knot_descrption.__doc__ = \
|
TorusCable.set_knot_descrption.__doc__ = \
|
||||||
"""
|
"""
|
||||||
Arguments:
|
Arguments:
|
||||||
arbitrary number of lists of numbers, each list encodes a single cable.
|
arbitrary number of lists of numbers, each list encodes a single cable.
|
||||||
Examples:
|
Examples:
|
||||||
sage: get_knot_descrption([1, 3], [2], [-1, -2], [-3])
|
sage: set_knot_descrption([1, 3], [2], [-1, -2], [-3])
|
||||||
'T(2, 3; 2, 7) # T(2, 5) # -T(2, 3; 2, 5) # -T(2, 7)'
|
'T(2, 3; 2, 7) # T(2, 5) # -T(2, 3; 2, 5) # -T(2, 7)'
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -20,8 +20,16 @@ class Config(object):
|
|||||||
|
|
||||||
# knot_formula is a schema for knots which signature function
|
# knot_formula is a schema for knots which signature function
|
||||||
# will be calculated
|
# will be calculated
|
||||||
self.knot_formula = "[[k[0], k[1], k[3]], [-k[1], -k[3]], \
|
self.knot_formula = "[[k[0], k[1], k[3]], " + \
|
||||||
[k[2], k[3]], [-k[0], -k[2], -k[3]]]"
|
"[-k[1], -k[3]], " + \
|
||||||
|
"[k[2], k[3]], " + \
|
||||||
|
"[-k[0], -k[2], -k[3]]]"
|
||||||
|
|
||||||
|
|
||||||
|
# self.knot_formula = "[[k[0], k[1], k[4]], [-k[1], -k[3]], \
|
||||||
|
# [k[2], k[3]], [-k[0], -k[2], -k[4]]]"
|
||||||
|
#
|
||||||
|
#
|
||||||
|
|
||||||
# self.knot_formula = "[[k[3]], [-k[3]], \
|
# self.knot_formula = "[[k[3]], [-k[3]], \
|
||||||
# [k[3]], [-k[3]] ]"
|
# [k[3]], [-k[3]] ]"
|
||||||
@ -42,10 +50,10 @@ class Config(object):
|
|||||||
self.start_shift = 0
|
self.start_shift = 0
|
||||||
|
|
||||||
self.verbose = True
|
self.verbose = True
|
||||||
self.verbose = False
|
# self.verbose = False
|
||||||
|
|
||||||
self.print_results = True
|
self.print_results = True
|
||||||
self.print_results = False
|
# self.print_results = False
|
||||||
|
|
||||||
self.print_calculations_for_large_sigma = True
|
self.print_calculations_for_large_sigma = True
|
||||||
self.print_calculations_for_large_sigma = False
|
self.print_calculations_for_large_sigma = False
|
||||||
@ -102,7 +110,7 @@ def set_parameters(knot_formula, limit, verbose, print_results):
|
|||||||
if knot_formula is None:
|
if knot_formula is None:
|
||||||
knot_formula = config.knot_formula
|
knot_formula = config.knot_formula
|
||||||
if verbose is None:
|
if verbose is None:
|
||||||
vebose = config.verbose
|
verbose = config.verbose
|
||||||
if print_results is None:
|
if print_results is None:
|
||||||
print_results = config.print_results
|
print_results = config.print_results
|
||||||
return knot_formula, limit, verbose, print_results
|
return knot_formula, limit, verbose, print_results
|
||||||
@ -127,9 +135,8 @@ def search_for_large_sigma_value(knot_formula=None, limit=None,
|
|||||||
for c in combinations:
|
for c in combinations:
|
||||||
q = [P.unrank(i + config.start_shift) for i in c]
|
q = [P.unrank(i + config.start_shift) for i in c]
|
||||||
if config.only_slice_candidates:
|
if config.only_slice_candidates:
|
||||||
if not (q[3] > 4 * q[2] and
|
ratio = q[3] > 4 * q[2] and q[2] > 4 * q[1] and q[1] > 4 * q[0]
|
||||||
q[2] > 4 * q[1] and
|
if not ratio:
|
||||||
q[1] > 4 * q[0]):
|
|
||||||
if verbose:
|
if verbose:
|
||||||
print("Ratio-condition does not hold")
|
print("Ratio-condition does not hold")
|
||||||
continue
|
continue
|
||||||
@ -143,9 +150,6 @@ def search_for_large_sigma_value(knot_formula=None, limit=None,
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# searching for signature == 0
|
# searching for signature == 0
|
||||||
def search_for_null_signature_value(knot_formula=None, limit=None,
|
def search_for_null_signature_value(knot_formula=None, limit=None,
|
||||||
verbose=None, print_results=None):
|
verbose=None, print_results=None):
|
||||||
@ -154,6 +158,8 @@ def search_for_null_signature_value(knot_formula=None, limit=None,
|
|||||||
set_parameters(knot_formula, limit, verbose, print_results)
|
set_parameters(knot_formula, limit, verbose, print_results)
|
||||||
|
|
||||||
k_vector_size = extract_max(knot_formula) + 1
|
k_vector_size = extract_max(knot_formula) + 1
|
||||||
|
limit = max(limit, k_vector_size)
|
||||||
|
|
||||||
combinations = it.combinations_with_replacement(range(1, limit + 1),
|
combinations = it.combinations_with_replacement(range(1, limit + 1),
|
||||||
k_vector_size)
|
k_vector_size)
|
||||||
with open(config.f_results, 'w') as f_results:
|
with open(config.f_results, 'w') as f_results:
|
||||||
@ -202,11 +208,9 @@ def search_for_large_signature_value(knot_formula=None, limit=None,
|
|||||||
# iterate over q-vector
|
# iterate over q-vector
|
||||||
for c in combinations:
|
for c in combinations:
|
||||||
q = [P.unrank(i + config.start_shift) for i in c]
|
q = [P.unrank(i + config.start_shift) for i in c]
|
||||||
q[3] = 79
|
|
||||||
if config.only_slice_candidates:
|
if config.only_slice_candidates:
|
||||||
if not (q[3] > 4 * q[2] and
|
ratio = q[3] > 4 * q[2] and q[2] > 4 * q[1] and q[1] > 4 * q[0]
|
||||||
q[2] > 4 * q[1] and
|
if not ratio:
|
||||||
q[1] > 4 * q[0]):
|
|
||||||
if verbose:
|
if verbose:
|
||||||
print("Ratio-condition does not hold")
|
print("Ratio-condition does not hold")
|
||||||
continue
|
continue
|
||||||
|
Loading…
Reference in New Issue
Block a user