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.
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.
- Task notebook Indonesian original of Task notebook
- Competition overview Indonesian original of Competition overview
- Data description Indonesian original of Data description
Read the task notebook in English
🌌 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.
![]()
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:
-
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. -
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
...
idis the row index in the test data (starting from 0)labelis the predicted category
📏 Evaluation
Model performance will be measured using:
Classification accuracy
⚠️ 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) andmultimodal_test_data.csv(no label).- You submit
submission.csvwith 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.