68 lines
2.1 KiB
Python
68 lines
2.1 KiB
Python
import random
|
||
|
||
import heurams.kernel.evaluators as puz
|
||
import heurams.kernel.particles as pt
|
||
from heurams.services.logger import get_logger
|
||
|
||
from .states import PhaserState
|
||
|
||
|
||
class Fission:
|
||
"""单原子调度展开器"""
|
||
|
||
def __init__(self, atom: pt.Atom, phase_state=PhaserState.RECOGNITION):
|
||
self.cursor = 0
|
||
self.logger = get_logger(__name__)
|
||
self.atom = atom
|
||
|
||
# NOTE: phase 为 PhaserState 枚举实例,需要获取其value
|
||
phase_value = (
|
||
phase_state.value if isinstance(phase_state, PhaserState) else phase_state
|
||
)
|
||
|
||
self.orbital_schedule = atom.registry["orbital"]["phases"][phase_value] # type: ignore
|
||
self.orbital_puzzles = atom.registry["nucleon"]["puzzles"]
|
||
|
||
self.puzzles = list()
|
||
for item, possibility in self.orbital_schedule: # type: ignore
|
||
self.logger.debug(f"开始处理: {item}")
|
||
if not isinstance(possibility, float):
|
||
possibility = float(possibility)
|
||
|
||
while possibility > 1:
|
||
self.puzzles.append(
|
||
{
|
||
"puzzle": puz.puzzles[self.orbital_puzzles[item]["__origin__"]],
|
||
"alia": item,
|
||
}
|
||
)
|
||
possibility -= 1
|
||
|
||
if random.random() <= possibility:
|
||
self.puzzles.append(
|
||
{
|
||
"puzzle": puz.puzzles[self.orbital_puzzles[item]["__origin__"]],
|
||
"alia": item,
|
||
}
|
||
)
|
||
|
||
self.logger.debug(f"orbital 项处理完成: {item}")
|
||
|
||
def get_puzzles(self):
|
||
return self.puzzles
|
||
|
||
def get_current_puzzle(self, forward=0):
|
||
if forward:
|
||
if len(self.puzzles) <= self.cursor + 1:
|
||
return 0
|
||
self.cursor += 1
|
||
return self.puzzles[self.cursor]
|
||
else:
|
||
return self.puzzles[self.cursor]
|
||
|
||
def check_passed(self):
|
||
for i in self.puzzles:
|
||
if i["finished"] == 0:
|
||
return 0
|
||
return 1
|