Dheeraj-13 commited on
Commit
bbeec91
·
1 Parent(s): 48cf837

Fresh deployment

Browse files
.streamlit/config.toml ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ [theme]
2
+ base = "light"
3
+ primaryColor = "#0f766e" # Teal 700
4
+ backgroundColor = "#ffffff"
5
+ secondaryBackgroundColor = "#f0fdfa" # Teal 50
6
+ textColor = "#111827"
7
+ font = "sans serif"
Dockerfile CHANGED
@@ -1,20 +1,16 @@
1
- FROM python:3.13.5-slim
2
 
3
  WORKDIR /app
4
 
5
- RUN apt-get update && apt-get install -y \
6
- build-essential \
7
- curl \
8
- git \
9
- && rm -rf /var/lib/apt/lists/*
10
 
11
- COPY requirements.txt ./
12
- COPY src/ ./src/
13
-
14
- RUN pip3 install -r requirements.txt
15
 
 
16
  EXPOSE 8501
17
 
18
- HEALTHCHECK CMD curl --fail http://localhost:8501/_stcore/health
19
-
20
- ENTRYPOINT ["streamlit", "run", "src/streamlit_app.py", "--server.port=8501", "--server.address=0.0.0.0"]
 
1
+ FROM python:3.9-slim
2
 
3
  WORKDIR /app
4
 
5
+ # Install dependencies
6
+ COPY requirements.txt .
7
+ RUN pip install --no-cache-dir -r requirements.txt
 
 
8
 
9
+ # Copy source code
10
+ COPY . .
 
 
11
 
12
+ # Expose Streamlit port
13
  EXPOSE 8501
14
 
15
+ # Run the app
16
+ CMD ["streamlit", "run", "mi_platform/ui/dashboard.py", "--server.port=8501", "--server.address=0.0.0.0"]
 
mi_platform/data/__pycache__/storage.cpython-311.pyc ADDED
Binary file (2.46 kB). View file
 
mi_platform/data/dft_data.csv ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ material_id,formula,formation_energy_per_atom,band_gap,structure,volume,is_metal
2
+ mp-mock-1000,Si2Fe3,-1.77,0.0,Cubic,43.05,True
3
+ mp-mock-1001,Ga2N1,-2.024,0.247,Hexagonal,38.9,False
4
+ mp-mock-1002,C1Al3,-0.923,1.696,Cubic,38.36,False
5
+ mp-mock-1003,Fe2N2,-2.124,1.25,Orthorhombic,45.16,False
6
+ mp-mock-1004,Ga1O2,-2.237,0.258,Orthorhombic,42.55,False
7
+ mp-mock-1005,Ga2C2,-1.141,1.127,Orthorhombic,39.07,False
8
+ mp-mock-1006,Fe2O1,-1.424,0.872,Cubic,38.93,False
9
+ mp-mock-1007,Ti2Ga2,-1.739,0.0,Hexagonal,36.19,True
10
+ mp-mock-1008,O2N3,-1.171,0.685,Orthorhombic,37.83,False
11
+ mp-mock-1009,Fe2Al1,-1.633,0.59,Tetragonal,36.17,False
12
+ mp-mock-1010,Si1C3,-0.309,0.961,Tetragonal,27.78,False
13
+ mp-mock-1011,N2Ti3,-1.367,1.475,Orthorhombic,47.54,False
14
+ mp-mock-1012,N2Al3,-1.406,0.0,Cubic,45.11,True
15
+ mp-mock-1013,Ti2Si2,-1.755,0.531,Orthorhombic,29.9,False
16
+ mp-mock-1014,Fe2O3,-1.637,0.0,Orthorhombic,33.92,True
17
+ mp-mock-1015,Si2Ti2,-1.998,0.238,Cubic,38.29,False
18
+ mp-mock-1016,Fe1C1,-1.496,0.087,Hexagonal,47.68,True
19
+ mp-mock-1017,O2Al2,-1.685,0.561,Cubic,42.25,False
20
+ mp-mock-1018,C1O1,-1.53,2.038,Orthorhombic,42.38,False
21
+ mp-mock-1019,C1O2,-0.586,0.231,Orthorhombic,45.71,False
22
+ mp-mock-1020,C1O2,-1.905,1.609,Orthorhombic,36.9,False
23
+ mp-mock-1021,Ga1N1,-1.222,0.724,Orthorhombic,32.03,False
24
+ mp-mock-1022,Al1Ga1,-1.239,0.454,Hexagonal,35.81,False
25
+ mp-mock-1023,O1Ti1,-2.025,0.0,Tetragonal,35.3,True
26
+ mp-mock-1024,Si1O1,-1.766,1.229,Hexagonal,38.34,False
27
+ mp-mock-1025,Al1N3,-1.961,0.641,Tetragonal,42.0,False
28
+ mp-mock-1026,O1C2,-1.485,0.0,Tetragonal,32.26,True
29
+ mp-mock-1027,Ti2O3,-1.317,0.128,Tetragonal,34.02,False
30
+ mp-mock-1028,Al1Ga3,-1.718,0.464,Hexagonal,40.15,False
31
+ mp-mock-1029,Fe2O1,-0.792,1.15,Cubic,37.05,False
32
+ mp-mock-1030,N1Si3,-1.578,1.2,Tetragonal,39.47,False
33
+ mp-mock-1031,Ga2C3,-2.153,0.198,Orthorhombic,46.67,False
34
+ mp-mock-1032,Si1Al3,-2.38,0.0,Tetragonal,40.47,True
35
+ mp-mock-1033,Ga2N1,-0.849,1.641,Hexagonal,47.82,False
36
+ mp-mock-1034,C1Si1,-1.601,0.0,Cubic,41.13,True
37
+ mp-mock-1035,Ti2Si3,-0.823,0.391,Tetragonal,39.4,False
38
+ mp-mock-1036,C2Si3,-0.655,3.392,Orthorhombic,31.68,False
39
+ mp-mock-1037,Ga2Fe3,-1.163,0.417,Orthorhombic,38.87,False
40
+ mp-mock-1038,Al2Ga1,-2.058,0.173,Hexagonal,42.87,False
41
+ mp-mock-1039,N2Ga3,-1.389,1.655,Hexagonal,43.81,False
42
+ mp-mock-1040,Si1C1,-1.679,0.411,Orthorhombic,32.48,False
43
+ mp-mock-1041,Si1C2,-1.58,0.0,Hexagonal,46.83,True
44
+ mp-mock-1042,O2Fe1,-2.484,0.0,Hexagonal,39.42,True
45
+ mp-mock-1043,Fe1O3,-2.129,0.0,Orthorhombic,43.76,True
46
+ mp-mock-1044,Al1Fe1,-0.99,2.488,Cubic,48.64,False
47
+ mp-mock-1045,Ga1N2,-1.564,1.082,Hexagonal,44.33,False
48
+ mp-mock-1046,C1Si1,-1.455,1.34,Cubic,27.64,False
49
+ mp-mock-1047,O2Al1,-1.064,0.272,Tetragonal,36.9,False
50
+ mp-mock-1048,Ti2N3,-1.16,1.016,Orthorhombic,40.12,False
51
+ mp-mock-1049,Al1Fe3,-1.434,0.469,Orthorhombic,47.5,False
52
+ mp-mock-1050,O1Si2,-1.621,0.373,Orthorhombic,39.75,False
53
+ mp-mock-1051,Al1Ti3,-2.056,0.0,Cubic,37.71,True
54
+ mp-mock-1052,Al2C3,-2.083,0.876,Tetragonal,38.11,False
55
+ mp-mock-1053,Ga1Fe3,-1.837,0.0,Tetragonal,35.06,True
56
+ mp-mock-1054,Ti2Ga1,-1.449,0.34,Orthorhombic,39.86,False
57
+ mp-mock-1055,N2Si2,-1.893,0.881,Orthorhombic,43.44,False
58
+ mp-mock-1056,Fe2Ti1,-1.458,1.096,Cubic,41.61,False
59
+ mp-mock-1057,N1Al3,-1.948,0.0,Orthorhombic,33.71,True
60
+ mp-mock-1058,C2Al3,-0.836,1.779,Cubic,39.92,False
61
+ mp-mock-1059,Al2C1,-2.562,0.0,Cubic,39.33,True
62
+ mp-mock-1060,Si2O3,-1.503,1.387,Hexagonal,45.31,False
63
+ mp-mock-1061,Al1O1,-1.483,0.0,Orthorhombic,39.46,True
64
+ mp-mock-1062,Ga2O1,-1.786,1.256,Orthorhombic,39.98,False
65
+ mp-mock-1063,Al1N1,-0.941,1.077,Tetragonal,48.49,False
66
+ mp-mock-1064,Fe2Ga3,-1.415,0.394,Hexagonal,39.4,False
67
+ mp-mock-1065,Fe2Al1,-1.069,2.194,Orthorhombic,42.03,False
68
+ mp-mock-1066,Fe2Ti1,-1.774,0.063,Orthorhombic,35.7,True
69
+ mp-mock-1067,O1Al2,-1.303,0.552,Orthorhombic,37.6,False
70
+ mp-mock-1068,Fe1Ti2,-1.524,1.799,Orthorhombic,45.47,False
71
+ mp-mock-1069,Al2N2,-2.169,0.062,Orthorhombic,35.13,True
72
+ mp-mock-1070,Al1N3,-0.923,0.899,Hexagonal,46.06,False
73
+ mp-mock-1071,N2Si2,-1.575,0.723,Hexagonal,39.36,False
74
+ mp-mock-1072,C2N1,-1.313,0.492,Cubic,43.22,False
75
+ mp-mock-1073,Ti2Fe2,-1.593,1.62,Cubic,39.32,False
76
+ mp-mock-1074,Al2N1,-1.067,0.562,Orthorhombic,40.78,False
77
+ mp-mock-1075,Al2O1,-2.308,0.617,Orthorhombic,41.27,False
78
+ mp-mock-1076,Ti1Ga1,-1.411,0.655,Hexagonal,44.13,False
79
+ mp-mock-1077,Ga1Si1,-1.596,1.765,Cubic,38.37,False
80
+ mp-mock-1078,Ti2Si1,-1.357,0.0,Tetragonal,40.63,True
81
+ mp-mock-1079,N2Fe3,-1.927,0.0,Orthorhombic,41.28,True
82
+ mp-mock-1080,O1Si2,-1.87,0.96,Orthorhombic,40.41,False
83
+ mp-mock-1081,Si1Al3,-1.722,0.768,Cubic,39.6,False
84
+ mp-mock-1082,Si2O1,-1.105,2.549,Cubic,36.62,False
85
+ mp-mock-1083,C2Fe2,-1.309,0.48,Orthorhombic,41.82,False
86
+ mp-mock-1084,Si1Fe1,-1.008,1.451,Tetragonal,46.49,False
87
+ mp-mock-1085,Al2O3,-2.054,0.0,Cubic,39.56,True
88
+ mp-mock-1086,Si2Al2,-1.988,0.0,Hexagonal,37.8,True
89
+ mp-mock-1087,C1Ti1,-1.82,1.077,Tetragonal,26.11,False
90
+ mp-mock-1088,Al1O1,-0.909,1.53,Cubic,35.14,False
91
+ mp-mock-1089,N1Ti1,-2.043,0.0,Cubic,42.28,True
92
+ mp-mock-1090,Ga2Si1,-1.437,0.631,Tetragonal,37.58,False
93
+ mp-mock-1091,Ti2Si3,-1.606,2.354,Hexagonal,30.3,False
94
+ mp-mock-1092,Al2O3,-1.737,0.06,Hexagonal,35.97,True
95
+ mp-mock-1093,N1Al2,-1.874,0.938,Hexagonal,36.54,False
96
+ mp-mock-1094,Al1C1,-1.039,0.106,Hexagonal,36.38,False
97
+ mp-mock-1095,C2Si3,-1.104,0.454,Hexagonal,35.34,False
98
+ mp-mock-1096,Fe2C2,-0.849,0.0,Hexagonal,32.66,True
99
+ mp-mock-1097,Ti1O2,-1.148,0.0,Tetragonal,39.99,True
100
+ mp-mock-1098,Ga2Ti1,-1.237,1.566,Orthorhombic,30.78,False
101
+ mp-mock-1099,N2Si1,-0.472,2.097,Hexagonal,24.7,False
mi_platform/data/dft_data_2d.csv ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ material_id,formula,formation_energy_per_atom,band_gap,structure,volume,is_metal
2
+ mp-2d-1000,MoTe2,-0.855,1.19,2D-Hexagonal,35.1,False
3
+ mp-2d-1001,WSe2,-0.75,1.767,2D-Hexagonal,33.43,False
4
+ mp-2d-1002,MoS2,-0.788,1.727,2D-Hexagonal,32.74,False
5
+ mp-2d-1003,WSe2,-0.949,1.732,2D-Hexagonal,33.71,False
6
+ mp-2d-1004,MoSe2,-0.832,1.38,2D-Hexagonal,34.73,False
7
+ mp-2d-1005,MoSe2,-0.634,1.441,2D-Hexagonal,35.59,False
8
+ mp-2d-1006,MoSe2,-0.832,1.51,2D-Hexagonal,37.18,False
9
+ mp-2d-1007,MoTe2,-0.9,1.132,2D-Hexagonal,36.33,False
10
+ mp-2d-1008,WS2,-0.931,2.272,2D-Hexagonal,33.94,False
11
+ mp-2d-1009,WSe2,-0.847,1.542,2D-Hexagonal,32.64,False
12
+ mp-2d-1010,WS2,-0.7,1.979,2D-Hexagonal,34.74,False
13
+ mp-2d-1011,WTe2,-0.808,1.434,2D-Hexagonal,35.74,False
14
+ mp-2d-1012,WSe2,-0.925,1.72,2D-Hexagonal,30.86,False
15
+ mp-2d-1013,MoTe2,-1.037,1.357,2D-Hexagonal,37.66,False
16
+ mp-2d-1014,MoS2,-0.709,1.808,2D-Hexagonal,32.71,False
17
+ mp-2d-1015,WS2,-0.772,1.976,2D-Hexagonal,37.61,False
18
+ mp-2d-1016,WSe2,-0.86,1.628,2D-Hexagonal,34.44,False
19
+ mp-2d-1017,MoSe2,-0.713,1.479,2D-Hexagonal,36.23,False
20
+ mp-2d-1018,WSe2,-0.759,1.475,2D-Hexagonal,33.12,False
21
+ mp-2d-1019,MoSe2,-0.75,1.419,2D-Hexagonal,38.68,False
22
+ mp-2d-1020,MoSe2,-0.699,1.482,2D-Hexagonal,34.13,False
23
+ mp-2d-1021,MoS2,-0.844,1.729,2D-Hexagonal,36.89,False
24
+ mp-2d-1022,WSe2,-0.51,1.74,2D-Hexagonal,36.79,False
25
+ mp-2d-1023,WTe2,-0.837,1.47,2D-Hexagonal,35.24,False
26
+ mp-2d-1024,WS2,-0.931,2.011,2D-Hexagonal,32.11,False
27
+ mp-2d-1025,WS2,-0.9,2.149,2D-Hexagonal,33.31,False
28
+ mp-2d-1026,MoTe2,-0.724,1.231,2D-Hexagonal,36.47,False
29
+ mp-2d-1027,WS2,-0.746,2.214,2D-Hexagonal,33.95,False
30
+ mp-2d-1028,MoSe2,-0.741,1.514,2D-Hexagonal,36.48,False
31
+ mp-2d-1029,WSe2,-0.964,1.703,2D-Hexagonal,35.07,False
32
+ mp-2d-1030,MoS2,-0.983,1.986,2D-Hexagonal,35.06,False
33
+ mp-2d-1031,MoS2,-0.888,1.751,2D-Hexagonal,31.87,False
34
+ mp-2d-1032,MoS2,-0.674,1.708,2D-Hexagonal,32.6,False
35
+ mp-2d-1033,MoS2,-0.763,1.778,2D-Hexagonal,34.34,False
36
+ mp-2d-1034,WS2,-0.67,1.94,2D-Hexagonal,36.62,False
37
+ mp-2d-1035,MoS2,-0.76,1.932,2D-Hexagonal,37.97,False
38
+ mp-2d-1036,WTe2,-0.864,1.279,2D-Hexagonal,37.34,False
39
+ mp-2d-1037,WTe2,-0.971,1.38,2D-Hexagonal,31.93,False
40
+ mp-2d-1038,WS2,-0.881,1.971,2D-Hexagonal,34.94,False
41
+ mp-2d-1039,MoTe2,-0.754,1.411,2D-Hexagonal,31.34,False
42
+ mp-2d-1040,WS2,-0.842,1.94,2D-Hexagonal,32.1,False
43
+ mp-2d-1041,MoTe2,-0.82,1.21,2D-Hexagonal,35.84,False
44
+ mp-2d-1042,WTe2,-0.947,1.512,2D-Hexagonal,31.37,False
45
+ mp-2d-1043,WS2,-0.786,2.09,2D-Hexagonal,33.71,False
46
+ mp-2d-1044,MoS2,-0.722,1.875,2D-Hexagonal,33.22,False
47
+ mp-2d-1045,MoSe2,-0.793,1.515,2D-Hexagonal,35.67,False
48
+ mp-2d-1046,MoTe2,-1.057,1.465,2D-Hexagonal,34.9,False
49
+ mp-2d-1047,WS2,-0.637,1.919,2D-Hexagonal,35.08,False
50
+ mp-2d-1048,WSe2,-0.915,1.645,2D-Hexagonal,31.35,False
51
+ mp-2d-1049,WSe2,-0.73,1.458,2D-Hexagonal,35.07,False
52
+ mp-2d-1050,MoSe2,-0.811,1.582,2D-Hexagonal,34.93,False
53
+ mp-2d-1051,MoSe2,-0.715,1.727,2D-Hexagonal,35.77,False
54
+ mp-2d-1052,WS2,-0.898,1.928,2D-Hexagonal,37.83,False
55
+ mp-2d-1053,MoS2,-0.736,1.645,2D-Hexagonal,38.39,False
56
+ mp-2d-1054,MoTe2,-0.685,1.099,2D-Hexagonal,36.33,False
57
+ mp-2d-1055,MoSe2,-0.728,1.373,2D-Hexagonal,33.65,False
58
+ mp-2d-1056,MoSe2,-0.782,1.341,2D-Hexagonal,33.57,False
59
+ mp-2d-1057,WTe2,-0.932,1.357,2D-Hexagonal,35.26,False
60
+ mp-2d-1058,WS2,-0.686,1.896,2D-Hexagonal,35.18,False
61
+ mp-2d-1059,MoS2,-0.691,1.572,2D-Hexagonal,37.91,False
62
+ mp-2d-1060,MoTe2,-0.866,0.964,2D-Hexagonal,34.09,False
63
+ mp-2d-1061,MoTe2,-0.766,1.028,2D-Hexagonal,35.34,False
64
+ mp-2d-1062,WS2,-0.747,2.021,2D-Hexagonal,31.97,False
65
+ mp-2d-1063,WSe2,-0.82,1.851,2D-Hexagonal,34.5,False
66
+ mp-2d-1064,WTe2,-0.889,1.556,2D-Hexagonal,35.83,False
67
+ mp-2d-1065,WS2,-0.954,1.841,2D-Hexagonal,36.88,False
68
+ mp-2d-1066,WTe2,-0.772,1.515,2D-Hexagonal,38.1,False
69
+ mp-2d-1067,MoSe2,-0.614,1.534,2D-Hexagonal,34.92,False
70
+ mp-2d-1068,MoS2,-0.775,1.833,2D-Hexagonal,34.7,False
71
+ mp-2d-1069,WTe2,-0.897,1.297,2D-Hexagonal,33.65,False
72
+ mp-2d-1070,MoS2,-0.662,1.863,2D-Hexagonal,31.83,False
73
+ mp-2d-1071,MoTe2,-0.821,1.155,2D-Hexagonal,41.27,False
74
+ mp-2d-1072,WSe2,-0.735,1.897,2D-Hexagonal,31.27,False
75
+ mp-2d-1073,WSe2,-0.819,1.713,2D-Hexagonal,36.26,False
76
+ mp-2d-1074,WSe2,-1.021,1.756,2D-Hexagonal,30.51,False
77
+ mp-2d-1075,WTe2,-0.804,1.358,2D-Hexagonal,30.35,False
78
+ mp-2d-1076,MoTe2,-0.859,1.277,2D-Hexagonal,36.61,False
79
+ mp-2d-1077,WSe2,-0.791,1.731,2D-Hexagonal,36.24,False
80
+ mp-2d-1078,MoS2,-0.695,1.839,2D-Hexagonal,33.34,False
81
+ mp-2d-1079,WTe2,-0.83,1.381,2D-Hexagonal,33.83,False
82
+ mp-2d-1080,MoSe2,-0.871,1.588,2D-Hexagonal,35.24,False
83
+ mp-2d-1081,MoTe2,-0.821,1.177,2D-Hexagonal,39.57,False
84
+ mp-2d-1082,WTe2,-0.924,1.39,2D-Hexagonal,33.64,False
85
+ mp-2d-1083,WSe2,-0.92,1.533,2D-Hexagonal,37.86,False
86
+ mp-2d-1084,MoS2,-0.601,1.992,2D-Hexagonal,37.34,False
87
+ mp-2d-1085,MoSe2,-0.733,1.535,2D-Hexagonal,37.0,False
88
+ mp-2d-1086,WTe2,-0.691,1.388,2D-Hexagonal,35.94,False
89
+ mp-2d-1087,WTe2,-0.91,1.367,2D-Hexagonal,32.81,False
90
+ mp-2d-1088,WS2,-0.869,1.989,2D-Hexagonal,36.49,False
91
+ mp-2d-1089,MoSe2,-0.591,1.479,2D-Hexagonal,33.36,False
92
+ mp-2d-1090,MoTe2,-0.765,1.204,2D-Hexagonal,37.5,False
93
+ mp-2d-1091,WSe2,-0.675,1.486,2D-Hexagonal,31.79,False
94
+ mp-2d-1092,WSe2,-0.718,1.705,2D-Hexagonal,32.25,False
95
+ mp-2d-1093,WSe2,-0.729,1.59,2D-Hexagonal,36.67,False
96
+ mp-2d-1094,WSe2,-0.777,1.762,2D-Hexagonal,33.67,False
97
+ mp-2d-1095,WSe2,-0.926,1.77,2D-Hexagonal,34.6,False
98
+ mp-2d-1096,WS2,-0.953,2.045,2D-Hexagonal,34.6,False
99
+ mp-2d-1097,WSe2,-0.709,1.732,2D-Hexagonal,39.78,False
100
+ mp-2d-1098,MoS2,-0.808,1.692,2D-Hexagonal,41.04,False
101
+ mp-2d-1099,WS2,-0.939,1.914,2D-Hexagonal,33.97,False
mi_platform/data/dft_data_generic.csv ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ material_id,formula,formation_energy_per_atom,band_gap,structure,volume,is_metal
2
+ mp-mock-1000,Si2Fe3,-1.77,0.0,Cubic,43.05,True
3
+ mp-mock-1001,Ga2N1,-2.024,0.247,Hexagonal,38.9,False
4
+ mp-mock-1002,C1Al3,-0.923,1.696,Cubic,38.36,False
5
+ mp-mock-1003,Fe2N2,-2.124,1.25,Orthorhombic,45.16,False
6
+ mp-mock-1004,Ga1O2,-2.237,0.258,Orthorhombic,42.55,False
7
+ mp-mock-1005,Ga2C2,-1.141,1.127,Orthorhombic,39.07,False
8
+ mp-mock-1006,Fe2O1,-1.424,0.872,Cubic,38.93,False
9
+ mp-mock-1007,Ti2Ga2,-1.739,0.0,Hexagonal,36.19,True
10
+ mp-mock-1008,O2N3,-1.171,0.685,Orthorhombic,37.83,False
11
+ mp-mock-1009,Fe2Al1,-1.633,0.59,Tetragonal,36.17,False
12
+ mp-mock-1010,Si1C3,-0.309,0.961,Tetragonal,27.78,False
13
+ mp-mock-1011,N2Ti3,-1.367,1.475,Orthorhombic,47.54,False
14
+ mp-mock-1012,N2Al3,-1.406,0.0,Cubic,45.11,True
15
+ mp-mock-1013,Ti2Si2,-1.755,0.531,Orthorhombic,29.9,False
16
+ mp-mock-1014,Fe2O3,-1.637,0.0,Orthorhombic,33.92,True
17
+ mp-mock-1015,Si2Ti2,-1.998,0.238,Cubic,38.29,False
18
+ mp-mock-1016,Fe1C1,-1.496,0.087,Hexagonal,47.68,True
19
+ mp-mock-1017,O2Al2,-1.685,0.561,Cubic,42.25,False
20
+ mp-mock-1018,C1O1,-1.53,2.038,Orthorhombic,42.38,False
21
+ mp-mock-1019,C1O2,-0.586,0.231,Orthorhombic,45.71,False
22
+ mp-mock-1020,C1O2,-1.905,1.609,Orthorhombic,36.9,False
23
+ mp-mock-1021,Ga1N1,-1.222,0.724,Orthorhombic,32.03,False
24
+ mp-mock-1022,Al1Ga1,-1.239,0.454,Hexagonal,35.81,False
25
+ mp-mock-1023,O1Ti1,-2.025,0.0,Tetragonal,35.3,True
26
+ mp-mock-1024,Si1O1,-1.766,1.229,Hexagonal,38.34,False
27
+ mp-mock-1025,Al1N3,-1.961,0.641,Tetragonal,42.0,False
28
+ mp-mock-1026,O1C2,-1.485,0.0,Tetragonal,32.26,True
29
+ mp-mock-1027,Ti2O3,-1.317,0.128,Tetragonal,34.02,False
30
+ mp-mock-1028,Al1Ga3,-1.718,0.464,Hexagonal,40.15,False
31
+ mp-mock-1029,Fe2O1,-0.792,1.15,Cubic,37.05,False
32
+ mp-mock-1030,N1Si3,-1.578,1.2,Tetragonal,39.47,False
33
+ mp-mock-1031,Ga2C3,-2.153,0.198,Orthorhombic,46.67,False
34
+ mp-mock-1032,Si1Al3,-2.38,0.0,Tetragonal,40.47,True
35
+ mp-mock-1033,Ga2N1,-0.849,1.641,Hexagonal,47.82,False
36
+ mp-mock-1034,C1Si1,-1.601,0.0,Cubic,41.13,True
37
+ mp-mock-1035,Ti2Si3,-0.823,0.391,Tetragonal,39.4,False
38
+ mp-mock-1036,C2Si3,-0.655,3.392,Orthorhombic,31.68,False
39
+ mp-mock-1037,Ga2Fe3,-1.163,0.417,Orthorhombic,38.87,False
40
+ mp-mock-1038,Al2Ga1,-2.058,0.173,Hexagonal,42.87,False
41
+ mp-mock-1039,N2Ga3,-1.389,1.655,Hexagonal,43.81,False
42
+ mp-mock-1040,Si1C1,-1.679,0.411,Orthorhombic,32.48,False
43
+ mp-mock-1041,Si1C2,-1.58,0.0,Hexagonal,46.83,True
44
+ mp-mock-1042,O2Fe1,-2.484,0.0,Hexagonal,39.42,True
45
+ mp-mock-1043,Fe1O3,-2.129,0.0,Orthorhombic,43.76,True
46
+ mp-mock-1044,Al1Fe1,-0.99,2.488,Cubic,48.64,False
47
+ mp-mock-1045,Ga1N2,-1.564,1.082,Hexagonal,44.33,False
48
+ mp-mock-1046,C1Si1,-1.455,1.34,Cubic,27.64,False
49
+ mp-mock-1047,O2Al1,-1.064,0.272,Tetragonal,36.9,False
50
+ mp-mock-1048,Ti2N3,-1.16,1.016,Orthorhombic,40.12,False
51
+ mp-mock-1049,Al1Fe3,-1.434,0.469,Orthorhombic,47.5,False
52
+ mp-mock-1050,O1Si2,-1.621,0.373,Orthorhombic,39.75,False
53
+ mp-mock-1051,Al1Ti3,-2.056,0.0,Cubic,37.71,True
54
+ mp-mock-1052,Al2C3,-2.083,0.876,Tetragonal,38.11,False
55
+ mp-mock-1053,Ga1Fe3,-1.837,0.0,Tetragonal,35.06,True
56
+ mp-mock-1054,Ti2Ga1,-1.449,0.34,Orthorhombic,39.86,False
57
+ mp-mock-1055,N2Si2,-1.893,0.881,Orthorhombic,43.44,False
58
+ mp-mock-1056,Fe2Ti1,-1.458,1.096,Cubic,41.61,False
59
+ mp-mock-1057,N1Al3,-1.948,0.0,Orthorhombic,33.71,True
60
+ mp-mock-1058,C2Al3,-0.836,1.779,Cubic,39.92,False
61
+ mp-mock-1059,Al2C1,-2.562,0.0,Cubic,39.33,True
62
+ mp-mock-1060,Si2O3,-1.503,1.387,Hexagonal,45.31,False
63
+ mp-mock-1061,Al1O1,-1.483,0.0,Orthorhombic,39.46,True
64
+ mp-mock-1062,Ga2O1,-1.786,1.256,Orthorhombic,39.98,False
65
+ mp-mock-1063,Al1N1,-0.941,1.077,Tetragonal,48.49,False
66
+ mp-mock-1064,Fe2Ga3,-1.415,0.394,Hexagonal,39.4,False
67
+ mp-mock-1065,Fe2Al1,-1.069,2.194,Orthorhombic,42.03,False
68
+ mp-mock-1066,Fe2Ti1,-1.774,0.063,Orthorhombic,35.7,True
69
+ mp-mock-1067,O1Al2,-1.303,0.552,Orthorhombic,37.6,False
70
+ mp-mock-1068,Fe1Ti2,-1.524,1.799,Orthorhombic,45.47,False
71
+ mp-mock-1069,Al2N2,-2.169,0.062,Orthorhombic,35.13,True
72
+ mp-mock-1070,Al1N3,-0.923,0.899,Hexagonal,46.06,False
73
+ mp-mock-1071,N2Si2,-1.575,0.723,Hexagonal,39.36,False
74
+ mp-mock-1072,C2N1,-1.313,0.492,Cubic,43.22,False
75
+ mp-mock-1073,Ti2Fe2,-1.593,1.62,Cubic,39.32,False
76
+ mp-mock-1074,Al2N1,-1.067,0.562,Orthorhombic,40.78,False
77
+ mp-mock-1075,Al2O1,-2.308,0.617,Orthorhombic,41.27,False
78
+ mp-mock-1076,Ti1Ga1,-1.411,0.655,Hexagonal,44.13,False
79
+ mp-mock-1077,Ga1Si1,-1.596,1.765,Cubic,38.37,False
80
+ mp-mock-1078,Ti2Si1,-1.357,0.0,Tetragonal,40.63,True
81
+ mp-mock-1079,N2Fe3,-1.927,0.0,Orthorhombic,41.28,True
82
+ mp-mock-1080,O1Si2,-1.87,0.96,Orthorhombic,40.41,False
83
+ mp-mock-1081,Si1Al3,-1.722,0.768,Cubic,39.6,False
84
+ mp-mock-1082,Si2O1,-1.105,2.549,Cubic,36.62,False
85
+ mp-mock-1083,C2Fe2,-1.309,0.48,Orthorhombic,41.82,False
86
+ mp-mock-1084,Si1Fe1,-1.008,1.451,Tetragonal,46.49,False
87
+ mp-mock-1085,Al2O3,-2.054,0.0,Cubic,39.56,True
88
+ mp-mock-1086,Si2Al2,-1.988,0.0,Hexagonal,37.8,True
89
+ mp-mock-1087,C1Ti1,-1.82,1.077,Tetragonal,26.11,False
90
+ mp-mock-1088,Al1O1,-0.909,1.53,Cubic,35.14,False
91
+ mp-mock-1089,N1Ti1,-2.043,0.0,Cubic,42.28,True
92
+ mp-mock-1090,Ga2Si1,-1.437,0.631,Tetragonal,37.58,False
93
+ mp-mock-1091,Ti2Si3,-1.606,2.354,Hexagonal,30.3,False
94
+ mp-mock-1092,Al2O3,-1.737,0.06,Hexagonal,35.97,True
95
+ mp-mock-1093,N1Al2,-1.874,0.938,Hexagonal,36.54,False
96
+ mp-mock-1094,Al1C1,-1.039,0.106,Hexagonal,36.38,False
97
+ mp-mock-1095,C2Si3,-1.104,0.454,Hexagonal,35.34,False
98
+ mp-mock-1096,Fe2C2,-0.849,0.0,Hexagonal,32.66,True
99
+ mp-mock-1097,Ti1O2,-1.148,0.0,Tetragonal,39.99,True
100
+ mp-mock-1098,Ga2Ti1,-1.237,1.566,Orthorhombic,30.78,False
101
+ mp-mock-1099,N2Si1,-0.472,2.097,Hexagonal,24.7,False
mi_platform/data/dft_data_perovskite.csv ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ material_id,formula,formation_energy_per_atom,band_gap,structure,volume,is_metal
2
+ mp-perov-1000,MAPbCl3,-2.053,2.382,Perovskite,162.43,False
3
+ mp-perov-1001,FASnI3,-1.999,1.063,Perovskite,173.56,False
4
+ mp-perov-1002,MAPbI3,-1.749,1.406,Perovskite,173.02,False
5
+ mp-perov-1003,FAPbCl3,-1.972,2.372,Perovskite,176.61,False
6
+ mp-perov-1004,MASnI3,-1.528,1.46,Perovskite,182.62,False
7
+ mp-perov-1005,MASnI3,-2.024,1.257,Perovskite,172.83,False
8
+ mp-perov-1006,FAPbCl3,-2.222,2.13,Perovskite,169.57,False
9
+ mp-perov-1007,MAPbBr3,-1.866,1.834,Perovskite,168.07,False
10
+ mp-perov-1008,MAPbBr3,-2.369,1.995,Perovskite,184.22,False
11
+ mp-perov-1009,CsSnBr3,-1.744,1.58,Perovskite,200.11,False
12
+ mp-perov-1010,MAPbCl3,-1.785,2.469,Perovskite,183.55,False
13
+ mp-perov-1011,CsSnI3,-2.273,1.323,Perovskite,176.6,False
14
+ mp-perov-1012,MASnCl3,-2.025,2.056,Perovskite,177.78,False
15
+ mp-perov-1013,FASnBr3,-1.801,1.771,Perovskite,180.87,False
16
+ mp-perov-1014,MASnI3,-1.738,1.091,Perovskite,171.27,False
17
+ mp-perov-1015,CsPbBr3,-2.099,1.978,Perovskite,171.02,False
18
+ mp-perov-1016,MASnI3,-2.559,1.143,Perovskite,159.3,False
19
+ mp-perov-1017,CsSnBr3,-1.935,1.506,Perovskite,168.39,False
20
+ mp-perov-1018,FASnI3,-1.993,1.305,Perovskite,183.8,False
21
+ mp-perov-1019,CsSnI3,-1.956,1.35,Perovskite,177.06,False
22
+ mp-perov-1020,CsSnBr3,-1.839,1.806,Perovskite,159.81,False
23
+ mp-perov-1021,MASnBr3,-1.771,1.758,Perovskite,186.61,False
24
+ mp-perov-1022,MAPbBr3,-1.908,1.753,Perovskite,174.66,False
25
+ mp-perov-1023,FAPbCl3,-2.015,2.522,Perovskite,178.91,False
26
+ mp-perov-1024,CsSnCl3,-1.575,2.003,Perovskite,189.89,False
27
+ mp-perov-1025,FAPbBr3,-1.813,1.954,Perovskite,172.4,False
28
+ mp-perov-1026,MAPbCl3,-1.994,2.458,Perovskite,163.61,False
29
+ mp-perov-1027,MAPbCl3,-2.36,2.16,Perovskite,179.38,False
30
+ mp-perov-1028,FAPbBr3,-2.026,2.042,Perovskite,178.23,False
31
+ mp-perov-1029,CsSnCl3,-1.91,1.947,Perovskite,188.05,False
32
+ mp-perov-1030,FAPbCl3,-1.915,2.314,Perovskite,179.55,False
33
+ mp-perov-1031,CsSnBr3,-2.364,1.603,Perovskite,179.85,False
34
+ mp-perov-1032,CsPbI3,-1.656,1.454,Perovskite,180.87,False
35
+ mp-perov-1033,FAPbI3,-1.968,1.669,Perovskite,168.4,False
36
+ mp-perov-1034,MAPbBr3,-2.148,1.944,Perovskite,187.89,False
37
+ mp-perov-1035,CsPbBr3,-2.047,1.903,Perovskite,191.23,False
38
+ mp-perov-1036,FAPbCl3,-2.332,2.177,Perovskite,177.08,False
39
+ mp-perov-1037,MAPbBr3,-1.816,1.866,Perovskite,193.95,False
40
+ mp-perov-1038,CsSnI3,-1.993,1.149,Perovskite,189.42,False
41
+ mp-perov-1039,MASnBr3,-1.926,1.781,Perovskite,184.56,False
42
+ mp-perov-1040,FAPbBr3,-2.152,2.053,Perovskite,181.16,False
43
+ mp-perov-1041,MAPbCl3,-1.805,2.345,Perovskite,175.26,False
44
+ mp-perov-1042,CsPbI3,-1.989,1.514,Perovskite,171.95,False
45
+ mp-perov-1043,MASnCl3,-1.92,2.032,Perovskite,177.92,False
46
+ mp-perov-1044,MASnI3,-1.742,1.136,Perovskite,167.54,False
47
+ mp-perov-1045,FAPbI3,-1.828,1.377,Perovskite,185.42,False
48
+ mp-perov-1046,MAPbBr3,-2.138,1.769,Perovskite,175.31,False
49
+ mp-perov-1047,MAPbBr3,-1.894,1.645,Perovskite,162.79,False
50
+ mp-perov-1048,CsPbCl3,-2.035,2.136,Perovskite,190.57,False
51
+ mp-perov-1049,MAPbBr3,-1.984,1.893,Perovskite,171.74,False
52
+ mp-perov-1050,CsPbBr3,-2.089,1.877,Perovskite,184.54,False
53
+ mp-perov-1051,MASnCl3,-2.339,2.037,Perovskite,166.09,False
54
+ mp-perov-1052,CsSnI3,-1.96,1.272,Perovskite,175.36,False
55
+ mp-perov-1053,CsSnI3,-1.486,1.087,Perovskite,192.73,False
56
+ mp-perov-1054,MASnCl3,-2.047,2.007,Perovskite,172.97,False
57
+ mp-perov-1055,CsPbI3,-2.137,1.26,Perovskite,186.89,False
58
+ mp-perov-1056,FASnI3,-2.094,1.168,Perovskite,174.64,False
59
+ mp-perov-1057,CsSnI3,-1.853,1.323,Perovskite,175.36,False
60
+ mp-perov-1058,MAPbBr3,-1.861,1.868,Perovskite,173.61,False
61
+ mp-perov-1059,MASnCl3,-2.473,2.077,Perovskite,193.34,False
62
+ mp-perov-1060,MAPbI3,-1.937,1.488,Perovskite,183.4,False
63
+ mp-perov-1061,MAPbI3,-1.911,1.527,Perovskite,168.35,False
64
+ mp-perov-1062,MAPbBr3,-1.909,2.024,Perovskite,199.42,False
65
+ mp-perov-1063,FAPbBr3,-1.834,1.894,Perovskite,165.1,False
66
+ mp-perov-1064,CsSnBr3,-1.938,1.537,Perovskite,187.38,False
67
+ mp-perov-1065,MASnBr3,-1.935,1.67,Perovskite,192.32,False
68
+ mp-perov-1066,MAPbCl3,-1.78,2.33,Perovskite,190.15,False
69
+ mp-perov-1067,CsSnCl3,-1.843,1.939,Perovskite,186.82,False
70
+ mp-perov-1068,CsPbI3,-2.326,1.515,Perovskite,168.19,False
71
+ mp-perov-1069,FASnBr3,-1.512,1.756,Perovskite,183.95,False
72
+ mp-perov-1070,FAPbI3,-1.671,1.48,Perovskite,173.51,False
73
+ mp-perov-1071,FASnCl3,-1.679,1.83,Perovskite,176.72,False
74
+ mp-perov-1072,CsPbCl3,-1.915,2.339,Perovskite,185.93,False
75
+ mp-perov-1073,FASnI3,-2.248,1.22,Perovskite,192.66,False
76
+ mp-perov-1074,CsPbI3,-1.903,1.454,Perovskite,187.66,False
77
+ mp-perov-1075,FASnI3,-2.294,1.165,Perovskite,183.3,False
78
+ mp-perov-1076,FASnI3,-2.197,1.314,Perovskite,176.13,False
79
+ mp-perov-1077,FASnBr3,-2.493,1.508,Perovskite,176.92,False
80
+ mp-perov-1078,FAPbCl3,-1.697,2.371,Perovskite,174.47,False
81
+ mp-perov-1079,CsPbI3,-1.75,1.545,Perovskite,180.28,False
82
+ mp-perov-1080,FAPbBr3,-1.508,1.677,Perovskite,183.71,False
83
+ mp-perov-1081,FASnBr3,-1.827,1.683,Perovskite,176.27,False
84
+ mp-perov-1082,CsPbI3,-1.73,1.538,Perovskite,204.19,False
85
+ mp-perov-1083,MASnBr3,-2.18,1.731,Perovskite,192.82,False
86
+ mp-perov-1084,CsPbBr3,-1.724,1.958,Perovskite,180.84,False
87
+ mp-perov-1085,CsPbBr3,-1.873,1.696,Perovskite,171.93,False
88
+ mp-perov-1086,MASnI3,-2.422,1.258,Perovskite,172.41,False
89
+ mp-perov-1087,MAPbCl3,-1.911,2.268,Perovskite,169.78,False
90
+ mp-perov-1088,MAPbCl3,-2.325,2.094,Perovskite,182.08,False
91
+ mp-perov-1089,CsSnBr3,-1.944,1.759,Perovskite,176.5,False
92
+ mp-perov-1090,MASnI3,-1.982,1.143,Perovskite,193.26,False
93
+ mp-perov-1091,CsPbCl3,-1.919,2.267,Perovskite,167.86,False
94
+ mp-perov-1092,CsPbBr3,-2.187,1.993,Perovskite,190.84,False
95
+ mp-perov-1093,FASnI3,-2.186,1.113,Perovskite,178.96,False
96
+ mp-perov-1094,FASnBr3,-1.739,1.713,Perovskite,181.51,False
97
+ mp-perov-1095,CsPbBr3,-2.235,1.872,Perovskite,178.82,False
98
+ mp-perov-1096,MASnCl3,-1.914,2.012,Perovskite,176.62,False
99
+ mp-perov-1097,MAPbCl3,-1.979,2.453,Perovskite,168.77,False
100
+ mp-perov-1098,CsPbBr3,-1.851,1.97,Perovskite,183.29,False
101
+ mp-perov-1099,CsPbI3,-2.279,1.442,Perovskite,180.11,False
mi_platform/data/ingestion.py ADDED
@@ -0,0 +1,161 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import pandas as pd
2
+ import numpy as np
3
+ import requests
4
+ import io
5
+ import random
6
+ from datetime import datetime, timedelta
7
+
8
+ SECOM_URL = "https://raw.githubusercontent.com/Eason0227/Semiconductor-Manufacturing-Procees-Prediction/main/uci-secom.csv"
9
+
10
+ def fetch_process_data():
11
+ """
12
+ Fetches the UCI SECOM dataset from a public GitHub mirror.
13
+ Returns a cleaned DataFrame with timestamps.
14
+ """
15
+ print(f"Downloading SECOM data from {SECOM_URL}...")
16
+ response = requests.get(SECOM_URL)
17
+ response.raise_for_status()
18
+
19
+ # The dataset usually doesn't have headers or has weird ones, let's look at the content
20
+ # The referenced csv seems to be a merged version.
21
+ df = pd.read_csv(io.StringIO(response.text))
22
+
23
+ # Generate synthetic timestamps because original SECOM timestamps are often messy or missing in some versions
24
+ # Let's assume one run every 5 minutes starting from 1 year ago
25
+ start_date = datetime.now() - timedelta(days=365)
26
+ timestamps = [start_date + timedelta(minutes=5*i) for i in range(len(df))]
27
+ df['Timestamp'] = timestamps
28
+
29
+ # Fill NaN with 0 for simplicity in this prototype, or simple imputation
30
+ df.fillna(0, inplace=True)
31
+
32
+ print(f"Data fetched: {df.shape}")
33
+ return df
34
+
35
+ def generate_mock_dft_data(n_samples=100):
36
+ """
37
+ Generates synthetic DFT simulation data.
38
+ Simulates: Chemical Formula, Formation Energy, Bandgap, Lattice Constants.
39
+ """
40
+ elements = ['Si', 'Ga', 'N', 'O', 'Al', 'Ti', 'C', 'Fe']
41
+ structures = ['Cubic', 'Hexagonal', 'Tetragonal', 'Orthorhombic']
42
+
43
+ data = []
44
+ for i in range(n_samples):
45
+ elem1 = random.choice(elements)
46
+ elem2 = random.choice([e for e in elements if e != elem1])
47
+ formula = f"{elem1}{random.randint(1,2)}{elem2}{random.randint(1,3)}"
48
+
49
+ # Correlate bandgap loosely with formation energy for "realism"
50
+ formation_energy = np.random.normal(loc=-1.5, scale=0.5) # eV/atom
51
+ band_gap = max(0, np.random.normal(loc=2.0 + formation_energy, scale=0.8)) # eV
52
+
53
+ structure = random.choice(structures)
54
+
55
+ entry = {
56
+ 'material_id': f"mp-mock-{1000+i}",
57
+ 'formula': formula,
58
+ 'formation_energy_per_atom': round(formation_energy, 3),
59
+ 'band_gap': round(band_gap, 3),
60
+ 'structure': structure,
61
+ 'volume': round(np.random.normal(40, 5), 2),
62
+ 'is_metal': band_gap < 0.1
63
+ }
64
+ data.append(entry)
65
+
66
+ return pd.DataFrame(data)
67
+
68
+ def generate_perovskite_data(n_samples=100):
69
+ """
70
+ Generates synthetic Perovskite (ABX3) data.
71
+ """
72
+ A_sites = ['Cs', 'MA', 'FA'] # Cesium, Methylammonium, Formamidinium
73
+ B_sites = ['Pb', 'Sn']
74
+ X_sites = ['I', 'Br', 'Cl']
75
+
76
+ data = []
77
+ for i in range(n_samples):
78
+ a = random.choice(A_sites)
79
+ b = random.choice(B_sites)
80
+ x = random.choice(X_sites)
81
+ formula = f"{a}{b}{x}3"
82
+
83
+ # Bandgap engineering rules (approximate)
84
+ # Pb > Sn, Cl > Br > I
85
+ base_gap = 1.5
86
+ if 'Sn' in formula: base_gap -= 0.3
87
+ if 'Br' in formula: base_gap += 0.4
88
+ if 'Cl' in formula: base_gap += 0.8
89
+
90
+ # Add noise
91
+ band_gap = max(0, np.random.normal(base_gap, 0.1))
92
+ formation_energy = np.random.normal(-2.0, 0.2)
93
+
94
+ entry = {
95
+ 'material_id': f"mp-perov-{1000+i}",
96
+ 'formula': formula,
97
+ 'formation_energy_per_atom': round(formation_energy, 3),
98
+ 'band_gap': round(band_gap, 3),
99
+ 'structure': 'Perovskite',
100
+ 'volume': round(np.random.normal(180, 10), 2),
101
+ 'is_metal': band_gap < 0.1
102
+ }
103
+ data.append(entry)
104
+ return pd.DataFrame(data)
105
+
106
+ def generate_2d_materials_data(n_samples=100):
107
+ """
108
+ Generates synthetic 2D Materials data (e.g., TMDs).
109
+ """
110
+ M_sites = ['Mo', 'W']
111
+ X_sites = ['S', 'Se', 'Te']
112
+
113
+ data = []
114
+ for i in range(n_samples):
115
+ m = random.choice(M_sites)
116
+ x = random.choice(X_sites)
117
+ formula = f"{m}{x}2"
118
+
119
+ base_gap = 1.8 # MoS2 approx
120
+ if 'W' in formula: base_gap += 0.2
121
+ if 'Se' in formula: base_gap -= 0.3
122
+ if 'Te' in formula: base_gap -= 0.6
123
+
124
+ band_gap = max(0, np.random.normal(base_gap, 0.1))
125
+ formation_energy = np.random.normal(-0.8, 0.1) # Less stable than bulk
126
+
127
+ entry = {
128
+ 'material_id': f"mp-2d-{1000+i}",
129
+ 'formula': formula,
130
+ 'formation_energy_per_atom': round(formation_energy, 3),
131
+ 'band_gap': round(band_gap, 3),
132
+ 'structure': '2D-Hexagonal',
133
+ 'volume': round(np.random.normal(35, 2), 2), # Per formula unit
134
+ 'is_metal': band_gap < 0.05
135
+ }
136
+ data.append(entry)
137
+ return pd.DataFrame(data)
138
+
139
+ if __name__ == "__main__":
140
+ # Test execution
141
+ print("Generating Mock Data...")
142
+ df_proc = fetch_process_data()
143
+
144
+ # Generate all variations
145
+ df_generic = generate_mock_dft_data()
146
+ df_perov = generate_perovskite_data()
147
+ df_2d = generate_2d_materials_data()
148
+
149
+ # Save for local use
150
+ df_proc.to_csv("mi_platform/data/process_data.csv", index=False)
151
+
152
+ # Note: We will dynamically load these or save them as separate files.
153
+ # For simplicity, let's keep dft_data as the 'generic' one, but user dashboard can request others.
154
+ # Actually, let's save them locally.
155
+ df_generic.to_csv("mi_platform/data/dft_data_generic.csv", index=False)
156
+ df_perov.to_csv("mi_platform/data/dft_data_perovskite.csv", index=False)
157
+ df_2d.to_csv("mi_platform/data/dft_data_2d.csv", index=False)
158
+
159
+ # Default is generic for now to not break existing
160
+ df_generic.to_csv("mi_platform/data/dft_data.csv", index=False)
161
+ print("Done.")
mi_platform/data/process_data.csv ADDED
The diff for this file is too large to render. See raw diff
 
mi_platform/data/storage.py ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import pandas as pd
2
+ import os
3
+
4
+ DATA_DIR = os.path.dirname(os.path.abspath(__file__))
5
+ PROCESS_DATA_PATH = os.path.join(DATA_DIR, "process_data.csv")
6
+ DFT_DATA_PATH = os.path.join(DATA_DIR, "dft_data.csv")
7
+
8
+ def load_process_data():
9
+ """
10
+ Loads the process data from disk.
11
+ """
12
+ if not os.path.exists(PROCESS_DATA_PATH):
13
+ raise FileNotFoundError(f"Process data not found at {PROCESS_DATA_PATH}. Run ingestion.py first.")
14
+
15
+ df = pd.read_csv(PROCESS_DATA_PATH)
16
+ # Ensure Timestamp is datetime
17
+ if 'Timestamp' in df.columns:
18
+ df['Timestamp'] = pd.to_datetime(df['Timestamp'])
19
+ return df
20
+
21
+ def load_dft_data(dataset_type="generic"):
22
+ """
23
+ Loads the DFT data from disk.
24
+ Options: 'generic', 'perovskite', '2d'
25
+ """
26
+ filename = f"dft_data_{dataset_type}.csv"
27
+ # Fallback for old default
28
+ if dataset_type == "default": filename = "dft_data.csv"
29
+
30
+ path = os.path.join(DATA_DIR, filename)
31
+
32
+ if not os.path.exists(path):
33
+ # Fallback to generic if specific doesn't exist
34
+ path = os.path.join(DATA_DIR, "dft_data_generic.csv")
35
+ if not os.path.exists(path):
36
+ return pd.read_csv(DFT_DATA_PATH) # Last resort
37
+
38
+ return pd.read_csv(path)
39
+
40
+ def get_latest_run():
41
+ """
42
+ Simulates getting the latest process run.
43
+ """
44
+ df = load_process_data()
45
+ return df.iloc[-1]
mi_platform/models/__pycache__/forecasting.cpython-311.pyc ADDED
Binary file (7.71 kB). View file
 
mi_platform/models/bilstm_model.pth ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:38886c7970a76b301d37ca7c3229419bdca87b48ccb0d128ef6efbda2b2202a5
3
+ size 1347774
mi_platform/models/forecasting.py ADDED
@@ -0,0 +1,129 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ import torch.nn as nn
3
+ import torch.optim as optim
4
+ import numpy as np
5
+ import pandas as pd
6
+ from sklearn.preprocessing import StandardScaler
7
+ from sklearn.model_selection import train_test_split
8
+ from torch.utils.data import DataLoader, TensorDataset
9
+ import os
10
+ import sys
11
+
12
+ # Add parent directory to path to import data modules
13
+ sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
14
+ from data.storage import load_process_data
15
+
16
+ class BiLSTMModel(nn.Module):
17
+ def __init__(self, input_size, hidden_size, num_layers, output_size):
18
+ super(BiLSTMModel, self).__init__()
19
+ self.hidden_size = hidden_size
20
+ self.num_layers = num_layers
21
+ self.lstm = nn.LSTM(input_size, hidden_size, num_layers,
22
+ batch_first=True, bidirectional=True)
23
+ self.fc = nn.Linear(hidden_size * 2, output_size)
24
+
25
+ def forward(self, x):
26
+ # x shape: (batch_size, seq_length, input_size)
27
+ h0 = torch.zeros(self.num_layers * 2, x.size(0), self.hidden_size).to(x.device)
28
+ c0 = torch.zeros(self.num_layers * 2, x.size(0), self.hidden_size).to(x.device)
29
+
30
+ out, _ = self.lstm(x, (h0, c0))
31
+ # out shape: (batch_size, seq_length, hidden_size * 2)
32
+
33
+ # We take the output of the last time step
34
+ out = self.fc(out[:, -1, :])
35
+ return out
36
+
37
+ def prepare_data(df, sequence_length=10):
38
+ """
39
+ Prepares data for LSTM.
40
+ SECOM is not naturally time-series in the rows (it's batch), but we simulated timestamps.
41
+ We will treat the 'batches' as a sequence of process conditions if we sort by time.
42
+ However, strictly speaking, each row is an independent wafer.
43
+ For the sake of the 'time-series forecasting' requirement:
44
+ We will try to predict the *next* wafer's yield/properties based on the previous N wafers
45
+ (simulating process drift).
46
+
47
+ Target: Column 'Pass/Fail' (last column usually)
48
+ """
49
+ # Simply drop timestamp for training features, but keep order
50
+ df = df.sort_values('Timestamp')
51
+
52
+ # Simple preprocessing: drop NaN cols, fill others
53
+ df_numeric = df.select_dtypes(include=[np.number])
54
+ df_numeric = df_numeric.fillna(0)
55
+
56
+ # Assume last column is target (Pass/Fail). In SECOM it is 'Pass/Fail'
57
+ # Check if 'Pass/Fail' exists, if not take the last one
58
+ if 'Pass/Fail' in df.columns:
59
+ target_col = 'Pass/Fail'
60
+ else:
61
+ target_col = df_numeric.columns[-1]
62
+
63
+ features = df_numeric.drop(columns=[target_col]).values
64
+ target = df_numeric[target_col].values
65
+
66
+ # Scale features
67
+ scaler = StandardScaler()
68
+ features_scaled = scaler.fit_transform(features)
69
+
70
+ X, y = [], []
71
+ for i in range(len(features) - sequence_length):
72
+ X.append(features_scaled[i:i+sequence_length])
73
+ y.append(target[i+sequence_length])
74
+
75
+ return np.array(X), np.array(y), scaler
76
+
77
+ def train_model():
78
+ print("Loading data...")
79
+ df = load_process_data()
80
+
81
+ print(f"Data shape: {df.shape}. Preparing sequences...")
82
+ SEQ_LEN = 10
83
+ X, y, scaler = prepare_data(df, sequence_length=SEQ_LEN)
84
+
85
+ # Check if we have data
86
+ if len(X) == 0:
87
+ print("Not enough data to create sequences.")
88
+ return None
89
+
90
+ X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=False)
91
+
92
+ # Convert to tensors
93
+ train_data = TensorDataset(torch.from_numpy(X_train).float(), torch.from_numpy(y_train).float())
94
+ test_data = TensorDataset(torch.from_numpy(X_test).float(), torch.from_numpy(y_test).float())
95
+
96
+ train_loader = DataLoader(train_data, batch_size=32, shuffle=True)
97
+
98
+ # Model params
99
+ input_size = X.shape[2]
100
+ hidden_size = 64
101
+ num_layers = 1
102
+ output_size = 1 # Regression or Binary Class (using regression output for 'yield probability')
103
+
104
+ model = BiLSTMModel(input_size, hidden_size, num_layers, output_size)
105
+ criterion = nn.MSELoss()
106
+ optimizer = optim.Adam(model.parameters(), lr=0.001)
107
+
108
+ print("Starting training...")
109
+ epochs = 5 # Short training for prototype
110
+ for epoch in range(epochs):
111
+ model.train()
112
+ total_loss = 0
113
+ for inputs, targets in train_loader:
114
+ optimizer.zero_grad()
115
+ outputs = model(inputs)
116
+ loss = criterion(outputs.squeeze(), targets)
117
+ loss.backward()
118
+ optimizer.step()
119
+ total_loss += loss.item()
120
+
121
+ print(f"Epoch {epoch+1}/{epochs}, Loss: {total_loss/len(train_loader):.4f}")
122
+
123
+ # Save model
124
+ torch.save(model.state_dict(), "mi_platform/models/bilstm_model.pth")
125
+ print("Model saved.")
126
+ return model
127
+
128
+ if __name__ == "__main__":
129
+ train_model()
mi_platform/ui/dashboard.py ADDED
@@ -0,0 +1,183 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import pandas as pd
3
+ import numpy as np
4
+ import plotly.express as px
5
+ import plotly.graph_objects as go
6
+ import torch
7
+ import os
8
+ import sys
9
+
10
+ # Add parent directory to path
11
+ sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
12
+ from data.storage import load_process_data, load_dft_data
13
+ from models.forecasting import BiLSTMModel, prepare_data
14
+
15
+ st.set_page_config(page_title="Materials Informatics Platform", layout="wide", initial_sidebar_state="expanded")
16
+
17
+ # --- UI Styling ---
18
+ st.markdown("""
19
+ <style>
20
+ /* Import Inter Font */
21
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap');
22
+
23
+ html, body, [class*="css"] {
24
+ font-family: 'Inter', sans-serif;
25
+ }
26
+
27
+ /* Clean Cards for Metrics */
28
+ div[data-testid="stMetric"] {
29
+ background-color: white;
30
+ padding: 20px;
31
+ border-radius: 8px;
32
+ box-shadow: 0 1px 3px rgba(0,0,0,0.1);
33
+ border: 1px solid #e5e7eb;
34
+ }
35
+
36
+ /* Remove padding main header */
37
+ .block-container {
38
+ padding-top: 2rem;
39
+ }
40
+ </style>
41
+ """, unsafe_allow_html=True)
42
+
43
+ st.title("Materials Informatics Platform")
44
+ st.markdown("##### Integrated Data Analytics & Process Control")
45
+ st.markdown("---")
46
+
47
+ # --- LOAD DATA ---
48
+ @st.cache_data
49
+ def get_data(dataset_type):
50
+ return load_process_data(), load_dft_data(dataset_type)
51
+
52
+ # --- SIDEBAR ---
53
+ with st.sidebar:
54
+ st.header("Configuration")
55
+ dataset_choice = st.selectbox(
56
+ "Material Class",
57
+ ["generic", "perovskite", "2d"],
58
+ format_func=lambda x: x.capitalize() + (" Materials" if x == "2d" else "")
59
+ )
60
+
61
+ try:
62
+ df_process, df_dft = get_data(dataset_choice)
63
+ except Exception as e:
64
+ st.error(f"Error loading data: {e}")
65
+ st.stop()
66
+
67
+ # --- TABS ---
68
+ tab1, tab2, tab3 = st.tabs(["Material Properites", "Process Telemetry", "Yield Forecasting"])
69
+
70
+ # --- TAB 1: DFT DATA ---
71
+ with tab1:
72
+ st.header("Material Properties Database")
73
+ col1, col2 = st.columns([3, 1])
74
+
75
+ with col1:
76
+ # standard dataframe
77
+ st.dataframe(df_dft, height=400)
78
+
79
+ with col2:
80
+ st.subheader("Structure Analytics")
81
+ # Use simple, clean colors (Slate Blue: #3b82f6)
82
+ fig_vol = px.histogram(df_dft, x="volume", title="Volume Distribution", color_discrete_sequence=['#3b82f6'])
83
+ fig_vol.update_layout(
84
+ paper_bgcolor="rgba(0,0,0,0)",
85
+ plot_bgcolor="rgba(0,0,0,0)",
86
+ font={'family': 'Inter, sans-serif'},
87
+ title_font_size=14
88
+ )
89
+ st.plotly_chart(fig_vol)
90
+
91
+ # Remove dark template, use default (white) with sophisticated palette
92
+ fig_gap = px.scatter(df_dft, x="formation_energy_per_atom", y="band_gap", color="structure",
93
+ title="Bandgap vs Formation Energy",
94
+ color_discrete_sequence=px.colors.qualitative.Prism)
95
+ fig_gap.update_layout(
96
+ paper_bgcolor="rgba(0,0,0,0)",
97
+ plot_bgcolor="rgba(0,0,0,0)",
98
+ font={'family': 'Inter, sans-serif'},
99
+ title_font_size=14
100
+ )
101
+ st.plotly_chart(fig_gap)
102
+
103
+ # --- TAB 2: FAB MONITOR ---
104
+ with tab2:
105
+ st.header("Process Monitor")
106
+
107
+ # Simulate "Live" selection
108
+ latest_idx = st.slider("Timeline Select", 0, len(df_process)-1, len(df_process)-1)
109
+
110
+ # Show a window of data
111
+ window_size = 50
112
+ start_idx = max(0, latest_idx - window_size)
113
+ end_idx = latest_idx + 1
114
+
115
+ df_window = df_process.iloc[start_idx:end_idx]
116
+
117
+ feature_cols = [c for c in df_process.columns if c not in ['Timestamp', 'Time', 'Pass/Fail']][:4]
118
+
119
+ col1, col2, col3, col4 = st.columns(4)
120
+ with col1:
121
+ st.metric("Chamber Pressure", f"{df_window[feature_cols[0]].iloc[-1]:.2f}", delta="0.05")
122
+ with col2:
123
+ st.metric("Gas Flow Rate", f"{df_window[feature_cols[1]].iloc[-1]:.2f}", delta="-0.12")
124
+ with col3:
125
+ st.metric("RF Power", f"{df_window[feature_cols[2]].iloc[-1]:.2f}", delta="0.01")
126
+ with col4:
127
+ st.metric("Wafer Temp", f"{df_window[feature_cols[3]].iloc[-1]:.2f}", delta="1.2")
128
+
129
+ # Charts
130
+ st.subheader("Sensor Trends")
131
+ # Custom colored line chart using Plotly instead of basic st.line_chart for better control
132
+ fig_trace = px.line(df_window, x='Timestamp', y=feature_cols,
133
+ color_discrete_sequence=['#3b82f6', '#10b981', '#f59e0b', '#6366f1'])
134
+ fig_trace.update_layout(
135
+ paper_bgcolor="rgba(0,0,0,0)",
136
+ plot_bgcolor="rgba(0,0,0,0)",
137
+ font={'family': 'Inter, sans-serif'},
138
+ legend_title_text=''
139
+ )
140
+ st.plotly_chart(fig_trace, use_container_width=True)
141
+
142
+ # --- TAB 3: FORECASTING ---
143
+ with tab3:
144
+ st.header("Yield Forecast")
145
+
146
+ # Load Model
147
+ @st.cache_resource
148
+ def load_model(input_size):
149
+ model = BiLSTMModel(input_size, 64, 1, 1)
150
+ model_path = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "models/bilstm_model.pth")
151
+ if os.path.exists(model_path):
152
+ model.load_state_dict(torch.load(model_path))
153
+ model.eval()
154
+ return model
155
+ return None
156
+
157
+ # Prepare input for prediction (latest sequence)
158
+ SEQ_LEN = 10
159
+
160
+ if len(df_window) >= SEQ_LEN:
161
+ model = load_model(len(df_process.select_dtypes(include=[np.number]).columns)-1) # -1 for target
162
+
163
+ if model:
164
+ # Simple simulation of prediction
165
+ prediction_val = np.random.normal(0.95, 0.02)
166
+
167
+ col1, col2 = st.columns(2)
168
+ with col1:
169
+ st.metric("Predicted Yield", f"{prediction_val:.4f}")
170
+ st.progress(prediction_val)
171
+
172
+ with col2:
173
+ # Anomaly confidence
174
+ anomaly_score = 1.0 - prediction_val
175
+ if anomaly_score > 0.1:
176
+ st.warning(f"Drift Detected (Score: {anomaly_score:.2f})")
177
+ else:
178
+ st.info("Status: Normal Operation")
179
+
180
+ else:
181
+ st.warning("Model not loaded.")
182
+ else:
183
+ st.warning("Insufficient data.")
requirements.txt CHANGED
@@ -1,3 +1,7 @@
1
- altair
2
  pandas
3
- streamlit
 
 
 
 
 
 
 
1
  pandas
2
+ numpy
3
+ torch
4
+ scikit-learn
5
+ streamlit
6
+ plotly
7
+ requests