seqbuild 0.0.3__tar.gz → 0.0.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {seqbuild-0.0.3 → seqbuild-0.0.4}/PKG-INFO +1 -1
- {seqbuild-0.0.3 → seqbuild-0.0.4}/pyproject.toml +1 -1
- seqbuild-0.0.4/seqbuild/__init__.py +0 -0
- seqbuild-0.0.4/seqbuild/desi/__init__.py +0 -0
- seqbuild-0.0.4/seqbuild/desi/approximators.py +162 -0
- seqbuild-0.0.4/seqbuild/desi/differentials.py +88 -0
- seqbuild-0.0.4/seqbuild/desi/fraction.py +102 -0
- seqbuild-0.0.4/seqbuild/desi/multi_metric.py +365 -0
- seqbuild-0.0.4/seqbuild/desi/not_equals.py +144 -0
- seqbuild-0.0.4/seqbuild/desi/nvec_gen.py +200 -0
- seqbuild-0.0.4/seqbuild/desi/seqcov_perm.py +475 -0
- seqbuild-0.0.4/seqbuild/face/__init__.py +3 -0
- seqbuild-0.0.4/seqbuild/face/cl_guide_parser.py +439 -0
- seqbuild-0.0.4/seqbuild/face/cmd_proc.py +444 -0
- seqbuild-0.0.4/seqbuild/face/comm_lang.py +236 -0
- seqbuild-0.0.4/seqbuild/face/make_cmd.py +670 -0
- seqbuild-0.0.4/seqbuild/face/sb_ui.py +222 -0
- seqbuild-0.0.4/seqbuild/intigers/__init__.py +0 -0
- seqbuild-0.0.4/seqbuild/intigers/extraneous.py +374 -0
- seqbuild-0.0.4/seqbuild/intigers/idectree.py +824 -0
- seqbuild-0.0.4/seqbuild/intigers/idt_proc.py +181 -0
- seqbuild-0.0.4/seqbuild/intigers/intfactor.py +266 -0
- seqbuild-0.0.4/seqbuild/intigers/lcg_v2.py +329 -0
- seqbuild-0.0.4/seqbuild/intigers/lcg_v3.py +452 -0
- seqbuild-0.0.4/seqbuild/intigers/mdr_v2.py +131 -0
- seqbuild-0.0.4/seqbuild/intigers/mod_prng.py +45 -0
- seqbuild-0.0.4/seqbuild/intigers/n2mvf_autogen.py +270 -0
- seqbuild-0.0.4/seqbuild/intigers/pof_autogen.py +94 -0
- seqbuild-0.0.4/seqbuild/intigers/poly_output_fitter_.py +592 -0
- seqbuild-0.0.4/seqbuild/intigers/prng_pw_op.py +62 -0
- seqbuild-0.0.4/seqbuild/intigers/process_seq.py +77 -0
- seqbuild-0.0.4/seqbuild/intigers/seq_struct.py +467 -0
- seqbuild-0.0.4/seqbuild/intigers/tvec.py +103 -0
- seqbuild-0.0.4/seqbuild/mini_dm/__init__.py +1 -0
- seqbuild-0.0.4/seqbuild/mini_dm/ag_ext.py +461 -0
- seqbuild-0.0.4/seqbuild/mini_dm/csrch.py +108 -0
- seqbuild-0.0.4/seqbuild/mini_dm/hg.py +6 -0
- seqbuild-0.0.4/seqbuild/mini_dm/iseq.py +271 -0
- seqbuild-0.0.4/seqbuild/mini_dm/matfactor_eval.py +225 -0
- seqbuild-0.0.4/seqbuild/mini_dm/minmax_freq.py +111 -0
- seqbuild-0.0.4/seqbuild/mini_dm/n2m.py +319 -0
- seqbuild-0.0.4/seqbuild/mini_dm/n2m_function.py +91 -0
- seqbuild-0.0.4/seqbuild/mini_dm/n2m_index.py +256 -0
- seqbuild-0.0.4/seqbuild/mini_dm/ngram.py +76 -0
- seqbuild-0.0.4/seqbuild/mini_dm/nsfr.py +73 -0
- seqbuild-0.0.4/seqbuild/mini_dm/puc.py +64 -0
- seqbuild-0.0.4/seqbuild/mini_dm/sp_op.py +84 -0
- seqbuild-0.0.4/seqbuild/mini_dm/vs_fit.py +709 -0
- seqbuild-0.0.4/seqbuild/mini_dm/vs_fit_mem.py +299 -0
- seqbuild-0.0.4/seqbuild/mini_dm/vs_fit_op.py +383 -0
- seqbuild-0.0.4/seqbuild/mini_dm/vs_srch.py +514 -0
- seqbuild-0.0.4/seqbuild/seqgen/__init__.py +4 -0
- seqbuild-0.0.4/seqbuild/seqgen/gg_gen.py +429 -0
- seqbuild-0.0.4/seqbuild/seqgen/idt_gen.py +386 -0
- seqbuild-0.0.4/seqbuild/seqgen/mdr_gen.py +316 -0
- seqbuild-0.0.4/seqbuild/seqgen/optri_gen.py +580 -0
- seqbuild-0.0.4/seqbuild/seqgen/rch_gen.py +325 -0
- seqbuild-0.0.4/seqbuild/seqgen/sb_crypt.py +108 -0
- seqbuild-0.0.4/seqbuild/seqgen/shadow_gen.py +185 -0
- seqbuild-0.0.4/seqbuild/seqgen/ssi_load.py +361 -0
- seqbuild-0.0.4/seqbuild/seqgen/ssi_netop.py +306 -0
- {seqbuild-0.0.3 → seqbuild-0.0.4}/seqbuild.egg-info/PKG-INFO +1 -1
- seqbuild-0.0.4/seqbuild.egg-info/SOURCES.txt +67 -0
- seqbuild-0.0.4/seqbuild.egg-info/top_level.txt +1 -0
- {seqbuild-0.0.3 → seqbuild-0.0.4}/setup.py +1 -1
- seqbuild-0.0.3/seqbuild.egg-info/SOURCES.txt +0 -8
- seqbuild-0.0.3/seqbuild.egg-info/top_level.txt +0 -1
- {seqbuild-0.0.3 → seqbuild-0.0.4}/LICENSE.txt +0 -0
- {seqbuild-0.0.3 → seqbuild-0.0.4}/README.md +0 -0
- {seqbuild-0.0.3 → seqbuild-0.0.4}/seqbuild.egg-info/dependency_links.txt +0 -0
- {seqbuild-0.0.3 → seqbuild-0.0.4}/setup.cfg +0 -0
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
from .not_equals import *
|
|
2
|
+
from .fraction import *
|
|
3
|
+
from morebs2.poly_interpolation import *
|
|
4
|
+
|
|
5
|
+
DEFAULT_FIT22_PARTITION_SIZE_RANGE = (5,103)
|
|
6
|
+
|
|
7
|
+
DEFAULT_POLYNOMIAL_PARTITION_SIZE_RANGE = (50,1000)
|
|
8
|
+
DEFAULT_POLYNOMIAL_POINT_SIZE_RANGE = (5,21)
|
|
9
|
+
|
|
10
|
+
class Fit22ValueOutputter(GenericIntSeqOp):
|
|
11
|
+
|
|
12
|
+
def __init__(self,px,length_outputter,range_outputter,bool_outputter,\
|
|
13
|
+
point_conn_type:int,adjustment_type:int=1):
|
|
14
|
+
assert type(px) in {MethodType,FunctionType}
|
|
15
|
+
assert point_conn_type in {1,2}
|
|
16
|
+
assert type(bool_outputter) in {MethodType,FunctionType}
|
|
17
|
+
|
|
18
|
+
self.px = px
|
|
19
|
+
self.point_conn_type = point_conn_type
|
|
20
|
+
self.b_out = bool_outputter
|
|
21
|
+
|
|
22
|
+
self.p0 = None
|
|
23
|
+
self.p1 = None
|
|
24
|
+
self.H = None
|
|
25
|
+
|
|
26
|
+
self.x_ = None
|
|
27
|
+
self.x2_ = None
|
|
28
|
+
self.a_ = None
|
|
29
|
+
self.ax = None
|
|
30
|
+
|
|
31
|
+
super().__init__(length_outputter,range_outputter,adjustment_type)
|
|
32
|
+
return
|
|
33
|
+
|
|
34
|
+
def set_next_value(self):
|
|
35
|
+
if type(self.x_) == type(None):
|
|
36
|
+
self.update_points()
|
|
37
|
+
elif self.x_ > self.x2_:
|
|
38
|
+
self.update_points()
|
|
39
|
+
else: pass
|
|
40
|
+
|
|
41
|
+
if self.ax:
|
|
42
|
+
sx = self.H.f(self.x_)
|
|
43
|
+
else:
|
|
44
|
+
sx = self.H.g(self.x_)
|
|
45
|
+
self.x_ += self.a_
|
|
46
|
+
|
|
47
|
+
sx_ = float_to_string(sx,True,True)
|
|
48
|
+
self.s = sx_
|
|
49
|
+
return
|
|
50
|
+
|
|
51
|
+
def update_points(self):
|
|
52
|
+
# case: start
|
|
53
|
+
if type(self.p0) == type(None):
|
|
54
|
+
self.p0 = self.px()
|
|
55
|
+
self.p1 = self.px()
|
|
56
|
+
# output 1 or 2 new points
|
|
57
|
+
elif self.point_conn_type == 1:
|
|
58
|
+
self.p0 = self.p1
|
|
59
|
+
self.p1 = self.px()
|
|
60
|
+
else:
|
|
61
|
+
self.p0,self.p1 = self.px(),self.px()
|
|
62
|
+
|
|
63
|
+
self.fix_equal_points()
|
|
64
|
+
|
|
65
|
+
# instantiate either <LogFit22> or <Exp2Fit22>
|
|
66
|
+
mx = np.array([self.p0,self.p1]) if \
|
|
67
|
+
self.p0[1] < self.p1[1] else \
|
|
68
|
+
np.array([self.p1,self.p0])
|
|
69
|
+
lORe = self.b_out() % 2
|
|
70
|
+
|
|
71
|
+
if lORe:
|
|
72
|
+
self.H = LogFit22(mx,direction=[0,1])
|
|
73
|
+
else:
|
|
74
|
+
self.H = Exp2Fit22(mx,direction=[0,1])
|
|
75
|
+
|
|
76
|
+
# set delta variables for exploring the fitter
|
|
77
|
+
self.ax = self.b_out() % 2
|
|
78
|
+
|
|
79
|
+
ax_ = (self.ax + 1) % 2
|
|
80
|
+
self.x_ = min(self.H.ps[:,ax_])
|
|
81
|
+
self.x2_ = max(self.H.ps[:,ax_])
|
|
82
|
+
|
|
83
|
+
ap = modulo_in_range(self.l_out(),DEFAULT_FIT22_PARTITION_SIZE_RANGE)
|
|
84
|
+
self.a_ = (self.x2_ - self.x_) / ap
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def fix_equal_points(self):
|
|
88
|
+
|
|
89
|
+
self.p0 = np.array(self.p0)
|
|
90
|
+
self.p1 = np.array(self.p1)
|
|
91
|
+
|
|
92
|
+
self.p0,self.p1 = \
|
|
93
|
+
not_equals__pairvec(self.p0,self.p1,self.px,indices=None)
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
"""
|
|
98
|
+
LPS stands for Lagrange Polynomial Solver, interpolation of a
|
|
99
|
+
polynomial's span of points using the Lagrange basis.
|
|
100
|
+
"""
|
|
101
|
+
class LPSValueOutputter(GenericIntSeqOp):
|
|
102
|
+
|
|
103
|
+
def __init__(self,px,length_outputter,range_outputter,\
|
|
104
|
+
adjustment_type:int=1):
|
|
105
|
+
|
|
106
|
+
assert type(px) in {MethodType,FunctionType}
|
|
107
|
+
self.px = px
|
|
108
|
+
|
|
109
|
+
self.p0,self.p1 = None,None
|
|
110
|
+
self.adder_end,self.adder,self.adder_i = None,None,None
|
|
111
|
+
|
|
112
|
+
super().__init__(length_outputter,range_outputter,adjustment_type)
|
|
113
|
+
|
|
114
|
+
#--------------------------------------------------------------------------
|
|
115
|
+
|
|
116
|
+
def set_next_value(self):
|
|
117
|
+
if type(self.p0) == type(None):
|
|
118
|
+
self.update_points()
|
|
119
|
+
elif self.adder_i > self.adder_end:
|
|
120
|
+
self.update_points()
|
|
121
|
+
else: pass
|
|
122
|
+
|
|
123
|
+
x = self.p0 + (self.adder_i * self.adder)
|
|
124
|
+
sx = self.lps.output_by_lagrange_basis(x)
|
|
125
|
+
sx_ = float_to_string(sx,True,True)
|
|
126
|
+
self.s = sx_
|
|
127
|
+
|
|
128
|
+
self.adder_i += 1
|
|
129
|
+
|
|
130
|
+
return
|
|
131
|
+
|
|
132
|
+
def update_points(self):
|
|
133
|
+
|
|
134
|
+
self.q = LPSValueOutputter.new_pointset(self.px,self.l_out)
|
|
135
|
+
|
|
136
|
+
# assumes q is a proper set of points for
|
|
137
|
+
# fitting via <LagrangePolySolver>
|
|
138
|
+
self.lps = LagrangePolySolver(self.q, prefetch = True)
|
|
139
|
+
self.p0,self.p1 = self.lps.minumum,self.lps.maximum
|
|
140
|
+
|
|
141
|
+
self.adder_end = modulo_in_range(self.l_out(),DEFAULT_POLYNOMIAL_PARTITION_SIZE_RANGE)
|
|
142
|
+
self.adder = (self.p1 - self.p0) / self.adder_end
|
|
143
|
+
self.adder_i = 0
|
|
144
|
+
|
|
145
|
+
@staticmethod
|
|
146
|
+
def new_pointset(px,l_out):
|
|
147
|
+
|
|
148
|
+
num_points = modulo_in_range(\
|
|
149
|
+
l_out(),DEFAULT_POLYNOMIAL_POINT_SIZE_RANGE)
|
|
150
|
+
|
|
151
|
+
M = []
|
|
152
|
+
for _ in range(num_points):
|
|
153
|
+
x = px()
|
|
154
|
+
assert type(x) in {list,tuple} or is_vector(x)
|
|
155
|
+
assert len(x) == 2
|
|
156
|
+
M.append(x)
|
|
157
|
+
M = np.array(M)
|
|
158
|
+
|
|
159
|
+
submat_type = l_out() % 4
|
|
160
|
+
t = DEFAULT_SUBMAT_TYPES[submat_type]
|
|
161
|
+
return not_equals__matrix_whole(M,l_out,t)
|
|
162
|
+
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
from .approximators import *
|
|
2
|
+
|
|
3
|
+
class PointInterpolationContainer:
|
|
4
|
+
|
|
5
|
+
def __init__(self,pts,starting_fvec):
|
|
6
|
+
assert is_2dmatrix(pts)
|
|
7
|
+
pts = pts[np.argsort(pts[:,0])]
|
|
8
|
+
self.pts = pts
|
|
9
|
+
self.fvec = starting_fvec
|
|
10
|
+
self.init_structs()
|
|
11
|
+
|
|
12
|
+
def init_structs(self):
|
|
13
|
+
self.lps = LagrangePolySolver(self.pts, prefetch = False)
|
|
14
|
+
self.cdc = ChainedDCurves(self.pts,self.fvec,0)
|
|
15
|
+
self.cdc.draw()
|
|
16
|
+
self.x = self.cdc.amin
|
|
17
|
+
self.x2 = self.cdc.amax
|
|
18
|
+
|
|
19
|
+
def differential_at(self,x,lps_first:bool=True):
|
|
20
|
+
q = self.lps.output_by_lagrange_basis(x)
|
|
21
|
+
q2 = self.cdc.fit(x)
|
|
22
|
+
|
|
23
|
+
# BUG: CAUTION!
|
|
24
|
+
if type(q) == type(None):
|
|
25
|
+
q = self.pts[0,0]
|
|
26
|
+
if type(q2) == type(None):
|
|
27
|
+
q2 = self.pts[-1,0]
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
if lps_first: return q - q2
|
|
31
|
+
return q2 - q
|
|
32
|
+
|
|
33
|
+
def modulate_dcurve_of_point(self,x):
|
|
34
|
+
index = self.cdc.point_to_dcurve(x)
|
|
35
|
+
assert index != -1
|
|
36
|
+
self.cdc.dcurve_seq[index].modulate_fit()
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
"""
|
|
40
|
+
PID stands for Point Interpolation Differential.
|
|
41
|
+
"""
|
|
42
|
+
class PIDValueOutputter(GenericIntSeqOp):
|
|
43
|
+
|
|
44
|
+
def __init__(self,px,frequency_outputter,\
|
|
45
|
+
length_outputter,range_outputter,adjustment_type):
|
|
46
|
+
assert type(px) in {MethodType,FunctionType}
|
|
47
|
+
|
|
48
|
+
assert type(frequency_outputter) in {MethodType,FunctionType}
|
|
49
|
+
|
|
50
|
+
self.px = px
|
|
51
|
+
self.pts = None
|
|
52
|
+
|
|
53
|
+
self.f_out = frequency_outputter
|
|
54
|
+
super().__init__(length_outputter,range_outputter,adjustment_type)
|
|
55
|
+
|
|
56
|
+
self.adder_end,self.adder,self.adder_i = -1,None,0
|
|
57
|
+
self.pic = None
|
|
58
|
+
return
|
|
59
|
+
|
|
60
|
+
def set_next_value(self):
|
|
61
|
+
|
|
62
|
+
if type(self.pic) == type(None) or self.adder_i > self.adder_end:
|
|
63
|
+
self.pts = LPSValueOutputter.new_pointset(self.px,self.l_out)
|
|
64
|
+
fvec = [self.f_out() % 2 for _ in range(len(self.pts) - 1)]
|
|
65
|
+
self.pic = PointInterpolationContainer(self.pts,fvec)
|
|
66
|
+
|
|
67
|
+
self.adder_end = modulo_in_range(self.f_out(),\
|
|
68
|
+
DEFAULT_POLYNOMIAL_PARTITION_SIZE_RANGE)
|
|
69
|
+
self.adder = (self.pic.x2 - self.pic.x) / self.adder_end
|
|
70
|
+
self.adder_i = 0
|
|
71
|
+
self.fvec_frequency = modulo_in_range(\
|
|
72
|
+
self.f_out(),[1,max([2,ceil(self.adder_end / 5)])])
|
|
73
|
+
|
|
74
|
+
x = self.pic.x + (self.adder_i * self.adder)
|
|
75
|
+
stat = (self.adder_i % self.fvec_frequency) == 0
|
|
76
|
+
|
|
77
|
+
if stat:
|
|
78
|
+
self.pic.modulate_dcurve_of_point(x)
|
|
79
|
+
|
|
80
|
+
q = self.pic.differential_at(x,lps_first=True)
|
|
81
|
+
self.adder_i += 1
|
|
82
|
+
|
|
83
|
+
q_ = int(q)
|
|
84
|
+
q -= q_
|
|
85
|
+
|
|
86
|
+
self.s += str(abs(q_))
|
|
87
|
+
self.s += float_to_string(abs(q),True,True)
|
|
88
|
+
return
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
from intigers.seq_struct import *
|
|
2
|
+
from intigers.extraneous import zero_div0
|
|
3
|
+
from morebs2.numerical_generator import modulo_in_range
|
|
4
|
+
from morebs2.matrix_methods import is_valid_range,float_to_string
|
|
5
|
+
from types import MethodType,FunctionType
|
|
6
|
+
|
|
7
|
+
class GenericIntSeqOp:
|
|
8
|
+
|
|
9
|
+
def __init__(self,length_outputter,range_outputter,adjustment_type:int):
|
|
10
|
+
assert type(length_outputter) in {MethodType,FunctionType}
|
|
11
|
+
assert type(range_outputter) in {MethodType,FunctionType}
|
|
12
|
+
assert adjustment_type in {1,2}
|
|
13
|
+
self.l_out = length_outputter
|
|
14
|
+
self.r_out = range_outputter
|
|
15
|
+
self.adj_type = adjustment_type
|
|
16
|
+
self.s = ""
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def __next__(self):
|
|
20
|
+
l = modulo_in_range(self.l_out(),[1,18])
|
|
21
|
+
assert type(l) in {int,np.int32,np.int64}
|
|
22
|
+
|
|
23
|
+
s_ = self.s[:l]
|
|
24
|
+
self.s = self.s[l:]
|
|
25
|
+
|
|
26
|
+
diff = l - len(s_)
|
|
27
|
+
while diff > 0:
|
|
28
|
+
self.set_next_value()
|
|
29
|
+
dx = diff if len(self.s) >= diff else len(self.s)
|
|
30
|
+
s_ = s_ + self.s[:dx]
|
|
31
|
+
diff = diff - dx
|
|
32
|
+
self.s = self.s[dx:]
|
|
33
|
+
|
|
34
|
+
# BUG: CAUTION!!
|
|
35
|
+
s1 = 5
|
|
36
|
+
try:
|
|
37
|
+
s1 = np.int64(s_)
|
|
38
|
+
except:
|
|
39
|
+
pass
|
|
40
|
+
return self.adjust_integer(s1)
|
|
41
|
+
|
|
42
|
+
def set_next_value(self):
|
|
43
|
+
return -1
|
|
44
|
+
|
|
45
|
+
def adjust_integer(self,i):
|
|
46
|
+
assert type(i) in {int,np.int32,np.int64}
|
|
47
|
+
|
|
48
|
+
mrange = self.r_out()
|
|
49
|
+
assert is_valid_range(mrange,False,False)
|
|
50
|
+
|
|
51
|
+
if self.adj_type == 1:
|
|
52
|
+
return self.adjustment_type1(i,mrange)
|
|
53
|
+
return self.adjustment_type2(i,mrange)
|
|
54
|
+
|
|
55
|
+
def adjustment_type1(self,i,mrange):
|
|
56
|
+
return modulo_in_range(i,mrange)
|
|
57
|
+
|
|
58
|
+
def adjustment_type2(self,i,mrange):
|
|
59
|
+
diff = mrange[1] - mrange[0]
|
|
60
|
+
i = abs(i)
|
|
61
|
+
|
|
62
|
+
while i >= diff:
|
|
63
|
+
i = i / 10
|
|
64
|
+
return mrange[0] + i
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
"""
|
|
69
|
+
Outputs float values that originate from quotient outputs of pairs in `intseq`.
|
|
70
|
+
|
|
71
|
+
index_selector := function|method, parameter-less. Outputs pairs of numbers that act
|
|
72
|
+
as 2-dimensional indices.
|
|
73
|
+
length_outputter := function|method, parameter-less. Outputs positive integers.
|
|
74
|
+
range_outputter := function|method, parameter-less. Outputs ordered pairs of
|
|
75
|
+
numbers.
|
|
76
|
+
"""
|
|
77
|
+
class QValueOutputter(GenericIntSeqOp):
|
|
78
|
+
|
|
79
|
+
def __init__(self,intseq,index_selector,length_outputter,range_outputter,\
|
|
80
|
+
adjustment_type:int):
|
|
81
|
+
assert type(intseq) == IntSeq
|
|
82
|
+
assert len(intseq) >= 2
|
|
83
|
+
assert type(index_selector) in {MethodType,FunctionType}
|
|
84
|
+
super().__init__(length_outputter,range_outputter,adjustment_type)
|
|
85
|
+
|
|
86
|
+
self.intseq = intseq
|
|
87
|
+
self.iselector = index_selector
|
|
88
|
+
return
|
|
89
|
+
|
|
90
|
+
def change_adj_type(self):
|
|
91
|
+
self.adj_type = 1 if self.adj_type == 2 else 2
|
|
92
|
+
|
|
93
|
+
def set_next_value(self):
|
|
94
|
+
i1,i2 = self.iselector()
|
|
95
|
+
i1 = i1 % len(self.intseq)
|
|
96
|
+
i2 = i2 % len(self.intseq)
|
|
97
|
+
|
|
98
|
+
q = zero_div0(self.intseq[i1],self.intseq[i2])
|
|
99
|
+
q = float_to_string(abs(q),True,True)
|
|
100
|
+
self.s = q
|
|
101
|
+
return q
|
|
102
|
+
|