<!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 />
    <article-meta>
      <title-group>
        <article-title>A New Method for Inheriting Canonicity Test Failures in Close-by-One Type Algorithms</article-title>
      </title-group>
      <contrib-group>
        <aff id="aff0">
          <label>0</label>
          <institution>266, Department of Computer Science, Palacky University Olomouc</institution>
          ,
          <addr-line>2018. Copying permitted only for private and academic purposes</addr-line>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>Conceptual Structures Research Group Communication and Computing Research Centre Department of Computing Faculty of Arts, Computing, Engineering and Sciences Sheffield Hallam University</institution>
          ,
          <addr-line>Sheffield</addr-line>
          ,
          <country country="UK">UK</country>
        </aff>
        <aff id="aff2">
          <label>2</label>
          <institution>c paper author(s), 2018. Proceedings volume published and copyrighted by its editors. Paper published in Dmitry I. Ignatov</institution>
          ,
          <addr-line>Lhouari Nourine (Eds.): CLA 2018, pp. 255</addr-line>
        </aff>
      </contrib-group>
      <pub-date>
        <year>2094</year>
      </pub-date>
      <fpage>0000</fpage>
      <lpage>0003</lpage>
      <abstract>
        <p>Close-by-One type algorithms are efficient algorithms for computing formal concepts. They use a mathematical canonicity test to avoid the repeated computation of the same concept, which is far more efficient than methods based on searching. Nevertheless, the canonicity test is still the most labour intensive part of Close-by-One algorithms and various means of avoiding the test have been devised, including the ability to inherit test failures at the next level of recursion. This paper presents a new method for inheriting canonicity test failures in Closeby-One type algorithms. The new method is simpler than the existing method and can be amalgamated with other algorithm features to further improve efficiency. The paper recaps an existing algorithm that does not feature test failure inheritance and an algorithm that features the existing method. The paper then presents the new method and a new algorithm that incorporates it. The three algorithms are implemented on a 'level playing field' with the same level of optimisation. Experiments are carried out on the implemented algorithms, using a representative range of data sets, to compare the number of inherited canonicity test failures and the computation times. It is shown that the new algorithm, incorporating the new method of inheriting canonicity test failures, gives the best performance.</p>
      </abstract>
      <kwd-group>
        <kwd>Formal Concept Analysis</kwd>
        <kwd>FCA</kwd>
        <kwd>FCA algorithms</kwd>
        <kwd>Computing formal concepts</kwd>
        <kwd>Canonicity test</kwd>
        <kwd>Inheriting canonicity test failures</kwd>
        <kwd>Close-by-One</kwd>
        <kwd>FCbO</kwd>
        <kwd>In-Close</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>
        In the development o fast algorithms to compute formal concepts, the discovery
of the so-called ‘canonicity test’, whereby the attributes in a concept could be
examined to determine its newness in the computation, gave rise to the
original Close-by-One (CbO) algorithm [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ]. The canonicity test has proved to be
fundamental in the efficient computation of formal concepts, being far more
efficient than previous methods of determining the newness of a concept based on
searching, and was integral to the subsequent CbO algorithm presented in [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ].
Nevertheless, the canonicity test is still the most labour intensive part of
CbOtype algorithms and various means of avoiding or improving the test have been
devised, giving rise to a number of advances in CbO-type algorithms
including FCbO [
        <xref ref-type="bibr" rid="ref7 ref9">7, 9</xref>
        ], In-Close2 [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ] and In-Close4 [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ]. FCbO introduced a combined
‘breadth and depth’ approach to computation that allowed child concepts to
fully inherit their parent’s attributes. In-Close2 then added a modified,
‘partialclosure’, canonicity test to reduce the computation required in the test. FCbO
also introduced a technique whereby failed canonicity tests could be inherited,
thereby avoiding many canonicity tests. In-Close4 made use of empty
intersections between the current concept extent and attribute-extents in the
computation to also avoid canonicity tests.
      </p>
      <p>This paper describes a new method of inheriting failed canonicity tests that
is simpler than the method used by FCbO. Furthermore, the method can be
amalgamated with existing efficiency features to further improve performance.</p>
      <p>
        The rest of this paper is structured as follows: The paper will use the
algorithm In-Close4 [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ] as the framework in which to incorporate the new
inheritance method, so Section 2 is a recap of that algorithm. Section 3 is a recap of
the FCbO algorithm, describing its method of inheriting failed canonicity tests.
Section 4 describes the new method of inheriting failed canonicity tests and
incorporates it into In-Close4, creating a new algorithm, In-Close5. It should be
noted that In-Close1, In-Close2 and In-Close3 are previous versions of In-Close,
as presented in [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ]. Section 5 describes the implementation of In-Close4, FCbO
and In-Close5 on a ‘level playing field’ using the same programming
optimisations. Section 5 also shows how the new method of inheriting failed canonicity
tests can be amalgamated with existing efficiency features to further improve
performance. Section 6 presents a series of experiments and results, comparing
the performance of In-Close4, FCbO and In-Close5. Finally, Section 7 provides
some concluding remarks and ideas for further work.
2
      </p>
    </sec>
    <sec id="sec-2">
      <title>Recap of the In-Close4 Algorithm</title>
      <p>
        Below is a recap of the In-Close4 algorithm, as presented in [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ]. In-Close4
combines the efficiency of a partial-closure canonicity test [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ] with full inheritance of
the parent intent. The full inheritance is achieved by adapting and incorporating
the combined breadth-first and depth-first approach of FCbO [
        <xref ref-type="bibr" rid="ref7 ref9">7, 9</xref>
        ]. The main
cycle is completed before passing to the next level, so that all the attributes of
a parent intent can be passed down to the next level. Child intents only have to
be finished off by adding attributes that are not in the parent intent. During the
main cycle, whilst the current intent is being closed, new extents that pass the
canonicity test are stored in a queue, similar to the queue in FCbO, to be
processed after the main cycle has completed. In-Close4 also makes use of empty
intersections when the current extent is intersected with the next
attributeextent (next column) in the formal context: empty intersections are inherited so
that they can be skipped at subsequent levels in the computation and, whenever
an empty intersection occurs, the algorithm forgoes the canonicity test.
      </p>
      <p>The In-Close4 algorithm is invoked with an initial pair (A, B) = (X, ∅), where
A is a set of objects (extent) and B is a set of attributes (intent) and X is the
set of all objects in the formal context, and initial attribute y = 0. Y is the set of
all attributes in the formal context and Yj is the set of all attributes up to (but
not including) j. The algorithm is also invoked with an empty set of attributes,
P = ∅, in which to store subsequent empty intersections.</p>
      <p>Note that forgoing the canonicity test after an empty intersection means
that the algorithm is incomplete, in that it will not compute the concept (Y, ∅).
However, it is a simple task to add it afterwards, if it exists: If Y ↓ = ∅ then add
(∅, Y ) to the set of computed concepts.</p>
      <sec id="sec-2-1">
        <title>In-Close4</title>
        <p>ComputeConceptsFrom((A, B), y, P )
1 for j ← y upto n − 1 do
2 if j ∈/ B and j ∈/ P then
3 C ← A ∩ {j}↓
4 if C 6= ∅ then
5 if C = A then
6 B ← B ∪ {j}
7 else
8
9
if B ∩ Yj = C↑j then</p>
        <p>PutInQueue(C, j)</p>
        <p>A line by line explanation of In-Close4 is as follows:</p>
        <p>Line 1 - Iterate across the formal context, from a starting attribute y up to
attribute n − 1, where n is the number of attributes in the context.</p>
        <p>Line 2 - Skip attributes already in B. Because intents inherit all of their
parent’s attributes, these can be skipped. Also skip any attributes in P as these
are inherited empty intersections - if the parent extent resulted in an empty
intersection, so will its children since they are all subsets of the parent.</p>
        <p>Line 3 - Form an extent, C, by intersecting the current extent, A, with the
next attribute-extent (column of objects) in the context.</p>
        <p>Line 4 - If the extent, C, is not empty...</p>
        <p>Line 5 - If the extent, C, equals the extent of the concept whose intent is
currently being closed, A, then...</p>
        <p>Line 6 - ...add the current attribute, j, to the intent being closed, B.</p>
        <p>
          Line 7 - Otherwise, test the canonicity using the partial-closure canonicity
test [
          <xref ref-type="bibr" rid="ref1">1</xref>
          ]: ↑ is the standard closure operator in FCA and ↑j is a modification
meaning “close up to, but not including, attribute j”.
        </p>
        <p>Line 8 - If the canonicity test is passed...</p>
        <p>Line 9 - ...place the new extent, C, and the location where it was found, j,
in a queue for later processing.</p>
        <p>Line 10 - If the extent, C, is empty...</p>
        <p>Line 11 - ... add the current attribute to P so that the empty intersection
can be inherited.</p>
        <p>Line 12 - Pass concept (A, B) to the notional procedure ProcessConcept to
process it in some way (for example, storing it in a data base of concepts).</p>
        <p>Line 13 - Store P in Q ready to pass the attributes resulting in empty
intersections to the next level.</p>
        <p>Line 14 - The queue is processed by obtaining from the queue each new
extent and the location it was found.</p>
        <p>Line 15 - Each new partial intent, D, inherits all the attributes from its
completed parent intent, B, along with the attribute, j, where its extent was
found.</p>
        <p>Line 16 - Recursively call ComputeConceptsFrom to compute child concepts
from j + 1 and to complete the intent D.
3</p>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>Recap of the FCbO Algorithm</title>
      <p>
        Below is a recap of the FCbO algorithm [
        <xref ref-type="bibr" rid="ref7 ref9">7, 9</xref>
        ] as presented in [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ]. FCbO
introduced the feature of inherited canonicity test failures to improve the performance
of CbO-type algorithms, along with the combined breadth/depth first approach
to enable full inheritance of parent intents. The inheritance of test failures is
achieved by recording intents that are not canonical as N j s, where j is the
current attribute, thus enabling subsequent levels to compare these failed intents
against the current one and thus avoid the computation of a repeated concept
without the need for the original canonicity test. FCbO is invoked with the
initial concept (A, B) = (X, X↑), initial attribute y = 0 and a set of empty N ys,
{N y = ∅ | y ∈ Y }.
      </p>
      <p>Line 1 - Pass concept (A, B) to the notional procedure ProcessConcept to
process it in some way (for example, storing it in a set of concepts).</p>
      <p>Line 2 - Iterate across the context, from starting attribute y up to attribute
n − 1.</p>
      <p>Line 3 - M j is set to the latest intent that failed the canonicity test at
attribute j, N j .</p>
      <p>Line 4 - Skip attributes in B and those that have an inherited record of
failure.</p>
      <sec id="sec-3-1">
        <title>FCbO</title>
        <p>ComputeConceptsFrom((A, B), y, {N y | y ∈ Y })
1 ProcessConcept((A, B))
2 for j ← y upto n − 1 do
3 M j ← N j
4 if j ∈/ B and N j ∩ Yj ⊆ B ∩ Yj then
5 C ← A ∩ {j}↓
6 D ← C↑
7 if B ∩ Yj = D ∩ Yj then
8 PutInQueue ((C, D), j)
9 else
10</p>
        <p>M j ← D
11 while GetFromQueue((C, D), j) do
12 ComputeConceptsFrom((C, D), j + 1, {M y | y ∈ Y })</p>
        <p>Line 5 - Otherwise, form an extent, C, by intersecting the current extent, A,
with the next column of objects in the context.</p>
        <p>Line 6 - Close the extent to form an intent, D.</p>
        <p>Line 7 - Perform the canonicity test.</p>
        <p>Line 8 - If the concept is a new one, store it in a queue along with the
attribute it was computed at.</p>
        <p>Line 10 - Otherwise set the record of failure for attribute j, M j, to the intent
that failed the canonicity test.</p>
        <p>Line 11 - Get each stored concept from the queue...</p>
        <p>Line 12 - ...and pass it to the next level, along with the stored starting
attribute for the next level and the failed intents from this level.
4</p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>A New Method of Inheriting Failed Canonicity Tests</title>
      <p>
        The method of inheriting failed canonicity tests employed by FCbO requires the
manipulation and storage of a two-dimensional array to represent intents that
fail the canonicity test. A total of n intents are required, and, although the use of
pointers in a optimised implementation avoids the need for copying intents, they
still need to be computed and stored. This results in computational overheads
so that, even though a significant number of canonicity test are avoided [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ],
algorithms such as In-Close4 are still able to outperform FCbO [
        <xref ref-type="bibr" rid="ref2 ref4">2, 4</xref>
        ].
      </p>
      <p>However, it is possible to obtain the inheritance of failed canonicity tests
with a simpler method. Firstly consider the criteria for failure in In-Close4: the
test will fail if there exists an attribute in C↑j that is not in B ∩ Yj. In other
words, when there is an attribute before j (but not in the current intent, B)
who’s attribute-extent contains the extent, C - in which case the extent, C,
will already have been computed. Now consider the starting attribute, y, for
the current cycle (Line 1 of In-Close4). Let us say, in a failed canonicity test,
that the smallest attribute in C↑j that is not in B ∩ Yj is i. If i ≥ y then an
extent, H, where C ⊆ H, will have been discovered in the current cycle at i (and
be waiting in the current queue). And there may be other extents, discovered
after i but before j that are also supersets of C and also in the queue. Thus, if
i ≥ y, the current attribute, j, will be required at the next level to be examined
by the children in the queue: C may be canonical with respect to one of the
children or j may be an attribute in the intent of a child and thus required to be
added. However, if i &lt; y, the concept with extent C and its children will have
already been computed and processed. Thus no children in the current queue,
or subsequent children, need examine j. In other words, if i &lt; y then j can be
inherited as a canonicity test failure - all subsequent children can skip j in the
cycle. All that is required is to maintain a set of such attributes that can be
passed down to the next level in the algorithm.</p>
      <p>The new algorithm, In-Close5, below, is In-Close4 with the new method of
inheriting failed canonicity tests added. It is invoked in the same way as
InClose4 but with the addition of an initially empty set of attributes, N = ∅, in
which to store canonicity test failures.</p>
      <sec id="sec-4-1">
        <title>In-Close5</title>
        <p>ComputeConceptsFrom((A, B), y, P, N )
1 for j ← y upto n − 1 do
2 if j ∈/ B and j ∈/ P and j ∈/ N then
3 C ← A ∩ {j}↓
4 if C 6= ∅ then
5 if C = A then
6 B ← B ∪ {j}
7 else
8 if B ∩ Yj = C↑j then
9 PutInQueue(C, j)
10 else
11
12
if min(C↑j ) &lt; y then</p>
        <p>N ← N ∪ {j}
15 ProcessConcept((A, B))
16 Q ← P
17 M ← N
18 while GetFromQueue(C, j) do
19 D ← B ∪ {j}
20 ComputeConceptsFrom((C, D), j + 1, Q, M )</p>
        <sec id="sec-4-1-1">
          <title>The new lines in In-Close5 are as follows:</title>
          <p>Line 2 - As well as skipping inherited attributes in the intent, j ∈/ B, and
inherited empty intersections, j ∈/ P , the algorithm now also skips inherited
canonicity test failures, j ∈/ N .</p>
          <p>Line 11 - If the canonicity test (Line 8) is failed, a test is carried out
comparing the smallest attribute in C↑j with y. If the attribute is smaller than y
then...</p>
          <p>Line 12 - ...j is added to the set of canonicity test failures, N .</p>
          <p>Line 17 - Store N in M ready to pass the canonicity test failures to the next
level.
5</p>
        </sec>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>Implementation</title>
      <p>The three algorithms, In-Close4, FCbO and In-Close5, were implemented in
ANCII C using the same data structures, data pre-processing and level of
optimisation to create a ‘level playing field’ for comparing their performance. The
key optimisations are described below.</p>
      <p>The use of Bit-Arrays Implementations of CbO-type algorithms, such as
In-Close and FCbO, typically use a bit-array to represent the formal context.
This allows operations on the formal context, such as closure operations, to
be implemented using bit-wise operators in the manner of fine-grained parallel
processing. In a typical 64-bit architecture, this means that 64 cells of the formal
context can be operated on simultaneously. Using bits to represent cells of the
formal context also allows more of the context to be retained in cache memory.</p>
      <sec id="sec-5-1">
        <title>Using a Local Boolean Copy of the Current Intent Typical implementa</title>
        <p>tions of CbO-type algorithms maintain a global data structure to store integer
representations of concept intents (integers mapping to formal attributes) but,
at the same time, also use a Boolean (bit-array) representation of the current
intent to facilitate an efficient implementation of the test for inherited attributes,
j ∈/ B.</p>
      </sec>
      <sec id="sec-5-2">
        <title>Efficient Implementation of the Partial-Closure Canonicity Test in</title>
        <p>In-Close Algorithms In practice, it is not necessary to always close the new
extent up to the current attribute. It is only necessary to find the first instance
where B ∩ Yj and C↑j do not agree. Thus failure is typically detected before
j is reached, thus saving additional time. In FCbO, however, a full-closure, C↑
is always required because, if the test is passed, it provides the closure of the
concept intent, or, if the test is failed, it provides the failed intent to be stored in
M j . In In-Close, new concept intents are closed at the next level, during the main
cycle, whenever C = A by B ← B ∪{j} (Lines 5 and 6 of In-Close4, for example).
Furthermore, given that the test C = A is provided at no computational cost, as
a by-product of the intersection in C ← A ∩ {j}↓, the overheads of the closure
are close to zero. This also means that savings are made by In-Close algorithms
when canonicity tests succeed. Here, the partial closure, C↑j is carried out up
to j, compared to the full closure, C↑, in FCbO.</p>
      </sec>
      <sec id="sec-5-3">
        <title>Amalgamation of Efficiency Features in In-Close5 In implementation, the</title>
        <p>set of inherited empty intersections, the set of inherited canonicity test failures
and the local, Boolean, copy of the current intent can be amalgamated into a
single bit-array, in effect reducing the test in Line 2 of In-Close5, j ∈/ B And j ∈/ P
And j ∈/ N to a single test, j ∈/ Z, where Z = B ∪ P ∪ N . Lines 6, 12 and 14 will
all become Z ← Z ∪{j}, thus updating the same bit-array in the implementation
(of course the update of the global set of intents in the implementation, required
by Line 6, remains unchanged). Amalgamating the three sets of attributes also
means there are overhead savings made from reduced parameter passing.
6</p>
      </sec>
    </sec>
    <sec id="sec-6">
      <title>Evaluation of Performance</title>
      <p>In this section, In-Close4, FCbO and In-Close5 are evaluated by comparing their
performance over a varied range of data sets. The experiments are divided into
three groups: 1) real data sets, 2) artificial data sets, and 3) randomised data
sets. In each case, the time taken to compute all formal concepts is measured
along with the number of canonicity tests carried out.</p>
      <p>The experiments were conducted on a standard 64-bit Intel architecture,
using a PC with an Intel Core i7-2600 3.40GHz CPU and 8GB of RAM. To
cater for any inconsistency of system performance, due to background system
processes, for example, each experiment was conducted multiple times and the
average time taken for each.</p>
      <p>
        Real Data Set Experiments. Four real data sets were used in the
experiments: Mushroom, Adult and Internet Ads, taken from the UCI Machine
Learning Repository [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ] and Student, an anonymised data set from an internal student
experience survey carried out at Sheffield Hallam University, UK. The data sets
were selected to represent a broad range of features, in terms of size and density,
and the UCI ones, in particular, are well known and used in FCA work.
      </p>
      <p>The results of the experiments are given in Table 1 (timings) and Table 2
(canonicity tests).</p>
      <p>In-Close5 was fastest for the Mushroom, Adult and Student data sets, and
equal fastest, with In-Close4, for the Internet Ads data set. In-Close5 used the
fewest canonicity tests for the Adult and Internet Ads data sets and was not far
behind FCbO for the Mushroom and Student data sets.</p>
      <p>Artificial Data Set Experiments. Artificial data sets were used that,
although randomised, the randomisation was constrained by properties of real
data sets, such as many-valued attributes having a pre-defined number of unique
values. Three data sets, M7X10G120K, M10X30G120K and T10I4D100K, were
used to provide a range of features in terms of size and density.</p>
      <p>The timing results of the artificial data set experiments are given in Table
3 and the comparison of the number of canonicity tests carried out is given in
Table 4. For all three data sets, In-Close5 was quickest and performed the fewest
canonicity tests.
Random Data Set Experiments. Three series of random data experiments
were carried out, testing the effect of variation of the number of attributes,
context density, and number of objects, respectively:
– Attributes series - with 5% density and 5,000 objects, the number of
attributes was varied between 300 and 1,000. The number of concepts varied
from approximately 1,000,000 to 22,000,000.
– Objects series - with 5% density and 200 attributes, the number of objects
was varied between 30,000 and 100,000. The number of concepts varied from
approximately 4,000,000 to 22,000,000.
– Density series - with 200 attributes and 10,000 objects, the density of 1s in
the context was varied between 3 and 10%. The number of concepts varied
from approximately 200,000 to 19,000,000.</p>
      <p>The results of the random data set timings are shown in the plots below. In all
three series, In-Close5 performed the fewest canonicity tests and was fastest. It
is interesting to note that In-Close4 often performed fewer canonicity tests than
FCbO (particularly apparent in the Object series). One might therefore deduce
that the Object series data sets gave rise to large numbers of empty intersections
- perhaps not surprising as the number of objects is increased at a relatively low
density in a randomised formal context.</p>
      <sec id="sec-6-1">
        <title>Attribute Series (time) Attribute Series (tests) 300</title>
        <p>)
ec 200
s
(
e
im100
T
0</p>
      </sec>
      <sec id="sec-6-2">
        <title>FCbO In-Close4 In-Close5</title>
        <p>8
10 10
×
s
t
s
e
t
ty 5
i
c
i
n
o
n
aC 0
#</p>
      </sec>
      <sec id="sec-6-3">
        <title>FCbO</title>
        <p>In-Close4
In-Close5
4 6 8
#Attributes ×100
10
4 6 8
#Attributes ×100
10</p>
      </sec>
      <sec id="sec-6-4">
        <title>Object Series (time) Object Series (tests) 30</title>
        <p>
          )
c
e
(s 20
e
m
i
T10
0
20
)
c
e
s
(
e 10
m
i
T
0
In conclusion, the performance of In-Close5 clearly demonstrates the efficiency
savings provided by the new method of inheriting canonicity test failures when
its results are compared to those of In-Close4 (the same algorithm but without
canonicity test failure inheritance). In-Close5 clearly outperforms FCbO, the
algorithm that features the existing method of inheriting canonicity test failures.
Although FCbO’s method inherits more test failures than the new method, the
simplicity of the new method warrants its attention as a useful contribution
to the area. It was shown in In-Close3 [
          <xref ref-type="bibr" rid="ref2">2</xref>
          ] that incorporating FCbO’s method
gave little improvement of performance, due to the computational overheads
of implementing it, whereas it is show here that the incorporation of the new
method does improve performance significantly.
        </p>
        <p>An implementation of In-Close5 is available, free and open source, at https:
//sourceforge.net/projects/inclose/.</p>
      </sec>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <string-name>
            <surname>Andrews</surname>
            ,
            <given-names>S.:</given-names>
          </string-name>
          <article-title>A partial-closure canonicity test to increase the efficiency of cbo-type algorithms</article-title>
          .
          <source>In: Proceedings of the 21st International Conference on Conceptual Structures</source>
          . pp.
          <fpage>37</fpage>
          -
          <lpage>50</lpage>
          . Springer (
          <year>2014</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2.
          <string-name>
            <surname>Andrews</surname>
            ,
            <given-names>S.:</given-names>
          </string-name>
          <article-title>A best-of-breed approach for designing a fast algorithm for computing fixpoints of galois connections</article-title>
          .
          <source>Information Sciences</source>
          <volume>295</volume>
          ,
          <fpage>633</fpage>
          -
          <lpage>649</lpage>
          (
          <year>2015</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <surname>Andrews</surname>
            ,
            <given-names>S.:</given-names>
          </string-name>
          <article-title>In-close2, a high performance formal concept miner</article-title>
          . In: Andrews,
          <string-name>
            <given-names>S.</given-names>
            ,
            <surname>Polovina</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            ,
            <surname>Hill</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            ,
            <surname>Akhgar</surname>
          </string-name>
          ,
          <string-name>
            <surname>B</surname>
          </string-name>
          . (eds.)
          <source>Conceptual Structures for Discovering Knowledge - Proceedings of the 19th International Conference on Conceptual Structures (ICCS)</source>
          . pp.
          <fpage>50</fpage>
          -
          <lpage>62</lpage>
          . Springer (
          <year>2011</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4.
          <string-name>
            <surname>Andrews</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          :
          <article-title>Making use of empty intersections to improve the performance of cbotype algorithms</article-title>
          .
          <source>In: Proceedings of the 14th International Conference on Formal Concept Analysis</source>
          . pp.
          <fpage>56</fpage>
          -
          <lpage>71</lpage>
          . Springer (
          <year>2017</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5.
          <string-name>
            <surname>Frank</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Asuncion</surname>
            ,
            <given-names>A.:</given-names>
          </string-name>
          <article-title>UCI machine learning repository</article-title>
          : http://archive.ics.uci.edu/ml (
          <year>2010</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6.
          <string-name>
            <surname>Krajca</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Outrata</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Vychodil</surname>
            ,
            <given-names>V.</given-names>
          </string-name>
          :
          <article-title>Parallel recursive algorithm for FCA</article-title>
          . In: Belohavlek,
          <string-name>
            <given-names>R.</given-names>
            ,
            <surname>Kuznetsov</surname>
          </string-name>
          , S. (eds.)
          <source>Proceedings of Concept Lattices and their Applications</source>
          ,
          <year>2008</year>
          . pp.
          <fpage>71</fpage>
          -
          <lpage>82</lpage>
          (
          <year>2008</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7.
          <string-name>
            <surname>Krajca</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Vychodil</surname>
            ,
            <given-names>V.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Outrata</surname>
            ,
            <given-names>J.:</given-names>
          </string-name>
          <article-title>Advances in algorithms based on CbO</article-title>
          . In: Kryszkiewicz,
          <string-name>
            <given-names>M.</given-names>
            ,
            <surname>Obiedkov</surname>
          </string-name>
          ,
          <string-name>
            <surname>S. (eds.) CLA</surname>
          </string-name>
          <year>2010</year>
          . pp.
          <fpage>325</fpage>
          -
          <lpage>337</lpage>
          . University of Sevilla (
          <year>2010</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          8.
          <string-name>
            <surname>Kuznetsov</surname>
            ,
            <given-names>S.O.</given-names>
          </string-name>
          :
          <article-title>Mathematical aspects of concept analysis</article-title>
          .
          <source>Mathematical Science</source>
          <volume>80</volume>
          (
          <issue>2</issue>
          ),
          <fpage>1654</fpage>
          -
          <lpage>1698</lpage>
          (
          <year>1996</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9.
          <string-name>
            <surname>Outrata</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Vychodil</surname>
            ,
            <given-names>V.</given-names>
          </string-name>
          :
          <article-title>Fast algorithm for computing fixpoints of Galois connections induced by object-attribute relational data</article-title>
          .
          <source>Information Sciences</source>
          <volume>185</volume>
          (
          <issue>1</issue>
          ),
          <fpage>114</fpage>
          -
          <lpage>127</lpage>
          (
          <year>Feb 2012</year>
          ). https://doi.org/10.1016/j.ins.
          <year>2011</year>
          .
          <volume>09</volume>
          .023
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>