The Wolfram Emerging Leaders Program: High School (WELP:HS) is a remote, semester-long program designed for exceptional graduates from the Wolfram High School Summer Research Program to continue to develop their skills. Students work in a small group over the course of a semester to do either a research-based project or a product development–based project under the guidance of expert mentors. Projects are centered around a topic at the intersection of the group’s interests.
This essay was written by:
This essay was written by:
This study introduces the Protein Ligand Binding Affinity Prediction Using Pretrained Transformer Models (PLAPT) model, an innovative machine learning approach to predict protein-ligand binding affinities with high accuracy and generalizability, leveraging the wide knowledge of pretrained transformer models. By using ProtBERT and ChemBERTa for encoding protein and ligand sequences, respectively, we trained a two-branch dense neural network that effectively fuses these encodings to estimate binding affinity values. The PLAPT model not only achieves a high Pearson correlation coefficient of ~0.8, but also exhibits no overfitting, a remarkable feat in the context of computational affinity prediction. The robustness of PLAPT, attributed to its generalized transfer learning approach from pre-trained encoders, demonstrates the substantial potential of leveraging extant biochemical knowledge to enhance predictive models in drug discovery.
Introduction
The quantification of protein-ligand binding affinities is fundamental to the process of drug design and development. Accurate predictions of such affinities can significantly speed up the identification of therapeutic candidates, thus expediting the drug discovery pipeline. While experimental methods provide the most reliable measures of binding affinities, their high costs, substantial time requirements, and limited throughput have prompted a shift towards computational approaches. In recent years, advancements in machine learning (ML) have opened new avenues for high-throughput in silico prediction of protein-ligand binding affinities. This paper introduces a novel method, Protein Ligand Affinity using Pretrained Transformers (PLAPT), which harnesses the representational capabilities of pretrained transformer models, namely ProtBERT for proteins and ChemBERTa for ligands, to predict binding affinity values through a two-branch dense neural network.
What is Binding Affinity?
What is Binding Affinity?
Binding affinity, quantified by the dissociation constant in units like micromolar (μM) or nanomolar (nM), measures the strength of the interaction between a ligand and a protein . A lower indicates a stronger binding affinity, signifying a tighter ligand-protein interaction. The negative logarithm base 10 of the affinity, known as , is also commonly used, where a higher value indicates a stronger affinity. This is analogous to pH in acid-base chemistry and offers a more intuitive understanding of binding strength. Binding affinity is measured using techniques such as surface plasmon resonance (SPR), isothermal titration calorimetry (ITC), and fluorescence-based assays. Accurate prediction and measurement of binding affinity are crucial in drug development, facilitating the identification of potent drug candidates that effectively target specific proteins. This understanding is fundamental in biochemistry and pharmacology for developing targeted therapies.
K
d
K
d
p
K
d
p
K
d
Background and Related Work
Background and Related Work
Computational Methods for Predicting Protein-Ligand Binding Affinity
Computational Methods for Predicting Protein-Ligand Binding Affinity
Various computational methods have been developed for protein-ligand binding affinity prediction. Traditional approaches, such as molecular docking, employ heuristic algorithms to simulate the interaction between proteins and small molecules, generating plausible bound conformations and estimating their affinities . Molecular dynamics simulations provide a more nuanced perspective by considering the dynamic behavior of protein-ligand complexes over time, albeit with significant computational cost. Free energy perturbation methods offer a thermodynamically rigorous calculation of binding affinities but are hindered by their demand for extensive computational resources.
Machine Learning for Protein-Ligand Binding Affinity Prediction
Machine Learning for Protein-Ligand Binding Affinity Prediction
Prior to the adoption of deep learning techniques, several traditional ML algorithms have been used. Models such as Random Forests and Support Vector Machines capitalized on handcrafted features derived from protein and ligand properties to make predictions. Despite their successes, these methods were frequently limited by the quality and completeness of the feature sets used.
The advent of transformer models, such as BERT (Bidirectional Encoder Representations from Transformers), has revolutionized the field of natural language processing. ProtBERT and ChemBERTa have adapted this architecture to encode, respectively, the amino acid sequences of proteins and the molecular sequences of ligands. These models capture complex relationships within the sequence data by pre-training on vast corpuses, enabling nuanced and context-aware embeddings that serve as a rich source of features for downstream tasks.
The advent of transformer models, such as BERT (Bidirectional Encoder Representations from Transformers), has revolutionized the field of natural language processing. ProtBERT and ChemBERTa have adapted this architecture to encode, respectively, the amino acid sequences of proteins and the molecular sequences of ligands. These models capture complex relationships within the sequence data by pre-training on vast corpuses, enabling nuanced and context-aware embeddings that serve as a rich source of features for downstream tasks.
Examining Other ML Approaches
Examining Other ML Approaches
Other ML approaches have sought to advance protein-ligand binding affinity prediction by focusing on various facets of the protein-ligand interaction. CAPLA utilizes a deep learning architecture with a cross-attention mechanism to capture mutual effects, integrating features from both protein and ligand sequences. It emphasizes structure complementarity by learning from sequence-level information and employs interpretability techniques to identify key residues influencing binding affinity. DLSSAffinity, alternatively, combines the use of local structural information and global full-length protein sequences to account for both short-range direct and long-range indirect interactions, demonstrating strong performance against benchmark datasets. Similarly, OnionNet deploys a deep convolutional neural network, leveraging rotation-free element-pair contacts at varying distances to encapsulate both local and nonlocal interactions, thus aiming to enhance predictive robustness. These methods have each demonstrated improvements over existing baseline approaches in binding affinity prediction. PLAPT’s approach, however, integrates the generalizing strengths of ProtBERT and ChemBERTa to produce high quality encodings. The representations obtained from these pretrained transformer models will lead to further enhanced accuracy in affinity prediction when used to train a two-branch dense neural network.
Keywords
Keywords
◼
Transformer: a transformer model is a type of deep learning model that is highly scalable and versatile. Transformer models feature the self-attention mechanism as its core innovation, allowing the model to weight the significances of different parts of the data differently, which led to its excellence at processing sequential data and its widespread application in natural language understanding and generation.
◼
Bidirectional Encoder Representations from Transformers (BERT): A BERT model is distinguished for its ability to understand context of a token from both directions. Specific BERT models are pre-trained on large dataset and fine tuned for many natural language processing tasks like classifications and generations.
◼
Tokenizing: tokenizing refers to the process of breaking down a large input into smaller units (ex: one molecule, one amino acid), then transforming these units into a format that is suitable for processing by encoding algorithms.
◼
Encoding: encoding refers to the process of converting tokenized data into numerical formats, such as vectors, that machine learning models can understand and analyze.
◼
Embeddings: embeddings refers to the encoded vectors. Embeddings are mapped to proximate points at many dimensions in a vector space, preserving the semantic and relative context of the data in a numeric fashion.
◼
Normalizing: normalizing data involves adjusting the scale of data to a common range without distorting differences in the ranges of values. Normalizing data helps in standardizing the data, making it easier for algorithms to interpret and process
◼
Overfitting: Overfitting is a common issue in machine learning where a model learns the noises and random fluctuations in the training data. A model that is overfitting means it performs exceptionally well on the training data but has a significantly compromised ability to generalize new, unseen data.
◼
Mean Squared Error (MSE): a measure of the quality of an estimator, calculating the squared deviation between predicted value and actual value
Methodology
Methodology
In our methodology, we present a comprehensive approach to predicting the interaction affinity between proteins and ligands. Initially, we source encoded protein-ligand pairs with their corresponding affinity values from a dataset generated in python using ProtBERT and ChemBERT. We then prepare this data for training the neural network by concatenating embeddings and dividing the set into subsets for training and evaluation purposes.
For developing the model, we use a dual-branch neural network designed to process the embeddings of proteins and molecules. It is then trained on the GPU. For testing and usage, it is unnecessary to train a network and therefore we offer the option to import a pre-trained model to bypass the training process.
For model inference, we developed tokenizers for both protein sequences and molecular SMILES data. After importing the encoding models, we convert the normalized prediction outputs into actual affinity values. Our end-to-end inference mechanism seamlessly takes string inputs of proteins and molecule SMILES and returns their binding affinity, streamlining prediction.
For developing the model, we use a dual-branch neural network designed to process the embeddings of proteins and molecules. It is then trained on the GPU. For testing and usage, it is unnecessary to train a network and therefore we offer the option to import a pre-trained model to bypass the training process.
For model inference, we developed tokenizers for both protein sequences and molecular SMILES data. After importing the encoding models, we convert the normalized prediction outputs into actual affinity values. Our end-to-end inference mechanism seamlessly takes string inputs of proteins and molecule SMILES and returns their binding affinity, streamlining prediction.
Figure 1: Architectural Diagram of the Predictive Model for Protein-Ligand Binding Affinity. The model inputs include a protein amino acid chain and a molecular SMILES string, which undergo tokenization before being processed by ProtBERT and ChemBERTa for generating vector representations of protein and ligand structures, respectively. These vectors are subsequently merged and input into a branching neural network comprising several linear layers. The network concludes with a fully connected layer that outputs the predicted binding affinity, quantifying the interaction strength between the protein and ligand.
Data
Data
The dataset we used is an open source binding affinity dataset with 1.9m entries from huggingface (jglaser). However, due to its size and our limited computer power, we decided to use only a sample of only 100k data-points. Additionally, due to the computational load of running the encoders on so much data, we did the encoding process separately in python, with the code available on our Github. Therefore, the dataset used for training is already encoded.
Import Embeddings
Import Embeddings
Import the raw data
Important: Due to the large size of our dataset, if you wish to train PLAPT yourself, you must either download the dataset from our Google Drive, or run the encoding yourself using our python notebook “encoding.ipynb” available on our Github. After you have downloaded the dataset, make sure it appears in your Documents folder. Its path should look like: “../Documents/WELP-PLAPT/data/*tensor_dataset100k.json”
In[]:=
dataRaw=Import[FileNameJoin[{$UserDocumentsDirectory,"WELP-PLAPT","data","tensor_dataset100k.json"}]];dataRaw=Association@@#&/@dataRaw;
Convert the data to a dataset for ease of use.
In[]:=
data=Dataset[dataRaw];
An example of the data: containing embeddings representing the protein (amino acid) sequence, and embeddings representing the molecule sequence, and their corresponding normalized affinity.
In[]:=
data[[1]]
Out[]=
Prepare Data For Training
Prepare Data For Training
Concatenating the protein and molecule embeddings together for training (see Fig. 1)
In[]:=
data=(Append[#,"concat_embeddings"->Join[#["prot_embeddings"],#["mol_embeddings"]]])&/@data;
In[]:=
data[[1]]
Out[]=
90% of the data will be used for training
In[]:=
train=RandomSample[data,Length[data]*0.9];Length@train
Out[]=
90000
the other 10% of data will be used as testing data (validation set)
In[]:=
test=Complement[data,train];Length@test
Out[]=
10000
Split data into inputs and outputs for training. Inputs are the concatenated embeddings and outputs are the affinity values (see Fig. 1).
In[]:=
trainInputs=Normal@train[All,"concat_embeddings"];trainOutputs=Normal@train[All,"affinity"];
In[]:=
testInputs=Normal@test[All,"concat_embeddings"];testOutputs=Normal@test[All,"affinity"];
Training
Training
An in-depth look at how we trained PLAPT. For those hoping only to use our model, see the section for importing our already trained model.
Initialize Neural Network
Initialize Neural Network
Constructing our branching neural network architecture. It contains a protein branch and a molecule branch, which are then concatenated, normalized, and pass through further linear layers and dropout for regularization (see Fig. 1).
In[]:=
net=NetGraph[{"ProtOnly"->PartLayer[1;;1024],"MolOnly"->PartLayer[1025;;1792],"ProtLinear"->LinearLayer[512],"ProtRamp"->Ramp,"MolLinear"->LinearLayer[512],"MolRamp"->Ramp,"Combined"->(*ThreadingLayer[Plus]*)CatenateLayer[],"Normalize"->BatchNormalizationLayer[],"Linear1"->LinearLayer[512],"Ramp1"->Ramp,"Dropout1"->DropoutLayer[0.2],"Linear2"->LinearLayer[64],"Ramp2"->Ramp,"FinalLinear"->LinearLayer[1]},{NetPort["Input"]->"ProtOnly"->"ProtLinear"->"ProtRamp",NetPort["Input"]->"MolOnly"->"MolLinear"->"MolRamp",{"ProtRamp","MolRamp"}->"Combined"->"Normalize"->"Linear1"->"Ramp1"->"Dropout1"->"Linear2"->"Ramp2"->"FinalLinear"->NetPort["Output"]},"Input"->1792,"Output"->"Scalar"];net=NetInitialize[net]
Out[]=
NetGraph
Train Neural Network
Train Neural Network
Our training protocol uses NetTrain with a batch size of 32 and a maximum of 60 training rounds. We use MSE as the loss function, suitable for regression tasks. Separate datasets for training and validation ensure effective model evaluation. Training is done on GPU.
In[]:=
TrainingProtocol[net_,trainInputs_,trainOutputs_,testInputs_,testOutputs_]:=NetTrain[ net, <|"Input"->trainInputs,"Output"->trainOutputs|>, LossFunction->MeanSquaredLossLayer[], BatchSize->32, MaxTrainingRounds->60, ValidationSet-><|"Input"->testInputs,"Output"->testOutputs|>, TrainingProgressReporting->"Panel", WorkingPrecision"Real32", TargetDevice"GPU"]
Train the neural network using our protocol.
Export trained model
Export trained model
Exporting the model to onnx format, a widely used trans-platform representation for neural networks
Storing the trained network into plapt.
Import the Trained PLAPT Model
Import the Trained PLAPT Model
As training takes a significant amount of time, we recommend directly importing the trained model.
Model Inference
Model Inference
In order for PLAPT to be used in the real world, it must be easy to access the model. Here we define functions for the entire end-to-end process of affinity prediction.
Tokenization
Tokenization
We implement Byte Pair Encoding (BPE) tokenizers that convert protein sequences (strings of amino acid letters) and molecule sequences (strings of molecules) into lists of integers suitable for use in encoders.
Protein Tokenizer
Protein Tokenizer
Defining the vocabulary of the protein tokenizer. An association that maps each amino acid letter to a unique integer. Unusual amino acids are given a special token.
Example tokens converted with proteinTokenVocabulary
Tokenizer function for single string tokenization. Outputs a list of integers based on the given string. The amino acids in the protein can be space separated or not.
Batched tokenization implementation for use in ProtBERT. Outputs an association with tokens, type ids, and an attention mask, necessary for transformer models. Additionally, all token lists will be padded or truncated such that their length equals the given length value.
Molecule Tokenizer
Molecule Tokenizer
The molecule SMILES tokenizer is significantly more complex than the protein one. It is based on the SmilesTokenizer from the DeepChem library. We used their vocabulary and merge lists, which can be found in their Github.
Import the merges. The merges file contains a list of pairs, ordered with descending priority, which describe how adjacent tokens should be combined.
Implementation of merging algorithm. Iteratively applies merges in descending priority based on the merge rules.
An example running the merging algorithm.
Single SMILES string tokenization function that applies the merging algorithm then subsequent byte pair encoding using the vocabulary association.
Batched tokenization for SMILES data. Outputs an association with tokens and an attention mask, necessary for transformer models. Additionally, all token lists will be padded or truncated such that their length equals the given length value.
Import Encoders
Import Encoders
The encoders we are using are ProtBERT and ChemBERTa, which we got from huggingface. These models are used to gain high quality vector-space representations of proteins and ligands before feeding them into our branching neural network (see Fig. 1).
Protein Encoder: https://huggingface.co/Rostlab/prot_bert
Molecule Encoder: https://huggingface.co/seyonec/ChemBERTa-zinc-base-v1
Important: Due to the large size of the encoders, if you wish to run them yourself, you must either download them from our Google Drive, or import them from huggingface using our python notebook “encoders_to_onnx.ipynb” on our Github. After you have downloaded them, make sure they appear in your Documents folder. The path should look like: “../Documents/WELP-PLAPT/models/*_encoder.onnx”. If you ran the python notebook, they should automatically appear in the right folder.
Protein Encoder: https://huggingface.co/Rostlab/prot_bert
Molecule Encoder: https://huggingface.co/seyonec/ChemBERTa-zinc-base-v1
Important: Due to the large size of the encoders, if you wish to run them yourself, you must either download them from our Google Drive, or import them from huggingface using our python notebook “encoders_to_onnx.ipynb” on our Github. After you have downloaded them, make sure they appear in your Documents folder. The path should look like: “../Documents/WELP-PLAPT/models/*_encoder.onnx”. If you ran the python notebook, they should automatically appear in the right folder.
Importing the protein encoder
Importing the molecule encoder
Inverse Normalization
Inverse Normalization
The outputs from PLAPT are normalized by default and must go through inverse normalization before being able to be used for affinity prediction. The normalization scaling parameters are defined below. De-normalizing outputs simply involves applying the inverse of the normalization function using the following parameters
Implementation of our inverse normalization function.
Inference
Inference
Function for full end-to-end protein-ligand affinity prediction, as outlined in Figure 1.
Outputs the negative log base 10 affinity value as well as the dissociation/inhibition constant in micro molars.
Batched inference.
Function for running PLAPT on wolfram molecule and protein entities.
Results
Analysis
Analysis
Results
Results
Figure 2: Correlation between the predicted and experimental pKa values for the PLAPT model, showcasing results for the training data (left) and test data (right). The dashed line indicates perfect prediction accuracy.
Based on Table 1, PLAPT exhibits very impressive generalization, essentially entirely eliminating overfitting, evidenced by the congruence of the Pearson correlation coefficients, approximately 0.8, across both training and test datasets. This level of performance consistency contrasts sharply with models such as OnionNet and , which demonstrate substantial overfitting (See Figure 3 and Figure 4). Our model’s stability is further supported by the minimal discrepancy between MSE and RMSE across the training and testing datasets (Table 1).
We attribute the robustness of PLAPT to its use of pretrained encoders—specifically ProtBERT and ChemBERTa—leveraged to abstract protein and molecule representations. These encoders were trained unsupervised on extensive datasets, meaning they contain transferable generalized understanding of the biochemical domain to PLAPT, mitigating the overfitting commonly encountered in models trained de novo on niche datasets.
In Figure 2, the data points’ proximity to the line of perfect prediction across both data sets further validates the model’s predictive reliability. The PLAPT model’s fidelity in its predictive performance, as demonstrated in these results, positions it as a substantial advancement in the field of computational affinity prediction.
We attribute the robustness of PLAPT to its use of pretrained encoders—specifically ProtBERT and ChemBERTa—leveraged to abstract protein and molecule representations. These encoders were trained unsupervised on extensive datasets, meaning they contain transferable generalized understanding of the biochemical domain to PLAPT, mitigating the overfitting commonly encountered in models trained de novo on niche datasets.
In Figure 2, the data points’ proximity to the line of perfect prediction across both data sets further validates the model’s predictive reliability. The PLAPT model’s fidelity in its predictive performance, as demonstrated in these results, positions it as a substantial advancement in the field of computational affinity prediction.
Figure 4: OnionNet-2 predicted pKa with respect to experimentally determined pKa on (a) training set (b). (Zechen et al.)
As seen in Figure 3 and Figure 4, the Random Forest model and OnionNet-2 exhibit strong performance discrepancies between training and validation datasets, indicative of overfitting. Our PLAPT model, through the use of pre-trained encoders, achieves almost identically distributed predictions, indicating a high degree of generalization and no overfitting.
Real World Example
Real World Example
Test out PLAPT on a novel protein-ligand pair.
Visualization
A test molecule
Predict the binding affinity
Conclusion and Future Work
Conclusion and Future Work
We have successfully demonstrated that the incorporation of pre-trained encoders is a viable strategy for mitigating overfitting in the domain of protein-ligand binding affinity prediction. This novel approach leverages the extensive knowledge already captured by models such as ProtBERT and ChemBERTa, which are pre-trained on large, unlabelled biochemical datasets. By using these encoders, PLAPT gains the ability to generalize across diverse datasets, which is of paramount importance in computational drug discovery, where the ability to accurately predict across a wide range of potential compounds is critical.
While the performance of PLAPT is on-par with current state-of-the-art methods, it is the means by which this performance is achieved that sets our approach apart. The model’s incorporation of pre-existing, extensive biochemical knowledge from the underlying encoders reduces its susceptibility to overfitting—a significant advancement.
While the performance of PLAPT is on-par with current state-of-the-art methods, it is the means by which this performance is achieved that sets our approach apart. The model’s incorporation of pre-existing, extensive biochemical knowledge from the underlying encoders reduces its susceptibility to overfitting—a significant advancement.
Further Work
Further Work
In pursuit of enhancing the accuracy of our model while preserving its generalization capabilities, we propose two main avenues for further research. First, the aggregation of a more extensive dataset would provide a broader chemical space for the model to learn from, potentially refining its predictive accuracy. Second, the integration of a self-attention mechanism within the primary predictor could allow for more nuanced interpretation of the interplay between protein and ligand features.
The self-attention mechanism, particularly, could enable the model to dynamically weigh the importance of different parts of the input data, potentially leading to more precise affinity predictions. We hypothesize that this addition, in concert with the robust foundation provided by the pre-trained encoders, will sustain the model' s generalization strength.
The self-attention mechanism, particularly, could enable the model to dynamically weigh the importance of different parts of the input data, potentially leading to more precise affinity predictions. We hypothesize that this addition, in concert with the robust foundation provided by the pre-trained encoders, will sustain the model' s generalization strength.
Acknowledgements
Acknowledgements
We would like to extend our heartfelt thanks to our mentor, Nicolo Monti, for his insightful guidance throughout the project. Additionally, our gratitude goes to the entire WELP staff and the WELP program for granting us the opportunity to undertake this project, which has been an enriching exploration in the field of machine learning.
References
References
1
.Chithrananda, S., Grand, G., & Ramsundar, B. (2020). ChemBERTa: Large-Scale Self-Supervised Pretraining for Molecular Property Prediction. Retrieved from https://arxiv.org/abs/2010.09885
2
.database, Pdb.-C. (n.d.). Welcome to pdbbind-CN database. Retrieved December 16, 2023, from http://pdbbind.org.cn/index.php
3
.Elnaggar, A., Heinzinger, M., Dallago, C., Rehawi, G., Wang, Y., Jones, L., Gibbs, T., Feher, T., Angerer, C., Steinegger, M., Bhowmik, D., & Rost, B. (2021). ProtTrans: Towards Cracking the Language of Life’s Code Through Self-Supervised Learning. bioRxiv. https://www.biorxiv.org/content/10.1101/2020.07.12.199554v3
4
.Huisi L; Minyi S; Hai-Xia L; Renxiao Wang; (2022). Public Data Set of Protein–Ligand Dissociation Kinetic Constants for Quantitative Structure–Kinetics Relationship Studies. Retrieved from https://pubs.acs.org/doi/10.1021/acsomega.2c02156
5
.Jglaser/binding_affinity · datasets at hugging face. (n.d.). jglaser/binding_affinity · Datasets at Hugging Face. Retrieved December 16, 2023, from https://huggingface.co/datasets/jglaser/binding_affinity/viewer/default/train
6
.Jin Z;Wu T;Chen T;Pan D;Wang X;Xie J;Quan L;Lyu Q; (n.d.). CAPLA: Improved prediction of protein-ligand binding affinity by a deep learning approach based on a cross-attention mechanism. Bioinformatics (Oxford, England). U.S. National Library of Medicine. Retrieved December 16, 2023, from https://pubmed.ncbi.nlm.nih.gov/36688724/
7
.Liangzhen Zheng, Jingrong Fan, and Yuguang Mu. OnionNet: A multiple-layer intermolecular-contact...-ACS publications. Retrieved December 17, 2023, from https://pubs.acs.org/doi/10.1021/acsomega.9b01997
8
.Wang H;Liu H;Ning S;Zeng C;Zhao Y; (n.d.). DLSSAffinity: Protein-ligand binding affinity prediction via a deep learning model. Physical chemistry chemical physics : PCCP. U.S. National Library of Medicine. Retrieved December 16, 2023, from https://pubmed.ncbi.nlm.nih.gov/35416807/
9
.Zhenglz. (n.d.). Zhenglz/onionnet: A multiple-layer inter-molecular contact features based deep neural network for protein-ligand binding affinity prediction. GitHub. Retrieved December 16, 2023, from https://github.com/zhenglz/onionnet/
Appendix
Appendix
All our code can be found on our Github repository: https://github.com/trrt-good/WELP-PLAPT
All our data and models can be found on our Google Drive: https://drive.google.com/drive/folders/1e-ujgHx5bW0JKxSZY5u34As77o4-IIFs?usp=sharing
CITE THIS NOTEBOOK
CITE THIS NOTEBOOK
PLAPT: Protein - Ligand Binding Affinity Prediction Using Pretrained Transformer Models
by Wolfram Emerging Leaders Program
Wolfram Community, STAFF PICKS, January 2, 2024
https://community.wolfram.com/groups/-/m/t/3094670
by Wolfram Emerging Leaders Program
Wolfram Community, STAFF PICKS, January 2, 2024
https://community.wolfram.com/groups/-/m/t/3094670
