aspuru-guzik-group / janus Goto Github PK
View Code? Open in Web Editor NEWCode for the paper "JANUS: Parallel Tempered Genetic Algorithm Guided by Deep Neural Networks for Inverse Molecular Design"
License: Apache License 2.0
Code for the paper "JANUS: Parallel Tempered Genetic Algorithm Guided by Deep Neural Networks for Inverse Molecular Design"
License: Apache License 2.0
Hi.
I was run the code, but I met errors in all codes that used multiprocessing.
As I know these errors came from the difference of OS.
Since I use Windows, I wonder how to correct the code for Windows.
Thanks.
Hi, I would like to ask if there are multiple objectives which I want the fitness function to fulfil, how would I write out the function because the example on the README.md is only for one objective (logP)?
Thank you! :D
Hello, I'm trying out JANUS and if I just run the example inside the tests as provided I get
File "/Users/nsofroniew/opt/anaconda3/envs/chem/lib/python3.9/multiprocessing/spawn.py", line 134, in _check_not_importing_main
raise RuntimeError('''
RuntimeError:
An attempt has been made to start a new process before the
current process has finished its bootstrapping phase.
This probably means that you are not using fork to start your
child processes and you have forgotten to use the proper idiom
in the main module:
if __name__ == '__main__':
freeze_support()
...
The "freeze_support()" line can be omitted if the program
is not going to be frozen to produce an executable.
This can be fixed by wrapping the creation and running of the JANUS agent and inside
if __name__ == '__main__':
torch.multiprocessing.freeze_support()
see for a similar fix pytorch/pytorch#5858 (comment)
I'm happy to submit a PR to fix if you like - it will be very simple
Hello, I am trying to run the provided example, but get the following error
$ python ./example.py
Unique and valid fragments generated: 107308
Unique and valid fragments generated: 107308
On generation 0/200
/Users/nsofroniew/opt/anaconda3/envs/chem/lib/python3.9/site-packages/janus/janus.py:457: RuntimeWarning: overflow encountered in power
prob_ = 1.0 / (3.0 ** ((F_50_val - fitness) / (F_50_val - F_25_val)) + 1)
(Explr) Top Fitness: 15.811199999999957
(Explr) Top Smile: CCCCCCCCCCCCCCCCOP(=O)(O)Oc1ccc(C=Cc2ccc(OP(=O)(O)OCCCCCCCCCCCCCCCC)cc2)cc1
Traceback (most recent call last):
File "/Users/nsofroniew/Documents/code/chem/janus/tests/./example.py", line 81, in <module>
File "/Users/nsofroniew/opt/anaconda3/envs/chem/lib/python3.9/site-packages/janus/janus.py", line 317, in run
mut_smi_loc = self.mutate_smi_list(smiles_local_search, "local")
File "/Users/nsofroniew/opt/anaconda3/envs/chem/lib/python3.9/site-packages/janus/janus.py", line 137, in mutate_smi_list
smi_list = smi_list * num_random_samples
numpy.core._exceptions._UFuncNoLoopError: ufunc 'multiply' did not contain a loop with signature matching types (dtype('<U98'), dtype('int64')) -> None
It looks like smi_list
has become a numpy array, which is unintended and it should be a list. This can be fixed by making this line
Line 137 in a52e599
smi_list = list(smi_list) * num_random_samples
There could be other, more desirable fixes that avoid this problem altogether. I am happy to submit a PR if this fix is desired though.
I am running the experiments for N generations but the model only gives the generated molecules of N-th generation. How can I also save the molecules from previous generation?
I tried running JANUS.py but got a number of exceptions. In addition, the script terminated with a KeyError.
Initial population obtained! Forming Fragments! Fragment creation: 0/10000 Fragment creation: 1000/10000 Fragment creation: 2000/10000 Fragment creation: 3000/10000 Fragment creation: 4000/10000 Fragment creation: 5000/10000 Fragment creation: 6000/10000 Fragment creation: 7000/10000 Fragment creation: 8000/10000 Fragment creation: 9000/10000 Process Process-5: Traceback (most recent call last): File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/multiprocessing/process.py", line 297, in _bootstrap self.run() File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/multiprocessing/process.py", line 99, in run self._target(*self._args, **self._kwargs) File "/home/ubuntu/software/JANUS/mutate_parr.py", line 205, in calc_parr_prop props_collect[property_name][smile] = get_prop_material(smile, alphabet=alphabet, num_random_samples=num_random_samples, num_mutations=num_mutations) # TODO: TESTING File "/home/ubuntu/software/JANUS/mutate_parr.py", line 129, in get_prop_material mutated_smiles = [decoder(x) for x in mutated_sf] File "/home/ubuntu/software/JANUS/mutate_parr.py", line 129, in mutated_smiles = [decoder(x) for x in mutated_sf] File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/site-packages/selfies/decoder.py", line 59, in decoder rings=rings File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/site-packages/selfies/decoder.py", line 147, in _derive_mol_from_symbols _raise_decoder_error(selfies, symbol) File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/site-packages/selfies/decoder.py", line 179, in _raise_decoder_error raise DecoderError(err_msg) selfies.exceptions.DecoderError: invalid symbol '[Branch3_1]' SELFIES: [S][C][=N][N][=C][Branch1][Ring1][C][C][C][Branch1][#Branch1][O][C][Branch1][C][C][=O][C][Branch1][C][C][Branch1][C][C][C][N][N][N][Branch3_1][C][C][=C][=C][Branch1][C][N][C][=C][Ring1][#Branch1][C][#Branch1][N] Process Process-7: Traceback (most recent call last): File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/multiprocessing/process.py", line 297, in _bootstrap self.run() File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/multiprocessing/process.py", line 99, in run self._target(*self._args, **self._kwargs) File "/home/ubuntu/software/JANUS/mutate_parr.py", line 205, in calc_parr_prop props_collect[property_name][smile] = get_prop_material(smile, alphabet=alphabet, num_random_samples=num_random_samples, num_mutations=num_mutations) # TODO: TESTING File "/home/ubuntu/software/JANUS/mutate_parr.py", line 129, in get_prop_material mutated_smiles = [decoder(x) for x in mutated_sf] File "/home/ubuntu/software/JANUS/mutate_parr.py", line 129, in mutated_smiles = [decoder(x) for x in mutated_sf] File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/site-packages/selfies/decoder.py", line 59, in decoder rings=rings File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/site-packages/selfies/decoder.py", line 124, in _derive_mol_from_symbols _raise_decoder_error(selfies, symbol) File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/site-packages/selfies/decoder.py", line 179, in _raise_decoder_error raise DecoderError(err_msg) selfies.exceptions.DecoderError: invalid symbol '[Expl=Ring3]' SELFIES: [C][Expl=Ring3][=C][Branch2][Ring1][=Branch1][C][=C][C][=C][Branch1][#C][C][=C][Ring1][=Branch1][C][=C][C][=C][C][=C][Ring1][=Branch1][Ring1][=C][F][C][Branch1][C][C][C][C][C][N][Branch1][=Branch2][S][Branch1][C][C][=Branch1][C][=O][=O][C][C][Ring1][#Branch2][C][N][Branch1][Branch1][C][C][C][C][C][C][C][C] Process Process-4: Traceback (most recent call last): File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/multiprocessing/process.py", line 297, in _bootstrap self.run() File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/multiprocessing/process.py", line 99, in run self._target(*self._args, **self._kwargs) File "/home/ubuntu/software/JANUS/mutate_parr.py", line 205, in calc_parr_prop props_collect[property_name][smile] = get_prop_material(smile, alphabet=alphabet, num_random_samples=num_random_samples, num_mutations=num_mutations) # TODO: TESTING File "/home/ubuntu/software/JANUS/mutate_parr.py", line 129, in get_prop_material mutated_smiles = [decoder(x) for x in mutated_sf] File "/home/ubuntu/software/JANUS/mutate_parr.py", line 129, in mutated_smiles = [decoder(x) for x in mutated_sf] File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/site-packages/selfies/decoder.py", line 59, in decoder rings=rings File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/site-packages/selfies/decoder.py", line 116, in _derive_mol_from_symbols init_state=binit_state, root_atom=prev_atom, rings=rings File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/site-packages/selfies/decoder.py", line 147, in _derive_mol_from_symbols _raise_decoder_error(selfies, symbol) File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/site-packages/selfies/decoder.py", line 179, in _raise_decoder_error raise DecoderError(err_msg) selfies.exceptions.DecoderError: invalid symbol '[Branch1_3]' SELFIES: [C][C][=C][Branch1][=Branch1][C][C][=Ring1][=Branch1][Branch1_3][C][C][=C][C][=C][Branch1][C][C][=C][C][=C][Branch1][C][N][C][=N][Ring1][#Branch1][#Branch2][C][N][C][O][C][C][Ring1][=Branch1][C][Branch1][C][O][=C][C][=C][Ring1][=C][O][Ring1][P] Process Process-6: Traceback (most recent call last): File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/multiprocessing/process.py", line 297, in _bootstrap self.run() File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/multiprocessing/process.py", line 99, in run self._target(*self._args, **self._kwargs) File "/home/ubuntu/software/JANUS/mutate_parr.py", line 205, in calc_parr_prop props_collect[property_name][smile] = get_prop_material(smile, alphabet=alphabet, num_random_samples=num_random_samples, num_mutations=num_mutations) # TODO: TESTING File "/home/ubuntu/software/JANUS/mutate_parr.py", line 129, in get_prop_material mutated_smiles = [decoder(x) for x in mutated_sf] File "/home/ubuntu/software/JANUS/mutate_parr.py", line 129, in mutated_smiles = [decoder(x) for x in mutated_sf] File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/site-packages/selfies/decoder.py", line 59, in decoder rings=rings File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/site-packages/selfies/decoder.py", line 116, in _derive_mol_from_symbols init_state=binit_state, root_atom=prev_atom, rings=rings File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/site-packages/selfies/decoder.py", line 147, in _derive_mol_from_symbols _raise_decoder_error(selfies, symbol) File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/site-packages/selfies/decoder.py", line 179, in _raise_decoder_error raise DecoderError(err_msg) selfies.exceptions.DecoderError: invalid symbol '[Branch3_2]' SELFIES: [C][C][=Branch1][#C][=C][C][=C][C][=Ring1][=Branch1][C][Branch1][C][F][Branch1][C][F][F][C][C][Branch1][C][C][=N][N][C][=Branch1][C][C][C][N][C][C][C][Branch1][C][N][C][C][Ring1][#Branch1][C][O][=C][C][Branch1][O][C][Branch3_2][C][N][C][C][O][C][C][Ring1][=Branch1][=O] Process Process-8: Traceback (most recent call last): File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/multiprocessing/process.py", line 297, in _bootstrap self.run() File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/multiprocessing/process.py", line 99, in run self._target(*self._args, **self._kwargs) File "/home/ubuntu/software/JANUS/mutate_parr.py", line 205, in calc_parr_prop props_collect[property_name][smile] = get_prop_material(smile, alphabet=alphabet, num_random_samples=num_random_samples, num_mutations=num_mutations) # TODO: TESTING File "/home/ubuntu/software/JANUS/mutate_parr.py", line 129, in get_prop_material mutated_smiles = [decoder(x) for x in mutated_sf] File "/home/ubuntu/software/JANUS/mutate_parr.py", line 129, in mutated_smiles = [decoder(x) for x in mutated_sf] File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/site-packages/selfies/decoder.py", line 59, in decoder rings=rings File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/site-packages/selfies/decoder.py", line 116, in _derive_mol_from_symbols init_state=binit_state, root_atom=prev_atom, rings=rings File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/site-packages/selfies/decoder.py", line 116, in _derive_mol_from_symbols init_state=binit_state, root_atom=prev_atom, rings=rings File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/site-packages/selfies/decoder.py", line 147, in _derive_mol_from_symbols _raise_decoder_error(selfies, symbol) File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/site-packages/selfies/decoder.py", line 179, in _raise_decoder_error raise DecoderError(err_msg) selfies.exceptions.DecoderError: invalid symbol '[Branch2_1]' SELFIES: [C][=Branch1][C][=O][Branch1][C][O][C][N][C][=Branch1][C][=O][C][Branch2][Ring1][=Branch1][N][C][=Branch1][C][=O][C][Branch1][N][C][=C][C][=C][C][Branch2_1][Ring2][=N][Ring1][=Branch1][N][=N][O][C][Ring2][Ring1][C][S][C][C][=Ring2][Ring1][=Branch1][S][C][S][N][=C][Branch1][Ring2][N][=Ring1][Branch1][S][C][C][N] Process Process-11: Traceback (most recent call last): File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/multiprocessing/process.py", line 297, in _bootstrap self.run() File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/multiprocessing/process.py", line 99, in run self._target(*self._args, **self._kwargs) File "/home/ubuntu/software/JANUS/mutate_parr.py", line 205, in calc_parr_prop props_collect[property_name][smile] = get_prop_material(smile, alphabet=alphabet, num_random_samples=num_random_samples, num_mutations=num_mutations) # TODO: TESTING File "/home/ubuntu/software/JANUS/mutate_parr.py", line 129, in get_prop_material mutated_smiles = [decoder(x) for x in mutated_sf] File "/home/ubuntu/software/JANUS/mutate_parr.py", line 129, in mutated_smiles = [decoder(x) for x in mutated_sf] File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/site-packages/selfies/decoder.py", line 59, in decoder rings=rings File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/site-packages/selfies/decoder.py", line 147, in _derive_mol_from_symbols _raise_decoder_error(selfies, symbol) File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/site-packages/selfies/decoder.py", line 179, in _raise_decoder_error raise DecoderError(err_msg) selfies.exceptions.DecoderError: invalid symbol '[Branch2_3]' SELFIES: [C][C][=C][C][Branch1][=C][C][N][Branch1][C][C][N][C][=Branch1][C][=O][C][S][C][C][C][Ring1][#Branch1][=C][C][=Ring1][O][C][=C][C][=C][C][=C][Ring1][=Branch1][O][C][=C][Branch2_3][Branch1] Process Process-10: Traceback (most recent call last): File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/multiprocessing/process.py", line 297, in _bootstrap self.run() File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/multiprocessing/process.py", line 99, in run self._target(*self._args, **self._kwargs) File "/home/ubuntu/software/JANUS/mutate_parr.py", line 205, in calc_parr_prop props_collect[property_name][smile] = get_prop_material(smile, alphabet=alphabet, num_random_samples=num_random_samples, num_mutations=num_mutations) # TODO: TESTING File "/home/ubuntu/software/JANUS/mutate_parr.py", line 129, in get_prop_material mutated_smiles = [decoder(x) for x in mutated_sf] File "/home/ubuntu/software/JANUS/mutate_parr.py", line 129, in mutated_smiles = [decoder(x) for x in mutated_sf] File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/site-packages/selfies/decoder.py", line 59, in decoder rings=rings File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/site-packages/selfies/decoder.py", line 116, in _derive_mol_from_symbols init_state=binit_state, root_atom=prev_atom, rings=rings File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/site-packages/selfies/decoder.py", line 116, in _derive_mol_from_symbols init_state=binit_state, root_atom=prev_atom, rings=rings File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/site-packages/selfies/decoder.py", line 147, in _derive_mol_from_symbols _raise_decoder_error(selfies, symbol) File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/site-packages/selfies/decoder.py", line 179, in _raise_decoder_error raise DecoderError(err_msg) selfies.exceptions.DecoderError: invalid symbol '[Branch3_3]' SELFIES: [F][C][=C][C][=C][Branch2][Ring2][O][C][N][C][Branch2][Ring2][Ring2][C][Branch1][#C][C][C][=C][Branch1][=Branch2][C][=C][C][=C][C][=Branch1][C][=O][N][Branch1][C][C][Branch3_3][C][Branch1][C][F][C][=Ring1][#Branch1][F][=N][C][C][Ring1][C][N][C][C][N][C][C][Ring1][=Branch1][=C][=N][C][=Branch1][Branch1][=N][C][=Ring1][=Branch1][N][Branch1][C][C][C][=O][C][=C][Ring2][Ring1][=N] Process Process-9: Traceback (most recent call last): File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/multiprocessing/process.py", line 297, in _bootstrap self.run() File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/multiprocessing/process.py", line 99, in run self._target(*self._args, **self._kwargs) File "/home/ubuntu/software/JANUS/mutate_parr.py", line 205, in calc_parr_prop props_collect[property_name][smile] = get_prop_material(smile, alphabet=alphabet, num_random_samples=num_random_samples, num_mutations=num_mutations) # TODO: TESTING File "/home/ubuntu/software/JANUS/mutate_parr.py", line 129, in get_prop_material mutated_smiles = [decoder(x) for x in mutated_sf] File "/home/ubuntu/software/JANUS/mutate_parr.py", line 129, in mutated_smiles = [decoder(x) for x in mutated_sf] File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/site-packages/selfies/decoder.py", line 59, in decoder rings=rings File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/site-packages/selfies/decoder.py", line 116, in _derive_mol_from_symbols init_state=binit_state, root_atom=prev_atom, rings=rings File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/site-packages/selfies/decoder.py", line 116, in _derive_mol_from_symbols init_state=binit_state, root_atom=prev_atom, rings=rings File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/site-packages/selfies/decoder.py", line 147, in _derive_mol_from_symbols _raise_decoder_error(selfies, symbol) File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/site-packages/selfies/decoder.py", line 179, in _raise_decoder_error raise DecoderError(err_msg) selfies.exceptions.DecoderError: invalid symbol '[Branch3_3]' SELFIES: [C][C][Branch1][#Branch2][C][=C][C][=Branch1][Ring2][=C][=Branch1][F][=N][C][=C][Branch2][Ring2][Branch1][N][Branch1][Branch2][C][=N][C][Ring1][=Branch1][=Ring1][=C][N][=C][C][=C][C][=C][Branch1][P][C][=Branch1][Ring2][=C][Ring1][=Branch1][C][Branch3_3][C][N][=C][C][=C][C][=Ring1][=Branch1][O][C][O] On generation 0/200 (Explr) Top Fitness: 1.0 (Explr) Top Smile: C=C1N=CC=C(N=CNc2ccc(N)cc2)N=C(C)[SH]1C Process Process-27: Traceback (most recent call last): File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/multiprocessing/process.py", line 297, in _bootstrap self.run() File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/multiprocessing/process.py", line 99, in run self._target(*self._args, **self._kwargs) File "/home/ubuntu/software/JANUS/mutate_parr.py", line 205, in calc_parr_prop props_collect[property_name][smile] = get_prop_material(smile, alphabet=alphabet, num_random_samples=num_random_samples, num_mutations=num_mutations) # TODO: TESTING File "/home/ubuntu/software/JANUS/mutate_parr.py", line 129, in get_prop_material mutated_smiles = [decoder(x) for x in mutated_sf] File "/home/ubuntu/software/JANUS/mutate_parr.py", line 129, in mutated_smiles = [decoder(x) for x in mutated_sf] File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/site-packages/selfies/decoder.py", line 59, in decoder rings=rings File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/site-packages/selfies/decoder.py", line 147, in _derive_mol_from_symbols _raise_decoder_error(selfies, symbol) File "/home/ubuntu/anaconda3/envs/reinvent.v3.2/lib/python3.7/site-packages/selfies/decoder.py", line 179, in _raise_decoder_error raise DecoderError(err_msg) selfies.exceptions.DecoderError: invalid symbol '[Branch3_2]' SELFIES: [C][O][=C][N][C][N][C][=Branch1][C][=O][N][Branch1][=Branch1][N+1][=Branch1][C][=O][O-1][C][Ring1][=Branch2][N][Ring1][N][O][C][=C][C][C][N][C][N][C][N][C][=C][C][=C][Branch1][C][F][C][Branch1][C][F][=C][Ring1][Branch2][=N][C][Branch1][C][C][Branch3_2][Branch1][=Branch1][C][Branch1][C][C][=O][S][Ring1][=Branch2][=C][C][=Ring1][#Branch1][N][C][N][C][C][=C][C][=C][C][=C][Ring1][=Branch1][C][N][=C][Branch1][=C][SH1][Branch1][C][C][C][=C][C][=C][C][=C][Ring1][=Branch1][=Branch1][C][=C][N][=C][C][=Ring1][#Branch2][C] Traceback (most recent call last): File "./JANUS.py", line 308, in mut_smi_dict_local = mut_smi_dict_local[population[top_idx]] KeyError: 'C=C1N=CC=C(N=CNc2ccc(N)cc2)N=C(C)[SH]1C'
Hi Janus team,
Very interesting algorithm. However, the algorithm seems to be stuck perhaps in only creating one kind of molecule for my starting data. I played with "81" as length max or "111" as max smiles length in example.py. Both options seem to be stuck in some kind of minima that it's spitting same molecule in RESULTS/generation_all_best.txt. Attached please find two generation_all_best.txt files, one from each filter. It keep generating same molecule at each generation.
With n=200 generations, I assumed we will have 200 different molecules. Can you please clarify what i should expect from the algorithm and what is the correct result file to look at? My results are below. 31 molecules generated so far with 81 length in example.py and 24 generated with 111 length in example.py. All look the same across generations and just seems to be long chains. Obviously, my starting structures are different from yours.
I have ~2400 molecules as starting structures and not sure what is the next step for me to be able to use JANUS. Should I use your starting structures and add mine to original 9999 structures to see better results?
Thanks so much,
JL
Email: [email protected]
Gen:0, CCCCCC=CCC=CCCCCCCCCN(CCCCCCCCC=CCC=CCCCCC)CCCNC(=O)c1cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)c1, 37.83329999999999
Gen:1, CCCCCC=CCC=CCCCCCCCCN(CCCCCCCCC=CCC=CCCCCC)CCCNC(=O)c1cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)c1, 37.83329999999999
Gen:2, CCCCCC=CCC=CCCCCCCCCN(CCCCCCCCC=CCC=CCCCCC)CCCNC(=O)c1cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)c1, 37.83329999999999
Gen:3, CCCCCC=CCC=CCCCCCCCCN(CCCCCCCCC=CCC=CCCCCC)CCCNC(=O)c1cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)c1, 37.83329999999999
Gen:4, CCCCCC=CCC=CCCCCCCCCN(CCCCCCCCC=CCC=CCCCCC)CCCNC(=O)c1cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)c1, 37.83329999999999
Gen:5, CCCCCC=CCC=CCCCCCCCCN(CCCCCCCCC=CCC=CCCCCC)CCCNC(=O)c1cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)c1, 37.83329999999999
Gen:6, CCCCCC=CCC=CCCCCCCCCN(CCCCCCCCC=CCC=CCCCCC)CCCNC(=O)c1cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)c1, 37.83329999999999
Gen:7, CCCCCC=CCC=CCCCCCCCCN(CCCCCCCCC=CCC=CCCCCC)CCCNC(=O)c1cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)c1, 37.83329999999999
Gen:8, CCCCCC=CCC=CCCCCCCCCN(CCCCCCCCC=CCC=CCCCCC)CCCNC(=O)c1cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)c1, 37.83329999999999
Gen:9, CCCCCC=CCC=CCCCCCCCCN(CCCCCCCCC=CCC=CCCCCC)CCCNC(=O)c1cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)c1, 37.83329999999999
Gen:10, CCCCCC=CCC=CCCCCCCCCN(CCCCCCCCC=CCC=CCCCCC)CCCNC(=O)c1cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)c1, 37.83329999999999
Gen:11, CCCCCC=CCC=CCCCCCCCCN(CCCCCCCCC=CCC=CCCCCC)CCCNC(=O)c1cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)c1, 37.83329999999999
Gen:12, CCCCCC=CCC=CCCCCCCCCN(CCCCCCCCC=CCC=CCCCCC)CCCNC(=O)c1cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)c1, 37.83329999999999
Gen:13, CCCCCC=CCC=CCCCCCCCCN(CCCCCCCCC=CCC=CCCCCC)CCCNC(=O)c1cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)c1, 37.83329999999999
Gen:14, CCCCCC=CCC=CCCCCCCCCN(CCCCCCCCC=CCC=CCCCCC)CCCNC(=O)c1cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)c1, 37.83329999999999
Gen:15, CCCCCC=CCC=CCCCCCCCCN(CCCCCCCCC=CCC=CCCCCC)CCCNC(=O)c1cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)c1, 37.83329999999999
Gen:16, CCCCCC=CCC=CCCCCCCCCN(CCCCCCCCC=CCC=CCCCCC)CCCNC(=O)c1cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)c1, 37.83329999999999
Gen:17, CCCCCC=CCC=CCCCCCCCCN(CCCCCCCCC=CCC=CCCCCC)CCCNC(=O)c1cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)c1, 37.83329999999999
Gen:18, CCCCCC=CCC=CCCCCCCCCN(CCCCCCCCC=CCC=CCCCCC)CCCNC(=O)c1cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)c1, 37.83329999999999
Gen:19, CCCCCC=CCC=CCCCCCCCCN(CCCCCCCCC=CCC=CCCCCC)CCCNC(=O)c1cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)c1, 37.83329999999999
Gen:20, CCCCCC=CCC=CCCCCCCCCN(CCCCCCCCC=CCC=CCCCCC)CCCNC(=O)c1cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)c1, 37.83329999999999
Gen:21, CCCCCC=CCC=CCCCCCCCCN(CCCCCCCCC=CCC=CCCCCC)CCCNC(=O)c1cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)c1, 37.83329999999999
Gen:22, CCCCCC=CCC=CCCCCCCCCN(CCCCCCCCC=CCC=CCCCCC)CCCNC(=O)c1cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)c1, 37.83329999999999
Gen:23, CCCCCC=CCC=CCCCCCCCCN(CCCCCCCCC=CCC=CCCCCC)CCCNC(=O)c1cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)c1, 37.83329999999999
Gen:24, CCCCCC=CCC=CCCCCCCCCN(CCCCCCCCC=CCC=CCCCCC)CCCNC(=O)c1cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)c1, 37.83329999999999
Gen:25, CCCCCC=CCC=CCCCCCCCCN(CCCCCCCCC=CCC=CCCCCC)CCCNC(=O)c1cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)c1, 37.83329999999999
Gen:26, CCCCCC=CCC=CCCCCCCCCN(CCCCCCCCC=CCC=CCCCCC)CCCNC(=O)c1cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)c1, 37.83329999999999
Gen:27, CCCCCC=CCC=CCCCCCCCCN(CCCCCCCCC=CCC=CCCCCC)CCCNC(=O)c1cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)c1, 37.83329999999999
Gen:28, CCCCCC=CCC=CCCCCCCCCN(CCCCCCCCC=CCC=CCCCCC)CCCNC(=O)c1cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)c1, 37.83329999999999
Gen:29, CCCCCC=CCC=CCCCCCCCCN(CCCCCCCCC=CCC=CCCCCC)CCCNC(=O)c1cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)c1, 37.83329999999999
Gen:30, CCCCCC=CCC=CCCCCCCCCN(CCCCCCCCC=CCC=CCCCCC)CCCNC(=O)c1cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)c1, 37.83329999999999
Gen:31, CCCCCC=CCC=CCCCCCCCCN(CCCCCCCCC=CCC=CCCCCC)CCCNC(=O)c1cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)c1, 37.83329999999999
Gen:0, CCCCCC=CCC=CCCCCCCCCN(CCCCCCCCC=CCC=CCCCCC)CCCNC(=O)c1cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)c1, 37.83329999999999
Gen:1, CCCCCC=CCC=CCCCCCCCCN(CCCCCCCCC=CCC=CCCCCC)CCCNC(=O)c1cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)c1, 37.83329999999999
Gen:2, CCCCCC=CCC=CCCCCCCCCN(CCCCCCCCC=CCC=CCCCCC)CCCNC(=O)c1cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)c1, 37.83329999999999
Gen:3, CCCCCC=CCC=CCCCCCCCCN(CCCCCCCCC=CCC=CCCCCC)CCCNC(=O)c1cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)cc(C(=O)NCCCN(CCCCCCCCC=CCC=CCCCCC)CCCCCCCCC=CCC=CCCCCC)c1, 37.83329999999999
Gen:4, CCCCCCCCCCCCCCCCC=CCCCCCCCCCCCCCC(CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC)CCSCCCCCCCCCC, 41.18149999999995
Gen:5, CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC=CCCCCCCCCCCCCCCCCCSSCCCCCCCCC, 41.97379999999993
Gen:6, CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC=CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 42.542899999999925
Gen:7, CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 43.15699999999991
Gen:8, CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 43.15699999999991
Gen:9, CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 43.15699999999991
Gen:10, CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 43.15699999999991
Gen:11, CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 43.15699999999991
Gen:12, CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 43.15699999999991
Gen:13, CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 43.15699999999991
Gen:14, CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCPSSCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 43.18139999999992
Gen:15, CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCSSSCCCCCCCCCCCC, 43.23609999999991
Gen:16, CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCSSSCCCCCCCCCCCC, 43.23609999999991
Gen:17, CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCSSSSCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCI, 43.519199999999906
Gen:18, CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCSSSSCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCI, 43.519199999999906
Gen:19, CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCSSSSCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCI, 43.519199999999906
Gen:20, CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCSSSSCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCI, 43.519199999999906
Gen:21, CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCSSSSCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCI, 43.519199999999906
Gen:22, CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCSSSSCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCI, 43.519199999999906
Gen:23, CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCSCCCCCCCSSSSSSCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCI, 43.5982999999999
Gen:24, CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCSSSSSSCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCI, 44.035399999999896
It looks like "aux" is a reserved word in Windows and directory of this name cannot be used. This is causing error, when I try to clone the repository.
Hello, great work! I'm excited to try this out for a chemical design project I'm working on. One question that I had after reading the pre-print— how sensitive is the model to molecule initialization?
I read that you can start JANUS with random molecules or provide it with defined molecules. Did you perform any tests on what happens if the best molecule's scaffold was ablated from the initial bank of molecules? And how much, if at all, does rational initialization improve over random molecular initialization? Does this relate back to being trapped in local minima, and would the choice of initialization help explore more chemical space?
Thank you!
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.