Selected changesmerged Sep 9, 2026 – Sep 15, 2026
Qwen3.8 GGUFPython · 610 + / 43 −
Introduces 21 new declarations in src/transformers/integrations/gguf/dequant.py.
Adds new core implementation rather than adjusting what was there. Tests changed with it, with code of their own.
src/transformers/integrations/gguf/dequant.py ↗ · 2 files
@@ -48,76 +88,603 @@ def dequantize(data: torch.Tensor, ggml_type: int, dtype: torch.dtype = torch.fl return values.reshape(-1)[: blocks.shape[0] * block_elems] -def _half(blocks: torch.Tensor, start: int) -> torch.Tensor:- """Read one fp16 scalar per block, as (nb, 1) float32."""- return blocks[:, start : start + 2].contiguous().view(torch.float16).float()+def _half(blocks: torch.Tensor, start: int, dtype: torch.dtype = torch.float32) -> torch.Tensor:+ """Read one fp16 scalar per block, as `(nb, 1)` of `dtype`."""+ return blocks[:, start : start + 2].view(torch.float16).to(dtype) def _k_scales(scales: torch.Tensor) -> tuple[torch.Tensor, torch.Tensor]: """Unpack the 12 bytes of 6-bit scales/mins shared by Q4_K and Q5_K (ggml's get_scale_min_k4)."""- q = scales.int()- scale = torch.cat([q[:, :4] & 63, (q[:, 8:12] & 0xF) | ((q[:, 0:4] >> 6) << 4)], dim=1)- minimum = torch.cat([q[:, 4:8] & 63, (q[:, 8:12] >> 4) | ((q[:, 4:8] >> 6) << 4)], dim=1)+ # stays in `uint8`: the six-bit fields never overflow it, and promoting first costs a copy+ scale = torch.cat([scales[:, :4] & 63, (scales[:, 8:12] & 0xF) | ((scales[:, 0:4] >> 6) << 4)], dim=1)+ minimum = torch.cat([scales[:, 4:8] & 63, (scales[:, 8:12] >> 4) | ((scales[:, 4:8] >> 6) << 4)], dim=1) return scale.float(), minimum.float() -def _interleave_nibbles(qs: torch.Tensor) -> tuple[torch.Tensor, torch.Tensor]:- """(nb, 128) nibble bytes -> low/high nibbles as (nb, 4, 32) each, still `uint8`."""- q = qs.reshape(-1, 4, 32)- return q & 0xF, q >> 4+def _shifted(data: torch.Tensor, shifts: tuple[int, ...], width: int) -> torch.Tensor:+ """`data` read as fields of `len(shifts)` per byte: (nb, n, 1, width) >> shifts -> (nb, -1, width)."""+ shift = torch.tensor(shifts, device=data.device, dtype=torch.uint8).reshape(1, 1, -1, 1)+ return (data.reshape(data.shape[0], -1, 1, width) >> shift).reshape(data.shape[0], -1, width)+++def _iq4_levels(nibbles: torch.Tensor, dtype: torch.dtype) -> torch.Tensor:
fix(turbopack): trace cyclic modules to explicit entriesRust · 224 + / 19 −
Introduces 10 new declarations in turbopack/crates/turbopack-core/src/module_graph/mod.rs.
Adds new framework internals rather than adjusting what was there. Tests changed with it, with code of their own.
turbopack/crates/turbopack-core/src/module_graph/mod.rs ↗ · 6 files
@@ -1995,12 +2052,160 @@ pub mod tests { use crate::{ asset::{Asset, AssetContent}, ident::AssetIdent,+ issue::{CollectibleIssuesExt, IssueSeverity}, module::{Module, ModuleSideEffects}, module_graph::chunk_group_info::EntryHeuristics, reference::{ModuleReference, ModuleReferences}, resolve::ModuleResolveResult, }; + #[turbo_tasks::value(shared)]+ struct ImportTraceTestResult {+ has_entry: bool,+ traces: Vec<Vec<RcStr>>,+ missing_traces: Vec<Vec<RcStr>>,+ }++ #[turbo_tasks::function(operation, root)]+ async fn import_trace_test_operation(rootless: bool) -> Result<Vc<ImportTraceTestResult>> {+ let fs = VirtualFileSystem::new_with_name(rcstr!("test"));+ let root = fs.root().await?;+ let repo = TestRepo::new(+ &root,+ [+ ("entry.js", vec!["dependency.js"]),+ ("dependency.js", vec!["entry.js"]),+ ],+ );+ let entry = Vc::upcast::<Box<dyn Module>>(MockModule::new(root.join("entry.js")?, repo))+ .to_resolved()+ .await?;+ let graph = SingleModuleGraph::new_with_entries(+ GraphEntries::resolved_cell(GraphEntries::new(
fix: Fix notebook resource loading with RequireJS and add a Jupyter extension endpointJavaScript · 481 + / 64 −
Introduces 17 new declarations in panel/_templates/autoload_panel_js.js.
Adds new framework internals rather than adjusting what was there. Tests changed with it, with code of their own.
panel/_templates/autoload_panel_js.js ↗ · 18 files
@@ -71,25 +102,99 @@ calls it with the rendered model. } window._bokeh_on_load = on_load - function on_error(e) {- const src_el = e.srcElement- console.error("failed to load " + (src_el.href || src_el.src));+ function on_error(url) {+ console.error("failed to load " + url);+ if (url.includes(JUPYTER_EXTENSION_PATH)) {+ show_jupyter_extension_error();+ }+ }++ function fallback_to_cdn(element, url, attribute, parent) {+ const index = url.indexOf(JUPYTER_EXTENSION_PATH);+ if (index === -1 || element.dataset.panelCdnFallback != null) {+ return false;+ }+ element.dataset.panelCdnFallback = "";+ element.remove();+ element[attribute] = CDN_DIST + url.slice(index + JUPYTER_EXTENSION_PATH.length);+ parent.appendChild(element);+ return true;+ }++ function inject_script_tag(url) {+ const element = document.createElement('script');+ element.onload = on_load;+ element.onerror = () => {+ if (!fallback_to_cdn(element, url, "src", document.head)) {+ on_error(url);+ }+ };
sessions: keep Codicon confetti behind conversationsTypeScript · 75 + / 63 −
Reworks 133 lines of existing logic in src/vs/sessions/services/chatBackground/browser/chatBackgroundRenderer.ts.
Changes how existing core implementation behaves. Tests changed with it, with code of their own.
src/vs/sessions/services/chatBackground/browser/chatBackgroundRenderer.ts ↗ · 3 files
@@ -338,64 +349,64 @@ export class SessionsChatBackgroundRenderer extends Disposable { return { element, icon: element }; } - private createCodiconButton(cell: string, icon: ThemeIcon): ICodiconCell {- const disposables = new DisposableStore();- const button = disposables.add(new Button(this.codiconLayer, {}));- button.element.classList.add('sessions-chat-codicon-cell');- button.element.style.width = `${codiconButtonSize}px`;- button.element.style.height = `${codiconButtonSize}px`;+ private createInteractiveCodicon(icon: ThemeIcon): ICodiconCell {+ const element = $('.sessions-chat-codicon-cell');+ element.ariaHidden = 'true'; const animationElement = $('.sessions-chat-codicon-button-animation');- const buttonIcon = renderIcon(icon);- buttonIcon.ariaHidden = 'true';- animationElement.appendChild(buttonIcon);- button.element.appendChild(animationElement);- disposables.add(button.onDidClick(event => {- if (this.confettiCell !== cell) {- return;- }+ const iconElement = renderIcon(icon);+ iconElement.ariaHidden = 'true';+ animationElement.appendChild(iconElement);+ element.appendChild(animationElement);+ return { element, icon: iconElement, animationElement };+ } - this._onDidActivateCodicon.fire(animationElement);- this.selectNextConfettiCell(cell, event.type === EventType.KEY_DOWN);- }));- return { element: button.element, icon: buttonIcon, animationElement, disposable: disposables };+ private activateConfettiCell(): void {
Add Gaussian negative log likelihood loss algorithmPython · 56 + / 0 −
Introduces 1 new declaration in machine_learning/loss_functions.py.
Adds new core implementation rather than adjusting what was there. Read the linked PR for the surrounding test context.
machine_learning/loss_functions.py ↗ · 1 files
@@ -302,6 +304,60 @@ def categorical_focal_cross_entropy( return np.mean(cfce_loss) +def gaussian_negative_log_likelihood_loss(+ y_true: np.ndarray,+ expectation_pred: np.ndarray,+ var_pred: np.ndarray,+ eps: float = 1e-6,+) -> float:+ """+ Calculate the negative log likelihood (NLL) loss between true labels and predicted+ Gaussian distributions.++ NLL = -Σ(ln(1/(σ√(2π))) - 0.5 * ((y_true - μ)/σ)^2)++ Reference: https://pytorch.org/docs/stable/generated/torch.nn.GaussianNLLLoss.html++ Parameters:+ - y_true: True labels+ - expectation_pred: Predicted expectation (μ) of the Gaussian distribution+ - var_pred: Predicted variance (σ^2) of the Gaussian distribution+ - eps: Small constant to avoid numerical instability++ Examples:+ >>> true_labels = np.array([1.0, 2.0, 3.0, 4.0, 5.0])+ >>> expectation = np.array([0.8, 2.1, 2.9, 4.2, 5.2])+ >>> variance = np.array([0.1, 0.2, 0.3, 0.4, 0.5])+ >>> loss = gaussian_negative_log_likelihood_loss(true_labels, expectation, variance)+ >>> bool(np.isclose(loss, -0.60621))+ True++ >>> true_labels = np.array([1.0, 2.0, 3.0, 4.0, 5.0])+ >>> expectation = np.array([0.8, 2.1, 2.9, 4.2, 5.2])
Fix CI Python · 32 + / 4 −
Introduces 1 new declaration in src/accelerate/utils/other.py.
Adds new core implementation rather than adjusting what was there. Tests changed with it, with code of their own.
src/accelerate/utils/other.py ↗ · 5 files
@@ -248,6 +248,29 @@ def model_has_dtensor(model: torch.nn.Module) -> bool: return any(isinstance(p, DTensor) for p in model.parameters()) +def get_model_tp_size(model: torch.nn.Module) -> Optional[int]:+ """+ Get the tensor parallel degree a `transformers` model was sharded with, or `None` if it was not sharded.++ Args:+ model (`torch.nn.Module`):+ The model to inspect.++ Returns:+ `Optional[int]`: The model's tensor parallel size.+ """+ # `transformers<5` records it on the model itself, while `transformers>=5` moved it to the+ # `DistributedConfig` held by the model config and left `model.tp_size` behind as a `None` stub.+ tp_size = getattr(model, "tp_size", None)+ if tp_size is not None:+ return tp_size++ distributed_config = getattr(getattr(model, "config", None), "distributed_config", None)+ if isinstance(distributed_config, dict):+ return distributed_config.get("tp_size")+ return getattr(distributed_config, "tp_size", None)++ def extract_model_from_parallel( model, keep_fp32_wrapper: bool = True, keep_torch_compile: bool = True, recursive: bool = False ):