<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta>
      <journal-title-group>
        <journal-title>Italian Information Retrieval Workshop, September</journal-title>
      </journal-title-group>
    </journal-meta>
    <article-meta>
      <title-group>
        <article-title>Recommending Third-party Library Updates with LSTM Neural Networks</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Phuong T. Nguyen</string-name>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Juri Di Rocco</string-name>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Riccardo Rubei</string-name>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Claudio Di Sipio</string-name>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Davide Di Ruscio</string-name>
        </contrib>
      </contrib-group>
      <pub-date>
        <year>2021</year>
      </pub-date>
      <volume>1</volume>
      <fpage>3</fpage>
      <lpage>15</lpage>
      <abstract>
        <p>During the lifecycle of a software project, oftentimes developers have the need to update third-party libraries (TPLs) from an old version to a newer one. This aims to keep their code up-to-date with the latest functionalities ofered by the libraries. In practice, choosing the next version for a library is a daunting task since it is crucial to maintain a harmonious relationship with other libraries. We propose DeepLib, a novel approach to the recommendation of an upgrade plan for software projects with respect to library usage. We mine migration history to build matrices and train deep neural networks, which are eventually used to forecast the subsequent versions of the related libraries. We evaluate the framework on a dataset from the Maven Central Repository. The results show promising outcomes: DeepLib can recommend the next version for the library of interest, earning a high prediction accuracy.</p>
      </abstract>
      <kwd-group>
        <kwd>eol&gt;Mining software repositories</kwd>
        <kwd>Third-party library updates</kwd>
        <kwd>Deep learning</kwd>
        <kwd>LSTM</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1. Introduction</title>
      <p>
        When working with coding tasks, developers usually make use of third-party libraries (TPLs)
that ofer desired functionalities [
        <xref ref-type="bibr" rid="ref1 ref2 ref3">1, 2, 3</xref>
        ], e.g., database administration, log management, and
ifle utility to name a few. Reusing existing TPLs allows developers to leverage well-founded
programming utilities without re-implementing software functionalities from scratch. This
indeed helps them save time as well as increase productivity. Nevertheless, libraries evolve,
many API functions are added, and many others are removed or deprecated. In this way, it
is necessary to migrate an old library to a new one to enforce the new functionalities of the
project. However, choosing the wrong version of a library may break the mutual dependencies
among diferent libraries, resulting in unavoidable disruptions [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ]. To upgrade a library, a
developer needs to be knowledgeable of both versions’ documentation and choose the right
matching between methods. In fact, due to the fear of incompatibility and breaking changes [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ],
developers are highly reluctant to upgrade TPLs [
        <xref ref-type="bibr" rid="ref4 ref6">4, 6</xref>
        ]. In this respect, it is essential to have the
proper machinery to assist them in choosing suitable updates.
      </p>
      <p>
        We propose DeepLib, a novel approach to recommendation of library updates, exploiting
cutting-edge deep learning (DL) techniques. By analyzing the migration history of mined
projects, we build matrices containing libraries and their versions in chronological order, which
are fed to the recommendation engine. In addition, a long short-term memory recurrent
network [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ] (LSTM) was built to predict a set of versions. As output, DeepLib delivers the next
version for a single library lib that the developer wants to upgrade. To the best of our knowledge,
there exist no comparable tools providing this type of recommendation. Thus, we cannot
compare our system with any reusable baselines, but evaluate it employing extensive experiments
on a considerably large dataset from the Maven Central Repository. The experimental results
show that DeepLib can efectively suggest the next version for a single library, demonstrating
its feasibility in the field.
      </p>
      <p>Structure. Section 2 presents a motivating example, and background to LSTMs. We introduce
the proposed approach in Sect. 3, and present the evaluation materials and methods in Sect. 4.
Afterwards, Sect. 5 reports and analyzes the experimental results, as well as the probable threats
to validity. The related work is reviewed in Sect. 6 and the paper is concluded in Sect. 7.</p>
    </sec>
    <sec id="sec-2">
      <title>2. Motivations and Background</title>
      <p>Section 2.1 describes a motivating example, afterwards, Sect. 2.2 briefly recalls background
related to long short-term memory recurrent neural networks.</p>
      <sec id="sec-2-1">
        <title>2.1. Motivating example</title>
        <p>
          While working with a software project, developers often need to upgrade the constituent
thirdparty libraries from an old version to a newer one, aiming to approach the latest functionalities
ofered by the libraries. Hereafter, we consider the following terms: (i) library or dependency:
A software module which is developed by a third party, and provides tailored functionalities.
A library evolves over the course of time by ofering new functionalities or bug fixes [
          <xref ref-type="bibr" rid="ref4">4</xref>
          ]; (ii)
repository or client: A software project that is hosted in OSS platforms, e.g., GitHub, Maven
and that makes use of some TPLs.
        </p>
        <p>We consider in Table 1 a running example with maintainers working on the repository
named org.apache.hadoop:hadoop-auth1 which depends on a set of four libraries as follows:
lib1: log4j:log4j; lib2: org.slf4j:slf4j-log4j12; lib3: org.apache.httpcomponents:httpclient; and lib4:
commons-codec:commons-codec.</p>
        <p>The latest version of the hadoop-auth repository is 3.0.0-alpha3 (the green row), and we
assume that the maintainers want to upgrade the libraries. However, they do not know for
sure which version should be used for the constituent libraries, i.e., all the cells are filled with
a question mark (?). One may think of a simple heuristic that migrates a library to the next
version or the latest one. However, we see that such a heuristic does not work in every case. In
particular, there are two additional possible changes that developers can perform on library
dependencies: (i) removal of a library; and (ii) downgrade migration, as we explain as follows.
▷ Removal of a library. In the table, the repository versions are listed in chronological order,
i.e., using their timestamp. A cell with 0 implies that the library in the column is not included
by the repository version represented in the row. The presence of a library is subject to change
from version to version. For instance, lib1 has been used by version 2.0.0-alpha, 2.0.2-alpha,
and 2.3.0. When the repository is upgraded from 2.3.0 to 2.4.1, lib1 is removed. However, the
library is then re-introduced when moving from 2.5.1 to 2.6.0. Thus, we see that the ability to
recommend a 0 is also useful.
▷ Downgrade migrations. We can see that the upgrading is not always done upward, i.e.,
moving the library to a higher version since there are also backward migrations. For instance,
when the client moves from 2.6.0 to 2.7.2, lib3 is downgraded from version 4.3.1 to 4.2.5. However,
the library is then updated to version 4.5.2 by client 3.0.0-alpha3.</p>
        <p>In the following subsection, we review an LSTM neural network dealing with time series
data as a base for further presentations.</p>
      </sec>
      <sec id="sec-2-2">
        <title>2.2. Long short-term memory neural networks</title>
        <p>
          Recurrent neural networks (RNNs) [
          <xref ref-type="bibr" rid="ref8">8</xref>
          ] are a family of neural networks specialized in dealing
with sequence data. An RNN stores information about past events to predict future occurrences.
However, a main drawback of RNNs is that they cannot learn long-term dependencies well.
Thus, long short-term memory recurrent neural networks (LSTMs) have been proposed to
transcend the limitation [
          <xref ref-type="bibr" rid="ref7">7</xref>
          ]. LSTMs learn better long-term dependencies by memorizing the
input sequence of data. Moreover, they have the mechanisms to remove or add information to
remember worthy information and discard useless ones.
        </p>
        <p>
          We refer to Table 2 to illustrate how an LSTM works. Given that  = [ℎ− 1, ] is the
concatenation of ℎ− 1 the hidden state vector from the previous time step, and  is the current
input vector, then two states are propagated to the next cell, i.e., cell state  and hidden state ℎ.
The output of the previous unit, together with the current input, is fed as the input data for a
cell. The sigmoid function is used to discard useless information and retain useful information.
× and × are the weight and bias matrices for diferent network entry, hidden state matrix.
Softmax is used as the activation function, converting a set of real numbers to probabilities
which sum to 1.0 [
          <xref ref-type="bibr" rid="ref11">11</xref>
          ]. Given C classes, and  is the output of the kℎ neuron, the final prediction
is the class that gets the maximum probability, i.e., ˆ =  ,  ∈ {1, 2, .., }, where 
is computed as follows:  = ()/ ∑︀
        </p>
        <p>=1 ().</p>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>3. DeepLib: Forecasting the next versions for third-party libraries</title>
      <p>DeepLib is built on top of an LSTM to accept as input a set of versions and returns the future
version for each library. Given a set of projects, we populate a matrix by reading each client
and filling the correct version for all libraries. We obtain a matrix where each row represents a
client with its versions. From the matrix, we insert one more column on the right side. For each
client, the last cell is filled with the version of the library by the next client.</p>
      <p>Figure 1(b) depicts the migration matrix for lib1 for the motivating example in Table 1. The
left side depicts the original migration matrix, and the right side is the resulting migration
matrix for lib1. For instance, the first row contains the versions of the four libraries, i.e., (1.2.15,
1.6.1, 0, 1.4) while the last column is the future version of lib1, i.e., 1.2.17, which is actually the
version of lib1 by the next client (Version 2.0.2). This can be interpreted as follows: “Given that
in the current client we use 1.2.15 for lib1, 1.6.1 for lib2, no lib3, and version 1.4 for lib4, then in the
next version of the client we should adopt 1.2.17 for lib1.”</p>
      <p>Since LSTMs only work with numbers, we need to encode each library version using a unique
number. Moreover, the  and tanh functions (cf. Section 2.2) accept values in the [0..1] range,
we also need to normalize all the numbers to meet this requirement. The right most part of
Fig. 1(b) depicts the migration matrix after the encoding and normalizing phases.2</p>
      <p>Figure 1(a) explains how DeepLib works: The data to feed the system is a tuple of the form
=&lt;lib11, lib21, lib31, lib41&gt; and =&lt;lib12&gt;, which captures the migration path of a client.
DeepLib uses input features from recent events, i.e., X = {},  ∈   to forecast the future
version of each libraries, Y = {},  ∈   , where   and   are time in the past and the future,
respectively. By each time step , only one vector  is fed to the LSTM cell.</p>
      <p>The conceived architecture is depicted in Fig. 2. DeepLib has been implemented on top of
the Keras framework3 and trained using Google Colab. Data is fetched from OSS platforms
1 , e.g., GitHub and Maven with Crawler 2 . The collected data is then aligned, sorted, and
transformed into a suitable format to store in CSV files by Converter 3 . It is necessary
2Matrix encoding and normalizing is conveniently done with the LabelEncoder() and MinMaxScaler() utilities
embedded in Python.</p>
      <p>3https://keras.io/
LSTM
LSTM</p>
      <p>LSTM</p>
    </sec>
    <sec id="sec-4">
      <title>4. Evaluation</title>
      <p>to upload the data to Google Drive for further processing. The Parser component 4 builds
migration matrices for LSTM 5 which eventually provides library updates 6 .
We evaluate DeepLib to study its capability to provide a developer with accurate
recommendations featuring suitable upgrades. In Sect. 4.1 we introduce the datasets, while in Sect. 4.2 we
describe the settings and evaluation metrics.</p>
      <sec id="sec-4-1">
        <title>4.1. Data extraction</title>
        <p>
          We rely on a dataset collected from more than 1,000 public Maven repositories. The dataset
consists of migration history for the top ten popular libraries. Given a set of libraries, we
crawled all of their versions together with the list of clients and their corresponding release
date. Moreover, we mined dependency links from a client to the used libraries with Maven
Dependency Graph, a graph-based representation of the collected artifacts in Maven and their
relationships. Then, additional steps were performed to remove unuseful clients, using the
following constraints: A client should (i) have more than one version; (ii) migrate at least one
library among the considered libraries; and (iii) use at least four of the given libraries. This
allows us to keep the resulting matrices not too sparse. Table 3 reports the main characteristics
of the datasets: each row features an input library with its name, the number of versions (  ),
the number of clients that use at least one version of the library (  ), the number of clients that
migrate from one version to another (  ).
4.2. Settings and metrics
▷ Experimental settings. We opted for the ten-fold cross-validation technique [
          <xref ref-type="bibr" rid="ref12">12</xref>
          ], each
dataset (cf. Section 4.1) is split into =10 equal parts, so-called folds. For each validation round,
one fold is used as testing data, and the remaining -1 folds are combined to form the training
data. The evaluation simulates a real development scheme: the system needs to provide the active
projects with recommendations using the data from a set of existing projects.
▷ Metrics. We evaluate how well DeepLib recommends versions that eventually match with
those stored in the ground-truth data. We compute accuracy according to each library ():
the metric measures the ratio of clients with correct predictions ( ) to the total number of clients
(n), i.e.,  =  . Moreover, we compute correlation eficients using the Spearman  and the
Kendall  , and measure the efect size with Clif’s delta [13].
        </p>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>5. Results</title>
      <p>Section 5.1 reports an example recommended by DeepLib, and Sect. 5.2 analyzes the results.</p>
      <sec id="sec-5-1">
        <title>5.1. Explanatory example</title>
        <p>L01 L02 L03 L04 L05 L06 L07 L08 L09 L10 ground truth
0 1.7.10 0 17 0 0 0 1.1.2 3.3.2 0
prediction
a big migration step, i.e., upgrading almost all the constituent libraries at once. We expect
DeepLib to provide proper recommendations to assist developers in migrating their clients, as
big migrations may make the prediction more challenging.</p>
        <p>The second row of Fig. 3 presents the versions suggested by DeepLib for client 0.6.1. The tool
recommends correct migration for L02, L08, and L09. It only mispredicts for L04, by providing
18 instead of 17, the correct one. Moreover, DeepLib accurately predicts all the zeros, i.e., the
libraries that are not invoked. This seems to be trivial at first sight, however as we pointed in
Section 2.1, recommending a zero makes sense. In summary, we see that our tool can provide
relevant recommendations to the repository, even when a big migration step is required.</p>
      </sec>
      <sec id="sec-5-2">
        <title>5.2. Result analysis</title>
        <p>We performed experiments on the considered datasets using the ten-fold cross-validation
technique. The prediction results are shown in Table 4. For each library, besides the accuracy
for each fold from F01 to F10, we also averaged out the scores to get the final accuracy, which
is shown in the last column of the tables. Moreover, the cells with an accuracy smaller than
0.700 are marked using the light red color, signaling an inferior performance.</p>
        <p>Overall, the table demonstrates that DeepLib can provide accurate predictions for almost all
the libraries. For instance, with L01, by all the testing rounds DeepLib always gets an accuracy
larger than 0.90, and the average accuracy is 0.970. This also applies to other libraries, such
as L05 or L07. Especially, by L06 and L10 we see a maximum accuracy for most of the folds:
DeepLib gets an average accuracy of 0.999 with L06.</p>
        <p>Finding 1. Being fed with proper data, DeepLib recommends the next version for a single library,
obtaining a high accuracy for the majority of the libraries.</p>
        <p>We see that DeepLib gets an encouraging result for most of the libraries. Nevertheless, it fails
in some certain cases. It is necessary to find out the rationale behind such a setback, as this
helps reveal the pitfalls that one can avoid when deploying DeepLib. According to Table 3, there
are three variables: number of versions (  ), number of clients (  ), and number of migrations
(  ). We perform quantitative analyses to study the relationships between these variables and
the average accuracy, using the Spearman  and the Kendall  , and measure the efect size with
Clif’s delta [13].</p>
        <p>There is a low correlation between accuracy and   , and this is enforced by both coeficients,
i.e.,  = − 4.84× 10− 1 and  = − 3.03× 10− 1. Moreover, the diference is statistically significant,
i.e., p-value= 7.78 × 10− 3 and 5.98 × 10− 9. The table also shows that the efect is large by the
considered relationships, i.e., Clif’s delta is 1.0. This essentially means that the more versions a
library has, the lower accuracy DeepLib obtains. A similar trend is seen with the relationship
between accuracy and   . In particular,  = − 8.48 × 10− 1 and  = − 6.71 × 10− 1, which
means accuracy is disproportionate to the number of migrations. The diference is statistically
significant and the efect size is large. Altogether, this suggests that it is more dificult for
DeepLib to provide good recommendations for a library associated with a large number of
migrations.</p>
        <p>We suppose that this happens due to the structure of the networks, i.e., if there are more
versions or migrations, the network fails to absorb all the patterns. Such a limitation can
be overcome with deeper networks, i.e., by padding additional hidden units to DeepLib. To
validate the hypothesis, we increased the number of network units from 40 to 100 and reran the
experiments on the libraries with which DeepLib gets a low accuracy by most of the folds, i.e.,
L02, L03. As expected, we see a gain in accuracy by these libraries. For the sake of clarity, we
report the change in accuracy with respect to Table 4 as follows: Acc(02): 0.625 → 0.632,
Acc(03): 0.772 → 0.781.</p>
        <p>Finding 2. DeepLib sufers a deficiency in performance on libraries with a large number of versions
and/or migrations. However, depending on the input data, the system’s performance can be enhanced
with deeper networks.</p>
      </sec>
      <sec id="sec-5-3">
        <title>5.3. Threats to validity</title>
        <p>Threats to internal validity are related to the factors in the approach and evaluation that could
have afected the final results. A possible threat is that the datasets might not fully reflect
real-world development scenarios as we could consider only popular libraries. To mitigate the
threats, we crawled a wide range of clients across several repositories. Still, we believe that
considering data from other sources, e.g., GitHub, can help eliminate the threat.</p>
        <p>The main threat to external validity concerns the generalizability of our findings. DeepLib has
been evaluated on projects collected from Maven, since we have suitable software to fetch the
data. We anticipate that our tool is also applicable to other platforms, as long as they support
versioning. We plan to generalize DeepLib to data from GitHub in our future work.</p>
      </sec>
    </sec>
    <sec id="sec-6">
      <title>6. Related Work</title>
      <p>We review notable recommender systems by focusing on those related to the adoption of TPLs
and API migrations.</p>
      <p>
        Ouni et al. [14] develops LibFinder that uses a multi-objective algorithm to detect semantic
similarity in source code. CrossRec [
        <xref ref-type="bibr" rid="ref2">2, 15</xref>
        ] assists developers in selecting suitable TPLs. The
system exploits a collaborative filtering technique to recommend libraries by relying on the set
of dependencies, which have been included in the project being developed. LibSeek [16] employs
the matrix factorization (MF) technique to predict relevant TPLs for mobile apps. It adopts an
adaptive weighting scheme to reduce the skewness caused by popular libraries. Furthermore, the
MF-based algorithm is used to integrate neighborhood information by computing the similarity
of libraries contained in the matrix.
      </p>
      <p>Req2Lib [17] has been recently proposed to recommend TPLs given textual description of
project requirements. The tool employs a seq2seq LSTM which is trained with description
and libraries belonging to configuration file. Additionally, a domain-specific embedding model
obtained from Stack Overflow is used to encode words in high-dimensional vectors. Xu et al.
propose Meditor [18] to analyze GitHub commits to extract migration-related (MR) changes
by mining pom.xml files. Once MR updates have been found, the tool employs the WALA
framework to check their consistency by analyzing the developer’s context and apply them
directly. Apiwave [19] infers and retrieves relevant information related to TPLs, i.e., popularity
and migration data. The tool uses two diferent modules to discover the popularity by
analyzing import statements of projects, i.e., the removal of certain API decreases its popularity.
Additionally, the system can infer migration data from each API replacement.</p>
      <p>Diferently from the aforementioned approaches, DeepLib can learn from what other projects
have done to recommend the next upgrades that maintainers should operate on one or more
libraries already in their project. DeepLib recommends also removals of dependencies according
to existing migrations. Migrating the source code that might get afected by the recommended
upgrades is not in the scope of this paper, and we plan it as future work.</p>
    </sec>
    <sec id="sec-7">
      <title>7. Conclusion and Future Work</title>
      <p>To reduce the burden related to the identification of the upgrades that need to be operated on
the current system we proposed DeepLib, a novel approach to recommendation of the next
version for the used TPLs by considering migration histories of several OSS projects. Our
proposed tool is able to extract relevant migration data and encode it in matrices. Then, deep
learning techniques are employed to provide recommendations that are relevant for the current
configuration. As future work, we plan to evaluate DeepLib on specific ecosystems including
that of Android apps. Moreover, we also intend to investigate the possibility of applying the
technique to support the migration of source code, which can be afected by the proposed
upgrade plans.</p>
    </sec>
    <sec id="sec-8">
      <title>8. Acknowledgments</title>
      <p>The research described in this paper has been carried out as part of the CROSSMINER Project,
which has received funding from the European Union’s Horizon 2020 Research and Innovation
Programme under Grant 732223.
[13] R. J. Grissom, J. J. Kim, Efect sizes for research: A broad practical approach, 2nd edition
ed., Lawrence Earlbaum Associates, 2005.
[14] A. Ouni, R. G. Kula, M. Kessentini, T. Ishio, D. M. German, K. Inoue, Search-based software
library recommendation using multi-objective optimization, Inf. Softw. Technol. 83 (2017)
55–75. URL: https://doi.org/10.1016/j.infsof.2016.11.007. doi:10.1016/j.infsof.2016.
11.007.
[15] P. T. Nguyen, J. Di Rocco, D. Di Ruscio, Mining software repositories to support
OSS developers: A recommender systems approach, in: Proceedings of the 9th
Italian Information Retrieval Workshop, Rome, Italy, May, 28-30, 2018., 2018. URL: http:
//ceur-ws.org/Vol-2140/paper9.pdf.
[16] Q. He, B. Li, F. Chen, J. Grundy, X. Xia, Y. Yang, Diversified third-party library prediction
for mobile app development, IEEE Transactions on Software Engineering (2020) 1–1.
[17] Z. Sun, Y. Liu, Z. Cheng, C. Yang, P. Che, Req2Lib: A Semantic Neural Model for Software
Library Recommendation, in: 2020 IEEE 27th International Conference on Software
Analysis, Evolution and Reengineering (SANER), 2020, pp. 542–546. doi:10.1109/SANER48275.
2020.9054865, iSSN: 1534-5351.
[18] S. Xu, Z. Dong, N. Meng, Meditor: Inference and Application of API Migration Edits, in:
2019 IEEE/ACM 27th Int. Conf. on Program Comprehension (ICPC), 2019, pp. 335–346.
doi:10.1109/ICPC.2019.00052.
[19] A. Hora, M. T. Valente, Apiwave: Keeping track of API popularity and migration, in:
2015 IEEE Int. Conf. on Software Maintenance and Evolution (ICSME), 2015, pp. 321–323.
doi:10.1109/ICSM.2015.7332478.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>S.</given-names>
            <surname>Raemaekers</surname>
          </string-name>
          ,
          <string-name>
            <surname>A. van Deursen</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Visser</surname>
          </string-name>
          ,
          <article-title>Semantic versioning and impact of breaking changes in the maven repository</article-title>
          ,
          <source>Journal of Systems and Software</source>
          <volume>129</volume>
          (
          <year>2017</year>
          )
          <fpage>140</fpage>
          -
          <lpage>158</lpage>
          . URL: http://www.sciencedirect.com/science/article/pii/S0164121216300243. doi:https: //doi.org/10.1016/j.jss.
          <year>2016</year>
          .
          <volume>04</volume>
          .008.
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>P. T.</given-names>
            <surname>Nguyen</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J. Di</given-names>
            <surname>Rocco</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D. Di</given-names>
            <surname>Ruscio</surname>
          </string-name>
          ,
          <string-name>
            <surname>M.</surname>
          </string-name>
          <article-title>Di Penta, CrossRec: Supporting Software Developers by Recommending Third-party Libraries</article-title>
          ,
          <source>Journal of Systems and Software</source>
          (
          <year>2019</year>
          )
          <article-title>110460</article-title>
          . URL: http://www.sciencedirect.com/science/article/pii/S0164121219302341. doi:https://doi.org/10.1016/j.jss.
          <year>2019</year>
          .
          <volume>110460</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>J. Di</given-names>
            <surname>Rocco</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D. Di</given-names>
            <surname>Ruscio</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Di Sipio</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P. T.</given-names>
            <surname>Nguyen</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Rubei</surname>
          </string-name>
          ,
          <article-title>Development of recommendation systems for software engineering: the CROSSMINER experience</article-title>
          ,
          <source>Empirical Software Engineering</source>
          <volume>26</volume>
          (
          <year>2021</year>
          )
          <article-title>69</article-title>
          . URL: https://doi.org/10.1007/s10664-021-09963-7. doi:
          <volume>10</volume>
          .1007/s10664-021-09963-7.
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>E.</given-names>
            <surname>Derr</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Bugiel</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Fahl</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Y.</given-names>
            <surname>Acar</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Backes</surname>
          </string-name>
          ,
          <article-title>Keep me updated: An empirical study of third-party library updatability on android</article-title>
          ., in: B.
          <string-name>
            <surname>M. Thuraisingham</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          <string-name>
            <surname>Evans</surname>
            ,
            <given-names>T.</given-names>
          </string-name>
          <string-name>
            <surname>Malkin</surname>
          </string-name>
          , D. Xu (Eds.), ACM Conference on Computer and Communications Security, ACM,
          <year>2017</year>
          , pp.
          <fpage>2187</fpage>
          -
          <lpage>2200</lpage>
          . URL: http://dblp.uni-trier.de/db/conf/ccs/ccs2017.html#DerrBFA017.
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>J.</given-names>
            <surname>Huang</surname>
          </string-name>
          ,
          <string-name>
            <given-names>N.</given-names>
            <surname>Borges</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Bugiel</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Backes</surname>
          </string-name>
          ,
          <article-title>Up-to-crash: Evaluating third-party library updatability on android</article-title>
          ,
          <source>in: 2019 IEEE European Symposium on Security and Privacy (EuroS P)</source>
          ,
          <year>2019</year>
          , pp.
          <fpage>15</fpage>
          -
          <lpage>30</lpage>
          . doi:
          <volume>10</volume>
          .1109/EuroSP.
          <year>2019</year>
          .
          <volume>00012</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>R. G.</given-names>
            <surname>Kula</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D. M.</given-names>
            <surname>German</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Ouni</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T.</given-names>
            <surname>Ishio</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Inoue</surname>
          </string-name>
          ,
          <article-title>Do developers update their library dependencies?: An empirical study on the impact of security advisories on library migration</article-title>
          ,
          <source>Empirical Software Engineering</source>
          <volume>23</volume>
          (
          <year>2018</year>
          )
          <fpage>384</fpage>
          -
          <lpage>417</lpage>
          . doi:
          <volume>10</volume>
          .1007/s10664-017-9521-5.
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>S.</given-names>
            <surname>Hochreiter</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Schmidhuber</surname>
          </string-name>
          ,
          <article-title>Long short-term memory</article-title>
          ,
          <source>Neural Comput. 9</source>
          (
          <year>1997</year>
          )
          <fpage>1735</fpage>
          -
          <lpage>1780</lpage>
          . URL: https://doi.org/10.1162/neco.
          <year>1997</year>
          .
          <volume>9</volume>
          .8.1735. doi:
          <volume>10</volume>
          .1162/neco.
          <year>1997</year>
          .
          <volume>9</volume>
          .8.1735.
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>S.</given-names>
            <surname>Alemany</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Beltran</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Pérez</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Ganzfried</surname>
          </string-name>
          ,
          <article-title>Predicting hurricane trajectories using a recurrent neural network</article-title>
          ,
          <source>in: The Thirty-Third Conference on Artificial Intelligence</source>
          ,
          <source>AAAI</source>
          <year>2019</year>
          ,
          <source>The Ninth Symposium on Educational Advances in Artificial Intelligence, EAAI</source>
          <year>2019</year>
          , AAAI Press,
          <year>2019</year>
          , pp.
          <fpage>468</fpage>
          -
          <lpage>475</lpage>
          . URL: https://doi.org/10.1609/aaai.v33i01.3301468. doi:
          <volume>10</volume>
          .1609/aaai.v33i01.
          <fpage>3301468</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>C.</given-names>
            <surname>Olah</surname>
          </string-name>
          ,
          <source>Understanding LSTM Networks</source>
          ,
          <year>2020</year>
          . URL: https://colah.github.io/posts/ 2015-08-Understanding-LSTMs/.
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>L.</given-names>
            <surname>Iovino</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P. T.</given-names>
            <surname>Nguyen</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A. D.</given-names>
            <surname>Salle</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Gallo</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Flammini</surname>
          </string-name>
          ,
          <article-title>Unavailable transit feed specification: Making it available with recurrent neural networks</article-title>
          ,
          <source>IEEE Transactions on Intelligent Transportation Systems</source>
          <volume>22</volume>
          (
          <year>2021</year>
          )
          <fpage>2111</fpage>
          -
          <lpage>2122</lpage>
          . doi:
          <volume>10</volume>
          .1109/TITS.
          <year>2021</year>
          .
          <volume>3053373</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>W.</given-names>
            <surname>Rawat</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Z.</given-names>
            <surname>Wang</surname>
          </string-name>
          ,
          <article-title>Deep convolutional neural networks for image classification: A comprehensive review</article-title>
          ,
          <source>Neural Comput</source>
          .
          <volume>29</volume>
          (
          <year>2017</year>
          )
          <fpage>2352</fpage>
          -
          <lpage>2449</lpage>
          . URL: https://doi.org/10.1162/ neco_a_00990. doi:
          <volume>10</volume>
          .1162/neco_a_
          <fpage>00990</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>R.</given-names>
            <surname>Kohavi</surname>
          </string-name>
          ,
          <article-title>A Study of Cross-validation and Bootstrap for Accuracy Estimation and Model Selection</article-title>
          , in: 14th
          <source>International Joint Conference on Artificial Intelligence</source>
          , Morgan Kaufmann Publishers Inc., San Francisco,
          <year>1995</year>
          , pp.
          <fpage>1137</fpage>
          -
          <lpage>1143</lpage>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>