Commit ·
bbeec91
1
Parent(s): 48cf837
Fresh deployment
Browse files- .streamlit/config.toml +7 -0
- Dockerfile +9 -13
- mi_platform/data/__pycache__/storage.cpython-311.pyc +0 -0
- mi_platform/data/dft_data.csv +101 -0
- mi_platform/data/dft_data_2d.csv +101 -0
- mi_platform/data/dft_data_generic.csv +101 -0
- mi_platform/data/dft_data_perovskite.csv +101 -0
- mi_platform/data/ingestion.py +161 -0
- mi_platform/data/process_data.csv +0 -0
- mi_platform/data/storage.py +45 -0
- mi_platform/models/__pycache__/forecasting.cpython-311.pyc +0 -0
- mi_platform/models/bilstm_model.pth +3 -0
- mi_platform/models/forecasting.py +129 -0
- mi_platform/ui/dashboard.py +183 -0
- requirements.txt +6 -2
.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.
|
| 2 |
|
| 3 |
WORKDIR /app
|
| 4 |
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
git \
|
| 9 |
-
&& rm -rf /var/lib/apt/lists/*
|
| 10 |
|
| 11 |
-
|
| 12 |
-
COPY
|
| 13 |
-
|
| 14 |
-
RUN pip3 install -r requirements.txt
|
| 15 |
|
|
|
|
| 16 |
EXPOSE 8501
|
| 17 |
|
| 18 |
-
|
| 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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
pandas
|
| 2 |
+
numpy
|
| 3 |
+
torch
|
| 4 |
+
scikit-learn
|
| 5 |
+
streamlit
|
| 6 |
+
plotly
|
| 7 |
+
requests
|