Initial commit

This commit is contained in:
jackyu66git
2025-06-10 01:16:09 +08:00
commit 05bab03b8c
155 changed files with 19979 additions and 0 deletions
+76
View File
@@ -0,0 +1,76 @@
from Bi.BiList import CBiList
from Common.CEnum import BI_DIR, SEG_TYPE
from .EigenFX import CEigenFX
from .SegConfig import CSegConfig
from .SegListComm import CSegListComm
class CSegListChan(CSegListComm):
def __init__(self, seg_config=CSegConfig(), lv=SEG_TYPE.BI):
super(CSegListChan, self).__init__(seg_config=seg_config, lv=lv)
def do_init(self):
# 删除末尾不确定的线段
while len(self) and not self.lst[-1].is_sure:
_seg = self[-1]
for bi in _seg.bi_list:
bi.parent_seg = None
if _seg.pre:
_seg.pre.next = None
self.lst.pop()
if len(self):
assert self.lst[-1].eigen_fx and self.lst[-1].eigen_fx.ele[-1]
if not self.lst[-1].eigen_fx.ele[-1].lst[-1].is_sure:
# 如果确定线段的分形的第三元素包含不确定笔,也需要重新算,不然线段分形元素的高低点可能不对
self.lst.pop()
def update(self, bi_lst: CBiList):
self.do_init()
if len(self) == 0:
self.cal_seg_sure(bi_lst, begin_idx=0)
else:
self.cal_seg_sure(bi_lst, begin_idx=self[-1].end_bi.idx+1)
self.collect_left_seg(bi_lst)
def cal_seg_sure(self, bi_lst: CBiList, begin_idx: int):
up_eigen = CEigenFX(BI_DIR.UP, lv=self.lv) # 上升线段下降笔
down_eigen = CEigenFX(BI_DIR.DOWN, lv=self.lv) # 下降线段上升笔
last_seg_dir = None if len(self) == 0 else self[-1].dir
for bi in bi_lst[begin_idx:]:
fx_eigen = None
if bi.is_down() and last_seg_dir != BI_DIR.UP:
if up_eigen.add(bi):
fx_eigen = up_eigen
elif bi.is_up() and last_seg_dir != BI_DIR.DOWN:
if down_eigen.add(bi):
fx_eigen = down_eigen
if len(self) == 0: # 尝试确定第一段方向,不要以谁先成为分形来决定,反例:US.EVRG
if up_eigen.ele[1] is not None and bi.is_down():
last_seg_dir = BI_DIR.DOWN
down_eigen.clear()
elif down_eigen.ele[1] is not None and bi.is_up():
up_eigen.clear()
last_seg_dir = BI_DIR.UP
if up_eigen.ele[1] is None and last_seg_dir == BI_DIR.DOWN and bi.dir == BI_DIR.DOWN:
last_seg_dir = None
elif down_eigen.ele[1] is None and last_seg_dir == BI_DIR.UP and bi.dir == BI_DIR.UP:
last_seg_dir = None
if fx_eigen:
self.treat_fx_eigen(fx_eigen, bi_lst)
break
def treat_fx_eigen(self, fx_eigen, bi_lst: CBiList):
_test = fx_eigen.can_be_end(bi_lst)
end_bi_idx = fx_eigen.GetPeakBiIdx()
if _test in [True, None]: # None表示反向分型找到尾部也没找到
is_true = _test is not None # 如果是正常结束
if not self.add_new_seg(bi_lst, end_bi_idx, is_sure=is_true and fx_eigen.all_bi_is_sure()): # 防止第一根线段的方向与首尾值异常
self.cal_seg_sure(bi_lst, end_bi_idx+1)
return
self.lst[-1].eigen_fx = fx_eigen
if is_true:
self.cal_seg_sure(bi_lst, end_bi_idx + 1)
else:
self.cal_seg_sure(bi_lst, fx_eigen.lst[1].idx)