From 89c22f27056983af71531c6c55f0d4b2cc1b74a1 Mon Sep 17 00:00:00 2001 From: Milan Rother Date: Thu, 11 Dec 2025 12:14:31 +0100 Subject: [PATCH 1/3] update port maps through Register for Splitter --- .DS_Store | Bin 8196 -> 0 bytes docs/.DS_Store | Bin 6148 -> 0 bytes docs/source/.DS_Store | Bin 6148 -> 0 bytes docs/source/modules/.DS_Store | Bin 6148 -> 0 bytes src/.DS_Store | Bin 6148 -> 0 bytes src/pathsim_chem/.DS_Store | Bin 6148 -> 0 bytes src/pathsim_chem/tritium/.DS_Store | Bin 6148 -> 0 bytes src/pathsim_chem/tritium/splitter.py | 22 ++++++++++++---------- tests/.DS_Store | Bin 6148 -> 0 bytes 9 files changed, 12 insertions(+), 10 deletions(-) delete mode 100644 .DS_Store delete mode 100644 docs/.DS_Store delete mode 100644 docs/source/.DS_Store delete mode 100644 docs/source/modules/.DS_Store delete mode 100644 src/.DS_Store delete mode 100644 src/pathsim_chem/.DS_Store delete mode 100644 src/pathsim_chem/tritium/.DS_Store delete mode 100644 tests/.DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index d0dca0dbae6ee5d884e49bee127f2d3354c9cead..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8196 zcmeHMU2GIp6uxJ=g_(icTUwy(02yi0A}zSBv=%V1{o^Oa6xjYzz;$+KXeUf()}7fc zNQhP93y2tBd=UJ5H5z%)7>q`rX!J>Jj6A4`CcbDQ`e;n_+_`sQTd2gukjBhSX3jnL zo^yY``<;8|?h-N27j{V@r@7?r1jOY7M9&~@C=m9J?dzdAfh3pF zJ3=5r;7$bC*&ib&@ko~V<@fgr;*&hdmKRl$fLK@@5I-~J=Q56$LGKSUImh;cMB;0Z zDq@vOmdZ=zW%9Aqgg2E6jG*9m8~Gzl8^m7*GNrtc8MdvdG_C9L+`zD1D<3-8riCU) zM{L*hrnrtfXoE>C;=cwYTW4oo#1Y^wZng5-oa1Tj!ZGioCMn;T?z4 zC!9&wJI5yrV#6R+^Co{D^|Bc)Fi~f`HI?-yb7jtDPL5yf;V@LxlwkO#1cRb3(}srC z(KKCA#JLXS0^4)_VJq*WOw(!~G1-^(+yi-w)sJL7r!eXIX`ohM%=u({{&)rff5q7%AGmopG!|*O;`F8fZ~wt5&V9 zUlZ3fZgAV7WI9^N*iRMg;1q3;<*<+Snywx-ad3}&ChNtN>HF9Y_THfB+7VXMleh3~ z3Wp}`A$8ElImp!DhArwAb?^i-LZLn{X;mN5h8!bfISMs-KOJhPHd5r+Dzu*$?oeyB zQCz)AoT9JrvRzu2_5|y8zu^Z1Im=~3n&EZ5SU2WR7Xm<-&62)Mwg( z7giz~`*lq_%$n;m&2SF&t5#QO2ep(;ugkbZwp+9@3UI}FFvtzbO?+|qlp2x=u~sr! zL$=^KyO$irD9e$vyhh$3ACS+;7vxKFgM3H6CqIxM$uH!0@+ZWg3aWuZ4aA`d zHo_)ohOLl==@Bw@``q?N;|Licq<+JPeK%wRJ1kH*DP8*0E#PEfR6om55eO-;lF&m>w>0 z7(Da%HXBBfx^`VDY;Fe<53C_1yLD1#F-MmQ>jyW;NOoE&)W#-M`{@#{#+zGY3@j>z zsv1wUDi}VrLa5E{r~+5iZQB(LBpMUy+MTG9P>IL8d$5@qD*tr(}lAB1?ZF zKa-o}FOZR&anPYLWM?yMh7NcXI$=9J27Ry__P{>m=^zZjFpR<&veZPLj)M((@F761 zJ_FP6ES!bsk*OEqC3qQLg-dW5UKgBw53bB(;l8;ngsXE|IO+BFigQc8cuAf4+_=^? z-@?3yMQ-Asj)Y<=?>e44j;)p=WA2a^k5<8lQqR5t`WF8EfAI`B8cBpegus7}0K|Gz zz1`UCLK_ylYwP$ti4RN6Zko%`1z*gBm50}Hl(+sc#Jn!*l0r^%i8Yw+`ws#4{8Wz4 S|LFV=Z?+43A^bni|GxnY0(Kby diff --git a/docs/.DS_Store b/docs/.DS_Store deleted file mode 100644 index a07109b44aa90dfa6c5f040aa4ec5e07e25f4555..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK!AiqG5Z!HSn^1%t6nb3nTCgoeTD*i>f53!Lc4pIkDLWm;7#}UdE@KX3%mPKM*kHa9Tu0rKiiuPKx!PmOqF|ZN zfPgFzxQC4#QD6_`QVjmZLi+28dlS~^B(2WoBQ)cKJv30 z{B$X05^Q`wxQe6Y#5p*V>D-UgC{qP-7(vSIb)1HBIg*Ps%vG(Y7cASdCr)d%>JR&E z(H->GZLu2mI&E>%8?4v1b$E1qdNFxQo>Td%iRAE`Q?hSx18?Az&J^a;B!KUT1*L@- zFG~}dK0ti4*=7?$Vt^PR26mVMbLCmh9X=x+jTj&Xe#Zdb4+0d?HCSj=R|gn10sz(^ ztOR_VC9p;qbPX07VFiTiQb1kG&4|HuImCs@a}5?6bvff^_~7Qr+)OB3JstKJDxGmx zBUxgA7$`Gy+4Q1?W8}3g#6Wze>PS htr&8#6}Lc@KwO{$=o&0ELIi~V2q+rJ5Ceb8z$ciDQYrud diff --git a/docs/source/.DS_Store b/docs/source/.DS_Store deleted file mode 100644 index 276ab9c28bb71f5485b36830edf29dfc7cf75ad4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKOHRWu5S@V{BC+X`4U(_W8>Ce@K`#Jl5G)*Asp^h}Z^w!wa2MWq29z{eAQlLr z8OeTQ&&TnTVta^)H^**8v?QVmO^`*I5t*Jfotg6mkV}q84|M1byV$0gM1OHgzWtJV zO4QMj2H&3|wsdNWkE`u2_4~n2PJ;W?G;K^RJgWDX=bN|t*Yz|{pSo{&?Vl#A4HkCQ z8E^)i0cXG&_!$Fo!9l7kMem&fXTTZwVnEJ^fF@WQX2o)JperQ+aDnL}(504;m|$2N zW<^*atf4>+Wh*gQ!!aMsuQtqz8cuA*2iwY@#S53!kv|l7;#$#rXTTX4GjOiMrQH9w z_+@5`{BeknoB?OxpE1CTX4`DADZ5)I+mpLCpxvQ~h+h^30)6xdz(CHC>ta-U5FLKC WVOEqZGGD@h{tzgHc;^iK0s|kLAT;9u diff --git a/docs/source/modules/.DS_Store b/docs/source/modules/.DS_Store deleted file mode 100644 index d487bf6de3f1d61e81dc431bdae032c92d8f3d41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~!A=4(5Qe9~0mFr(@w6`>#5dR=9!v<55WOk_Q6dOocTGqhq}zEGT>9e?7(#iaqQ zHwKJ>T?VSbZ0h}g_5J&QH_0qxz!>;b47gf%*zK^Tc(?9tPVd?Tc|f#jTp4hig5s}Y fV)ZIMMSR1br~;-D%Yb-j_D8_eV4X4Ws|W9brF&_Z z7o$Or8Z|S??6=I$?9aE&4g&z9Jqhao6##Hh2@54`z7QHGU6O*etRV_LM+y-Pp$k12 zEP1oxH!?tXw*@2cA;UZScz=Bu2GevD#413amtYh}X;!Pfio#lPePh$vbjr@HH&9bA z^Rr3X_Q%)s>q4nGSoHniGU`vem7P0jK1Y zx|O}z?67rImGx$0UX`;}qgIv2jplq_a(4F*PR_dz@i0+OhE##ypO$Tl3wXxP%JYS3 zFAi|O6ui>u(HkeRO778TvB+X_MrME+U!Ze2Ph|4QU}qsm>Wb33jYz%G;qTV{3ru&Q509O diff --git a/src/pathsim_chem/.DS_Store b/src/pathsim_chem/.DS_Store deleted file mode 100644 index 5b72ad7f5cb26099d8b7c6fb06514451f9c2d4b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK&1%~~5T141cugockdhn)y&CFZ42JfgI8H9PRi!;N!Lcl3i^^JK$@Re)bWKh< z^w@J>p^wl92;_M>v%3!d>&=8>W?=Rk&Cjm(liBqEfM|?^Q-BfxNL0dH5r+*zand!( zSx*5`=s7|d!@!>;LqA%}X2<`?0DZdxq%eXI$A#~we2o0|hf$cMmCBRI?d4zX7i2*m z$Q!S(CSKZ3$4R3-`btlql#2Yh-S$6+-ASu-bgtsG9md^}E(n7zrd)ps<3LRsY8(fN zuJuen7G<$jI-X9em3rB!*JfpBTCb5=tYaKWH5i)e^TYLwfoeAWNHZdTUUq&xe)w~?DJyu+0?2+`ZOj_> z7gu|rMOWVEyElp>756YQ-ymhNFayj0Gq61d?CBy8wl^iu#0)S4JHh~+4-P7!YcVsZ zj}9Dk3xJqMw-&Uim!KNQqH8fTh!GTFN)b(|uq}o#<>+^8o@+5PXv#s@=0n((h3!y; zULEImbUFyvAdk!dGqB9So_Q?M{eSWA{(rfMpO^t=V5b-m`KH%w;Fj#&y0$sGYaP^E rR1(U|3_h2jp|4`hrK|V^RSWtZG7w#hnL+fR@E-w90}sr=i!$&RLdbJc diff --git a/src/pathsim_chem/tritium/.DS_Store b/src/pathsim_chem/tritium/.DS_Store deleted file mode 100644 index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0S5Z-O8-BN@e6g>vK3bquX;3dZT0!H+pQX5m+V45vWY7eE5tG84sW;gpK>}D8a+!^>4#!8Ga0g9L@K(jz_9Cc1I#*+u+ zYL0*nSl1iIJujS#CdYqd0N-7nC9KZ^Xg|F_>A}d8*9(IuZpJVSt%FvtGP46^l4I8EPLm4H_AZqnhLg2R`*@hf z5QRo*b2O@!YdcnLZ@goTYI|r_tK)G&Y;5oDA2)8oZY1wClN>%eC2IyJa1X}Jru_Ii z^xz>eWo9UBSKMpa?M<@hBf7F)_d>;pczDY^K07Z5i=zA=MD;q~t#<47qfka|SYfik zPme|>F+dCu1HZt4IbB5Y7v`cVhyh|?xfsCn!2(6J4W=5^(E*Jr0RVI0RsuHG5}0Ed zv<;>jVFZNhR6w1|O^LyEI`}OUXB$j4>U73U@xjf?+*BxBtq${BDx7g!Belc;F)+ Date: Thu, 11 Dec 2025 12:17:22 +0100 Subject: [PATCH 2/3] update port maps through Register for Process --- src/pathsim_chem/tritium/residencetime.py | 33 +++++++++++++---------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/src/pathsim_chem/tritium/residencetime.py b/src/pathsim_chem/tritium/residencetime.py index 10707fc..c06e797 100644 --- a/src/pathsim_chem/tritium/residencetime.py +++ b/src/pathsim_chem/tritium/residencetime.py @@ -9,7 +9,7 @@ import numpy as np from pathsim.blocks.dynsys import DynamicalSystem - +from pathsim.utils.register import Register # BLOCKS ================================================================================ @@ -50,30 +50,35 @@ class ResidenceTime(DynamicalSystem): def __init__(self, tau=1, betas=None, gammas=None, initial_value=0, source_term=0): - #input validation + # input validation if np.isclose(tau, 0): raise ValueError(f"'tau' must be nonzero but is {tau}") - #time constant and input/output weights + # time constant and input/output weights self.tau = tau self.betas = 1 if betas is None else np.array(betas) self.gammas = 1 if gammas is None else np.array(gammas) self.source_term = source_term - #rhs of residence time ode + # rhs of residence time ode def _fn_d(x, u, t): return -x/self.tau + self.source_term + sum(self.betas*u) - #jacobian of rhs wrt x + # jacobian of rhs wrt x def _jc_d(x, u, t): return -1/self.tau - #output function of residence time ode + # output function of residence time ode def _fn_a(x, u, t): return self.gammas * x - #initialization just like `DynamicalSystem` block - super().__init__(func_dyn=_fn_d, jac_dyn=_jc_d, func_alg=_fn_a, initial_value=initial_value) + # initialization just like `DynamicalSystem` block + super().__init__( + func_dyn=_fn_d, + jac_dyn=_jc_d, + func_alg=_fn_a, + initial_value=initial_value, + ) class Process(ResidenceTime): @@ -112,11 +117,11 @@ class Process(ResidenceTime): constant source term / generation term of the process """ - #max number of ports - _n_out_max = 2 - - #maps for input and output port labels - _port_map_out = {"x": 0, "x/tau": 1} - def __init__(self, tau=1, initial_value=0, source_term=0): super().__init__(tau, 1, [1, 1/tau], initial_value, source_term) + + # define output port maps based on fractions + self.outputs = Register( + size=2, + mapping={"x": 0, "x/tau": 1} + ) \ No newline at end of file From 0c3a5535d05b9c54571df669dc32c92bf9d419b2 Mon Sep 17 00:00:00 2001 From: Milan Rother Date: Thu, 11 Dec 2025 12:21:34 +0100 Subject: [PATCH 3/3] update port maps through Register for Bubbler4 --- src/pathsim_chem/tritium/bubbler.py | 38 +++++++++++++++++++---------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/src/pathsim_chem/tritium/bubbler.py b/src/pathsim_chem/tritium/bubbler.py index fc39a53..955b633 100644 --- a/src/pathsim_chem/tritium/bubbler.py +++ b/src/pathsim_chem/tritium/bubbler.py @@ -10,6 +10,7 @@ from pathsim.blocks.dynsys import DynamicalSystem from pathsim.events.schedule import ScheduleList +from pathsim.utils.register import Register # BLOCK DEFIINITIONS ==================================================================== @@ -92,18 +93,6 @@ class Bubbler4(DynamicalSystem): of a full vial with an empty one. """ - _port_map_out = { - "vial1": 0, - "vial2": 1, - "vial3": 2, - "vial4": 3, - "sample_out": 4, - } - _port_map_in = { - "sample_in_soluble": 0, - "sample_in_insoluble": 1, - } - def __init__( self, conversion_efficiency=0.9, @@ -149,7 +138,30 @@ def _fn_a(x, u, t): return np.hstack([x, sample_out]) #initialization just like `DynamicalSystem` block - super().__init__(func_dyn=_fn_d, func_alg=_fn_a, initial_value=np.zeros(4)) + super().__init__( + func_dyn=_fn_d, + func_alg=_fn_a, + initial_value=np.zeros(4), + ) + + # define port maps + self.inputs = Register( + size=2, + mapping={ + "sample_in_soluble": 0, + "sample_in_insoluble": 1, + }, + ) + self.outputs = Register( + size=5, + mapping={ + "vial1": 0, + "vial2": 1, + "vial3": 2, + "vial4": 3, + "sample_out": 4, + }, + ) #create internal vial reset events self._create_reset_events()