{"id":50349066,"url":"https://github.com/smartfca/caspailleur","last_synced_at":"2026-05-29T20:02:30.245Z","repository":{"id":104721980,"uuid":"581550953","full_name":"smartFCA/caspailleur","owner":"smartFCA","description":"Minimalistic python package for mining many concise data representations. Part of SmartFCA project.","archived":false,"fork":false,"pushed_at":"2025-05-09T11:26:39.000Z","size":1002,"stargazers_count":5,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-04T15:34:09.701Z","etag":null,"topics":["fca","itemset-mining","python"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/smartFCA.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-12-23T14:20:33.000Z","updated_at":"2025-05-09T11:26:43.000Z","dependencies_parsed_at":"2025-05-05T17:56:08.802Z","dependency_job_id":null,"html_url":"https://github.com/smartFCA/caspailleur","commit_stats":null,"previous_names":["smartfca/caspailleur"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/smartFCA/caspailleur","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/smartFCA%2Fcaspailleur","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/smartFCA%2Fcaspailleur/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/smartFCA%2Fcaspailleur/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/smartFCA%2Fcaspailleur/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/smartFCA","download_url":"https://codeload.github.com/smartFCA/caspailleur/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/smartFCA%2Fcaspailleur/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33668192,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-29T02:00:06.066Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["fca","itemset-mining","python"],"created_at":"2026-05-29T20:02:30.100Z","updated_at":"2026-05-29T20:02:30.228Z","avatar_url":"https://github.com/smartFCA.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cimg src=\"https://github.com/smartFCA/caspailleur/blob/main/logo/caspailleur_logo_v1.png?raw=True\" /\u003e\n\n[![PyPi](https://img.shields.io/pypi/v/caspailleur)](https://pypi.org/project/caspailleur)\n[![GitHub Workflow](https://img.shields.io/github/actions/workflow/status/smartFCA/caspailleur/python-package.yml?logo=github)](https://github.com/smartFCA/caspailleur/actions/workflows/python-package.yml)\n[![Licence](https://img.shields.io/github/license/smartFCA/caspailleur)](https://github.com/smartFCA/caspailleur/blob/main/LICENSE)\n[![LORIA](https://img.shields.io/badge/Made_in-LORIA-61acdf)](https://www.loria.fr/)\n[![SmartFCA](https://img.shields.io/badge/Funded_by-SmartFCA-537cbb)](https://www.smartfca.org)\n\nCaspailleur is a python package for mining concepts and implications in binary data with FCA framework.\nPart of [SmartFCA](https://www.smartfca.org) ANR project.\n\n## Get started\n\nThe stable version of the package can be installed from PyPI with:\n\n```console\npip install caspailleur\n```\n\nand the latest version of the package can be installed from GitHub repository:\n\n```console\npip install caspailleur@git+https://github.com/smartFCA/caspailleur\n```\n\n## Analysis example\n\n### Glossary\n\nThe field of Formal Concept Analysis has many mathematical terms and some conflicting notation traditions.\nHere is the glossary used throughout the `caspailleur` package: [Glossary.md](https://github.com/smartFCA/caspailleur/blob/main/Glossary.md).\n\n### Data description\n\nLet us study the \"Famous Animals\" dataset from [FCA repository](https://fcarepository.org):\n\n```python\nimport caspailleur as csp\ndf, meta = csp.io.from_fca_repo('famous_animals_en')\n\nprint(meta)\nprint(df.replace({True: 'X', False: ''}))\n```\n\u003e {\n\u003e **'title'**: 'Famous Animals',\\\n\u003e **'source'**: 'Priss, U. (2006), Formal concept analysis in information science. Ann. Rev. Info. Sci. Tech., 40: 521-543. p.525',\\\n\u003e **'size'**: {'objects': 5, 'attributes': 6},\\\n\u003e **'language'**: 'English', \\\n\u003e **'description'**: 'famous animals and their characteristics' }\n\n|                   | cartoon   | real   | tortoise   | dog   | cat   | mammal   |\n|:------------------|:----------|:-------|:-----------|:------|:------|:---------|\n| Garfield          | X         |        |            |       | X     | X        |\n| Snoopy            | X         |        |            | X     |       | X        |\n| Socks             |           | X      |            |       | X     | X        |\n| Greyfriar's Bobby |           | X      |            | X     |       | X        |\n| Harriet           |           | X      | X          |       |       |          |\n\nThe received `df` object is a pandas dataframe.\nOther supported context data types can be found in [Supported data formats](#supported-data-formats) section.\nCaspailleur works fast enough with datasets of hundreds of objects and dozens of attributes.\nHere, we choose a tiny dataset for illustrative purposes.\n\n\u003e [!TIP]\n\u003e Caspailleur package can only work with binary data (and is optimised for this). \n\u003e You can consult [Paspailleur](https://github.com/EgorDudyrev/paspailleur) package \n\u003e that extends Caspailleur functionality for complex non-binary data.\n\n\n### Mining concepts\nNow we can find all concepts in the data:\n\n```python\nconcepts_df = csp.mine_concepts(df)\n\nprint(concepts_df[['extent', 'intent']].map(', '.join))\n```\n\n_\u003cdetails\u003e\u003csummary\u003eConcepts table (13 rows)\u003c/summary\u003e_\n\u003cp\u003e\n\n|   concept_id | extent                                              | intent                                    |\n|-------------:|:----------------------------------------------------|:------------------------------------------|\n|            0 | Greyfriar's Bobby, Snoopy, Harriet, Socks, Garfield |                                           |\n|            1 | Greyfriar's Bobby, Socks, Garfield, Snoopy          | mammal                                    |\n|            2 | Greyfriar's Bobby, Socks, Harriet                   | real                                      |\n|            3 | Garfield, Snoopy                                    | cartoon, mammal                           |\n|            4 | Greyfriar's Bobby, Socks                            | mammal, real                              |\n|            5 | Greyfriar's Bobby, Snoopy                           | dog, mammal                               |\n|            6 | Socks, Garfield                                     | cat, mammal                               |\n|            7 | Harriet                                             | tortoise, real                            |\n|            8 | Snoopy                                              | cartoon, dog, mammal                      |\n|            9 | Garfield                                            | cartoon, cat, mammal                      |\n|           10 | Greyfriar's Bobby                                   | mammal, dog, real                         |\n|           11 | Socks                                               | cat, mammal, real                         |\n|           12 |                                                     | mammal, cartoon, cat, dog, real, tortoise |\n\n\u003c/p\u003e\u003c/details\u003e\n\nThe number of concepts is exponential to the number of objects and attributes in the data.\nTo find only the most interesting concepts, specify `min_support`, `min_delta_stability` and/or `n_stable_concepts` parameters:\n```python\nconcepts_df = csp.mine_concepts(\n  df, min_support=3, min_delta_stability=1,\n  to_compute=['intent', 'keys', 'support', 'delta_stability', 'sub_concepts']\n)\n\nprint(concepts_df)\n```\n\n|   concept_id | intent     | keys         |   support |   delta_stability | sub_concepts   |\n|-------------:|:-----------|:-------------|----------:|------------------:|:---------------|\n|            0 | set()      | [set()]      |         5 |                 1 | {1, 2}         |\n|            1 | {'mammal'} | [{'mammal'}] |         4 |                 2 | set()          |\n|            2 | {'real'}   | [{'real'}]   |         3 |                 1 | set()          |\n\n\n### Mining implications\n\nFor many datasets, the number of concepts is too large to be read by hand.\nLuckily, relationships between attributes can be described via implication bases whose number is usually much smaller.\n\n```python\nimplications_df = csp.mine_implications(df)\n\nprint(implications_df[['premise', 'conclusion', 'support']])\n```\n_\u003cdetails\u003e\u003csummary\u003eImplications table (4 rows)\u003c/summary\u003e_\n\u003cp\u003e\n\n|   implication_id | premise      | conclusion   |   support |\n|-----------------:|:-------------|:-------------|----------:|\n|                0 | {'cartoon'}  | {'mammal'}   |         2 |\n|                1 | {'tortoise'} | {'real'}     |         1 |\n|                2 | {'dog'}      | {'mammal'}   |         2 |\n|                3 | {'cat'}      | {'mammal'}   |         2 |\n\n\u003c/p\u003e\u003c/details\u003e\n \nWe can read the implications in the table and find out dependencies in the data. For example:\n- every famous cartoon animal is a mammal\\\n(from impl. 0: _cartoon -\u003e mammal_);\n- one can find famous tortoises only in real life\\\n(from impl. 1: _tortoise -\u003e real_);\n\nSet `min_support=0` to see implications on contradicting subsets of attributes, e.g.:\n- nobody is a dog and a cat at the same time  \\\n  (from: _dog, cat -\u003e ..._ with support 0).\n  \nNote, however, that there can be _a lot of_ implications with 0 support. \nAnd so their computation might take a lot of time.\n\n  \nIf finding full implication basis takes too much time, one can mine only a part of columns and implications:\n```python\nimplications_df = csp.mine_implications(\n  df, basis_name='Canonical', unit_base=True,\n  to_compute=['premise', 'conclusion', 'extent'],\n  min_support=2,\n)\n\nprint(implications_df)\n```\n|   implication_id | premise     | conclusion   | extent                          |\n|-----------------:|:------------|:-------------|:--------------------------------|\n|                0 | {'cat'}     | mammal       | {'Socks', 'Garfield'}           |\n|                1 | {'dog'}     | mammal       | {\"Greyfriar's Bobby\", 'Snoopy'} |\n|                2 | {'cartoon'} | mammal       | {'Garfield', 'Snoopy'}          |\n\n\n\nThe supported bases are _Canonical_ basis (a.k.a. _Pseudo-Intent_ or _Duquenne-Guigues_ basis)\nand _Canonical Direct_ basis (a.k.a. _Proper Premise_ or _Karell_ basis).\nEvery basis can also be transformed in a unit-base where every conclusion consists of only one attribute.\n\n### Mining descriptions\n\nFinally, Caspailleur can output all descriptions in the data and their characteristics.\nBut note that the `number of descriptions` = 2^`number of attributes`.\n\n```python\ndescriptions_df = csp.mine_descriptions(df)\n\nprint('__n. attributes:__', df.shape[1])\nprint('__n. descriptions:__', len(descriptions_df))\nprint('__columns:__', ', '.join(descriptions_df.columns))\nprint(descriptions_df[['description', 'support', 'is_key']].head(3))\n```\n\u003e __n. attributes:__ 6 \\\n\u003e __n. descriptions:__ 64\n \n\u003e __columns:__ description, extent, intent, support, delta_stability, is_closed, is_key, is_passkey, is_proper_premise, is_pseudo_intent\n\n\n|   description_id | description |   support | is_key   |\n|-----------------:|:------------|----------:|:---------|\n|                0 | set()       |         5 | True     |\n|                1 | {cartoon}   |         2 | True     |\n|                2 | {real}      |         3 | True     |\n\n\n### Visualising concept lattice\n\nCaspailleur package does not support concept lattice visualisation (this task deserves its own package).\nFor a basic concept lattice visualisation, one can produce a `mermaid` diagram code.\nMermaid diagrams can be visualised via https://mermaid.live/ service or can be embedded in GitHub flavored markdown.\n\n```python\nconcepts_df = csp.mine_concepts(df, min_support=2)\n\n# manually define what to show in the nodes of the diagram\nnew_intent_labels = ('\u003cb\u003e' + concepts_df['new_intent'].map(sorted).map(', '.join) + '\u003c/b\u003e').replace('\u003cb\u003e\u003c/b\u003e', '')\nold_intent_labels = (concepts_df['intent'] - concepts_df['new_intent']).map(sorted).map(', '.join)\nintent_labels = (new_intent_labels + ';' + old_intent_labels).map(lambda l: ', '.join(l.strip(';').split(';')))\nextent_labels = concepts_df['extent'].map(sorted).map(', '.join)\n\nnode_labels = intent_labels + '\u003cbr\u003e\u003cbr\u003e' + extent_labels\nnode_labels = [l.replace(' ', '\u0026nbsp') for l in node_labels] # replace space with non-breakable space for better Mermaid visualisation\n\ndiagram_code = csp.io.to_mermaid_diagram(node_labels, concepts_df['previous_concepts'])\nprint(diagram_code)\n```\n\n```mermaid\nflowchart TD\nA[\"\u003cbr\u003e\u003cbr\u003eGarfield,\u0026nbspGreyfriar's Bobby,\u0026nbspHarriet,\u0026nbspSnoopy,\u0026nbspSocks\"];\nB[\"\u003cb\u003emammal\u003c/b\u003e\u003cbr\u003e\u003cbr\u003eGarfield,\u0026nbspGreyfriar's\u0026nbspBobby,\u0026nbspSnoopy,\u0026nbspSocks\"];\nC[\"\u003cb\u003ereal\u003c/b\u003e\u003cbr\u003e\u003cbr\u003eGreyfriar's\u0026nbspBobby,\u0026nbspHarriet,\u0026nbspSocks\"];\nD[\"\u003cb\u003ecartoon\u003c/b\u003e,\u0026nbspmammal\u003cbr\u003e\u003cbr\u003eGarfield,\u0026nbspSnoopy\"];\nE[\"mammal,\u0026nbspreal\u003cbr\u003e\u003cbr\u003eGreyfriar's\u0026nbspBobby,\u0026nbspSocks\"];\nF[\"\u003cb\u003edog\u003c/b\u003e,\u0026nbspmammal\u003cbr\u003e\u003cbr\u003eGreyfriar's\u0026nbspBobby,\u0026nbspSnoopy\"];\nG[\"\u003cb\u003ecat\u003c/b\u003e,\u0026nbspmammal\u003cbr\u003e\u003cbr\u003eGarfield,\u0026nbspSocks\"];\nA --- B;\nA --- C;\nB --- D;\nB --- E;\nB --- F;\nB --- G;\nC --- E;\n\n```\n_If, above, you see the source of the diagram, visit the [GitHub version](https://github.com/smartFCA/caspailleur)\nof this ReadMe for the diagram itself.\nIf, above, you see the diagram, go to the source code of the ReadMe for the diagram code._\n\n \n\n## Supported data formats\n\nA formal context can be defined using many data types.\n\nBelow is the list of context types and examples acceptable by high-level `caspailleur` functions:\n_\u003cdetails\u003e\u003csummary\u003eSupported data types\u003c/summary\u003e_\n\u003cp\u003e\n\n### PandasContextType\nA binary Pandas dataframe.\nCan be obtained via `csp.io.to_pandas` function.\n\nExample:\n```python\nprint(csp.io.to_pandas(df))\n```\n|                   |   cartoon |   real |   tortoise |   dog |   cat |   mammal |\n|:------------------|----------:|-------:|-----------:|------:|------:|---------:|\n| Garfield          |         True |      False |          False |     False |     True |        True |\n| Snoopy            |         True |      False |          False |     True |     False |        True |\n| Socks             |         False |      True |          False |     False |     True |        True |\n| Greyfriar's Bobby |         False |      True |          False |     True |     False |        True |\n| Harriet           |         False |      True |          True |     False |     False |        False |\n\n### ItemsetContextType\nA list of sets of indices of True columns in the data.\nCan be obtained via `csp.io.to_itemsets` function.\n\nExample:\n```python\nprint(*csp.io.to_itemsets(df), sep='\\n')\n```\n\u003e {0, 4, 5} \u003cbr\u003e\n\u003e {0, 3, 5} \u003cbr\u003e\n\u003e {1, 4, 5} \u003cbr\u003e\n\u003e {1, 3, 5} \u003cbr\u003e\n\u003e {1, 2}\n\n\n### NamedItemsetContextType\nA triplet: (_ItemsetContextType_, object names, attribute names).\nCan be obtained via `csp.io.to_named_itemsets` function.\n\nExample:\n```python\nprint(*csp.io.to_named_itemsets(df), sep='\\n')\n```\n\u003e [{0, 4, 5}, {0, 3, 5}, {1, 4, 5}, {1, 3, 5}, {1, 2}] \u003cbr\u003e\n\u003e ['Garfield', 'Snoopy', 'Socks', \"Greyfriar's Bobby\", 'Harriet'] \u003cbr\u003e\n\u003e ['cartoon', 'real', 'tortoise', 'dog', 'cat', 'mammal']\n\n\n### BitarrayContextType\nA list of bitarrays where every bitarray represents \"active\" attributes in object's description\nCan be obtained via `csp.io.to_bitarrays` function;\n\nExample:\n```python\nprint(*csp.io.to_bitarrays(df), sep='\\n')\n```\n\u003e bitarray('100011') \u003cbr\u003e\n\u003e bitarray('100101') \u003cbr\u003e\n\u003e bitarray('010011') \u003cbr\u003e\n\u003e bitarray('010101') \u003cbr\u003e\n\u003e bitarray('011000')\n\n### NamedBitarrayContextType\nA triplet: (_BitarrayContextType_, object names, attribute names).\nCan be obtained via `csp.io.to_named_bitarrays` function;\n\nExample:\n```python\nprint(*csp.io.to_named_bitarrays(df), sep='\\n')\n```\n\u003e [bitarray('100011'), bitarray('100101'), bitarray('010011'), bitarray('010101'), bitarray('011000')] \u003cbr\u003e\n\u003e ['Garfield', 'Snoopy', 'Socks', \"Greyfriar's Bobby\", 'Harriet'] \u003cbr\u003e\n\u003e ['cartoon', 'real', 'tortoise', 'dog', 'cat', 'mammal']\n\n### BoolContextType\nA list of object's descriptions where every description is a list of bool values.\nCan be obtained via `csp.io.to_bools` function;\n\nExample:\n```python\nprint(*csp.io.to_bools(df), sep='\\n')\n```\n\u003e [True, False, False, False, True, True] \u003cbr\u003e\n\u003e [True, False, False, True, False, True] \u003cbr\u003e\n\u003e [False, True, False, False, True, True] \u003cbr\u003e\n\u003e [False, True, False, True, False, True] \u003cbr\u003e\n\u003e [False, True, True, False, False, False]\n\n\n\n### NamedBoolContextType\nA triplet: (_BoolContextType_, object names, attribute names).\nCan be obtained via `csp.io.to_named_bools` function;\n\nExample:\n```python\nprint(*csp.io.to_named_bools(df), sep='\\n')\n```\n\u003e [[True, False, False, False, True, True], [True, False, False, True, False, True], [False, True, False, False, True, True], [False, True, False, True, False, True], [False, True, True, False, False, False]]\u003cbr\u003e\n\u003e ['Garfield', 'Snoopy', 'Socks', \"Greyfriar's Bobby\", 'Harriet']\u003cbr\u003e\n\u003e ['cartoon', 'real', 'tortoise', 'dog', 'cat', 'mammal']\n\n### DictContextType\nA dictionary where every key is an object's name and every value if object's description represented with sets of names of attributes.\nCan be obtained via `csp.io.to_dictionary` function.\n\nExample:\n```python\nprint(csp.io.to_dictionary(df))\n```\n\u003e {'Garfield': {'cartoon', 'mammal', 'cat'},\u003cbr\u003e \n\u003e 'Snoopy': {'dog', 'cartoon', 'mammal'}, \u003cbr\u003e\n\u003e 'Socks': {'real', 'mammal', 'cat'}, \u003cbr\u003e\n\u003e \"Greyfriar's Bobby\": {'real', 'mammal', 'dog'},\u003cbr\u003e \n\u003e 'Harriet': {'real', 'tortoise'}\u003cbr\u003e\n\u003e }\n \n\u003c/p\u003e\u003c/details\u003e\n\n### Save and load Formal Context \n\nA formal context can also be saved to and loaded from a .cxt formatted file or a string:\n```python\nwith open('context.cxt', 'w') as file:\n    csp.io.write_cxt(df, file)\n\nwith open('context.cxt', 'r') as file:\n    df_loaded = csp.io.read_cxt(file)\n\nassert (df == df_loaded).all(None)\n```\n\n## Approach for faster computation\n\nCaspailleur does three things to fasten up the computations:\n1. It exploits the connections between characterisic attribute sets.\\\nE.g. a function to compute proper premises takes intents and keys as inputs, and not the original binary data.\n2. The set of intents is computed by LCM algorithm\\\nwell-implemented in scikit-mine package: https://pypi.org/project/scikit-mine/;\n3. All intrinsic computations are performed with bitwise operations\\\nprovided by bitarray package: https://pypi.org/project/bitarray/\n\n\nThe diagram below presents dependencies between the characteristic attribute sets. For example, the arrow \"intents -\u003e keys\" means that the set of intents is required to compute the set of keys.\n```mermaid\n  graph TD;\n      S[\"\u003cb\u003eitemsets\u003c/b\u003e\u003cbr\u003e\u003csmall\u003e\u003ctt\u003ecsp.np2bas(...)\u003c/tt\u003e\u003c/small\u003e\"];\n      A[\"\u003cb\u003eintents\u003c/b\u003e\u003cbr\u003e\u003csmall\u003e\u003ctt\u003ecsp.list_intents_via_LCM(...)\u003c/tt\u003e\u003c/small\u003e\"];\n      B[\"\u003cb\u003ekeys\u003c/b\u003e\u003cbr\u003e\u003csmall\u003e\u003ctt\u003ecsp.list_keys(...)\u003c/tt\u003e\u003c/small\u003e\"];\n      C[\"\u003cb\u003epasskeys\u003c/b\u003e\u003cbr\u003e\u003csmall\u003e\u003ctt\u003ecsp.list_passkeys(...)\u003c/tt\u003e\u003c/small\u003e\"];\n      D[\"\u003cb\u003eintents ordering\u003c/b\u003e\u003cbr\u003e\u003csmall\u003e\u003ctt\u003ecsp.sort_intents_inclusion(...)\u003c/tt\u003e\u003c/small\u003e\"]; \n      E[\"\u003cb\u003epseudo-intents\u003c/b\u003e\u003cbr\u003e\u003csmall\u003e\u003ctt\u003ecsp.list_pseudo_intents_via_keys(...)\u003c/tt\u003e\u003c/small\u003e\"];\n      F[\"\u003cb\u003eproper premises\u003c/b\u003e\u003cbr\u003e\u003csmall\u003e\u003ctt\u003ecsp.iter_proper_premises_via_keys(...)\u003c/tt\u003e\u003c/small\u003e\"];\n      G[\"\u003cb\u003elinearity index\u003c/b\u003e\u003cbr\u003e\u003csmall\u003e\u003ctt\u003ecsp.linearity_index(...)\u003c/tt\u003e\u003c/small\u003e\"];\n      H[\"\u003cb\u003edistributivity index\u003c/b\u003e\u003cbr\u003e\u003csmall\u003e\u003ctt\u003ecsp.distributivity_index(...)\u003c/tt\u003e\u003c/small\u003e\"];\n      \n      S --\u003e A\n      A --\u003e B;\n      A --\u003e C;\n      A --\u003e D;\n      A --\u003e E; \n      B --\u003e E;  \n      B --\u003e F; A --\u003e F; \n      A --\u003e G; D --\u003e G;\n      D --\u003e H; A --\u003e H; \n```\n\n_In case the diagram is not compiling, visit the GitHub version of README: https://github.com/smartFCA/caspailleur_\n\n\n\u003e [!NOTE]\n\u003e Although `caspailleur` package implements many optimisations to fasten up the computations, we do not state that it is the fastest FCA package ever existed.\n\u003e For example, our algorithm for computing pseudo-intent basis is far from the state-of-art.\n\u003e Knowing that, we find `caspailleur` fast enough for comfortable everyday use.\n\n## How to cite\n\nThere are no papers written about caspailleur (yet). So you can cite the package itself.\n\n```bibtex\n@misc{caspailleur,\n  title={caspailleur},\n  author={Dudyrev, Egor},\n  year={2023},\n  howpublished={\\url{https://www.smartfca.org/software}},\n}\n```\n\n## Funding\n\nThe package development is supported by ANR project SmartFCA [(ANR-21-CE23-0023)](https://anr.fr/Projet-ANR-21-CE23-0023).\n\nSmartFCA ([https://www.smartfca.org/](https://www.smartfca.org/)) is a big platform that will contain many extensions\nof Formal Concept Analysis including pattern structures, Relational Concept Analysis, Graph-FCA and others. \nWhile caspailleur is a small python package that covers only the basic notions of FCA. \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsmartfca%2Fcaspailleur","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsmartfca%2Fcaspailleur","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsmartfca%2Fcaspailleur/lists"}