Azizahalq commited on
Commit
201d38b
·
verified ·
1 Parent(s): 74cc16b

Upload 20 files

Browse files
.gitattributes CHANGED
@@ -33,3 +33,5 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ index/chroma_v3/chroma.sqlite3 filter=lfs diff=lfs merge=lfs -text
37
+ static/img/11.png filter=lfs diff=lfs merge=lfs -text
README.md CHANGED
@@ -1,10 +1,188 @@
1
- ---
2
- title: Materialmind2
3
- emoji: 🏃
4
- colorFrom: gray
5
- colorTo: indigo
6
- sdk: static
7
- pinned: false
8
- ---
9
-
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ MaterialMind
2
+
3
+ Decisions, not summaries. MaterialMind is an LLM-powered materials-selection assistant that turns engineering requirements into an evidence-backed, ranked shortlist with page-level citations. It runs locally (Flask + Ollama) and searches your own PDF corpus via a lightweight RAG index.
4
+
5
+ What MaterialMind does
6
+
7
+ • Retrieves → Ranks → Explains: finds the most relevant pages, scores candidate materials against your constraints, and explains trade-offs with citations.
8
+ • Local and private: your PDFs never leave your machine.
9
+ • Robust ingestion: handles real-world PDFs (papers, standards, reports, textbooks); incremental updates.
10
+ Friendly UI: clean dark theme, background tiles, live weight controls (accepts 40/30/20/10 or 0.4/0.3/0.2/0.1).
11
+ • Exact math: backend normalizes weights to sum to exactly 1.0000.
12
+
13
+ Repository layout
14
+
15
+ materialmind/ (your corpus lives here)
16
+ ├─ sources/ (drop your PDFs here)
17
+ └─ index/ (vector DB; auto-created)
18
+
19
+ rag_mini.py (RAG: index/search/ask/answer/export)
20
+ app_user.py (Flask app for end users)
21
+ templates/ (base.html, index.html, results.html)
22
+ static/ (styles.css and images: 11.png, 22.jpg)
23
+
24
+ Note: We work with PDFs you drop into materialmind/sources (papers, standards, reports). You don’t need vendor datasheets; if you have them as PDFs, drop them in like any other PDF.
25
+
26
+ Prerequisites
27
+
28
+ • Python 3.10+
29
+ • pip and a virtual environment
30
+ • Ollama (for model-generated answers). Example model: qwen2.5:7b-instruct
31
+ • Optional: ocrmypdf + tesseract (only for scanned PDFs with no selectable text)
32
+
33
+ Installation
34
+
35
+ Create and activate a virtual environment.
36
+
37
+ macOS / Linux:
38
+ python3 -m venv .venv
39
+ source .venv/bin/activate
40
+
41
+ Windows (PowerShell):
42
+ python -m venv .venv
43
+ .venv\Scripts\Activate.ps1
44
+
45
+ Install dependencies.
46
+
47
+ Apple Silicon (macOS):
48
+ pip install -U fastembed onnxruntime-silicon chromadb pypdf pymupdf markdown filelock flask flask-cors
49
+
50
+ Linux/Windows:
51
+ pip install -U fastembed onnxruntime chromadb pypdf pymupdf markdown filelock flask flask-cors
52
+
53
+ Install and start Ollama; pull a local model.
54
+
55
+ macOS (example):
56
+ brew install ollama
57
+ ollama serve &
58
+ ollama pull qwen2.5:7b-instruct
59
+
60
+ Confirm paths.
61
+
62
+ rag_mini.py uses a folder named “materialmind” next to the script:
63
+ BASE_DIR = Path(file).resolve().parent / "materialmind"
64
+
65
+ Ensure the folder exists:
66
+ materialmind/sources (create this and drop PDFs here)
67
+
68
+ Add your PDFs
69
+
70
+ Drop research papers, standards, reports, and textbooks into:
71
+ materialmind/sources
72
+
73
+ Tips:
74
+ • Prefer publisher PDFs (selectable text).
75
+ • If a PDF is scanned (no text), OCR it:
76
+ ocrmypdf input.pdf output_ocr.pdf
77
+ then place output_ocr.pdf in materialmind/sources
78
+
79
+ Build or update the index
80
+
81
+ First time (full index):
82
+ python rag_mini.py --rebuild
83
+
84
+ Later (only changed/new PDFs):
85
+ python rag_mini.py --update
86
+
87
+ Optional backup:
88
+ python rag_mini.py --backup
89
+
90
+ Optional export to JSONL (for inspection):
91
+ python rag_mini.py --export-json ./materialmind_dump.jsonl
92
+
93
+ Quick retrieval check (no model required)
94
+
95
+ Example:
96
+ python rag_mini.py --ask "Which alloys resist pitting in seawater better than 316L?"
97
+
98
+ You will see top-k snippets with file:page citations from your PDFs.
99
+
100
+ Run the UI
101
+
102
+ Start the Flask app:
103
+ python app_user.py
104
+
105
+ Open:
106
+ http://127.0.0.1:5000/
107
+
108
+ Usage:
109
+ • Fill environment/temperature/constraints.
110
+ • Set weights as percentages (e.g., 40/30/20/10) or fractions (0.4/0.3/0.2/0.1). The form enables the button only when the sum equals 100% (or 1.0).
111
+ • Click “Get ranked shortlist” to see the ranked table, material cards, and page-level citations.
112
+
113
+ How it works
114
+
115
+ • Retrieval: FastEmbed (ONNX) creates embeddings; Chroma stores and retrieves chunks with file + page metadata.
116
+ • Decision layer: your constraints and weights guide the model to produce a structured shortlist JSON (name, score, reasons, trade-offs, citations).
117
+ • Local LLM: by default qwen2.5:7b-instruct via Ollama; you can swap models freely.
118
+
119
+ CLI reference (rag_mini.py)
120
+
121
+ --rebuild rebuild the entire index from PDFs in materialmind/sources
122
+ --update incremental index of only changed/new PDFs
123
+ --backup copy the current index to a timestamped folder
124
+ --export-json PATH dump records to JSONL (optional)
125
+ --ask "question" retrieval only with citations
126
+ --answer "question" --model NAME --k N --show
127
+ retrieval plus local LLM answer (Ollama required)
128
+
129
+ Customization
130
+
131
+ Change model (Ollama):
132
+ ollama pull mistral:7b-instruct
133
+ then set “Model” in the UI to mistral:7b-instruct
134
+
135
+ Tune retrieval (rag_mini.py):
136
+ CHUNK_CHARS, CHUNK_OVERLAP, DEFAULT_TOPK
137
+
138
+ Swap embedding model (rag_mini.py):
139
+ EMB_MODEL = "BAAI/bge-small-en-v1.5" (good default). Other FastEmbed models also work.
140
+
141
+ Theme colors:
142
+ Edit CSS variables in static/styles.css (:root { … }).
143
+
144
+ Troubleshooting
145
+
146
+ “Get ranked shortlist” button disabled:
147
+ Enter weights as 40/30/20/10 or 0.4/0.3/0.2/0.1 until the sum reads 100%.
148
+
149
+ Ollama not found / model errors:
150
+ Install/start/pull as above. Retrieval still works without Ollama; only model-generated answers require it.
151
+
152
+ Chroma lock / mutex errors:
153
+ Close other processes using the index. If stuck:
154
+ python rag_mini.py --backup
155
+ rm -rf materialmind/index/chroma_v3
156
+ python rag_mini.py --rebuild
157
+
158
+ No text in a PDF:
159
+ OCR it with ocrmypdf, then re-index.
160
+
161
+ Port already in use:
162
+ Change the host/port in app_user.py.
163
+
164
+ Privacy
165
+
166
+ Everything runs locally by default. Your PDFs are indexed on disk and never uploaded. Remove PDFs from materialmind/sources and run --update to de-index.
167
+
168
+ Roadmap
169
+
170
+ Team/on-prem sharing, rule/property packs (e.g., PREN/oxidation windows/standards checks), uploads & tagging UI, LoRA adapter for stricter JSON, evaluation harness for grounding and JSON validity.
171
+
172
+ License
173
+
174
+ MIT (or your chosen permissive license). Add a LICENSE file to the repository.
175
+
176
+ One-minute demo
177
+
178
+ Drop a few corrosion or seawater PDFs into materialmind/sources.
179
+
180
+ Build: python rag_mini.py --rebuild
181
+
182
+ Run UI: python app_user.py
183
+
184
+ Query seawater at 20–25 °C, UTS ≥ 600 MPa, weights 50/30/10/10.
185
+
186
+ Show ranked shortlist, open a citation (file:page).
187
+
188
+ Add another PDF, run --update, rerun the query, and show the new citation.
app_user.py ADDED
@@ -0,0 +1,291 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """
4
+ MaterialMind – Flask app (form page + results page)
5
+ - Priorities via dropdowns (no numbers shown to user)
6
+ - Each criterion weight is independent (0..100); NOT normalized
7
+ - RAG retrieval + optional Ollama LLM for ranked shortlist with citations
8
+ """
9
+ import shutil
10
+ from decimal import Decimal
11
+ import re, json, textwrap, subprocess
12
+ from typing import List, Tuple, Any, Dict
13
+ from flask import Flask, request, render_template, redirect, url_for, flash
14
+ from flask_cors import CORS
15
+ from filelock import FileLock
16
+
17
+ # RAG helpers (your existing file)
18
+ from rag_mini import search, ensure_dirs, DATA_DIR, DEFAULT_TOPK, DEFAULT_MODEL
19
+
20
+ app = Flask(__name__)
21
+ app.secret_key = "change-me" # set a strong secret for production
22
+ CORS(app)
23
+
24
+ BASE_DIR = DATA_DIR.parent
25
+ LOCK_PATH = BASE_DIR / ".rag_lock"
26
+
27
+ # ---------- Utilities ----------
28
+ def has_ollama() -> bool:
29
+ return shutil.which("ollama") is not None
30
+
31
+ def call_ollama(model: str, prompt: str) -> str:
32
+ try:
33
+ out = subprocess.run(["ollama", "run", model, prompt],
34
+ check=True, capture_output=True, text=True)
35
+ return out.stdout.strip()
36
+ except FileNotFoundError:
37
+ return ("[Error] Ollama not found. Install: brew install ollama\n"
38
+ "Run: ollama serve &\n"
39
+ f"Pull: ollama pull {model}")
40
+ except subprocess.CalledProcessError as e:
41
+ return f"[Error] ollama run failed: {e.stderr.strip() or e.stdout.strip()}"
42
+
43
+ def to_dec(x, default: int) -> Decimal:
44
+ try:
45
+ s = (x or "").strip()
46
+ return Decimal(s if s else str(default))
47
+ except Exception:
48
+ return Decimal(default)
49
+
50
+ def _to_float(x):
51
+ try:
52
+ return float(x)
53
+ except Exception:
54
+ return None
55
+
56
+ def normalize_candidates_for_display(cands: List[Dict[str, Any]], max_total: float = 400.0) -> List[Dict[str, Any]]:
57
+ """
58
+ Ensure each candidate has:
59
+ - score_raw (0..400)
60
+ - score_pct (0..100) for UI
61
+ Accepts:
62
+ - c["score"] as number (0..400) OR fraction (0..1) OR string "350 / 400" or "87%"
63
+ - or c["score_pct"]
64
+ - or c["subscores"] dict (sums 4× [0..100] = 0..400)
65
+ """
66
+ for c in cands:
67
+ # If model already supplied a percent, trust it (and clamp)
68
+ if "score_pct" in c and c["score_pct"] is not None:
69
+ try:
70
+ pct = float(c["score_pct"])
71
+ c["score_pct"] = max(0.0, min(100.0, pct))
72
+ # derive a raw for sorting if not provided
73
+ c.setdefault("score_raw", c["score_pct"] * 4.0)
74
+ continue
75
+ except Exception:
76
+ pass
77
+
78
+ raw = None
79
+ v = c.get("score")
80
+
81
+ # direct numeric
82
+ if isinstance(v, (int, float)):
83
+ f = float(v)
84
+ if 0.0 <= f <= 1.5:
85
+ raw = max(0.0, min(max_total, f * max_total)) # treat <=1.5 as fraction
86
+ else:
87
+ raw = max(0.0, min(max_total, f))
88
+
89
+ # string patterns
90
+ if raw is None and isinstance(v, str):
91
+ s = v.strip()
92
+ m = re.search(r"^\s*([\d.]+)\s*/\s*([\d.]+)\s*$", s)
93
+ if m:
94
+ num, den = _to_float(m.group(1)), _to_float(m.group(2))
95
+ if num is not None and den and den > 0:
96
+ raw = max_total * (num / den)
97
+ if raw is None:
98
+ m2 = re.search(r"^\s*([\d.]+)\s*%\s*$", s)
99
+ if m2:
100
+ p = _to_float(m2.group(1))
101
+ if p is not None:
102
+ raw = max_total * (p / 100.0)
103
+ if raw is None:
104
+ f = _to_float(s)
105
+ if f is not None:
106
+ if 0.0 <= f <= 1.5:
107
+ raw = max_total * f
108
+ else:
109
+ raw = f
110
+
111
+ # sum of subscores
112
+ if raw is None:
113
+ subs = c.get("subscores") or {}
114
+ if isinstance(subs, dict) and subs:
115
+ ssum = 0.0
116
+ for sv in subs.values():
117
+ fv = _to_float(sv)
118
+ if fv is not None:
119
+ ssum += max(0.0, min(100.0, fv))
120
+ raw = ssum
121
+
122
+ if raw is None:
123
+ raw = 0.0
124
+
125
+ raw = max(0.0, min(max_total, float(raw)))
126
+ c["score_raw"] = raw
127
+ c["score_pct"] = round((raw / max_total) * 100.0, 1)
128
+
129
+ # sort by raw descending
130
+ cands.sort(key=lambda z: z.get("score_raw", 0.0), reverse=True)
131
+ return cands
132
+
133
+ # ---------- Prompting ----------
134
+ SYSTEM_RULES = """You are MaterialMind, a materials-selection assistant.
135
+ Return two things:
136
+ 1) JSON with a ranked shortlist:
137
+ {
138
+ "candidates": [
139
+ {
140
+ "name": "string",
141
+ "score": 0, // 0..400 (sum of 4 independent 0..100 weighted utilities)
142
+ "score_pct": 0, // score/4 -> 0..100 for display
143
+ "reasons": ["..."],
144
+ "tradeoffs": ["..."],
145
+ "citations": ["[1]", "[2]"]
146
+ }
147
+ ]
148
+ }
149
+ 2) After the JSON, 3–6 concise bullets on trade-offs.
150
+
151
+ Rules:
152
+ - Use only provided context (no fabrication). Cite with [1], [2] etc.
153
+ - Utilities per criterion are in [0,1]. Cost utility increases as cost decreases.
154
+ - Weights for performance, stability, cost, availability are independent 0..100 (NOT normalized).
155
+ - Prefer pitting/crevice metrics in chloride questions; keep units explicit.
156
+ """
157
+
158
+ ANSWER_TEMPLATE = """{rules}
159
+
160
+ User constraints:
161
+ - Environment: {environment}
162
+ - Temperature: {temperature}
163
+ - Min UTS (MPa): {min_uts}
164
+ - Max density (g/cm^3): {max_density}
165
+ - Budget: {budget}
166
+ - Process: {process}
167
+
168
+ Independent priorities (0..100 each):
169
+ - performance={w_perf}, stability={w_stab}, cost={w_cost}, availability={w_avail}
170
+
171
+ Question:
172
+ {question}
173
+
174
+ Context snippets (numbered):
175
+ {context}
176
+
177
+ Citations:
178
+ {citations}
179
+
180
+ Now, first output ONLY the JSON block, then the short narrative.
181
+ """
182
+
183
+ def format_context(hits: List[Tuple[str, str]]) -> Tuple[str, str]:
184
+ blocks, cites = [], []
185
+ for i, (text, cite) in enumerate(hits, 1):
186
+ snippet = textwrap.shorten(text.replace("\n", " "), width=450, placeholder=" …")
187
+ blocks.append(f"[{i}] {snippet}")
188
+ cites.append(f"[{i}] {cite}")
189
+ return "\n".join(blocks), "\n".join(cites)
190
+
191
+ def extract_json_block(text: str):
192
+ m = re.search(r"```json\s*(\{.*?\})\s*```", text, flags=re.S | re.I)
193
+ s = m.group(1) if m else None
194
+ if not s:
195
+ m2 = re.search(r"(\{(?:[^{}]|(?1))*\})", text, flags=re.S)
196
+ s = m2.group(1) if m2 else None
197
+ if not s:
198
+ return None
199
+ try:
200
+ return json.loads(s)
201
+ except Exception:
202
+ last = s.rfind("}")
203
+ if last != -1:
204
+ try:
205
+ return json.loads(s[:last+1])
206
+ except Exception:
207
+ return None
208
+ return None
209
+
210
+ # ---------- Routes ----------
211
+ @app.get("/")
212
+ def index():
213
+ return render_template("index.html", default_model=DEFAULT_MODEL, default_k=DEFAULT_TOPK)
214
+
215
+ @app.post("/recommend")
216
+ def recommend():
217
+ # basics
218
+ environment = request.form.get("environment", "").strip() or "seawater"
219
+ temperature = request.form.get("temperature", "").strip() or "20–25 °C"
220
+ min_uts = request.form.get("min_uts", "").strip() or "0"
221
+ max_density = request.form.get("max_density", "").strip() or "100"
222
+ budget = request.form.get("budget", "").strip() or "open"
223
+ process = request.form.get("process", "").strip() or "any"
224
+
225
+ # hidden numeric weights from dropdowns (0..100 each; independent)
226
+ w_perf = to_dec(request.form.get("w_perf"), 75) # e.g., Very high -> 100
227
+ w_stab = to_dec(request.form.get("w_stab"), 100)
228
+ w_cost = to_dec(request.form.get("w_cost"), 75) # "High" cost priority -> 100
229
+ w_avail = to_dec(request.form.get("w_avail"), 75)
230
+
231
+ model = (request.form.get("model", DEFAULT_MODEL) or DEFAULT_MODEL).strip()
232
+ try:
233
+ k = int(request.form.get("k", DEFAULT_TOPK))
234
+ except Exception:
235
+ k = DEFAULT_TOPK
236
+
237
+ question = (
238
+ f"For {environment} at {temperature}, shortlist materials that meet "
239
+ f"UTS ≥ {min_uts} MPa and density ≤ {max_density} g/cm^3. "
240
+ f"Consider budget={budget} and process={process}. "
241
+ f"Rank by performance, stability, cost, and availability."
242
+ )
243
+
244
+ hits = search(question, k=k)
245
+ if not hits:
246
+ flash("No context found. Please add sources and rebuild/update the index.", "error")
247
+ return redirect(url_for("index"))
248
+
249
+ ctx, cites = format_context(hits)
250
+
251
+ prompt = ANSWER_TEMPLATE.format(
252
+ rules=SYSTEM_RULES, environment=environment, temperature=temperature,
253
+ min_uts=min_uts, max_density=max_density, budget=budget, process=process,
254
+ w_perf=str(int(w_perf)), w_stab=str(int(w_stab)),
255
+ w_cost=str(int(w_cost)), w_avail=str(int(w_avail)),
256
+ question=question, context=ctx, citations=cites
257
+ )
258
+
259
+ # Call model (gracefully handle lock or missing ollama)
260
+ if not has_ollama():
261
+ raw = "[Ollama not found]\n\n" + prompt
262
+ candidates = []
263
+ flash("Ollama not found — showing retrieval context only.", "error")
264
+ else:
265
+ try:
266
+ LOCK_PATH.parent.mkdir(parents=True, exist_ok=True)
267
+ with FileLock(str(LOCK_PATH), timeout=1):
268
+ raw = call_ollama(model, prompt)
269
+ except Exception:
270
+ # If lock fails, try without lock instead of crashing
271
+ raw = call_ollama(model, prompt)
272
+ parsed = extract_json_block(raw) if raw else None
273
+ candidates = (parsed or {}).get("candidates", []) if parsed else []
274
+
275
+ # Always normalize to have score_pct and sorting
276
+ candidates = normalize_candidates_for_display(candidates, max_total=400.0)
277
+
278
+ return render_template(
279
+ "results.html",
280
+ candidates=candidates,
281
+ citations=cites.splitlines(),
282
+ environment=environment,
283
+ temperature=temperature,
284
+ raw_output=raw,
285
+ default_model=model,
286
+ default_k=k,
287
+ )
288
+
289
+ if __name__ == "__main__":
290
+ ensure_dirs()
291
+ app.run(host="127.0.0.1", port=5000, debug=False)
index/.DS_Store ADDED
Binary file (6.15 kB). View file
 
index/chroma_v3/.DS_Store ADDED
Binary file (6.15 kB). View file
 
index/chroma_v3/22ddc0e5-4809-4117-908d-d7a3fde16dd5/data_level0.bin ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:f22e66ae41490ece9401f250d1a0d8d88faff60b8a5a6d2e6a0fea18dceaeeb6
3
+ size 77096000
index/chroma_v3/22ddc0e5-4809-4117-908d-d7a3fde16dd5/header.bin ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:51322a95a0a25fad357f6a41ac5eb05619eac1446a85237c58a3ff74c1f912fc
3
+ size 100
index/chroma_v3/22ddc0e5-4809-4117-908d-d7a3fde16dd5/index_metadata.pickle ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:f79efa7d0c5d01308f005c20f0f31911ab2f491722e6563a3407b3b7581e14e6
3
+ size 2666582
index/chroma_v3/22ddc0e5-4809-4117-908d-d7a3fde16dd5/length.bin ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:9f9537d3b97f1e52c5fd2fde85ad6fc804cb666c225a879a232d09073b5a55d9
3
+ size 184000
index/chroma_v3/22ddc0e5-4809-4117-908d-d7a3fde16dd5/link_lists.bin ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:252fd181973f88a295687ed085e667b86dcf51f6eff226be3496d52f9d78ce38
3
+ size 401872
index/chroma_v3/chroma.sqlite3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a1172bfcf6830a9c3535fe95da232d9ea05263b209c8f4c0c255807e263443ad
3
+ size 443383808
index/manifest.json ADDED
@@ -0,0 +1,1482 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "sources/Identification-and-validation-of-a-ductile-d_2006_Journal-of-Materials-Proce.pdf": {
3
+ "sha1": "2c9b68a4e8bfc94aa79e611120a7c09a902a86cd",
4
+ "size": 289731,
5
+ "mtime": 1757615655
6
+ },
7
+ "sources/The Effect of Weld Metal Composition on Microstructural_and Mechanical Properties of Dissimilar Welds Between_Monel 400 and Inconel 600.pdf": {
8
+ "sha1": "cd08b2c50c96d15655d2d631052cab49785ff1f9",
9
+ "size": 5846646,
10
+ "mtime": 1757615657
11
+ },
12
+ "sources/ Vanadium ionic species from degradation of Ti-6Al-4V metallic implants in In vitro cytotoxicity and speciation evaluation.pdf": {
13
+ "sha1": "8e484692573dd03af877c27c37ded5dbd4d3271f",
14
+ "size": 2272878,
15
+ "mtime": 1757615654
16
+ },
17
+ "sources/High-Temperature Corrosion of Different Steels in Liquid Sn-Bi-Zn Heat Transfer Alloy.pdf": {
18
+ "sha1": "9e364f534df86cf49e96cfd9f347140c5cbb15a1",
19
+ "size": 27377482,
20
+ "mtime": 1757120262
21
+ },
22
+ "sources/AlloyMind: An Intelligent LLM-Powered Recommender for Steel and Alloy Selection.pdf": {
23
+ "sha1": "f18ca49e5af01eb83dc17944577bd06ee3c0f77b",
24
+ "size": 66567,
25
+ "mtime": 1757087998
26
+ },
27
+ "sources/Preface_2006_Journal-of-Materials-Processing-Technology.pdf": {
28
+ "sha1": "c03430fec991e49d67b74398d2dd660e2769309a",
29
+ "size": 48249,
30
+ "mtime": 1757615656
31
+ },
32
+ "sources/Embedding-of-a-circular-plate-into-a-thin-plate-_2006_Journal-of-Materials-P.pdf": {
33
+ "sha1": "19d87fe5e1801f1677fdb38e8944de9d0a0895fc",
34
+ "size": 329882,
35
+ "mtime": 1757615655
36
+ },
37
+ "sources/High-throughput studies and machine learning for design of \u03b2 titanium alloys with optimum properties1-s2.0-S1003632624666021-main.pdf": {
38
+ "sha1": "01ddd92ec5a330825e360cbceb12a501733b77c1",
39
+ "size": 7464680,
40
+ "mtime": 1757103350
41
+ },
42
+ "sources/Three-dimensional-thermo-mechanical-simulation-of_2006_Journal-of-Materials-.pdf": {
43
+ "sha1": "c0a1c860ce590f1e8dcfb5be0fc5e4ba0a5df3b9",
44
+ "size": 575544,
45
+ "mtime": 1757615657
46
+ },
47
+ "sources/Advances in Materials for Fuel Cell Technologies A Review.pdf": {
48
+ "sha1": "3049fcf0f53c418d17bee089ec4588712a4568de",
49
+ "size": 1079654,
50
+ "mtime": 1757615654
51
+ },
52
+ "sources/Investigating the corrosion performance of Ti-6Al-4V biomaterial alloy with hydroxyapatite coating by artificial neural network.pdf": {
53
+ "sha1": "4ae86514fe2a08bd7e6b536f7c9e6b4cfbaa8885",
54
+ "size": 4690588,
55
+ "mtime": 1757615656
56
+ },
57
+ "sources/Oxidation-behaviors-and-compressive-strength-evolution-of-DD6_2022_Corrosion.pdf": {
58
+ "sha1": "dc3bdc833f7c9dac94f35ca49722427d7cde0514",
59
+ "size": 7079069,
60
+ "mtime": 1757599214
61
+ },
62
+ "sources/crystals-15-00213-with-cover.pdf": {
63
+ "sha1": "d06a1b280fae8d33bcdddb204916536601f47ccd",
64
+ "size": 2279713,
65
+ "mtime": 1757090144
66
+ },
67
+ "sources/Extreme high efficiency enabled by silicon carbide power devices .pdf": {
68
+ "sha1": "2e57b5e6ec0fcfd63725c47b9f916bcba34556d1",
69
+ "size": 16557161,
70
+ "mtime": 1757615655
71
+ },
72
+ "sources/Solid-state-bonding-in-extrusion-and-FSW--Pro_2006_Journal-of-Materials-Proc.pdf": {
73
+ "sha1": "bda4a5f78374271a6acb23e6bc2594fd79d8d437",
74
+ "size": 392774,
75
+ "mtime": 1757615657
76
+ },
77
+ "sources/Impact of surface roughness and preheat temperature on fecrbmnsi coating properties prepared by the twin wire Arc spray method.pdf": {
78
+ "sha1": "33e336d1bacb6b1672c76b90018d4e98c79bd5db",
79
+ "size": 3357394,
80
+ "mtime": 1757120262
81
+ },
82
+ "sources/Numerical-investigation-on-dynamic-effects-during-s_2006_Journal-of-Material.pdf": {
83
+ "sha1": "d8ee2ab98f23a5cf1de6163298b820e7bcc59e1e",
84
+ "size": 232845,
85
+ "mtime": 1757615656
86
+ },
87
+ "sources/Two-Dimensional Silicon Carbide.pdf": {
88
+ "sha1": "329bcd0866cd0b700fa2719ac2e9f83a9be616aa",
89
+ "size": 3922156,
90
+ "mtime": 1757615657
91
+ },
92
+ "sources/Analysis-of-asymmetrical-cold-and-hot-bond-rolling_2006_Journal-of-Materials.pdf": {
93
+ "sha1": "744dd17eaba40f4e49dfe117225ed3683a12f0f6",
94
+ "size": 493752,
95
+ "mtime": 1757615654
96
+ },
97
+ "sources/Inverse-identification-using-the-bulge-test-a_2006_Journal-of-Materials-Proc.pdf": {
98
+ "sha1": "dd7f0a72a6ef273a9168372b58389861ff2d90ff",
99
+ "size": 262410,
100
+ "mtime": 1757615656
101
+ },
102
+ "sources/An-upper-bound-solution-for-a-solid-viscous-cyl_2006_Journal-of-Materials-Pr.pdf": {
103
+ "sha1": "ab139c4d1a891dddbea183b3805b72c1a3f6df1e",
104
+ "size": 182571,
105
+ "mtime": 1757615654
106
+ },
107
+ "sources/Increasing-formability-in-sheet-metal-stamping-ope_2006_Journal-of-Materials.pdf": {
108
+ "sha1": "bbf68c6944f7266d619cf3614ddd7b8a4fca3b05",
109
+ "size": 196574,
110
+ "mtime": 1757615655
111
+ },
112
+ "sources/A New Infrared Heat Treatment on Hot Forging 7075 Aluminum Alloy: Microstructure and Mechanical Properties.pdf": {
113
+ "sha1": "8e683380520e71123b9b809474f0287144fb3a95",
114
+ "size": 5303504,
115
+ "mtime": 1757164354
116
+ },
117
+ "sources/On-microstructural-phenomena-occurring-in-frict_2006_Journal-of-Materials-Pr.pdf": {
118
+ "sha1": "ea95bbb526784be7e0ebed386771216dc3c2dd55",
119
+ "size": 212696,
120
+ "mtime": 1757615656
121
+ },
122
+ "sources/Effect of build orientation and heat treatment on the microstructure, deformation behavior, and mechanical properties of selective laser melted 17-4 PH stainless steel1-s2.0-S0921509325012778-main.pdf": {
123
+ "sha1": "ca0cae694c461535689e4353191342822b7c564b",
124
+ "size": 43286535,
125
+ "mtime": 1757120264
126
+ },
127
+ "sources/Applied Thermodynamics .pdf": {
128
+ "sha1": "8a6aaa826804a51538fb67be370d82be4e43ebab",
129
+ "size": 12540597,
130
+ "mtime": 1757615654
131
+ },
132
+ "sources/A Review of the Mechanical Properties of 17-4PH Stainless Steel Produced by Bound Powder Extrusion.pdf": {
133
+ "sha1": "b6f567372890a84cefad62abe8d725ad21625328",
134
+ "size": 2356742,
135
+ "mtime": 1757088116
136
+ },
137
+ "sources/Review on carbon fiber reinforced polymer and their mechanical performance .pdf": {
138
+ "sha1": "9895473d0c92ac54d04216cc9be9a29d0b378b7d",
139
+ "size": 313361,
140
+ "mtime": 1757615656
141
+ },
142
+ "sources/Joinability-of-aluminium-alloy-and-mild-steel_2006_Journal-of-Materials-Proc.pdf": {
143
+ "sha1": "a2cf656e7470718df8d4554349c40e3853c035c6",
144
+ "size": 362986,
145
+ "mtime": 1757615656
146
+ },
147
+ "sources/Characterisation-of-extruded-magnesium-profil_2006_Journal-of-Materials-Proc.pdf": {
148
+ "sha1": "7f0b46fcb8637654a5d18cc6159649f3c3142f89",
149
+ "size": 238869,
150
+ "mtime": 1757615655
151
+ },
152
+ "sources/The-extended-finite-element-method--X-FEM--f_2006_Journal-of-Materials-Proce.pdf": {
153
+ "sha1": "1acae60c32d33922270eb78b091b84d882266751",
154
+ "size": 429724,
155
+ "mtime": 1757615657
156
+ },
157
+ "sources/Air-bending-of-AZ31-magnesium-alloy-in-warm-_2006_Journal-of-Materials-Proce.pdf": {
158
+ "sha1": "e4e01e4033368b5c03c52da56e2e4c8d620c3831",
159
+ "size": 395210,
160
+ "mtime": 1757615654
161
+ },
162
+ "sources/Book_Materials_Science_and_Engineering_by_William.pdf": {
163
+ "sha1": "b9ca6a5a8c887385212b0f07e13b34937d28bc08",
164
+ "size": 295862181,
165
+ "mtime": 1757615655
166
+ },
167
+ "sources/Relations-between-numerical-simulation-and-expe_2006_Journal-of-Materials-Pr.pdf": {
168
+ "sha1": "0cbcac81f6220c8d712d63f2e01981cc33008246",
169
+ "size": 248643,
170
+ "mtime": 1757615656
171
+ },
172
+ "sources/Mechanical performance dataset for alloy with applications at low temperatures.pdf": {
173
+ "sha1": "f6918b001f7cdb8b4b8d4465267b78c01be8b2e6",
174
+ "size": 1134453,
175
+ "mtime": 1757103419
176
+ },
177
+ "sources/Numerical-and-experimental-assessment-of-ductile-f_2006_Journal-of-Materials.pdf": {
178
+ "sha1": "7c5f894b57959a28d3d20e0fbc427c36e12df0d7",
179
+ "size": 344878,
180
+ "mtime": 1757615656
181
+ },
182
+ "sources/Level-Set modeling of grain growth in 316L stainless steel under di\ufb00erent assumptions regarding grain boundary properties.pdf": {
183
+ "sha1": "e008439a562b730d13aa7e74c6aa9a20286114c2",
184
+ "size": 19628296,
185
+ "mtime": 1757120261
186
+ },
187
+ "sources/Modeling-of-aluminum-alloy-sheets-based-on-ne_2006_Journal-of-Materials-Proc.pdf": {
188
+ "sha1": "2807f4e781a247ce52dd3a0eaa7f5a4ae53a51a5",
189
+ "size": 291874,
190
+ "mtime": 1757615656
191
+ },
192
+ "sources/Forming-of-aluminum-foam-sandwich-panels--Numeri_2006_Journal-of-Materials-P.pdf": {
193
+ "sha1": "9c3d8126a34eb5bfa23de62a8df7af3a918c431f",
194
+ "size": 278719,
195
+ "mtime": 1757615655
196
+ },
197
+ "sources/.DS_Store": {
198
+ "sha1": "437d761626dbb7995fc411e08e31e006886b0bad",
199
+ "size": 65540,
200
+ "mtime": 1757616115
201
+ },
202
+ "sources/herbeaux-antoine-diff.pdf": {
203
+ "sha1": "ff3849ee36372ccdf5a5c068136ea1ca9367b26a",
204
+ "size": 19293739,
205
+ "mtime": 1757615655
206
+ },
207
+ "sources/Erosion\u2013corrosion of 2205 duplex stainless steel in flowing seawater containing sand particles.pdf": {
208
+ "sha1": "0ed731634c5038accf9c94168c5640c52abee8f7",
209
+ "size": 1361593,
210
+ "mtime": 1757087429
211
+ },
212
+ "sources/Chloride-induced alterations of the passive film on 316L stainless steel and blocking effect of pre-passivation.pdf": {
213
+ "sha1": "b562f9325194ffec1d6959ee28ad6054ea1584a5",
214
+ "size": 3401942,
215
+ "mtime": 1757087580
216
+ },
217
+ "sources/The-effects-of-flash-allowance-and-bar-size-on-fo_2006_Journal-of-Materials-.pdf": {
218
+ "sha1": "1fcaa0f0b92bac34c2476fd5cfd3f1b05e76c69c",
219
+ "size": 346462,
220
+ "mtime": 1757615657
221
+ },
222
+ "sources/Biomass-based carbon materials for CO2 capture A review.pdf": {
223
+ "sha1": "9a35d31bcbc84914866032eae4d50bf590924ff1",
224
+ "size": 7119959,
225
+ "mtime": 1757615654
226
+ },
227
+ "sources/Study on mechanical properties and application in communication pole line engineering of GFRP.pdf": {
228
+ "sha1": "81ed41b15ae196ed597e5c0e4c8985ac7e15f1ae",
229
+ "size": 7822419,
230
+ "mtime": 1757615657
231
+ },
232
+ "sources/Lightweight Glass Fiber-Reinforced Polymer Composite for Automotive Bumper Applications_ A Review .pdf": {
233
+ "sha1": "30a6603a47e576c8bf8e2a037b32c82c79ce1cac",
234
+ "size": 2792072,
235
+ "mtime": 1757615656
236
+ },
237
+ "sources/Damage mechanisms assessment of Glass Fiber-Reinforced Polymer composites using multivariable analys.pdf": {
238
+ "sha1": "610a0126d75fa8430ca64d419b628b1d0d51ee8f",
239
+ "size": 8938181,
240
+ "mtime": 1757615655
241
+ },
242
+ "sources/Experimental-and-numerical-investigation-of-restorat_2006_Journal-of-Materia.pdf": {
243
+ "sha1": "ec21b8968ae9a3152510587d28a8288a3e7ce178",
244
+ "size": 586689,
245
+ "mtime": 1757615655
246
+ },
247
+ "sources/Optimization-of-tool-path-in-two-points-i_2006_Journal-of-Materials-Processi.pdf": {
248
+ "sha1": "71c4eb15a3e34392b942b9191d9085d2d0bfd0e7",
249
+ "size": 331874,
250
+ "mtime": 1757615656
251
+ },
252
+ "sources/ScienceDirect_articles_11Sep2025_17-00-13.555.zip": {
253
+ "sha1": "3395b2c26c78a679fd894b304cd16324cc350600",
254
+ "size": 31665068,
255
+ "mtime": 1757615657
256
+ },
257
+ "sources/Materials Today Proceedings.pdf": {
258
+ "sha1": "a22a773c171fcb9aecbd7ecc661a60c229c88690",
259
+ "size": 2133756,
260
+ "mtime": 1757615656
261
+ },
262
+ "sources/Mechanical and tribo\u2011metallurgical behavior of 17\u20114 precipitation_hardening stainless steel affected by severe cold plastic deformation_a comprehensive review article.pdf": {
263
+ "sha1": "0f1cca8cb81b64c628de450ca4da85cfd62ee913",
264
+ "size": 2509383,
265
+ "mtime": 1757615656
266
+ },
267
+ "sources/ Materials Selection in Mechanical Design textbook.pdf": {
268
+ "sha1": "05efd254eda66c08809b2daa2fe725450ccde940",
269
+ "size": 23849814,
270
+ "mtime": 1757615654
271
+ },
272
+ "sources/The Impact of Destructive Climatic Factors on the Mechanical and Performance Properties of Structural Materials.pdf": {
273
+ "sha1": "cfa7865cfb59a6268f0e9306a32ee1ec40652815",
274
+ "size": 15667914,
275
+ "mtime": 1757120261
276
+ },
277
+ "sources/Quantitative-analysis-of-the-impact-of-forging-ope_2006_Journal-of-Materials.pdf": {
278
+ "sha1": "58c7318b20a8ee61837f1850aa816e4c12b76bad",
279
+ "size": 276582,
280
+ "mtime": 1757615656
281
+ },
282
+ "sources/FRP Composites .pdf": {
283
+ "sha1": "914321b5a44586a4fc219d3f48a844ac055ac1dc",
284
+ "size": 2002503,
285
+ "mtime": 1757615655
286
+ },
287
+ "sources/Prioritizing biomaterials for spinal disc implants by a fuzzy AHP and TOPSIS decision making method.pdf": {
288
+ "sha1": "ddcf3972ce91daf17a13821a518da3f5bfe4cd12",
289
+ "size": 3209832,
290
+ "mtime": 1757615656
291
+ },
292
+ "sources/Polymer matrix nanocomposites for automotive.pdf": {
293
+ "sha1": "dc423e7d466f8c88d0bf8f75d422df1a08a07bf1",
294
+ "size": 1094160,
295
+ "mtime": 1757615656
296
+ },
297
+ "sources/Springback-analysis-of-numerical-control-bending-o_2006_Journal-of-Materials.pdf": {
298
+ "sha1": "8264032f8f0230e9cb7e917292f4c74b1363e4f6",
299
+ "size": 456441,
300
+ "mtime": 1757615657
301
+ },
302
+ "sources/Effects of heat treatment on the corrosion behavior and mechanical properties of aluminum alloy 202.pdf": {
303
+ "sha1": "f1f32c46326b2768874c4586a0c1e86502a6d81d",
304
+ "size": 3385832,
305
+ "mtime": 1757163868
306
+ },
307
+ "sources/michella-alnajjar-diff.pdf": {
308
+ "sha1": "f27023069f5d011cb60efb970e1bc2ce17338923",
309
+ "size": 7635584,
310
+ "mtime": 1757615656
311
+ },
312
+ "sources/Homogeneity-aspects-in-selective-laser-s_2006_Journal-of-Materials-Processin.pdf": {
313
+ "sha1": "b2270683046c36d317e9712ba7256f76eb6b26fd",
314
+ "size": 384260,
315
+ "mtime": 1757615655
316
+ },
317
+ "sources/Applications and Future Trends of Carbon Fiber Reinforced Polymer Composites_ A Review .pdf": {
318
+ "sha1": "290009dba8fb2507958c2bd443c336358bed6b8e",
319
+ "size": 272199,
320
+ "mtime": 1757615654
321
+ },
322
+ "sources/Thermodynamics-based-method-considering-orientation-and-no_2023_Internationa.pdf": {
323
+ "sha1": "e5d1124022deea7c2c2b3b6412892316226faafa",
324
+ "size": 7633735,
325
+ "mtime": 1757599214
326
+ },
327
+ "sources/Modelling-of-the-rheological-behaviour-of-aluminium-allo_2006_Journal-of-Mat.pdf": {
328
+ "sha1": "27eb6aa308283853730207c19ec61dc7c7e22aa8",
329
+ "size": 596904,
330
+ "mtime": 1757615656
331
+ },
332
+ "sources/SEMICONDUCTOR MATERIAL AND DEVICE CHARACTERIZATION.pdf": {
333
+ "sha1": "c1213720a27f23d76b64d8d2522959190b825c35",
334
+ "size": 11980666,
335
+ "mtime": 1757615657
336
+ },
337
+ "sources/Finite-element-analysis-and-formability-of-non-i_2006_Journal-of-Materials-P.pdf": {
338
+ "sha1": "fa300e4ca01b784b4d590624890fa98cf9e001ca",
339
+ "size": 730984,
340
+ "mtime": 1757615655
341
+ },
342
+ "sources/Using-an-artificial-neural-network-to-assist-rol_2006_Journal-of-Materials-P.pdf": {
343
+ "sha1": "1dff5dcc0176771a08930c6c06f4725745882950",
344
+ "size": 256345,
345
+ "mtime": 1757615657
346
+ },
347
+ "sources/Mechanical Systems and Signal Processing.pdf": {
348
+ "sha1": "6862ab603386303ae42b53b544dc2e1644d514a6",
349
+ "size": 1309010,
350
+ "mtime": 1757615656
351
+ },
352
+ "sources/Composite Materials Engineering and design book.pdf": {
353
+ "sha1": "2d9d858fe0d8aa48245b78bb8c298ad90ead4e74",
354
+ "size": 19650538,
355
+ "mtime": 1757615655
356
+ },
357
+ "sources/The Road for 2D Semiconductors in the Silicon Age.pdf": {
358
+ "sha1": "30e6b300f8d3d496e7c07ef82f6f664b31b06c51",
359
+ "size": 3777938,
360
+ "mtime": 1757615657
361
+ },
362
+ "sources/Principles_of_Electronic_Materials_and_D.pdf": {
363
+ "sha1": "9a9eb2e3e997d18984c99ee295f30c7049506712",
364
+ "size": 14499106,
365
+ "mtime": 1757615656
366
+ },
367
+ "sources/The Effect of Microstructure on Mechanical Properties of Forged 6061 Aluminum Alloy.pdf": {
368
+ "sha1": "7a19f0f0633bffc98d3c07f72aa56dcf8c660f2d",
369
+ "size": 2767469,
370
+ "mtime": 1757164273
371
+ },
372
+ "sources/Status and Prospects of Cubic Silicon Carbide Power Electronics Device Technology .pdf": {
373
+ "sha1": "e26e4875aeb446158ef3857488ddb62c01af4406",
374
+ "size": 4261829,
375
+ "mtime": 1757615657
376
+ },
377
+ "sources/Free-deformation-mechanism-and-change-of-forming_2006_Journal-of-Materials-P.pdf": {
378
+ "sha1": "7e7e8dd93f1d12c39524d8c2ebdd214cdeae17d4",
379
+ "size": 197233,
380
+ "mtime": 1757615655
381
+ },
382
+ "sources/Carbon Fiber-Reinforced Polymer Composites in Civil Engineering Applications-A Comprehensive Review .pdf": {
383
+ "sha1": "ed8eb6642096922b969ea0f6f60fc06349498dee",
384
+ "size": 1586527,
385
+ "mtime": 1757615655
386
+ },
387
+ "sources/Influence of aging treatment on mechanical properties of 6061 aluminum alloy.pdf": {
388
+ "sha1": "672d3c80018bc0aa6ce9511cf9825a36800803e2",
389
+ "size": 135946,
390
+ "mtime": 1757164272
391
+ },
392
+ "sources/Prediction-of-coiling-temperature-on-run-out-tab_2006_Journal-of-Materials-P.pdf": {
393
+ "sha1": "1761e8cd2603a58c4395a972750b685c2844f314",
394
+ "size": 422068,
395
+ "mtime": 1757615656
396
+ },
397
+ "sources/Silicon carbide for integrated photonics.pdf": {
398
+ "sha1": "f327d1d8f7f5b42873ad39fc140d8ed9af60be40",
399
+ "size": 2804148,
400
+ "mtime": 1757615657
401
+ },
402
+ "sources/Microstructure evaluation, thermal and mechanical characterization of hybrid metal matrix composite.pdf": {
403
+ "sha1": "49d385d132da6f33f2c97e5bcb397ed8673e5824",
404
+ "size": 938956,
405
+ "mtime": 1757615656
406
+ },
407
+ "sources/Analysis-of-blanking-process-using-variou_2006_Journal-of-Materials-Processi.pdf": {
408
+ "sha1": "a4228eeb17be3c0597b21a68b45730303ecda612",
409
+ "size": 334648,
410
+ "mtime": 1757615654
411
+ },
412
+ "sources/Recent advances in the development of aerospace materials.pdf": {
413
+ "sha1": "711bf318d8cc4095c15f79937fb94230d7321f3e",
414
+ "size": 1832530,
415
+ "mtime": 1757615656
416
+ },
417
+ "sources/Nanomaterials-For-Hydrogen-Generation-A-Review.pdf": {
418
+ "sha1": "81fa4f66ad5834c59be7bfc7497206899928345b",
419
+ "size": 1304032,
420
+ "mtime": 1757615656
421
+ },
422
+ "sources/Materials Selection and Design book .pdf": {
423
+ "sha1": "d63ff4902e50ca37b6c53a447fede7a3f23e9742",
424
+ "size": 3256451,
425
+ "mtime": 1757615656
426
+ },
427
+ "sources/Distributed-multi-agent-system-approach-fo_2006_Journal-of-Materials-Process.pdf": {
428
+ "sha1": "565f06a39cbda3594bb73ebd8cb2115d239a6c9f",
429
+ "size": 326072,
430
+ "mtime": 1757615655
431
+ },
432
+ "sources/Effect of heat treatment on microstructure and mechanical properties of 17-4PH stainless steel manufactured by laser-powder bed fusion.pdf": {
433
+ "sha1": "1fd2a689c86b895e8335ffdde7d964f21e8de35c",
434
+ "size": 5042447,
435
+ "mtime": 1757120263
436
+ },
437
+ "sources/Dry and steam reforming of methane. Comparison and analysis of recently.pdf": {
438
+ "sha1": "f76aa71e1b6d58544c72c74396e41cd49de8d947",
439
+ "size": 596815,
440
+ "mtime": 1757615655
441
+ },
442
+ "sources/A comparative study on corrosion and mechanical properties of laser-cladded X2CrNiMoN22-5-3 duplex stainless steel on 42CrMo4 steel substrate.pdf": {
443
+ "sha1": "49860395a1c6c5ce6d6640a9973b973d676e0ece",
444
+ "size": 10549532,
445
+ "mtime": 1757120263
446
+ },
447
+ "sources/Developments on Electron Beam Melting (EBM) of Ti\u20136Al\u20134V A Review.pdf": {
448
+ "sha1": "b4157cd821bdd01afa20e60edb1e120de115610b",
449
+ "size": 522417,
450
+ "mtime": 1757615655
451
+ },
452
+ "sources/Accelerated-3D-FEM-computation-of-the-mechanical-hi_2006_Journal-of-Material.pdf": {
453
+ "sha1": "d26f5aea5b543d9f59674df698d2f21e0541ce70",
454
+ "size": 396532,
455
+ "mtime": 1757615654
456
+ },
457
+ "sources/A-method-of-constructing-smooth-tool-surfaces-for-_2006_Journal-of-Materials.pdf": {
458
+ "sha1": "d9ffb6db22501ee7b092c27c4130bad6d92f8956",
459
+ "size": 311117,
460
+ "mtime": 1757615654
461
+ },
462
+ "sources/An-integrated-numerical-technique-in-determining-_2006_Journal-of-Materials-.pdf": {
463
+ "sha1": "66dfee1f02c5436d6674c9a0f3cc629d04210eb6",
464
+ "size": 340847,
465
+ "mtime": 1757615654
466
+ },
467
+ "sources/Effect of a post-weld heat treatment on the mechanical and microstructure properties of AA6061 joints welded by the gas metal arc welding cold metal transfer method.pdf": {
468
+ "sha1": "955cc9d13031eee3e26137b7bb75158870bb2073",
469
+ "size": 1213615,
470
+ "mtime": 1757164273
471
+ },
472
+ "sources/Adsorbent materials for water treatment A review of current trends and future challenges.pdf": {
473
+ "sha1": "6a34a9a344c45094013e991ee6097016a79da013",
474
+ "size": 3614955,
475
+ "mtime": 1757615654
476
+ },
477
+ "sources/9781315138862_previewpdf.pdf": {
478
+ "sha1": "864a089e96a04aa1671e43bf609832969a598ea2",
479
+ "size": 4612906,
480
+ "mtime": 1757615654
481
+ },
482
+ "sources/A comparative study of the mechanical characteristics of additively and conventionally fabricated 17-4 precipitation hardened stainless steel.pdf": {
483
+ "sha1": "cd5788caf4d54a68c8ab49fa9df90b002c184a5a",
484
+ "size": 7229838,
485
+ "mtime": 1757120264
486
+ },
487
+ "sources/Optimizing Tensile Properties and Hardness of Inconel 718 by Cold Rolling.pdf": {
488
+ "sha1": "04a94e992e6267b39114e7ccc6cf1628eb0c3b03",
489
+ "size": 14610763,
490
+ "mtime": 1757088189
491
+ },
492
+ "sources/Discovering the nanoscale origins of localized corrosion in additive manufactured stainless steel 316L by in situ liquid cell TEM.pdf": {
493
+ "sha1": "5fd74c7d57284fbce07c43b71c5432f549e3b22a",
494
+ "size": 1124824,
495
+ "mtime": 1757120259
496
+ },
497
+ "sources/A latest overview on photocatalytic application of g-C3N4 based nanostructured materials for hydrogen production.pdf": {
498
+ "sha1": "8c590f4e63eaf695bdb7417c6a28cca418c39fef",
499
+ "size": 12913728,
500
+ "mtime": 1757615654
501
+ },
502
+ "sources/Micro-forming-and-miniature-manufacturing-system_2006_Journal-of-Materials-P.pdf": {
503
+ "sha1": "71de5390f0ea3b3ca255c96dc4772a8200a69f1a",
504
+ "size": 391273,
505
+ "mtime": 1757615656
506
+ },
507
+ "sources/Influence of surface quality on corrosion resistance of stainless steel and aluminum alloy butt welds after innovative finishing.pdf": {
508
+ "sha1": "52796ead78a8aac5afea70eb86bb00ba744d8c07",
509
+ "size": 5027232,
510
+ "mtime": 1757120261
511
+ },
512
+ "sources/Effect of preferential growth of Shewanella oneidensis MR-1 on microbial corrosion of constituent phases of 2205 duplex stainless steel.pdf": {
513
+ "sha1": "30b5e5a4d956dd02f59c59c59c36c92e2c53d766",
514
+ "size": 18048732,
515
+ "mtime": 1757120262
516
+ },
517
+ "sources/Forming-process-of-valve-drop-forging-wit_2006_Journal-of-Materials-Processi.pdf": {
518
+ "sha1": "dce68ee024a7819fa97f850ba9133488ca0853b9",
519
+ "size": 537519,
520
+ "mtime": 1757615655
521
+ },
522
+ "sources/Effect of heat treatment on microstructure, hardness and corrosion resistance of 7075 Al alloys fabricated by SLM.pdf": {
523
+ "sha1": "219942ed946e15e8be875a6c963a50478f08e9f7",
524
+ "size": 4769233,
525
+ "mtime": 1757164354
526
+ },
527
+ "sources/Metallenes as functional materials.pdf": {
528
+ "sha1": "5e424044cf29698a6f6171b3ad0563b64af964ed",
529
+ "size": 6648179,
530
+ "mtime": 1757615656
531
+ },
532
+ "sources/Parameter-optimisation-in-constitutive-equa_2006_Journal-of-Materials-Proces.pdf": {
533
+ "sha1": "e0439ac042b9fadd9a1d94a48ad9932931f4551c",
534
+ "size": 191974,
535
+ "mtime": 1757615656
536
+ },
537
+ "sources/Investigation-of-a-slab-method-analysis-and-FEM-s_2006_Journal-of-Materials-.pdf": {
538
+ "sha1": "421a7f2666aaf65eed727f870678be63fa3926c6",
539
+ "size": 208336,
540
+ "mtime": 1757615656
541
+ },
542
+ "sources/s40820-020-00579-y.pdf": {
543
+ "sha1": "cecec7a7348ba1ab47db5a4f2697e25626ff421b",
544
+ "size": 9719583,
545
+ "mtime": 1757615656
546
+ },
547
+ "sources/Organic electrode materials for fast-rate, high-power battery applications.pdf": {
548
+ "sha1": "107f991e39c7cdd90633f8d232597661f6dcaae2",
549
+ "size": 6478023,
550
+ "mtime": 1757615656
551
+ },
552
+ "sources/Materials_Mega_Dataset_EN.csv": {
553
+ "sha1": "9257d93bbfd1190165a401ed616920b8800e7a57",
554
+ "size": 236497,
555
+ "mtime": 1757615656
556
+ },
557
+ "sources/Oxidation-behavior-of-recast-layer-of-air-film-hole-machin_2021_Surface-and-.pdf": {
558
+ "sha1": "761150009f4b8a0bfc0d81b94a6fbb6b24358cb7",
559
+ "size": 9206130,
560
+ "mtime": 1757599214
561
+ },
562
+ "sources/Manufacturing Technologies of Carbon-Glass Fiber-Reinforced Polymer Composites and Their Properties.pdf": {
563
+ "sha1": "78ed1f63c0e0aac45840a778d90d1f9cea6a8fbe",
564
+ "size": 5781873,
565
+ "mtime": 1757615656
566
+ },
567
+ "sources/UTBM_These_LI_Yingjie_2024UBFCA010.pdf": {
568
+ "sha1": "9cc498c6aab5bbd63be8783bec9954fe9aba1761",
569
+ "size": 14782267,
570
+ "mtime": 1757615657
571
+ },
572
+ "sources/Combined effects of sustained bending loading, water immersion and fiber hybrid mode on the mechanic.pdf": {
573
+ "sha1": "d726999e76f8fff48a949fb56e695bae32c65e29",
574
+ "size": 25196138,
575
+ "mtime": 1757615655
576
+ },
577
+ "sources/SurfaceandElectrochemicalPerformanceVariationsof2205Duplex StainlessSteelinMultistepSurfaceProcessing.pdf": {
578
+ "sha1": "976900b13ea58dd8dac30d89c01de08a28760c42",
579
+ "size": 5959184,
580
+ "mtime": 1757120262
581
+ },
582
+ "sources/Improving machinability of Ni-based Monel 400 superalloy.pdf": {
583
+ "sha1": "665cec150fdb03ced19b08ebcf4618cf37ae8996",
584
+ "size": 3822373,
585
+ "mtime": 1757615655
586
+ },
587
+ "sources/Thermo-mechanical-treatment-using-resistance-heating_2006_Journal-of-Materia.pdf": {
588
+ "sha1": "4e849f323051ebee75aecf2457c67cdc5df8d1ed",
589
+ "size": 304202,
590
+ "mtime": 1757615657
591
+ },
592
+ "sources/Corrosion and Ion Release in 304L Stainless Steel Biomedical Stylets.pdf": {
593
+ "sha1": "a5d7430493f0d56a87819220bc06c44664e14c53",
594
+ "size": 5449197,
595
+ "mtime": 1757120261
596
+ },
597
+ "sources/Contact-friction-modeling-with-the-extended-f_2006_Journal-of-Materials-Proc.pdf": {
598
+ "sha1": "ed4649a51e8dfd79ae1317427341f6f3174684ab",
599
+ "size": 314189,
600
+ "mtime": 1757615655
601
+ },
602
+ "sources/New-framework-for-on-line-feedback-control-o_2006_Journal-of-Materials-Proce.pdf": {
603
+ "sha1": "304afe73262edd2b8be39875fe37f8f77d8f6958",
604
+ "size": 239504,
605
+ "mtime": 1757615656
606
+ },
607
+ "sources/Aleroeva_2020_IOP_Conf._Ser.__Mater._Sci._Eng._905_012002.pdf": {
608
+ "sha1": "d9cefde967ab960f901f509903e59eaf55e27dbb",
609
+ "size": 809025,
610
+ "mtime": 1757615654
611
+ },
612
+ "sources/Durability and long-term performance of fiber reinforced polymer composites_ A review .pdf": {
613
+ "sha1": "8d51df5397cf6e7f40daff1e61f11195a7c8afeb",
614
+ "size": 2002503,
615
+ "mtime": 1757615655
616
+ },
617
+ "sources/Novel-applications-of-smoothed-particle-hydrod_2006_Journal-of-Materials-Pro.pdf": {
618
+ "sha1": "d6d43d721a8b9a49f2094e8253d9678fcfc64a54",
619
+ "size": 799563,
620
+ "mtime": 1757615656
621
+ },
622
+ "sources/Mechanical and tribo-metallurgical behavior of 17-4 precipitation hardening stainless steel affected by severe cold plastic deformation- a comprehensive review article.pdf": {
623
+ "sha1": "0f1cca8cb81b64c628de450ca4da85cfd62ee913",
624
+ "size": 2509383,
625
+ "mtime": 1757088134
626
+ },
627
+ "sources/Materials_Mega_Dataset_EN.xlsx": {
628
+ "sha1": "248e4c9edfd994eb4de453bef210f5ee4a6ed447",
629
+ "size": 66881,
630
+ "mtime": 1757615656
631
+ },
632
+ "sources/End-forming-of-thin-walled-tube_2006_Journal-of-Materials-Processing-Technol.pdf": {
633
+ "sha1": "309a5c43ffe48c359095ccbaa7762d984a9b0a76",
634
+ "size": 421897,
635
+ "mtime": 1757615655
636
+ },
637
+ "sources/Alderliesten+-+Introduction+to+Aerospace+Structures+and+Materials.pdf": {
638
+ "sha1": "55b24a2e7ad7cdbcc77a8a5a31d9419f1f2f195a",
639
+ "size": 32800755,
640
+ "mtime": 1757615654
641
+ },
642
+ "sources/Investigation on the corrosion behavior of Ti\u20136Al\u20134V implant alloy by electrochemical techniques.pdf": {
643
+ "sha1": "b30ac3297e6d15e87693b035f1dda1202783e4ab",
644
+ "size": 671811,
645
+ "mtime": 1757615656
646
+ },
647
+ "sources/Fiber-Reinforced Polymer Composites_ Manufacturing, Properties, and Applications .pdf": {
648
+ "sha1": "f8b7e4f8c3ba1bc25bb10d894f0918a3d3e21b68",
649
+ "size": 6243902,
650
+ "mtime": 1757615655
651
+ },
652
+ "sources/A-force-measuring-based-strategy-for-failure-p_2006_Journal-of-Materials-Pro.pdf": {
653
+ "sha1": "0722bc4ac0829e6307fafe8422800f15430b792e",
654
+ "size": 285026,
655
+ "mtime": 1757615654
656
+ },
657
+ "sources/Early stages of dissolution corrosion in 316L and DIN 1.4970 austenitic stainless steels with and without anticorrosion coatings in static liquid lead-bismuth eutectic (LBE) at 500\u00b0C.pdf": {
658
+ "sha1": "3325ff1d8b1208394015efeeb1f8c8c4326b965c",
659
+ "size": 6406289,
660
+ "mtime": 1757120260
661
+ },
662
+ "sources/Materials Selection and Design Book(Md Abdul MalequeMohd Sapuan Salit).pdf": {
663
+ "sha1": "ff826458cc487ef141a318e10e47ee5a7e808f27",
664
+ "size": 3248040,
665
+ "mtime": 1757566048
666
+ },
667
+ "sources/On-the-quantification-of-strain-distribution-_2006_Journal-of-Materials-Proc.pdf": {
668
+ "sha1": "9dc66237150bdaf9b16acb86cdee4149caa5833b",
669
+ "size": 326581,
670
+ "mtime": 1757615656
671
+ },
672
+ "sources/Introduction to fuel cells - II.pdf": {
673
+ "sha1": "65a478e47a2700c440307b74d89488cd268ddcd4",
674
+ "size": 3516562,
675
+ "mtime": 1757615656
676
+ },
677
+ "sources/Finite-element-prediction-of-ductile-fracture-_2006_Journal-of-Materials-Pro.pdf": {
678
+ "sha1": "3b0bebe2e758b2002f7cb96a8e02d6210a792947",
679
+ "size": 247207,
680
+ "mtime": 1757615655
681
+ },
682
+ "sources/Advanced Energy Materials - 2018 - Cheng - Recent Development of Zeolitic Imidazolate Frameworks ZIFs Derived Porous.pdf": {
683
+ "sha1": "2019fcccf434161d9f764140c2418fb34b05bc7c",
684
+ "size": 4838242,
685
+ "mtime": 1757615654
686
+ },
687
+ "sources/A-study-on-the-computer-aided-measuring-integrat_2006_Journal-of-Materials-P.pdf": {
688
+ "sha1": "51b701a17a4c8edd86258d14ecc3304297a9e89c",
689
+ "size": 389235,
690
+ "mtime": 1757615654
691
+ },
692
+ "sources/PRINCIPLES OF ELECTRONIC MATERIALS AND DEVICE.pdf": {
693
+ "sha1": "9a9eb2e3e997d18984c99ee295f30c7049506712",
694
+ "size": 14499106,
695
+ "mtime": 1757615656
696
+ },
697
+ "sources/Application-of-the-fully-automatic-3D-hp-adaptive-cod_2006_Journal-of-Materi.pdf": {
698
+ "sha1": "0e18499cdf3f02b46404aaa343b5f71094e6100d",
699
+ "size": 337216,
700
+ "mtime": 1757615654
701
+ },
702
+ "sources/Emerging trends in porous materials for CO2 capture and conversion.pdf": {
703
+ "sha1": "e110a6fb2c24886628239e84eefa8222b214f5a0",
704
+ "size": 12441543,
705
+ "mtime": 1757615655
706
+ },
707
+ "sources/Microstructure and mechanical properties of wire + arc additively manufactured 2024 aluminum alloy components: as-deposited and post heat- treated2024 Aluminum Alloy 1.pdf": {
708
+ "sha1": "4719b8c897d2cad68d5bdb8add61c73e7efe421d",
709
+ "size": 5975919,
710
+ "mtime": 1757163868
711
+ },
712
+ "sources/Optimisation-of-the-superplastic-forming-o_2006_Journal-of-Materials-Process.pdf": {
713
+ "sha1": "b2e6b6d6bf327d467b349dd8b80258560f6b1b75",
714
+ "size": 222921,
715
+ "mtime": 1757615656
716
+ },
717
+ "sources/Effect-of-annealing-temperature-on-the-formabil_2006_Journal-of-Materials-Pr.pdf": {
718
+ "sha1": "1f0ae61553e4b91219cb488acfc882816ac5dcc6",
719
+ "size": 193281,
720
+ "mtime": 1757615655
721
+ },
722
+ "sources/Study-on-the-bulging-deformation-of-the-por_2006_Journal-of-Materials-Proces.pdf": {
723
+ "sha1": "f1f751648a88db95e8b9d3f53cb5877d4e4da8ae",
724
+ "size": 672521,
725
+ "mtime": 1757615657
726
+ },
727
+ "sources/inconel-alloy-718.pdf": {
728
+ "sha1": "f9e1da015c1b30bf4aeb9147471f7036572ccc4d",
729
+ "size": 234569,
730
+ "mtime": 1757088159
731
+ },
732
+ "sources/Joining-and-shaping-fit-of-dissimilar-mate_2006_Journal-of-Materials-Process.pdf": {
733
+ "sha1": "e31c277741b44615750bae4c847826e25e3e6913",
734
+ "size": 211529,
735
+ "mtime": 1757615656
736
+ },
737
+ "sources/ Recent advances in joining technologies of aluminum alloys_ a review.pdf": {
738
+ "sha1": "535d7d5cd3ffde4815f06a2eb01a7fee37547579",
739
+ "size": 1877360,
740
+ "mtime": 1757101686
741
+ },
742
+ "sources/Intl J of Energy Research - 2022 - Alsaman - Composite adsorbent materials for desalination and cooling applications A.pdf": {
743
+ "sha1": "8e86906a99a1613c2c276acc3d59973fea40d6aa",
744
+ "size": 4490164,
745
+ "mtime": 1757615656
746
+ },
747
+ "sources/Prevention-of-lap-formation-in-near-net-shape-isotherm_2006_Journal-of-Mater.pdf": {
748
+ "sha1": "c13c79003249f8c4318d8c6572dfae0660dd6d87",
749
+ "size": 377016,
750
+ "mtime": 1757615656
751
+ },
752
+ "sources/A-simplified-column-model-for-the-automatic-de_2006_Journal-of-Materials-Pro.pdf": {
753
+ "sha1": "839f0fd97c7570cff1d2b953992fc06ab6dc3d5f",
754
+ "size": 388756,
755
+ "mtime": 1757615654
756
+ },
757
+ "sources/Datasheet-For-Hastelloy-Alloy-C22.pdf": {
758
+ "sha1": "4eb027315b73149d61be594eb025757d5f38c748",
759
+ "size": 384175,
760
+ "mtime": 1757112010
761
+ },
762
+ "sources/monel-alloy-400.pdf": {
763
+ "sha1": "692bd00cbf7ccb66035be5b50cff2613307f4dcc",
764
+ "size": 257202,
765
+ "mtime": 1757111887
766
+ },
767
+ "sources/Towards-an-optimisation-of-forging-processes_2006_Journal-of-Materials-Proce.pdf": {
768
+ "sha1": "4c8a6e364628cde36deae710fc1dcfbee384b07a",
769
+ "size": 286076,
770
+ "mtime": 1757615657
771
+ },
772
+ "sources/Effects of non-isothermal annealing on microstructure and mechanical properties of severely deformed 2024 aluminum alloy.pdf": {
773
+ "sha1": "9cac5a77c99837ce0c528d7a047ae362690821b4",
774
+ "size": 4965253,
775
+ "mtime": 1757163869
776
+ },
777
+ "sources/c9sc03916c.pdf": {
778
+ "sha1": "93aff10496bf0a910d352186831fb777a79a27e4",
779
+ "size": 1539942,
780
+ "mtime": 1757615655
781
+ },
782
+ "sources/The Silicon Age.pdf": {
783
+ "sha1": "f43a3b6fd9138979491f33cd6d291145bedf95f1",
784
+ "size": 511160,
785
+ "mtime": 1757615657
786
+ },
787
+ "sources/Biomaterials Science.pdf": {
788
+ "sha1": "cef1f8d8784558fa6b648ac10aa085ee94ff3bd1",
789
+ "size": 25566632,
790
+ "mtime": 1757615654
791
+ },
792
+ "sources/978-981-10-7185-0.pdf": {
793
+ "sha1": "7251b1630595ab35e8588255cae11853209690d0",
794
+ "size": 8671444,
795
+ "mtime": 1757615654
796
+ },
797
+ "sources/Use-of-Taguchi-method-to-develop-a-robust-design-_2006_Journal-of-Materials-.pdf": {
798
+ "sha1": "4728537543f67f4b0962fdd153f307c5db7c8e3d",
799
+ "size": 223983,
800
+ "mtime": 1757615657
801
+ },
802
+ "sources/_Materials_Selection.pdf": {
803
+ "sha1": "7a90ac9a92cc26c997821b4f31b9a1fda3ba5e51",
804
+ "size": 16886766,
805
+ "mtime": 1757615654
806
+ },
807
+ "sources/High entropy powering green energy.pdf": {
808
+ "sha1": "5d9348987a72b254c78d51f003596e92341ff7fb",
809
+ "size": 4496451,
810
+ "mtime": 1757615655
811
+ },
812
+ "sources/Modelling-the-free-forming-of-superplastic-P_2006_Journal-of-Materials-Proce.pdf": {
813
+ "sha1": "df4337a569e183eaa1e71bab12d8939b27ccc4c6",
814
+ "size": 149078,
815
+ "mtime": 1757615656
816
+ },
817
+ "sources/A review on the role of materials science in solar cells.pdf": {
818
+ "sha1": "5ff4943156b12d99f343c5d8289d8211a9849d96",
819
+ "size": 1693132,
820
+ "mtime": 1757615654
821
+ },
822
+ "sources/Theoretical-and-laboratory-modelling-of-the-closur_2006_Journal-of-Materials.pdf": {
823
+ "sha1": "8a6e334d38ab2f8447b17654b572d1cd0827435f",
824
+ "size": 239308,
825
+ "mtime": 1757615657
826
+ },
827
+ "sources/Evaluation of the Effective Thermal Properties of Aluminum Metal Matrix Composites Reinforced by .pdf": {
828
+ "sha1": "ee37f36e3214f38a015019916c65ca186f52a99a",
829
+ "size": 1636636,
830
+ "mtime": 1757615655
831
+ },
832
+ "sources/Generalizable descriptors for automatic titanium alloys design by learning from texts via large language model1-s2.0-S1359645425005622-main.pdf": {
833
+ "sha1": "30a01d6af6ed9a1b20adde77639e4fbf07b7804c",
834
+ "size": 3104194,
835
+ "mtime": 1757103438
836
+ },
837
+ "sources/Review on glass fiber reinforced polymer composites.pdf": {
838
+ "sha1": "08945ba3686c4f4713f1c79316f16a2a1b48982a",
839
+ "size": 557171,
840
+ "mtime": 1757615656
841
+ },
842
+ "sources/Microstructure, mechanical and electrical properties of dissimilar friction stir welded 2024 aluminum alloy and copper joints.pdf": {
843
+ "sha1": "83268514aa2b1155ff7f84f253834ec69f940914",
844
+ "size": 7087665,
845
+ "mtime": 1757163867
846
+ },
847
+ "sources/Enhanced antibacterial and corrosion resistance of copper-containing 2205 duplex stainless steel against the corrosive bacterium Shewanella algae1-s2.0-S1567539424001300-main.pdf": {
848
+ "sha1": "f462569aa8ef10e2a8ce5d8c62df3e87088ecf8d",
849
+ "size": 8147303,
850
+ "mtime": 1757120263
851
+ },
852
+ "sources/Present and futurethermal interface materials for electronic devices.pdf": {
853
+ "sha1": "76df9fce4cffabdee585c0d8e1081deae614adcb",
854
+ "size": 3839156,
855
+ "mtime": 1757615656
856
+ },
857
+ "sources/A-new-method-to-accurately-obtain-wrinkling-limit-diagr_2006_Journal-of-Mate.pdf": {
858
+ "sha1": "27b56115e359b9492c60d58b3d51ab790af1baa0",
859
+ "size": 457893,
860
+ "mtime": 1757615654
861
+ },
862
+ "sources/Theoretical-and-experimental-analysis-of-the-die_2006_Journal-of-Materials-P.pdf": {
863
+ "sha1": "252853ef9b3989686005978a0f144438484c238e",
864
+ "size": 530927,
865
+ "mtime": 1757615657
866
+ },
867
+ "sources/BERMONT_2025_archivage.pdf": {
868
+ "sha1": "ae267033712110bdcf1b74aa159ffc445ee297c4",
869
+ "size": 47948690,
870
+ "mtime": 1757615654
871
+ },
872
+ "sources/High-ThroughputVirtualScreeningandValidationofaSARS-CoV\u20112.pdf": {
873
+ "sha1": "921b47b6066b9e962c67b8c2ca9ff3324415145c",
874
+ "size": 3186804,
875
+ "mtime": 1757615655
876
+ },
877
+ "sources/Prediction-of-structure-during-shaped-extrusion-and-s_2006_Journal-of-Materi.pdf": {
878
+ "sha1": "2237caf42e5cedb1b8cdf8774bb24bf47d1175bf",
879
+ "size": 656949,
880
+ "mtime": 1757615656
881
+ },
882
+ "sources/Modeling-and-simulation-of-directional-hardening_2006_Journal-of-Materials-P.pdf": {
883
+ "sha1": "f9916b71351b39135650da900544ac69c683df4e",
884
+ "size": 180876,
885
+ "mtime": 1757615656
886
+ },
887
+ "sources/Fiber-reinforced polymers.pdf": {
888
+ "sha1": "f7519f4067df09926fbff5a7197f7119869ca334",
889
+ "size": 6243902,
890
+ "mtime": 1757615655
891
+ },
892
+ "sources/An investigation of mechanical properties of aluminium based silicon carbide metal matrix composite .pdf": {
893
+ "sha1": "5e2dc63cbd320071b8853a38ff7bde9c5d4f4d6a",
894
+ "size": 1377193,
895
+ "mtime": 1757615654
896
+ },
897
+ "sources/Comparative Study of Microstructure, Physical and Mechanical Characterization of SiC-TiB2 Reinforced.pdf": {
898
+ "sha1": "f7203f7136f8bb4c5dd541a9d8d40346589fe83a",
899
+ "size": 2988826,
900
+ "mtime": 1757615655
901
+ },
902
+ "sources/Multifunctional application of carbon fiber reinforced polymer composites_ Electrical properties of.pdf": {
903
+ "sha1": "10fe4ffc67b8bb7552a8ef6aceec0c7fb9529911",
904
+ "size": 1521774,
905
+ "mtime": 1757615656
906
+ },
907
+ "sources/Sensitivity-analysis-of-quantitative-fracture-cri_2006_Journal-of-Materials-.pdf": {
908
+ "sha1": "d079574d36e357156d997d760c7e172bb0c18acd",
909
+ "size": 147029,
910
+ "mtime": 1757615657
911
+ },
912
+ "sources/Mechanical Properties of 6061 Aluminum Alloy under Cyclic Tensile Loading.pdf": {
913
+ "sha1": "455e0a281b7fa74dfb2f62ba85fc3ecd4c8f9317",
914
+ "size": 6925407,
915
+ "mtime": 1757308772
916
+ },
917
+ "sources/Polycatechols Promising materials for biomedical applications.pdf": {
918
+ "sha1": "5c9262fd224c851759ccbe21115d971d3518e1fd",
919
+ "size": 6362129,
920
+ "mtime": 1757615656
921
+ },
922
+ "sources/Hydrogen embrittlement susceptibility of additively manufactured 316L stainless steel: influence of post-processing, printing direction, temperature and pre-straining.pdf": {
923
+ "sha1": "2277563f657283e2231497ddf76ae135dca7b839",
924
+ "size": 58051280,
925
+ "mtime": 1757120260
926
+ },
927
+ "sources/Semiconductor materials for solar photovoltaic cells.pdf": {
928
+ "sha1": "a19ceae1ddedae3f96c50c48c7f8e56ba39df00f",
929
+ "size": 10834726,
930
+ "mtime": 1757615657
931
+ },
932
+ "sources/Minimizing-wastage-of-sheet-metal-for-econ_2006_Journal-of-Materials-Process.pdf": {
933
+ "sha1": "2ea1e2703732c13bd47d71eabd033986e029be99",
934
+ "size": 108487,
935
+ "mtime": 1757615656
936
+ },
937
+ "sources/Power_Electronics_Based_on_Wide-Bandgap_Semiconduc.pdf": {
938
+ "sha1": "729c315736be4118021538ad50fc6f42636023fa",
939
+ "size": 1706532,
940
+ "mtime": 1757615656
941
+ },
942
+ "sources/Analysis-of-deformation-behaviour-of-the-large-_2006_Journal-of-Materials-Pr.pdf": {
943
+ "sha1": "be5f8a646c0eb216ca054b81d6a6473aaec79da4",
944
+ "size": 175324,
945
+ "mtime": 1757615654
946
+ },
947
+ "sources/35104620.pdf": {
948
+ "sha1": "e11dbe4196d49a841d8d156ac4effd58e916aa10",
949
+ "size": 358624,
950
+ "mtime": 1757615654
951
+ },
952
+ "sources/Materials selection combined with optimal structural design- concept and some results.pdf": {
953
+ "sha1": "8174742428ff0b3208205d14e5b3e26001c667d0",
954
+ "size": 203216,
955
+ "mtime": 1757088426
956
+ },
957
+ "sources/A-study-of-size-effect-in-micro-forming-wit_2006_Journal-of-Materials-Proces.pdf": {
958
+ "sha1": "8aa9c44630abb81661469bcb97644995132ec222",
959
+ "size": 251983,
960
+ "mtime": 1757615654
961
+ },
962
+ "sources/Training high-strength aluminum alloys to withstand fatigue.pdf": {
963
+ "sha1": "e89ea2a1ce88ec709e331fc3ef10c443815ad0aa",
964
+ "size": 2964532,
965
+ "mtime": 1757308248
966
+ },
967
+ "sources/Influence-of-geometrical-conditions-on-central-bur_2006_Journal-of-Materials.pdf": {
968
+ "sha1": "deae5aeadce8850f0da4cc4596da801623c9a05e",
969
+ "size": 213349,
970
+ "mtime": 1757615655
971
+ },
972
+ "sources/Silicon Photonic Platform for Passive Waveguide Devices.pdf": {
973
+ "sha1": "2e663a246772bc690588acd7dfad270e3d1ebbc7",
974
+ "size": 1671810,
975
+ "mtime": 1757615657
976
+ },
977
+ "sources/Numerical-solution-of-bulk-metal-forming-processe_2006_Journal-of-Materials-.pdf": {
978
+ "sha1": "0894292cafa28255c432e17456ac716a4462d2fc",
979
+ "size": 345913,
980
+ "mtime": 1757615656
981
+ },
982
+ "sources/Microstructures and mechanical properties of 6061 aluminum alloy processed by accumulative roll-bonding.pdf": {
983
+ "sha1": "028d734c4d5f578ea0394fb38ff498533d8bf242",
984
+ "size": 868171,
985
+ "mtime": 1757164274
986
+ },
987
+ "sources/Vanadium-based nanostructure materials for secondary lithium battery applications.pdf": {
988
+ "sha1": "d955ee3c22d6861e75d1beb4b97147b8c1007148",
989
+ "size": 4905089,
990
+ "mtime": 1757615657
991
+ },
992
+ "sources/rahmouni-azza-diff.pdf": {
993
+ "sha1": "580154d6c47a826804a97918ebc55912abfdbd25",
994
+ "size": 12512871,
995
+ "mtime": 1757615656
996
+ },
997
+ "sources/Heterogeneous photocatalyst materials for water splitting.pdf": {
998
+ "sha1": "f0701e41eef456e9fd36b50880e1f4ce22394990",
999
+ "size": 2935226,
1000
+ "mtime": 1757615655
1001
+ },
1002
+ "sources/A compilation of experimental data on the mechanical properties and microstructural features of Ti-alloys.pdf": {
1003
+ "sha1": "93a272657bb8f236f8c02c1fdc3250888fb02171",
1004
+ "size": 1264441,
1005
+ "mtime": 1757103282
1006
+ },
1007
+ "sources/Effect of thermo-mechanical processing on quench-induced precipitates morphology and mechanical properties in high strength AA7075 aluminum alloy.pdf": {
1008
+ "sha1": "fc76f428dbece0356cbb03754ef7d1dd57fb54e9",
1009
+ "size": 6689581,
1010
+ "mtime": 1757164353
1011
+ },
1012
+ "sources/Orientation-dependent-low-cycle-fatigue-performance-of-ni_2021_Materials-Tod.pdf": {
1013
+ "sha1": "84ceaf0e79e75bd5f982156153babf74dc330d03",
1014
+ "size": 5189527,
1015
+ "mtime": 1757599214
1016
+ },
1017
+ "sources/A-new-experimental-procedure-of-evaluating-the-fr_2006_Journal-of-Materials-.pdf": {
1018
+ "sha1": "2961ad358d62e4914e658f93f2e9901e3db3d326",
1019
+ "size": 157984,
1020
+ "mtime": 1757615654
1021
+ },
1022
+ "sources/A-review-of-Corrosion-and-environmental-effects-on-electronics.pdf": {
1023
+ "sha1": "a16f4d3bfb252a88c453bb0c26a4fa788b52e688",
1024
+ "size": 1624862,
1025
+ "mtime": 1757615654
1026
+ },
1027
+ "sources/Advanced Energy Materials - 2020 - Saal - Polymers for Battery Applications Active Materials Membranes and Binders.pdf": {
1028
+ "sha1": "bd001b9c00c252afa98afdcfe9942babd26e34ab",
1029
+ "size": 4497587,
1030
+ "mtime": 1757615654
1031
+ },
1032
+ "sources/Mechanical properties of pultruded carbon fibre-reinforced polymer plates at elevated temperatures.pdf": {
1033
+ "sha1": "bc87f4144a4be2abdf6db6235f897eefa62c9681",
1034
+ "size": 1177089,
1035
+ "mtime": 1757615656
1036
+ },
1037
+ "sources/micromachines-10-00234-v3.pdf": {
1038
+ "sha1": "e9225517b330871376100be399453c6a6df821ed",
1039
+ "size": 3627444,
1040
+ "mtime": 1757615656
1041
+ },
1042
+ "sources/Recent progress of MgO-based materials in CO2 adsorption and conversion Modification methods, reaction condition, and CO2 hydrogenation.pdf": {
1043
+ "sha1": "e3a00a58192f4bffe6f30329b5534aefd2b8a96c",
1044
+ "size": 1934601,
1045
+ "mtime": 1757615656
1046
+ },
1047
+ "sources/TRIP-steel--Plastic-behaviour-modelling-and-in_2006_Journal-of-Materials-Pro.pdf": {
1048
+ "sha1": "ddc8946866879b869a1918d8d340e26e99b6b668",
1049
+ "size": 385339,
1050
+ "mtime": 1757615657
1051
+ },
1052
+ "sources/Close-loop-control-of-a-hydraulic-press-fo_2006_Journal-of-Materials-Process.pdf": {
1053
+ "sha1": "a1dbdae6b6e58c3baa55f5360f9fdd8a6e35c8ad",
1054
+ "size": 426704,
1055
+ "mtime": 1757615655
1056
+ },
1057
+ "sources/Optimising the manufacturing of a \u03b2\u2011Ti alloy produced via direct energy deposition using small dataset machine learning.pdf": {
1058
+ "sha1": "03b70518f77fb424a44140b8c574b748c00ad253",
1059
+ "size": 3072434,
1060
+ "mtime": 1757103375
1061
+ },
1062
+ "sources/Using-forming-simulations-to-improve-mechani_2006_Journal-of-Materials-Proce.pdf": {
1063
+ "sha1": "12a2d75b72dff7ba09e102a685fb4d53525d7643",
1064
+ "size": 289798,
1065
+ "mtime": 1757615657
1066
+ },
1067
+ "sources/A New Multi-Criteria Approach for Sustainable Material Selection Problem.pdf": {
1068
+ "sha1": "d085ceedfbdfaed8e58fbb0a54a8be6447165c76",
1069
+ "size": 384623,
1070
+ "mtime": 1757086131
1071
+ },
1072
+ "sources/Correlation regimes in fluctuations of fatigue crack growth.pdf": {
1073
+ "sha1": "18b9b2b613613fdeec442eabc85c020ca7f5f9d3",
1074
+ "size": 1930690,
1075
+ "mtime": 1757164352
1076
+ },
1077
+ "sources/Microstructure and mechanical properties of powder metallurgy 2024 aluminum alloy during cold rolling .pdf": {
1078
+ "sha1": "ce39af11f8e6e13e574542376f8067bc6db11b3e",
1079
+ "size": 6282028,
1080
+ "mtime": 1757163868
1081
+ },
1082
+ "sources/A-knowledge-based-engineering-design-tool_2006_Journal-of-Materials-Processi.pdf": {
1083
+ "sha1": "7267c3cb9ec50119543b7bde99f48f0982c82ee0",
1084
+ "size": 403719,
1085
+ "mtime": 1757615654
1086
+ },
1087
+ "sources/Mechanical and Corrosion Properties of AA2024 Aluminum Alloy.pdf": {
1088
+ "sha1": "3a269a9c285d20a874691d89e0ea74afad0bc401",
1089
+ "size": 8694589,
1090
+ "mtime": 1757101729
1091
+ },
1092
+ "sources/Silicon Nitride and Hydrogenated Silicon Nitride Thin Films.pdf": {
1093
+ "sha1": "c8f341a041af74f19f57a3cf9b62ccdd5a5585d9",
1094
+ "size": 2659546,
1095
+ "mtime": 1757615657
1096
+ },
1097
+ "sources/A-method-to-produce-aluminum-alloy-tube-busbars-_2006_Journal-of-Materials-P.pdf": {
1098
+ "sha1": "a9f52a7c53aae18b66bb68cc9a82fa49fe862932",
1099
+ "size": 262950,
1100
+ "mtime": 1757615654
1101
+ },
1102
+ "sources/copperbook.pdf": {
1103
+ "sha1": "ee9159eedbcf369d68f600b350222310b17f1901",
1104
+ "size": 6315905,
1105
+ "mtime": 1757615655
1106
+ },
1107
+ "sources/Recent review on failures in silicon carbide power MOSFETs .pdf": {
1108
+ "sha1": "8061381084b62e141f73c98c4728aea03fd93b5a",
1109
+ "size": 1337731,
1110
+ "mtime": 1757615656
1111
+ },
1112
+ "sources/Evolution of microstructures and mechanical properties in similar and dissimilar friction stir welding of AA5086 and AA6061.pdf": {
1113
+ "sha1": "2431f669eff515d29e44026a74aae8b72ff45508",
1114
+ "size": 2947860,
1115
+ "mtime": 1757164273
1116
+ },
1117
+ "sources/RESEARCH UPDATES ON THE ADDITIVE MANUFACTURING OF NICKEL BASED SUPERALLOYS.pdf": {
1118
+ "sha1": "84a5c39cd07959ed7aa7fb9d1a1668cbfd692ebd",
1119
+ "size": 990204,
1120
+ "mtime": 1757111617
1121
+ },
1122
+ "sources/Effect of Physical Parameters on Fatigue Life of Materials and Alloys.pdf": {
1123
+ "sha1": "65f9152f5acf87f47dfdb0f9d7855a2b5e52f182",
1124
+ "size": 6136822,
1125
+ "mtime": 1757308299
1126
+ },
1127
+ "sources/salernitano-migliaresi-2003-composite-materials-for-biomedical-applications-a-review.pdf": {
1128
+ "sha1": "1b351ac6737617fa72ae47670ff5782cf7cb213b",
1129
+ "size": 114298,
1130
+ "mtime": 1757615656
1131
+ },
1132
+ "sources/Soil Dynamics and Earthquake Engineering.pdf": {
1133
+ "sha1": "47e65544dc398a7221a6a614c68c86a380c78ef7",
1134
+ "size": 5478566,
1135
+ "mtime": 1757615657
1136
+ },
1137
+ "sources/On-the-modelling-of-the-interaction-of-materials-so_2006_Journal-of-Material.pdf": {
1138
+ "sha1": "dd07e1abedac86e59f3a69686968b0d685c23363",
1139
+ "size": 379114,
1140
+ "mtime": 1757615656
1141
+ },
1142
+ "sources/Empirical modelling of 2205 DSS flow curves using strain\u2011compensated Arrhenius rate\u2011type constitutive model.pdf": {
1143
+ "sha1": "2c34ce29afd31dff28642ff744dfd9a5432d6caa",
1144
+ "size": 4238154,
1145
+ "mtime": 1757120263
1146
+ },
1147
+ "sources/Parallel-processing-of-3D-rigid-plastic-finite-_2006_Journal-of-Materials-Pr.pdf": {
1148
+ "sha1": "2de9a6734af31459fe9ff5849b74c05b02bf5b74",
1149
+ "size": 320425,
1150
+ "mtime": 1757615656
1151
+ },
1152
+ "sources/An-approach-to-analyse-the-special-rolli_2006_Journal-of-Materials-Processin.pdf": {
1153
+ "sha1": "96ecfebb167340d83a2bc5be0072e69ebba9630b",
1154
+ "size": 221219,
1155
+ "mtime": 1757615654
1156
+ },
1157
+ "sources/Graphene oxide based materials for desalination.pdf": {
1158
+ "sha1": "5638709c01fbedb41edf61f25376f6079c9724aa",
1159
+ "size": 2124850,
1160
+ "mtime": 1757615655
1161
+ },
1162
+ "sources/WELDING AND FABRICATION OF NICKEL ALLOYS IN FGD SYSTEMSnickel.pdf": {
1163
+ "sha1": "d88338b0153685e1125658ced652ca853aa195bf",
1164
+ "size": 3135043,
1165
+ "mtime": 1757111273
1166
+ },
1167
+ "sources/Metal-forming-techniques-for-lightweight_2006_Journal-of-Materials-Processin.pdf": {
1168
+ "sha1": "720020e44e53d2b85974ee20a910af3355a00337",
1169
+ "size": 554348,
1170
+ "mtime": 1757615656
1171
+ },
1172
+ "sources/Modelling-of-oxide-scale-surface-roughness_2006_Journal-of-Materials-Process.pdf": {
1173
+ "sha1": "c68ed3e227cbb6d8b077efbf818299217404a9a2",
1174
+ "size": 282050,
1175
+ "mtime": 1757615656
1176
+ },
1177
+ "sources/Multifield-modeling-of-electromagnetic-met_2006_Journal-of-Materials-Process.pdf": {
1178
+ "sha1": "d27a689a3016eb2ace69dd9ec9e8b8e2feca5d42",
1179
+ "size": 230181,
1180
+ "mtime": 1757615656
1181
+ },
1182
+ "sources/Forming-of-axisymmetric-tubes-under-the-influence-of_2006_Journal-of-Materia.pdf": {
1183
+ "sha1": "1b0b83799dcb90c61bef80423b4abeb3399c7da9",
1184
+ "size": 173605,
1185
+ "mtime": 1757615655
1186
+ },
1187
+ "sources/Building materials in eco-energy houses from Iraq and Iran.pdf": {
1188
+ "sha1": "59894ef386a13aa6d1647b2e34c93aa6200a2285",
1189
+ "size": 2456788,
1190
+ "mtime": 1757615655
1191
+ },
1192
+ "sources/Virtual-metal-forming-including-the-ductile-damage-_2006_Journal-of-Material.pdf": {
1193
+ "sha1": "a841408ae7857d5f8305baf9b3b97f904a6797a1",
1194
+ "size": 520721,
1195
+ "mtime": 1757615657
1196
+ },
1197
+ "sources/Numerical-research-and-optimisation-of-high-press_2006_Journal-of-Materials-.pdf": {
1198
+ "sha1": "859e920f7a4800c2e9bc035952bf1897e8d8eeaf",
1199
+ "size": 329574,
1200
+ "mtime": 1757615656
1201
+ },
1202
+ "sources/Minimization-of-the-thickness-variation-in-mu_2006_Journal-of-Materials-Proc.pdf": {
1203
+ "sha1": "14b3dbbe0c6394ae941075bb66b56b64e0aaed0a",
1204
+ "size": 277712,
1205
+ "mtime": 1757615656
1206
+ },
1207
+ "sources/c6cs00930a.pdf": {
1208
+ "sha1": "86dadf3d3b0c1fe3507da8cbb46043e26ad15e1b",
1209
+ "size": 10273791,
1210
+ "mtime": 1757615655
1211
+ },
1212
+ "sources/A deep learning dataset for metal multiaxial fatigue life prediction.pdf": {
1213
+ "sha1": "1fd3233fcd5634ae98279d67614f7b2e7ad26ab5",
1214
+ "size": 4495191,
1215
+ "mtime": 1757103395
1216
+ },
1217
+ "sources/Influence-of-sequence-and-simultaneous-deformati_2006_Journal-of-Materials-P.pdf": {
1218
+ "sha1": "729d77ec9f0fa6d0a3a725551f9e58db7a5f7f22",
1219
+ "size": 435579,
1220
+ "mtime": 1757615655
1221
+ },
1222
+ "sources/Effect of heat treatments on microstructural evolution of additively manufactured and wrought 17_4PH stainless steel.pdf": {
1223
+ "sha1": "7e350eca830d550bc0d2ed093b3f1c5715e2a97e",
1224
+ "size": 10161455,
1225
+ "mtime": 1757120265
1226
+ },
1227
+ "sources/A-study-on-crack-healing-in-1045-s_2006_Journal-of-Materials-Processing-Tech.pdf": {
1228
+ "sha1": "273ef41f054674632b6f18b3ddba6f43a1452ed1",
1229
+ "size": 995602,
1230
+ "mtime": 1757615654
1231
+ },
1232
+ "sources/Adsorption of heavy metals on conventional and nanostructured materials for wastewater treatment purposes A review.pdf": {
1233
+ "sha1": "5678cda3749a972a01c728c8078f19bd7457cd92",
1234
+ "size": 432156,
1235
+ "mtime": 1757615654
1236
+ },
1237
+ "sources/Selection strategies for materials and processes.pdf": {
1238
+ "sha1": "599e8b287aa60e549a8473e35e25cce8ecad6951",
1239
+ "size": 1860528,
1240
+ "mtime": 1757085869
1241
+ },
1242
+ "sources/inconel-alloy-625.pdf": {
1243
+ "sha1": "75d1091de3080acb5f68b418f520854ed2d759fd",
1244
+ "size": 1027637,
1245
+ "mtime": 1757111857
1246
+ },
1247
+ "sources/Biodegradable polymer matrix nanocomposites for tissue engineering A review.pdf": {
1248
+ "sha1": "81a3fe3b4387d9a2a7cb23d2e87cff82b4777033",
1249
+ "size": 1613847,
1250
+ "mtime": 1757615654
1251
+ },
1252
+ "sources/Materials_Mega_Dataset_Schema_EN.csv": {
1253
+ "sha1": "978cad1de08c0752b530369d5fa781149811b106",
1254
+ "size": 908,
1255
+ "mtime": 1757615656
1256
+ },
1257
+ "sources/Additive manufacturing of 17-4PH stainless steel: Effect of heat treatment on microstructure evolution and strengthening behavio1-s2.0-S0921509324007019-main.pdf": {
1258
+ "sha1": "c847de1ed1f98f08d12f7031a5b260a760d1c8f4",
1259
+ "size": 20385607,
1260
+ "mtime": 1757120264
1261
+ },
1262
+ "sources/polymers-13-00613-v2.pdf": {
1263
+ "sha1": "d1278ac7b37e145c04b5c6f008b5ac47e458ef9b",
1264
+ "size": 8215345,
1265
+ "mtime": 1757615656
1266
+ },
1267
+ "sources/Temperature-dependent-fatigue-crack-propagation-in-a-sin_2018_Materials-Scie.pdf": {
1268
+ "sha1": "bb903e1351340c82f0b3055524d00e188dd17e4f",
1269
+ "size": 2704761,
1270
+ "mtime": 1757599214
1271
+ },
1272
+ "sources/Nano-gelcoat application of glass fiber reinforced polymer composites for marine application_ struct.pdf": {
1273
+ "sha1": "c49298b466c2948c24f5024d33ee25d70730be7a",
1274
+ "size": 19235043,
1275
+ "mtime": 1757615656
1276
+ },
1277
+ "sources/Essentials of polymer science and engineering.pdf": {
1278
+ "sha1": "a9b97a53d18b2ef2b0ced9caebadbfd2e8b8d2b9",
1279
+ "size": 61855504,
1280
+ "mtime": 1757615655
1281
+ },
1282
+ "sources/Evaluating Large Language Models for Material Selection.pdf": {
1283
+ "sha1": "e37ccae0c4fd913dc952711e9dbbef80d1a27bea",
1284
+ "size": 738640,
1285
+ "mtime": 1757082384
1286
+ },
1287
+ "sources/Electrochemical corrosion properties of Ti\u20136Al\u20134V implant alloy in the biological environment.pdf": {
1288
+ "sha1": "196b15441d8575df2e380265fe48bc8dde534c3c",
1289
+ "size": 711156,
1290
+ "mtime": 1757615655
1291
+ },
1292
+ "sources/Composites-an-introduction-1st-edition-EN.pdf": {
1293
+ "sha1": "5a296cf79510964e0223c65dd88f7ce06708bcf0",
1294
+ "size": 6947562,
1295
+ "mtime": 1757615655
1296
+ },
1297
+ "sources/Innovative Materials, Devices, and CMOS.pdf": {
1298
+ "sha1": "f6b2063c5788ace14e1f0c08098819be60aa6209",
1299
+ "size": 5764504,
1300
+ "mtime": 1757615655
1301
+ },
1302
+ "sources/WELDING OF INCONEL ALLOY 718.pdf": {
1303
+ "sha1": "c12c7786cc12603feba9ba8f686a9517cbf1ce41",
1304
+ "size": 934415,
1305
+ "mtime": 1757615657
1306
+ },
1307
+ "sources/On-the-use-of-artificial-intelligence-tools-for-f_2006_Journal-of-Materials-.pdf": {
1308
+ "sha1": "3c21311f50ca0762898021163af2feb0964872c6",
1309
+ "size": 226741,
1310
+ "mtime": 1757615656
1311
+ },
1312
+ "sources/Experiments-and-numerical-modelling-of-solid-stat_2006_Journal-of-Materials-.pdf": {
1313
+ "sha1": "894af5b0878e2caebc109a11f6918044afcb9ad8",
1314
+ "size": 351131,
1315
+ "mtime": 1757615655
1316
+ },
1317
+ "sources/Development-of-an-integrated-CAD-CAE-CAM-system-_2006_Journal-of-Materials-P.pdf": {
1318
+ "sha1": "49dd62365002eeb6637b15673906db920fd94cb4",
1319
+ "size": 741435,
1320
+ "mtime": 1757615655
1321
+ },
1322
+ "sources/Investigation-of-22MnB5-formability-in-hot_2006_Journal-of-Materials-Process.pdf": {
1323
+ "sha1": "97231f17a889e557daa26af25f934391abe9dcb8",
1324
+ "size": 440399,
1325
+ "mtime": 1757615656
1326
+ },
1327
+ "sources/Utilisation-of-engineering-workshop-equipmen_2006_Journal-of-Materials-Proce.pdf": {
1328
+ "sha1": "51e3b9c19484708ef30ccb572d2dcdebb566e1f0",
1329
+ "size": 477923,
1330
+ "mtime": 1757615657
1331
+ },
1332
+ "sources/The-research-of-forging-process-of-eccentric-p_2006_Journal-of-Materials-Pro.pdf": {
1333
+ "sha1": "493ec9b46469eb0f0fd3d2a23840ce861c6b81cc",
1334
+ "size": 413330,
1335
+ "mtime": 1757615657
1336
+ },
1337
+ "sources/Effects-of-simulation-conditions-on-evaluation-o_2006_Journal-of-Materials-P.pdf": {
1338
+ "sha1": "ed0a958edf309f693f90c994ec0a33a5fd9e2d06",
1339
+ "size": 209214,
1340
+ "mtime": 1757615655
1341
+ },
1342
+ "sources/Comparative study between semiconductor power devices based on Si, SiC and GaN used in the electrica.pdf": {
1343
+ "sha1": "38feb4182e3e7c68ca8f983c0ddc2fed92285f8a",
1344
+ "size": 918534,
1345
+ "mtime": 1757615655
1346
+ },
1347
+ "sources/Materials Science & Engineering A.pdf": {
1348
+ "sha1": "8795485eecd7822f8a4a55bb7cfef977c6b3ee67",
1349
+ "size": 25655570,
1350
+ "mtime": 1757615656
1351
+ },
1352
+ "sources/A-combined-CP-theory-and-TCD-for-predicting-fatigue-life_2018_International-.pdf": {
1353
+ "sha1": "73568ee25c4ebe046ea8085cc1dc7032444a217b",
1354
+ "size": 2890217,
1355
+ "mtime": 1757599216
1356
+ },
1357
+ "sources/EBSCO-FullText-09_11_2025.pdf": {
1358
+ "sha1": "a50d54b0c131a91db0d4cf2d595705db304cb367",
1359
+ "size": 373602,
1360
+ "mtime": 1757615655
1361
+ },
1362
+ "sources/Ceramic Materials Processes, Properties and Applic.pdf": {
1363
+ "sha1": "10a64ed6310fe7e00fd15f178e93558acb770890",
1364
+ "size": 9896366,
1365
+ "mtime": 1757615655
1366
+ },
1367
+ "sources/Deuterium permeation in Er2O3 thin film fabricated on a type 316L stainless steel substrate.pdf": {
1368
+ "sha1": "ad8f9f0bf8698499a962bf0ae4614bddaaf08959",
1369
+ "size": 81322,
1370
+ "mtime": 1757120261
1371
+ },
1372
+ "sources/Bioinspired soft robotics Material selection, actuation, and design.pdf": {
1373
+ "sha1": "5c1cc156f53a40b22c659d2370abdc1384f9ec7d",
1374
+ "size": 1870541,
1375
+ "mtime": 1757615654
1376
+ },
1377
+ "sources/Effects of alloying for steam or dry reforming of.pdf": {
1378
+ "sha1": "352885decb9b84f0316ac4d0f72e1cf6ae40e967",
1379
+ "size": 5851139,
1380
+ "mtime": 1757615655
1381
+ },
1382
+ "sources/2023UPSLM033_archivage.pdf": {
1383
+ "sha1": "4b9e8e86bf359b8c59d4ab69d0a388b37131a0ef",
1384
+ "size": 36926753,
1385
+ "mtime": 1757615654
1386
+ },
1387
+ "sources/Nickel-Based Superalloys for Advanced Turbine Engines: Chemistry, Microstructure, and Properties.pdf": {
1388
+ "sha1": "439a5fb83099227b153481ef53b0cf2b3cc8dc5d",
1389
+ "size": 7178942,
1390
+ "mtime": 1757111451
1391
+ },
1392
+ "sources/Corrosion Mechanism and Properties of 316L Stainless Steel in NaCl-KCl Molten Salt at High Temperatures .pdf": {
1393
+ "sha1": "b58c10eea1c94d6e5eb85de230110f77b45c6c8e",
1394
+ "size": 8623953,
1395
+ "mtime": 1757087631
1396
+ },
1397
+ "sources/Functional materials in desalination A review.pdf": {
1398
+ "sha1": "fa163c17b2fc443cf85cbe13720f58bea59c08db",
1399
+ "size": 6838153,
1400
+ "mtime": 1757615655
1401
+ },
1402
+ "sources/Forgeability-of-Mg-Al-Zn-magnesium-alloys-in-h_2006_Journal-of-Materials-Pro.pdf": {
1403
+ "sha1": "121a0241cbfdaadb5bed1f64b9e878e0e4020a31",
1404
+ "size": 398030,
1405
+ "mtime": 1757615655
1406
+ },
1407
+ "sources/Materials Corrosion - 2022 - Helbert - Corrosion behavior of additively manufactured AISI 316L stainless steel under.pdf": {
1408
+ "sha1": "153b5eee935630740592ba94e93b1a0974991156",
1409
+ "size": 5440602,
1410
+ "mtime": 1757087608
1411
+ },
1412
+ "sources/Vacuum.pdf": {
1413
+ "sha1": "72136d9cc76326b452cb7e720a04fa74f80c6949",
1414
+ "size": 9480388,
1415
+ "mtime": 1757615657
1416
+ },
1417
+ "sources/Materials in automotive application, state of the art and prospects.pdf": {
1418
+ "sha1": "7f7096556264612c5da08a1c49aba13c7e757021",
1419
+ "size": 23867189,
1420
+ "mtime": 1757615656
1421
+ },
1422
+ "sources/admin,+kss.v3i18.4769.pdf": {
1423
+ "sha1": "cd8eba800eac2b2bb36db40e7ac9bc4e3cd5bfc4",
1424
+ "size": 7716448,
1425
+ "mtime": 1757615654
1426
+ },
1427
+ "sources/Oxide-scale-behaviour-on-aluminium-and-steel-_2006_Journal-of-Materials-Proc.pdf": {
1428
+ "sha1": "d267da2c56327a0ad8e54031ba0d3b54d2d6b3bd",
1429
+ "size": 352096,
1430
+ "mtime": 1757615656
1431
+ },
1432
+ "sources/Nanostructured materials for photocatalysis.pdf": {
1433
+ "sha1": "4f858df51f0070f0a3556506bc479d67160078cb",
1434
+ "size": 8301487,
1435
+ "mtime": 1757615656
1436
+ },
1437
+ "sources/Microstructural Characterization and Mechanical Behavior of SiC and Kaoline Reinforced Aluminum .pdf": {
1438
+ "sha1": "62e3ba12c4a477943a42d48cac10dde0de904e1f",
1439
+ "size": 7815391,
1440
+ "mtime": 1757615656
1441
+ },
1442
+ "sources/machine learning approaches for diverse alloy systems.pdf": {
1443
+ "sha1": "0fe6b0827b0daeae87ae06e1e0a4ca91423fba97",
1444
+ "size": 3937563,
1445
+ "mtime": 1757309228
1446
+ },
1447
+ "sources/Improvement-of-tool-life-in-cold-forging-by-_2006_Journal-of-Materials-Proce.pdf": {
1448
+ "sha1": "0b7bded1e3bb54a2545f08f9759c9ee4814256b9",
1449
+ "size": 403515,
1450
+ "mtime": 1757615655
1451
+ },
1452
+ "sources/1 Unified Engineering.pdf": {
1453
+ "sha1": "55a3cb7e366d441fe64c8321c53c358c7d6409ce",
1454
+ "size": 899871,
1455
+ "mtime": 1757615654
1456
+ },
1457
+ "sources/Glasses as engineering materials A review.pdf": {
1458
+ "sha1": "e11f85887d605d7f8148c1031110e595ecc51059",
1459
+ "size": 2175059,
1460
+ "mtime": 1757615655
1461
+ },
1462
+ "sources/Energetic-analysis-of-tube-drawing-processes-wi_2006_Journal-of-Materials-Pr.pdf": {
1463
+ "sha1": "fe6886c6692fe63a9e9c513732425b1ad0f66401",
1464
+ "size": 227816,
1465
+ "mtime": 1757615655
1466
+ },
1467
+ "sources/Microstructure, mechanical and corrosion behavior of high strength AA7075 aluminium alloy friction stir weldse Effect of post weld heat treatment.pdf": {
1468
+ "sha1": "55cf16a26e170e29d25f6a613f335e85af41082b",
1469
+ "size": 2222677,
1470
+ "mtime": 1757164353
1471
+ },
1472
+ "sources/All_Materials_Complete_Dataset.xlsx": {
1473
+ "sha1": "e5d7a9765b21f976b5c77bf363c45e3d9a0f7cf5",
1474
+ "size": 7449,
1475
+ "mtime": 1757615654
1476
+ },
1477
+ "sources/Formability-of-Nb-bearing-ultra-high-strengt_2006_Journal-of-Materials-Proce.pdf": {
1478
+ "sha1": "8933c3ad82b07ac496befb99835c667e1246838f",
1479
+ "size": 533273,
1480
+ "mtime": 1757615655
1481
+ }
1482
+ }
rag_mini.py ADDED
@@ -0,0 +1,281 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """
4
+ MaterialMind RAG (verbose + env override)
5
+ - Index PDFs/MD/TXT
6
+ - Chroma persistent DB
7
+ - FastEmbed first, ST fallback
8
+ - Rebuild / Update / Ask
9
+ Env:
10
+ MATERIALMIND_DATA_DIR=/absolute/path/to/sources # optional
11
+ """
12
+
13
+ import os, re, uuid, argparse, textwrap, logging, warnings
14
+ import hashlib, json, shutil, datetime
15
+ from pathlib import Path
16
+ from typing import Iterable, List, Tuple, Dict, Any
17
+
18
+ # -------- PATHS --------
19
+ ENV_DIR = os.getenv("MATERIALMIND_DATA_DIR")
20
+ if ENV_DIR:
21
+ DATA_DIR = Path(ENV_DIR).expanduser().resolve()
22
+ BASE_DIR = DATA_DIR.parent
23
+ else:
24
+ BASE_DIR = Path(__file__).resolve().parent
25
+ DATA_DIR = (BASE_DIR / "sources").resolve()
26
+
27
+ DB_DIR = BASE_DIR / "index" / "chroma_v3"
28
+ MANIFEST_PATH = BASE_DIR / "index" / "manifest.json"
29
+
30
+ # -------- CONFIG --------
31
+ EMB_MODEL = "BAAI/bge-small-en-v1.5"
32
+ CHUNK_CHARS = 1200
33
+ CHUNK_OVERLAP = 150
34
+ DEFAULT_TOPK = 5
35
+ DEFAULT_MODEL = "qwen2.5:7b-instruct"
36
+
37
+ # Exported for app_user.py
38
+ __all__ = ["search", "DATA_DIR", "DEFAULT_TOPK", "DEFAULT_MODEL"]
39
+
40
+ logging.getLogger("pypdf").setLevel(logging.ERROR)
41
+ warnings.filterwarnings("ignore", category=UserWarning, module="pypdf")
42
+
43
+ def _lazy_imports():
44
+ global chromadb
45
+ import chromadb
46
+
47
+ # ---- Embeddings ----
48
+ _EMBED_FAST = None
49
+ _EMBED_ST = None
50
+
51
+ def init_embedder():
52
+ global _EMBED_FAST, _EMBED_ST
53
+ if _EMBED_FAST or _EMBED_ST:
54
+ return
55
+ try:
56
+ from fastembed import TextEmbedding
57
+ _EMBED_FAST = TextEmbedding(model_name=EMB_MODEL)
58
+ print(f"[EMB] FastEmbed: {EMB_MODEL}")
59
+ except Exception as e:
60
+ print(f"[WARN] FastEmbed not available ({e}); trying SentenceTransformers...")
61
+ from sentence_transformers import SentenceTransformer
62
+ _EMBED_ST = SentenceTransformer(EMB_MODEL)
63
+ print(f"[EMB] SentenceTransformers: {EMB_MODEL}")
64
+
65
+ def embed_texts(texts: List[str]) -> List[List[float]]:
66
+ init_embedder()
67
+ if _EMBED_FAST is not None:
68
+ return [v for v in _EMBED_FAST.embed(texts)]
69
+ return _EMBED_ST.encode(texts, normalize_embeddings=True).tolist()
70
+
71
+ # ---- FS helpers ----
72
+ def ensure_dirs():
73
+ DATA_DIR.mkdir(parents=True, exist_ok=True)
74
+ DB_DIR.mkdir(parents=True, exist_ok=True)
75
+ MANIFEST_PATH.parent.mkdir(parents=True, exist_ok=True)
76
+
77
+ def file_sig(path: Path):
78
+ h = hashlib.sha1()
79
+ with open(path, "rb") as f:
80
+ for chunk in iter(lambda: f.read(1<<20), b""):
81
+ h.update(chunk)
82
+ st = path.stat()
83
+ return {"sha1": h.hexdigest(), "size": st.st_size, "mtime": int(st.st_mtime)}
84
+
85
+ def load_manifest():
86
+ if MANIFEST_PATH.exists():
87
+ try: return json.loads(MANIFEST_PATH.read_text())
88
+ except Exception: return {}
89
+ return {}
90
+
91
+ def save_manifest(m): MANIFEST_PATH.write_text(json.dumps(m, indent=2))
92
+
93
+ # ---- Loaders ----
94
+ def normalize_spaces(t: str) -> str:
95
+ t = t.replace("\r", "\n")
96
+ t = re.sub(r"[ \t]+", " ", t)
97
+ t = re.sub(r"\n{3,}", "\n\n", t)
98
+ return t.strip()
99
+
100
+ def load_text_from_pdf(path: Path):
101
+ # 1) PyMuPDF
102
+ try:
103
+ import fitz
104
+ doc = fitz.open(str(path))
105
+ empty = 0
106
+ for i, p in enumerate(doc):
107
+ txt = p.get_text("text").strip()
108
+ if txt: yield normalize_spaces(txt), i+1
109
+ else: empty += 1
110
+ doc.close()
111
+ if empty == i+1:
112
+ print(f"[HINT] '{path.name}' looks scanned (no text). Try OCR.")
113
+ return
114
+ except Exception:
115
+ pass
116
+ # 2) pypdf fallback
117
+ try:
118
+ from pypdf import PdfReader
119
+ reader = PdfReader(str(path))
120
+ empty = 0
121
+ for i, p in enumerate(reader.pages):
122
+ try: raw = p.extract_text() or ""
123
+ except Exception: raw = ""
124
+ txt = normalize_spaces(raw)
125
+ if txt: yield txt, i+1
126
+ else: empty += 1
127
+ if empty == i+1:
128
+ print(f"[HINT] '{path.name}' has no extractable text. OCR it.")
129
+ except Exception as e:
130
+ print(f"[WARN] {path.name}: {e}")
131
+
132
+ def load_text_from_md_txt(path: Path) -> str:
133
+ try: raw = path.read_text(errors="ignore")
134
+ except Exception: raw = ""
135
+ return normalize_spaces(raw)
136
+
137
+ def chunk(text: str, max_chars=CHUNK_CHARS, overlap=CHUNK_OVERLAP):
138
+ n = len(text)
139
+ if n <= max_chars:
140
+ if n > 0: yield text
141
+ return
142
+ i = 0
143
+ while i < n:
144
+ j = min(i + max_chars, n)
145
+ yield text[i:j]
146
+ i = j - overlap if j < n else j
147
+
148
+ def iter_documents():
149
+ for f in DATA_DIR.rglob("*"):
150
+ if not f.is_file(): continue
151
+ ext = f.suffix.lower()
152
+ rel = f.relative_to(BASE_DIR).as_posix()
153
+ if ext == ".pdf":
154
+ any_txt = False
155
+ for page_txt, page in load_text_from_pdf(f):
156
+ any_txt = True
157
+ for c in chunk(page_txt):
158
+ yield {"id": str(uuid.uuid4()), "text": c, "meta": {"source": rel, "page": page}}
159
+ if not any_txt:
160
+ yield {"id": str(uuid.uuid4()), "text": f"[NO-TEXT] {f.name}", "meta": {"source": rel, "page": None}}
161
+ elif ext in (".md", ".txt"):
162
+ txt = load_text_from_md_txt(f)
163
+ for c in chunk(txt):
164
+ yield {"id": str(uuid.uuid4()), "text": c, "meta": {"source": rel, "page": None}}
165
+
166
+ # ---- DB ----
167
+ def get_collection(reset=False):
168
+ _lazy_imports()
169
+ client = chromadb.PersistentClient(path=str(DB_DIR))
170
+ if reset:
171
+ try: client.delete_collection("materialmind")
172
+ except Exception: pass
173
+ return client.get_or_create_collection(name="materialmind")
174
+
175
+ def add_batch(col, ids, docs, metas):
176
+ embs = embed_texts(docs)
177
+ col.add(ids=ids, documents=docs, metadatas=metas, embeddings=embs)
178
+
179
+ def build_index(batch_size=256) -> int:
180
+ ensure_dirs()
181
+ print(f"[PATH] DATA_DIR = {DATA_DIR}")
182
+ print(f"[PATH] DB_DIR = {DB_DIR}")
183
+ col = get_collection(reset=True)
184
+ ids, docs, metas, total = [], [], [], 0
185
+ print(f"[BUILD] Scanning {DATA_DIR} ...")
186
+ for doc in iter_documents():
187
+ if doc["text"].startswith("[NO-TEXT]"):
188
+ print(f"[INFO] Skipping unextractable: {doc['meta']['source']}")
189
+ continue
190
+ ids.append(doc["id"]); docs.append(doc["text"]); metas.append(doc["meta"])
191
+ if len(ids) >= batch_size:
192
+ add_batch(col, ids, docs, metas)
193
+ total += len(ids); ids, docs, metas = [], [], []
194
+ print(f"[BUILD] Added {total} chunks...")
195
+ if ids:
196
+ add_batch(col, ids, docs, metas); total += len(ids)
197
+ print(f"[BUILD] Done. Indexed {total} chunks.")
198
+ return total
199
+
200
+ def update_index():
201
+ ensure_dirs()
202
+ print(f"[PATH] DATA_DIR = {DATA_DIR}")
203
+ print(f"[PATH] DB_DIR = {DB_DIR}")
204
+ col = get_collection(reset=False)
205
+ manifest = load_manifest()
206
+ current = {f.relative_to(BASE_DIR).as_posix(): f for f in DATA_DIR.rglob("*") if f.is_file()}
207
+
208
+ # remove deleted
209
+ for src in list(manifest.keys()):
210
+ if src not in current:
211
+ col.delete(where={"source": src}); manifest.pop(src, None)
212
+ print(f"[DEL] {src}")
213
+
214
+ # add/refresh changed
215
+ for src, path in current.items():
216
+ try: sig = file_sig(path)
217
+ except Exception: continue
218
+ if manifest.get(src) == sig: continue
219
+ col.delete(where={"source": src})
220
+ added = 0
221
+ ext = path.suffix.lower()
222
+ if ext == ".pdf":
223
+ any_txt = False
224
+ for page_txt, page in load_text_from_pdf(path):
225
+ any_txt = True
226
+ for c in chunk(page_txt):
227
+ add_batch(col, [str(uuid.uuid4())], [c], [{"source": src, "page": page}])
228
+ added += 1
229
+ if not any_txt: print(f"[INFO] Skipping unextractable: {src}")
230
+ elif ext in (".md", ".txt"):
231
+ txt = load_text_from_md_txt(path)
232
+ for c in chunk(txt):
233
+ add_batch(col, [str(uuid.uuid4())], [c], [{"source": src, "page": None}])
234
+ added += 1
235
+ manifest[src] = sig
236
+ print(f"[UPD] {src} (+{added} chunks)")
237
+ save_manifest(manifest)
238
+ print("[UPDATE] Done.")
239
+
240
+ def search(query: str, k: int = DEFAULT_TOPK) -> List[Tuple[str, str]]:
241
+ col = get_collection(reset=False)
242
+ qvec = embed_texts([query])[0]
243
+ res = col.query(query_embeddings=[qvec], n_results=k, include=["documents", "metadatas"])
244
+ hits = []
245
+ for doc, meta in zip(res.get("documents", [[]])[0], res.get("metadatas", [[]])[0]):
246
+ src = meta.get("source", "unknown"); page = meta.get("page")
247
+ cite = f"{src}" + (f":p.{page}" if page else "")
248
+ hits.append((doc, cite))
249
+ return hits
250
+
251
+ # ---- CLI ----
252
+ def main():
253
+ ap = argparse.ArgumentParser(description="MaterialMind RAG")
254
+ ap.add_argument("--rebuild", action="store_true")
255
+ ap.add_argument("--update", action="store_true")
256
+ ap.add_argument("--ask", type=str)
257
+ ap.add_argument("--k", type=int, default=DEFAULT_TOPK)
258
+ args = ap.parse_args()
259
+
260
+ ensure_dirs()
261
+
262
+ if args.rebuild:
263
+ total = build_index()
264
+ print(f"[BUILD] Indexed {total} chunks from {DATA_DIR}")
265
+
266
+ if args.update:
267
+ update_index()
268
+
269
+ if args.ask:
270
+ hits = search(args.ask, k=args.k)
271
+ if not hits:
272
+ print("No results. Add PDFs to DATA_DIR and --rebuild.")
273
+ else:
274
+ for i, (text, cite) in enumerate(hits, 1):
275
+ print(f"[{i}] {cite}\n{textwrap.shorten(text.replace(chr(10),' '), 600, placeholder=' ...')}\n")
276
+
277
+ if not any([args.rebuild, args.update, args.ask]):
278
+ print(f"DATA_DIR: {DATA_DIR}\nDB_DIR: {DB_DIR}\nUsage: --rebuild | --update | --ask \"question\"")
279
+
280
+ if __name__ == "__main__":
281
+ main()
requirements.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ pdfminer.six==20231228
2
+ pandas==2.2.2
3
+ openpyxl==3.1.2
static/.DS_Store ADDED
Binary file (6.15 kB). View file
 
static/img/11.png ADDED

Git LFS Details

  • SHA256: dadc4cf28ab378304f8afda67ecb93c69c6823f5d8aca85b715caeab69aebe38
  • Pointer size: 132 Bytes
  • Size of remote file: 1.07 MB
static/img/22.jpg ADDED
static/styles.css ADDED
@@ -0,0 +1,154 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ :root{
2
+ --bg: #0b1020;
3
+ --fg: #e9eefb;
4
+ --muted: #a7b0c3;
5
+ --card: #121a2b;
6
+ --accent: #6ae6c1;
7
+ --accent-2: #7aa2ff;
8
+ --danger: #ff6b6b;
9
+ --border: #23314f;
10
+ }
11
+
12
+ *{ box-sizing: border-box; }
13
+ body{
14
+ margin: 0;
15
+ font-family: system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;
16
+ background: radial-gradient(1200px 600px at 10% -10%, #15213f 0%, #0b1020 60%, #070a14 100%);
17
+ color: var(--fg);
18
+ }
19
+ .wrap{ max-width: 1000px; margin: 0 auto; padding: 24px; }
20
+ .muted{ color: var(--muted); }
21
+
22
+ /* ---------- header ---------- */
23
+ .hero{
24
+ text-align: center;
25
+ padding: 48px 24px 16px;
26
+ background:
27
+ radial-gradient(800px 260px at 50% 0%, rgba(122,162,255,0.2), transparent 60%),
28
+ linear-gradient(180deg, rgba(13,20,40,0.6), transparent);
29
+ border-bottom: 1px solid var(--border);
30
+ }
31
+ .hero h1{
32
+ margin: 0;
33
+ font-size: 42px;
34
+ letter-spacing: 0.5px;
35
+ color: #ffffff;
36
+ text-shadow: 0 6px 30px rgba(106,230,193,0.15);
37
+ }
38
+
39
+ /* ---------- image tiles ---------- */
40
+ .bg-gallery{
41
+ display: grid;
42
+ grid-template-columns: repeat(2, minmax(220px, 1fr));
43
+ gap: 10px;
44
+ margin-bottom: 16px;
45
+ }
46
+ .bg-tile{
47
+ border-radius: 12px;
48
+ min-height: 120px;
49
+ background: #111 no-repeat center/cover;
50
+ /* Set per-tile image in HTML with: style="--bg: url('...')" */
51
+ background-image: var(--bg);
52
+ background-image: image-set(var(--bg));
53
+ box-shadow: inset 0 0 0 1px var(--border), 0 8px 24px rgba(0,0,0,0.25);
54
+ position: relative;
55
+ }
56
+ .bg-tile::after{
57
+ content:"";
58
+ position:absolute; inset:0;
59
+ background: linear-gradient(180deg, rgba(0,0,0,0) 40%, rgba(0,0,0,0.25));
60
+ border-radius:12px;
61
+ }
62
+
63
+ /* ---------- form layout ---------- */
64
+ .grid{
65
+ display: grid;
66
+ grid-template-columns: repeat(2, minmax(260px, 1fr));
67
+ gap: 14px;
68
+ margin-bottom: 10px;
69
+ }
70
+ .grid label{ display: grid; gap: 6px; font-weight: 600; color: #d9e3ff; }
71
+ input, select{
72
+ padding: 10px 12px;
73
+ background: #0e1627;
74
+ color: #e9eefb;
75
+ border: 1px solid var(--border);
76
+ border-radius: 8px;
77
+ outline: none;
78
+ }
79
+ input::placeholder{ color: #7d8bb0; }
80
+
81
+ /* ---------- priorities (replaces weights) ---------- */
82
+ .prefs{
83
+ grid-column: 1 / -1;
84
+ display: grid;
85
+ gap: 10px;
86
+ border: 1px solid var(--border);
87
+ padding: 12px;
88
+ border-radius: 10px;
89
+ background: #0c1323;
90
+ }
91
+ .prefs legend{ padding: 0 8px; color: #cfd9ff; }
92
+ .pref-row{
93
+ display: grid;
94
+ grid-template-columns: 1fr 340px;
95
+ gap: 12px;
96
+ align-items: center;
97
+ }
98
+
99
+ /* (old .weights styles kept harmlessly; unused) */
100
+ fieldset.weights{ display:none; }
101
+
102
+ /* ---------- buttons ---------- */
103
+ .btn{
104
+ display: inline-block;
105
+ padding: 12px 18px;
106
+ background: linear-gradient(135deg, var(--accent), var(--accent-2));
107
+ color: #07101f;
108
+ border: 0; border-radius: 10px;
109
+ font-weight: 700; cursor: pointer;
110
+ box-shadow: 0 8px 24px rgba(122,162,255,0.25);
111
+ }
112
+ .btn:disabled{ opacity: 0.6; cursor: not-allowed; }
113
+ .btn.ghost{
114
+ background: transparent; color: var(--fg);
115
+ border: 1px solid var(--border);
116
+ }
117
+ .actions{ grid-column: 1 / -1; display: flex; gap: 10px; }
118
+
119
+ /* ---------- results ---------- */
120
+ .tbl{ width: 100%; border-collapse: collapse; margin-top: 12px; }
121
+ .tbl th, .tbl td{
122
+ border: 1px solid var(--border);
123
+ padding: 10px; text-align: left; vertical-align: top;
124
+ }
125
+ .tbl th{ background: #0e182d; color: #cfe2ff; }
126
+
127
+ .cards{
128
+ display: grid;
129
+ grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
130
+ gap: 12px; margin: 12px 0;
131
+ }
132
+ .card{
133
+ border: 1px solid var(--border);
134
+ border-radius: 12px;
135
+ padding: 12px;
136
+ background: var(--card);
137
+ box-shadow: 0 8px 16px rgba(0,0,0,0.25);
138
+ }
139
+ .mono{
140
+ white-space: pre-wrap; word-break: break-word;
141
+ background: #0b1326;
142
+ border: 1px solid var(--border);
143
+ padding: 10px; border-radius: 8px;
144
+ color: #d7e6ff;
145
+ }
146
+
147
+ /* ---------- flash ---------- */
148
+ .flash p{
149
+ padding: 10px;
150
+ background: #2b0f14;
151
+ border: 1px solid #572131;
152
+ border-radius: 8px;
153
+ color: #ffd9df;
154
+ }
templates/base.html ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!-- base page -->
2
+ <!doctype html>
3
+ <html lang="en">
4
+ <head>
5
+ <meta charset="utf-8">
6
+ <title>MaterialMind</title>
7
+ <meta name="viewport" content="width=device-width, initial-scale=1">
8
+ <link href="{{ url_for('static', filename='styles.css') }}" rel="stylesheet">
9
+ </head>
10
+ <body>
11
+ <header class="wrap hero">
12
+ <h1>MaterialMind</h1>
13
+ </header>
14
+
15
+ <main class="wrap">
16
+ {% block content %}{% endblock %}
17
+ </main>
18
+
19
+ <footer class="wrap muted">
20
+ <p>© MaterialMind</p>
21
+ </footer>
22
+ </body>
23
+ </html>
templates/index.html ADDED
@@ -0,0 +1,129 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {% extends "base.html" %}
2
+ {% block content %}
3
+
4
+ <!-- Background tiles -->
5
+ <div class="bg-gallery">
6
+ <div class="bg-tile"
7
+ style="--bg: url('{{ url_for('static', filename='img/11.png') }}');"
8
+ aria-label="MaterialMind in action"></div>
9
+ <div class="bg-tile"
10
+ style="--bg: url('{{ url_for('static', filename='img/22.jpg') }}');"
11
+ aria-label="Industrial materials context"></div>
12
+ </div>
13
+
14
+ <h2>Find and rank materials</h2>
15
+
16
+ <form action="{{ url_for('recommend') }}" method="post" class="grid" id="mmForm">
17
+ <label>Application
18
+ <input name="environment" placeholder="seawater / sour service / high-T oxidation"
19
+ value="">
20
+ </label>
21
+ <label>Temperature
22
+ <input name="temperature" placeholder="e.g., 20–25 °C" value="">
23
+ </label>
24
+ <label>Min UTS (MPa)
25
+ <input name="min_uts" type="number" min="0" step="10" placeholder="e.g., 900" value="">
26
+ </label>
27
+ <label>Max density (g/cm³)
28
+ <input name="max_density" type="number" min="0" step="0.1" placeholder="e.g., 8.2" value="">
29
+ </label>
30
+ <label>Budget
31
+ <input name="budget" placeholder="open / low / medium / high" value="">
32
+ </label>
33
+ <label>Process
34
+ <input name="process" placeholder="wrought / casting / AM / any" value="">
35
+ </label>
36
+
37
+ <!-- PRIORITIES ONLY (no numbers displayed) -->
38
+ <fieldset class="prefs" id="prefsBox">
39
+ <legend>Priorities</legend>
40
+
41
+ <div class="pref-row">
42
+ <label>Performance</label>
43
+ <select class="prio" data-target="w_perf" name="p_perf">
44
+ <option value="very_high">Very high</option>
45
+ <option value="high" selected>High</option>
46
+ <option value="medium">Medium</option>
47
+ <option value="low">Low</option>
48
+ <option value="very_low">Very low</option>
49
+ </select>
50
+ <input type="hidden" name="w_perf" value="75">
51
+ </div>
52
+
53
+ <div class="pref-row">
54
+ <label>Stability</label>
55
+ <select class="prio" data-target="w_stab" name="p_stab">
56
+ <option value="very_high" selected>Very high</option>
57
+ <option value="high">High</option>
58
+ <option value="medium">Medium</option>
59
+ <option value="low">Low</option>
60
+ <option value="very_low">Very low</option>
61
+ </select>
62
+ <input type="hidden" name="w_stab" value="100">
63
+ </div>
64
+
65
+ <div class="pref-row">
66
+ <label>Cost</label>
67
+ <select class="prio" data-target="w_cost" name="p_cost">
68
+ <option value="not_important">Not important</option>
69
+ <option value="high" selected>High</option>
70
+ <option value="medium">Medium</option>
71
+ <option value="low">Low</option>
72
+ <option value="very_low">Very low</option>
73
+ </select>
74
+ <input type="hidden" name="w_cost" value="75">
75
+ </div>
76
+
77
+ <div class="pref-row">
78
+ <label>Availability</label>
79
+ <select class="prio" data-target="w_avail" name="p_avail">
80
+ <option value="very_high">Very high</option>
81
+ <option value="high" selected>High</option>
82
+ <option value="medium">Medium</option>
83
+ <option value="low">Low</option>
84
+ <option value="very_low">Very low</option>
85
+ </select>
86
+ <input type="hidden" name="w_avail" value="75">
87
+ </div>
88
+ </fieldset>
89
+
90
+ <label>Top-k context
91
+ <input name="k" type="number" min="3" max="10" value="{{ default_k }}">
92
+ </label>
93
+
94
+ <div class="actions">
95
+ <button class="btn" id="submitBtn" type="submit">Get ranked shortlist</button>
96
+ </div>
97
+ </form>
98
+
99
+ {% with messages = get_flashed_messages(with_categories=true) %}
100
+ {% if messages %}
101
+ <div class="flash">
102
+ {% for category, msg in messages %}
103
+ <p class="{{ category }}">{{ msg }}</p>
104
+ {% endfor %}
105
+ </div>
106
+ {% endif %}
107
+ {% endwith %}
108
+
109
+ <script>
110
+ (function () {
111
+ // Priority -> hidden numeric weight (0..100), independent
112
+ const mapStandard = { very_high: 100, high: 75, medium: 50, low: 25, very_low: 0 };
113
+ const mapCost = { not_important: 0, high: 75, medium: 50, low: 25, very_low: 10 };
114
+
115
+ function applyMapping(select){
116
+ const target = select.dataset.target;
117
+ const hidden = document.querySelector(`input[name="${target}"]`);
118
+ const isCost = (target === "w_cost");
119
+ const m = isCost ? mapCost : mapStandard;
120
+ hidden.value = m[select.value] ?? 50;
121
+ }
122
+
123
+ document.querySelectorAll('select.prio').forEach(sel => {
124
+ sel.addEventListener('change', () => applyMapping(sel));
125
+ applyMapping(sel);
126
+ });
127
+ })();
128
+ </script>
129
+ {% endblock %}
templates/results.html ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {% extends "base.html" %}
2
+ {% block content %}
3
+
4
+ <a class="btn ghost" href="{{ url_for('index') }}">← New query</a>
5
+ <h2>Shortlist ({{ environment }}, {{ temperature }})</h2>
6
+
7
+ {% if candidates and candidates|length > 0 %}
8
+ <table class="tbl">
9
+ <thead>
10
+ <tr>
11
+ <th>Rank</th>
12
+ <th>Material</th>
13
+ <th>Score</th>
14
+ <th>Key reasons</th>
15
+ </tr>
16
+ </thead>
17
+ <tbody>
18
+ {% for c in candidates %}
19
+ <tr>
20
+ <td>{{ loop.index }}</td>
21
+ <td>{{ c.name }}</td>
22
+ <td>
23
+ {% if c.score_pct is defined and c.score_pct is not none %}
24
+ {{ "%.1f"|format(c.score_pct) }}%
25
+ {% else %}
26
+
27
+ {% endif %}
28
+ </td>
29
+ <td>
30
+ <ul>
31
+ {% for r in (c.reasons or [])[:3] %}
32
+ <li>{{ r }}</li>
33
+ {% endfor %}
34
+ </ul>
35
+ </td>
36
+ </tr>
37
+ {% endfor %}
38
+ </tbody>
39
+ </table>
40
+
41
+ <h3>Material cards</h3>
42
+ <div class="cards">
43
+ {% for c in candidates %}
44
+ <section class="card">
45
+ <h4>{{ loop.index }}. {{ c.name }}</h4>
46
+
47
+ {% if c.score_pct is defined and c.score_pct is not none %}
48
+ <p><strong>Score:</strong> {{ "%.1f"|format(c.score_pct) }}%</p>
49
+ {% endif %}
50
+
51
+ {% if c.tradeoffs %}
52
+ <p><strong>Trade-offs</strong></p>
53
+ <ul>
54
+ {% for t in c.tradeoffs %}
55
+ <li>{{ t }}</li>
56
+ {% endfor %}
57
+ </ul>
58
+ {% endif %}
59
+
60
+ {% if c.citations %}
61
+ <p class="muted"><strong>Citations:</strong> {{ c.citations|join(", ") }}</p>
62
+ {% endif %}
63
+ </section>
64
+ {% endfor %}
65
+ </div>
66
+ {% else %}
67
+ <p class="muted">No structured shortlist returned. Raw model output is below.</p>
68
+ {% endif %}
69
+
70
+ <h3>Citations (source mapping)</h3>
71
+ <pre class="mono">{{ "\n".join(citations) }}</pre>
72
+
73
+ {% if raw_output %}
74
+ <details style="margin-top:12px;">
75
+ <summary>Raw model output</summary>
76
+ <pre class="mono">{{ raw_output }}</pre>
77
+ </details>
78
+ {% endif %}
79
+
80
+ {% endblock %}