Hello Chenghao.
It is actually extremely easy to have several engine -> i-PI communications, look into the examples/features folder.
For instance, you can do
```
<ffsocket name='lmpserial1' mode='unix'>
<address>h2o-pimd+rpc_short</address>
</ffsocket>
<ffsocket name='lmpserial2' mode='unix'>
<address>h2o-pimd+rpc_long</address>
</ffsocket>
<system>
<forces>
<force nbeads='32' forcefield='lmpserial1'/>
<force nbeads='5' forcefield='lmpserial2'/>
</forces>
[...]
</system>
```
to have two engines compte short and long-range forces to do ring polymer contraction.
Also, if you want to implement an external force engine that is written in pytorch, look at the `ipi/pes` folder, that way you can use the external code with <ffdirect> and <ffsocket> + i-pi-py_driver. `examples/client/metatensor` is a good example of how this can be used.
If you want DFT->i-PI->GPR (e.g. for active learning) this is not implemented, and would be non-trivial.
Hope this helps
Michele