Indriyati Atmosukarto

58 papers A* 3A 2B 5C 8Misc 3Journal 7Unranked 28
YearRankTypeTitle / Venue / Authors
2025 conf
CAI
Yanghui Mo, Xin Lou, Mageshwaran Muthusamy, Wei Zhang, Indriyati Atmosukarto, Xunpei Sun
2025 conf
CHI Extended Abstracts
Leon Cewei Foo, Nirmal Sukumaran Nair, Liuziyi Liu, Jeannie Su Ann Lee, Songjia Shen, Indriyati Atmosukarto, Alvin Chan, Jing Shi, Yong Joo Loh, Yih Yng Ng, Michael Chia, Chek Tien Tan
2025 conf
SOLI
Haoyu Song, Indriyati Atmosukarto
2025 A* conf
CHI
Chek Tien Tan, Indriyati Atmosukarto, Budianto Tandianus, Songjia Shen, Steven Wong
2025 conf
CAI
Haoyu Song, Indriyati Atmosukarto
2025 A* conf
ACM Multimedia
Aik Beng Ng, Yethoven Tukimin, Jeannie S. Lee, Megani Rajendran, Chek Tien Tan, Indriyati Atmosukarto
2025 conf
CVPR Workshops
Tushar Pranav, Eshan Pandey, Lyka Diane Bala Austria, Yin Yin Loo, Jing Hao Lim, Indriyati Atmosukarto, Donny Cheng Lock Soh
2025 conf
CAI
Yunxiang Zhou, Xin Lou, Ying He, Wei Zhang, Indriyati Atmosukarto
2025 conf
CAI
Abdul Hady Bin Zaydie, Indriyati Atmosukarto
2025 J jnl
CoRR
Tushar Pranav, Eshan Pandey, Lyka Diane Bala Austria, Aman Chadha, Indriyati Atmosukarto, Donny Cheng Lock Soh
2024 C conf
TENCON
Ian McLoughlin, Jeannie Su Ann Lee, Indriyati Atmosukarto, Zhongqiang Ding
2024 conf
SIGGRAPH Asia Technical Communications
Megani Rajendran, Chek Tien Tan, Indriyati Atmosukarto, Aik Beng Ng, Joey Lim, Triston Chan Sheen, Simon See
2024 C conf
FIE
Indriyati Atmosukarto, Ng He Tong, Muhammad Faiezin Bin Osman, Jamil Bin Jasin, Prasad Iyer, Wean Sin Cheow
2024 C conf
TENCON
Ke Yi Lee, Tushar Pranav, Cheng Lock Donny Soh, Indriyati Atmosukarto
2024 C conf
TENCON
Jingquan Chen, Indriyati Atmosukarto, Muhamed Fauzi Bin Abbas
2024 J jnl
Vis. Intell.
Megani Rajendran, Chek Tien Tan, Indriyati Atmosukarto, Aik Beng Ng, Simon See
2024 conf
ISMAR-Adjunct
Ian McLoughlin, Jeannie S. Lee, Indriyati Atmosukarto
2023 conf
MetaCom
Megani Rajendran, Chek Tien Tan, Indriyati Atmosukarto, Aik Beng Ng, Andrew Grant, Eric Cameracci, Simon See
2023 conf
TALE
Andrew Keong Ng, Indriyati Atmosukarto, Julia Kwok Lee Teo, Ashraaf Bin Amran
2023 C conf
HealthCom
Indriyati Atmosukarto, Hong Sheng Wong, Bryan Se To
2023 conf
SIGGRAPH Asia Technical Communications
Megani Rajendran, Chek Tien Tan, Indriyati Atmosukarto, Aik Beng Ng, Zhihua Zhou, Andrew Grant, Simon See
2023 J jnl
Educ. Inf. Technol.
Jamil Jasin, Ng He Tong, Indriyati Atmosukarto, Prasad Iyer, Faiezin Osman, Kelly Wong Peng Yu, Ching Yee Pua, Wean Sin Cheow
2023 J jnl
CCF Trans. Pervasive Comput. Interact.
Fang Liu, Wei Zhang, Indriyati Atmosukarto, Teck Wei Low
2023 C conf
FIE
Alex Q. Chen, Indriyati Atmosukarto, Serena Hui Lin Goh
2022 conf
ISMAR Adjunct
Megani Rajendran, Chek Tien Tan, Indriyati Atmosukarto, Aik Beng Ng, Simon See
2022 conf
HCI (14)
Cheng Lock Donny Soh, Indriyati Atmosukarto
2022 conf
ISMAR Adjunct
Megani Rajendran, Chek Tien Tan, Indriyati Atmosukarto, Aik Beng Ng, Simon See
2022 conf
ICC
Fang Liu, Teck Wei Low, Wei Zhang, Indriyati Atmosukarto
2021 conf
TALE
Pearpilai Jutasompakorn, Indriyati Atmosukarto, Mustafa Shabbir Kurbanhusen, Agnes Xue Lishan
2021 C conf
FIE
Andrew Keong Ng, Indriyati Atmosukarto, Wean Sin Cheow, Karin Avnit, Mun Hin Yong
2021 conf
TALE
Indriyati Atmosukarto, Wean Sin Cheow, Prasad Iyer, Ng He Tong, Kelly Wong Peng Yu
2019 conf
ICITE
Lur Tze Hsien, Indriyati Atmosukarto
2018 Misc conf
DICTA
Choon Giap Goh, Wee Han Lim, Justus Chua, Indriyati Atmosukarto
2018 conf
SOLI
Ryan Tan, Indriyati Atmosukarto, Wee Han Lim
2015 A conf
WACV
Indriyati Atmosukarto, Narendra Ahuja, Bernard Ghanem
2015 ch.
Health Monitoring and Personalized Feedback using Multimedia Data
Ezgi Mercan, Indriyati Atmosukarto, Jia Wu, Shu Liang, Linda G. Shapiro
2014 conf
ECCV Workshops (1)
Yong Pei, Bingbing Ni, Indriyati Atmosukarto
2013 J jnl
Int. J. Multim. Inf. Retr.
Indriyati Atmosukarto, Linda G. Shapiro
2013 A conf
BMVC
Jagannadan Varadarajan, Indriyati Atmosukarto, Shaunak Ahuja, Bernard Ghanem, Narendra Ahuja
2013 conf
CVPR Workshops
Indriyati Atmosukarto, Bernard Ghanem, Shaunak Ahuja, Karthik Muthuswamy, Narendra Ahuja
2012 conf
MCBR-CDS
Shulin Yang, Linda G. Shapiro, Michael L. Cunningham, Matthew L. Speltz, Craig Birgfeld, Indriyati Atmosukarto, Su-In Lee
2012 B conf
ICPR
Indriyati Atmosukarto, Bernard Ghanem, Narendra Ahuja
2011 J jnl
Genet. Program. Evolvable Mach.
Indriyati Atmosukarto
2010 J jnl
Pattern Recognit.
Indriyati Atmosukarto, Katarzyna Wilamowska, Carrie Heike, Linda G. Shapiro
2010 conf
Multimedia Information Retrieval
Indriyati Atmosukarto, Linda G. Shapiro
2010 B conf
ICPR
Indriyati Atmosukarto, Linda G. Shapiro, Carrie Heike
2009 B conf
Image Processing
Rosalia F. Tungaraza, J. Guan, S. M. Rolfe, Indriyati Atmosukarto, Andrew V. Poliakov, Natalia M. Kleinhans, Elizabeth H. Aylward, Jeffrey G. Ojemann, James F. Brinkley, Linda G. Shapiro
2009 B conf
Image Processing
Indriyati Atmosukarto, Linda G. Shapiro, Michael L. Cunningham, Matthew L. Speltz
2009 Misc conf
ICIAP
Linda G. Shapiro, Katarzyna Wilamowska, Indriyati Atmosukarto, Jia Wu, Carrie Heike, Matthew L. Speltz, Michael L. Cunningham
2008 conf
SSPR/SPR
Indriyati Atmosukarto, Linda G. Shapiro
2008 conf
Multimedia Information Retrieval
Indriyati Atmosukarto, Linda G. Shapiro
2008 ch.
Case-Based Reasoning on Images and Signals
Linda G. Shapiro, Indriyati Atmosukarto, Hansang Cho, H. Jill Lin, Salvador Ruiz-Correa, Jenny Yuen
2007 conf
Image-Guided Procedures
Indriyati Atmosukarto, Timothy D. Soper, Robb W. Glenny, Eric J. Seibel, Linda G. Shapiro
2005 B conf
MMM
Indriyati Atmosukarto, Wee Kheng Leow, Zhiyong Huang
2003 conf
CVPR (2)
Meng Yu, Indriyati Atmosukarto, Wee Kheng Leow, Zhiyong Huang, Rong Xu
2002 A* conf
ICDE
Wee Hyong Tok, Twee-Hee Ong, Wai Lup Low, Indriyati Atmosukarto, Stéphane Bressan
2001 C conf
Computer Graphics International
Indriyati Atmosukarto, Luping Zhou, Wee Kheng Leow, Zhiyong Huang
2000 Misc conf
PG
Indriyati Atmosukarto, Wee Kheng Leow, Zhiyong Huang, Yong Zhang, Kah Kay Sung
tests/unit/test_smali_normalization.py
← Index tests/unit/test_smali_normalization.py python
"""Unit tests for smali semantic normalization.

Tests the three normalization levels (category, opcode, opcode_api),
opcode categorization, ACFG feature index mapping, and integration
with MinHash computation.
"""
import pytest

pytestmark = [pytest.mark.unit, pytest.mark.apk, pytest.mark.decompile]


class TestCategorizeOpcode:
    """Tests for opcode -> semantic category mapping."""

    def test_arithmetic(self):
        from redb.extractors.decompiler.apk.smali_normalization import categorize_opcode
        assert categorize_opcode("add-int") == "ALU"
        assert categorize_opcode("mul-long/2addr") == "ALU"
        assert categorize_opcode("neg-int") == "ALU"

    def test_data_movement(self):
        from redb.extractors.decompiler.apk.smali_normalization import categorize_opcode
        assert categorize_opcode("move-result") == "MOV"
        assert categorize_opcode("const/4") == "CONST"
        assert categorize_opcode("const-string") == "CONST"

    def test_memory_access(self):
        from redb.extractors.decompiler.apk.smali_normalization import categorize_opcode
        assert categorize_opcode("iget-object") == "LOAD"
        assert categorize_opcode("sput-wide") == "STORE"
        assert categorize_opcode("aget-byte") == "LOAD"

    def test_invocation(self):
        from redb.extractors.decompiler.apk.smali_normalization import categorize_opcode
        assert categorize_opcode("invoke-virtual") == "CALL"
        assert categorize_opcode("invoke-static") == "CALL"
        assert categorize_opcode("invoke-direct") == "CALL"

    def test_control_flow(self):
        from redb.extractors.decompiler.apk.smali_normalization import categorize_opcode
        assert categorize_opcode("if-eqz") == "BRANCH"
        assert categorize_opcode("goto") == "JMP"
        assert categorize_opcode("goto/16") == "JMP"
        assert categorize_opcode("return-void") == "RET"

    def test_comparison(self):
        from redb.extractors.decompiler.apk.smali_normalization import categorize_opcode
        assert categorize_opcode("cmp-long") == "CMP"
        assert categorize_opcode("cmpl-float") == "CMP"
        assert categorize_opcode("cmpg-double") == "CMP"

    def test_conversion(self):
        from redb.extractors.decompiler.apk.smali_normalization import categorize_opcode
        assert categorize_opcode("int-to-long") == "CONV"
        assert categorize_opcode("float-to-int") == "CONV"

    def test_object_type(self):
        from redb.extractors.decompiler.apk.smali_normalization import categorize_opcode
        assert categorize_opcode("new-instance") == "ALLOC"
        assert categorize_opcode("check-cast") == "TYPE"
        assert categorize_opcode("instance-of") == "TYPE"

    def test_exception_sync(self):
        from redb.extractors.decompiler.apk.smali_normalization import categorize_opcode
        assert categorize_opcode("throw") == "EXC"
        assert categorize_opcode("monitor-enter") == "SYNC"

    def test_unknown(self):
        from redb.extractors.decompiler.apk.smali_normalization import categorize_opcode
        assert categorize_opcode("nop") == "OTHER"


class TestNormalizeInstruction:
    """Tests for single instruction normalization at various levels."""

    def test_category_level(self):
        from redb.extractors.decompiler.apk.smali_normalization import normalize_instruction
        assert normalize_instruction("add-int v0, v1, v2", "category") == "ALU"
        assert normalize_instruction("invoke-virtual {p0}, Lcom/Foo;->bar()V", "category") == "CALL"
        assert normalize_instruction("return-void", "category") == "RET"

    def test_opcode_level_strips_width(self):
        from redb.extractors.decompiler.apk.smali_normalization import normalize_instruction
        # Width variants collapse to same base
        assert normalize_instruction("add-int v0, v1, v2", "opcode") == "add"
        assert normalize_instruction("add-long v0, v2, v4", "opcode") == "add"
        assert normalize_instruction("add-float v0, v1, v2", "opcode") == "add"
        # Addressing modes collapse too
        assert normalize_instruction("add-int/2addr v0, v1", "opcode") == "add"

    def test_opcode_api_invoke(self):
        from redb.extractors.decompiler.apk.smali_normalization import normalize_instruction
        result = normalize_instruction(
            "invoke-virtual {p0, v0}, Lcom/example/Foo;->bar(I)V"
        )
        assert result == "CALL Lcom/example/Foo;->bar(I)V"

    def test_opcode_api_invoke_no_ref(self):
        from redb.extractors.decompiler.apk.smali_normalization import normalize_instruction
        # If somehow no method ref is found, fallback to CALL
        assert normalize_instruction("invoke-virtual {v0}") == "CALL"

    def test_opcode_api_field_load(self):
        from redb.extractors.decompiler.apk.smali_normalization import normalize_instruction
        result = normalize_instruction(
            "iget-object v0, p0, Lcom/Foo;->mField:Ljava/lang/String;"
        )
        assert result == "LOAD Lcom/Foo;->mField:Ljava/lang/String;"

    def test_opcode_api_field_store(self):
        from redb.extractors.decompiler.apk.smali_normalization import normalize_instruction
        result = normalize_instruction(
            "iput-object v0, p0, Lcom/Foo;->mField:Ljava/lang/String;"
        )
        assert result == "STORE Lcom/Foo;->mField:Ljava/lang/String;"

    def test_opcode_api_androguard_field_format(self):
        """androguard uses space instead of colon in field references."""
        from redb.extractors.decompiler.apk.smali_normalization import normalize_instruction
        result = normalize_instruction(
            "iget-object v0, p0, Lcom/Foo;->mField Ljava/lang/String;"
        )
        assert result.startswith("LOAD")
        assert "Lcom/Foo;->mField" in result

    def test_opcode_api_new_instance(self):
        from redb.extractors.decompiler.apk.smali_normalization import normalize_instruction
        result = normalize_instruction(
            "new-instance v0, Lcom/example/MyClass;"
        )
        assert result == "ALLOC Lcom/example/MyClass;"

    def test_opcode_api_const_string(self):
        from redb.extractors.decompiler.apk.smali_normalization import normalize_instruction
        result = normalize_instruction(
            'const-string v0, "hello world"'
        )
        assert result == 'CONST_STR "hello world"'

    def test_opcode_api_const_string_jumbo(self):
        from redb.extractors.decompiler.apk.smali_normalization import normalize_instruction
        result = normalize_instruction(
            'const-string/jumbo v0, "large string"'
        )
        assert result == 'CONST_STR "large string"'

    def test_opcode_api_fallback_to_category(self):
        from redb.extractors.decompiler.apk.smali_normalization import normalize_instruction
        # Non-special instructions fall back to category
        assert normalize_instruction("add-int v0, v1, v2") == "ALU"
        assert normalize_instruction("return-void") == "RET"
        assert normalize_instruction("nop") == "OTHER"

    def test_empty_input(self):
        from redb.extractors.decompiler.apk.smali_normalization import normalize_instruction
        assert normalize_instruction("") == ""
        assert normalize_instruction("   ") == ""


class TestNormalizeMethodBody:
    """Tests for full method body normalization."""

    def test_filters_directives_labels_comments(self):
        from redb.extractors.decompiler.apk.smali_normalization import normalize_method_body
        body = """\
.locals 2
# comment
:label_0
add-int v0, v1, v2
.line 42
invoke-virtual {p0}, Lcom/Foo;->bar()V
return-void
"""
        result = normalize_method_body(body, "category")
        assert result == ["ALU", "CALL", "RET"]

    def test_opcode_api_preserves_api_refs(self):
        from redb.extractors.decompiler.apk.smali_normalization import normalize_method_body
        body = """\
const/4 v0, 0x0
invoke-virtual {p0, v0}, Lcom/Foo;->setX(I)V
iget-object v1, p0, Lcom/Foo;->name:Ljava/lang/String;
return-void
"""
        result = normalize_method_body(body, "opcode_api")
        assert result[0] == "CONST"
        assert result[1] == "CALL Lcom/Foo;->setX(I)V"
        assert result[2] == "LOAD Lcom/Foo;->name:Ljava/lang/String;"
        assert result[3] == "RET"

    def test_empty_body(self):
        from redb.extractors.decompiler.apk.smali_normalization import normalize_method_body
        assert normalize_method_body("") == []
        assert normalize_method_body("\n\n") == []


class TestNormalizationWithMinHash:
    """Integration tests: normalization + MinHash computation."""

    def test_minhash_returns_signature(self):
        from redb.extractors.decompiler.apk.method_extractor import compute_minhash
        body = """\
const/4 v0, 0x0
invoke-virtual {p0, v0}, Lcom/Foo;->bar(I)V
iget-object v1, p0, Lcom/Foo;->name:Ljava/lang/String;
add-int v2, v0, v1
return-void
"""
        sig = compute_minhash(body)
        assert sig is not None
        assert len(sig) == 64
        assert all(0 <= v < 256 for v in sig)

    def test_minhash_register_invariance(self):
        """Same operations with different registers should produce identical signatures."""
        from redb.extractors.decompiler.apk.method_extractor import compute_minhash
        body_a = """\
const/4 v0, 0x0
invoke-virtual {p0, v0}, Lcom/Foo;->bar(I)V
iget-object v1, p0, Lcom/Foo;->name:Ljava/lang/String;
add-int v2, v0, v1
return-void
"""
        body_b = """\
const/4 v3, 0x0
invoke-virtual {p1, v3}, Lcom/Foo;->bar(I)V
iget-object v4, p1, Lcom/Foo;->name:Ljava/lang/String;
add-int v5, v3, v4
return-void
"""
        sig_a = compute_minhash(body_a)
        sig_b = compute_minhash(body_b)
        assert sig_a == sig_b

    def test_minhash_width_invariance(self):
        """Width variants of same operations should produce identical signatures."""
        from redb.extractors.decompiler.apk.method_extractor import compute_minhash
        body_int = """\
add-int v0, v1, v2
sub-int v3, v0, v1
mul-int v4, v0, v3
return v4
"""
        body_long = """\
add-long v0, v2, v4
sub-long v6, v0, v2
mul-long v8, v0, v6
return-wide v8
"""
        sig_int = compute_minhash(body_int)
        sig_long = compute_minhash(body_long)
        # Both normalize to ALU, ALU, ALU, RET -> identical
        assert sig_int == sig_long

    def test_minhash_different_apis_differ(self):
        """Methods calling different APIs should produce different signatures."""
        from redb.extractors.decompiler.apk.method_extractor import compute_minhash
        body_a = """\
const/4 v0, 0x0
invoke-virtual {p0, v0}, Lcom/crypto/AES;->encrypt([B)[B
invoke-virtual {v0}, Ljava/io/OutputStream;->write([B)V
return-void
"""
        body_b = """\
const/4 v0, 0x0
invoke-virtual {p0, v0}, Ljava/lang/String;->length()I
invoke-virtual {v0}, Ljava/io/PrintStream;->println(I)V
return-void
"""
        sig_a = compute_minhash(body_a)
        sig_b = compute_minhash(body_b)
        assert sig_a != sig_b

    def test_minhash_too_few_instructions(self):
        from redb.extractors.decompiler.apk.method_extractor import compute_minhash
        assert compute_minhash("return-void\nnop") is None


class TestACFGBlockFeatures:
    """Tests for per-block ACFG feature extraction via smali_cfg."""

    def test_simple_linear_method(self):
        from redb.extractors.decompiler.apk.smali_cfg import compute_cfg_metrics
        body = """\
add-int v0, v1, v2
invoke-virtual {p0}, Lcom/Foo;->bar()V
return-void
"""
        metrics = compute_cfg_metrics(body)
        assert metrics.block_count >= 1
        assert len(metrics.block_features) == metrics.block_count
        # Each feature vector has 8 elements
        for feat in metrics.block_features:
            assert len(feat) == 8

    def test_branching_method_has_multiple_blocks(self):
        from redb.extractors.decompiler.apk.smali_cfg import compute_cfg_metrics
        body = """\
const/4 v0, 0x0
if-eqz v0, :cond_0
invoke-virtual {p0}, Lcom/Foo;->a()V
goto :goto_0
:cond_0
invoke-virtual {p0}, Lcom/Foo;->b()V
:goto_0
return-void
"""
        metrics = compute_cfg_metrics(body)
        assert metrics.block_count >= 3
        assert len(metrics.block_features) == metrics.block_count

    def test_feature_vector_arithmetic_count(self):
        from redb.extractors.decompiler.apk.smali_cfg import compute_cfg_metrics
        body = """\
add-int v0, v1, v2
sub-int v3, v0, v1
mul-int v4, v0, v3
return v4
"""
        metrics = compute_cfg_metrics(body)
        assert len(metrics.block_features) == 1
        feat = metrics.block_features[0]
        # feat[0] = instr_count (4), feat[1] = arithmetic (3)
        assert feat[0] == 4
        assert feat[1] >= 3  # 3 ALU ops

    def test_feature_vector_call_count(self):
        from redb.extractors.decompiler.apk.smali_cfg import compute_cfg_metrics
        body = """\
invoke-virtual {p0}, Lcom/A;->a()V
invoke-static {v0}, Lcom/B;->b()V
return-void
"""
        metrics = compute_cfg_metrics(body)
        feat = metrics.block_features[0]
        # feat[4] = call count
        assert feat[4] == 2