{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":102335,"databundleVersionId":12518947,"sourceType":"competition"}],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# Fixed synthetic test cases with correct demographic columns\n# Copy and paste this after loading your predictors in Kaggle\n\nimport numpy as np\nimport polars as pl\n\nprint(\"\\n\" + \"=\"*60)\nprint(\"Comprehensive Synthetic Test Cases (Fixed)\")\nprint(\"=\"*60)\n\n# Test 1: Normal IMU-only data\nprint(\"\\nTest 1: Normal IMU-only data\")\ntry:\n    sequence_data = {\n        'sequence_id': [10001] * 200,\n        'subject': [101] * 200,\n        'acc_x': np.random.randn(200).tolist(),\n        'acc_y': np.random.randn(200).tolist(),\n        'acc_z': (np.random.randn(200) + 9.8).tolist(),\n        'rot_w': (np.random.rand(200) * 0.8 + 0.2).tolist(),\n        'rot_x': (np.random.randn(200) * 0.1).tolist(),\n        'rot_y': (np.random.randn(200) * 0.1).tolist(),\n        'rot_z': (np.random.randn(200) * 0.1).tolist(),\n    }\n    demo_data = {\n        'subject': [101],\n        'adult_child': [1],\n        'age': [25],\n        'sex': [1],\n        'handedness': [1],\n        'height_cm': [175],\n        'shoulder_to_wrist_cm': [60],\n        'elbow_to_wrist_cm': [26]\n    }\n    result = predict(pl.DataFrame(sequence_data), pl.DataFrame(demo_data))\n    print(f\"✓ Success: {result}\")\nexcept Exception as e:\n    print(f\"✗ Failed: {type(e).__name__}: {e}\")\n    import traceback\n    traceback.print_exc()\n\n# Test 2: Full sensor data\nprint(\"\\nTest 2: Full sensor data (IMU + Thermopile + ToF)\")\ntry:\n    sequence_data = {\n        'sequence_id': [10002] * 200,\n        'subject': [102] * 200,\n        'acc_x': np.random.randn(200).tolist(),\n        'acc_y': np.random.randn(200).tolist(),\n        'acc_z': (np.random.randn(200) + 9.8).tolist(),\n        'rot_w': (np.random.rand(200) * 0.8 + 0.2).tolist(),\n        'rot_x': (np.random.randn(200) * 0.1).tolist(),\n        'rot_y': (np.random.randn(200) * 0.1).tolist(),\n        'rot_z': (np.random.randn(200) * 0.1).tolist(),\n    }\n    # Add thermopile\n    for i in range(1, 6):\n        sequence_data[f'thm_{i}'] = (np.random.rand(200) * 30 + 20).tolist()\n    # Add ToF\n    for s in range(1, 6):\n        for v in range(64):\n            sequence_data[f'tof_{s}_v{v}'] = np.random.randint(0, 255, 200).tolist()\n    \n    demo_data = {\n        'subject': [102],\n        'adult_child': [1],\n        'age': [35],\n        'sex': [0],\n        'handedness': [0],\n        'height_cm': [165],\n        'shoulder_to_wrist_cm': [55],\n        'elbow_to_wrist_cm': [24]\n    }\n    result = predict(pl.DataFrame(sequence_data), pl.DataFrame(demo_data))\n    print(f\"✓ Success: {result}\")\nexcept Exception as e:\n    print(f\"✗ Failed: {type(e).__name__}: {e}\")\n    import traceback\n    traceback.print_exc()\n\n# Test 3: Extreme values\nprint(\"\\nTest 3: Extreme sensor values (test clipping)\")\ntry:\n    sequence_data = {\n        'sequence_id': [10003] * 200,\n        'subject': [103] * 200,\n        'acc_x': (np.random.randn(200) * 1000).tolist(),\n        'acc_y': (np.random.randn(200) * 1000).tolist(),\n        'acc_z': (np.random.randn(200) * 1000).tolist(),\n        'rot_w': np.random.rand(200).tolist(),\n        'rot_x': (np.random.randn(200) * 100).tolist(),\n        'rot_y': (np.random.randn(200) * 100).tolist(),\n        'rot_z': (np.random.randn(200) * 100).tolist(),\n    }\n    for i in range(1, 6):\n        sequence_data[f'thm_{i}'] = (np.random.rand(200) * 1000).tolist()\n    \n    demo_data = {\n        'subject': [103],\n        'adult_child': [1],\n        'age': [99],\n        'sex': [1],\n        'handedness': [1],\n        'height_cm': [250],\n        'shoulder_to_wrist_cm': [100],\n        'elbow_to_wrist_cm': [45]\n    }\n    result = predict(pl.DataFrame(sequence_data), pl.DataFrame(demo_data))\n    print(f\"✓ Success: {result}\")\nexcept Exception as e:\n    print(f\"✗ Failed: {type(e).__name__}: {e}\")\n\n# Test 4: Missing columns\nprint(\"\\nTest 4: Missing rotation sensors\")\ntry:\n    sequence_data = {\n        'sequence_id': [10004] * 200,\n        'subject': [104] * 200,\n        'acc_x': np.random.randn(200).tolist(),\n        'acc_y': np.random.randn(200).tolist(),\n        'acc_z': np.random.randn(200).tolist(),\n        # Missing rot_w, rot_x, rot_y, rot_z\n    }\n    demo_data = {\n        'subject': [104],\n        'adult_child': [0],\n        'age': [8],\n        'sex': [1],\n        'handedness': [1],\n        'height_cm': [120],\n        'shoulder_to_wrist_cm': [35],\n        'elbow_to_wrist_cm': [15]\n    }\n    result = predict(pl.DataFrame(sequence_data), pl.DataFrame(demo_data))\n    print(f\"✓ Success: {result}\")\nexcept Exception as e:\n    print(f\"✗ Failed: {type(e).__name__}: {e}\")\n\n# Test 5: All zeros (dead sensors)\nprint(\"\\nTest 5: All zero values\")\ntry:\n    sequence_data = {\n        'sequence_id': [10005] * 200,\n        'subject': [105] * 200,\n        'acc_x': [0.0] * 200,\n        'acc_y': [0.0] * 200,\n        'acc_z': [0.0] * 200,\n        'rot_w': [0.0] * 200,\n        'rot_x': [0.0] * 200,\n        'rot_y': [0.0] * 200,\n        'rot_z': [0.0] * 200,\n    }\n    demo_data = {\n        'subject': [105],\n        'adult_child': [1],\n        'age': [50],\n        'sex': [0],\n        'handedness': [0],\n        'height_cm': [170],\n        'shoulder_to_wrist_cm': [58],\n        'elbow_to_wrist_cm': [25]\n    }\n    result = predict(pl.DataFrame(sequence_data), pl.DataFrame(demo_data))\n    print(f\"✓ Success: {result}\")\nexcept Exception as e:\n    print(f\"✗ Failed: {type(e).__name__}: {e}\")\n\n# Test 6: NaN and Inf values\nprint(\"\\nTest 6: NaN and Inf values\")\ntry:\n    sequence_data = {\n        'sequence_id': [10006] * 200,\n        'subject': [106] * 200,\n        'acc_x': [float('nan')] * 100 + [float('inf')] * 100,\n        'acc_y': [float('-inf')] * 100 + np.random.randn(100).tolist(),\n        'acc_z': np.random.randn(200).tolist(),\n        'rot_w': [float('nan')] * 200,\n        'rot_x': np.random.randn(200).tolist(),\n        'rot_y': np.random.randn(200).tolist(),\n        'rot_z': np.random.randn(200).tolist(),\n    }\n    demo_data = {\n        'subject': [106],\n        'adult_child': [1],\n        'age': [30],\n        'sex': [1],\n        'handedness': [1],\n        'height_cm': [170],\n        'shoulder_to_wrist_cm': [58],\n        'elbow_to_wrist_cm': [25]\n    }\n    result = predict(pl.DataFrame(sequence_data), pl.DataFrame(demo_data))\n    print(f\"✓ Success: {result}\")\nexcept Exception as e:\n    print(f\"✗ Failed: {type(e).__name__}: {e}\")\n\n# Test 7: Wrong sequence length\nprint(\"\\nTest 7: Wrong sequence length (150 instead of 200)\")\ntry:\n    sequence_data = {\n        'sequence_id': [10007] * 150,\n        'subject': [107] * 150,\n        'acc_x': np.random.randn(150).tolist(),\n        'acc_y': np.random.randn(150).tolist(),\n        'acc_z': np.random.randn(150).tolist(),\n        'rot_w': np.random.rand(150).tolist(),\n        'rot_x': np.random.randn(150).tolist(),\n        'rot_y': np.random.randn(150).tolist(),\n        'rot_z': np.random.randn(150).tolist(),\n    }\n    demo_data = {\n        'subject': [107],\n        'adult_child': [1],\n        'age': [30],\n        'sex': [1],\n        'handedness': [1],\n        'height_cm': [180],\n        'shoulder_to_wrist_cm': [62],\n        'elbow_to_wrist_cm': [27]\n    }\n    result = predict(pl.DataFrame(sequence_data), pl.DataFrame(demo_data))\n    print(f\"✓ Success: {result}\")\nexcept Exception as e:\n    print(f\"✗ Failed: {type(e).__name__}: {e}\")\n\n# Test 8: Empty sequence\nprint(\"\\nTest 8: Empty sequence (0 rows)\")\ntry:\n    sequence_data = {\n        'sequence_id': [],\n        'subject': [],\n        'acc_x': [],\n        'acc_y': [],\n        'acc_z': [],\n        'rot_w': [],\n        'rot_x': [],\n        'rot_y': [],\n        'rot_z': [],\n    }\n    demo_data = {\n        'subject': [108],\n        'adult_child': [1],\n        'age': [25],\n        'sex': [1],\n        'handedness': [1],\n        'height_cm': [175],\n        'shoulder_to_wrist_cm': [60],\n        'elbow_to_wrist_cm': [26]\n    }\n    result = predict(pl.DataFrame(sequence_data), pl.DataFrame(demo_data))\n    print(f\"✓ Success: {result}\")\nexcept Exception as e:\n    print(f\"✗ Failed: {type(e).__name__}: {e}\")\n\n# Test 9: Missing demographic data\nprint(\"\\nTest 9: Missing some demographic columns\")\ntry:\n    sequence_data = {\n        'sequence_id': [10009] * 200,\n        'subject': [109] * 200,\n        'acc_x': np.random.randn(200).tolist(),\n        'acc_y': np.random.randn(200).tolist(),\n        'acc_z': np.random.randn(200).tolist(),\n        'rot_w': np.random.rand(200).tolist(),\n        'rot_x': np.random.randn(200).tolist(),\n        'rot_y': np.random.randn(200).tolist(),\n        'rot_z': np.random.randn(200).tolist(),\n    }\n    demo_data = {\n        'subject': [109],\n        'adult_child': [1],\n        'age': [40],\n        # Missing sex, handedness, height_cm, shoulder_to_wrist_cm, elbow_to_wrist_cm\n    }\n    result = predict(pl.DataFrame(sequence_data), pl.DataFrame(demo_data))\n    print(f\"✓ Success: {result}\")\nexcept Exception as e:\n    print(f\"✗ Failed: {type(e).__name__}: {e}\")\n\n# Test 10: Very long sequence with all sensors\nprint(\"\\nTest 10: Very long sequence (500 timesteps) with all sensors\")\ntry:\n    sequence_data = {\n        'sequence_id': [10010] * 500,\n        'subject': [110] * 500,\n        'acc_x': np.random.randn(500).tolist(),\n        'acc_y': np.random.randn(500).tolist(),\n        'acc_z': np.random.randn(500).tolist(),\n        'rot_w': np.random.rand(500).tolist(),\n        'rot_x': np.random.randn(500).tolist(),\n        'rot_y': np.random.randn(500).tolist(),\n        'rot_z': np.random.randn(500).tolist(),\n    }\n    # Add all sensors\n    for i in range(1, 6):\n        sequence_data[f'thm_{i}'] = np.random.rand(500).tolist()\n    for s in range(1, 6):\n        for v in range(64):\n            sequence_data[f'tof_{s}_v{v}'] = np.random.randint(0, 255, 500).tolist()\n    \n    demo_data = {\n        'subject': [110],\n        'adult_child': [1],\n        'age': [45],\n        'sex': [0],\n        'handedness': [1],\n        'height_cm': [162],\n        'shoulder_to_wrist_cm': [54],\n        'elbow_to_wrist_cm': [23]\n    }\n    result = predict(pl.DataFrame(sequence_data), pl.DataFrame(demo_data))\n    print(f\"✓ Success: {result}\")\nexcept Exception as e:\n    print(f\"✗ Failed: {type(e).__name__}: {e}\")\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"outputs":[],"execution_count":null}]}