Refact. Add SignatureFunction.plot_title var. Plot many sf at once - function plot_many
This commit is contained in:
parent
84a4c2a082
commit
4d549c2dcb
@ -1,13 +1,15 @@
|
||||
#!/usr/bin/python
|
||||
#!/usr/bin/env sage -python
|
||||
import numpy as np
|
||||
import itertools as it
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
import warnings
|
||||
import re
|
||||
import inspect
|
||||
|
||||
from typing import Iterable
|
||||
from collections import Counter
|
||||
from sage.arith.functions import LCM_list
|
||||
import warnings
|
||||
import re
|
||||
import matplotlib.pyplot as plt
|
||||
import inspect
|
||||
|
||||
# 9.11 (9.8)
|
||||
# 9.15 (9.9)
|
||||
@ -22,7 +24,6 @@ class CableSummand():
|
||||
self.signature_as_function_of_theta = \
|
||||
self.get_summand_signature_as_theta_function()
|
||||
|
||||
|
||||
@staticmethod
|
||||
def get_summand_descrption(knot_as_k_values):
|
||||
description = ""
|
||||
@ -33,7 +34,6 @@ class CableSummand():
|
||||
description += "2, " + str(2 * abs(k) + 1) + "; "
|
||||
return description[:-2] + ")"
|
||||
|
||||
|
||||
@classmethod
|
||||
def get_blanchfield_for_pattern(cls, k_n, theta=0):
|
||||
|
||||
@ -45,17 +45,13 @@ class CableSummand():
|
||||
|
||||
k = abs(k_n)
|
||||
assert theta <= k, msg
|
||||
results = []
|
||||
|
||||
results = []
|
||||
ksi = 1/(2 * k + 1)
|
||||
|
||||
counter = Counter()
|
||||
# print("lambda_odd, i.e. (theta + e) % 2 != 0")
|
||||
for e in range(1, k + 1):
|
||||
if (theta + e) % 2 != 0:
|
||||
counter[e * ksi] = 1 * sgn(k_n)
|
||||
counter[1 - e * ksi] = -1 * sgn(k_n)
|
||||
|
||||
results.append((e * ksi, 1 * sgn(k_n)))
|
||||
results.append((1 - e * ksi, -1 * sgn(k_n)))
|
||||
|
||||
@ -139,7 +135,18 @@ class CableSummand():
|
||||
pattern_part = self.get_blanchfield_for_pattern(patt_k, theta)
|
||||
satellite_part = self.get_satellite_part(*knot_as_k_values,
|
||||
theta=theta)
|
||||
return pattern_part, satellite_part
|
||||
sf = satellite_part + pattern_part
|
||||
|
||||
satellite_part.plot_title = self.knot_description + \
|
||||
", theta = " + str(theta) + \
|
||||
", satellite part."
|
||||
pattern_part.plot_title = self.knot_description + \
|
||||
", theta = " + str(theta) + \
|
||||
", pattern part."
|
||||
sf.plot_title = self.knot_description +\
|
||||
", theta = " + str(theta)
|
||||
|
||||
return pattern_part, satellite_part, sf
|
||||
get_summand_signture_function.__doc__ = \
|
||||
get_summand_signture_function_docsting
|
||||
|
||||
@ -156,7 +163,7 @@ class CableSummand():
|
||||
return name
|
||||
|
||||
def plot_summand_for_theta(self, theta, save_path=None):
|
||||
pp, sp = self.signature_as_function_of_theta(theta)
|
||||
pp, sp, sf = self.signature_as_function_of_theta(theta)
|
||||
title = self.knot_description + ", theta = " + str(theta)
|
||||
if save_path is not None:
|
||||
file_name = self.get_file_name_for_summand_plot(theta)
|
||||
@ -221,7 +228,7 @@ class CableSum():
|
||||
for i, knot in enumerate(self.knot_summands):
|
||||
knot.plot_summand_for_theta(thetas[i], save_path=save_path)
|
||||
|
||||
pp, sp = self.signature_as_function_of_theta(*thetas)
|
||||
pp, sp, sf = self.signature_as_function_of_theta(*thetas)
|
||||
title = self.knot_description + ", thetas = " + str(thetas)
|
||||
if save_path is not None:
|
||||
file_name = re.sub(r', ', '_', str(thetas))
|
||||
@ -232,9 +239,18 @@ class CableSum():
|
||||
|
||||
if save_path is not None:
|
||||
file_path = os.path.join(save_path, "all_" + file_name)
|
||||
sf_list = [knot.signature_as_function_of_theta(thetas[i])
|
||||
sf_list = [knot.signature_as_function_of_theta(thetas[i])[2]
|
||||
for i, knot in enumerate(self.knot_summands)]
|
||||
# pp, sp = knot.signature_as_function_of_theta(thetas[i])
|
||||
sf_list.append(sf_list[-1])
|
||||
sf_list.append(sf_list[-1])
|
||||
sf_list.append(sf_list[-1])
|
||||
sf_list.append(sf_list[-1])
|
||||
sf_list.append(sf_list[-1])
|
||||
sf_list.append(sf_list[-1])
|
||||
# sf_list.append(sf_list[-1])
|
||||
|
||||
SignatureFunction.plot_many(*sf_list)
|
||||
# pp, sp, sf = knot.signature_as_function_of_theta(thetas[i])
|
||||
# (pp + sp) = sp.plot
|
||||
#
|
||||
# pp.plot_sum_with_other(sp, title=title, save_path=file_path)
|
||||
@ -249,7 +265,6 @@ class CableSum():
|
||||
for knot in self.knot_summands:
|
||||
knot.plot_summand()
|
||||
|
||||
|
||||
def parse_thetas(self, *thetas):
|
||||
summands_num = len(self.knot_sum_as_k_valus)
|
||||
if not thetas:
|
||||
@ -302,7 +317,7 @@ class CableSum():
|
||||
# for each cable knot (summand) in cable sum apply theta
|
||||
for i, knot in enumerate(self.knot_summands):
|
||||
sfth = knot.signature_as_function_of_theta
|
||||
pp, sp = sfth(thetas[i])
|
||||
pp, sp, _ = sfth(thetas[i])
|
||||
pattern_part += pp
|
||||
satellite_part += sp
|
||||
sf = pattern_part + satellite_part
|
||||
@ -312,7 +327,7 @@ class CableSum():
|
||||
print(str(thetas))
|
||||
print(sf)
|
||||
assert sf.total_sign_jump() == 0
|
||||
return pattern_part, satellite_part
|
||||
return pattern_part, satellite_part, sf
|
||||
|
||||
signature_as_function_of_theta.__doc__ =\
|
||||
signature_as_function_of_theta_docstring
|
||||
@ -340,8 +355,7 @@ class CableSum():
|
||||
# has a large signature.
|
||||
for shift in range(1, self.q_order):
|
||||
shifted_thetas = [shift * th for th in thetas]
|
||||
pp, sp = self.signature_as_function_of_theta(*shifted_thetas)
|
||||
sf = pp + sp
|
||||
pp, sp, sf= self.signature_as_function_of_theta(*shifted_thetas)
|
||||
limit = 5 + np.count_nonzero(shifted_thetas)
|
||||
extremum = abs(sf.extremum(limit=limit))
|
||||
if shift > 1:
|
||||
@ -378,6 +392,7 @@ class CableSum():
|
||||
print("\nOK")
|
||||
return True
|
||||
|
||||
|
||||
class CableTemplate():
|
||||
|
||||
def __init__(self, knot_formula, q_vector=None, k_vector=None,
|
||||
@ -421,7 +436,6 @@ class CableTemplate():
|
||||
|
||||
self.knot_sum_as_k_valus = eval(self.knot_formula)
|
||||
self._cable = CableSum(self.knot_sum_as_k_valus)
|
||||
|
||||
self._q_vector = [2 * k_val + 1 for k_val in k]
|
||||
|
||||
@property
|
||||
@ -467,7 +481,6 @@ class CableTemplate():
|
||||
other.knot_formula)
|
||||
return self + CableTemplate(o_formula)
|
||||
|
||||
|
||||
def __add__(self, other):
|
||||
knot_formula = self.knot_formula[:-1] + ",\n" + other.knot_formula[1:]
|
||||
return CableTemplate(knot_formula)
|
||||
|
26
main.sage
26
main.sage
@ -1,4 +1,4 @@
|
||||
#!/usr/bin/python
|
||||
#!/usr/bin/env sage -python
|
||||
|
||||
# TBD: read about Factory Method, variable in docstring, sage documentation,
|
||||
# print calc. to output file
|
||||
@ -15,13 +15,22 @@ import numpy as np
|
||||
attach("signature.sage")
|
||||
attach("cable_signature.sage")
|
||||
|
||||
# if not os.path.isfile('signature.py'):
|
||||
# os.system('sage --preparse cable_signature.sage')
|
||||
# os.system('mv cable_signature.sage.py cable_signature.py')
|
||||
# from signature import SignatureFunction
|
||||
|
||||
|
||||
|
||||
class Config(object):
|
||||
def __init__(self):
|
||||
|
||||
self.f_results = os.path.join(os.getcwd(), "results.out")
|
||||
|
||||
self.verbose = True
|
||||
# self.verbose = False
|
||||
|
||||
|
||||
# knot_formula is a schema for knots which signature function
|
||||
# will be calculated
|
||||
self.knot_formula = "[[k[0], k[1], k[3]], " + \
|
||||
@ -42,10 +51,7 @@ class Config(object):
|
||||
# [-k[0], -k[3], -k[4]], [-k[1], -k[2]]]"
|
||||
# self.knot_formula = "[[k[0], k[1], k[2]], [k[3]],\
|
||||
# [-k[0], -k[1], -k[3]], [-k[2]]]"
|
||||
self.limit = 3
|
||||
|
||||
self.verbose = True
|
||||
# self.verbose = False
|
||||
|
||||
|
||||
|
||||
@ -68,7 +74,7 @@ def main(arg=None):
|
||||
# knot_formula = config.knot_formula
|
||||
# q_vector = (3, 5, 7, 13)
|
||||
# q_vector = (3, 5, 7, 11)
|
||||
|
||||
return
|
||||
formula_1 = "[[k[0], k[5], k[3]], " + \
|
||||
"[-k[1], -k[3]], " + \
|
||||
"[k[2], k[3]], " + \
|
||||
@ -85,11 +91,11 @@ def main(arg=None):
|
||||
cable_template_1 = CableTemplate(knot_formula=formula_1)
|
||||
cable_template_2 = CableTemplate(knot_formula=formula_2)
|
||||
cable_template = cable_template_1 + cable_template_2
|
||||
cable_with_shift = cable_template_1.add_with_shift(cable_template_2)
|
||||
# cable_with_shift = cable_template_1.add_with_shift(cable_template_2)
|
||||
print(cable_with_shift.knot_formula)
|
||||
cable_template.fill_q_vector()
|
||||
print(cable_template.q_vector)
|
||||
print(cable_template.knot_formula)
|
||||
# cable_template.fill_q_vector()
|
||||
# print(cable_template.q_vector)
|
||||
# print(cable_template.knot_formula)
|
||||
cable = cable_template.cable
|
||||
|
||||
sf = cable(4,4,4,4,0,0,0,0)
|
||||
@ -104,7 +110,7 @@ def main(arg=None):
|
||||
cable_template_2 = CableTemplate(knot_formula=formula_2)
|
||||
cable_template = cable_template_1 + cable_template_2
|
||||
# cable_template.cable.is_signature_big_for_all_metabolizers()
|
||||
# sf = cable_template.cable.signature_as_function_of_theta(4,4,4,4,0,0,0,0)
|
||||
sf = cable_template.cable.signature_as_function_of_theta(4,4,4,4,0,0,0,0)
|
||||
|
||||
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
#!/usr/bin/python
|
||||
#!/usr/bin/env sage -python
|
||||
import numpy as np
|
||||
import itertools as it
|
||||
from typing import Iterable
|
||||
@ -16,13 +16,12 @@ from pathlib import Path
|
||||
|
||||
class SignatureFunction():
|
||||
|
||||
def __init__(self, values=None, counter=None):
|
||||
def __init__(self, values=None, counter=None, plot_title=''):
|
||||
|
||||
# counter of signature jumps
|
||||
if counter is None:
|
||||
counter = Counter()
|
||||
if values is None:
|
||||
values = []
|
||||
values = values or []
|
||||
for k, v in values:
|
||||
counter[k] += v
|
||||
|
||||
@ -34,6 +33,7 @@ class SignatureFunction():
|
||||
counter[0] += 0
|
||||
counter[1] += 0
|
||||
self.jumps_counter = counter
|
||||
self.plot_title = plot_title
|
||||
|
||||
def __rshift__(self, shift):
|
||||
# A shift of the signature functions corresponds to the rotation.
|
||||
@ -52,7 +52,11 @@ class SignatureFunction():
|
||||
def __add__(self, other):
|
||||
counter = copy(self.jumps_counter)
|
||||
counter.update(other.jumps_counter)
|
||||
return SignatureFunction(counter=counter)
|
||||
if self.plot_title and other.plot_title:
|
||||
title = self.plot_title + " + " + other.plot_title
|
||||
else:
|
||||
title = self.plot_title or other.plot_title
|
||||
return SignatureFunction(counter=counter, plot_title=title)
|
||||
|
||||
def __sub__(self, other):
|
||||
counter = copy(self.jumps_counter)
|
||||
@ -79,9 +83,6 @@ class SignatureFunction():
|
||||
result = [jump for jump_arg, jump in items if jump_arg < mod_one(arg)]
|
||||
return 2 * sum(result) + self.jumps_counter[arg]
|
||||
|
||||
def is_zero_everywhere(self):
|
||||
return not any(self.jumps_counter.values())
|
||||
|
||||
def double_cover(self):
|
||||
# to read values for t^2
|
||||
items = self.jumps_counter.items()
|
||||
@ -103,6 +104,11 @@ class SignatureFunction():
|
||||
counter = Counter({mod_one(2 * k) : v for k, v in items if k >= 1/2})
|
||||
return SignatureFunction(counter=counter)
|
||||
|
||||
|
||||
def is_zero_everywhere(self):
|
||||
return not any(self.jumps_counter.values())
|
||||
|
||||
|
||||
def extremum(self, limit=None):
|
||||
max = 0
|
||||
current = 0
|
||||
@ -121,13 +127,36 @@ class SignatureFunction():
|
||||
# Total signature jump is the sum of all jumps.
|
||||
return sum([j[1] for j in sorted(self.jumps_counter.items())])
|
||||
|
||||
def plot_four(self, sf1, sf2, sf3, save_path=None, title=''):
|
||||
|
||||
fig, axes_matrix = plt.subplots(2, 2, sharey=True,
|
||||
figsize=(10,5))
|
||||
sf0 = self
|
||||
@staticmethod
|
||||
def plot_many(*sf_list, save_path=None, title='',):
|
||||
axes_num = len(sf_list)
|
||||
if axes_num > 36:
|
||||
sf_list = sf_list[36]
|
||||
axes_num = 36
|
||||
# print war, set val in conf
|
||||
rows = ceil(sqrt(axes_num))
|
||||
cols = ceil(axes_num/rows)
|
||||
fig, axes_matrix = plt.subplots(rows, cols,
|
||||
sharey=True,
|
||||
sharex=True,)
|
||||
for i, sf in enumerate(sf_list):
|
||||
col = i % cols
|
||||
row = (i - col)/cols
|
||||
sf.plot(subplot=True,
|
||||
ax=axes_matrix[0][1])
|
||||
ax=axes_matrix[row][col],
|
||||
title=sf.plot_title)
|
||||
|
||||
plt.tight_layout()
|
||||
save_path = save_path or os.path.join(os.getcwd(),"tmp.png")
|
||||
save_path = Path(save_path).with_suffix('.png')
|
||||
|
||||
plt.savefig(save_path)
|
||||
plt.close()
|
||||
image = Image.open(save_path)
|
||||
image.show()
|
||||
|
||||
return
|
||||
|
||||
|
||||
sf1.plot(subplot=True,
|
||||
ax=axes_matrix[1][0],
|
||||
@ -146,18 +175,13 @@ class SignatureFunction():
|
||||
|
||||
plt.tight_layout()
|
||||
save_path = save_path or os.path.join(os.getcwd(),"tmp.png")
|
||||
save_path = Path(save_path)
|
||||
save_path = save_path.with_suffix('.png')
|
||||
save_path = Path(save_path).with_suffix('.png')
|
||||
|
||||
plt.savefig(save_path)
|
||||
plt.close()
|
||||
image = Image.open(save_path)
|
||||
image.show()
|
||||
|
||||
|
||||
pass
|
||||
|
||||
|
||||
def plot_sum_with_other(self, other,
|
||||
save_path=None, title=''):
|
||||
tp = self
|
||||
@ -209,10 +233,6 @@ class SignatureFunction():
|
||||
image = Image.open(save_path)
|
||||
image.show()
|
||||
|
||||
|
||||
pass
|
||||
|
||||
|
||||
def plot(self, subplot=False, ax=None, save_as='sf',
|
||||
title="",
|
||||
alpha=1,
|
||||
@ -241,8 +261,6 @@ class SignatureFunction():
|
||||
image = Image.open(save_as)
|
||||
image.show()
|
||||
|
||||
|
||||
|
||||
def step_function_data(self):
|
||||
# Transform the signature jump data to a format understandable
|
||||
# by the plot function.
|
||||
|
Loading…
Reference in New Issue
Block a user