Spaces:
Configuration error
Configuration error
Upload 20 files
Browse files- .gitattributes +2 -0
- README.md +188 -10
- app_user.py +291 -0
- index/.DS_Store +0 -0
- index/chroma_v3/.DS_Store +0 -0
- index/chroma_v3/22ddc0e5-4809-4117-908d-d7a3fde16dd5/data_level0.bin +3 -0
- index/chroma_v3/22ddc0e5-4809-4117-908d-d7a3fde16dd5/header.bin +3 -0
- index/chroma_v3/22ddc0e5-4809-4117-908d-d7a3fde16dd5/index_metadata.pickle +3 -0
- index/chroma_v3/22ddc0e5-4809-4117-908d-d7a3fde16dd5/length.bin +3 -0
- index/chroma_v3/22ddc0e5-4809-4117-908d-d7a3fde16dd5/link_lists.bin +3 -0
- index/chroma_v3/chroma.sqlite3 +3 -0
- index/manifest.json +1482 -0
- rag_mini.py +281 -0
- requirements.txt +3 -0
- static/.DS_Store +0 -0
- static/img/11.png +3 -0
- static/img/22.jpg +0 -0
- static/styles.css +154 -0
- templates/base.html +23 -0
- templates/index.html +129 -0
- templates/results.html +80 -0
.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 |
-
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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
|
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 %}
|