Skip to content

EhsanBitaraf/triple-a

triple-a

Article Analysis Assistant

Triple-A is a tool that can be used to create a repository of scientific articles and perform a series of citation graph analysis, bibilometric analysis, and automatic data extraction processes on this repository.

This program somehow creates a network of article references and provides a connection between authors and keywords, these things are usually called "Citation Graph".

There are various software and online systems for this, a brief review of which can be found here.

This tool gives you the power to create a graph of articles and analyze it. This tool is designed as a CLI (command-line interface) and you can use it as a Python library.

made-with-python License

commits GitHub Last commit Open Issue

Repo Size GitHub code size in bytes Downloads

GitHub tag Release Release

PyPI version PyPI - Python Version

Build and push images

Testing

Code Quality

🎮 Main Features

  • Creating a repository for a domain of articles (based on search strategy)
  • Citation Graph Analysis
  • Bibliometric Analysis
  • Create RAG (Retrieval-Augmented Generation) for a domain of articles
  • Single paper analysis
  • Network Analysis (Per Node/Overall Graph)
  • Import bibliography file

How to use

From Source

Setup

Clone repository:

git clone https://github.com/EhsanBitaraf/triple-a.git

or

git clone git@github.com:EhsanBitaraf/triple-a.git

Create environment variable:

python -m venv venv

Activate environment variable:

Windows

$ .\venv\Scripts\activate

Linux

$ source venv/bin/activate

Install poetry:

pip install poetry

Instal dependences:

poetry install

run cli:

poetry run python triplea/cli/aaa.py 

Functional Use

get list of PMID in state 0

term = '("Electronic Health Records"[Mesh]) AND ("National"[Title/Abstract]) AND Iran'
get_article_list_all_store_to_kg_rep(term)

move from state 1

move_state_forward(1)

get list of PMID in state 0 and save to file for debugginf use

    data = get_article_list_from_pubmed(1, 10,'("Electronic Health Records"[Mesh]) AND ("National"[Title/Abstract])')
    data = get_article_list_from_pubmed(1, 10,'"Electronic Health Records"')
    data1= json.dumps(data, indent=4)
    with open("sample1.json", "w") as outfile:
        outfile.write(data1)

open before file for debugging use

    f = open('sample1.json')
    data = json.load(f)
    f.close()

get one article from kg and save to file

    data = get_article_by_pmid('32434767')
    data= json.dumps(data, indent=4)
    with open("one-article.json", "w") as outfile:
        outfile.write(data)

Save Title for Annotation

    file =  open("article-title.txt", "w", encoding="utf-8")
    la = get_article_by_state(2)
    for a in la:
        try:
            article = Article(**a.copy())
        except:
            pass
        file.write(article.Title  + "\n")

Training NER for Article Title

You can use NLP(Natural Language Processing) methods to extract information from the structure of the article and add it to your graph. For example, you can extract NER(Named-entity recognition) words from the title of the article and add to the graph. Here's how to create a custom NER.

Command Line (CLI) Use

By using the following command, you can see the command completion help. Each command has a separate help.

python .\triplea\cli\aaa.py  --help

output:

Get and Save list of article identifier base on search term

Get list of article identifier like PMID base on search term and save into knowledge repository in first state (0):

use this command:

python .\triplea\cli\aaa.py search --searchterm [searchterm]

Even the PMID itself can be used in the search term.

python .\triplea\cli\aaa.py search --searchterm 36467335

output:

Move core pipeline state

The preparation of the article for extracting the graph has different steps that are placed in a pipeline. Each step is identified by a number in the state value. The following table describes the state number:

List of state number

State Short Description Description
0 article identifier saved At this stage, the article object stored in the data bank has only one identifier, such as the PMID or DOI identifier
1 article details article info saved (json Form) Metadata related to the article is stored in the OriginalArticle field from the SourceBank, but it has not been parsed yet
2 parse details info The contents of the OriginalArticle field are parsed and placed in the fields of the Article object.
3 Get Citation
4 Get Full Text At this stage, the articles that are open access and it is possible to get their full text are taken and added to the bank
5 Convert full text to string
-1 Error if error happend in move state 1 to 2
-2 Error if error happend in move state 2 to 3

There are two ways to run a pipeline. In the first method, we give the number of the existing state and all the articles in this state move forward one state. In another method, we give the final state number and each article under that state starts to move until it reaches the final state number that we specified. The first can be executed with the next command and the second with the go command.

With this command move from current state to the next state

python .\triplea\cli\aaa.py next --state [current state]

for example move all article in state 0 to 1:

python .\triplea\cli\aaa.py next --state 0

output:

go command:

python .\triplea\cli\aaa.py go --end [last state]
python .\triplea\cli\aaa.py go --end 3

output:

Run custom pipeline

Apart from the core pipelines that should be used to prepare articles, customized pipelines can also be used. Custom pipelines may be implemented to extract knowledge from texts and NLP processing. These pipelines themselves can form a new graph other than the citation graph or in combination with it.

List of Custom Pipeline

Action Tag Name Description Prerequisite
Triple extraction from article abstract FlagExtractKG At least core state 2
Topic extraction from article abstract FlagExtractTopic At least core state 2
Convert Affiliation text to structural data FlagAffiliationMining This is simple way for parse Affiliation text At least core state 2
Convert Affiliation text to structural data FlagAffiliationMining_Titipata use Titipat Achakulvisut Repo for parsing Affiliation text At least core state 2
Text embedding abstract and send to SciGenius FlagEmbedding At least core state 2
Title and Abstract Review by LLM FlagShortReviewByLLM At least core state 2
NER Article Title

You can try the NER method to extract the major topic of the article's title by using the following command. This command is independent and is used for testing and is not stored in the Arepo.

python .\triplea\cli\ner.py --title "The Iranian Integrated Care Electronic Health Record."
Country-based Co-authorship

A country-based co-authorship network refers to a network of collaborative relationships between researchers from different countries who have co-authored academic papers together. It represents the connections and collaborations that exist among researchers across national boundaries.

By studying a country-based co-authorship network, researchers can gain insights into international collaborations, identify emerging research trends, foster interdisciplinary cooperation, and facilitate policy decisions related to research funding, academic mobility, and scientific development at a global scale.

There are several software tools available that can help you produce country-based co-authorship networks. Here are a few popular options:

VOSviewer: VOSviewer is a widely used software tool for constructing and visualizing co-authorship networks. It offers various clustering and visualization techniques and allows you to analyze and explore the network based on different attributes, including country affiliation.

Sci2 Tool: The Science of Science (Sci2) Tool is a Java-based software package (in GitHub) that supports the analysis and visualization of scientific networks. It offers a variety of functionalities for constructing and analyzing co-authorship networks, including country-based analysis. It allows users to perform data preprocessing, network analysis, and visualization within a single integrated environment.

To convert affiliation into a hierarchical structure of country, city and centers, you can use the following command:

python .\triplea\cli\aaa.py pipeline -n FlagAffiliationMining
Extract Triple from Abstract
python .\triplea\cli\aaa.py pipeline --name FlagExtractKG
Extract Topic from Abstract
python .\triplea\cli\aaa.py pipeline --name FlagExtractTopic

An example of working with the functions of this part using Jupyter is given in here. which is finally drawn using VOSviewer program as below:

Import Data

Import Single Reference File

Import file type is .bib , .enw , .ris

python .\triplea\cli\importbib.py "C:\...\bc.ris"

output:

Import Triplea Format
python .\triplea\cli\aaa.py import --help
python .\triplea\cli\aaa.py import --type triplea --format json --bar True "C:\BibliometricAnalysis.json"

Export Data

Various data export can be created from the article repository. These outputs are used to create raw datasets.

Type Format
triplea json, csv , csvs
rayyan csv
RefMan* ris
  • It has not yet been implemented.

For guidance from the export command, you can act like this:

python .\triplea\cli\aaa.py export --help

For Example :

The export is limited to 100 samples, and the resulting exported articles are saved in the file Triple Json format named "test_export.json".

python .\triplea\cli\aaa.py export --type triplea --format json --limit 100 --output "test_export.json"
python .\triplea\cli\aaa.py export --type triplea --format json --output "test_export.json"

Export Triplea CSV format:

python .\triplea\cli\aaa.py export --type triplea --format csv --output "test_export.csv"
python .\triplea\cli\aaa.py export --type triplea --format csvs --output "export.csv"

Export for Rayyan CSV format:

python .\triplea\cli\aaa.py export --type rayyan --format csv --output "test_export.csv"

Export Graph

for details information:

python .\triplea\cli\aaa.py export_graph --help

Making a graph with the graphml format and saving it in a file test.graphml

python .\triplea\cli\aaa.py export_graph -g gen-all -f graphml -o .\triplea\test

Making a graph with the gexf format and saving it in a file C:\Users\Dr bitaraf\Documents\graph\article.gexf.This graph contains article, author, affiliation and relation between them:

python .\triplea\cli\aaa.py export_graph -g article-author-affiliation -f gexf -o "C:\Users\Dr bitaraf\Documents\graph\article"

Making a graph with the graphdict format and saving it in a file C:\Users\Dr bitaraf\Documents\graph\article.json.This graph contains article, Reference, article cite and relation between them:

python .\triplea\cli\aaa.py export_graph -g article-reference -g article-cited -f graphdict -o "C:\Users\Dr bitaraf\Documents\graph\article.json"

Making a graph with the graphml format and saving it in a file C:\graph-repo\country-authorship.jgraphmlson.This graph contains article, country, and relation between them:

python .\triplea\cli\aaa.py export_graph -g country-authorship -f graphml -o "C:\graph-repo\country-authorship"

Types of graph generators that can be used in the -g parameter:

Name Description
store It considers all the nodes and edges that are stored in the database
gen-all It considers all possible nodes and edges
article-topic It considers article and topic as nodes and edges between them
article-author-affiliation It considers article, author and affiliation as nodes and edges between them
article-keyword It considers article and keyword as nodes and edges between them
article-reference It considers article and reference as nodes and edges between them
article-cited It considers article and cited as nodes and edges between them
country-authorship

Types of graph file format that can be used in the -f parameter:

Name Description
graphdict This format is a customized format for citation graphs in the form of a Python dictionary.
graphjson
gson
gpickle Write graph in Python pickle format. Pickles are a serialized byte stream of a Python object
graphml The GraphML file format uses .graphml extension and is XML structured. It supports attributes for nodes and edges, hierarchical graphs and benefits from a flexible architecture.
gexf GEXF (Graph Exchange XML Format) is an XML-based file format for storing a single undirected or directed graph.

Visualizing Graph

Several visualizator are used to display graphs in this program. These include:

Alchemy.js : Alchemy.js is a graph drawing application built almost entirely in d3.

interactivegaraph : InteractiveGraph provides a web-based interactive visualization and analysis framework for large graph data, which may come from a GSON file

netwulf : Interactive visualization of networks based on Ulf Aslak's d3 web app.

python .\triplea\cli\aaa.py visualize -g article-reference -g article-cited -p 8001
python .\triplea\cli\aaa.py visualize -g gen-all -p 8001

output:

python .\triplea\cli\aaa.py visualize -g article-topic -g article-keyword -p 8001

output:

Visulaize File

A file related to the extracted graph can be visualized in different formats with the following command:

python .\triplea\cli\aaa.py visualize_file --format graphdict "graph.json"

Analysis Graph

analysis info command calculates specific metrics for the entire graph. These metrics include the following:

  • Graph Type:
  • SCC:
  • WCC:
  • Reciprocity :
  • Graph Nodes:
  • Graph Edges:
  • Graph Average Degree :
  • Graph Density :
  • Graph Transitivity :
  • Graph max path length :
  • Graph Average Clustering Coefficient :
  • Graph Degree Assortativity Coefficient :
python .\triplea\cli\aaa.py analysis -g gen-all -c info

output:

Creates a graph with all possible nodes and edges and calculates and lists the sorted degree centrality for each node.

python .\triplea\cli\aaa.py analysis -g gen-all -c sdc

output:

Work with Article Repository

Article Repository (Arepo) is a database that stores the information of articles and graphs. Different databases can be used. We have used the following information banks here:

  • TinyDB - TinyDB is a lightweight document oriented database

  • MongoDB - MongoDB is a source-available cross-platform document-oriented database program

To get general information about the articles, nodes and egdes in the database, use the following command.

python .\triplea\cli\aaa.py arepo -c info

output:

Number of article in article repository is 122
0 Node(s) in article repository.
0 Edge(s) in article repository.
122 article(s) in state 3.

Get article data by PMID

python .\triplea\cli\aaa.py arepo -pmid 31398071

output:

Title   : Association between MRI background parenchymal enhancement and lymphovascular invasion and estrogen receptor status in invasive breast cancer.
Journal : The British journal of radiology
DOI     : 10.1259/bjr.20190417
PMID    : 31398071
PMC     : PMC6849688
State   : 3
Authors : Jun Li, Yin Mo, Bo He, Qian Gao, Chunyan Luo, Chao Peng, Wei Zhao, Yun Ma, Ying Yang, 
Keywords: Adult, Aged, Breast Neoplasms, Female, Humans, Lymphatic Metastasis, Magnetic Resonance Imaging, Menopause, Middle Aged, Neoplasm Invasiveness, Receptors, Estrogen, Retrospective Studies, Young Adult,

Get article data by PMID and save to article.json file.

python .\triplea\cli\aaa.py arepo -pmid 31398071 -o article.json

another command fo this:

python .\triplea\cli\aaa.py export_article --idtype pmid --id 31398071 --format json --output "article.json"

Configuration

For details information:

python .\triplea\cli\aaa.py config --help

Get environment variable:

 python .\triplea\cli\aaa.py config -c info

Set new environment variable:

python .\triplea\cli\aaa.py config -c update

Below is a summary of important environment variables in this project:

Environment Variables Description Default Value
TRIPLEA_DB_TYPE The type of database to be used in the project. The database layer is separate and you can use different databases, currently it supports MongoDB and TinyDB databases. TinyDB can be used for small scope and Mango can be used for large scope TinyDB
AAA_TINYDB_FILENAME File name of TinyDB articledata.json
AAA_MONGODB_CONNECTION_URL Standard Connection String Format For MongoDB mongodb://user:pass@127.0.0.1:27017/
AAA_MONGODB_DB_NAME Name of MongoDB Collection articledata
AAA_TPS_LIMIT Transaction Per Second Limitation 1
AAA_PROXY_HTTP An HTTP proxy is a server that acts as an intermediary between a client and PubMed server. When a client sends a request to a server through an HTTP proxy, the proxy intercepts the request and forwards it to the server on behalf of the client. Similarly, when the server responds, the proxy intercepts the response and forwards it back to the client.
AAA_PROXY_HTTPS HTTPS Proxy
AAA_CLIENT_AGENT
AAA_REFF_CRAWLER_DEEP 1
AAA_CITED_CRAWLER_DEEP 1
AAA_CLI_ALERT_POINT 500
AAA_TOPIC_EXTRACT_ENDPOINT
AAA_SCIGENIUS_ENDPOINT
AAA_LLM_TEMPLATE_FILE
AAA_FULL_TEXT_REPO_TYPE
AAA_FULL_TEXT_DIRECTORY
AAA_FULL_TEXT_STRING_REPO_TYPE
AAA_FULL_TEXT_STRING_DIRECTORY

From Package

You can create a python virtual environment before installing and it is recommended that you do so.

$ python -m venv venv
$ .\venv\Scripts\activate

Install Package with pip:

$ pip install triplea

Or install Package From Github

$ pip install git+https://github.com/EhsanBitaraf/triple-a

Create environment variable by .env file:

TRIPLEA_DB_TYPE = TinyDB
AAA_TINYDB_FILENAME = articledata.json
AAA_MONGODB_CONNECTION_URL = mongodb://localhost:27017/
AAA_MONGODB_DB_NAME = articledata
AAA_TPS_LIMIT = 1
AAA_PROXY_HTTP = 
AAA_PROXY_HTTPS = 
AAA_REFF_CRAWLER_DEEP = 1
AAA_CITED_CRAWLER_DEEP = 1
AAA_TOPIC_EXTRACT_ENDPOINT=http://localhost:8001/api/v1/topic/
AAA_CLIENT_AGENT="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/109.0"

If you do not create the mentioned file, the default values will be used, which are:

TRIPLEA_DB_TYPE = TinyDB
AAA_TINYDB_FILENAME = default-tiny-db.json
AAA_TPS_LIMIT = 1
AAA_REFF_CRAWLER_DEEP = 1
AAA_CITED_CRAWLER_DEEP = 1
AAA_TOPIC_EXTRACT_ENDPOINT=http://localhost:8001/api/v1/topic/
AAA_CLIENT_AGENT="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/109.0"

The latest version of a sample .env file can be found here.

Run CLI:

$ aaa --help

output:

Usage: aaa [OPTIONS] COMMAND [ARGS]...

Options:
  -v, --version
  --help         Show this message and exit.

Commands:
  analysis        Analysis Graph.
  config          Configuration additional setting.
  export          Export article repository in specific format.
  export_article  Export Article by identifier.
  export_graph    Export Graph.
  export_llm      Export preTrain LLM.
  go              Moves the articles state in the Arepo until end state.
  import          import article from specific file format to article...
  importbib       import article from .bib , .enw , .ris file format.
  ner             Single NER with custom model.
  next            Moves the articles state in the Arepo from the current...
  pipeline        Run Custom PipeLine in arepo.
  search          Search query from PubMed and store to Arepo.

Note: The visualization function is only available in the source version

Tutorial: You can find guides for programming with this library other than using the CLI in the cookbook section.

Testing

poetry run pytest

poetry run pytest tests/

poetry run pytest --cov

For unit test check :

bibilometric:

37283018

35970485

Dependencies

For graph analysis:

networkx

For NLP:

PyTextRank

transformers

spaCy

For data storage:

TinyDB

py2neo

pymongo

For visualization of networks:

netwulf

Alchemy.js

InteractiveGraph

For CLI:

click

For packaging and dependency management:

Poetry

Use case

With this tool, you can create datasets in different formats, here are examples of these datasets.

Breast Cancer

Pubmed Query:

"breast neoplasms"[MeSH Terms] OR ("breast"[All Fields] AND "neoplasms"[All Fields]) OR "breast neoplasms"[All Fields] OR ("breast"[All Fields] AND "cancer"[All Fields]) OR "breast cancer"[All Fields]

495,012 results

Configuration:

AAA_MONGODB_DB_NAME = bcarticledata
AAA_REFF_CRAWLER_DEEP = 0
AAA_CITED_CRAWLER_DEEP = 0

EDirect used.

Search with this command:

python .\triplea\cli\aaa.py search --searchterm r'"breast neoplasms"[MeSH Terms] OR ("breast"[All Fields] AND "neoplasms"[All Fields]) OR "breast neoplasms"[All Fields] OR ("breast"[All Fields] AND "cancer"[All Fields]) OR "breast cancer"[All Fields]'

if --searchterm argument is too complex use this:

python .\triplea\cli\aaa.py search

by Filter :

{
    "mindate" : "2022/01/01",
    "maxdate" : "2022/12/30"
}

Get info of all downloaded article:

python .\triplea\cli\aaa.py arepo -c info

output:

Number of article in article repository is 30914
0 Node(s) in article repository.
0 Edge(s) in article repository.
30914 article(s) in state 0.

Run Core pipeline to next status

python .\triplea\cli\aaa.py next --state 0

then parsing article:

python .\triplea\cli\aaa.py next --state 1

Extract Triple is type of custom pipeline. you can run this:

python .\triplea\cli\aaa.py pipeline --name FlagExtractKG

Bio Bank

Pubmed Query:

"Biological Specimen Banks"[Mesh] OR BioBanking OR biobank OR dataBank OR "Bio Banking" OR "bio bank"

39,023 results

Search with this command:

python .\triplea\cli\aaa.py search --searchterm "\"Biological Specimen Banks\"[Mesh] OR BioBanking OR biobank OR dataBank OR \"Bio Banking\" OR \"bio bank\" "

Get 39,023 result until 2023/01/02

"ERROR":"Search Backend failed: Exception:\n\'retstart\' cannot be larger than 9998. For PubMed, ESearch can only retrieve the first 9,999 records matching the query. To obtain more than 9,999 PubMed records, consider using EDirect that contains additional logic to batch PubMed search results automatically so that an arbitrary number can be retrieved. For details see https://www.ncbi.nlm.nih.gov/books/NBK25499/"

This query had more than 10,000 results, and as a result, the following text was used:

To retrieve more than 10,000 UIDs from databases other than PubMed, submit multiple esearch requests while incrementing the value of retstart (see Application 3). For PubMed, ESearch can only retrieve the first 10,000 records matching the query. To obtain more than 10,000 PubMed records, consider using <EDirect> that contains additional logic to batch PubMed search results automatically so that an arbitrary number can be retrieved.

This is hard code in get_article_list_from_pubmed methods in PARAMS.

This Query Added lately:

"bio-banking"[Title/Abstract] OR "bio-bank"[Title/Abstract] OR "data-bank"[Title/Abstract]

9,012 results

python .\triplea\cli\aaa.py search --searchterm " \"bio-banking\"[Title/Abstract] OR \"bio-bank\"[Title/Abstract] OR \"data-bank\"[Title/Abstract] "

after run this. get info:

Number of article in article repository is 47735

Export graphml format:

python .\triplea\cli\aaa.py export_graph -g article-reference -g article-keyword  -f graphml -o .\triplea\datasets\biobank.graphml

Registry of Breast Cancer

Keyword Checking:

"Breast Neoplasms"[Mesh]  
"Breast Cancer"[Title]
"Breast Neoplasms"[Title]  
"Breast Neoplasms"[Other Term]
"Breast Cancer"[Other Term]
"Registries"[Mesh]
"Database Management Systems"[Mesh]
"Information Systems"[MeSH Major Topic]
"Registries"[Other Term]
"Information Storage and Retrieval"[MeSH Major Topic]
"Registry"[Title]
"National Program of Cancer Registries"[Mesh]
"Registries"[MeSH Major Topic]
"Information Science"[Mesh]
"Data Management"[Mesh]

Final Pubmed Query:

("Breast Neoplasms"[Mesh] OR "Breast Cancer"[Title] OR "Breast Neoplasms"[Title] OR "Breast Neoplasms"[Other Term] OR "Breast Cancer"[Other Term]) AND ("Registries"[MeSH Major Topic] OR "Database Management Systems"[MeSH Major Topic] OR "Information Systems"[MeSH Major Topic] OR "Registry"[Other Term] OR "Registry"[Title] OR "Information Storage and Retrieval"[MeSH Major Topic])

url:

https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term=("Breast+Neoplasms"[Mesh]+OR+"Breast+Cancer"[Title]+OR+"Breast+Neoplasms"[Title]+OR+"Breast+Neoplasms"[Other+Term]+OR+"Breast+Cancer"[Other+Term])+AND+("Registries"[MeSH+Major+Topic]+OR+"Database+Management+Systems"[MeSH+Major+Topic]+OR+"Information+Systems"[MeSH+Major+Topic]+OR+"Registry"[Other+Term]+OR+"Registry"[Title]+OR+"Information+Storage+and+Retrieval"[MeSH+Major+Topic])&retmode=json&retstart=1&retmax=10

You can download the result of this network and the relationship between the article and the keyword in graphdict format from here. Manipulated, you can download this graph in gramphml format from here.

EHR

It is not yet complete.

Graph Visualization

Various tools have been developed to visualize graphs. We have done a brief review and selected a few tools to use in this program.

Graph Analysis

In this project, we used one of the most powerful libraries for graph analysis. Using NetworkX, we generated many indicators to check a citation graph. Some materials in this regard are given here. You can use other libraries as well.

Knowledge Extraction

In the architecture of this software, the structure of the article is stored in the database and this structure also contains the summary of the article. For this reason, it is possible to perform NLP processes such as keywords extraction, topic extraction etc., which can be completed in the future.

Related Article

This topic is very interesting from a research point of view, so I have included the articles that were interesting here.

Code Quality

We used flake8 and black libraries to increase code quality. More information can be found here.


Citation

If you use Triple A for your scientific work, consider citing us! We're published in IEEE.

@INPROCEEDINGS{10139229,
  author={Jafarpour, Maryam and Bitaraf, Ehsan and Moeini, Ali and Nahvijou, Azin},
  booktitle={2023 9th International Conference on Web Research (ICWR)}, 
  title={Triple A (AAA): a Tool to Analyze Scientific Literature Metadata with Complex Network Parameters}, 
  year={2023},
  volume={},
  number={},
  pages={342-345},
  doi={10.1109/ICWR57742.2023.10139229}}

DOI:10.1109/ICWR57742.2023.10139229


License

TripleA is available under the Apache License.