-
Notifications
You must be signed in to change notification settings - Fork 107
Relation extraction llama #522
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
205 commits
Select commit
Hold shift + click to select a range
b20e7c8
Added files.
vladd-bit eec6c59
Merge branch 'master' of https://github.com/CogStack/MedCAT into rela…
vladd-bit 56220aa
More additions to rel extraction.
vladd-bit 7ad88f5
Rel base.
vladd-bit 233ce36
Update.
vladd-bit 85a7015
Updates.
vladd-bit 5003548
Dependency parsing.
vladd-bit 541b47d
Updates.
vladd-bit c042b0d
Added pre-training steps.
vladd-bit 87d0c0c
Added training & model utils.
vladd-bit 4f42696
Cleanup & fixes.
vladd-bit 018d811
Update.
vladd-bit f3d3f44
Evaluation updates for pretraining.
vladd-bit e5f354e
Removed duplicate relation storage.
vladd-bit c69de67
Merged master.
vladd-bit 031d256
Moved RE model file location.
vladd-bit 2259a6b
Merge branch 'master' of https://github.com/CogStack/MedCAT into rela…
vladd-bit 1c469e9
Structure revisions.
vladd-bit 423b4e1
Added custom config for RE.
vladd-bit 8ae9abb
Implemented custom dataset loader for RE.
vladd-bit 186416c
More changes.
vladd-bit 451e33f
Small fix.
vladd-bit 8b36413
Latest additions to RelCAT (pipe + predictions)
vladd-bit 2fb8fc9
Setup.py fix.
vladd-bit 930dd11
RE utils update.
vladd-bit 24b2841
rel model update.
vladd-bit 193ecb1
rel dataset + tokenizer improvements.
vladd-bit 03111a7
RelCAT updates.
vladd-bit 7ab60f4
RelCAT saving/loading improvements.
vladd-bit 40875f3
RelCAT saving/loading improvements.
vladd-bit 810d1dc
RelCAT model fixes.
vladd-bit 11dcb32
Merge branch 'master' of https://github.com/CogStack/MedCAT into rela…
vladd-bit 72187f6
Attempted gpu learning fix. Dataset label generation fixes.
vladd-bit 5f67a4c
Minor train dataset gen fix.
vladd-bit cfc0e91
Minor train dataset gen fix No.2.
vladd-bit 9f4b220
Config updates.
vladd-bit 19afa81
Gpu support fixes. Added label stats.
vladd-bit 8eb1665
Evaluation stat fixes.
vladd-bit 6e86fa2
Cleaned stat output mode during training.
vladd-bit 5cee8cf
Build fix.
vladd-bit 223ac9a
removed unused dependencies and fixed code formatting
vladd-bit ea7d68c
Mypy compliance.
vladd-bit 1ea9738
Fixed linting.
vladd-bit 9f6609e
More Gpu mode train fixes.
vladd-bit 1782c0b
Merge branch 'master' of https://github.com/CogStack/MedCAT into rela…
vladd-bit fb86869
Fixed model saving/loading issues when using other baes models.
vladd-bit df21543
More fixes to stat evaluation. Added proper CAT integration of RelCAT.
vladd-bit 92a5e08
Merge branch 'master' of https://github.com/CogStack/MedCAT into rela…
vladd-bit 87d1a9c
Merge branch 'master' of https://github.com/CogStack/MedCAT into rela…
vladd-bit ced1627
Merge branch 'master' of https://github.com/CogStack/MedCAT into rela…
vladd-bit 7b69710
Merge branch 'master' of https://github.com/CogStack/MedCAT into rela…
vladd-bit 37fd212
Merge branch 'master' of https://github.com/CogStack/MedCAT into rela…
vladd-bit f0eda2b
Merge branch 'master' of https://github.com/CogStack/MedCAT into rela…
vladd-bit 10269b9
Setup.py typo fix.
vladd-bit b8a45b2
Merge branch 'relation_extraction' of https://github.com/CogStack/Med…
vladd-bit 20203ac
Merge branch 'master' of https://github.com/CogStack/MedCAT into rela…
vladd-bit f057139
RelCAT loading fix.
vladd-bit 197a27a
Merge branch 'master' of https://github.com/CogStack/MedCAT into rela…
vladd-bit 86fd509
RelCAT Config changes.
vladd-bit 79dc069
Type fix. Minor additions to RelCAT model.
vladd-bit 323c895
Merge branch 'master' of https://github.com/CogStack/MedCAT into rela…
vladd-bit f1c56bf
Type fixes.
vladd-bit a78ff86
Type corrections.
vladd-bit f09ceb2
RelCAT update.
vladd-bit 32574f2
Merge branch 'master' of https://github.com/CogStack/MedCAT into rela…
vladd-bit c081c3e
Merge branch 'master' of https://github.com/CogStack/MedCAT into rela…
vladd-bit e2e48b5
Merge branch 'master' of https://github.com/CogStack/MedCAT into rela…
vladd-bit 4ce5ba3
Type fixes.
vladd-bit 21c09ff
Merge branch 'relation_extraction' of https://github.com/CogStack/Med…
vladd-bit 8123689
Merge branch 'master' of https://github.com/CogStack/MedCAT into rela…
vladd-bit 57ab0c5
Fixed type issue.
vladd-bit 9da5aa6
RelCATConfig: added seed param.
vladd-bit 009e832
Adaptations to the new codebase + type fixes..
vladd-bit 1a7d130
Doc/type fixes.
vladd-bit 53dba6a
Merge branch 'master' of https://github.com/CogStack/MedCAT into rela…
vladd-bit 92613ed
Fixed input size issue for model.
vladd-bit a49a44a
Fixed issue(s) with model size and config.
vladd-bit 6456e6e
Merge branch 'master' of https://github.com/CogStack/MedCAT into rela…
vladd-bit 5aac9ab
RelCAT: updated configs to new style.
vladd-bit 9c50b30
RelCAT: removed old refs to logging.
vladd-bit b071607
Merge branches 'relation_extraction' and 'master' of https://github.c…
vladd-bit 89d9128
Merge branch 'master' of https://github.com/CogStack/MedCAT into rela…
vladd-bit e6e99cb
Fixed GPU training + added extra stat print for train set.
vladd-bit 307d194
Type fixes.
vladd-bit fb7efe3
Updated dev requirements.
vladd-bit c235daf
Linting.
vladd-bit fcdf2e3
Merge branches 'relation_extraction' and 'master' of https://github.c…
vladd-bit aad0a73
Fixed pin_memory issue when training on CPU.
vladd-bit 8a9026b
Merge branch 'master' of https://github.com/CogStack/MedCAT into rela…
vladd-bit f94e349
Updated RelCAT dataset get + default config.
vladd-bit 0770356
Updated RelDS generator + default config
vladd-bit bdf20f5
Linting.
vladd-bit f7b5aaf
Updated RelDatset + config.
vladd-bit 3e827cf
Merge branch 'relation_extraction' of https://github.com/CogStack/Med…
vladd-bit aaf6533
Pushing updates to model
shubham-s-agarwal 18f9bb8
Fixing formatting
shubham-s-agarwal 503513c
Update rel_dataset.py
shubham-s-agarwal 040821b
Update rel_dataset.py
shubham-s-agarwal ed7c8d5
Update rel_dataset.py
shubham-s-agarwal 8d0bfe4
RelCAT: added test resource files.
vladd-bit 3f3a780
RelCAT: Fixed model load/checkpointing.
vladd-bit 3f56824
RelCAT: updated to pipe spacy doc call.
vladd-bit b7a4987
RelCAT: added tests.
vladd-bit 77d27b0
Merge branch 'relation_extraction' of https://github.com/CogStack/Med…
vladd-bit a9258a2
Fixed lint/type issues & added rel tag to test DS.
vladd-bit 0ed70fb
Fixed ann id to token issue.
vladd-bit 8db2e76
RelCAT: updated test dataset + tests.
vladd-bit 6eea6b7
RelCAT: updates to requested changes + dataset improvements.
vladd-bit 6972310
RelCAT: updated docs/logs according to commends.
vladd-bit d03316c
Merge branch 'master' of https://github.com/CogStack/MedCAT into rela…
vladd-bit 8cb12a4
RelCAT: type fix.
vladd-bit d10318a
RelCAT: mct export dataset updates.
vladd-bit 12acaeb
RelCAT: test updates + requested changes p2.
vladd-bit 4c14a3a
Merge branch 'master' of https://github.com/CogStack/MedCAT into rela…
vladd-bit 382cefc
RelCAT: log for MCT export train.
vladd-bit 35b0913
Updated docs + split train_test & dataset for benchmarks.
vladd-bit d48bc41
type fixes.
vladd-bit 3068516
Merge branch 'master' of https://github.com/CogStack/MedCAT into rela…
vladd-bit 61f319c
Merge branch 'master' of https://github.com/CogStack/MedCAT into rela…
vladd-bit 8c26b1a
RelCAT: Initial Llama integration.
vladd-bit 553f94e
RelCAT: updates to Llama impl.
vladd-bit 4fc0eae
RelCAT: model typo fix.
vladd-bit 8b3052d
RelCAT: label_id /sample no. mixup fix.
vladd-bit ede9289
Updated cleaned up Relataset, added new ways to create relations via …
vladd-bit 8119973
Added option to predict any text /w annotations via RelCAT. MCT expor…
vladd-bit b593c76
Merge branch 'master' of https://github.com/CogStack/MedCAT into rela…
vladd-bit 7a56082
RelCAT: added sample limiter / class, more logging info.
vladd-bit 387f70a
RelCAT: test/train ds shuffle update.
vladd-bit 65a789e
RelCAT: added option to keep original text when using reldataset class.
vladd-bit bce266b
Pushing change for stratified batching
shubham-s-agarwal d9efe18
Merge branch 'master' of https://github.com/CogStack/MedCAT into rela…
vladd-bit 7942a80
Merge branch 'relation_extraction_llama' of https://github.com/CogSta…
vladd-bit a03c21d
RelCAT: fixed doc processing issue + class weights.
vladd-bit d3c6a42
Merge branch 'relation_extraction_llama' of https://github.com/CogSta…
vladd-bit 8ad07d4
Merge branch 'relation_extraction_llama' of https://github.com/CogSta…
vladd-bit f4bc853
RelCAT: class weights addtions to cfg + param.
vladd-bit fdd31a8
RelCAT: added config params for Adam optimizer.
vladd-bit 1246995
RelCAT updated default config.
vladd-bit 66e8069
RelCAT: config update + optimizer change.
vladd-bit 9238eeb
RelCAT: fixed model freeze flags.
vladd-bit 94097f2
RelCAT: model optimizer save/load fix.
vladd-bit ef32757
Merge branch 'master' of https://github.com/CogStack/MedCAT into rela…
vladd-bit 576839a
RelCAT: added export ent tag check.
vladd-bit 0269ee4
Fixed issues when saving/loading model for class weights + inference …
vladd-bit 1a4727b
RelCAT: bug fix for ents that are @ EoS.
vladd-bit c93afd8
Rel Dataset updates.
vladd-bit 8475011
Rel Dataset updates.
vladd-bit c33cf95
Merge branch 'master' of https://github.com/CogStack/MedCAT into rela…
vladd-bit 63662c2
Pushing change for ModernBERT
shubham-s-agarwal ef2f646
Merge branch 'master' of https://github.com/CogStack/MedCAT into rela…
vladd-bit e40dca2
Merge branch 'relation_extraction_llama' of https://github.com/CogSta…
vladd-bit bebe5bd
Bumped transformers version.
vladd-bit 6c1a9af
Updated rel dataset generation from fake Spacy Docs.
vladd-bit d71c624
ModernBert updates.
vladd-bit fe8737e
Updated RelCAT model-load/save.
vladd-bit 9268570
Merge branch 'master' of https://github.com/CogStack/MedCAT into rela…
vladd-bit 3dad478
Minor relCAT updates, code format.
vladd-bit ff0a9ca
Merge branch 'master' of https://github.com/CogStack/MedCAT into rela…
vladd-bit ed5924a
Type check updates.
vladd-bit c8d4aaa
Fixed inference issue.
vladd-bit 184feea
RelCAT: testing updates.
vladd-bit 23dbf35
Type fixes.
vladd-bit 8e787e6
Type fixes.
vladd-bit a0b4f0a
Type fixes.
vladd-bit fd9e2d6
Type fixes IV.
vladd-bit a7c0336
Type fixes python 3.9.
vladd-bit d58227b
RelCAT: flake8 fixes.
vladd-bit bec80eb
RelCAT: flake8 fixes.
vladd-bit c41e7e7
RelCAT: Updates (fixed model loading after save).
vladd-bit 4101851
Fixed test.
vladd-bit a491e14
Merge branch 'master' into relation_extraction_llama-MR-abstraction
mart-r 08975c0
Update RelCAT stuff for improved abstraction
mart-r 2b0cfb5
Move separate model implementations to separate packages
mart-r a399cd2
Some minor abstraction changes
mart-r afb4f74
Remove accidentally copied abstract method decorator
mart-r 8540a3e
Fix import in test
mart-r 4eed873
Fix RelCAT impport in pipe tests
mart-r 6db55a8
Merge branch 'master' into relation_extraction_llama-MR-abstraction
mart-r 255334d
Update base relcat model implementation to include config
mart-r 2d6b2f3
Latest RelCAT module updates.
vladd-bit 64a7a6a
Merge branch 'master' of https://github.com/CogStack/MedCAT into rela…
vladd-bit 2516447
Type fixes + run issues.
vladd-bit 7e9e452
Type fixes.
vladd-bit 3741086
Fixed Llama tokenizer.
vladd-bit 893e5b9
Type fixes.
vladd-bit 64b7602
Type fixes: Python3.10 adjustements.
vladd-bit e1b3bb0
Linting.
vladd-bit ca7b2b8
Fix base flake8 lint issues
mart-r cb68de1
Fix doc string in ConfigRelCAT.load
mart-r d19e11d
Fix base component init doc string
mart-r da61a75
Fixed BaseComponent.load method doc string
mart-r 441519c
Fix doc strings in rel_cat ml_utils
mart-r 9007fdb
Fix doc strings in rel_cat models module
mart-r fd5f5ed
Fix rel-cat test time import
mart-r 2b36753
Fix type casting
mart-r 9a54211
Align pipe tests with rel cat changes
mart-r f8b2d3e
Fix property paths in rel cat tests
mart-r dfda693
Updates.
vladd-bit 2f68169
Merge branch 'relation_extraction_llama' of https://github.com/CogSta…
vladd-bit 3cca0e2
Fixed tests.
vladd-bit 0f5e61b
Fixed relCAT config save.
vladd-bit 9cc52b4
Latest fixes for model saving/loading.
vladd-bit 05824f0
Lint fix.
vladd-bit a0c78d4
RelCAT cfg load test fix.
vladd-bit 579eb8b
Remove install requirements from gitignore
mart-r File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -55,3 +55,4 @@ tests/model_creator/output/* | |
docs/auto/ | ||
docs/_build | ||
|
||
models/ |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,6 @@ | ||
import os | ||
import logging | ||
from typing import Dict, Any, List | ||
from typing import Any, Dict, List, Tuple, Union, cast | ||
from medcat.config import MixingConfig, BaseModel, Optional | ||
|
||
|
||
|
@@ -21,10 +22,14 @@ class General(MixingConfig, BaseModel): | |
window_size: int = 300 | ||
"""Max acceptable dinstance between entities (in characters), care when using this as it can produce sentences that are over 512 tokens (limit is given by tokenizer)""" | ||
|
||
mct_export_max_non_rel_sample_size:int = 200 | ||
limit_samples_per_class: int = -1 | ||
"""Number of samples per class, this limit is applied for train samples, so if train samples are 100 then test would be 20.""" | ||
addl_rels_max_sample_size:int = 200 | ||
"""Limit the number of 'Other' samples selected for training/test. This is applied per encountered medcat project, sample_size/num_projects. """ | ||
mct_export_create_addl_rels: bool = False | ||
"""When processing relations from a MedCAT export, relations labeled as 'Other' are created from all the annotations pairs available""" | ||
create_addl_rels: bool = False | ||
"""When processing relations from a MedCAT export/docs, relations labeled as 'Other' are created from all the annotations pairs available""" | ||
create_addl_rels_by_type: bool = False | ||
"""When creating the 'Other' relation class, actually split this class into subclasses based on concept types""" | ||
|
||
tokenizer_name: str = "bert" | ||
"""The name of the tokenizer user. | ||
|
@@ -46,21 +51,47 @@ class General(MixingConfig, BaseModel): | |
"""Tokenizer. | ||
|
||
NB! For these changes to take effect, the pipe would need to be recreated.""" | ||
annotation_schema_tag_ids: List = [] | ||
annotation_schema_tag_ids: List = [30522, 30523, 30524, 30525] | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. can you add a comment line as to what these indices are, I assume they are the <s1>, <e1> , <s2>, <e2> tok ids? Actually looking at it, you've got the listed below, so probably fine tbh.. |
||
"""If a foreign non-MCAT trainer dataset is used, you can insert your own Rel entity token delimiters into the tokenizer, \ | ||
copy those token IDs here, and also resize your tokenizer embeddings and adjust the hidden_size of the model, this will depend on the number of tokens you introduce""" | ||
labels2idx: Dict = {} | ||
idx2labels: Dict = {} | ||
copy those token IDs here, and also resize your tokenizer embeddings and adjust the hidden_size of the model, this will depend on the number of tokens you introduce | ||
for example: 30522 - [s1], 30523 - [e1], 30524 - [s2], 30525 - [e2], 30526 - [BLANK], 30527 - [ENT1], 30528 - [ENT2], 30529 - [/ENT1], 30530 - [/ENT2] | ||
Please note that the tokenizer special tokens are supposed to be in pairs of two for example [s1] and [e1], [s2] and [e2], the [BLANK] is just an example placeholder token | ||
If you have more than four tokens here then you need to make sure they are present in the text, | ||
otherwise the pipeline will throw an error in the get_annotation_schema_tag() function. | ||
""" | ||
|
||
tokenizer_relation_annotation_special_tokens_tags: List[str] = ["[s1]", "[e1]", "[s2]", "[e2]"] | ||
|
||
tokenizer_other_special_tokens: Dict[str, str] = {"pad_token": "[PAD]"} | ||
""" | ||
The special tokens used by the tokenizer. The {PAD} is for Lllama tokenizer.""" | ||
|
||
labels2idx: Dict[str, int] = {} | ||
idx2labels: Dict[int, str] = {} | ||
|
||
pin_memory: bool = True | ||
"""If True the data loader will copy the tensors to the GPU pinned memory""" | ||
|
||
seed: int = 13 | ||
"""The seed for random number generation. | ||
|
||
NOTE: If used along MetaCAT or additional NER, only one of the seeds will take effect | ||
NB! For these changes to take effect, the pipe would need to be recreated.""" | ||
task: str = "train" | ||
"""The task for RelCAT. | ||
"""The task for RelCAT.""" | ||
|
||
NB! For these changes to take effect, the pipe would need to be recreated.""" | ||
language: str = "en" | ||
"""Used for Spacy lang setting""" | ||
|
||
@classmethod | ||
def convert_keys_to_int(cls, value): | ||
if isinstance(value, dict): | ||
return {int(k): v for k, v in value.items()} | ||
return value | ||
|
||
def __setattr__(self, key: str, value: Any): | ||
if key == "idx2labels" and isinstance(value, dict): | ||
value = self.convert_keys_to_int(value) # Ensure conversion | ||
super().__setattr__(key, value) | ||
|
||
|
||
class Model(MixingConfig, BaseModel): | ||
|
@@ -82,12 +113,18 @@ class Model(MixingConfig, BaseModel): | |
num_directions: int = 2 | ||
"""2 - bidirectional model, 1 - unidirectional""" | ||
|
||
freeze_layers: bool = True | ||
"""If we update the weights during training""" | ||
|
||
padding_idx: int = -1 | ||
emb_grad: bool = True | ||
"""If True the embeddings will also be trained""" | ||
ignore_cpos: bool = False | ||
"""If set to True center positions will be ignored when calculating representation""" | ||
|
||
llama_use_pooled_output: bool = False | ||
"""If set to True, used only in Llama model, it will add the extra tensor formed from selecting the max of the last hidden layer""" | ||
|
||
class Config: | ||
extra = 'allow' | ||
validate_assignment = True | ||
|
@@ -98,9 +135,24 @@ class Train(MixingConfig, BaseModel): | |
nclasses: int = 2 | ||
"""Number of classes that this model will output""" | ||
batch_size: int = 25 | ||
"""batch size""" | ||
nepochs: int = 1 | ||
"""Epochs""" | ||
lr: float = 1e-4 | ||
adam_epsilon: float = 1e-4 | ||
"""Learning rate""" | ||
stratified_batching: bool = False | ||
"""Train the model with stratified batching""" | ||
batching_samples_per_class: list = [] | ||
"""Number of samples per class in each batch | ||
example for batch size 64: [6,6,6,8,8,8,6,8,8]""" | ||
batching_minority_limit: Union[List[int], int] = 0 | ||
"""Maximum number of samples the minority class can have. | ||
Since the minority class elements need to be repeated, this is used to facilitate that | ||
example: batching_samples_per_class - [6,6,6,8,8,8,6,8,8] | ||
batching_minority_limit - 6""" | ||
adam_betas: Tuple[float, float] = (0.9, 0.999) | ||
adam_weight_decay: float = 0 | ||
adam_epsilon: float = 1e-8 | ||
test_size: float = 0.2 | ||
gradient_acc_steps: int = 1 | ||
multistep_milestones: List[int] = [ | ||
|
@@ -109,7 +161,8 @@ class Train(MixingConfig, BaseModel): | |
max_grad_norm: float = 1.0 | ||
shuffle_data: bool = True | ||
"""Used only during training, if set the dataset will be shuffled before train/test split""" | ||
class_weights: Optional[Any] = None | ||
class_weights: Union[List[float], None] = None | ||
enable_class_weights: bool = False | ||
score_average: str = "weighted" | ||
"""What to use for averaging F1/P/R across labels""" | ||
auto_save_model: bool = True | ||
|
@@ -129,3 +182,22 @@ class ConfigRelCAT(MixingConfig, BaseModel): | |
class Config: | ||
extra = 'allow' | ||
validate_assignment = True | ||
|
||
@classmethod | ||
def load(cls, load_path: str = "./") -> "ConfigRelCAT": | ||
This comment was marked as resolved.
Sorry, something went wrong. |
||
"""Load the config from a file. | ||
|
||
Args: | ||
load_path (str): Path to RelCAT config. Defaults to "./". | ||
|
||
Returns: | ||
ConfigRelCAT: The loaded config. | ||
""" | ||
config = cls() | ||
if os.path.exists(load_path): | ||
if "config.json" not in load_path: | ||
load_path = os.path.join(load_path, "config.json") | ||
config = cast(ConfigRelCAT, super().load(load_path)) | ||
logging.info("Loaded config.json") | ||
|
||
return config |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.