Discord

Checklist IOAI Indonesia 2026 National Training Camp 1 – Simulation 2 · 2.2 task

Complicated Outer-Space Signals

Indonesian title: Sinyal Luar Angkasa yang Rumit

Classify observations into four space objects from a noisy 1-D primary signal and a 1-D antenna-modulation signal.

  • Multimodal
  • Multiclass signal classification
  • Indonesian original · English translation

The task

Researchers of the fictional 'Republik Pacil' record signals from a space antenna. Each observation has a primary 1-D signal of 4,800 values and a 128-value modulation signal describing the antenna configuration, which affects noise and distortion in the primary signal. The signals come from four different space objects.

Contestants build a model that assigns each observation to one of the four classes, ideally using both signals, reducing noise and constructing new representations of the 1-D signals. Any method is allowed (classical ML, CNN/RNN/LSTM, signal processing, feature engineering).

Abridged and translated by SOTA from the official Indonesian materials. The official statement has the exact rules, and it wins wherever this summary differs.

In English

This task was published in Indonesian. SOTA translated its 3 files into English on 17 September 2026. Only the words changed in the notebooks: markdown, code comments, messages and printed output. The code, file names and paths are the original's, so a translated notebook runs with the original data.

Read the task notebook in English 800 words and 3 code cells

🌌 Complicated Outer-Space Signals

Background

A team of researchers from the Republic of Pacil has detected a series of unusual signals from outer space, captured using a space antenna. Unlike the observations made several years earlier, the latest observation system now in use can record data at a higher resolution and over a longer duration, so that the signal patterns can be observed in more detail.

Alt text

Because of technological limitations, all the information received by the space antenna takes the form of one-dimensional (1D) numerical signals. Interestingly, the researchers suspect that these signals are not entirely random. There are indications that behind these numerical sequences lies a certain hidden structure that might be reconstructed into a more meaningful form.

For each observation, the system also stores an equipment-setting modulation signal, which is used to set the parameters of the space antenna when capturing the primary signal. This setting also takes the form of a one-dimensional (1D) numerical signal, and the signal plays an important role in controlling the quality of the primary signal captured by the space antenna. If the setting parameters are not well suited, the primary signal recorded by the space antenna may contain greater/more noise, interference or distortion.

Data Components

Each observation consists of two main components:

  1. Primary Signal (Sinyal Utama)
    This primary signal takes the form of a 1D sequence of numerical values representing the primary signal captured by the space antenna. This signal carries the core information that will be used for the observation. However, the quality of this primary signal varies depending on the acquisition conditions and on the equipment settings controlled by the modulation signal.

  2. Modulation Signal (Sinyal Modulasi)
    This modulation signal takes the form of a 1D sequence of numerical values representing the configuration of the space antenna at the time the acquisition/observation was carried out. This modulation signal is not the main data, but rather information about how the space antenna was set up to obtain a cleaner signal capture. Therefore, the modulation signal can help researchers understand why two primary signals that look similar can have different levels of noise or quality.

From an initial analysis, the researchers found that these signals show the structural patterns of four space objects that differ from one another. However, with the growing complexity and volume of the data, identifying these space objects manually is no longer feasible. You are therefore asked to build an AI model that can determine which of the four objects is being observed.

🎯 Your Task

You are asked to develop an AI model that is able to:

Assign each observation to one of the four object categories already defined by the researchers, based on the available signal data.

You are expected not only to build a good classification model, but also to consider how to:

  • use the two types of signal together,
  • reduce the effect of noise,
  • and, if necessary, build new representations of the 1D signals so that the hidden patterns are easier to recognise.

📊 Data Description

🔹 Training Data

File: multimodal_train.csv

Each row represents one observation:

  • The first column is the category label (there are 4 category classes in total)
  • The following columns contain:
    • The numerical values of the primary signal, spanning 4800 columns
    • The numerical values of the modulation signal, spanning 128 columns
🔹 Test Data

File: multimodal_test_data.csv

Each row contains:

  • The numerical features of both signals, where:
    • the primary signal spans 4800 columns
    • the modulation signal spans 128 columns
  • The category label is not provided

📤 Output Format

You must produce the file submission.csv in the format:

id,label
0,2
1,0
2,1
...
  • id is the row index in the test data (starting from 0)
  • label is the predicted category

📏 Evaluation

Model performance will be measured using:

Classification accuracy

Accuracy=Number of correct predictionsTotal number of test data \text{Accuracy} = \frac{\text{Number of correct predictions}}{\text{Total number of test data}}

⚠️ Notes

  • Each observation consists of two different 1D numerical signals
  • The modulation signal represents the settings of the space antenna and of the whole system used, not the label or the main content of the signal
  • The data, both the modulation signal and the primary signal, may contain:
    • noise,
    • variations in signal shape,
    • differing acquisition quality,
    • and other interference caused by sub-optimal equipment settings
  • You are free to use any machine learning method, including:
    • classical machine learning (such as linear regression or SVM),
    • deep learning (such as CNN, RNN or LSTM),
    • signal processing,
    • feature engineering,
    • or a combination of all of these

Data Preperation

Data Loading

# ============================================
# Dataset Loader (Google Drive → CSV → NumPy)
# ============================================

# Install dependency
!pip -q install gdown

import os
import re
import zipfile
import numpy as np
import pandas as pd
import gdown

# ============================================
# USER SETTINGS
# ============================================

# Put your Google Drive share link here
GDRIVE_URL = "https://drive.google.com/file/d/1kzWaEH-QeKo9PcFTGL3KdFBPVcUIRMqQ/view?usp=sharing"

WORK_DIR = "/content/"
ZIP_PATH = os.path.join(WORK_DIR, "dataset.zip")
EXTRACT_DIR = os.path.join(WORK_DIR, "extracted")

os.makedirs(WORK_DIR, exist_ok=True)
os.makedirs(WORK_DIR, exist_ok=True)

# ============================================
# HELPER: Convert GDrive URL → direct link
# ============================================

def gdrive_to_direct(url):
    match = re.search(r"/file/d/([a-zA-Z0-9_-]+)", url)
    if match:
        file_id = match.group(1)
        return f"https://drive.google.com/uc?id={file_id}"

    match = re.search(r"id=([a-zA-Z0-9_-]+)", url)
    if match:
        file_id = match.group(1)
        return f"https://drive.google.com/uc?id={file_id}"

    raise ValueError("Invalid Google Drive URL")

# ============================================
# DOWNLOAD + EXTRACT
# ============================================

def download_and_extract(gdrive_url):
    direct_url = gdrive_to_direct(gdrive_url)
    print("Downloading dataset...")
    gdown.download(direct_url, ZIP_PATH, quiet=False, fuzzy=True)

    print("Extracting...")
    with zipfile.ZipFile(ZIP_PATH, "r") as zf:
        zf.extractall(EXTRACT_DIR)

download_and_extract(GDRIVE_URL)

# ------------------------------------------------
# File paths
# ------------------------------------------------
TRAIN_CSV = "/content/extracted/multimodal_train.csv"
TEST_DATA_CSV = "/content/extracted/multimodal_test_data.csv"

# ------------------------------------------------
# Load data
# ------------------------------------------------

train_df = pd.read_csv(TRAIN_CSV)
test_df = pd.read_csv(TEST_DATA_CSV)

img_cols = [c for c in train_df.columns if c.startswith("primary_")]
sig_cols = [c for c in train_df.columns if c.startswith("modulation_")]

X_train_img = train_df[img_cols].values.astype(np.float32)
X_test_img = test_df[img_cols].values.astype(np.float32)

X_train_sig = train_df[sig_cols].values.astype(np.float32)
X_test_sig = test_df[sig_cols].values.astype(np.float32)

y_train = train_df["label"].values.astype(int)

print("")
print("Image train shape  :", X_train_img.shape)
print("Signal train shape :", X_train_sig.shape)
print("y_train            :", y_train.shape, "\n")

print("Image test shape   :", X_test_img.shape)
print("Signal test shape  :", X_test_sig.shape)

Data Visualization For All Classes

# ============================================
# VISUALIZE ONE SAMPLE PER CLASS
# ============================================

import matplotlib.pyplot as plt
import numpy as np

# ------------------------------------------------
# Get one sample index per class
# ------------------------------------------------
unique_labels = sorted(np.unique(y_train))
indices_per_class = []

for label in unique_labels:
    idx = np.where(y_train == label)[0][0]  # first occurrence
    indices_per_class.append(idx)

print("Selected indices per class:", indices_per_class)

# ------------------------------------------------
# Plot function
# ------------------------------------------------
def plot_samples(indices):
    n = len(indices)
    plt.figure(figsize=(12, 3 * n))

    for i, idx in enumerate(indices):
        primary = X_train_img[idx]
        modulation = X_train_sig[idx]
        label = y_train[idx]

        # Primary signal
        plt.subplot(n, 2, 2*i + 1)
        plt.plot(primary)
        plt.title(f"Class {label} | Primary Signal")
        plt.xlabel("Time")
        plt.ylabel("Amplitude")

        # Modulation signal
        plt.subplot(n, 2, 2*i + 2)
        plt.plot(modulation, color='orange')
        plt.title(f"Class {label} | Modulation Signal")
        plt.xlabel("Time")
        plt.ylabel("Amplitude")

    plt.tight_layout()
    plt.show()

# ------------------------------------------------
# Run visualization
# ------------------------------------------------
plot_samples(indices_per_class)

[TODO] Your Solution

Submisson Template Generator

# Example dummy prediction (replace with model)
y_pred = np.zeros(len(X_test_img), dtype=int)

submission = pd.DataFrame({
    "id": np.arange(len(X_test_img)),
    "label": y_pred
})

submission.to_csv("submission.csv", index=False)

Translated by SOTA. The Indonesian original is the official version and wins wherever the two differ. Only the statement cell of the notebook was in Indonesian; its code cells were already in English. If you organise this olympiad and would like the translation removed, email [email protected] and we will take it down.

At a glance

You get
multimodal_train.csv (label in the first column, then 4,800 primary and 128 modulation values) and multimodal_test_data.csv (no label).
You submit
submission.csv with columns id (0-based test row index) and label.
Scoring
Classification accuracy.
Rules
  • Individual participation.
Format
Pelatnas 1 IOAI 2026 (first national training-and-selection camp), Simulation 2 on Kaggle; competition window 17 April 2026 15:35 UTC – 18 April 2026 07:30 UTC; individual; up to 50 submissions per day.

Details

Year
2026, Kaggle
Round
National Training Camp 1 – Simulation 2 · 2.2 task
Language
Indonesian; English translation by SOTA
License
Subject to Competition Rules (Kaggle), as stated by the source