Skip to main content

Code Similarity (csim)

Code Similarity (csim) provide a module designed to detect similarities between source code files, even when obfuscation techniques have been applied. It is particularly useful for programming instructors and students who need to verify code originality.

Key Features

  • Source Code Similarity Analysis: Compares source code files to determine their degree of similarity.
  • Pairwise Reporting: Generate detailed similarity reports for all file pairs.
  • File Grouping: Cluster similar files into groups based on a configurable threshold.
  • Flexible Search Strategies:
    • Exhaustive Search: All-pairs comparison for maximum precision
  • Advanced Analysis: Utilizes parse trees and the tree edit distance algorithm for in-depth analysis.
  • Parse Trees: Represents the syntactic structure of source code, enabling detailed comparisons.
  • Tree Edit Distance: Measures the similarity between different code structures.
  • Hash-Based Pruning: Optimizes the comparison process by reducing tree size while preserving essential structure.
  • Multi-Language Support: Supports Python 3.13, Java 20, and C++14 source code analysis.

Technologies Used

  • Python: The core programming language for the tool.
  • ANTLR: A parser generator for creating parse trees from source code.
  • apted: A library for computing the tree edit distance (default algorithm).
  • zss: A library for calculating the tree edit distance, alternatively to apted.
  • NumPy: Used for efficient numerical operations.

Installation

For the installation pip is required, you can either clone the repository and install it locally or install it directly from PyPI.

  1. Clone the repository:
    git clone https://github.com/EdsonEddy/csim.git
    
  2. Navigate to the project directory:
    cd csim
    
  3. Install the package:
    pip install .
    

Alternatively, you can install it directly from PyPI:

pip install csim

Version Compatibility

  • Python: 3.10–3.12 (recommended 3.11)
  • ANTLR4 Python Runtime: 4.13.2
  • zss: 1.2.0
  • apted: 1.0.3
  • numpy: 1.26.4

Quick Start

New to csim? Start here: GETTING_STARTED.md

For detailed information about search strategies, see: docs/STRATEGIES.md

csim supports three main actions: report (for pairwise similarity analysis), group (for clustering similar files), and tree/view (for visualizing a file's normalized/pruned parse tree). The tool supports Python 3.13, Java 20, and C++14 source code files.

General Command Structure

csim <action> --path <directory> [options]

Action 1: report - Generate Similarity Report

Generates a pairwise similarity report comparing all files in a directory.

csim report --path /path/to/directory

Example Output:

file1.py is similar to file2.py with similarity index: 0.95
file1.py is similar to file3.py with similarity index: 0.45
file2.py is similar to file3.py with similarity index: 0.50

Options:

  • --lang, -l: Programming language (default: python_3_13). Options: python_3_13, java_20, cpp_14
  • --talg, -ta: Tree edit distance algorithm (default: apted). Options: zss, apted

Example with options:

csim report --path /path/to/directory --lang java_20 --talg zss

Action 2: group - Group Files by Similarity

Groups files by similarity using a specified threshold and strategy.

csim group --path /path/to/directory --threshold 0.8

Example Output:

Threshold: 0.8
Total files processed: 4
Group 1 (Average Similarity: 0.98):
./file1.py
./file2.py
Group 2 (Average Similarity: 0.95):
./file3.py
./file4.py

Strategy Options

The group action supports two strategies for finding similar files:

1. exhaustive (Default)

Compares every file against every other file (O(n²)). This is the most thorough approach but slower for large datasets.

csim group --path /path/to/directory --threshold 0.8 --strategy exhaustive

When to use each:

  • exhaustive: Small datasets (< 100 files), when maximum precision is critical

Group Action Options

  • --threshold, -t: Similarity threshold (0.0 to 1.0). Required.
  • --strategy, -s: Grouping strategy (default: exhaustive). Options: exhaustive
  • --lang, -l: Programming language (default: python_3_13). Options: python_3_13, java_20, cpp_14
  • --talg, -ta: Tree edit distance algorithm (default: apted). Options: zss, apted

Complete example:

csim group --path /path/to/directory --threshold 0.9 --strategy exhaustive --lang python_3_13 --talg zss

Action 3: tree (alias: view) - Visualize Parse Trees

Prints the normalized/pruned tree for a single file — the exact tree that gets passed to the tree edit distance algorithm. Useful for debugging how the normalization, collapsing, and hashing rules affect a specific file before it's compared against others.

csim tree --path /path/to/file.py --lang python_3_13

Example Output:

=== Normalized + Pruned Tree (input to Tree Edit Distance) ===
statements
   function_def_raw
      param [hashed:e3b0c442]
      statements
         STRING
         if_stmt
            comparison [hashed:93e10dca]
            return_stmt [hashed:337adaa9]
   assignment [hashed:118045cc]
   primary [hashed:e1b0c7ab]

Total nodes after pruning: 24

Rule and token names are resolved for readability, LOOP marks nodes collapsed under control-flow equivalence (e.g. for/while), and [hashed:xxxxxxxx] marks subtrees that were hashed into a single node instead of compared structurally.

Options:

  • --path, -p: Path to a single source code file (required).
  • --lang, -l: Programming language (default: python_3_13). Options: python_3_13, java_20, cpp_14
  • --show-raw: Also print the raw ANTLR parse tree before normalization/pruning, for side-by-side comparison.

Example with --show-raw:

csim tree --path /path/to/file.py --lang python_3_13 --show-raw

Language Support

The tool supports the following programming languages:

Python 3.13:

csim report --path /path/to/python/files --lang python_3_13

Java 20:

csim report --path /path/to/java/files --lang java_20

C++14:

csim report --path /path/to/cpp/files --lang cpp_14

Threshold Guidance

The similarity threshold represents the structural similarity of the code (based on the Abstract Syntax Tree). Choose appropriate thresholds based on your use case:

  • 0.95+: Nearly identical code (likely plagiarism)
  • 0.85-0.95: Very similar code (probable plagiarism)
  • 0.70-0.85: Moderately similar code (review recommended)
  • <0.70: Low similarity (likely independent work)

Using csim as a Python Module

You can also use csim programmatically within your Python code. The library provides low-level functions for advanced use cases:

from csim.utils import group_by_exhaustive_search, report_pairwise_similarity

# Example: Group files by similarity
file_names = ["file1.py", "file2.py", "file3.py"]
file_contents = [code1, code2, code3]

results = group_by_exhaustive_search(
    file_names=file_names,
    file_contents=file_contents,
    lang="python_3_13",
    threshold=0.8,
    ted_algorithm="apted"
)

print(results)

Or use the legacy Compare class for simple pairwise comparisons:

from csim import Compare

code_a = "a = 5"
code_b = "c = 50"
similarity = Compare(name_a='example A', content_a=code_a, name_b='example B', content_b=code_b)
print(f"Similarity: {similarity}") # Output: Similarity: X.XX

Documentation

ANTLR4 Installation and Parser/Lexer Generation

This installation is not required—the generated files are already included in the project. If you'd like to review the steps to generate them yourself, see grammars/parser_gen_guide.md.

Note: The included generated files were produced by ANTLR 4.13.2 and are compatible with the pinned runtime listed above.

Contributing

Contributions are welcome! To contribute, please follow these steps:

  1. Fork the repository.
  2. Create a new branch (git checkout -b feature/new-feature).
  3. Make your changes and commit them (git commit -am 'Add new feature').
  4. Push to the branch (git push origin feature/new-feature).
  5. Open a Pull Request.

License

This project is licensed under the MIT License. See the LICENSE file for details.

Support

References

For more information on the techniques and tools used in this project, refer to the following resources:

Third-Party Licenses

This project utilizes the following third-party libraries:

ANTLR (ANother Tool for Language Recognition)

ANTLR4-parser-for-Python-3.14 by RobEin

zss (Zhang-Shasha)

apted (All Path Tree Edit Distance)

Release files for csim 3.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for csim 3.1.1
File Size Uploaded
csim-3.1.1.tar.gz 325.1 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for csim 3.1.1
File Interpreter ABI Platform
csim-3.1.1-py3-none-manylinux_2_28_x86_64.whl Python 3 none Linux glibc 2.28+ x86-64 Details
csim-3.1.1-py3-none-macosx_14_0_arm64.whl Python 3 none macOS 14.0+ ARM64 Details

Total release size: 4.5 MB

Release files / csim-3.1.1.tar.gz

Download URL csim-3.1.1.tar.gz
Size 325.1 kB
Tags Source
SHA-256 checksum
How to use checksums
3626b1941b3835f49d1a484faca7bb6e3d2c9020422014a734905022f6ff48c4
BLAKE2b-256 checksum
How to use checksums
d9cdcda6b673919e864c189bf2e4315789500d6d17f4fefe686a75738428da5c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 12, 2026.

Transparency log

Release files / csim-3.1.1-py3-none-manylinux_2_28_x86_64.whl

Download URL csim-3.1.1-py3-none-manylinux_2_28_x86_64.whl
Size 3.0 MB
Tags Linux glibc 2.28+ x86-64 Python 3
SHA-256 checksum
How to use checksums
836d7c5543b5e31ed8b929716b65c7cb6f1ffd730c29adbc21d430827539d574
BLAKE2b-256 checksum
How to use checksums
74e560f3a041f479e95b91d023f7a08fc882b983cf1b499b72d49c8ac664e7fc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 12, 2026.

Transparency log

Release files / csim-3.1.1-py3-none-macosx_14_0_arm64.whl

Download URL csim-3.1.1-py3-none-macosx_14_0_arm64.whl
Size 1.2 MB
Tags Python 3 macOS 14.0+ ARM64
SHA-256 checksum
How to use checksums
48ec5011b613b5eee5f264b8e3ae00888b4a533ea1fbc0a234f5959899b175e3
BLAKE2b-256 checksum
How to use checksums
690aa3573861c2b95ef0f2b3c6bf5a7e939a781100ab685e9089b2c20fe6f168
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 12, 2026.

Transparency log

Release history Release notifications | RSS feed

3.4.1

3 release files

3.4.0

3 release files

3.3.0

3 release files

3.2.0

3 release files

This release

3.1.1 This release

3 release files

3.1.0

3 release files

3.0.2

2 release files

3.0.1

2 release files

3.0.0

2 release files

2.0.6

2 release files

2.0.5

2 release files

2.0.4

2 release files

2.0.3

2 release files

2.0.2

2 release files

2.0.1

2 release files

2.0.0

2 release files

1.7.0

2 release files

1.6.3

2 release files

1.6.2

2 release files

1.6.1

2 release files

1.6.0

2 release files

1.5.3

2 release files

1.5.2

2 release files

1.5.1

2 release files

1.5.0

2 release files

1.4.2

2 release files

1.4.1

2 release files

1.4.0

2 release files

1.3.2

2 release files

1.3.1

2 release files

1.3.0

2 release files

1.2.1

2 release files

1.1.2

2 release files

1.1.1

2 release files

1.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page