[docs]classeit_inverse:""" Abstract base class for solving the Electrical Impedance Tomography (EIT) inverse problem. This class provides the interface for solving EIT problems inverse problem on nerve models :class:`eit_forward_results` simulation results .. seealso:: :doc:`EIT users guide </usersguide/eit>` --- For generic description. :doc:`Tutorial 6 </tutorials/6_play_with_eit>` --- For usage description. Note ---- This class is abstract and cannot be instantiated directely. For now only the following daughter class can be used: - :class:`nrv.eit.pyeit_inverse`: Interface EIT of inverse problem solving using PyEIT methods. Note ---- In future version additional solver could be add to NRV. """
[docs]@abstractmethoddef__init__(self,data:None|eit_forward_results=None,**kwgs):self.data=data# TODO [NRV] load_any(data) for merge with nrvself.n_proc:int=1self.results=[]self.results_ppt=[]
# ---------------------- ## Properties and setters ## ---------------------- #@propertydefhas_data(self)->bool:""" Check if the object contains data. Returns ------- bool: True if data is present, False otherwise. """returnself.dataisnotNone@propertydefdata(self)->None|eit_forward_results:returnself._data@data.setterdefdata(self,data:None|eit_forward_results):self._data=data@data.deleterdefdata(self):self._data=None
[docs]defsolve(self,i_t:np.ndarray|int|None=0,i_f:np.ndarray|int|None=0,i_res:np.ndarray|int|None=0,**kwgs,):_msolve=np.iterable(i_t)ornp.iterable(i_f)ornp.iterable(i_res)ifnot_msolve:_res,_ppt=self._run_inverse(i_t=i_t,i_f=i_f,i_res=i_res)self.results.append(_res)self.results_ppt.append(_ppt)else:self.to_solve=list(product(set_idxs(i_t,self.data.n_t),set_idxs(i_f,self.data.n_f),))_n_sim=len(self.to_solve)sim_list=np.arange(_n_sim)withprogress.Progress("[progress.description]{task.description}","{task.completed} / {task.total}",progress.BarColumn(),"[progress.percentage]{task.percentage:>3.0f}%",progress.TimeRemainingColumn(),progress.TimeElapsedColumn(),)aspg:__label=self.__set_pbar_label(**kwgs)task_id=pg.add_task(f"[cyan]{__label}:",total=_n_sim)# with mp.get_context('spawn').Pool(parameters.get_nmod_ncore()) as pool: #forces spawn modewithPool(self.n_proc)aspool:for_res,_pptinpool.imap(self._run_inverse,sim_list):self.results.append(_res)self.results_ppt.append(_ppt)self.results.append(sim_list)pg.advance(task_id)pg.refresh()pool.close()# LR: Apparently this avoid PETSC Terminate ERRORpool.join()returnself.results
[docs]defget_results(self,i_t:int=0,i_f:int=0,i_res:int=0)->np.ndarray:res_id=i_t,i_f,i_resifnotres_idinself.results_ppt:print("Result not found. Computing...")self.solve(*res_id)returnself.results[self.results_ppt.index(res_id)]