@nm-lang/cli 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -2
- package/dist/index.js +4 -6
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1480,10 +1480,10 @@ classical fn main() {
|
|
|
1480
1480
|
}`}]};function decodeAnnotationString(value){return value.replace(/\\"/g,'"').replace(/\\\\/g,"\\")}function getChallengesForExample(example){return[...example.code.matchAll(challengeAnnotationPattern)].map(match=>({id:decodeAnnotationString(match[1]),...match[2]?{difficulty:match[2]}:{},exampleId:example.id,exampleTitle:example.title,exampleDescription:example.description,...example.relatedLearnTopic?{relatedLearnTopic:example.relatedLearnTopic}:{},...example.relatedDocsSection?{relatedDocsSection:example.relatedDocsSection}:{},...hiddenChecksByChallengeId[decodeAnnotationString(match[1])]?{hiddenChecks:hiddenChecksByChallengeId[decodeAnnotationString(match[1])]}:{}}))}var nmChallenges=nmExamples.flatMap(getChallengesForExample);function getNMChallenge(id){return nmChallenges.find(challenge=>challenge.id===id)}function indentHiddenChallengeCode(hiddenCode,indent){return hiddenCode.trim().split(/\r?\n/u).map(line=>line.trim()?`${indent}${line}`:line).join("\n")}function isTerminalMeasurement(node){if(node.kind!=="statement")return false;const text=stripNMSourceBlockComments(node.text);return/^(?:let\s+[\p{L}_][\p{L}\p{N}_]*(?:\s*:\s*[^=]+)?\s*=\s*)?(?:measure\s*(?:[XYZ]\s*)?|measure_all\s*)\(/u.test(text)}function findTerminalReadoutStart(children,beforeReturn){let insertionIndex=beforeReturn;for(let index=beforeReturn-1;index>=0;index-=1){const node=children[index];if(isTerminalMeasurement(node)){insertionIndex=index}else if(node.kind!=="statement"||!/^(?:show\s+state|barrier)\s*;?$/u.test(stripNMSourceBlockComments(node.text))){break}}return insertionIndex}function injectNMHiddenChallengeChecks(code,hiddenChecks){if(hiddenChecks.length===0)return code;const document=parseNMTokenFrontendDocument(code);const main=document.nodes.find(node=>node.kind==="block"&&/^fn\s+main\s*\(/u.test(stripNMSourceBlockComments(node.header)));if(main?.kind==="block"){let returnIndex2=-1;for(let index=main.children.length-1;index>=0;index-=1){const node=main.children[index];if(node.kind==="statement"&&/^return\b/u.test(stripNMSourceBlockComments(node.text))){returnIndex2=index;break}}const beforeReturn=returnIndex2<0?main.children.length:returnIndex2;const beforeMeasurement=findTerminalReadoutStart(main.children,beforeReturn);const insertionPoints=new Map;for(const check of hiddenChecks){const childIndex=check.evaluationPoint==="before-terminal-measurement"?beforeMeasurement:beforeReturn;const tokenIndex=main.children[childIndex]?.tokenStart??main.tokenEnd;const offset=document.cst.tokens[tokenIndex].range.start.offset;const checks=insertionPoints.get(offset)??[];checks.push(check);insertionPoints.set(offset,checks)}for(const[offset,checks]of[...insertionPoints].sort(([left],[right])=>right-left)){const lineStart=code.lastIndexOf("\n",offset-1)+1;const prefix2=code.slice(lineStart,offset);const onOwnLine=/^\s*$/u.test(prefix2);const indent2=onOwnLine?prefix2:" ";const injected2=checks.map(check=>indentHiddenChallengeCode(check.code,indent2)).join("\n");code=onOwnLine?`${code.slice(0,lineStart)}${injected2}
|
|
1481
1481
|
${code.slice(lineStart)}`:`${code.slice(0,offset)}
|
|
1482
1482
|
${injected2}
|
|
1483
|
-
${indent2}${code.slice(offset)}`}return code}const lines=code.split(/\r?\n/u);let returnIndex=-1;let fallbackIndex=-1;for(let index=lines.length-1;index>=0;index-=1){if(returnIndex<0&&/^\s*return\b/u.test(lines[index]))returnIndex=index;if(fallbackIndex<0&&/^\s*\}\s*$/u.test(lines[index]))fallbackIndex=index;if(returnIndex>=0&&fallbackIndex>=0)break}const insertionIndex=returnIndex>=0?returnIndex:fallbackIndex>=0?fallbackIndex:lines.length;const indent=insertionIndex<lines.length?lines[insertionIndex].match(/^\s*/u)?.[0]??" ":" ";const injected=hiddenChecks.map(check=>indentHiddenChallengeCode(check.code,indent));return[...lines.slice(0,insertionIndex),...injected,...lines.slice(insertionIndex)].join("\n")}function findHiddenCheckResult(result2,check){if(check.kind==="test"){return result2.testResults?.find(testResult=>testResult.name===check.name)}if(check.kind==="property"){return result2.propertyResults?.find(propertyResult=>propertyResult.name===check.name)}return result2.snapshotResults?.find(snapshotResult=>snapshotResult.name===check.name)}function evaluateNMHiddenChecksCore(execute,code,hiddenChecks,parseOptions={}){if(hiddenChecks.length===0)return[];const hiddenResult=execute(injectNMHiddenChallengeChecks(code,hiddenChecks),{skipChallengeEvaluation:true,parseOptions});const fallbackDiagnosticCodes=(hiddenResult.diagnostics??[]).filter(diagnostic5=>diagnostic5.severity==="error").map(diagnostic5=>diagnostic5.code);return hiddenChecks.map(check=>{const checkResult=findHiddenCheckResult(hiddenResult,check);const diagnosticCodes=checkResult?.diagnosticCodes.length?checkResult.diagnosticCodes:checkResult?[]:fallbackDiagnosticCodes.length>0?fallbackDiagnosticCodes:["NM-CHALLENGE-001"];return{kind:check.kind,name:check.name,passed:Boolean(checkResult?.passed),diagnosticCodes,...checkResult?.line!=null?{line:checkResult.line}:{}}})}function evaluateHiddenChallengeChecksCore(execute,code,challengeId,parseOptions={}){const hiddenChecks=getNMChallenge(challengeId)?.hiddenChecks??[];return evaluateNMHiddenChecksCore(execute,code,hiddenChecks,parseOptions)}function buildNMCompilerTrace(code,parsed,resources){const sourceLines4=code.split("\n").map(line=>line.replace(/\/\/.*$/,"").trim()).filter(Boolean);const imports=[...code.matchAll(/^\s*use\s+([A-Za-z_]\w*(?:\.[A-Za-z_]\w*)+)\s*;?/gm)].map(match=>match[1]);const statementKinds=parsed.program.statements.reduce((counts,statement)=>{counts[statement.kind]=(counts[statement.kind]??0)+1;return counts},{});const loweringHints=[/\bcircuit\s+[A-Za-z_]\w*/.test(code)?"circuit templates":void 0,/\badjoint\b|\binverse\b/.test(code)?"adjoint/inverse":void 0,/\bcontrolled\s+[A-Za-z_]\w*\[\d+\]/.test(code)?"controlled blocks":void 0,/\bfor\s+[A-Za-z_]\w*\s+in\s+\d+\.\.\d+/.test(code)?"indexed for loops":void 0,/\brepeat\s+\d+/.test(code)?"repeat blocks":void 0,/\bsample\s+\d+/.test(code)?"sample block":void 0,/observable\s+[A-Za-z_]\w*\s*=\s*\{/.test(code)?"observable blocks":void 0].filter(item=>Boolean(item));const diagnosticSummary=parsed.diagnostics.reduce((counts,diagnostic5)=>{counts[diagnostic5.severity]=(counts[diagnostic5.severity]??0)+1;return counts},{});return["compiler: trace enabled by @compiler(trace: true)",`compiler: source scan lines=${sourceLines4.length}`,imports.length?`compiler: std imports expanded ${imports.join(", ")}`:"compiler: std imports expanded none",loweringHints.length?`compiler: lowering passes ${loweringHints.join(", ")}`:"compiler: lowering passes none required",`compiler: module ${parsed.program.moduleName??"(missing)"}`,`compiler: statements ${Object.entries(statementKinds).map(([kind,count])=>`${kind}=${count}`).join(" ")||"none"}`,`compiler: qreg qubits=${parsed.numQubits}`,`compiler: resources depth=${resources.depth} gates=${resources.gates} twoQubit=${resources.twoQubitGates} measurements=${resources.measurements} metrics=${resources.metrics} observes=${resources.observations}`,`compiler: diagnostics errors=${diagnosticSummary.error??0} warnings=${diagnosticSummary.warning??0} info=${diagnosticSummary.info??0}`,parsed.program.target?`compiler: target analyzer queued for ${parsed.program.target}`:"compiler: target analyzer skipped (no @target)"]}var NM_FEATURE_ENCODING_MAX_FEATURES=8;var nmFeatureEncodingDiagnosticCodes={firstUse:"NM-QML-201",overflow:"NM-QML-202",zeroVector:"NM-QML-203",input:"NM-QML-204",invariant:"NM-QML-205"};function amplitudeEncode(state,indices,features){const capacity=2**indices.length;if(features.length>capacity)return{code:"NM-QML-202",error:`Feature count ${features.length} exceeds amplitude capacity ${capacity}.`};const norm=Math.sqrt(features.reduce((sum,value)=>sum+value*value,0));if(norm===0)return{code:"NM-QML-203",error:"Amplitude encoding cannot normalize an all-zero feature vector."};const amplitudes=state.amplitudes.map(()=>complex(0));state.amplitudes.forEach((source,basis)=>{if(indices.some(qubit3=>(basis>>qubit3&1)===1))return;features.forEach((feature,encodedBasis)=>{const target2=indices.reduce((value,qubit3,bit)=>value|(encodedBasis>>bit&1)<<qubit3,basis);amplitudes[target2]=complexAdd(amplitudes[target2],complexMul(source,complex(feature/norm)))})});return{state:{...state,amplitudes}}}function encodeNMFeatures(state,indices,features,method){if(!state||!Number.isInteger(state.numQubits)||state.numQubits<1||state.numQubits>NM_FEATURE_ENCODING_MAX_FEATURES||state.amplitudes.length!==2**state.numQubits||state.amplitudes.some(amplitude=>!Number.isFinite(amplitude.re)||!Number.isFinite(amplitude.im))){return{code:nmFeatureEncodingDiagnosticCodes.input,error:"Encoding requires a finite, shape-valid state of 1-8 qubits."}}const norm=state.amplitudes.reduce((sum,amplitude)=>sum+amplitude.re**2+amplitude.im**2,0);if(!Number.isFinite(norm)||Math.abs(norm-1)>1e-6)return{code:nmFeatureEncodingDiagnosticCodes.input,error:"Encoding input state must be normalized."};if(indices.length<1||indices.length>NM_FEATURE_ENCODING_MAX_FEATURES||new Set(indices).size!==indices.length||indices.some(index=>!Number.isInteger(index)||index<0||index>=state.numQubits)){return{code:nmFeatureEncodingDiagnosticCodes.input,error:"Encoding qubit indices must be unique, in range, and non-empty."}}if(features.length<1||features.length>NM_FEATURE_ENCODING_MAX_FEATURES||features.some(feature=>!Number.isFinite(feature))){return{code:nmFeatureEncodingDiagnosticCodes.input,error:"Encoding features must contain 1-8 finite numbers."}}if(!["angle","reupload","amplitude","iqp"].includes(method)){return{code:nmFeatureEncodingDiagnosticCodes.input,error:"Unknown feature encoding method."}}if(method==="amplitude")return checkedEncodingState(amplitudeEncode(state,indices,features));if(method==="iqp"&&features.length>indices.length){return{code:"NM-QML-202",error:`Feature count ${features.length} exceeds IQP register size ${indices.length}.`}}let encoded=state;if(method==="iqp"){indices.forEach(target2=>{encoded=applySingleQubitGate(encoded,GATES.H,target2)});features.forEach((feature,index)=>{encoded=applyRz(encoded,indices[index],feature)});for(let left=0;left<features.length;left+=1)for(let right=left+1;right<features.length;right+=1){const gate={kind:"gate",gate:"RZZ",targets:[indices[left],indices[right]].map(resolvedIndex=>({register:"encode",resolvedIndex})),theta:features[left]*features[right],line:0};encoded=applyGateToState(encoded,gate)}return checkedEncodingState({state:encoded})}features.forEach((feature,index)=>{const target2=indices[index%indices.length];encoded=applyRy(encoded,target2,feature);if(method==="reupload")encoded=applyRz(encoded,target2,feature/2)});return checkedEncodingState({state:encoded})}function checkedEncodingState(result2){if("error"in result2)return result2;return result2.state.amplitudes.some(amplitude=>!Number.isFinite(amplitude.re)||!Number.isFinite(amplitude.im))?{code:nmFeatureEncodingDiagnosticCodes.invariant,error:"Feature encoding produced a non-finite amplitude."}:result2}function executeNMEncoding(parsed,state,statement){const datasetId=parsed.program.datasets?.[0]?.id;const requestedSplit=parsed.program.datasets?.[0]?.split;const split=requestedSplit==="validation"||requestedSplit==="test"?requestedSplit:"train";const dataset=datasetId?getNMEmbeddedDataset(datasetId):void 0;const row=datasetId?getNMEmbeddedDatasetSplitRow(datasetId,statement.row,split):void 0;const entries=Object.entries(parsed.qubitMap).filter(([name2])=>name2.startsWith(`${statement.register}[`));const indices=entries.sort(([a],[b])=>Number(a.match(/\d+/)?.[0])-Number(b.match(/\d+/)?.[0])).map(([,index])=>index);if(!datasetId||!dataset||!row||indices.length===0)return{diagnostic:createDiagnostic({code:"NM-RUNTIME-023",severity:"error",message:`Unable to encode dataset row for ${datasetId??"(missing dataset)"}.`,hint:'Use @dataset("xor_2d", split: "train") before encode.',translationKey:"datasetEncodingFailed",translationValues:{dataset:datasetId??"(missing dataset)"},line:statement.line})};const priorUse=parsed.program.statements.some(item=>item.line<statement.line&&(item.kind==="gate"&&item.targets.some(target2=>target2.register===statement.register)||item.kind==="encode"&&item.register===statement.register));if(statement.method==="amplitude"&&priorUse)return{diagnostic:createDiagnostic({code:"NM-QML-201",severity:"error",message:"Amplitude encoding must be the first operation on the register.",hint:"Move amplitude encoding before gates and other encodings on this register.",translationKey:"amplitudeEncodingNotFirst",line:statement.line})};const encoded=encodeNMFeatures(state,indices,row.features,statement.method);if("error"in encoded)return{diagnostic:createDiagnostic({code:encoded.code,severity:"error",message:encoded.error,hint:encoded.code==="NM-QML-202"?"Use a larger register or fewer features.":encoded.code==="NM-QML-203"?"Provide at least one non-zero feature.":"Use finite, normalized, bounded encoding inputs.",...encoded.code==="NM-QML-202"?{translationKey:"encodingFeatureOverflow"}:encoded.code==="NM-QML-203"?{translationKey:"zeroAmplitudeVector"}:{},line:statement.line})};const values2=row.features.map(value=>value.toFixed(3)).join(", ");return{state:encoded.state,output:`Encoded ${dataset.id}[${statement.row}] into ${statement.register} with ${statement.method} (${values2})`,trace:`runtime:encode ${statement.method} features=[${row.features.join(",")}]`}}var NM_PARAMETER_GROUPS_VERSION="0.1.0-experimental";var nmParameterGroupLimits=Object.freeze({sourceBytes:131072,groups:16,members:64});var nmParameterGroupDiagnosticCodes={disabled:"NM-PGR-001",syntax:"NM-PGR-002",scope:"NM-PGR-003",duplicate:"NM-PGR-004",unknown:"NM-PGR-005",bound:"NM-PGR-006",collision:"NM-PGR-007",unsupportedCarrier:"NM-PGR-008"};var messages4={disabled:["Parameter groups require experimental.parameterGroups=true.","Parametre gruplar\u0131 i\xE7in experimental.parameterGroups=true gereklidir."],syntax:["Use paramgroup name = [parameter, vector[index]]; with at least one member.","En az bir \xFCyeyle paramgroup ad = [parametre, vektor[indis]]; bi\xE7imini kullan\u0131n."],scope:["Parameter groups may only be declared at module scope.","Parametre gruplar\u0131 yaln\u0131z mod\xFCl kapsam\u0131nda bildirilebilir."],duplicate:["A group name or resolved parameter member is repeated.","Grup ad\u0131 veya \xE7\xF6z\xFCmlenmi\u015F parametre \xFCyesi tekrarlan\u0131yor."],unknown:["Group members must name declared entry-program trainable parameters.","Grup \xFCyeleri giri\u015F program\u0131nda bildirilen e\u011Fitilebilir parametreleri se\xE7melidir."],bound:["Parameter group source, count, member or vector-index limit exceeded.","Parametre grubu kaynak, say\u0131, \xFCye veya vekt\xF6r indisi s\u0131n\u0131r\u0131 a\u015F\u0131ld\u0131."],collision:["A parameter group name conflicts with another declaration or reserved name.","Parametre grubu ad\u0131 ba\u015Fka bir bildirimle veya ayr\u0131lm\u0131\u015F adla \xE7ak\u0131\u015F\u0131yor."],unsupportedCarrier:["This source carrier does not yet preserve parameter groups.","Bu kaynak ta\u015F\u0131y\u0131c\u0131s\u0131 hen\xFCz parametre gruplar\u0131n\u0131 korumuyor."]};function parameterGroupDiagnostic(issue11,range2){return{code:nmParameterGroupDiagnosticCodes[issue11],severity:"error",message:messages4[issue11][0],translationKey:`parameterGroups.${issue11}`,...range2?{line:range2.start.line+1,column:range2.start.column+1}:{}}}var identifier4=token=>token?.kind==="identifier"&&/^[A-Za-z_]\w*$/u.test(token.text);var span2=(first,last)=>({start:{...first.range.start},end:{...last.range.end}});function readNMParameterGroupSource(source,enabled){const result2={source,originalSource:source,declarations:[],parameters:[],names:new Set,diagnostics:[],imports:[]};if(!/\bparamgroup\b/u.test(source))return result2;const cst=parseNMSourceCST(source),tokens=cst.tokens.filter(token=>!token.trivia);const declarations=[];let depth3=0,functionName,nextFunction;const error=(issue11,token)=>result2.diagnostics.push(parameterGroupDiagnostic(issue11,token.range));for(let i=0;i<tokens.length;i++){const token=tokens[i],next=tokens[i+1];if(!depth3&&token.text==="use"&&next?.text==="workspace"&&tokens[i+2]?.text==="."&&identifier4(tokens[i+3])){const alias=tokens[i+4]?.text==="as"&&identifier4(tokens[i+5])?tokens[i+5].text:void 0;result2.imports.push({name:tokens[i+3].text,...alias?{alias}:{}});if(alias)result2.names.add(alias)}if(!depth3&&["fn","record","enum","const","param","circuit","observable"].includes(token.text)&&next?.kind==="identifier")result2.names.add(next.text);if(!depth3&&token.text==="fn")nextFunction=next?.text;if(token.text==="{"){depth3++;if(depth3===1){functionName=nextFunction;nextFunction=void 0}continue}if(token.text==="}"){depth3--;if(!depth3)functionName=void 0;continue}if((token.text==="param"||token.text==="parametre")&&identifier4(next)&&(!depth3||depth3===1&&functionName==="main")){const vector=tokens[i+2]?.text===":"&&tokens[i+3]?.text==="Angle"&&tokens[i+4]?.text==="[";const literal=vector&&tokens[i+5]?.kind==="number"&&/^\d+$/u.test(tokens[i+5].text)&&tokens[i+6]?.text==="]";result2.parameters.push({name:next.text,vector,...literal?{literalSize:Number(tokens[i+5].text)}:{},range:span2(token,next)});result2.names.add(next.text)}if(token.text!=="paramgroup"||next?.kind!=="identifier"||["fn","let","const","param","."].includes(tokens[i-1]?.text))continue;if(source.length>nmParameterGroupLimits.sourceBytes||new TextEncoder().encode(source).length>nmParameterGroupLimits.sourceBytes){error("bound",token);return result2}if(depth3!==0){error("scope",token);continue}if(!enabled){error("disabled",token);continue}let end=i+1;while(end<tokens.length&&![";","{","}"].includes(tokens[end].text))end++;if(tokens[end]?.text!==";"||!identifier4(next)||tokens[i+2]?.text!=="="||tokens[i+3]?.text!=="["||tokens[end-1]?.text!=="]"){error("syntax",token);continue}const members=[];let cursor=i+4,invalid5=false;while(cursor<end-1){const name2=tokens[cursor++];if(!identifier4(name2)){invalid5=true;break}let index,last=name2;if(tokens[cursor]?.text==="["){const value=tokens[cursor+1];if(value?.kind!=="number"||!/^\d+$/u.test(value.text)||tokens[cursor+2]?.text!=="]"||!Number.isSafeInteger(Number(value.text))){invalid5=true;break}index=Number(value.text);last=tokens[cursor+2];cursor+=3}members.push({name:name2.text,...index!==void 0?{index}:{},range:span2(name2,last)});if(cursor===end-1)break;if(tokens[cursor++]?.text!==","||cursor===end-1){invalid5=true;break}}if(invalid5||!members.length||cursor!==end-1)error("syntax",token);else if(members.length>nmParameterGroupLimits.members||result2.declarations.length>=nmParameterGroupLimits.groups)error("bound",token);else{result2.declarations.push({name:next.text,range:span2(token,tokens[end]),nameRange:next.range,members});declarations.push({start:token.range.start.offset,end:tokens[end].range.end.offset})}i=end}if(result2.declarations.length&&cst.issues.length)result2.diagnostics.push(parameterGroupDiagnostic("syntax",cst.issues[0].range));for(const declaration of declarations.reverse())result2.source=result2.source.slice(0,declaration.start)+result2.source.slice(declaration.start,declaration.end).replace(/[^\r\n]/g," ")+result2.source.slice(declaration.end);return result2}function attachNMParameterGroups(read5,result2,options){if(!read5.declarations.length||result2.diagnostics.some(item=>item.severity==="error"))return result2;const importedModules=new Set(read5.imports.filter(item=>!item.alias).map(item=>item.name));const provenance=result2.program.classicalFunctions;for(const symbol of provenance?.workspace?.symbols??[]){if(importedModules.has(symbol.module)&&symbol.visibility==="public")read5.names.add(symbol.name)}if(provenance?.nominalWorkspace){const snapshot2=provenance.nominalWorkspace;const graph=createNMNominalWorkspace(snapshot2.entrySource,snapshot2.sources,{enabled:true,moduleVisibility:options.experimental?.moduleVisibility});for(const imported of graph.modules)if(importedModules.has(imported.name)){for(const symbol of imported.symbols)if(symbol.visibility==="public")read5.names.add(symbol.name)}}const groups=[],groupNames=new Set;for(const declaration of read5.declarations){if(groupNames.has(declaration.name)){result2.diagnostics.push(parameterGroupDiagnostic("duplicate",declaration.nameRange));continue}groupNames.add(declaration.name);if(read5.names.has(declaration.name)||["main","PI"].includes(declaration.name)||declaration.name.startsWith("__nm_")){result2.diagnostics.push(parameterGroupDiagnostic("collision",declaration.nameRange));continue}const members=[],selected=new Set;for(const member of declaration.members){const candidates=read5.parameters.filter(parameter2=>parameter2.name===member.name);if(candidates.length!==1){result2.diagnostics.push(parameterGroupDiagnostic("unknown",member.range));continue}const parameter=candidates[0];const actual=result2.program.statements.filter(statement=>statement.kind==="param"&&statement.line===parameter.range.start.line+1);const foldedSize=result2.program.comptimeConstants?.uses.find(use=>use.position==="vector-param-size"&&use.line===parameter.range.start.line+1)?.foldedValue;const size=parameter.literalSize??foldedSize;const names=parameter.vector?Number.isSafeInteger(size)&&size>=1&&size<=NM_COMPTIME_MAX_VECTOR_PARAMETERS?Array.from({length:size},(_,index)=>`${member.name}_${index}`):[]:actual.some(statement=>statement.kind==="param"&&statement.name===member.name)?[member.name]:[];if(!names.length||names.some(name2=>!Object.prototype.hasOwnProperty.call(result2.params,name2)||!actual.some(statement=>statement.kind==="param"&&statement.name===name2))){result2.diagnostics.push(parameterGroupDiagnostic("unknown",member.range));continue}if(parameter.vector&&names.some(name2=>read5.parameters.some(other=>other.name===name2))){result2.diagnostics.push(parameterGroupDiagnostic("collision",member.range));continue}if(member.index!==void 0&&(!parameter.vector||member.index>=names.length)){result2.diagnostics.push(parameterGroupDiagnostic("bound",member.range));continue}const chosen=member.index===void 0?names:[names[member.index]];for(const name2 of chosen){if(selected.has(name2)){result2.diagnostics.push(parameterGroupDiagnostic("duplicate",member.range));continue}if(members.length>=nmParameterGroupLimits.members){result2.diagnostics.push(parameterGroupDiagnostic("bound",member.range));break}selected.add(name2);members.push({name:member.name,...parameter.vector?{index:Number(name2.slice(member.name.length+1))}:{},parameterName:name2,referenceRange:member.range,declarationRange:parameter.range})}}groups.push({name:declaration.name,range:declaration.range,nameRange:declaration.nameRange,members})}if(!result2.diagnostics.some(item=>item.severity==="error"))result2.program.parameterGroups={experimental:true,contractVersion:NM_PARAMETER_GROUPS_VERSION,declarations:groups,originalSource:read5.originalSource,parseOptions:{experimental:{...options.experimental},...options.workspaceModules?{workspaceModules:{...options.workspaceModules}}:{}}};return result2}function validateUnsupportedSyntax(line,diagnostics){const operation=line.text.match(/^([A-Za-z_]\w*)\b/u)?.[1];const measurement=/^(?:let\s+[\p{L}_][\p{L}\p{N}_]*(?:\s*:\s*[^=]+)?\s*=\s*)?measure(?:[XYZ]|_all)?\b/u.test(line.text);const knownOperation=measurement||playgroundRuntimeLimits.supportedGates.includes(operation??"");if(knownOperation){if(!diagnostics.some(item=>item.severity==="error"&&item.line===line.line)){diagnostics.push(createDiagnostic({code:"NM-PARSE-008",severity:"error",message:`Invalid operation arguments: ${line.text}`,hint:"Use the operation's required operands, for example: H(q[0]); CNOT(q[0], q[1]); Rx(q[0], PI / 2); measure(q[0]);",translationKey:"invalidOperationArguments",translationValues:{statement:line.text},line:line.line}))}return}if(/^let\b/u.test(line.text)){if(!diagnostics.some(item=>item.severity==="error"&&item.line===line.line)){diagnostics.push(createDiagnostic({code:"NM-PARSE-068",severity:"error",message:`Unsupported local declaration: ${line.text}`,hint:"Use a supported initializer and an explicit type for classical or record values, for example: let value: Float = 0.3; Enable the required experimental features.",translationKey:"unsupportedLocalDeclaration",translationValues:{declaration:line.text},line:line.line}))}return}if(/^circuit\s+[A-Za-z_]\w*\s*\([^)]*\)\s*\{.+\}\s*;?$/u.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-060",severity:"error",message:"Inline circuit declarations are not part of the executable N/M block grammar.",hint:"Put the opening brace at the end of the declaration line, the circuit body on following lines, and the closing brace on its own line.",line:line.line}));return}if(/^(quantum|classical|hybrid)\s+(fn|module)\b/.test(line.text)||/^@(?!target\s*\(|constraints\s*\(|compiler\s*\(|optimize\s*\(|estimate\s*\(|goal\s*\(|outcome\s*\(|rubric\s*\(|misconception\s*\(|quiz\s*\(|lab\s*\(|challenge\s*\(|dataset\s*\(|checkpoint\s*\(|hint\s*\(|concept\s*\(|level\s*\(|prereq\s*\(|explain\s*\(|noise\s*\(|mitigation\s*\(|seed\s*\(|shots\s*\()/.test(line.text)||/\b(while|import|logical)\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-003",severity:"error",message:"This syntax is part of the N/M spec preview and is not executable in the playground runtime.",hint:"Use the supported subset: module, fn main, qreg, supported gates, measure, and return.",translationKey:"specPreviewSyntax",line:line.line}))}}function readNMMainAssignment(tokens){if(tokens[0]?.kind!=="identifier")return{candidate:false};let cursor=1,index;if(tokens[cursor]?.text==="["){const begin=++cursor;let depth3=1;while(cursor<tokens.length&&depth3){if(tokens[cursor].text==="[")depth3++;if(tokens[cursor].text==="]")depth3--;if(depth3)cursor++}if(depth3)return{candidate:true};index=tokens.slice(begin,cursor++)}const operator=tokens[cursor]?.text;if(!index&&!["=","+=","-=","*=","/=","%="].includes(operator))return{candidate:false};if(operator!=="="||index?.length===0)return{candidate:true};const end=tokens.at(-1)?.text===";"?tokens.length-1:tokens.length;const value=tokens.slice(cursor+1,end);return value.length?{candidate:true,name:tokens[0].text,index,value}:{candidate:true}}function parseNMMainMutation(line,enabled){const mutable=/^let\s+mut\b/u.test(line.text);if(!mutable&&!/^[\p{L}_][\p{L}\p{N}_]*\s*(?:\[|[+\-*/%]?=(?!=))/u.test(line.text))return{candidate:false,diagnostics:[]};const assignment=readNMMainAssignment(parseNMSourceCST(line.text).tokens.filter(token=>!token.trivia));if(!mutable&&!assignment.candidate)return{candidate:false,diagnostics:[]};const error=(code,message)=>({candidate:true,diagnostics:[createDiagnostic({code,severity:"error",message,line:line.line})]});if(!enabled)return error("NM-PARSE-062","Main mutable values require classicalFunctions and typedClassicalValues experimental features.");if(mutable){const name2=/^let\s+mut\s+([\p{L}_][\p{L}\p{N}_]*)/u.exec(line.text)?.[1];if(!name2)return error("NM-PARSE-063","A mutable main binding requires a name and explicit numeric type.");if(isNMClassicalFunctionReservedName(name2))return error("NM-CFN-004",`Reserved mutable binding name: ${name2}.`);const parsed=parseNMClassicalDeclaration(line.text.replace(/^let\s+mut\s+/u,"let "),line.line,true);if(!parsed.statement||!isNMMutableClassicalType(parsed.statement.valueType))return error("NM-PARSE-063","A mutable main binding requires Int, Float or a fixed Int/Float array and initializer.");return{...parsed,candidate:true,...parsed.statement?{statement:{...parsed.statement,mutable:true}}:{}}}if(!assignment.name||!assignment.value)return error("NM-PARSE-063","Assignment requires NAME or NAME[INDEX] = EXPRESSION; compound assignment is not supported.");if(isNMClassicalFunctionReservedName(assignment.name))return error("NM-CFN-004",`Reserved assignment binding name: ${assignment.name}.`);const expression=parseNMTypedClassicalExpressionSource(assignment.value.map(token=>token.text).join(" "));const indexed=assignment.index&&parseNMTypedClassicalExpressionSource(`${assignment.name}[${assignment.index.map(token=>token.text).join(" ")}]`);if(!expression||assignment.index&&indexed?.kind!=="index")return error("NM-PARSE-063","Invalid assignment expression or index.");return{candidate:true,diagnostics:[],statement:{kind:"classicalAssign",name:assignment.name,...indexed?.kind==="index"?{index:indexed.index}:{},expression,line:line.line}}}function parseNMMainForHeader(line,diagnostics){const match=/^for\s+([\p{L}_][\p{L}\p{N}_]*)\s+in\s+(\d+)\s*\.\.\s*(\d+)\s*\{$/u.exec(line.text);if(!match){diagnostics.push(createDiagnostic({code:"NM-PARSE-008",severity:"error",message:"A bounded main loop requires for i in START..END with literal integer bounds.",line:line.line}));return void 0}if(isNMClassicalFunctionReservedName(match[1])){diagnostics.push(createDiagnostic({code:"NM-CFN-004",severity:"error",message:`Reserved loop index name: ${match[1]}.`,line:line.line}));return void 0}const start=Number(match[2]),end=Number(match[3]);if(!Number.isSafeInteger(start)||!Number.isSafeInteger(end)||start<0||start>end||end>256){diagnostics.push(createDiagnostic({code:"NM-CFN-003",severity:"error",message:"Main loop bounds must satisfy 0 <= START <= END <= 256; END is exclusive.",line:line.line}));return void 0}return{index:match[1],start,end}}function isNMMainResultMatch(lines,start,visible=[]){if(!/^match\b/u.test(lines[start]?.text??""))return false;if(/^(?:ok\b|error\b)/u.test(lines[start+1]?.text??""))return true;const selector=/^match\s*\(\s*([\p{L}_][\p{L}\p{N}_]*)\s*\)/u.exec(lines[start].text)?.[1];return Boolean(selector&&(selector.startsWith("__nm_cfn_result_")||visible.some(statement=>statement.kind==="classicalDecl"&&statement.name===selector&&statement.valueType.kind==="result")))}function parseNMMainResultMatch(lines,start,options,nested,depth3){const line=lines[start];const report=(at,message)=>options.diagnostics.push(createDiagnostic({code:"NM-PARSE-067",severity:"error",message,line:at.line}));const closeBlock=open=>{let level=1;for(let index=open+1;index<lines.length;index++){if(closesNMSourceBlock(lines[index])&&--level===0)return index;if(lines[index].text.trimEnd().endsWith("{"))level++}report(lines[open],"Result match block is missing its closing brace.");return lines.length-1};const match=/^match\s*\((.*)\)\s*\{$/u.exec(line.text);const selector=match&&parseNMTypedClassicalExpressionSource(match[1]);if(!selector||depth3>=32){report(line,"Invalid or excessively nested Result match.");return{end:closeBlock(start)}}const end=closeBlock(start);let cursor=start+1;let okBinding,okBody,errorBody;while(cursor<end){const arm=lines[cursor];const ok=/^ok\s*\(\s*([\p{L}_][\p{L}\p{N}_]*)\s*\)\s*=>\s*\{$/u.exec(arm.text);const error=/^error\s*=>\s*\{$/u.test(arm.text);if(!ok&&!error){report(arm,"Result match requires ok(value) and error arms.");return{end}}if(ok?okBody!==void 0:errorBody!==void 0){report(arm,"Result match arms must occur exactly once.");return{end}}const armEnd=closeBlock(cursor);if(armEnd>=end){report(arm,"Invalid Result match arm boundary.");return{end}}const body=[];cursor++;while(cursor<armEnd){const current=lines[cursor];if(/^compute\s*\{$/u.test(current.text)&&options.parseComputeApply){const pair=options.parseComputeApply(cursor);if(pair.statement)body.push(pair.statement);cursor=pair.end+1;continue}if(/^(?:if|for)\b/u.test(current.text)||isNMMainResultMatch(lines,cursor,[...options.visible,...body])){const child=nested(lines,cursor,{...options,visible:[...options.visible,...body],numericNames:ok?[...options.numericNames,ok[1]]:options.numericNames},depth3+1);if(child.statement)body.push(child.statement);cursor=child.end+1}else if(current.text.trimEnd().endsWith("{")){report(current,"Unsupported block inside Result match.");cursor=closeBlock(cursor)+1}else{const before=options.diagnostics.length;const statement=options.parseStatement(current);if(statement)body.push(statement);else if(before===options.diagnostics.length)report(current,"Unsupported statement inside Result match.");cursor++}}if(ok){okBinding=ok[1];okBody=body}else errorBody=body;cursor=armEnd+1}if(!okBinding||!okBody||!errorBody){report(line,"Result match must cover both ok and error.");return{end}}return{statement:{kind:"classicalMatchResult",selector,okBinding,okBody,errorBody,line:line.line},end}}function parseNMMainConditional(lines,start,options,depth3=0){if(isNMMainResultMatch(lines,start,options.visible))return parseNMMainResultMatch(lines,start,options,parseNMMainConditional,depth3);const line=lines[start];const report=(at,code,message)=>options.diagnostics.push(createDiagnostic({code,severity:"error",message,line:at.line}));const closeBlock=open=>{let level=1;for(let i=open+1;i<lines.length;i++){if(closesNMSourceBlock(lines[i])&&--level===0)return i;if(lines[i].text.trimEnd().endsWith("{"))level++}return lines.length-1};if(depth3>=32){report(line,"NM-CFN-003","Main conditional nesting exceeds the bounded control-flow limit.");return{end:closeBlock(start)}}const isLoop=/^for\b/u.test(line.text);const loop=isLoop?parseNMMainForHeader(line,options.diagnostics):void 0;if(loop&&options.visible.some(statement2=>statement2.kind==="qreg"&&statement2.name===loop.index)){report(line,"NM-CFN-004",`Loop index conflicts with a quantum register: ${loop.index}.`);return{end:closeBlock(start)}}if(isLoop&&!loop)return{end:closeBlock(start)};const match=/^if\s*\(\s*(.*?)\s*\)\s*\{\s*$/u.exec(line.text);if(!match&&!isLoop){report(line,"NM-PARSE-006",`Malformed main condition: ${line.text}.`);return{end:line.text.trimEnd().endsWith("{")?closeBlock(start):start}}const numericNames=new Set(options.numericNames);for(const statement2 of options.visible){if(statement2.kind==="classicalDecl"){if(statement2.valueType.kind!=="array"||statement2.valueType.elementType!=="Bit")numericNames.add(statement2.name)}else if(statement2.kind==="const"||statement2.kind==="param")numericNames.add(statement2.name)}const measured=parseNMClassicalPredicate(match?.[1]??"");const useMeasured=measured.success&&!getNMClassicalPredicateResults(measured.predicate).some(name2=>numericNames.has(name2));const condition=useMeasured?void 0:parseNMTypedClassicalExpressionSource(match?.[1]??"");if(options.classicalControl===false&&(isLoop||!useMeasured)&&!isNMComputeApplyRepeatScope(line)){report(line,"NM-PARSE-062","Typed conditions and runtime loops require classicalFunctions and typedClassicalValues experimental features.");return{end:closeBlock(start)}}const simple=/^([\p{L}_][\p{L}\p{N}_]*)\s*(==|!=)\s*([01])$/u.exec(match?.[1]??"");if(useMeasured&&!simple&&!options.feedForward){report(line,"NM-FF-001","Extended measurement conditions require experimental.feedForward=true.")}else if(!isLoop&&!useMeasured&&!condition){report(line,"NM-PARSE-063",`Invalid typed main condition: ${match?.[1]}.`)}let cursor=start+1;const parseBody=()=>{const body2=[];while(cursor<lines.length&&!closesNMSourceBlock(lines[cursor])){const current=lines[cursor];if(/^compute\s*\{$/u.test(current.text)&&options.parseComputeApply){const pair=options.parseComputeApply(cursor);if(pair.statement)body2.push(pair.statement);cursor=pair.end+1;continue}if(/^(?:if|for)\b/u.test(current.text)||isNMMainResultMatch(lines,cursor,[...options.visible,...body2])){const nested=parseNMMainConditional(lines,cursor,{...options,numericNames:loop?[...options.numericNames,loop.index]:options.numericNames,visible:[...options.visible,...body2]},depth3+1);if(nested.statement)body2.push(nested.statement);cursor=nested.end+1;continue}if(current.text.trimEnd().endsWith("{")){report(current,"NM-PARSE-006",`Unsupported block inside main condition: ${current.text}.`);cursor=closeBlock(cursor)+1;continue}const before=options.diagnostics.length;const statement2=options.parseStatement(current);if(statement2)body2.push(statement2);else if(before===options.diagnostics.length)report(current,"NM-PARSE-006",`Unsupported statement inside main condition: ${current.text}.`);cursor++}if(cursor>=lines.length)report(line,"NM-PARSE-006","Main conditional body is missing its closing brace.");return body2};const body=parseBody();if(loop)return{statement:{kind:"classicalFor",...loop,body,line:line.line},end:cursor};let elseBody;if(!isNMComputeApplyRepeatScope(line)&&/^else\s*\{$/u.test(lines[cursor+1]?.text??"")){cursor+=2;elseBody=parseBody()}const shared={kind:"if",body,...elseBody?{elseBody}:{},line:line.line};const statement=useMeasured&&measured.success?simple?{...shared,binding:simple[1],operator:simple[2],value:Number(simple[3])}:{...shared,predicate:measured.predicate}:condition?{...shared,condition}:void 0;return{statement,end:cursor}}function readNMEnumResultMainMatch(tokens,start,end){let cursor=start;const fail11=message=>{const at=(tokens[cursor]??tokens[start]).range.start;throw new NMNominalExpressionError(message,at.line+1,at.column+1)};const expect=value=>{if(tokens[cursor]?.text!==value)fail11(`Expected ${value}`);return cursor++};const close=(open,left,right)=>{let depth3=1;for(let i=open+1;i<end;i++){if(tokens[i].text===left)depth3++;if(tokens[i].text===right)depth3--;if(!depth3)return i}return fail11("Unclosed Result match delimiter")};expect("match");const begin=expect("("),finish2=close(begin,"(",")");if(finish2===begin+1)fail11("Expected Result selector");cursor=finish2+1;expect("{");const arms=[];while(tokens[cursor]?.text!=="}"){const kind=tokens[cursor++]?.text;if(kind!=="ok"&&kind!=="error"||arms.some(arm=>arm.kind===kind))fail11("Result match requires one ok and one error arm");let binding;if(kind==="ok"||tokens[cursor]?.text==="("){expect("(");if(tokens[cursor]?.kind!=="identifier")fail11("Expected match binding");binding=tokens[cursor++].text;expect(")")}expect("=>");const open=expect("{"),last=close(open,"{","}");arms.push({kind,binding,open,close:last});cursor=last+1;if(tokens[cursor]?.text===",")cursor++}if(arms.length!==2)fail11("Result match requires one ok and one error arm");return{selector:tokens.slice(begin+1,finish2).map(token=>token.text).join(" "),arms,close:cursor}}var targetCounts={H:1,X:1,Y:1,Z:1,S:1,T:1,Sdg:1,Tdg:1,P:1,U:1,GPhase:0,CNOT:2,CZ:2,SWAP:2,iSWAP:2,CCNOT:3,CSWAP:3,CY:2,CH:2,Rx:1,Ry:1,Rz:1,RXX:2,RYY:2,RZZ:2,CRy:2,CRz:2,CP:2};function prepareFunctionGateTargets(tokens,types,signatures){const gate=tokens[0]?.text;if(!Object.prototype.hasOwnProperty.call(targetCounts,gate)||targetCounts[gate]===0)return void 0;const args=argumentsOf(tokens);const angleCount=gate==="U"?3:["P","Rx","Ry","Rz","RXX","RYY","RZZ","CRy","CRz","CP"].includes(gate)?1:0;if(args.length!==targetCounts[gate]+angleCount)fail3("NM-CFN-009",tokenLocation(tokens[0]));const targets=args.slice(0,targetCounts[gate]).map(argument=>{const text=functionTokenText(argument);if(argument[0]?.kind!=="identifier"||argument[1]?.text!=="["||argument.at(-1)?.text!=="]")return{text};const input=argument.slice(2,-1);if(input.length===1&&input[0].kind==="number"&&/^\d+$/u.test(input[0].text))return{text};const at=tokenLocation(argument[0]);const expression=parseNMTypedClassicalExpressionSource(functionTokenText(input),signatures);if(!expression)fail3("NM-CFN-002",at);checkFunctionExpressionBudget(expression,at);const inferred=inferNMTypedClassicalExpressionType(expression,types).type;if(inferred?.kind!=="scalar"||inferred.name!=="Int")fail3("NM-CFN-005",at);return{text,register:argument[0].text,expression}});return targets.some(target2=>target2.expression)?{gate,targets}:void 0}function visitMainSourceStatements(tokens,start,end,visitor,depth3=0){if(depth3>=nmClassicalFunctionLimits.expressionDepth)fail3("NM-CFN-003",tokenLocation(tokens[start]));let pending=start;for(let index=start;index<end;index++){if(tokens[index].text==="{"){const header=tokens.slice(pending,index);let close=index+1,level=1;while(close<end&&level){if(tokens[close].text==="{")level++;if(tokens[close].text==="}")level--;if(level)close++}if(level)fail3("NM-CFN-002",tokenLocation(tokens[index]));const kind=header[0]?.text;visitor.header?.(pending,index);const executable=["if","else","for","until","observe","test","snapshot","match","ok","error","compute","apply"].includes(kind)||visitor.containers?.includes(kind)||kind==="("&&header.at(-1)?.text==="=>";if(executable)visitor.scope(()=>visitMainSourceStatements(tokens,index+1,close,visitor,depth3+1),header);else visitor.opaque?.(index+1,close,header);index=close;pending=close+1}else if(tokens[index].text===";"){if(pending<index)visitor.statement(pending,index);pending=index+1}}}function nmCircuitInvocationTokens(tokens){if(["adjoint","inverse"].includes(tokens[0]?.text))return tokens.slice(1);if(tokens[0]?.text==="inv"&&tokens[1]?.text==="@")return tokens.slice(2);if(!["ctrl","pow"].includes(tokens[0]?.text)||tokens[1]?.text!=="(")return tokens;let depth3=1,index=2;for(;index<tokens.length&&depth3;index++){if(tokens[index].text==="(")depth3++;if(tokens[index].text===")")depth3--}return!depth3&&tokens[index]?.text==="@"?tokens.slice(index+1):tokens}function readNMCheckedCircuitSignature(text){const header=/^(?:(?:pub|public|private)\s+)?circuit\s+([A-Za-z_]\w*)\s*(?:<[^(){}]*>)?\s*\((.*)\)\s*\{$/u.exec(text);if(!header)return;const parts=[];let start=0,depth3=0;for(let i=0;i<header[2].length;i++){const char=header[2][i];if("<([".includes(char))depth3++;if(">)]".includes(char)&&--depth3<0)return;if(char===","&&depth3===0){parts.push(header[2].slice(start,i));start=i+1}}if(depth3)return;parts.push(header[2].slice(start));const parameters=[];for(const part of parts){const parameter=/^\s*[A-Za-z_]\w*\s*:\s*(Angle|QReg\s*<.+>)\s*$/u.exec(part);if(!parameter)return;parameters.push(parameter[1]==="Angle"?"angle":"register")}return{name:header[1],signature:{parameters}}}function nmCircuitCallOpen(tokens){let open=1;if(tokens[open]?.text==="<"){let depth3=1;for(open++;open<tokens.length;open++){if(tokens[open].text==="<")depth3++;if(tokens[open].text===">"&&--depth3===0){open++;break}}}return tokens[open]?.text==="("?open:-1}function nmCircuitValueTokens(tokens){const open=nmCircuitCallOpen(tokens);if(open<0)fail3("NM-CFN-002",tokenLocation(tokens[0]));return[tokens[0],...tokens.slice(open)]}function indexNMComputeApplyCircuitArguments(source,modules){const signatures=new Map;const lines=[source,...Object.values(modules??{})].flatMap(text=>parseNMClassicalControlDocument(text).lines);const registry=lines.flatMap(line=>{const specifier=/^use\s+(\S+?)\s*;?$/u.exec(line.text)?.[1];if(!specifier||specifier.startsWith("workspace."))return[];const result2=resolveNMStdLibraryImport(specifier.replace(/^package\./u,""));return result2.status==="resolved"?parseNMClassicalControlDocument(result2.entry.source).lines:[]});for(const line of[...lines,...registry]){const declaration=readNMCheckedCircuitSignature(line.text);if(declaration)signatures.set(declaration.name,declaration.signature)}return signatures}function prepareNMComputeApplyCircuitArguments(source,tokens,signature,functions,types,angles,angleTypes,generated,nominal){const args=argumentsOf(nmCircuitValueTokens(tokens),nominal?.typeEnd),at=tokenLocation(tokens[0]);if(args.length!==signature.parameters.length||args.some((argument,index)=>signature.parameters[index]==="register"&&!/^[A-Za-z_]\w*(?:\[[^\[\]]+\.\.[^\[\]]+\])?$/u.test(argument.map(item=>item.text).join(""))))fail3("NM-CFN-009",at);const compile=text=>{if(nominal)return nominal.compile(text);const expression=parseNMTypedClassicalExpressionSource(text,functions);if(!expression)fail3("NM-CFN-002",at);const type=inferNMTypedClassicalExpressionType(expression,types).type;if(!type||type.kind!=="angle"&&(type.kind!=="scalar"||!["Float","Int"].includes(type.name)))fail3("NM-CFN-005",at);return{expression,type}};return args.filter((_,index)=>signature.parameters[index]==="angle").map(argument=>{let{expression,type}=compile(functionTokenText(argument));if(type.kind==="scalar"&&type.name==="Int"){({expression,type}=compile(`int_to_float(${functionTokenText(argument)})`))}checkFunctionExpressionBudget(expression,at);if(generated.length>=1024)fail3("NM-CFN-003",at);const name2=`__nm_cfn_circuit_arg_${generated.length}`;generated.push(name2);angles.set(name2,expression);angleTypes.set(name2,type);const start=argument[0].range.start.offset,end=argument.at(-1).range.end.offset;return{start,end,text:name2+source.slice(start,end).replace(/[^\r\n]/gu,"")}})}function lowerNMComputeApplyExpandedAngles(lines,angles,types,generated,functions=new Map){let nodes=0;function substitute(value,depth3=0){if(++nodes>32768||depth3>64)fail3("NM-CFN-003");if(!value||typeof value!=="object")return value;if("kind"in value&&value.kind==="ref"&&"name"in value&&typeof value.name==="string"&&angles.has(value.name))return angles.get(value.name);if(Array.isArray(value))return value.map(item=>substitute(item,depth3+1));return Object.fromEntries(Object.entries(value).map(([key4,item])=>[key4,substitute(item,depth3+1)]))}const result2=lines.map(line=>{const calls=[...line.text.matchAll(/\b([A-Za-z_]\w*)\s*\(/gu)];if(![...types.keys()].some(name2=>angles.has(name2)&&line.text.includes(name2))&&!calls.some(([,name2])=>functions.has(name2)||isNMFloatMathBuiltinName(name2)||isNMNumericBuiltinName(name2)||isNMAngleConversion(name2)))return line;const{tokens}=readFunctionSource(line.text.replace(/;\s*$/u,""));const gate=prepareFunctionGateAngles(tokens,"",new Map,types,functions);if(!gate)return line;const names=gate.expressions.map(expression=>{if(generated.length>=1024)fail3("NM-CFN-003");const composed=substitute(expression);checkFunctionExpressionBudget(composed,{line:line.line,column:1});const name2=`__nm_cfn_circuit_angle_${generated.length}`;angles.set(name2,composed);generated.push(name2);return name2});return{...line,text:`${gate.gate}(${[...gate.targets,...names].join(",")});`}});if(new TextEncoder().encode(result2.map(line=>line.text).join("\n")+JSON.stringify([...angles])).length>131072)fail3("NM-CFN-003");return result2}var NM_CLASSICAL_FUNCTION_LOWERING_VERSION="0.2.0-runtime-experimental";var nmClassicalFunctionLoweringLimits={bindings:1024,outputBytes:131072};function functionDiagnostic(issue11){return createDiagnostic({code:issue11.diagnostic.code,severity:"error",message:issue11.diagnostic.message.en,line:issue11.diagnostic.line,column:issue11.diagnostic.column,translationKey:`classicalFunctions.${issue11.diagnostic.code}`})}function classicalFunctionExportDiagnostic(program){return program.classicalFunctions?functionDiagnostic(new FunctionIssue("NM-CFN-011",{line:program.classicalFunctions.declarations[0]?.line??1,column:1})):void 0}function lowerNMClassicalFunctions(source,options){if(options.experimental?.classicalFunctions!==true||!/\bfn\b/u.test(source))return{source,diagnostics:[]};try{const localCircuitProgram=options.experimental?.computeApply===true&&(/\bcircuit\b/u.test(source)||options.experimental?.typedClassicalValues===true&&/\buse\s+workspace\./u.test(source))&&readNMComputeApplySource(source,true).blocks.length>0;const linked=linkNMFunctionWorkspace(source,options,localCircuitProgram);const result2=lower(linked?.source??source,options,linked?.quantumModules);if(linked&&"provenance"in result2&&result2.provenance){result2.provenance.originalSource=source;result2.provenance.parseOptions.workspaceModules=linked.modules;const references=linked.references.filter(reference=>reference.replacementStart!==void 0);result2.provenance.workspace={entryModule:linked.entryModule,symbols:linked.symbols,...references.length?{references}:{}}}return{...result2,...linked?.quantumModules?{quantumModules:linked.quantumModules}:{}}}catch(error){if(error instanceof NMFunctionWorkspaceIssue)return{source:"",diagnostics:[error.diagnostic]};if(!(error instanceof FunctionIssue))throw error;return{source:"",diagnostics:[functionDiagnostic(error)]}}}function lower(source,options,quantumModules){const checkedWorkspaceCircuits=quantumModules!==void 0;const{tokens,regions}=readFunctionSource(source,{discovery:true});const named=regions.filter(region=>region.name!=="main");const helperNames2=new Set(named.map(region=>region.name));const hasNumericCalls=tokens.some((token,index)=>(isNMNumericBuiltinName(token.text)||isNMNumericMatrixBuiltinName(token.text)||(isNMComplexBuiltinName(token.text)||isNMAngleConversion(token.text)))&&!helperNames2.has(token.text)&&tokens[index+1]?.text==="(");const hasMathCalls=hasNumericCalls||tokens.some((token,index)=>isNMFloatMathBuiltinName(token.text)&&tokens[index+1]?.text==="(");const mainRegion=regions.find(region=>region.name==="main");const mainTokens=mainRegion?tokens.slice(mainRegion.body+1,mainRegion.close):[];const hasMainResults=mainTokens.some(token=>token.text==="Result"||token.text==="?");const hasDynamicIndex=mainTokens.some((token,index)=>token.text==="["&&(mainTokens[index-1]?.kind==="identifier"||["]",")","?"].includes(mainTokens[index-1]?.text))&&mainTokens[index-1]?.text!=="in"&&!(mainTokens[index+1]?.kind==="number"&&/^\d+$/u.test(mainTokens[index+1].text)&&mainTokens[index+2]?.text===".."&&mainTokens[index+3]?.kind==="number"&&/^\d+$/u.test(mainTokens[index+3].text)&&mainTokens[index+4]?.text==="]")&&!(mainTokens[index+1]?.kind==="number"&&/^\d+$/u.test(mainTokens[index+1].text)&&mainTokens[index+2]?.text==="]"));const hasMainMutation=mainTokens.some((token,index)=>token.text==="mut"||token.text==="for"||token.kind==="identifier"&&mainTokens[index+1]?.text==="="&&(index===0||[";","{","}"].includes(mainTokens[index-1]?.text)));const computeContainers=options.experimental?.computeApply===true&&[source,...Object.values(quantumModules??{})].some(text=>readNMComputeApplySource(text,true).blocks.length>0);const hasComputeLocals=computeContainers&&mainTokens.some((token,index)=>token.text==="let"&&mainTokens[index+2]?.text===":"&&["Int","Float","Bool","Angle","Array","Matrix","Complex","Result"].includes(mainTokens[index+3]?.text));if(!named.length&&!hasMathCalls&&!hasMainMutation&&!hasDynamicIndex&&!hasMainResults&&!checkedWorkspaceCircuits&&!hasComputeLocals)return{source,diagnostics:[]};assertFunctionSourceBudget(source,tokens.length);if(!options.experimental?.typedClassicalValues)fail3("NM-CFN-010");const quantumImports=tokens.some(token=>token.text==="use")&&(checkedWorkspaceCircuits||canLowerNMComputeApplyQuantumImports(source,options));const circuitArguments=checkedWorkspaceCircuits||quantumImports?indexNMComputeApplyCircuitArguments(source,quantumModules):new Map;if(tokens.some(token=>token.kind==="identifier"&&["use","circuit","algorithm","xor_oracle","phase_oracle","comptime","property","collect","sample"].includes(token.text)&&!(token.text==="use"&&quantumImports||token.text==="circuit"&&checkedWorkspaceCircuits||computeContainers&&["sample","collect","property"].includes(token.text)&&mainRegion&&token.range.start.offset>mainRegion.start&&token.range.end.offset<mainRegion.end)))fail3("NM-CFN-010");if(tokens.some(token=>token.kind==="identifier"&&token.text.startsWith("__nm_cfn_")))fail3("NM-CFN-004");const mains=regions.filter(region=>region.name==="main");if(mains.length!==1)fail3("NM-CFN-009");const main=mains[0];const functionSource=applySourcePatches(blankSource(source),named.map(({start,end})=>({start,end,text:source.slice(start,end)})));const templates=named.length?parseFunctionTemplates(functionSource):[];const hasGenerics=templates.some(template=>template.sizeParameters.length>0);if(hasGenerics)validateGenericFunctionTemplates(templates);const functions=hasGenerics?new Map(templates.filter(template=>!template.sizeParameters.length).map(template=>[template.name,instantiateGenericFunction(template,new Map)])):named.length?validatedFunctions(functionSource,{enabled:true}):new Map;const callableLocations=new Map(templates.map(template=>[template.name,template]));const hasResultHelpers=hasGenerics?parseNMSourceCST(functionSource).tokens.some(token=>!token.trivia&&token.text==="Result"):[...functions.values()].some(functionUsesResults);if(hasResultHelpers&&options.experimental?.functionResults!==true)fail3("NM-CFN-012");const mainReturnsResult=tokens.some(token=>token.range.start.offset>=main.start&&token.range.start.offset<tokens[main.body].range.start.offset&&token.text==="Result");if(!mainReturnsResult&&tokens.slice(main.body+1,main.close).some(token=>token.text==="?"))fail3("NM-CFN-012");const runtimeExpressions=new Map;const runtimeAngles=new Map;const runtimeConditions=new Map;const runtimeTargets=new Map;const deferred=hasMainResults||hasGenerics||hasNumericCalls||hasDynamicIndex||options.debugClassicalFunctions===true||hasResultHelpers||[...functions.values()].some(fn=>fn.returns.startsWith("Array<")||functionUsesImperativeExecution(fn))||tokens.some((token,index)=>(token.text==="]"||token.text===")")&&tokens[index+1]?.text==="[")||tokens.some(token=>["if","for","mut","Bool","true","false","&&","||"].includes(token.text));const runtimeFunctions=new Map(templates.map(template=>[template.name,template.sizeParameters.length?{source:functionSource,generic:true,returns:template.returns}:{source:functionSource,returns:functions.get(template.name).returns}]));const provenance={experimental:true,contractVersion:NM_CLASSICAL_FUNCTION_LOWERING_VERSION,declarations:named.map(region=>{const token=tokens.find(token2=>token2.range.start.offset===region.start);return{name:region.name,line:token.range.start.line+1,...checkedWorkspaceCircuits?{column:token.range.start.column+1}:{},source:source.slice(region.start,region.end)}}),calls:[],generatedBindings:[],originalSource:source,parseOptions:{experimental:{...options.experimental}}};const patches=named.map(({start,end})=>({start,end,text:blankSource(source.slice(start,end))}));let mainTypes=new Map([["PI",{kind:"scalar",name:"Float"}]]);let globalStart=0;for(let i=0;i<tokens.length;i++){const region=regions.find(entry=>entry.start===tokens[i].range.start.offset);const declarationBoundary=["const","param"].includes(tokens[i].text)&&tokens[i+1]?.kind==="identifier"&&i>globalStart&&tokens[i].range.start.line>tokens[i-1].range.end.line;if(region||declarationBoundary){recordMainArithmeticBinding(tokens.slice(globalStart,i),mainTypes);globalStart=i}if(region?.name==="main")break;if(region){i=region.close;globalStart=i+1;continue}if(tokens[i].text===";"){recordMainArithmeticBinding(tokens.slice(globalStart,i),mainTypes);globalStart=i+1}}const circuitAngleTypes=new Map(mainTypes);let work2=0;const charge=()=>{if(++work2>4096)fail3("NM-CFN-003")};function emit(type,expression,lines){if(provenance.generatedBindings.length>=nmClassicalFunctionLoweringLimits.bindings)fail3("NM-CFN-003");const name2=`__nm_cfn_${provenance.generatedBindings.length}`;provenance.generatedBindings.push(name2);const inferred=typeof type==="string"?inferredFunctionType(type):type;mainTypes.set(name2,inferred);const label3=typeof type==="string"?type:type.kind==="matrix"?`Matrix<${type.elementType}, ${type.rows}, ${type.columns}>`:`Array<${type.elementType}, ${type.length}>`;lines.push(`let ${name2}: ${label3} = ${expression};`);return name2}function call(fn,args,lines,line){charge();if(resultPayloadType(fn.returns)||fn.parameters.some(parameter=>resultPayloadType(parameter.type)))fail3("NM-CFN-009",fn);const returnType=fn.returns;if(args.length!==fn.parameters.length)fail3("NM-CFN-005",{line,column:1});const environment=new Map;provenance.calls.push({name:fn.name,line,declarationLine:fn.line});fn.parameters.forEach((parameter,index)=>{const type=baseFunctionType(parameter.type,parameter);environment.set(parameter.name,{text:emit(type,args[index],lines),type})});function expression(node){charge();switch(node.kind){case"resultOk":case"resultError":case"propagate":case"boolean":case"not":case"compare":case"logical":return fail3("NM-CFN-009",node);case"literal":return{text:emit(node.type,node.type==="Float"&&Number.isInteger(node.value)?`${node.value}.0`:String(node.value),lines),type:node.type};case"ref":return environment.get(node.name);case"array":{const items=node.items.map(expression);const type=arrayType(scalarFunctionType(items[0].type,node),items.length,node);return{text:emit(type,`[${items.map(item=>item.text).join(", ")}]`,lines),type}}case"index":{if(typeof node.index!=="number")fail3("NM-CFN-009",node);const target2=expression(node.target);const array3=inferredFunctionType(target2.type);if(array3.kind!=="array")fail3("NM-CFN-005",node);const type=array3.elementType;return{text:emit(type,`${target2.text}[${node.index}]`,lines),type}}case"unary":{const operand2=expression(node.operand);return{text:emit(operand2.type,`(-${operand2.text})`,lines),type:operand2.type}}case"binary":{const left=expression(node.left),right=expression(node.right);const type=numericType(node,[left.type,right.type].map(type2=>scalarFunctionType(type2,node)));return{text:emit(type,`(${left.text} ${node.operator} ${right.text})`,lines),type}}case"call":{const values2=node.args.map(expression);if(node.name==="int_to_float")return{text:emit("Float",`int_to_float(${values2[0].text})`,lines),type:"Float"};if(isNMFloatMathBuiltinName(node.name))return{text:emit("Float",`${node.name}(${values2[0].text})`,lines),type:"Float"};if(node.name==="mean"&&!functions.has("mean"))return{text:emit("Float",`mean(${values2[0].text})`,lines),type:"Float"};const target2=functions.get(node.name);if(!target2)fail3("NM-CFN-009",node);return{text:call(target2,values2.map(value=>value.text),lines,line),type:target2.returns}}}}for(const statement of fn.body){if(statement.kind==="let"){if(resultPayloadType(statement.binding.type))fail3("NM-CFN-009",statement);const type=statement.binding.type;environment.set(statement.binding.name,{text:emit(type,expression(statement.expression).text,lines),type})}else if(statement.kind==="return")return emit(returnType,expression(statement.expression).text,lines);else fail3("NM-CFN-009",statement)}return fail3("NM-CFN-002",fn)}function replaceCalls(input,lines,depth3=0,propagateResult=false){if(depth3>=32)fail3("NM-CFN-003");charge();if(deferred){let nesting=0;for(const token2 of input){if(token2.text==="("||token2.text==="["){if(++nesting>=32)fail3("NM-CFN-003",tokenLocation(token2))}else if(token2.text===")"||token2.text==="]")nesting--}const text=functionTokenText(input);const expression=parseNMTypedClassicalExpressionSource(propagateResult?`(${text})?`:text,runtimeFunctions);if(!expression)fail3("NM-CFN-002",input[0]&&tokenLocation(input[0]));checkFunctionExpressionBudget(expression,tokenLocation(input[0]));const inferred=inferNMTypedClassicalExpressionType(expression,mainTypes).type;if(!inferred||inferred.kind==="result"||inferred.kind==="scalar"&&inferred.name==="Bit")fail3("NM-CFN-005",tokenLocation(input[0]));const placeholder=inferred.kind==="angle"?"radians(0.0)":inferred.kind==="complex"?"complex(0.0, 0.0)":inferred.kind==="matrix"?`${inferred.elementType==="Complex"?"complex_matrix":"matrix"}(${inferred.rows}, ${inferred.columns}, [${Array(inferred.rows*inferred.columns).fill("0.0").join(", ")}]${inferred.elementType==="Complex"?`, [${Array(inferred.rows*inferred.columns).fill("0.0").join(", ")}]`:""})`:inferred.kind==="array"?`[${Array(inferred.length).fill(inferred.elementType==="Float"?"0.0":"0").join(", ")}]`:inferred.name==="Bool"?"false":inferred.name==="Float"?"0.0":"0";const name2=emit(inferred.kind==="angle"?"Angle":inferred.kind==="complex"?"Complex":inferred.kind==="array"||inferred.kind==="matrix"?inferred:inferred.name,placeholder,lines);runtimeExpressions.set(name2,expression);for(const token2 of input){const target2=callableLocations.get(token2.text);if(target2)provenance.calls.push({name:target2.name,line:token2.range.start.line+1,declarationLine:target2.line})}return name2}if(input[0]?.text==="("&&input.at(-1)?.text===")"){let nesting=0;const close=input.findIndex(token2=>{if(token2.text==="(")nesting+=1;if(token2.text===")")nesting-=1;return nesting===0});if(close===input.length-1)return replaceCalls(input.slice(1,-1),lines,depth3+1)}const token=input[0];if(!token)fail3("NM-CFN-009");const operator=mainArithmeticOperator(input);if(operator!==void 0){const left=replaceCalls(input.slice(0,operator),lines,depth3+1);const right=replaceCalls(input.slice(operator+1),lines,depth3+1);const expression=`(${left} ${input[operator].text} ${right})`;return emit(mainArithmeticType(expression,mainTypes,token),expression,lines)}if(token.text==="-"){const operand2=replaceCalls(input.slice(1),lines,depth3+1);const expression=`(-${operand2})`;return emit(mainArithmeticType(expression,mainTypes,token),expression,lines)}if(!input.some(item=>item.kind==="identifier"&&functions.has(item.text))){const text=functionTokenText(input);return emit(mainArithmeticType(text,mainTypes,token),text,lines)}if(token.text==="["){const values2=mainArrayItems(input).map(item=>replaceCalls(item,lines,depth3+1));const types=values2.map(value=>mainArithmeticType(value,mainTypes,token));if(types.some(type=>type!==types[0]))fail3("NM-CFN-005",tokenLocation(token));return emit({kind:"array",elementType:types[0],length:values2.length},`[${values2.join(", ")}]`,lines)}if(token.text==="int_to_float"||isNMFloatMathBuiltinName(token.text)||token.text==="mean"&&!functions.has("mean")){const argument=replaceCalls(singleMainCallArgument(input),lines,depth3+1);const expression=`${token.text}(${argument})`;return emit(mainArithmeticType(expression,mainTypes,token),expression,lines)}const fn=token&&functions.get(token.text);if(!fn||input[1]?.text!=="(")fail3("NM-CFN-009",token&&tokenLocation(token));let level=1,end=2,start=end;const args=[];for(;end<input.length;end+=1){const text=input[end].text;if(text==="("||text==="[")level+=1;if(text===")"||text==="]")level-=1;if(level===0||level===1&&text===","){if(end>start){if(args.length>=fn.parameters.length)fail3("NM-CFN-005",tokenLocation(token));const argument=input.slice(start,end);const value=argument.some(item=>item.kind==="identifier"&&functions.has(item.text))?replaceCalls(argument,lines,depth3+1):functionTokenText(argument);const parameter=fn.parameters[args.length];if(resultPayloadType(parameter.type))fail3("NM-CFN-009",parameter);args.push(emit(baseFunctionType(parameter.type,parameter),value,lines))}else if(text===","||args.length)fail3("NM-CFN-002",tokenLocation(token));start=end+1;if(level===0)break}}if(level!==0||input[end]?.text!==")"||end!==input.length-1)fail3("NM-CFN-009",tokenLocation(token));return call(fn,args,lines,token.range.start.line+1)}const covered=new Set;const acceptedMathCalls=new Set;let mainTypedBindings=new Set;let matchPayload;const matchPayloads=new Map;const cover=(items,start)=>items.forEach((item,index)=>{covered.add(start+index);if((isNMFloatMathBuiltinName(item.text)||isNMNumericBuiltinName(item.text)||(isNMComplexBuiltinName(item.text)||isNMAngleConversion(item.text)))&&items[index+1]?.text==="(")acceptedMathCalls.add(start+index);const target2=callableLocations.get(item.text);if(target2)provenance.calls.push({name:target2.name,line:item.range.start.line+1,declarationLine:target2.line})});const resultMarker=(expression,at)=>{checkFunctionExpressionBudget(expression,tokenLocation(at));if(provenance.generatedBindings.length>=nmClassicalFunctionLoweringLimits.bindings)fail3("NM-CFN-003",tokenLocation(at));const marker=`__nm_cfn_result_${runtimeExpressions.size}`;provenance.generatedBindings.push(marker);runtimeExpressions.set(marker,expression);return marker};visitMainSourceStatements(tokens,main.body+1,main.close,{containers:computeContainers?["repeat","sample","collect","controlled","property","forall"]:[],opaque(start,end,header){if(!["train","e\u011Fit"].includes(header[0]?.text))return;for(let index=start;index<end;index++){covered.add(index);acceptedMathCalls.add(index)}},header(start,end){const header=tokens.slice(start,end);if(header[0]?.text==="match"&&header[1]?.text==="("&&header.at(-1)?.text===")"){const expression2=parseNMTypedClassicalExpressionSource(functionTokenText(header.slice(2,-1)),runtimeFunctions);if(!expression2)return;checkFunctionExpressionBudget(expression2,tokenLocation(header[0]));const inferred2=inferNMTypedClassicalExpressionType(expression2,mainTypes).type;if(inferred2?.kind!=="result")return;if(!options.experimental?.functionResults)fail3("NM-CFN-012",tokenLocation(header[0]));matchPayloads.set(header[0].range.start.offset,inferred2.payload);const marker2=resultMarker(expression2,header[0]);const offset2=header[0].range.start.offset,finish3=tokens[end].range.end.offset;patches.push({start:offset2,end:finish3,text:`match (${marker2}) {`+(source.slice(offset2,finish3).match(/\r\n|\r|\n/g)??[]).join("")});cover(header,start);return}if(header[0]?.text!=="if")return;const containsCall=header.some((token,index)=>header[index+1]?.text==="("&&(runtimeFunctions.has(token.text)||isNMFloatMathBuiltinName(token.text)||isNMNumericBuiltinName(token.text)||(isNMComplexBuiltinName(token.text)||isNMAngleConversion(token.text))));if(!containsCall)return;if(header[1]?.text!=="("||header.at(-1)?.text!==")")fail3("NM-CFN-002",tokenLocation(header[0]));const input=header.slice(2,-1);const expression=parseNMTypedClassicalExpressionSource(functionTokenText(input),runtimeFunctions);if(!expression)fail3("NM-CFN-002",tokenLocation(header[0]));checkFunctionExpressionBudget(expression,tokenLocation(header[0]));const inferred=inferNMTypedClassicalExpressionType(expression,mainTypes).type;if(!inferred||inferred.kind!=="scalar"||inferred.name!=="Bool")fail3("NM-CFN-005",tokenLocation(header[0]));if(provenance.generatedBindings.length>=nmClassicalFunctionLoweringLimits.bindings)fail3("NM-CFN-003",tokenLocation(header[0]));const marker=`__nm_cfn_condition_${runtimeConditions.size}`;provenance.generatedBindings.push(marker);runtimeConditions.set(marker,expression);const offset=header[0].range.start.offset,finish2=tokens[end].range.end.offset;patches.push({start:offset,end:finish2,text:`if (${marker}) {`+(source.slice(offset,finish2).match(/\r\n|\r|\n/g)??[]).join("")});header.forEach((token,index)=>{covered.add(start+index);if((isNMFloatMathBuiltinName(token.text)||isNMNumericBuiltinName(token.text)||(isNMComplexBuiltinName(token.text)||isNMAngleConversion(token.text)))&&header[index+1]?.text==="(")acceptedMathCalls.add(start+index);const target2=callableLocations.get(token.text);if(target2)provenance.calls.push({name:target2.name,line:token.range.start.line+1,declarationLine:target2.line})})},scope(visit,header){const parentTypes=mainTypes,parentBindings=mainTypedBindings,parentMatchPayload=matchPayload;mainTypes=new Map(parentTypes);mainTypedBindings=new Set(parentBindings);if(header[0]?.text==="match")matchPayload=matchPayloads.get(header[0].range.start.offset);if(header[0]?.text==="ok"&&matchPayload&&header[2]?.kind==="identifier"){const binding=header[2];if(mainTypes.has(binding.text)||runtimeFunctions.has(binding.text)||isNMClassicalFunctionReservedName(binding.text))fail3("NM-CFN-004",tokenLocation(binding));mainTypes.set(binding.text,matchPayload);mainTypedBindings.add(binding.text)}if(header[0]?.text==="for"&&header[1]?.kind==="identifier"){if(isNMClassicalFunctionReservedName(header[1].text))fail3("NM-CFN-004",tokenLocation(header[1]));mainTypes.set(header[1].text,{kind:"scalar",name:"Int"});mainTypedBindings.add(header[1].text)}if(computeContainers&&header[0]?.text==="forall"&&header[1]?.kind==="identifier"){if(mainTypes.has(header[1].text)||isNMClassicalFunctionReservedName(header[1].text))fail3("NM-CFN-004",tokenLocation(header[1]));mainTypes.set(header[1].text,{kind:"scalar",name:"Float"});mainTypedBindings.add(header[1].text)}try{visit()}finally{mainTypes=parentTypes;mainTypedBindings=parentBindings;matchPayload=parentMatchPayload}},statement(start,i){const token=tokens[i];const statement=tokens.slice(start,i);const mutable=statement[0]?.text==="let"&&statement[1]?.text==="mut";const bindingName=statement[mutable?2:1];const resultBinding=mainFunctionBinding(statement);const isDirectReturn=statement[0]?.text==="return"&&!["ok","error","err"].includes(statement[1]?.text);if(resultBinding?.valueType.kind==="result"||isDirectReturn){const expression=parseNMTypedClassicalExpressionSource(functionTokenText(statement.slice(resultBinding?resultBinding.expressionStart:1)),runtimeFunctions);const expected=resultBinding?.valueType;if(expression)checkFunctionExpressionBudget(expression,tokenLocation(statement[0]));const inferred=expression&&inferNMTypedClassicalExpressionType(expression,mainTypes,expected).type;if(resultBinding?.valueType.kind==="result"&&(!inferred||!sameNMTypedClassicalType(inferred,resultBinding.valueType)))fail3("NM-CFN-005",tokenLocation(statement[0]));if(inferred?.kind==="result"&&expression){if(!options.experimental?.functionResults||!resultBinding&&!mainReturnsResult)fail3("NM-CFN-012",tokenLocation(statement[0]));if(resultBinding&&(mutable||mainTypes.has(bindingName.text)||runtimeFunctions.has(bindingName.text)||isNMClassicalFunctionReservedName(bindingName.text)))fail3("NM-CFN-004",tokenLocation(bindingName));const marker=resultMarker(expression,statement[0]);const offset=statement[0].range.start.offset,end=token.range.end.offset;const text=resultBinding?`let ${bindingName.text}: ${resultBinding.type} = ${marker};`:`return ${marker};`;patches.push({start:offset,end,text:text+(source.slice(offset,end).match(/\r\n|\r|\n/g)??[]).join("")});cover(statement,start);if(resultBinding){mainTypes.set(bindingName.text,resultBinding.valueType);mainTypedBindings.add(bindingName.text)}return}}const assignment=readNMMainAssignment(statement);if(assignment.candidate){if(!assignment.name||!assignment.value)fail3("NM-CFN-002",tokenLocation(statement[0]));const expression=parseNMTypedClassicalExpressionSource(functionTokenText(assignment.value),runtimeFunctions);if(!expression)fail3("NM-CFN-002",tokenLocation(statement[0]));checkFunctionExpressionBudget(expression,tokenLocation(statement[0]));if(provenance.generatedBindings.length>=nmClassicalFunctionLoweringLimits.bindings)fail3("NM-CFN-003",tokenLocation(statement[0]));const marker=`__nm_cfn_assignment_${runtimeExpressions.size}`;provenance.generatedBindings.push(marker);runtimeExpressions.set(marker,expression);let target2=assignment.name;if(assignment.index){const indexed=parseNMTypedClassicalExpressionSource(`${target2}[${functionTokenText(assignment.index)}]`,runtimeFunctions);if(indexed?.kind!=="index")fail3("NM-CFN-002",tokenLocation(statement[0]));checkFunctionExpressionBudget(indexed,tokenLocation(statement[0]));if(typeof indexed.index==="number")target2+=`[${indexed.index}]`;else{if(provenance.generatedBindings.length>=nmClassicalFunctionLoweringLimits.bindings)fail3("NM-CFN-003",tokenLocation(statement[0]));const indexMarker=`__nm_cfn_assignment_index_${runtimeExpressions.size}`;provenance.generatedBindings.push(indexMarker);runtimeExpressions.set(indexMarker,indexed.index);target2+=`[${indexMarker}]`}}const offset=statement[0].range.start.offset,end=token.range.end.offset;patches.push({start:offset,end,text:`${target2} = ${marker};`+(source.slice(offset,end).match(/\r\n|\r|\n/g)??[]).join("")});statement.forEach((item,index)=>{covered.add(start+index);if((isNMFloatMathBuiltinName(item.text)||isNMNumericBuiltinName(item.text)||(isNMComplexBuiltinName(item.text)||isNMAngleConversion(item.text)))&&statement[index+1]?.text==="(")acceptedMathCalls.add(start+index);const target3=callableLocations.get(item.text);if(target3)provenance.calls.push({name:target3.name,line:item.range.start.line+1,declarationLine:target3.line})});return}const circuitCall=nmCircuitInvocationTokens(statement);const circuitArity=circuitArguments.get(circuitCall[0]?.text);if(circuitArity){patches.push(...prepareNMComputeApplyCircuitArguments(source,circuitCall,circuitArity,runtimeFunctions,mainTypes,runtimeAngles,circuitAngleTypes,provenance.generatedBindings));cover(statement,start);return}const targetGate=prepareFunctionGateTargets(statement,mainTypes,runtimeFunctions);if(targetGate){const targets=targetGate.targets.map(target2=>{if(!target2.expression)return target2.text;if(provenance.generatedBindings.length>=nmClassicalFunctionLoweringLimits.bindings)fail3("NM-CFN-003",tokenLocation(statement[0]));const marker=`__nm_cfn_target_${runtimeTargets.size}`;provenance.generatedBindings.push(marker);runtimeTargets.set(marker,target2.expression);return`${target2.register}[${marker}]`});const angleGate=prepareFunctionGateAngles(statement,functionSource,functions,mainTypes,runtimeFunctions,targets);const names=angleGate?.expressions.map(expression=>{if(provenance.generatedBindings.length>=nmClassicalFunctionLoweringLimits.bindings)fail3("NM-CFN-003",tokenLocation(statement[0]));const marker=`__nm_cfn_angle_${runtimeAngles.size}`;provenance.generatedBindings.push(marker);runtimeAngles.set(marker,expression);return marker})??[];const text=names.map(name2=>`const ${name2}: Float = 0.0;`).join(" ")+` ${targetGate.gate}(${[...targets,...names].join(", ")});`;const offset=statement[0].range.start.offset,end=token.range.end.offset;patches.push({start:offset,end,text:text+(source.slice(offset,end).match(/\r\n|\r|\n/g)??[]).join("")});statement.forEach((item,index)=>{covered.add(start+index);if((isNMFloatMathBuiltinName(item.text)||isNMNumericBuiltinName(item.text)||(isNMComplexBuiltinName(item.text)||isNMAngleConversion(item.text)))&&statement[index+1]?.text==="(")acceptedMathCalls.add(start+index);const target2=callableLocations.get(item.text);if(target2)provenance.calls.push({name:target2.name,line:item.range.start.line+1,declarationLine:target2.line})});return}const angleTokens=functionGateAngleTokens(statement);const needsTypedAngle=angleTokens.some((item,index)=>mainTypedBindings.has(item.text)||(isNMFloatMathBuiltinName(item.text)||isNMNumericBuiltinName(item.text)||(isNMComplexBuiltinName(item.text)||isNMAngleConversion(item.text)))&&angleTokens[index+1]?.text==="(");const mathGate=needsTypedAngle?prepareFunctionGateAngles(statement,functionSource,functions,mainTypes,runtimeFunctions):void 0;if(mathGate||mainFunctionBinding(statement)||statement[0]?.text==="return"){statement.forEach((item,index)=>{if((isNMFloatMathBuiltinName(item.text)||isNMNumericBuiltinName(item.text)||(isNMComplexBuiltinName(item.text)||isNMAngleConversion(item.text)))&&statement[index+1]?.text==="(")acceptedMathCalls.add(start+index)})}if(mathGate||statement.some(item=>item.kind==="identifier"&&runtimeFunctions.has(item.text))){const typedLet=mainFunctionBinding(statement);const okReturn=statement[0]?.text==="return"&&statement[1]?.text==="ok"&&statement[2]?.text==="("&&statement.at(-1)?.text===")";const returnedCall=statement[0]?.text==="return"&&!okReturn?parseNMTypedClassicalExpressionSource(functionTokenText(statement.slice(1)),runtimeFunctions):void 0;const resultReturn=returnedCall?.kind==="genericFunctionCall"?!returnedCall.propagate&&returnedCall.returns.kind==="result":returnedCall?.kind==="functionCall"&&!returnedCall.propagate&&Boolean(resultPayloadType(returnedCall.returns));if(resultReturn&&!mainReturnsResult)fail3("NM-CFN-012",tokenLocation(statement[0]));const gate=mathGate??(!typedLet&&!okReturn&&!resultReturn?prepareFunctionGateAngles(statement,functionSource,functions,mainTypes,runtimeFunctions):void 0);if(!typedLet&&!okReturn&&!resultReturn&&!gate)fail3("NM-CFN-009",tokenLocation(statement[0]));if(typedLet&&runtimeFunctions.has(bindingName.text))fail3("NM-CFN-004",tokenLocation(bindingName));const prelude=[];let text;if(gate){const bindings3=gate.expressions.map(expression=>{if(provenance.generatedBindings.length>=nmClassicalFunctionLoweringLimits.bindings)fail3("NM-CFN-003");const name2=`__nm_cfn_angle_${runtimeAngles.size}`;provenance.generatedBindings.push(name2);runtimeAngles.set(name2,expression);return name2});text=bindings3.map(name2=>`const ${name2}: Float = 0.0;`).join(" ")+` ${gate.gate}(${[...gate.targets,...bindings3].join(", ")});`;for(const token2 of statement){const fn=callableLocations.get(token2.text);if(fn)provenance.calls.push({name:fn.name,line:token2.range.start.line+1,declarationLine:fn.line})}}else{const rewritten=replaceCalls(statement.slice(typedLet?typedLet.expressionStart:resultReturn?1:3,okReturn?-1:void 0),prelude,0,resultReturn);text=prelude.join(" ")+" "+(typedLet?`let ${mutable?"mut ":""}${bindingName.text}: ${typedLet.type} = ${rewritten};`:`return ok(${rewritten});`)}const offset=statement[0].range.start.offset;const end=token.range.end.offset;patches.push({start:offset,end,text:text+(source.slice(offset,end).match(/\r\n|\r|\n/g)??[]).join("")});for(let j=start;j<=i;j+=1)covered.add(j)}if(mainFunctionBinding(statement))mainTypedBindings.add(bindingName.text);recordMainArithmeticBinding(mutable?[statement[0],...statement.slice(2)]:statement,mainTypes)}});if(checkedWorkspaceCircuits)for(let i=0;i<tokens.length;i++){if(tokens[i].text!=="circuit")continue;const circuit=readNMComputeApplyWorkspaceCircuit(tokens,i);for(let j=i;j<=circuit.close;j++){acceptedMathCalls.add(j);if(runtimeFunctions.has(tokens[j].text)&&tokens[j+1]?.text==="(")covered.add(j)}i=circuit.close}tokens.forEach((token,index)=>{if((isNMFloatMathBuiltinName(token.text)||isNMNumericBuiltinName(token.text)||(isNMComplexBuiltinName(token.text)||isNMAngleConversion(token.text)))&&tokens[index+1]?.text==="("&&!acceptedMathCalls.has(index)&&!named.some(({start,end})=>token.range.start.offset>=start&&token.range.end.offset<=end))fail3("NM-CFN-009",tokenLocation(token));if(token.kind!=="identifier"||!runtimeFunctions.has(token.text)||covered.has(index))return;if(named.some(({start,end})=>token.range.start.offset>=start&&token.range.end.offset<=end))return;fail3("NM-CFN-009",tokenLocation(token))});const lowered=applySourcePatches(source,patches);if(new TextEncoder().encode(lowered+JSON.stringify([...runtimeExpressions,...runtimeAngles,...runtimeConditions,...runtimeTargets])).length>nmClassicalFunctionLoweringLimits.outputBytes)fail3("NM-CFN-003");return{source:lowered,provenance,runtimeExpressions,runtimeAngles,runtimeConditions,runtimeTargets,...circuitArguments.size?{circuitAngleTypes,circuitAngleFunctions:runtimeFunctions}:{},diagnostics:[]}}function isNMComputeApplyNominalContainer(header,bitNames){const text=header.map(token=>token.text).join(" ");if(/^(?:(?:compute|apply)|(?:repeat|sample) [0-9]+|collect < [0-9]+ >|controlled [A-Za-z_]\w* \[ [0-9]+ \])$/u.test(text))return true;if(/^(?:test|snapshot|property) "(?:\\.|[^"\\])*"$/u.test(text))return true;if(/^until \( [A-Za-z_]\w* (?:==|!=) [01] \) max [0-9]+$/u.test(text))return true;if(/^forall [A-Za-z_]\w* in .+ \.\. .+ step .+$/u.test(text))return true;if(/^\( [01](?: , [01])* \) =>$/u.test(text))return true;return/^match \( [A-Za-z_]\w*(?: , [A-Za-z_]\w*)* \)$/u.test(text)&&header.slice(2,-1).filter(token=>token.text!==",").every(token=>bitNames.has(token.text))}function lowerNMNominalMain(source,options,helperSource,parameters=[],workspace,composition,mixed){const{tokens,regions}=readFunctionSource(source),main=regions.find(r=>r.name==="main");const mainHeader=source.slice(main.start,tokens[main.body].range.start.offset),mainResultType=readNMEnumMainResultType(mainHeader,helperSource,workspace);const mainReturnName=mainResultType?mainHeader.replace(/\s/g,"").split("->")[1]:void 0;const graph=workspace?createNMNominalWorkspace(workspace.entrySource,workspace.sources,{enabled:true,moduleVisibility:true}):void 0;const enumMode=!!mainResultType||(graph?graph.modules.some(item=>hasNMEnumResultHelpers(item.source)):hasNMEnumResultHelpers(helperSource))||tokens.slice(main.body+1,main.close).some(t=>t.text==="Result");const typedModule=enumMode?prepareNMEnumRuntimeContext(helperSource,workspace):void 0;const ordinary=graph?enumMode?void 0:compileNMNominalWorkspace(helperSource,workspace.sources,{enabled:true,moduleVisibility:true}):compileNMNominalExecutionModule(helperSource,{enabled:true});const names=graph?{has:name2=>graph.typeScope(workspace.owner).hasRoot(name2)}:{has:name2=>ordinary.scope.hasRoot(name2)};const angleHelper=ordinary?.signatures.some(fn=>isNominalAngleType(fn.returns)||fn.parameters.some(isNominalAngleType));const lossSelectors=indexNMCustomLossSelectors(tokens).selectors.filter(selector=>selector.directive>main.body&&selector.close<main.close);const hasMainHelperCall=tokens.slice(main.body+1,main.close).some((token,i,body)=>body[i+1]?.text==="("&&ordinary?.signatures.some(fn=>fn.name===token.text));const computeApply=options.experimental?.computeApply===true&&(readNMComputeApplySource(source,true).blocks.length>0||mixed?.active===true);const circuitArguments=computeApply?indexNMComputeApplyCircuitArguments(mixed?.effectSource??source,mixed?.quantumModules):new Map;const circuitAngleTypes=new Map([["PI",{kind:"scalar",name:"Float"}],...parameters.map(({name:name2})=>[name2,{kind:"scalar",name:"Float"}])]);if(!computeApply&&!workspace&&!enumMode&&!angleHelper&&!lossSelectors.length&&hasMainHelperCall&&!tokens.slice(main.body+1,main.close).some((t,i,a)=>isNMAngleConversion(t.text)||t.text==="let"&&(a[i+1]?.text==="mut"||a[i+2]?.text===":"&&(names.has(a[i+3]?.text)||["Array","Matrix","Complex","Angle"].includes(a[i+3]?.text)))))return;const patches=regions.filter(r=>r!==main).map(r=>({start:r.start,end:r.end,text:blankSource(source.slice(r.start,r.end))}));if(mixed)patches.push(...mixed.entryPatches);for(const selector of lossSelectors){const start=tokens[selector.directive].range.start.offset,hasSemicolon=tokens[selector.close+1]?.text===";";const end=tokens[selector.close+(hasSemicolon?1:0)].range.end.offset;const name2=(selector.qualifier===void 0?"":tokens[selector.qualifier].text+".")+tokens[selector.member].text;patches.push({start,end,text:`loss:custom(${name2});`+source.slice(start,end).replace(/[^\r\n]/g,"")})}if(mainResultType){const end=tokens[main.body].range.start.offset;patches.push({start:main.start,end,text:`fn main() -> Result<${mainResultType.kind!=="scalar"?"Float":mainResultType.name}, Error> `+source.slice(main.start,end).replace(/[^\r\n]/g,"")})}for(let i=0;i<tokens.length;i++){const region=regions.find(r=>r.start===tokens[i].range.start.offset);if(region){i=region.close;continue}const circuit=composition?.circuits.find(item=>item.start===tokens[i].range.start.offset);if(circuit){if(circuit.prefix)patches.push(circuit.prefix);i=circuit.close;continue}if(workspace&&["pub","public","private"].includes(tokens[i].text)){const start2=tokens[i].range.start.offset,end2=tokens[i].range.end.offset;patches.push({start:start2,end:end2,text:blankSource(source.slice(start2,end2))});continue}if(workspace&&tokens[i].text==="use"&&!composition?.registryImports.has(tokens[i].range.start.offset)){const start2=tokens[i].range.start.offset,target2=tokens[i+3].text;while(i<tokens.length&&tokens[i].text!==";")i++;if(i===tokens.length)throw new Error("Unterminated workspace import");const end2=tokens[i].range.end.offset;patches.push({start:start2,end:end2,text:mixed?`use workspace.${target2};`+source.slice(start2,end2).replace(/[^\r\n]/g,""):blankSource(source.slice(start2,end2))});continue}if(!["record","enum"].includes(tokens[i].text))continue;const start=tokens[i].range.start.offset;while(tokens[i]?.text!=="}")i++;const end=tokens[i].range.end.offset;patches.push({start,end,text:blankSource(source.slice(start,end))})}const bindings3=parameters.map(parameter=>({...parameter})),runtimeExpressions=new Map,runtimeAngles=new Map,runtimeConditions=new Map,generatedBindings=[];if(computeApply&&tokens.slice(main.body+1,main.close).some((token,index,list)=>token.text==="PI"&&list[index-1]?.text!=="."&&list[index+1]?.text!==":"))bindings3.unshift({name:"PI",type:"Float"});const compoundTypes=createNMCompoundTypeRegistry();let expressionLine=tokens[main.body].range.start.line+1;const expression=(text,returns,operation="value")=>{const metadata={moduleSource:helperSource,source:text,bindings:bindings3.map(({name:name2,type})=>({name:name2,type})),returns,...workspace?{workspace}:{}};try{if(enumMode){const result3={kind:"enumResultExpression",...metadata,operation,...mainReturnName?{mainResult:{name:mainReturnName,line:expressionLine}}:{}};enumResultExpressionType(result3);return result3}const result2={kind:"nominalExpression",...metadata};nominalExpressionType(result2);return result2}catch(error){if(error instanceof NMNominalExpressionError){if(error.sourceId&&error.sourceId!==workspace?.owner)throw error;throw new NMNominalExpressionError(error.message,expressionLine,1,error.sourceId)}throw error}};const marker=kind=>{if(generatedBindings.length>=nmClassicalFunctionLoweringLimits.bindings)throw new Error("Nominal binding limit exceeded");const name2=`__nm_cfn_${kind}_${generatedBindings.length}`;generatedBindings.push(name2);return name2};const closeOf=(open,left,right,end)=>{let depth3=1;for(let i=open+1;i<end;i++){if(tokens[i].text===left)depth3++;if(tokens[i].text===right)depth3--;if(depth3===0)return i}throw new Error("Unclosed nominal block")};function visit(from,to,level=0){if(level>=32)throw new Error("Nominal control depth exceeded");let start=from,depth3=0;for(let i=start;i<to;i++){if(i===start)expressionLine=tokens[i].range.start.line+1;if(i===start&&["train","e\u011Fit"].includes(tokens[i].text)&&tokens[i+1]?.text==="{"){i=closeOf(i+1,"{","}",to);start=i+1;continue}if(i===start&&computeApply&&["compute","apply","repeat","sample","collect","controlled","test","snapshot","property","forall","until","match","("].includes(tokens[i].text)){let open=i+1;while(open<to&&!["{",";","}"].includes(tokens[open].text))open++;if(tokens[open]?.text==="{"&&isNMComputeApplyNominalContainer(tokens.slice(i,open),new Set(bindings3.filter(binding=>binding.type==="Bit").map(binding=>binding.name)))){const close=closeOf(open,"{","}",to),size=bindings3.length;if(tokens[i].text==="forall"){const name2=tokens[i+1].text;if(bindings3.some(binding=>binding.name===name2)||names.has(name2)||isNMClassicalFunctionReservedName(name2))throw new Error("Invalid or duplicate forall binding");bindings3.push({name:name2,type:"Float"})}try{visit(open+1,close,level+1)}finally{bindings3.length=size}i=close;start=close+1;continue}}if(i===start&&tokens[i].text==="match"&&typedModule){const match=readNMEnumResultMainMatch(tokens,i,to),type=typedModule.resultExpressionType(match.selector,new Map(bindings3.map(b=>[b.name,b.type])),mainReturnName);const resultName=typedModule.scopeName(type),size=bindings3.length;const temporary=marker("match"),valueKey=marker("result"),conditionKey=marker("condition");runtimeExpressions.set(valueKey,expression(match.selector,resultName));bindings3.push({name:temporary,type:resultName});runtimeConditions.set(conditionKey,expression(temporary,resultName,match.arms[0].kind==="ok"?"isOk":"isError"));const armPrefix=arm=>{if(!arm.binding)return"";if(!/^[A-Za-z_][A-Za-z0-9_]{0,63}$/.test(arm.binding)||isNMClassicalFunctionReservedName(arm.binding)||bindings3.some(b=>b.name===arm.binding)||names.has(arm.binding))throw new Error("Invalid or duplicate main match binding");const key4=marker("result"),bindingType=typedModule.scopeName(arm.kind==="ok"?type.payload:type.error);runtimeExpressions.set(key4,expression(temporary,resultName,arm.kind));bindings3.push({name:arm.binding,type:bindingType});return`let ${arm.binding}: ${["Int","Float","Bool"].includes(bindingType)?bindingType:"Float"} = ${key4};`};const patch=(begin2,end2,text)=>patches.push({start:begin2,end:end2,text:text+source.slice(begin2,end2).replace(/[^\r\n]/g,"")});try{const first=match.arms[0],second=match.arms[1];patch(tokens[i].range.start.offset,tokens[first.open].range.end.offset,`if (true) { let ${temporary}: Float = ${valueKey}; if (${conditionKey}) { ${armPrefix(first)}`);visit(first.open+1,first.close,level+1);bindings3.length=size+1;patch(tokens[first.close].range.start.offset,tokens[second.open].range.end.offset,`} else { ${armPrefix(second)}`);visit(second.open+1,second.close,level+1);patch(tokens[second.close].range.start.offset,tokens[match.close].range.end.offset,"} }")}finally{bindings3.length=size}i=match.close;start=i+1;continue}if(i===start&&["if","else","for"].includes(tokens[i].text)){const kind=tokens[i].text;let open=i+1;if(kind==="if"){if(tokens[open].text!=="(")throw new Error("Expected if condition");const close2=closeOf(open,"(",")",to),key4=marker("condition");runtimeConditions.set(key4,expression(tokens.slice(open+1,close2).map(t=>t.text).join(" "),"Bool"));open=close2+1;if(tokens[open]?.text!=="{")throw new Error("Expected if body");const begin2=tokens[i].range.start.offset,end2=tokens[open].range.end.offset;patches.push({start:begin2,end:end2,text:`if (${key4}) {`+source.slice(begin2,end2).replace(/[^\r\n]/g,"")})}else if(kind==="for"){while(open<to&&tokens[open].text!=="{")open++;if(!/^for [A-Za-z_][A-Za-z0-9_]* in [0-9]+ \.\. [0-9]+$/.test(tokens.slice(i,open).map(t=>t.text).join(" ")))throw new Error("Nominal loops require literal bounds")}else if(tokens[open]?.text!=="{")throw new Error("Expected else body");const close=closeOf(open,"{","}",to),size=bindings3.length;if(kind==="for"){const name2=tokens[i+1].text;if(bindings3.some(b=>b.name===name2))throw new Error("Duplicate loop binding");bindings3.push({name:name2,type:"Int"})}try{visit(open+1,close,level+1)}finally{bindings3.length=size}i=close;start=close+1;continue}if(tokens[i].text==="{")depth3++;if(tokens[i].text==="}")depth3--;if(tokens[i].text!==";"||depth3!==0)continue;let stmt=tokens.slice(start,i);start=i+1;const mutable=stmt[0]?.text==="let"&&stmt[1]?.text==="mut";if(mutable){stmt=[stmt[0],...stmt.slice(2)];const annotation=stmt[2]?.text===":"?mainBindingAnnotation(stmt,3):void 0;if(!annotation||!isNMMutableClassicalType(annotation.valueType))throw new Error("Mutable nominal main bindings require numeric scalars or arrays")}const begin=stmt[0].range.start.offset,end=tokens[i].range.end.offset;expressionLine=stmt[0].range.start.line+1;let circuitCall=nmCircuitInvocationTokens(stmt);const circuitName=mixed?.entryPatches.find(patch=>patch.start===circuitCall[0].range.start.offset)?.text??circuitCall[0].text;const circuitArity=circuitArguments.get(circuitName);if(circuitArity){if(circuitCall[1]?.text===".")circuitCall=[{...circuitCall[0],text:circuitName},...circuitCall.slice(3)];circuitCall=nmCircuitValueTokens(circuitCall);const scope=graph?graph.typeScope(workspace.owner):ordinary.scope;const context=typedModule??prepareNMEnumRuntimeContext(helperSource,workspace);patches.push(...prepareNMComputeApplyCircuitArguments(source,circuitCall,circuitArity,new Map,new Map,runtimeAngles,circuitAngleTypes,generatedBindings,{compile(text){const type=context.scopeName(context.compileMainExpression(text,new Map(bindings3.map(b=>[b.name,b.type])),void 0,mainReturnName).type);if(!["Int","Float","Angle"].includes(type))throw new Error("Circuit angle requires a number or Angle");return{expression:expression(text,type),type:type==="Angle"?{kind:"angle"}:{kind:"scalar",name:type}}},typeEnd(index){const reference=readNMNominalReference(circuitCall,index,scope);if(!reference||!scope.hasRoot(reference.name))return;const type=readNMNominalType(circuitCall,index,scope);if(type?.trailingEquals)throw new Error("Unexpected assignment in circuit type");return type?.end}}));continue}let replacement;if(computeApply&&readNMReadoutBinding(stmt.map(token=>token.text).join(" "))?.kind==="measure_all")continue;const measured=stmt[0].text==="let"&&(stmt[2]?.text==="="&&stmt[3]?.text==="measure"||stmt[2]?.text===":"&&stmt[3]?.text==="Bit"&&stmt[4]?.text==="="&&stmt[5]?.text==="measure");const bitBinding=stmt[0].text==="let"&&stmt[2]?.text===":"&&stmt[3]?.text==="Bit"&&stmt[4]?.text==="="&&!stmt.some(t=>t.text==="?");const assignment=readNMMainAssignment(stmt);if(assignment.candidate){if(!assignment.name||!assignment.value)throw new Error("Invalid main assignment target or expression");const binding=bindings3.find(item=>item.name===assignment.name);if(!binding?.mutable)throw new Error("Assignment requires an earlier mutable main binding");let target2=binding.name,type=binding.type;if(assignment.index){const array3=/^Array<(Int|Float),(\d+)>$/.exec(binding.type);if(!array3)throw new Error("Indexed assignment requires a mutable numeric array");const indexKey=marker("assignment_index");runtimeExpressions.set(indexKey,expression(assignment.index.map(t=>t.text).join(" "),"Int"));target2+=`[${indexKey}]`;type=array3[1]}const key4=marker("assignment");runtimeExpressions.set(key4,expression(assignment.value.map(t=>t.text).join(" "),type));replacement=`${target2} = ${key4};`}else if(stmt[0].text==="return"&&mainResultType){const key4=marker("result");runtimeExpressions.set(key4,expression(stmt.slice(1).map(t=>t.text).join(" "),mainReturnName));replacement=`return ${key4};`}else if(mainResultType&&stmt[0].text==="let"&&stmt[2]?.text==="="&&stmt[3]?.text==="expect"){const name2=stmt[1].text;if(bindings3.some(b=>b.name===name2)||names.has(name2)||isNMClassicalFunctionReservedName(name2))throw new Error("Invalid or duplicate main expectation binding");bindings3.push({name:name2,type:"Float"})}else if(measured||bitBinding){const name2=stmt[1].text;if(bindings3.some(b=>b.name===name2))throw new Error("Duplicate main measurement binding");bindings3.push({name:name2,type:"Bit"})}else if(enumMode&&stmt[0].text==="let"&&stmt[2]?.text===":"&&stmt[3]?.text==="Result"){const name2=stmt[1].text;if(bindings3.some(b=>b.name===name2)||names.has(name2)||isNMClassicalFunctionReservedName(name2))throw new Error("Invalid or duplicate main Result binding");const assign=stmt.findIndex((t,index)=>index>3&&(t.text==="="||t.text===">="));if(assign<0)throw new Error("Expected Result initializer");const type=stmt.slice(3,assign).map(t=>t.text).join("")+(stmt[assign].text===">="?">":""),key4=marker("result");runtimeExpressions.set(key4,expression(stmt.slice(assign+1).map(t=>t.text).join(" "),type));bindings3.push({name:name2,type});replacement=`let ${name2}: Float = ${key4};`}else if(stmt[0].text==="let"&&stmt[2]?.text===":"){const assign=stmt.findIndex((token,index)=>index>3&&(token.text==="="||token.text===">="));if(assign<0)throw new Error("Expected typed main initializer");if(["Array","Matrix","Complex","Angle"].includes(stmt[3]?.text)){const checked3=readNMCompoundType(stmt,3,compoundTypes);if(!checked3||checked3.end!==assign+(stmt[assign].text===">="?1:0))throw new Error("Malformed compound main type")}const name2=stmt[1].text,type=stmt.slice(3,assign).map(t=>t.text).join("")+(stmt[assign].text===">="?">":"");if(bindings3.some(b=>b.name===name2)||names.has(name2)||workspace&&isNMClassicalFunctionReservedName(name2))throw new Error("Duplicate or invalid main binding");const value=expression(stmt.slice(assign+1).map(t=>t.text).join(" "),type);const key4=marker("result");runtimeExpressions.set(key4,value);bindings3.push({name:name2,type,...mutable?{mutable:true}:{}});replacement=`let ${mutable?"mut ":""}${name2}: ${mutable||["Int","Float","Bool"].includes(type)?type:"Float"} = ${key4};`}else if(["Rx","Ry","Rz","P","GPhase"].includes(stmt[0].text)){const scope=graph?graph.typeScope(workspace.owner):ordinary.scope;const args=argumentsOf(stmt,index=>{const reference=readNMNominalReference(stmt,index,scope);if(!reference||!scope.hasRoot(reference.name))return;const type2=readNMNominalType(stmt,index,scope);if(type2?.trailingEquals)throw new Error("Unexpected assignment in gate type");return type2?.end}),expected=stmt[0].text==="GPhase"?1:2;if(args.length!==expected)throw new Error("Invalid gate arity");const angle=args.at(-1);const key4=marker("angle");const text=angle.map(t=>t.text).join(" "),context=typedModule??prepareNMEnumRuntimeContext(helperSource,workspace);const type=context.scopeName(context.compileMainExpression(text,new Map(bindings3.map(b=>[b.name,b.type])),void 0,mainReturnName).type);if(!["Int","Float","Angle"].includes(type))throw new Error("Gate expression requires a number or Angle");runtimeAngles.set(key4,expression(text,type));replacement=`const ${key4}: Float = 0.0; ${stmt[0].text}(${args.slice(0,-1).map(a=>a.map(t=>t.text).join("")).concat(key4).join(",")});`}else if(stmt.some(t=>["{","}"].includes(t.text)))throw new Error("Unsupported nominal main block");if(replacement)patches.push({start:begin,end,text:replacement+source.slice(begin,end).replace(/[^\r\n]/g,"")})}if(start!==to)throw new Error("Incomplete nominal statement")}visit(main.body+1,main.close);const lowered=applySourcePatches(source,patches);if(new TextEncoder().encode(lowered+JSON.stringify([...runtimeExpressions,...runtimeAngles,...runtimeConditions])).length>nmClassicalFunctionLoweringLimits.outputBytes)throw new Error("Nominal output limit exceeded");const workspaceModules=graph?Object.fromEntries(graph.modules.filter(item=>item.name!==graph.entryModule).map(item=>[item.name,item.source])):void 0;return{source:lowered,diagnostics:[],runtimeExpressions,runtimeAngles,runtimeConditions,mainResultType,...circuitArguments.size?{circuitAngleTypes}:{},provenance:{experimental:true,contractVersion:NM_CLASSICAL_FUNCTION_LOWERING_VERSION,originalSource:source,parseOptions:{experimental:{...options.experimental},...workspaceModules?{workspaceModules}:{}},...workspace?{nominalWorkspace:workspace}:{},declarations:[{name:ordinary?.signatures[0]?.name??"main",line:1,source:helperSource}],calls:[],generatedBindings}}}function readNMComputeApplyBodyType(tokens,start,scope,constants){const reference=readNMNominalReference(tokens,start,scope);if(!reference||!scope.hasRoot(reference.name))return void 0;const dimensions=[];let end=reference.end;if(constants.size&&tokens[end]?.text==="<"){const stack=[];for(;end<tokens.length;end++){if(end-start>nmNominalGenericLimits.typeNodes)throw new Error("Type reference resource limit exceeded");const token=tokens[end];if(token.text==="<"){if(stack.length>nmNominalGenericLimits.typeDepth)throw new Error("Type reference resource limit exceeded");stack.push({name:tokens[end-1].text,argument:0})}else if(token.text===">"){stack.pop();if(!stack.length){end++;break}}else if(token.text===",")stack.at(-1).argument++;else{const parent=stack.at(-1);if((parent.name==="Array"&&parent.argument===1||parent.name==="Matrix"&&[1,2].includes(parent.argument))&&token.kind==="identifier"&&constants.has(token.text))dimensions.push(token);else if(!["identifier","number"].includes(token.kind)&&token.text!==".")throw new Error("Invalid type argument")}}if(stack.length)throw new Error("Unclosed type argument")}if(!dimensions.length){const concrete=readNMNominalType(tokens,start,scope);if(!concrete||concrete.trailingEquals)throw new Error("Invalid circuit body type");end=concrete.end}return{end,dimensions}}function specializeNMComputeApplyBodyTypes(tokens,dimensions,bindings3,args){if(args.length!==bindings3.length)throw new Error("Invalid circuit body arguments");const replacements=new Map;for(const token of dimensions){const value=args[bindings3.findIndex(binding=>binding.name===token.text)];if(value?.kind!=="number"||value.numberType!=="Int"||!Number.isSafeInteger(value.value)||value.value<1||value.value>4096)throw new Error("Circuit type dimension requires a positive compile-time integer");replacements.set(token,String(value.value))}return functionTokenText(tokens.map(token=>replacements.has(token)?{...token,text:replacements.get(token)}:token))}function bindNMComputeApplyNominalBodies(source,modules,helperSource,graph,parameters=[]){const functions=new Map;const circuits=indexNMComputeApplyCircuitArguments(source,modules);function bind(text,owner){const{tokens}=readFunctionSource(text),patches=[];const moduleSource=owner?graph.sources[owner]:helperSource;const workspace=graph?snapshotNMWorkspace(graph,owner??graph.entryModule):void 0;const context=prepareNMEnumRuntimeContext(moduleSource,workspace);const scope=graph?graph.typeScope(owner??graph.entryModule):compileNMNominalExecutionModule(helperSource,{enabled:true}).scope;for(let start=0;start<tokens.length;start++){if(tokens[start].text!=="circuit")continue;const circuit=readNMComputeApplyWorkspaceCircuit(tokens,start);let open=start+2;while(tokens[open].text!=="{")open++;const formals=new Map;const constants=new Set;for(let i=start+2;i<open;i++)if(tokens[i].text==="Angle"&&tokens[i-1]?.text===":")formals.set(tokens[i-2].text,"Float");for(let i=start+2;i<open;i++)if(tokens[i].text==="const"&&tokens[i+2]?.text===":"&&tokens[i+3]?.text==="Int"){formals.set(tokens[i+1].text,"Int");constants.add(tokens[i+1].text)}const visible=new Map([...[...formals],...!owner?parameters.map(({name:name2,type})=>[name2,type]):[],["PI","Float"]]);const loops=[];for(let i=open+1;i<circuit.close;i++)if(tokens[i].text==="for"&&tokens[i+2]?.text==="in"){let begin=i+3;while(begin<circuit.close&&tokens[begin].text!=="{")begin++;let end=begin+1,depth3=1;for(;end<circuit.close;end++){if(tokens[end].text==="{")depth3++;if(tokens[end].text==="}"&&--depth3===0)break}if(end===circuit.close)fail3("NM-CFN-002",tokenLocation(tokens[i]));loops.push({name:tokens[i+1].text,open:begin,close:end})}for(let i=open+1;i<circuit.close;i++){if(!["(","<"].includes(tokens[i+1]?.text)||!["{","}",";","adjoint","inverse","@"].includes(tokens[i-1].text))continue;const layout=functionGateAngleLayouts[tokens[i].text];const arity=circuits.get(tokens[i].text);if(!layout&&arity===void 0)continue;const callOpen=nmCircuitCallOpen(tokens.slice(i,circuit.close));if(callOpen<0)fail3("NM-CFN-002",tokenLocation(tokens[i]));let end=i+callOpen+1,depth3=1;for(;end<circuit.close;end++){if(tokens[end].text==="(")depth3++;if(tokens[end].text===")"&&--depth3===0)break}if(end===circuit.close)fail3("NM-CFN-002",tokenLocation(tokens[i]));const call=nmCircuitValueTokens(tokens.slice(i,end+1)),at=tokenLocation(tokens[i]);try{const scoped=new Map(visible),typeConstants=new Set(constants);for(const loop of loops)if(i>loop.open&&i<loop.close){scoped.set(loop.name,"Int");typeConstants.add(loop.name)}const dimensions=[];const args=argumentsOf(call,index=>{const type=readNMComputeApplyBodyType(call,index,scope,typeConstants);if(type)dimensions.push(...type.dimensions);return type?.end});if(args.length!==(layout?layout.targets+layout.angles:arity.parameters.length))fail3("NM-CFN-009",at);const angles=args.filter((_,index)=>layout?index>=layout.targets:arity.parameters[index]==="angle");for(const angle of angles){if(functions.size>=1024)fail3("NM-CFN-003",at);const used=new Set(angle.flatMap((token,index)=>token.kind==="identifier"&&scoped.has(token.text)&&angle[index-1]?.text!=="."&&angle[index+1]?.text!==":"?[token.text]:[]));const bindings3=[...used].map(name3=>({name:name3,type:scoped.get(name3)}));const inputTypes=new Map(bindings3.map(binding=>[binding.name,binding.type]));const compile=expression=>{let returns=context.scopeName(context.compileMainExpression(expression,inputTypes).type);if(!layout&&returns==="Int"){expression=`int_to_float(${expression})`;returns="Float"}if(!["Int","Float","Angle"].includes(returns))fail3("NM-CFN-005",at);return{kind:"enumResultExpression",moduleSource,source:expression,bindings:bindings3,returns,operation:"value",...workspace?{workspace}:{}}};const name2=`__nm_cfn_circuit_body_${functions.size}`;const typeDimensions=dimensions.filter(token=>angle.includes(token));functions.set(name2,typeDimensions.length?{circuitBodyTemplate:args2=>({kind:"circuitAngleExpression",body:compile(specializeNMComputeApplyBodyTypes(angle,typeDimensions,bindings3,args2)),inputs:bindings3.map((binding,index)=>({name:binding.name,value:args2[index]}))})}:{circuitBody:compile(functionTokenText(angle))});const first=angle[0].range.start.offset,last=angle.at(-1).range.end.offset;patches.push({start:first,end:last,text:`${name2}(${bindings3.map(binding=>binding.name==="PI"?String(Math.PI):binding.name).join(",")})`+text.slice(first,last).replace(/[^\r\n]/gu,"")})}}catch(error){if(error instanceof FunctionIssue)throw error;fail3("NM-CFN-005",at)}i=end}start=circuit.close}return applySourcePatches(text,patches)}const entry=bind(source);const quantumModules=modules?Object.fromEntries(Object.entries(modules).map(([owner,text])=>[owner,bind(text,owner)])):void 0;return{source:entry,...quantumModules?{quantumModules}:{},circuitAngleFunctions:functions}}function lowerNMSourceFunctions(source,options){let workspaceMode=false;try{workspaceMode=needsNMNominalWorkspace(source,options.workspaceModules)}catch(error){if(error instanceof NMNominalWorkspaceIssue)return{source:"",diagnostics:[{...error.diagnostic,message:error.diagnostic.message.en,severity:"error",translationKey:`nominalTypes.${error.diagnostic.code}`}]};if(error instanceof FunctionIssue)return{source:"",diagnostics:[functionDiagnostic(error)]};throw error}const diagnostics=validateNMNominalFrontend(source,options.experimental?.classicalFunctions===true&&options.experimental?.typedClassicalValues===true);if(!workspaceMode&&!diagnostics.length)return lowerNMClassicalFunctions(source,options);if(!workspaceMode&&diagnostics[0].code!=="NM-NOM-006")return{source:"",diagnostics};try{const mixed=workspaceMode?linkNMComputeApplyNominalWorkspace(source,options):void 0;const composition=mixed?.composition??readNMComputeApplyNominalDeclarations(source,options);const helperModules=mixed?.helperModules??options.workspaceModules;if(workspaceMode)validateNMNominalQuantumNames(composition,createNMNominalWorkspace(mixed?.helperEntry??composition?.helperSource??source,helperModules,{enabled:options.experimental?.classicalFunctions===true&&options.experimental?.typedClassicalValues===true,moduleVisibility:options.experimental?.moduleVisibility}));const{tokens,regions}=readFunctionSource(source),mains=regions.filter(region=>region.name==="main");if(mains.length!==1)throw new Error("Nominal source requires one main");const main=mains[0];if(tokens.some(token=>token.kind==="identifier"&&token.text.startsWith("__nm_cfn_")))throw new Error("Reserved compiler name");const mainHeader=tokens.filter(token=>token.range.start.offset>=main.start&&token.range.start.offset<tokens[main.body].range.start.offset);if(mainHeader.slice(0,4).map(token=>token.text).join(" ")!=="fn main ( )"||mainHeader.length>4&&(mainHeader[4]?.text!=="->"||mainHeader[5]?.text!=="Result"))throw new Error("Nominal source requires an ordinary or supported typed Result main signature");const helperPatches=[{start:main.start,end:main.end,text:blankSource(source.slice(main.start,main.end))},...composition?.helperPatches??[]];const parameterBindings=[];for(let i=0;i<tokens.length;i++){const region=regions.find(r=>r.start===tokens[i].range.start.offset);if(region){i=region.close;continue}if(tokens[i].text==="{"){let depth3=1;while(++i<tokens.length&&depth3){if(tokens[i].text==="{")depth3++;if(tokens[i].text==="}")depth3--}i--;continue}if(tokens[i].text==="param"){const begin=i;if(tokens[i+1]?.kind!=="identifier"||tokens[i+2]?.text!==":"||tokens[i+3]?.text!=="Angle"||tokens[i+4]?.text!=="=")throw new Error("Nominal parameters require Angle declarations");const name2=tokens[i+1].text;if(parameterBindings.some(binding=>binding.name===name2))throw new Error("Duplicate nominal parameter");parameterBindings.push({name:name2,type:"Float"});while(i<tokens.length&&tokens[i].text!==";")i++;if(i===tokens.length)throw new Error("Unterminated nominal parameter");const start3=tokens[begin].range.start.offset,end2=tokens[i].range.end.offset;helperPatches.push({start:start3,end:end2,text:blankSource(source.slice(start3,end2))});continue}if(tokens[i].text!=="@"||!["target","seed","shots","optimize","dataset"].includes(tokens[i+1]?.text))continue;const start2=tokens[i].range.start.offset;while(i<tokens.length&&tokens[i].text!==";")i++;if(i===tokens.length)throw new Error("Unterminated nominal runtime directive");const end=tokens[i].range.end.offset;helperPatches.push({start:start2,end,text:blankSource(source.slice(start2,end))})}const helperSource=applySourcePatches(source,helperPatches);const workspaceGraph=workspaceMode?createNMNominalWorkspace(helperSource,helperModules,{enabled:true,moduleVisibility:options.experimental?.moduleVisibility}):void 0;const nominalMain=lowerNMNominalMain(source,options,helperSource,parameterBindings,workspaceGraph?snapshotNMWorkspace(workspaceGraph,workspaceGraph.entryModule):void 0,composition,mixed);if(nominalMain){if(mixed&&nominalMain.provenance)nominalMain.provenance.parseOptions.workspaceModules=mixed.originalModules;const bodies=nominalMain.circuitAngleTypes?bindNMComputeApplyNominalBodies(nominalMain.source,mixed?.quantumModules,helperSource,workspaceGraph,parameterBindings):void 0;return{...nominalMain,...mixed?{quantumModules:mixed.quantumModules}:{},...bodies}}const compiled=compileNMNominalExecutionModule(helperSource,{enabled:true});const scalar4=type=>type==="Float"||type==="Int"||type==="Bool";const functions=new Map;for(const signature of compiled.signatures)if(scalar4(signature.returns)&&signature.parameters.every(scalar4))functions.set(signature.name,{source:helperSource,returns:signature.returns});const patches=regions.filter(region=>region!==main).map(region=>({start:region.start,end:region.end,text:blankSource(source.slice(region.start,region.end))}));for(let i=0;i<tokens.length;i++){const region=regions.find(region2=>region2.start===tokens[i].range.start.offset);if(region){i=region.close;continue}if(tokens[i].text!=="record"&&tokens[i].text!=="enum")continue;const begin=i;while(i<tokens.length&&tokens[i].text!=="}")i++;if(i===tokens.length)throw new Error("Invalid nominal declaration");const start2=tokens[begin].range.start.offset,end=tokens[i].range.end.offset;patches.push({start:start2,end,text:blankSource(source.slice(start2,end))})}const floatBindings=new Set,generatedBindings=[];const runtimeExpressions=new Map,runtimeAngles=new Map,calls=[];let start=main.body+1;for(let i=start;i<main.close;i++){if(i===start&&tokens[i].text==="train"&&tokens[i+1]?.text==="{"){let depth3=1;i++;while(++i<main.close&&depth3){if(tokens[i].text==="{")depth3++;if(tokens[i].text==="}")depth3--}if(depth3)throw new Error("Unclosed nominal train block");i--;start=i+1;continue}if(tokens[i].text==="{"||tokens[i].text==="}")throw new Error("Nested main blocks are not supported with nominal helpers yet");if(tokens[i].text!==";")continue;const statement=tokens.slice(start,i);start=i+1;const callTokens=statement.filter((token,index)=>compiled.signatures.some(fn=>fn.name===token.text)&&statement[index+1]?.text==="(");if(["Rx","Ry","Rz","P","GPhase"].includes(statement[0]?.text)){const args=argumentsOf(statement),expected=statement[0].text==="GPhase"?1:2;if(args.length!==expected)throw new Error("Invalid gate argument count");const angle=args.at(-1);if(args.slice(0,-1).flat().some(token=>compiled.signatures.some(fn=>fn.name===token.text)))throw new Error("Nominal helper calls cannot select qubit targets");if(callTokens.length||angle.some(token=>floatBindings.has(token.text))){const expression2=parseNMTypedClassicalExpressionSource(angle.map(token=>token.text).join(" "),functions);if(!expression2)throw new Error("Invalid nominal gate angle expression");const marker=`__nm_cfn_angle_${generatedBindings.length}`;generatedBindings.push(marker);runtimeAngles.set(marker,expression2);const begin2=statement[0].range.start.offset,end2=statement.at(-1).range.end.offset;const prefix2=statement.slice(0,statement.indexOf(angle[0])).map(token=>token.text).join("");patches.push({start:begin2,end:tokens[i].range.end.offset,text:`const ${marker}: Float = 0.0; ${prefix2} ${marker});`+source.slice(begin2,end2).replace(/[^\r\n]/g,"")});for(const token of callTokens){const declaration=regions.find(region=>region.name===token.text);calls.push({name:token.text,line:token.range.start.line+1,declarationLine:tokens.find(item=>item.range.start.offset===declaration.start).range.start.line+1})}}continue}if(!callTokens.length)continue;if(statement[0]?.text!=="let"||statement[1]?.kind!=="identifier"||statement[2]?.text!==":"||!scalar4(statement[3]?.text)||statement[4]?.text!=="=")throw new Error("Nominal calls currently require a scalar let initializer");const name2=statement[1].text;if(runtimeExpressions.has(name2))throw new Error("Duplicate nominal main binding");const exprTokens=statement.slice(5);const expression=parseNMTypedClassicalExpressionSource(exprTokens.map(token=>token.text).join(" "),functions);if(!expression)throw new Error("Invalid nominal scalar expression");runtimeExpressions.set(name2,expression);if(statement[3].text==="Float")floatBindings.add(name2);const begin=exprTokens[0].range.start.offset,end=exprTokens.at(-1).range.end.offset;const placeholder=statement[3].text==="Bool"?"false":statement[3].text==="Int"?"0":"0.0";patches.push({start:begin,end,text:placeholder+source.slice(begin,end).replace(/[^\r\n]/g,"")});for(const token of callTokens){const declaration=regions.find(region=>region.name===token.text);calls.push({name:token.text,line:token.range.start.line+1,declarationLine:tokens.find(item=>item.range.start.offset===declaration.start).range.start.line+1})}}if(!runtimeExpressions.size&&!runtimeAngles.size)throw new Error("No supported nominal scalar call in main");const lowered=applySourcePatches(source,patches);const provenance={experimental:true,contractVersion:NM_CLASSICAL_FUNCTION_LOWERING_VERSION,declarations:[{name:compiled.signatures[0].name,line:1,source:helperSource}],calls,generatedBindings,originalSource:source,parseOptions:{experimental:{...options.experimental}}};return{source:lowered,diagnostics:[],provenance,runtimeExpressions,runtimeAngles}}catch(error){if(error instanceof NMCircuitLibraryIssue)return{source:"",diagnostics:[error.diagnostic]};if(error instanceof NMNominalWorkspaceIssue)return{source:"",diagnostics:[{...error.diagnostic,message:error.diagnostic.message.en,severity:"error",translationKey:`nominalTypes.${error.diagnostic.code}`}]};if(error instanceof FunctionIssue)return{source:"",diagnostics:[functionDiagnostic(error)]};return{source:"",diagnostics:[{...diagnostics[0]??{code:"NM-NOM-006",severity:"error",line:1,column:1,translationKey:"nominalTypes.NM-NOM-006"},...error instanceof NMNominalExpressionError?{line:error.line,column:error.column,...error.sourceId?{sourceId:error.sourceId}:{}}:{},message:error instanceof Error?error.message:"Invalid nominal workspace source"}]}}}function attachClassicalFunctionRuntimeExpressions(statements,expressions,angles,conditions,targets){for(const statement of statements){if(statement.kind==="computeApply")attachClassicalFunctionRuntimeExpressions(computeApplyStatements(statement),expressions,angles,conditions,targets);if(statement.kind==="gate"){for(const target2 of statement.targets){if(target2.classicalIndex?.kind==="ref"){const expression=targets?.get(target2.classicalIndex.name);if(expression)target2.classicalIndex=expression}}const names=statement.angleNames??(statement.thetaName?[statement.thetaName]:[]);if(names.some(name2=>angles?.has(name2))){const values2=names.map(name2=>angles?.get(name2));if(values2.every(value=>value!==void 0))statement.classicalAngles=values2}}else if(statement.kind==="classicalDecl"){const expression=statement.expression.kind==="ref"&&statement.expression.name.startsWith("__nm_cfn_result_")&&expressions?.get(statement.expression.name)||expressions?.get(statement.name);if(expression){statement.expression=expression;if(expression.kind==="enumResultExpression")statement.valueType=enumResultExpressionType(expression);if(expression.kind==="nominalExpression")statement.valueType=nominalExpressionType(expression)}}if(statement.kind==="return"&&statement.functionResult&&statement.functionResult.kind!=="error"&&statement.functionResult.expression.kind==="ref"&&statement.functionResult.expression.name.startsWith("__nm_cfn_result_")){const expression=expressions?.get(statement.functionResult.expression.name);if(expression)statement.functionResult.expression=expression}if(statement.kind==="classicalMatchResult"){if(statement.selector.kind==="ref"){const expression=expressions?.get(statement.selector.name);if(expression)statement.selector=expression}attachClassicalFunctionRuntimeExpressions(statement.okBody,expressions,angles,conditions,targets);attachClassicalFunctionRuntimeExpressions(statement.errorBody,expressions,angles,conditions,targets)}if(statement.kind==="classicalAssign"){if(statement.expression.kind==="ref")statement.expression=expressions?.get(statement.expression.name)??statement.expression;if(typeof statement.index==="object"&&statement.index.kind==="ref")statement.index=expressions?.get(statement.index.name)??statement.index}if(statement.kind==="if"){if(statement.condition?.kind==="ref"){const condition=conditions?.get(statement.condition.name);if(condition)statement.condition=condition}attachClassicalFunctionRuntimeExpressions(statement.body,expressions,angles,conditions,targets);attachClassicalFunctionRuntimeExpressions(statement.elseBody??[],expressions,angles,conditions,targets)}else if(["until","observe","test","snapshot","classicalFor"].includes(statement.kind)&&"body"in statement){attachClassicalFunctionRuntimeExpressions(statement.body,expressions,angles,conditions,targets)}else if(statement.kind==="match"||statement.kind==="property"){statement.cases.forEach(item=>attachClassicalFunctionRuntimeExpressions(item.body,expressions,angles,conditions,targets))}}}var projectedCarrier=Symbol("nm-classical-function-projected-carrier");function classicalFunctionCarrierOptions(options){return{...options,[projectedCarrier]:true}}function isClassicalFunctionCarrier(options){return options[projectedCarrier]===true}function coefficientProvenance(source,sign){const expression=source.trim().replace(/\*\s*$/,"").trim().replace(/([A-Za-z_]\w*)\s*\[\s*(\d+)\s*\]/g,"$1_$2");if(!/[A-Za-z_]/.test(expression))return{};return{coefficientExpression:sign<0?`-(${expression})`:expression}}function qubitRefKey(ref2){return ref2.index==null?ref2.register:`${ref2.register}[${ref2.index}]`}function qubitIdentity(ref2){return ref2.resolvedIndex==null?qubitRefKey(ref2):`#${ref2.resolvedIndex}`}function flattenStatements(statements){const flat=[];for(const statement of statements){flat.push(statement);if(statement.kind==="computeApply"){flat.push(...computeApplyProjection(statement))}else if(statement.kind==="if"){flat.push(...flattenStatements(statement.body));if(statement.elseBody){flat.push(...flattenStatements(statement.elseBody))}}else if(statement.kind==="classicalMatchResult"){flat.push(...flattenStatements(statement.okBody),...flattenStatements(statement.errorBody))}else if(["until","classicalFor","observe","test","snapshot"].includes(statement.kind)&&"body"in statement){flat.push(...flattenStatements(statement.body))}else if(statement.kind==="match"){for(const matchCase of statement.cases){flat.push(...flattenStatements(matchCase.body))}}else if(statement.kind==="property"){for(const propertyCase of statement.cases){flat.push(...flattenStatements(propertyCase.body))}}}return flat}function addPauliTargets(targets,factors){for(const factor of factors){targets.add(qubitRefKey(factor.target))}}function addMetricTargets(targets,expression){if(expression.kind!=="expectation"){return}for(const term of expression.terms){addPauliTargets(targets,term.factors)}}function getStatementTargets(statement,qregSizes){const targets=new Set;if(statement.kind==="gate"){for(const target2 of statement.targets){if(target2.classicalIndex){for(let index=0;index<(qregSizes[target2.register]??0);index+=1)targets.add(`${target2.register}[${index}]`)}else targets.add(qubitRefKey(target2))}}else if(statement.kind==="measurement"||statement.kind==="reset"){targets.add(qubitRefKey(statement.target))}else if(statement.kind==="measurement-binding"){if(!isBoundedNMMeasurementSlice(statement.operand.start,statement.operand.endInclusive))return[];for(let index=statement.operand.start;index<=statement.operand.endInclusive;index+=1){targets.add(`${statement.operand.register}[${index}]`)}}else if(statement.kind==="assertBranchInvariant"){if(statement.target.index!=null){targets.add(`${statement.target.register}[${statement.target.index}]`)}else{const size=qregSizes[statement.target.register]??0;for(let index=0;index<size;index+=1){targets.add(`${statement.target.register}[${index}]`)}}}else if(statement.kind==="syndrome"){addPauliTargets(targets,statement.factors)}else if(statement.kind==="expectation"||statement.kind==="assertExpectation"||statement.kind==="assertExpectationRange"){for(const term of statement.terms){addPauliTargets(targets,term.factors)}}else if(statement.kind==="metric"){addMetricTargets(targets,statement.expression)}else if(statement.kind==="assertEntangled"){for(const target2 of statement.targets){targets.add(qubitRefKey(target2))}}else if(statement.kind==="encode"){const size=qregSizes[statement.register]??0;for(let index=0;index<size;index+=1){targets.add(`${statement.register}[${index}]`)}}return[...targets]}function findDuplicateGateTarget(gate){if(gate.targets.length<2){return void 0}const seen=new Map;for(const target2 of gate.targets){if(target2.classicalIndex)continue;const identity=qubitIdentity(target2);const key4=qubitRefKey(target2);if(seen.has(identity)){return key4}seen.set(identity,key4)}return void 0}function createGateAliasDiagnostic(gate,qubit3){return createDiagnostic({code:"NM-SEM-001",severity:"error",message:`Gate ${gate.gate} uses ${qubit3} more than once.`,hint:"Multi-qubit gates need distinct physical qubits for each operand.",translationKey:"semanticGateQubitAlias",translationValues:{gate:gate.gate,qubit:qubit3},line:gate.line})}function createGateAfterMeasurementDiagnostic(gate,qubit3,strict){return createDiagnostic({code:"NM-SEM-002",severity:strict?"error":"warning",message:`Gate ${gate.gate} touches ${qubit3} after it was measured.`,hint:"A measured qubit has collapsed to a classical outcome; use reset before more quantum gates if you want a fresh |0> state.",translationKey:"semanticGateAfterMeasurement",translationValues:{gate:gate.gate,qubit:qubit3},line:gate.line})}function createUnusedQubitDiagnostic(qubit3,line,strict){return createDiagnostic({code:"NM-SEM-003",severity:strict?"error":"warning",message:`Allocated qubit ${qubit3} is never used.`,hint:"Remove the unused qubit or include it in a gate, measurement, expectation, reset, or encode step.",translationKey:"semanticUnusedQubit",translationValues:{qubit:qubit3},line})}function checkSemantics(program){const diagnostics=[];const strict=program.semantics?.mode==="strict";const statements=flattenStatements(program.statements);const qregSizes={};const qregLines={};const usedTargets=new Set;const measuredTargets=new Set;for(const statement of statements){if(statement.kind==="qreg"){qregSizes[statement.name]=statement.size;qregLines[statement.name]=statement.line;continue}const statementTargets=getStatementTargets(statement,qregSizes);for(const target2 of statementTargets){usedTargets.add(target2)}if(statement.kind==="measurement"){measuredTargets.add(qubitRefKey(statement.target));continue}if(statement.kind==="measurement-binding"){for(const target2 of statementTargets)measuredTargets.add(target2);continue}if(statement.kind==="reset"){measuredTargets.delete(qubitRefKey(statement.target));continue}if(statement.kind!=="gate"){continue}const duplicateTarget=findDuplicateGateTarget(statement);if(duplicateTarget){diagnostics.push(createGateAliasDiagnostic(statement,duplicateTarget))}for(const target2 of statement.targets){const key4=qubitRefKey(target2);if(measuredTargets.has(key4)){diagnostics.push(createGateAfterMeasurementDiagnostic(statement,key4,strict))}}}for(const[register,size]of Object.entries(qregSizes)){for(let index=0;index<size;index+=1){const qubit3=`${register}[${index}]`;if(!usedTargets.has(qubit3)){diagnostics.push(createUnusedQubitDiagnostic(qubit3,qregLines[register]??1,strict))}}}return diagnostics}function findNMMainImperativeStatement(statements){for(const statement of statements){if(statement.kind==="classicalAssign"||statement.kind==="classicalFor"||statement.kind==="classicalDecl"&&statement.mutable)return statement;const nested=findNMMainImperativeStatement(statement.body??[])??findNMMainImperativeStatement(statement.elseBody??[]);if(nested)return nested;for(const entry of statement.cases??[]){const found=findNMMainImperativeStatement(entry.body);if(found)return found}}return void 0}var NM_MAIN_IMPERATIVE_TRANSFORM_UNSUPPORTED="NM-CFN-011: This transformation cannot preserve main mutable locals, assignment, or bounded runtime loops. Keep the N/M source or JSON IR carrier.";function resolvedIndices(refs){return refs.map(ref2=>ref2.resolvedIndex).filter(index=>index!=null)}function gateWidth(gate){if(gate.targets.length>=3){return 3}if(gate.targets.length===2){return 2}return 1}function isNearInteger(value){return Math.abs(value-Math.round(value))<1e-9}function rotationTCost(gate){const theta=gate.theta;if(theta==null){return{tCount:8,tDepth:2,clifford:false}}const quarterTurns=theta/(Math.PI/2);if(isNearInteger(quarterTurns)){return{tCount:0,tDepth:0,clifford:true}}const eighthTurns=theta/(Math.PI/4);if(isNearInteger(eighthTurns)){return{tCount:1,tDepth:1,clifford:false}}return{tCount:8,tDepth:2,clifford:false}}function classifyGateForFTQC(gate){switch(gate.gate){case"T":case"Tdg":return{tCount:1,tDepth:1,clifford:false};case"CCNOT":case"CSWAP":return{tCount:7,tDepth:3,clifford:false};case"Rx":case"Ry":case"Rz":case"P":case"RXX":case"RYY":case"RZZ":case"CRy":case"CRz":case"CP":return rotationTCost(gate);case"U":return{tCount:24,tDepth:6,clifford:false};default:return{tCount:0,tDepth:0,clifford:true}}}function estimateNMResources(program,qubits){const distance=program.estimate?.distance??7;const surfaceCodeOverhead=2*distance*distance;const estimate={qubits,statements:0,gates:0,singleQubitGates:0,twoQubitGates:0,threeQubitGates:0,measurements:0,resets:0,barriers:0,assertions:0,expectations:0,metrics:0,gradients:0,encodings:0,observations:0,tests:0,properties:0,snapshots:0,shows:0,expectationTerms:0,conditionals:0,depth:0,ftqcEnabled:Boolean(program.estimate),logicalGates:0,logicalQubits:qubits,cliffordCount:0,tCount:0,tDepth:0,codeDistance:distance,surfaceCodeOverhead,physicalQubits:qubits>0?surfaceCodeOverhead*qubits:0,magicStates:0,estimatedRuntimeMs:0,...program.estimate?.targetError!=null?{targetError:program.estimate.targetError}:{}};const layerByQubit=new Array(Math.max(0,qubits)).fill(0);const bounded=Boolean(findNMMainImperativeStatement(program.statements));let visits=0;const consume=()=>{if(!bounded||++visits<=nmClassicalFunctionLimits.evaluationSteps)return true;estimate.incomplete={reason:"main-loop-budget",maximumVisits:nmClassicalFunctionLimits.evaluationSteps};return false};const addDepth=indices=>{const touched=[...new Set(indices)].filter(index=>index>=0&&index<layerByQubit.length);if(touched.length===0){return}const layer=Math.max(...touched.map(index=>layerByQubit[index]))+1;touched.forEach(index=>{layerByQubit[index]=layer});estimate.depth=Math.max(estimate.depth,layer)};const visit=statements=>{for(const statement of statements){if(!consume())return;switch(statement.kind){case"computeApply":visit(computeApplyProjection(statement));continue;case"qreg":case"const":case"param":case"explain":case"return":continue;case"bitAssign":case"classicalAssign":estimate.statements+=1;continue;case"classicalDecl":if(statement.mutable)estimate.statements+=1;continue;case"classicalFor":estimate.statements+=1;for(let index=statement.start;index<statement.end;index++){if(!consume())return;visit(statement.body);if(estimate.incomplete)return}continue;case"classicalMatchResult":estimate.statements+=1;estimate.conditionals+=1;continue;case"gate":{estimate.statements+=1;estimate.gates+=1;estimate.logicalGates+=1;const width=gateWidth(statement);if(width===1){estimate.singleQubitGates+=1}else if(width===2){estimate.twoQubitGates+=1}else{estimate.threeQubitGates+=1}const ftqcCost=classifyGateForFTQC(statement);estimate.tCount+=ftqcCost.tCount;estimate.tDepth+=ftqcCost.tDepth;if(ftqcCost.clifford){estimate.cliffordCount+=1}addDepth(statement.targets.some(target2=>target2.classicalIndex)?layerByQubit.map((_,index)=>index):resolvedIndices(statement.targets));continue}case"measurement":estimate.statements+=1;estimate.measurements+=1;addDepth(resolvedIndices([statement.target]));continue;case"measurement-binding":estimate.statements+=1;estimate.measurements+=statement.width;addDepth(statement.operand.resolvedIndices??[]);continue;case"assertBranchInvariant":estimate.statements+=1;estimate.assertions+=1;continue;case"syndrome":estimate.statements+=1;estimate.measurements+=1;addDepth(resolvedIndices(statement.factors.map(factor=>factor.target)));continue;case"reset":estimate.statements+=1;estimate.resets+=1;addDepth(resolvedIndices([statement.target]));continue;case"barrier":estimate.statements+=1;estimate.barriers+=1;continue;case"assertProbability":estimate.statements+=1;estimate.assertions+=1;continue;case"assertExpectation":estimate.statements+=1;estimate.assertions+=1;estimate.expectationTerms+=statement.terms.length;addDepth(resolvedIndices(statement.terms.flatMap(term=>term.factors.map(factor=>factor.target))));continue;case"assertExpectationRange":estimate.statements+=1;estimate.assertions+=1;estimate.expectationTerms+=statement.terms.length;addDepth(resolvedIndices(statement.terms.flatMap(term=>term.factors.map(factor=>factor.target))));continue;case"assertEntangled":estimate.statements+=1;estimate.assertions+=1;continue;case"assertFidelity":estimate.statements+=1;estimate.assertions+=1;continue;case"assertEquivalent":estimate.statements+=1;estimate.assertions+=1;continue;case"assertResource":estimate.statements+=1;estimate.assertions+=1;continue;case"expectation":estimate.statements+=1;estimate.expectations+=1;estimate.expectationTerms+=statement.terms.length;addDepth(resolvedIndices(statement.terms.flatMap(term=>term.factors.map(factor=>factor.target))));continue;case"metric":estimate.statements+=1;estimate.metrics+=1;if(statement.expression.kind==="expectation"){estimate.expectationTerms+=statement.expression.terms.length;addDepth(resolvedIndices(statement.expression.terms.flatMap(term=>term.factors.map(factor=>factor.target))))}continue;case"gradient":estimate.statements+=1;estimate.gradients+=1;continue;case"encode":estimate.statements+=1;estimate.encodings+=1;continue;case"observe":estimate.statements+=1;estimate.observations+=1;visit(statement.body);continue;case"test":estimate.statements+=1;estimate.tests+=1;visit(statement.body);continue;case"property":estimate.statements+=1;estimate.properties+=1;statement.cases.forEach(propertyCase=>visit(propertyCase.body));continue;case"snapshot":estimate.statements+=1;estimate.snapshots+=1;visit(statement.body);continue;case"show":estimate.statements+=1;estimate.shows+=1;continue;case"if":estimate.statements+=1;estimate.conditionals+=1;visit(statement.body);if(statement.elseBody){visit(statement.elseBody)}continue;case"until":estimate.statements+=1;estimate.conditionals+=1;visit(statement.body);continue;case"match":estimate.statements+=1;estimate.conditionals+=1;statement.cases.forEach(matchCase=>visit(matchCase.body));continue;default:continue}}};visit(program.statements);if(!estimate.incomplete&&hasNMMainResult(program.statements))estimate.incomplete={reason:"main-result-control"};if(!estimate.incomplete&&hasNMMainDynamicTarget(program.statements))estimate.incomplete={reason:"dynamic-qubit-target"};estimate.magicStates=estimate.tCount;const physicalGateTimeNs=program.estimate?.physicalGateTimeNs??1e3;estimate.estimatedRuntimeMs=Number.parseFloat(((estimate.depth+estimate.tDepth*estimate.codeDistance)*physicalGateTimeNs/1e6).toFixed(6));return estimate}var nmTargetProfiles=[{id:"browser-statevector",label:"Browser state-vector",description:"Local educational simulator profile used by the playground runtime.",nativeGates:["H","X","Y","Z","S","T","Sdg","Tdg","P","U","GPhase","Rx","Ry","Rz","CNOT","CZ","SWAP","iSWAP","CCNOT","CSWAP","CY","CH","RXX","RYY","RZZ","CRy","CRz","CP"],maxQubits:14,recommendedMaxDepth:64,recommendedMaxTwoQubitGates:32,connectivity:"all-to-all"},{id:"browser-mps",label:"Browser Matrix Product State (MPS)",description:"Tensor network simulator profile for 50-100 qubit low-entanglement circuits.",nativeGates:["H","X","Y","Z","S","T","Sdg","Tdg","P","U","GPhase","Rx","Ry","Rz","CNOT","CZ","CY","CH","SWAP","iSWAP","CCNOT","CSWAP","CRy","CRz","CP"],maxQubits:100,recommendedMaxDepth:512,recommendedMaxTwoQubitGates:256,connectivity:"all-to-all"},{id:"browser-stabilizer",label:"Browser stabilizer",description:"Clifford-only tableau simulator profile for large educational circuits in the browser.",nativeGates:nmStabilizerNativeGates,maxQubits:nmStabilizerMaxQubits,recommendedMaxDepth:2048,recommendedMaxTwoQubitGates:1024,connectivity:"all-to-all"},{id:"openqasm3-stdgates",label:"OpenQASM 3 stdgates",description:"Portable OpenQASM 3.0 carrier profile lowered to the standard gate library.",nativeGates:["H","X","Y","Z","S","T","Sdg","Tdg","P","U","GPhase","Rx","Ry","Rz","CNOT","CZ","CY","CH","SWAP","CCNOT","CSWAP","CRy","CRz","CP"],maxQubits:5,recommendedMaxDepth:256,recommendedMaxTwoQubitGates:128,connectivity:"all-to-all"},{id:"ion-trap",label:"Ion trap",description:"All-to-all educational profile with native rotations and entangling gates.",nativeGates:["H","X","Y","Z","S","Sdg","P","U","Rx","Ry","Rz","RXX","RYY","CNOT","CRy","CRz"],maxQubits:5,recommendedMaxDepth:48,recommendedMaxTwoQubitGates:16,connectivity:"all-to-all"},{id:"superconducting",label:"Superconducting",description:"Line-connectivity profile that highlights non-local two-qubit operations.",nativeGates:["H","X","Y","Z","S","T","Sdg","Tdg","P","U","Rx","Ry","Rz","RZZ","CNOT","CZ","CP"],maxQubits:5,recommendedMaxDepth:24,recommendedMaxTwoQubitGates:8,connectivity:"line"},{id:"neutral-atom",label:"Neutral atom",description:"Grid-style educational profile with native Rydberg-style controlled-Z intuition.",nativeGates:["H","X","Y","Z","P","Ry","Rz","CZ","CCNOT","CSWAP"],maxQubits:5,recommendedMaxDepth:32,recommendedMaxTwoQubitGates:12,connectivity:"grid"}];var profileById=new Map(nmTargetProfiles.map(profile=>[profile.id,profile]));function getNMTargetProfile(id){return profileById.get(id)}function visitStatements2(statements,visit){for(const statement of statements){visit(statement);if(statement.kind==="computeApply"){visitStatements2(computeApplyProjection(statement),visit)}else if(statement.kind==="if"){visitStatements2(statement.body,visit);if(statement.elseBody){visitStatements2(statement.elseBody,visit)}}else if(statement.kind==="classicalMatchResult"){visitStatements2(statement.okBody,visit);visitStatements2(statement.errorBody,visit)}else if(statement.kind==="classicalFor"||statement.kind==="until"){visitStatements2(statement.body,visit)}else if(statement.kind==="match"){statement.cases.forEach(matchCase=>visitStatements2(matchCase.body,visit))}}}function gateDistance(gate){const indices=gate.targets.map(target2=>target2.resolvedIndex).filter(index=>index!=null);if(indices.length<2){return void 0}return Math.max(...indices)-Math.min(...indices)}function lineRoutingSketch(gate){if(gate.targets.length!==2){return void 0}const[anchor,mover]=gate.targets.map(target2=>target2.resolvedIndex);if(anchor==null||mover==null||Math.abs(anchor-mover)<=1){return void 0}const swaps=[];const step=mover>anchor?-1:1;const adjacent=anchor+(mover>anchor?1:-1);for(let cursor=mover;cursor!==adjacent;cursor+=step){const next=cursor+step;swaps.push(`SWAP(q[${Math.min(cursor,next)}], q[${Math.max(cursor,next)}]);`)}const routedGate=`${gate.gate}(q[${anchor}], q[${adjacent}]${gate.theta!=null?`, ${Number.parseFloat(gate.theta.toFixed(6)).toString()}`:""});`;return[...swaps,routedGate,...swaps.slice().reverse()].join(" ")}function analyzeTargetProfile(program,qubits,diagnostics){const resources=estimateNMResources(program,qubits);if(resources.incomplete)diagnostics.push(createDiagnostic({code:"NM-RUNTIME-006",severity:program.constraints?.maxDepth!=null||program.constraints?.maxTwoQubit!=null||resources.incomplete.reason!=="main-loop-budget"&&(program.constraints?.connectivity==="line"||program.target&&getNMTargetProfile(program.target)?.connectivity==="line")?"error":"warning",message:resources.incomplete.reason==="main-loop-budget"?`Static main-loop resource estimation exceeded ${resources.incomplete.maximumVisits} visits; reported resource counts are partial.`:resources.incomplete.reason==="main-result-control"?"Main Result control flow is unresolved; reported resource counts are partial.":"Runtime qubit targets are unresolved; resource scheduling and target connectivity cannot be verified statically.",hint:"Inspect the bounded runtime execution separately; these partial counts do not prove a resource budget is satisfied."}));const constraints=program.constraints;if(constraints){if(constraints.maxQubits!=null&&qubits>constraints.maxQubits){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-016",severity:"warning",message:`Program uses ${qubits} qubits, exceeding @constraints maxQubits ${constraints.maxQubits}.`,hint:"Reduce register size or relax the maxQubits constraint for this experiment.",translationKey:"constraintQubitBudget",translationValues:{actual:qubits,max:constraints.maxQubits}}))}if(constraints.maxDepth!=null&&resources.depth>constraints.maxDepth){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-017",severity:"warning",message:`Circuit depth ${resources.depth} exceeds @constraints maxDepth ${constraints.maxDepth}.`,hint:"Use fewer sequential gates, split the circuit, or raise maxDepth if the target budget allows it.",translationKey:"constraintDepthBudget",translationValues:{depth:resources.depth,max:constraints.maxDepth}}))}if(constraints.maxTwoQubit!=null&&resources.twoQubitGates>constraints.maxTwoQubit){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-018",severity:"warning",message:`Two-qubit gate count ${resources.twoQubitGates} exceeds @constraints maxTwoQubit ${constraints.maxTwoQubit}.`,hint:"Reduce entangling operations or decompose the algorithm into a lower two-qubit budget.",translationKey:"constraintTwoQubitBudget",translationValues:{count:resources.twoQubitGates,max:constraints.maxTwoQubit}}))}if(constraints.connectivity==="line"){let emittedConstraintConnectivityWarning=false;visitStatements2(program.statements,statement=>{if(emittedConstraintConnectivityWarning||statement.kind!=="gate"){return}const distance=gateDistance(statement);if(distance!=null&&distance>1){emittedConstraintConnectivityWarning=true;const route=lineRoutingSketch(statement);diagnostics.push(createDiagnostic({code:"NM-RUNTIME-019",severity:"warning",message:`Gate ${statement.gate} violates @constraints line connectivity with distance ${distance}.`,hint:route?`Read-only routing sketch: ${route}`:'Insert SWAP routing, remap logical qubits, or choose connectivity: "all-to-all" for this experiment.',translationKey:"constraintConnectivityWarning",translationValues:{gate:statement.gate,distance,route:route??"manual routing required"},line:statement.line}))}})}}if(!program.target){return}const profile=getNMTargetProfile(program.target);if(!profile){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-009",severity:"warning",message:`Unknown target profile: ${program.target}.`,hint:"Use browser-statevector, browser-stabilizer, ion-trap, superconducting, or neutral-atom for target-aware diagnostics.",translationKey:"unknownTargetProfile",translationValues:{target:program.target}}));return}if(profile.id==="browser-statevector"){return}if(profile.id==="browser-stabilizer"){const eligibility=analyzeNMStabilizerEligibility(program,qubits);if(eligibility.eligible){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-029",severity:"info",message:eligibility.diagnosticMessage,hint:"The program is Clifford-only, so it can use the stabilizer path instead of allocating a full state vector."}))}else{const firstUnsupported=eligibility.unsupportedStatements[0];diagnostics.push(createDiagnostic({code:"NM-RUNTIME-030",severity:qubits>playgroundRuntimeLimits.maxQubits?"error":"warning",message:eligibility.diagnosticMessage,hint:qubits>playgroundRuntimeLimits.maxQubits?`Remove unsupported stabilizer features or reduce the program to ${playgroundRuntimeLimits.maxQubits} qubits for statevector fallback.`:"The playground can fall back to statevector for this small program, but it will not scale like a Clifford-only stabilizer circuit.",line:firstUnsupported?.line}))}}if(qubits>profile.maxQubits){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-014",severity:"warning",message:`Target ${profile.id} recommends at most ${profile.maxQubits} qubits; program uses ${qubits}.`,hint:"Reduce the register size or choose a target profile with a larger educational qubit budget.",translationKey:"targetQubitLimit",translationValues:{target:profile.id,max:profile.maxQubits,actual:qubits}}))}if(resources.depth>profile.recommendedMaxDepth){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-011",severity:"warning",message:`Circuit depth ${resources.depth} exceeds ${profile.id} recommendation ${profile.recommendedMaxDepth}.`,hint:"Shorten the circuit, reduce repeat counts, or split the algorithm into shallower stages.",translationKey:"targetDepthExceeded",translationValues:{target:profile.id,depth:resources.depth,max:profile.recommendedMaxDepth}}))}if(resources.twoQubitGates>profile.recommendedMaxTwoQubitGates){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-012",severity:"warning",message:`Two-qubit gate count ${resources.twoQubitGates} exceeds ${profile.id} recommendation ${profile.recommendedMaxTwoQubitGates}.`,hint:"Two-qubit gates usually dominate hardware error; consider fewer entangling operations.",translationKey:"targetTwoQubitGateBudget",translationValues:{target:profile.id,count:resources.twoQubitGates,max:profile.recommendedMaxTwoQubitGates}}))}const native=new Set(profile.nativeGates);const warnedGates=new Set;let emittedConnectivityWarning=false;visitStatements2(program.statements,statement=>{if(statement.kind!=="gate"){return}if(!native.has(statement.gate)&&!warnedGates.has(statement.gate)){warnedGates.add(statement.gate);diagnostics.push(createDiagnostic({code:"NM-RUNTIME-010",severity:"warning",message:`Gate ${statement.gate} is not native for target ${profile.id}.`,hint:`Run nm transpile <file> --target ${profile.id} to lower supported gates and emit an auditable resource/verification trace.`,translationKey:"nonNativeTargetGate",translationValues:{gate:statement.gate,target:profile.id},line:statement.line}))}if(profile.connectivity==="line"&&!emittedConnectivityWarning){const distance=gateDistance(statement);if(distance!=null&&distance>1){emittedConnectivityWarning=true;const route=lineRoutingSketch(statement);diagnostics.push(createDiagnostic({code:"NM-RUNTIME-013",severity:"warning",message:`Gate ${statement.gate} touches qubits at line distance ${distance} on target ${profile.id}.`,hint:route?`Read-only routing sketch: ${route}`:"Line-connectivity targets prefer adjacent two-qubit gates; insert routing or choose an all-to-all profile.",translationKey:"targetConnectivityWarning",translationValues:{gate:statement.gate,target:profile.id,distance,route:route??"manual routing required"},line:statement.line}))}}})}var NM_PROPERTY_ASSERTIONS_CONTRACT_VERSION="0.2.0-runtime-experimental";var NM_PROPERTY_ASSERTION_MAX_TOLERANCE=1;var NM_PROPERTY_ASSERTION_MAX_ABSOLUTE_BOUND=1e6;var nmPropertyAssertionDiagnosticCodes={featureDisabled:"NM-PARSE-056",invalidAssertion:"NM-PARSE-057",deterministicSamplingRequired:"NM-PARSE-058",invalidRange:"NM-PARSE-059",finiteShotToleranceFailed:"NM-ASSERT-007",observableRangeFailed:"NM-ASSERT-008",phaseEquivalenceFailed:"NM-ASSERT-009"};var encoder=new TextEncoder;function canonicalPropertyValue(value){return Number.parseFloat(value.toFixed(12)).toString()}function deriveNMPropertyCaseSeed(input){const source=[String(input.baseSeed>>>0),input.propertyName,input.parameter,canonicalPropertyValue(input.value)].join("\0");let hash2=2166136261;for(const byte of encoder.encode(source)){hash2^=byte;hash2=Math.imul(hash2,16777619)}return hash2>>>0}var NM_TARGET_CAPABILITY_CONSTRAINTS_CONTRACT_VERSION="0.2.0-runtime-experimental";var nmTargetCapabilityConstraintLimits={maximumAnnotationBytes:2048,maximumProfileIdBytes:64,maximumGateSetSize:32,minimumErrorBudget:1e-9,maximumErrorBudget:1};var nmTargetCapabilityConstraintDiagnosticCodes={featureDisabled:"NM-PARSE-064",invalidDeclaration:"NM-PARSE-065",profileMismatch:"NM-TARGET-040",gateSetMismatch:"NM-TARGET-041",connectivityMismatch:"NM-TARGET-042",errorBudgetMismatch:"NM-TARGET-043"};var nmTargetCapabilityReferenceErrorRates={"browser-statevector":{singleQubit:0,twoQubit:0,threeQubit:0,measurement:0},"browser-mps":{singleQubit:0,twoQubit:0,threeQubit:0,measurement:0},"browser-stabilizer":{singleQubit:0,twoQubit:0,threeQubit:0,measurement:0},"openqasm3-stdgates":void 0,"ion-trap":{singleQubit:5e-4,twoQubit:.005,threeQubit:.02,measurement:.01},superconducting:{singleQubit:.002,twoQubit:.025,threeQubit:.06,measurement:.02},"neutral-atom":{singleQubit:.003,twoQubit:.02,threeQubit:.05,measurement:.015}};var knownGates=new Set(["H","X","Y","Z","S","T","Sdg","Tdg","P","U","GPhase","CNOT","CZ","SWAP","iSWAP","CCNOT","CSWAP","CY","CH","Rx","Ry","Rz","RXX","RYY","RZZ","CRy","CRz","CP"]);function parseNMTargetCapabilityConstraint(body,line,enabled){if(!enabled){return{diagnostics:[createDiagnostic({code:nmTargetCapabilityConstraintDiagnosticCodes.featureDisabled,severity:"error",message:"Target capability constraints require explicit experimental negotiation.",hint:"Set parse options experimental.targetCapabilityConstraints=true while evaluating NM-RFC-0006.",line:line.line})]}}const diagnostics=[];const invalid5=message=>{diagnostics.push(createDiagnostic({code:nmTargetCapabilityConstraintDiagnosticCodes.invalidDeclaration,severity:"error",message,hint:'Use @target_capabilities(profile: "superconducting", gate_set: ["H", "Rz", "CNOT"], connectivity: "line", max_error: 0.1);',line:line.line}))};if(new TextEncoder().encode(body).byteLength>nmTargetCapabilityConstraintLimits.maximumAnnotationBytes){invalid5(`@target_capabilities exceeds ${nmTargetCapabilityConstraintLimits.maximumAnnotationBytes} UTF-8 bytes.`);return{diagnostics}}const fields=splitTopLevelFields(body);if(!fields||fields.length===0){invalid5("@target_capabilities must contain named fields.");return{diagnostics}}const seen=new Set;let profile;let gateSet;let connectivity;let maxError;for(const field of fields){const match=field.match(/^([A-Za-z_][A-Za-z0-9_]*)\s*:\s*(.+)$/u);if(!match){invalid5(`Invalid target capability field: ${field}.`);continue}const key4=match[1];const value=match[2].trim();if(seen.has(key4)){invalid5(`Duplicate target capability field: ${key4}.`);continue}seen.add(key4);if(key4==="profile"){const parsed=parseQuotedString(value);if(!parsed||!/^[a-z0-9][a-z0-9-]{0,63}$/u.test(parsed)){invalid5(`Invalid target profile reference: ${value}.`)}else if(new TextEncoder().encode(parsed).byteLength>nmTargetCapabilityConstraintLimits.maximumProfileIdBytes){invalid5(`Target profile reference exceeds ${nmTargetCapabilityConstraintLimits.maximumProfileIdBytes} UTF-8 bytes.`)}else{profile=parsed}continue}if(key4==="gate_set"){const parsed=parseGateSet(value);if(!parsed){invalid5(`Invalid closed gate_set: ${value}.`)}else if(parsed.length===0||parsed.length>nmTargetCapabilityConstraintLimits.maximumGateSetSize){invalid5(`gate_set must contain 1..${nmTargetCapabilityConstraintLimits.maximumGateSetSize} unique gates.`)}else if(new Set(parsed).size!==parsed.length){invalid5("gate_set must not contain duplicate gates.")}else if(parsed.some(gate=>!knownGates.has(gate))){invalid5("gate_set contains an unknown N/M gate.")}else{gateSet=parsed}continue}if(key4==="connectivity"){const parsed=parseQuotedString(value);if(parsed!=="all-to-all"&&parsed!=="line"&&parsed!=="grid"){invalid5(`Invalid connectivity requirement: ${value}.`)}else{connectivity=parsed}continue}if(key4==="max_error"){if(!/^(?:0(?:\.\d+)?|1(?:\.0+)?)$/u.test(value)){invalid5(`Invalid max_error budget: ${value}.`)}else{const parsed=Number.parseFloat(value);if(!Number.isFinite(parsed)||parsed<nmTargetCapabilityConstraintLimits.minimumErrorBudget||parsed>nmTargetCapabilityConstraintLimits.maximumErrorBudget){invalid5(`max_error must be in [${nmTargetCapabilityConstraintLimits.minimumErrorBudget}, 1].`)}else{maxError=parsed}}continue}invalid5(`Unknown target capability field: ${key4}.`)}if(!profile)invalid5("@target_capabilities requires a profile field.");if(!gateSet&&!connectivity&&maxError==null){invalid5("@target_capabilities requires gate_set, connectivity, or max_error in addition to profile.")}if(diagnostics.length>0||!profile)return{diagnostics};return{requirement:{profile,...gateSet?{gateSet}:{},...connectivity?{connectivity}:{},...maxError!=null?{maxError}:{},line:line.line},diagnostics}}function evaluateNMTargetCapabilityConstraint(program,qubits,requirement){const diagnostics=[];const profile=getNMTargetProfile(requirement.profile);const programGates=collectProgramGates(program.statements);const requiredGates=[...new Set([...requirement.gateSet??[],...programGates])].sort();const declared=requirement.gateSet?new Set(requirement.gateSet):void 0;const undeclaredProgramGates=declared?programGates.filter(gate=>!declared.has(gate)).sort():[];const native=new Set(profile?.nativeGates??[]);const missingGates=requiredGates.filter(gate=>!native.has(gate)).sort();if(!profile||program.target!=null&&program.target!==requirement.profile){diagnostics.push(createDiagnostic({code:nmTargetCapabilityConstraintDiagnosticCodes.profileMismatch,severity:"error",message:!profile?`Unknown target capability profile: ${requirement.profile}.`:`@target(${JSON.stringify(program.target)}) conflicts with required profile ${requirement.profile}.`,hint:"Use one registered profile consistently across @target and @target_capabilities.",line:requirement.line}))}if(missingGates.length>0||undeclaredProgramGates.length>0){diagnostics.push(createDiagnostic({code:nmTargetCapabilityConstraintDiagnosticCodes.gateSetMismatch,severity:"error",message:missingGates.length>0?`Target ${requirement.profile} lacks required native gates: ${missingGates.join(", ")}.`:`Program uses gates outside the declared closed gate_set: ${undeclaredProgramGates.join(", ")}.`,hint:"Choose a compatible profile or make the closed gate_set include every source gate without relying on lowering.",line:requirement.line}))}const connectivityEvidence=requirement.connectivity?{required:requirement.connectivity,actual:profile?.connectivity??"unknown",satisfied:profile?.connectivity===requirement.connectivity}:void 0;if(connectivityEvidence&&!connectivityEvidence.satisfied){diagnostics.push(createDiagnostic({code:nmTargetCapabilityConstraintDiagnosticCodes.connectivityMismatch,severity:"error",message:`Target ${requirement.profile} connectivity ${connectivityEvidence.actual} does not exactly match ${connectivityEvidence.required}.`,hint:"Topology matching is exact in NM-RFC-0006; choose the declared topology without implicit subsumption.",line:requirement.line}))}const errorRates=nmTargetCapabilityReferenceErrorRates[requirement.profile];const estimatedError=errorRates?estimateReferenceCircuitError(program,qubits,errorRates):null;const errorBudgetEvidence=requirement.maxError!=null?{maximum:requirement.maxError,estimated:estimatedError,source:estimatedError!=null?"bounded-reference-profile":"unavailable",satisfied:estimatedError!=null&&estimatedError<=requirement.maxError}:void 0;if(errorBudgetEvidence&&!errorBudgetEvidence.satisfied){diagnostics.push(createDiagnostic({code:nmTargetCapabilityConstraintDiagnosticCodes.errorBudgetMismatch,severity:"error",message:estimatedError==null?errorRates?"Bounded resource counts are unavailable; max_error cannot be verified.":`Target ${requirement.profile} has no bounded reference error model.`:`Estimated reference circuit error ${estimatedError} exceeds max_error ${requirement.maxError}.`,hint:"Reference error evidence is static and conservative; live calibrated guarantees require a separate signed calibration workflow.",line:requirement.line}))}const evidence={contractVersion:NM_TARGET_CAPABILITY_CONSTRAINTS_CONTRACT_VERSION,profile:requirement.profile,...program.target?{target:program.target}:{},requiredGates,missingGates,undeclaredProgramGates,...connectivityEvidence?{connectivity:connectivityEvidence}:{},...errorBudgetEvidence?{errorBudget:errorBudgetEvidence}:{},passed:diagnostics.length===0};return{evidence,diagnostics}}function formatNMTargetCapabilityConstraint(requirement){const fields=[`profile: ${JSON.stringify(requirement.profile)}`];if(requirement.gateSet)fields.push(`gate_set: [${requirement.gateSet.map(gate=>JSON.stringify(gate)).join(", ")}]`);if(requirement.connectivity)fields.push(`connectivity: ${JSON.stringify(requirement.connectivity)}`);if(requirement.maxError!=null)fields.push(`max_error: ${formatNumber(requirement.maxError)}`);return`@target_capabilities(${fields.join(", ")});`}function splitTopLevelFields(body){const fields=[];let start=0;let depth3=0;let quote=false;let escaped=false;for(let index=0;index<body.length;index+=1){const char=body[index];if(quote){if(escaped)escaped=false;else if(char==="\\")escaped=true;else if(char==='"')quote=false;continue}if(char==='"')quote=true;else if(char==="[")depth3+=1;else if(char==="]"){depth3-=1;if(depth3<0)return void 0}else if(char===","&&depth3===0){fields.push(body.slice(start,index).trim());start=index+1}}if(quote||depth3!==0)return void 0;fields.push(body.slice(start).trim());return fields.filter(Boolean)}function parseQuotedString(value){if(!/^"(?:\\.|[^"\\])*"$/u.test(value))return void 0;try{const parsed=JSON.parse(value);return typeof parsed==="string"?parsed:void 0}catch{return void 0}}function parseGateSet(value){if(!/^\[[\s\S]*\]$/u.test(value))return void 0;try{const parsed=JSON.parse(value);return Array.isArray(parsed)&&parsed.every(gate=>typeof gate==="string")?parsed:void 0}catch{return void 0}}function collectProgramGates(statements,target2=[]){for(const statement of statements){if(statement.kind==="gate")target2.push(statement.gate);if(statement.kind==="computeApply"){collectProgramGates(computeApplyProjection(statement),target2)}else if(statement.kind==="if"){collectProgramGates(statement.body,target2);if(statement.elseBody)collectProgramGates(statement.elseBody,target2)}else if(statement.kind==="classicalMatchResult"){collectProgramGates(statement.okBody,target2);collectProgramGates(statement.errorBody,target2)}else if(statement.kind==="classicalFor"||statement.kind==="until"||statement.kind==="observe"||statement.kind==="test"||statement.kind==="snapshot"){collectProgramGates(statement.body,target2)}else if(statement.kind==="match"){statement.cases.forEach(entry=>collectProgramGates(entry.body,target2))}else if(statement.kind==="property"){statement.cases.forEach(entry=>collectProgramGates(entry.body,target2))}}return[...new Set(target2)]}function estimateReferenceCircuitError(program,qubits,rates){const resources=estimateNMResources(program,qubits);if(resources.incomplete)return null;const success=Math.pow(1-rates.singleQubit,resources.singleQubitGates)*Math.pow(1-rates.twoQubit,resources.twoQubitGates)*Math.pow(1-rates.threeQubit,resources.threeQubitGates)*Math.pow(1-rates.measurement,resources.measurements);return Number.parseFloat((1-success).toFixed(12))}function formatNumber(value){return Number.parseFloat(value.toPrecision(12)).toString()}function*scopedNMClassicalBindings(statements,bindings3=new Set){for(const statement of statements){yield{statement,bindings:bindings3};if(statement.kind==="computeApply"){yield*scopedNMClassicalBindings(computeApplyStatements(statement),new Set(bindings3))}else if(statement.kind==="if"){yield*scopedNMClassicalBindings(statement.body,new Set(bindings3));yield*scopedNMClassicalBindings(statement.elseBody??[],new Set(bindings3))}else if(statement.kind==="classicalMatchResult"){yield*scopedNMClassicalBindings(statement.okBody,new Set(bindings3));yield*scopedNMClassicalBindings(statement.errorBody,new Set(bindings3))}else if(["classicalFor","until","observe","test","snapshot"].includes(statement.kind)&&"body"in statement){yield*scopedNMClassicalBindings(statement.body,new Set(bindings3))}else if(statement.kind==="match"||statement.kind==="property"){for(const arm of statement.cases)yield*scopedNMClassicalBindings(arm.body,new Set(bindings3))}}}function flattenStatements2(statements){const flat=[];for(const statement of statements){flat.push(statement);if(statement.kind==="computeApply"){flat.push(...computeApplyStatements(statement))}else if(statement.kind==="if"){flat.push(...flattenStatements2(statement.body));if(statement.elseBody)flat.push(...flattenStatements2(statement.elseBody))}else if(statement.kind==="classicalMatchResult"){flat.push(...flattenStatements2(statement.okBody),...flattenStatements2(statement.errorBody))}else if(statement.kind==="classicalFor"||statement.kind==="until"||statement.kind==="observe"||statement.kind==="test"||statement.kind==="snapshot"){flat.push(...flattenStatements2(statement.body))}else if(statement.kind==="match"){for(const matchCase of statement.cases){flat.push(...flattenStatements2(matchCase.body))}}else if(statement.kind==="property"){for(const propertyCase of statement.cases){flat.push(...flattenStatements2(propertyCase.body))}}}return flat}function validateNMQubitReferences(topLevelStatements,qubitMap,numQubits,diagnostics,skipInvalidQubitReferenceLines=new Set,lexicalClassicalBindings=false){const statements=flattenStatements2(topLevelStatements);let classicalBindings=new Set;const addClassicalBinding=(name2,line)=>{if(classicalBindings.has(name2)){diagnostics.push(createDiagnostic({code:"NM-TYPE-010",severity:"error",message:`Duplicate classical Bit binding: ${name2}.`,hint:"Use a fresh Bit name for each measurement or classical expression.",translationKey:"duplicateClassicalBit",translationValues:{binding:name2},line}))}classicalBindings.add(name2)};const collectClassicalBindings=nestedStatements=>{const bindings3=new Set;for(const statement of flattenStatements2(nestedStatements)){if(statement.kind==="measurement"&&statement.binding){bindings3.add(statement.binding)}else if(statement.kind==="measurement-binding"){bindings3.add(statement.name)}else if(statement.kind==="syndrome"){bindings3.add(statement.binding)}else if(statement.kind==="bitAssign"){bindings3.add(statement.name)}}return bindings3};const bindingStatements=lexicalClassicalBindings?scopedNMClassicalBindings(topLevelStatements):statements.map(statement=>({statement,bindings:classicalBindings}));for(const{statement,bindings:bindings3}of bindingStatements){classicalBindings=bindings3;if(statement.kind==="if"){if(statement.condition||statement.predicate)continue;if(!classicalBindings.has(statement.binding)){diagnostics.push(createDiagnostic({code:"NM-TYPE-009",severity:"error",message:`Unknown classical bit in conditional: ${statement.binding}.`,hint:"Guard on a measured Bit, for example: let m: Bit = measure(q[0]); if (m == 1) { ... }",translationKey:"unknownClassicalBit",translationValues:{binding:statement.binding},line:statement.line}))}continue}if(statement.kind==="until"){const loopBindings=collectClassicalBindings(statement.body);if(!classicalBindings.has(statement.binding)&&!loopBindings.has(statement.binding)){diagnostics.push(createDiagnostic({code:"NM-TYPE-009",severity:"error",message:`Unknown classical bit in until condition: ${statement.binding}.`,hint:"Guard on a measured Bit before the loop or produce it in the until body, for example: until (flag == 1) max 8 { let flag: Bit = measure(q[0]); }",translationKey:"unknownClassicalBit",translationValues:{binding:statement.binding},line:statement.line}))}continue}if(statement.kind==="match"){for(const binding of statement.bindings){if(classicalBindings.has(binding))continue;diagnostics.push(createDiagnostic({code:"NM-TYPE-009",severity:"error",message:`Unknown classical bit in match selector: ${binding}.`,hint:"Match on measured or derived Bits, for example: match (a, b) { (0, 1) => { X(q[2]); } }",translationKey:"unknownClassicalBit",translationValues:{binding},line:statement.line}))}continue}if(statement.kind==="bitAssign"){for(const binding of[...new Set(getNMBitExpressionRefs(statement.expression))]){if(classicalBindings.has(binding))continue;diagnostics.push(createDiagnostic({code:"NM-TYPE-011",severity:"error",message:`Unknown classical Bit in expression: ${binding}.`,hint:"Build Bit expressions from measured or earlier classical bits, for example: let parity: Bit = a xor b;",translationKey:"unknownBitExpressionBinding",translationValues:{binding},line:statement.line}))}addClassicalBinding(statement.name,statement.line);continue}const metricProbabilityState=statement.kind==="metric"&&statement.expression.kind==="probability"?statement.expression.state:void 0;const probabilityState=statement.kind==="assertProbability"?statement.state:metricProbabilityState;if(probabilityState&&numQubits>0&&probabilityState.length!==numQubits){diagnostics.push(createDiagnostic({code:"NM-TYPE-008",severity:"error",message:`Probability state |${probabilityState}> has ${probabilityState.length} bit(s) but the register holds ${numQubits} qubit(s).`,hint:`Use a ${numQubits}-bit basis state, for example: assert probability(|${"0".repeat(numQubits)}>) > 0.45;`,translationKey:"assertionWidthMismatch",translationValues:{state:probabilityState,width:probabilityState.length,qubits:numQubits,exampleState:"0".repeat(numQubits)},line:statement.line}));continue}if(statement.kind==="measurement"){if(statement.binding)addClassicalBinding(statement.binding,statement.line);continue}if(statement.kind==="measurement-binding"){addClassicalBinding(statement.name,statement.line);continue}if(statement.kind==="syndrome"){addClassicalBinding(statement.binding,statement.line)}}for(const statement of statements){if(!hasQubitReferences(statement))continue;if(resolveNMFeedForwardStatementTargets(statement,qubitMap,numQubits,diagnostics)){continue}if(statement.kind==="measurement-binding"||statement.kind==="assertBranchInvariant"){continue}for(const ref2 of getQubitReferences(statement)){if(ref2.classicalIndex){delete ref2.resolvedIndex;if(!Object.prototype.hasOwnProperty.call(qubitMap,`${ref2.register}[0]`)){diagnostics.push(createDiagnostic({code:"NM-TYPE-002",severity:"error",line:statement.line,message:`Unknown register for dynamic qubit target: ${ref2.register}.`}))}continue}const key4=qubitRefKey2(ref2);const resolvedIndex=qubitMap[key4];if(resolvedIndex==null&&numQubits>0){if(skipInvalidQubitReferenceLines.has(statement.line))continue;diagnostics.push(createDiagnostic({code:"NM-TYPE-002",severity:"error",message:`Invalid qubit reference: ${key4}.`,hint:`Declared registers expose indexes 0 through ${numQubits-1} in this playground program.`,translationKey:"invalidQubitReference",translationValues:{qubit:key4,maxIndex:numQubits-1},line:statement.line}))}else{ref2.resolvedIndex=resolvedIndex}}}}function hasQubitReferences(statement){return["gate","measurement","measurement-binding","assertBranchInvariant","syndrome","expectation","metric","assertExpectation","assertEntangled","reset"].includes(statement.kind)}function getQubitReferences(statement){if(statement.kind==="gate")return statement.targets;if(statement.kind==="syndrome")return statement.factors.map(factor=>factor.target);if(statement.kind==="metric"){return statement.expression.kind==="expectation"?statement.expression.terms.flatMap(term=>term.factors.map(factor=>factor.target)):[]}if(statement.kind==="expectation"||statement.kind==="assertExpectation"){return statement.terms.flatMap(term=>term.factors.map(factor=>factor.target))}if(statement.kind==="assertEntangled")return statement.targets;return[statement.target]}function qubitRefKey2(ref2){return ref2.index==null?ref2.register:`${ref2.register}[${ref2.index}]`}var NM_COMPTIME_STRUCTURE_PROVENANCE_CONTRACT_VERSION="0.1.0-experimental";var NM_COMPTIME_STRUCTURE_PROVENANCE_MAX_NODES=4096;var NM_COMPTIME_STRUCTURE_PROVENANCE_MAX_EXPRESSION_DEPTH=32;var gateNames2=new Set(["H","X","Y","Z","S","T","Sdg","Tdg","P","U","GPhase","CNOT","CZ","SWAP","iSWAP","CCNOT","CSWAP","CY","CH","Rx","Ry","Rz","RXX","RYY","RZZ","CRy","CRz","CP"]);function validateNMComptimeStructureProvenance(program){const issues=[];const value=program.comptimeStructures;if(value==null)return issues;if(!validateCarrierSchema(value,issues))return issues;validateCarrierSemantics(program,value,issues);return issues}function validateCarrierSchema(value,issues){if(!exactRecord(value,["experimental","contractVersion","nodes"],[],"$",issues)){return false}if(value.experimental!==true)schemaIssue(issues,"$.experimental","must be true");if(value.contractVersion!==NM_COMPTIME_STRUCTURE_PROVENANCE_CONTRACT_VERSION){schemaIssue(issues,"$.contractVersion","is not the supported contract version")}if(!Array.isArray(value.nodes)){schemaIssue(issues,"$.nodes","must be an array");return false}if(value.nodes.length>NM_COMPTIME_STRUCTURE_PROVENANCE_MAX_NODES){schemaIssue(issues,"$.nodes","exceeds the carrier node budget");return false}value.nodes.forEach((node,index)=>validateNodeSchema(node,`$.nodes[${index}]`,issues));return issues.every(({code})=>code!=="schema")}function validateNodeSchema(value,path,issues){if(!isRecord2(value)||typeof value.kind!=="string"){schemaIssue(issues,path,"must be a structure node with a string kind");return}if(value.kind==="vector-param"){if(!exactRecord(value,["kind","line","name","size","elements","scalarNames","declarationSpan"],[],path,issues))return;validatePositiveLine(value.line,`${path}.line`,issues);validateIdentifier(value.name,`${path}.name`,issues);validateSourceSchema(value.size,`${path}.size`,issues);validateExpressionArray(value.elements,`${path}.elements`,issues);validateIdentifierArray(value.scalarNames,`${path}.scalarNames`,issues);validateSpanSchema(value.declarationSpan,`${path}.declarationSpan`,issues);return}if(value.kind==="repeat"){if(!exactRecord(value,["kind","line","count","effectiveIterations","body","expansionSpan"],[],path,issues))return;validatePositiveLine(value.line,`${path}.line`,issues);validateSourceSchema(value.count,`${path}.count`,issues);validateNonNegativeInteger(value.effectiveIterations,`${path}.effectiveIterations`,issues);validateGateTemplateArray(value.body,`${path}.body`,issues);validateSpanSchema(value.expansionSpan,`${path}.expansionSpan`,issues);return}if(value.kind==="for-range"){if(!exactRecord(value,["kind","line","variable","start","endExclusive","effectiveIterations","body","expansionSpan"],[],path,issues))return;validatePositiveLine(value.line,`${path}.line`,issues);validateIdentifier(value.variable,`${path}.variable`,issues);validateSourceSchema(value.start,`${path}.start`,issues);validateSourceSchema(value.endExclusive,`${path}.endExclusive`,issues);validateNonNegativeInteger(value.effectiveIterations,`${path}.effectiveIterations`,issues);validateGateTemplateArray(value.body,`${path}.body`,issues);validateSpanSchema(value.expansionSpan,`${path}.expansionSpan`,issues);return}schemaIssue(issues,`${path}.kind`,`unknown structure kind ${JSON.stringify(value.kind)}`)}function validateSourceSchema(value,path,issues){if(!exactRecord(value,["sourceExpression","foldedValue","referencedConstants"],[],path,issues))return;if(typeof value.sourceExpression!=="string"||value.sourceExpression.trim()===""){schemaIssue(issues,`${path}.sourceExpression`,"must be a non-empty string")}if(!Number.isSafeInteger(value.foldedValue)){schemaIssue(issues,`${path}.foldedValue`,"must be a safe integer")}validateIdentifierArray(value.referencedConstants,`${path}.referencedConstants`,issues)}function validateSpanSchema(value,path,issues){if(!exactRecord(value,["statementStart","statementCount"],[],path,issues))return;validateNonNegativeInteger(value.statementStart,`${path}.statementStart`,issues);validateNonNegativeInteger(value.statementCount,`${path}.statementCount`,issues)}function validateExpressionArray(value,path,issues){if(!Array.isArray(value)){schemaIssue(issues,path,"must be an array");return}if(value.length>NM_COMPTIME_STRUCTURE_PROVENANCE_MAX_NODES){schemaIssue(issues,path,"exceeds the expression-array budget");return}value.forEach((expression,index)=>validateExpressionSchema(expression,`${path}[${index}]`,issues,0))}function validateExpressionSchema(value,path,issues,depth3){if(depth3>NM_COMPTIME_STRUCTURE_PROVENANCE_MAX_EXPRESSION_DEPTH){schemaIssue(issues,path,"exceeds the expression depth budget");return}if(!isRecord2(value)||typeof value.kind!=="string"){schemaIssue(issues,path,"must be a typed expression node");return}if(value.kind==="literal"){if(!exactRecord(value,["kind","value"],[],path,issues))return;if(typeof value.value!=="number"||!Number.isFinite(value.value)){schemaIssue(issues,`${path}.value`,"must be finite")}return}if(value.kind==="pi"){exactRecord(value,["kind"],[],path,issues);return}if(value.kind==="scalar-reference"){if(!exactRecord(value,["kind","binding","name"],[],path,issues))return;if(value.binding!=="const"&&value.binding!=="param"){schemaIssue(issues,`${path}.binding`,"must be const or param")}validateIdentifier(value.name,`${path}.name`,issues);return}if(value.kind==="vector-element"){if(!exactRecord(value,["kind","name","index"],[],path,issues))return;validateIdentifier(value.name,`${path}.name`,issues);validateNonNegativeInteger(value.index,`${path}.index`,issues);return}if(value.kind==="induction"){if(!exactRecord(value,["kind","name"],[],path,issues))return;validateIdentifier(value.name,`${path}.name`,issues);return}if(value.kind==="unary"){if(!exactRecord(value,["kind","operator","operand"],[],path,issues))return;if(value.operator!=="+"&&value.operator!=="-"){schemaIssue(issues,`${path}.operator`,"must be + or -")}validateExpressionSchema(value.operand,`${path}.operand`,issues,depth3+1);return}if(value.kind==="binary"){if(!exactRecord(value,["kind","operator","left","right"],[],path,issues))return;if(!["+","-","*","/"].includes(String(value.operator))){schemaIssue(issues,`${path}.operator`,"must be +, -, *, or /")}validateExpressionSchema(value.left,`${path}.left`,issues,depth3+1);validateExpressionSchema(value.right,`${path}.right`,issues,depth3+1);return}schemaIssue(issues,`${path}.kind`,`unknown expression kind ${JSON.stringify(value.kind)}`)}function validateGateTemplateArray(value,path,issues){if(!Array.isArray(value)){schemaIssue(issues,path,"must be an array");return}if(value.length>NM_COMPTIME_STRUCTURE_PROVENANCE_MAX_NODES){schemaIssue(issues,path,"exceeds the gate-template budget");return}value.forEach((template,index)=>{const entryPath=`${path}[${index}]`;if(!exactRecord(template,["gate","targets","angles"],[],entryPath,issues))return;if(typeof template.gate!=="string"||!gateNames2.has(template.gate)){schemaIssue(issues,`${entryPath}.gate`,"is not a supported N/M gate")}if(!Array.isArray(template.targets)){schemaIssue(issues,`${entryPath}.targets`,"must be an array")}else{template.targets.forEach((target2,targetIndex)=>validateTargetSchema(target2,`${entryPath}.targets[${targetIndex}]`,issues))}validateExpressionArray(template.angles,`${entryPath}.angles`,issues)})}function validateTargetSchema(value,path,issues){if(!exactRecord(value,["register"],["index"],path,issues))return;validateIdentifier(value.register,`${path}.register`,issues);if(value.index==null)return;if(!isRecord2(value.index)||typeof value.index.kind!=="string"){schemaIssue(issues,`${path}.index`,"must be a typed index template");return}if(value.index.kind==="literal"){if(!exactRecord(value.index,["kind","value"],[],`${path}.index`,issues))return;validateNonNegativeInteger(value.index.value,`${path}.index.value`,issues);return}if(value.index.kind==="induction"){if(!exactRecord(value.index,["kind","offset"],[],`${path}.index`,issues))return;if(!Number.isSafeInteger(value.index.offset)){schemaIssue(issues,`${path}.index.offset`,"must be a safe integer")}return}schemaIssue(issues,`${path}.index.kind`,"must be literal or induction")}function validateCarrierSemantics(program,carrier,issues){const statements=program.statements;const layouts2=createQRegLayouts(statements);const vectors=new Map;const scalarAliases=new Set;const coveredUses=new Set;let previousEnd=0;let previousLine=0;carrier.nodes.forEach((node,nodeIndex)=>{const path=`$.nodes[${nodeIndex}]`;const span3=structureSpan(node);const scalars=createScalarEnvironment(program,span3.statementStart);const end=span3.statementStart+span3.statementCount;if(span3.statementStart>statements.length||end>statements.length||span3.statementStart<previousEnd||node.line<previousLine){issue4(issues,"span",path,"statement span or encounter order is invalid")}if(span3.statementCount===0&&!allowsEmptySpan(node)){issue4(issues,"span",path,"zero statement span is not valid for this node")}previousEnd=Math.max(previousEnd,end);previousLine=Math.max(previousLine,node.line);if(node.kind==="vector-param"){recordCoveredUse(coveredUses,"vector-param-size",node.line,path,issues);validateSourceUse(program,node.size,"vector-param-size",node.line,`${path}.size`,issues);validateVectorNode(program,node,path,{scalars,vectors},scalarAliases,issues);return}if(node.kind==="repeat"){recordCoveredUse(coveredUses,"repeat-count",node.line,path,issues);validateSourceUse(program,node.count,"repeat-count",node.line,`${path}.count`,issues);const expectedIterations2=Math.min(node.count.foldedValue,32);if(node.count.foldedValue<1||node.effectiveIterations!==expectedIterations2){issue4(issues,"expansion",path,"repeat effective iteration policy does not match");return}validateExpansion(program,node.body,node.expansionSpan,Array.from({length:Math.max(0,node.effectiveIterations)},()=>void 0),{scalars,vectors},layouts2,path,issues);return}recordCoveredUse(coveredUses,"for-start",node.line,path,issues);recordCoveredUse(coveredUses,"for-end",node.line,path,issues);validateSourceUse(program,node.start,"for-start",node.line,`${path}.start`,issues);validateSourceUse(program,node.endExclusive,"for-end",node.line,`${path}.endExclusive`,issues);const requested=node.endExclusive.foldedValue-node.start.foldedValue;const expectedIterations=Math.min(Math.max(0,requested),32);if(node.start.foldedValue<0||!Number.isSafeInteger(requested)||requested<0||node.effectiveIterations!==expectedIterations){issue4(issues,"expansion",path,"for-range effective iteration policy does not match");return}validateExpansion(program,node.body,node.expansionSpan,Array.from({length:Math.max(0,node.effectiveIterations)},(_,index)=>({name:node.variable,value:node.start.foldedValue+index})),{scalars,vectors},layouts2,path,issues)});for(const use of program.comptimeConstants?.uses??[]){if(!isProvenancePosition(use.position))continue;if(!coveredUses.has(sourceUseKey(use.position,use.line))){issue4(issues,"source-metadata","$.nodes",`missing carrier node for ${use.position} at line ${use.line}`)}}}function recordCoveredUse(coveredUses,position,line,path,issues){const key4=sourceUseKey(position,line);if(coveredUses.has(key4)){issue4(issues,"source-metadata",path,`duplicate carrier coverage for ${position} at line ${line}`)}coveredUses.add(key4)}function sourceUseKey(position,line){return`${position}:${line}`}function isProvenancePosition(position){return position==="vector-param-size"||position==="repeat-count"||position==="for-start"||position==="for-end"}function validateVectorNode(program,node,path,environment,scalarAliases,issues){const{declarationSpan:span3}=node;if(node.size.foldedValue<1||node.elements.length!==node.size.foldedValue||node.scalarNames.length!==node.size.foldedValue||span3.statementCount!==node.size.foldedValue){issue4(issues,"vector",path,"vector size, elements, aliases and declaration span disagree");return}const values2=[];node.scalarNames.forEach((name2,index)=>{if(scalarAliases.has(name2)){issue4(issues,"vector",`${path}.scalarNames[${index}]`,"scalar alias is not unique")}scalarAliases.add(name2);const statement=program.statements[span3.statementStart+index];const value=evaluateExpression(node.elements[index],environment,`${path}.elements[${index}]`,issues);if(statement?.kind!=="param"||statement.name!==name2||statement.line!==node.line||value==null||!Object.is(statement.value,value)){issue4(issues,"vector",`${path}.declarationSpan`,"lowered vector parameter statements do not match")}if(value!=null)values2.push(value)});if(values2.length===node.elements.length){vectorsSet(environment.vectors,node.name,values2,node.scalarNames,path,issues)}}function validateExpansion(program,body,span3,iterations,baseEnvironment,layouts2,path,issues){const expectedCount=body.length*iterations.length;if(span3.statementCount!==expectedCount){issue4(issues,"expansion",`${path}.expansionSpan`,"span length does not match the typed expansion");return}let offset=0;for(const induction of iterations){const environment={...baseEnvironment,...induction?{induction}:{}};for(let templateIndex=0;templateIndex<body.length;templateIndex+=1){validateExpandedGate(program.statements[span3.statementStart+offset],body[templateIndex],environment,layouts2,`${path}.body[${templateIndex}]`,issues);offset+=1}}}function validateExpandedGate(statement,template,environment,layouts2,path,issues){if(statement?.kind!=="gate"||statement.gate!==template.gate){issue4(issues,"expansion",path,"lowered statement is not the expected gate");return}if(statement.targets.length!==template.targets.length){issue4(issues,"expansion",`${path}.targets`,"target arity does not match")}else{template.targets.forEach((target2,index)=>{const actual=statement.targets[index];const resolvedIndex=evaluateIndex(target2.index,environment.induction,`${path}.targets[${index}]`,issues);const layout=layouts2.get(target2.register);const expectedResolved=resolvedIndex==null||!layout?void 0:layout.base+resolvedIndex;if(actual.register!==target2.register||actual.index!==resolvedIndex||actual.resolvedIndex!==expectedResolved||resolvedIndex!=null&&(!layout||resolvedIndex>=layout.size)){issue4(issues,"expansion",`${path}.targets[${index}]`,"lowered target does not match")}})}const actualAngles=statement.angles??(statement.theta==null?[]:[statement.theta]);const actualAngleNames=statement.angleNames??(statement.thetaName?[statement.thetaName]:actualAngles.map(()=>""));if(actualAngles.length!==template.angles.length){issue4(issues,"expansion",`${path}.angles`,"angle arity does not match");return}template.angles.forEach((expression,index)=>{const value=evaluateExpression(expression,environment,`${path}.angles[${index}]`,issues);if(value==null||!Object.is(value,actualAngles[index])){issue4(issues,"expansion",`${path}.angles[${index}]`,"lowered angle value does not match")}validateAngleBinding(expression,actualAngleNames[index]??"",environment,`${path}.angles[${index}]`,issues)})}function evaluateExpression(expression,environment,path,issues){let value;if(expression.kind==="literal")value=expression.value;else if(expression.kind==="pi")value=Math.PI;else if(expression.kind==="scalar-reference"){const binding=environment.scalars.get(expression.name);if(!binding||binding.binding!==expression.binding){issue4(issues,"expression",path,"scalar reference is missing or has the wrong binding kind");return void 0}value=binding.value}else if(expression.kind==="vector-element"){value=environment.vectors.get(expression.name)?.values[expression.index];if(value==null){issue4(issues,"expression",path,"vector element reference is missing or out of bounds");return void 0}}else if(expression.kind==="induction"){if(!environment.induction||environment.induction.name!==expression.name){issue4(issues,"expression",path,"induction reference is outside its owning for-range");return void 0}value=environment.induction.value}else if(expression.kind==="unary"){const operand2=evaluateExpression(expression.operand,environment,`${path}.operand`,issues);if(operand2==null)return void 0;value=expression.operator==="-"?-operand2:operand2}else{const left=evaluateExpression(expression.left,environment,`${path}.left`,issues);const right=evaluateExpression(expression.right,environment,`${path}.right`,issues);if(left==null||right==null)return void 0;if(expression.operator==="+")value=left+right;else if(expression.operator==="-")value=left-right;else if(expression.operator==="*")value=left*right;else if(right===0){issue4(issues,"expression",path,"division by zero is not valid provenance");return void 0}else value=left/right}if(!Number.isFinite(value)){issue4(issues,"expression",path,"expression does not resolve to a finite value");return void 0}return value}function validateAngleBinding(expression,actualName,environment,path,issues){const expectedReferences=collectExpressionReferences(expression,environment,path,issues);const actualReferences=new Set((actualName.match(/\b[_A-Za-z]\w*\b/gu)??[]).filter(name2=>name2!=="PI"));if(!sameStringSet([...expectedReferences],[...actualReferences])){issue4(issues,"expansion",path,"lowered angle bindings do not match")}if(actualName===""!==isSyntacticLiteral(expression)){issue4(issues,"expansion",path,"lowered angle literal classification does not match")}}function collectExpressionReferences(expression,environment,path,issues){if(expression.kind==="scalar-reference")return new Set([expression.name]);if(expression.kind==="vector-element"){const alias=environment.vectors.get(expression.name)?.scalarNames[expression.index];if(!alias){issue4(issues,"expression",path,"vector element has no lowered scalar alias");return new Set}return new Set([alias])}if(expression.kind==="unary"){return collectExpressionReferences(expression.operand,environment,`${path}.operand`,issues)}if(expression.kind==="binary"){return new Set([...collectExpressionReferences(expression.left,environment,`${path}.left`,issues),...collectExpressionReferences(expression.right,environment,`${path}.right`,issues)])}return new Set}function isSyntacticLiteral(expression){return expression.kind==="literal"||expression.kind==="induction"||expression.kind==="unary"&&isSyntacticLiteral(expression.operand)}function evaluateIndex(index,induction,path,issues){if(index==null)return void 0;const value=index.kind==="literal"?index.value:induction==null?void 0:induction.value+index.offset;if(value==null||!Number.isSafeInteger(value)||value<0){issue4(issues,"expression",`${path}.index`,"target index does not resolve to a non-negative safe integer");return void 0}return value}function validateSourceUse(program,source,position,line,path,issues){const match=program.comptimeConstants?.uses.find(use=>use.position===position&&use.line===line);if(!match||match.sourceExpression!==source.sourceExpression||match.foldedValue!==source.foldedValue||!sameStringSet(match.referencedConstants,source.referencedConstants)){issue4(issues,"source-metadata",path,"does not match the owning comptime use")}}function createScalarEnvironment(program,beforeStatement){const scalars=new Map;for(const declaration of program.comptimeConstants?.declarations??[]){scalars.set(declaration.name,{binding:"const",value:declaration.foldedValue})}for(const statement of program.statements.slice(0,beforeStatement)){if(statement.kind==="const"){scalars.set(statement.name,{binding:"const",value:statement.value})}else if(statement.kind==="param"){scalars.set(statement.name,{binding:"param",value:statement.value})}}return scalars}function createQRegLayouts(statements){const layouts2=new Map;let base2=0;for(const statement of statements){if(statement.kind!=="qreg")continue;layouts2.set(statement.name,{base:base2,size:statement.size});base2+=statement.size}return layouts2}function structureSpan(node){return node.kind==="vector-param"?node.declarationSpan:node.expansionSpan}function allowsEmptySpan(node){if(node.kind==="vector-param")return false;return node.body.length===0}function vectorsSet(vectors,name2,values2,scalarNames,path,issues){if(vectors.has(name2)){issue4(issues,"vector",path,"vector name is not unique");return}vectors.set(name2,{values:values2,scalarNames:[...scalarNames]})}function sameStringSet(left,right){const sortedRight=[...right].sort();return left.length===right.length&&[...left].sort().every((value,index)=>value===sortedRight[index])}function validateIdentifierArray(value,path,issues){if(!Array.isArray(value)){schemaIssue(issues,path,"must be an array");return}value.forEach((entry,index)=>validateIdentifier(entry,`${path}[${index}]`,issues));if(new Set(value).size!==value.length)schemaIssue(issues,path,"must not contain duplicates")}function validateIdentifier(value,path,issues){if(typeof value!=="string"||!/^[_A-Za-z]\w*$/u.test(value)){schemaIssue(issues,path,"must be an N/M identifier")}}function validatePositiveLine(value,path,issues){if(!Number.isSafeInteger(value)||Number(value)<1){schemaIssue(issues,path,"must be a positive source line")}}function validateNonNegativeInteger(value,path,issues){if(!Number.isSafeInteger(value)||Number(value)<0){schemaIssue(issues,path,"must be a non-negative safe integer")}}function exactRecord(value,required,optional,path,issues){if(!isRecord2(value)){schemaIssue(issues,path,"must be an object");return false}const allowed=new Set([...required,...optional]);for(const key4 of Object.keys(value)){if(!allowed.has(key4))schemaIssue(issues,`${path}.${key4}`,"is an unknown field")}for(const key4 of required){if(!Object.prototype.hasOwnProperty.call(value,key4)){schemaIssue(issues,`${path}.${key4}`,"is required")}}return true}function isRecord2(value){return typeof value==="object"&&value!==null&&!Array.isArray(value)}function schemaIssue(issues,path,message){issue4(issues,"schema",path,message)}function issue4(issues,code,path,message){issues.push({code,path,message})}var simpleGateArities=new Map([["H",1],["X",1],["Y",1],["Z",1],["S",1],["T",1],["Sdg",1],["Tdg",1],["CNOT",2],["CZ",2],["SWAP",2],["iSWAP",2],["CY",2],["CH",2],["CCNOT",3],["CSWAP",3]]);var angleGateArities=new Map([["P",1],["Rx",1],["Ry",1],["Rz",1],["RXX",2],["RYY",2],["RZZ",2],["CRy",2],["CRz",2],["CP",2]]);function attachNMComptimeStructureProvenance(source,result2){if(result2.diagnostics.some(({severity})=>severity==="error"))return result2;const carrier=extractNMComptimeStructureProvenance(source,result2.program);if(!carrier)return result2;return{...result2,program:{...result2.program,comptimeStructures:carrier}}}function extractNMComptimeStructureProvenance(source,program){const relevantUses=program.comptimeConstants?.uses.filter(({position})=>position==="vector-param-size"||position==="repeat-count"||position==="for-start"||position==="for-end")??[];if(relevantUses.length===0)return void 0;const canonicalSource=replaceNMKeywordTokens(source,nmTurkishKeywordAliases);const lines=canonicalSource.split(/\r\n|\r|\n/u).map((raw,index)=>({line:index+1,text:stripLineComment(raw).trim()}));const scalarBindings=createScalarBindings(program);const constBindings=createComptimeBindings(program);const vectors=new Map;const nodes=[];let statementCursor=0;for(let lineIndex=0;lineIndex<lines.length;lineIndex+=1){const sourceLine=lines[lineIndex];const vectorMatch=/^param\s+([A-Za-z_]\w*)\s*:\s*Angle\s*\[\s*(.+?)\s*\]\s*=\s*\[(.*)\]\s*;?$/u.exec(sourceLine.text);if(vectorMatch){const size=copySourceUse(program,"vector-param-size",sourceLine.line);if(!size)return void 0;const elementSources=splitTopLevel3(vectorMatch[3]);if(elementSources.length!==size.foldedValue)return void 0;const context2={scalarBindings,vectors};const elements=elementSources.map(candidate2=>parseAngleExpression(candidate2,context2));if(elements.some(candidate2=>candidate2==null))return void 0;const scalarNames=Array.from({length:size.foldedValue},(_,index)=>`${vectorMatch[1]}_${index}`);const sequence=scalarNames.map(name2=>({kind:"param",name:name2,line:sourceLine.line}));const statementStart=findStatementSequence(program.statements,statementCursor,sequence);if(statementStart==null)return void 0;nodes.push({kind:"vector-param",line:sourceLine.line,name:vectorMatch[1],size,elements,scalarNames,declarationSpan:{statementStart,statementCount:sequence.length}});vectors.set(vectorMatch[1],scalarNames);scalarNames.forEach(name2=>scalarBindings.delete(name2));statementCursor=statementStart+sequence.length;continue}const repeatMatch=/^repeat\s+(.+?)\s*\{$/u.exec(sourceLine.text);const forMatch=/^for\s+([A-Za-z_]\w*)\s+in\s+(.+?)\.\.(.+?)\s*\{$/u.exec(sourceLine.text);if(!repeatMatch&&!forMatch)continue;const block=readGateBlock(lines,lineIndex);if(!block)return void 0;const induction=forMatch?.[1];const context={scalarBindings,vectors,...induction?{induction}:{}};const templates=block.body.map(({text})=>parseGateTemplate(text,context,constBindings));if(templates.some(candidate2=>candidate2==null))return void 0;const body=templates;if(repeatMatch){const count=copySourceUse(program,"repeat-count",sourceLine.line);if(!count)return void 0;const effectiveIterations=Math.min(count.foldedValue,32);const sequence=repeatedGateSequence(block.body,body,effectiveIterations);const statementStart=findStructureSpan(program.statements,statementCursor,sequence,block.closeLine);if(statementStart==null)return void 0;nodes.push({kind:"repeat",line:sourceLine.line,count,effectiveIterations,body,expansionSpan:{statementStart,statementCount:sequence.length}});statementCursor=statementStart+sequence.length}else if(forMatch){const start=copySourceUse(program,"for-start",sourceLine.line);const endExclusive=copySourceUse(program,"for-end",sourceLine.line);if(!start||!endExclusive)return void 0;const effectiveIterations=Math.min(Math.max(0,endExclusive.foldedValue-start.foldedValue),32);const sequence=repeatedGateSequence(block.body,body,effectiveIterations);const statementStart=findStructureSpan(program.statements,statementCursor,sequence,block.closeLine);if(statementStart==null)return void 0;nodes.push({kind:"for-range",line:sourceLine.line,variable:forMatch[1],start,endExclusive,effectiveIterations,body,expansionSpan:{statementStart,statementCount:sequence.length}});statementCursor=statementStart+sequence.length}lineIndex=block.closeIndex}const carrier={experimental:true,contractVersion:NM_COMPTIME_STRUCTURE_PROVENANCE_CONTRACT_VERSION,nodes};const candidate={...program,comptimeStructures:carrier};return validateNMComptimeStructureProvenance(candidate).length===0?carrier:void 0}function readGateBlock(lines,headerIndex){const body=[];for(let index=headerIndex+1;index<lines.length;index+=1){const line=lines[index];if(line.text==="}"){return{body,closeIndex:index,closeLine:line.line}}if(!line.text)continue;if(line.text.includes("{")||line.text.includes("}"))return void 0;body.push(line)}return void 0}function parseGateTemplate(source,context,constBindings){const match=/^([A-Za-z_]\w*)\s*\((.*)\)\s*;?$/u.exec(source);if(!match)return void 0;const gate=match[1];const simpleArity=simpleGateArities.get(gate);const targetCount=simpleArity??angleGateArities.get(gate)??(gate==="U"?1:gate==="GPhase"?0:void 0);const angleCount=simpleArity!=null?0:gate==="U"?3:1;if(targetCount==null)return void 0;const arguments_=splitTopLevel3(match[2]);if(arguments_.length!==targetCount+angleCount)return void 0;const targets=arguments_.slice(0,targetCount).map(candidate=>parseTargetTemplate(candidate,context.induction,constBindings));const angles=arguments_.slice(targetCount).map(candidate=>parseAngleExpression(candidate,context));if(targets.some(candidate=>candidate==null)||angles.some(candidate=>candidate==null)){return void 0}return{gate,targets,angles}}function parseTargetTemplate(source,induction,constBindings){const match=/^([A-Za-z_]\w*)(?:\[\s*(.+?)\s*\])?$/u.exec(source.trim());if(!match)return void 0;if(match[2]==null)return{register:match[1]};const expression=match[2].trim();if(induction){if(expression===induction){return{register:match[1],index:{kind:"induction",offset:0}}}const offset=new RegExp(`^${induction}\\s*([+-])\\s*(\\d+)$`,"u").exec(expression);if(offset){return{register:match[1],index:{kind:"induction",offset:Number.parseInt(offset[2],10)*(offset[1]==="-"?-1:1)}}}const commuted=new RegExp(`^(\\d+)\\s*\\+\\s*${induction}$`,"u").exec(expression);if(commuted){return{register:match[1],index:{kind:"induction",offset:Number.parseInt(commuted[1],10)}}}}const evaluated=evaluateNMComptimeExpression(expression,constBindings);if(!evaluated.success||evaluated.foldedValue<0)return void 0;return{register:match[1],index:{kind:"literal",value:evaluated.foldedValue}}}function parseAngleExpression(source,context){const rawTokens=source.match(/\d+\.\d+|\d+|[A-Za-z_]\w*|[+\-*/()[\]]/gu);if(!rawTokens||rawTokens.join("")!==source.replace(/\s+/gu,""))return void 0;let position=0;const peek=()=>rawTokens[position];const take=()=>rawTokens[position++];const primary=()=>{const token=take();if(!token)return void 0;if(/^\d/u.test(token)){const value=Number.parseFloat(token);return Number.isFinite(value)?{kind:"literal",value}:void 0}if(token==="("){const expression2=sum();return take()===")"?expression2:void 0}if(!/^[A-Za-z_]\w*$/u.test(token))return void 0;if(token==="PI")return{kind:"pi"};if(peek()==="["){take();const indexSource=take();if(!/^\d+$/u.test(indexSource??"")||take()!=="]")return void 0;const index=Number.parseInt(indexSource,10);if(context.vectors.get(token)?.[index]==null)return void 0;return{kind:"vector-element",name:token,index}}if(context.induction===token)return{kind:"induction",name:token};const binding=context.scalarBindings.get(token);return binding?{kind:"scalar-reference",binding,name:token}:void 0};const unary=()=>{const token=peek();if(token==="+"||token==="-"){take();const operand2=unary();return operand2?{kind:"unary",operator:token,operand:operand2}:void 0}return primary()};const product=()=>{let left=unary();while(left&&(peek()==="*"||peek()==="/")){const operator=take();const right=unary();if(!right)return void 0;left={kind:"binary",operator,left,right}}return left};function sum(){let left=product();while(left&&(peek()==="+"||peek()==="-")){const operator=take();const right=product();if(!right)return void 0;left={kind:"binary",operator,left,right}}return left}const expression=sum();return expression&&position===rawTokens.length?expression:void 0}function splitTopLevel3(source){const values2=[];let current="";let roundDepth=0;let squareDepth=0;for(const char of source){if(char==="(")roundDepth+=1;else if(char===")")roundDepth-=1;else if(char==="[")squareDepth+=1;else if(char==="]")squareDepth-=1;if(char===","&&roundDepth===0&&squareDepth===0){values2.push(current.trim());current=""}else current+=char}if(current.trim()||source.trim())values2.push(current.trim());return values2}function repeatedGateSequence(sourceBody,templates,iterations){return Array.from({length:iterations},()=>templates.map((template,index)=>({kind:"gate",gate:template.gate,line:sourceBody[index].line}))).flat()}function findStructureSpan(statements,cursor,sequence,closeLine){if(sequence.length>0)return findStatementSequence(statements,cursor,sequence);const insertion=statements.findIndex((statement,index)=>index>=cursor&&statement.line>closeLine);return insertion<0?statements.length:insertion}function findStatementSequence(statements,cursor,sequence){for(let start=cursor;start+sequence.length<=statements.length;start+=1){const matches=sequence.every((expected,offset)=>{const actual=statements[start+offset];if(expected.kind==="param"){return actual?.kind==="param"&&actual.name===expected.name&&actual.line===expected.line}return actual?.kind==="gate"&&actual.gate===expected.gate&&actual.line===expected.line});if(matches)return start}return void 0}function copySourceUse(program,position,line){const use=program.comptimeConstants?.uses.find(candidate=>candidate.position===position&&candidate.line===line);return use?{sourceExpression:use.sourceExpression,foldedValue:use.foldedValue,referencedConstants:[...use.referencedConstants]}:void 0}function createScalarBindings(program){const bindings3=new Map;for(const declaration of program.comptimeConstants?.declarations??[]){bindings3.set(declaration.name,"const")}for(const statement of program.statements){if(statement.kind==="const")bindings3.set(statement.name,"const");else if(statement.kind==="param")bindings3.set(statement.name,"param")}return bindings3}function createComptimeBindings(program){return Object.fromEntries((program.comptimeConstants?.declarations??[]).map(declaration=>[declaration.name,{kind:"const",value:declaration.foldedValue,valueType:"Int"}]))}function stripLineComment(source){let quote;let escaping=false;for(let index=0;index<source.length-1;index+=1){const char=source[index];if(escaping)escaping=false;else if(char==="\\")escaping=true;else if(quote&&char===quote)quote=void 0;else if(!quote&&(char==='"'||char==="'"))quote=char;else if(!quote&&char==="/"&&source[index+1]==="/")return source.slice(0,index)}return source}var SUPPORTED_SINGLE_QUBIT_GATES=["H","X","Y","Z","S","T","Sdg","Tdg"];var SUPPORTED_GATES=[...SUPPORTED_SINGLE_QUBIT_GATES,"P","U","GPhase","CNOT","CZ","SWAP","iSWAP","CCNOT","CSWAP","CY","CH","Rx","Ry","Rz","RXX","RYY","RZZ","CRy","CRz","CP"];var MAX_UNTIL_ITERATIONS=32;var MAX_PROPERTY_CASES=32;var IDENTIFIER_SOURCE4=String.raw`[\p{L}_][\p{L}\p{N}_]*`;function collectFiniteShotPropertyAssertions(source,target2=[]){for(const statement of source){if((statement.kind==="assertProbability"||statement.kind==="assertExpectation")&&statement.operator==="~="){target2.push(statement)}if(statement.kind==="if"){collectFiniteShotPropertyAssertions(statement.body,target2);if(statement.elseBody)collectFiniteShotPropertyAssertions(statement.elseBody,target2)}else if(statement.kind==="until"){collectFiniteShotPropertyAssertions(statement.body,target2)}else if(statement.kind==="match"){statement.cases.forEach(matchCase=>collectFiniteShotPropertyAssertions(matchCase.body,target2))}else if(statement.kind==="observe"||statement.kind==="test"||statement.kind==="snapshot"){collectFiniteShotPropertyAssertions(statement.body,target2)}else if(statement.kind==="property"){statement.cases.forEach(propertyCase=>collectFiniteShotPropertyAssertions(propertyCase.body,target2))}}return target2}function usesNMFeedForwardSyntax(source,typedCollectionBodyLines){for(const statement of source){if(statement.kind==="assertBranchInvariant")return true;if(statement.kind==="measurement-binding"&&!typedCollectionBodyLines.has(statement.line)){return true}if(statement.kind==="if"){if(statement.predicate)return true;if(usesNMFeedForwardSyntax(statement.body,typedCollectionBodyLines))return true;if(statement.elseBody&&usesNMFeedForwardSyntax(statement.elseBody,typedCollectionBodyLines)){return true}}else if(statement.kind==="until"||statement.kind==="observe"||statement.kind==="test"||statement.kind==="snapshot"){if(usesNMFeedForwardSyntax(statement.body,typedCollectionBodyLines))return true}else if(statement.kind==="match"){if(statement.cases.some(matchCase=>usesNMFeedForwardSyntax(matchCase.body,typedCollectionBodyLines))){return true}}else if(statement.kind==="property"){if(statement.cases.some(propertyCase=>usesNMFeedForwardSyntax(propertyCase.body,typedCollectionBodyLines))){return true}}}return false}function parseNMCode(code,options={}){return parseNMCodeWithLineReader(code,options,getExecutableLines)}function parseNMCodeWithLineReader(code,options,lineReader,tokenStructuralBoundaries=false){const computeApply=admitNMComputeApplySource(code,options);if(computeApply.diagnostics.some(item=>item.severity==="error"))return failedNMParseResult([...computeApply.diagnostics]);const groups=readNMParameterGroupSource(code,options.experimental?.parameterGroups===true);if(groups.diagnostics.length)return failedNMParseResult(groups.diagnostics);const result2=attachNMComputeApplyParseResult(parseNMCodeWithLineReaderCore(groups.source,options,lineReader,tokenStructuralBoundaries,computeApply),code,computeApply.active,computeApply.incomplete,options);if(groups.declarations.length&&result2.program.classicalFunctions)result2.program.classicalFunctions.originalSource=code;return attachNMParameterGroups(groups,result2,options)}function parseNMCodeWithLineReaderCore(code,options,lineReader,tokenStructuralBoundaries=false,computeApply){const loweredFunctions=isClassicalFunctionCarrier(options)?{source:code,diagnostics:[]}:lowerNMSourceFunctions(code,options);if(loweredFunctions.diagnostics.some(diagnostic5=>diagnostic5.severity==="error"))return failedNMParseResult(loweredFunctions.diagnostics);const diagnostics=[...loweredFunctions.diagnostics];let computeApplyId=0;const computeApplyReader=computeApply.active?createNMComputeApplyLineReader(computeApply,diagnostics,new Set(loweredFunctions.runtimeAngles?.keys()),options.workspaceModules):void 0;function parseExecutableStatement(...args){return attachNMReadoutDebugBindings(args[0],parseReadoutLeaf(...args))}function parseReadoutLeaf(...args){if(rejectNMComputeApplyLeaf(args[0],diagnostics))return void 0;const mutation=parseNMMainMutation(args[0],options.experimental?.classicalFunctions===true&&options.experimental?.typedClassicalValues===true);if(mutation.candidate){diagnostics.push(...mutation.diagnostics);return mutation.statement}const dynamicGate=parseNMDynamicGate(args[0],options.experimental?.classicalFunctions===true&&options.experimental?.typedClassicalValues===true,line=>parseGate(line,args[1],args[3]));if(dynamicGate.candidate){diagnostics.push(...dynamicGate.diagnostics);return dynamicGate.statement}return parseExecutableStatementCore(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8],args[9],loweredFunctions.runtimeAngles)}code=loweredFunctions.source;const genericOraclesEnabled=options.experimental?.genericOracles===true;const propertyAssertionsEnabled=options.experimental?.propertyAssertions===true;const qmlTrainingControlsEnabled=options.experimental?.qmlTrainingControls===true;const feedForwardEnabled=options.experimental?.feedForward===true;const typedCollectionEnabled=options.experimental?.typedCollection===true;const typedClassicalValuesEnabled=options.experimental?.typedClassicalValues===true||genericOraclesEnabled;const targetCapabilityConstraintsEnabled=options.experimental?.targetCapabilityConstraints===true;const functionResultsEnabled=options.experimental?.functionResults===true||genericOraclesEnabled;if(options.experimental?.classicalFunctions===true&&options.experimental?.typedClassicalValues===true){const structural=parseNMClassicalControlDocument(code,true);if(structural){const reportStructuralIssues=document=>{for(const issue11 of document.issues)diagnostics.push(createDiagnostic({code:issue11.code==="NM-FRONTEND-PARITY-004"?"NM-CFN-003":"NM-PARSE-006",severity:"error",message:issue11.message,line:issue11.range?issue11.range.start.line+1:void 0}))};reportStructuralIssues(structural);lineReader=source=>{if(source===code)return structural.lines;const document=parseNMClassicalControlDocument(source);reportStructuralIssues(document);return document.lines};tokenStructuralBoundaries=true}}if(computeApplyReader){lineReader=computeApplyReader;tokenStructuralBoundaries=true}const preprocessed=preprocessNMSource(code,diagnostics,loweredFunctions.quantumModules?{...options,workspaceModules:loweredFunctions.quantumModules}:options,lineReader,tokenStructuralBoundaries,computeApply.active);let sourceLines4=computeApplyReader?.remap(preprocessed)??preprocessed.lines;if(computeApply.active&&loweredFunctions.runtimeAngles&&loweredFunctions.circuitAngleTypes&&loweredFunctions.provenance){try{sourceLines4=lowerNMComputeApplyExpandedAngles(sourceLines4,loweredFunctions.runtimeAngles,loweredFunctions.circuitAngleTypes,loweredFunctions.provenance.generatedBindings,loweredFunctions.circuitAngleFunctions)}catch(error){if(error instanceof FunctionIssue)return failedNMParseResult([...diagnostics,functionDiagnostic(error)]);throw error}}const statements=[];const qubitMap={};const constants=computeApply.active?Object.fromEntries([...loweredFunctions.runtimeAngles?.keys()??[]].map(name2=>[name2,0])):{};const observables={};const observableMetadata={};const observableUses=[];const observableNames=new Set;const params={};const qregSizes={};let numQubits=0;let moduleName;let compiler;let semantics;const goals=[];const outcomes=[];const rubrics=[];const misconceptions=[];const quizzes=[];const labs=[];const challenges=[];const datasets=[];const checkpoints=[];const hints=[];const concepts=[];let level;const prerequisites=[];let target2;let constraints;let targetCapabilityRequirement;let noise;let mitigation;let seed;let expectationShots;let optimize;let estimate;let mainLine;let functionResultType;const pushQRegDeclaration=qreg=>{for(let i=0;i<qreg.size;i+=1){qubitMap[`${qreg.name}[${i}]`]=numQubits+i}qregSizes[qreg.name]=qreg.size;numQubits+=qreg.size};const invalidTestBlockDiagnostic={code:"NM-PARSE-043",translationKey:"invalidTestBlock",messagePrefix:"Unsupported statement inside test block",hint:"The first test block MVP supports qreg, const, param, observable, gates, measurements, metrics, expectations, assertions, reset, barrier, and return statements."};const invalidPropertyBlockDiagnostic={code:"NM-PARSE-044",translationKey:"invalidPropertyBlock",messagePrefix:"Unsupported statement inside property block",hint:"Property/forall blocks support qreg declarations in the first case plus executable gates, measurements, metrics, expectations, assertions, reset, barrier, and return statements. Declare const, param, and observable values outside the property."};const invalidSnapshotBlockDiagnostic={code:"NM-PARSE-045",translationKey:"invalidSnapshotBlock",messagePrefix:"Unsupported statement inside snapshot block",hint:"Snapshot blocks support qreg, const, param, observable, gates, measurements, metrics, expectations, assertions, reset, barrier, and return statements."};const formatPropertyValue=value=>Number.parseFloat(value.toFixed(12)).toString();const pushInvalidPropertyDiagnostic=(sourceLine,block=sourceLine.text)=>{diagnostics.push(createDiagnostic({code:invalidPropertyBlockDiagnostic.code,severity:"error",message:`Invalid property block syntax: ${block}.`,hint:invalidPropertyBlockDiagnostic.hint,translationKey:invalidPropertyBlockDiagnostic.translationKey,translationValues:{block},line:sourceLine.line}))};const parseScopedStatement=(sourceIndex2,targetStatements,diagnosticConfig=invalidTestBlockDiagnostic)=>{const sourceLine=sourceLines4[sourceIndex2];if(/^compute\s*\{$/u.test(sourceLine.text)||computeApplyReader&&/^(?:if|for)\b/u.test(sourceLine.text)){const parsed=parseBlockStatement(sourceIndex2,[...statements,...targetStatements]);if(parsed.statement)targetStatements.push(parsed.statement);return parsed.end}const constDecl=parseConst(sourceLine,constants,diagnostics);if(constDecl){targetStatements.push(constDecl);constants[constDecl.name]=constDecl.value;return sourceIndex2}if(parseObservable(sourceLine,constants,observables,observableNames,observableMetadata,diagnostics)){return sourceIndex2}const paramDecl=parseParam(sourceLine,constants,diagnostics);if(paramDecl){targetStatements.push(paramDecl);constants[paramDecl.name]=paramDecl.value;params[paramDecl.name]=paramDecl.value;return sourceIndex2}const qreg=parseQReg(sourceLine,diagnostics);if(qreg){targetStatements.push(qreg);pushQRegDeclaration(qreg);return sourceIndex2}const statement=parseExecutableStatement(sourceLine,constants,observables,diagnostics,observableUses,propertyAssertionsEnabled,typedClassicalValuesEnabled,functionResultType,feedForwardEnabled,typedCollectionEnabled);if(statement){targetStatements.push(statement);return sourceIndex2}const diagnosticCount=diagnostics.length;validateUnsupportedSyntax(sourceLine,diagnostics);if(diagnostics.length===diagnosticCount){diagnostics.push(createDiagnostic({code:diagnosticConfig.code,severity:"error",message:`${diagnosticConfig.messagePrefix}: ${sourceLine.text}.`,hint:diagnosticConfig.hint,translationKey:diagnosticConfig.translationKey,translationValues:{block:sourceLine.text},line:sourceLine.line}))}return sourceIndex2};const substituteForallValue=(text,parameter,value)=>text.replace(new RegExp(`\\b${parameter}\\b`,"g"),formatPropertyValue(value));const buildForallValues=(line,startSource,endSource,stepSource)=>{const start=evaluateAngleExpression(startSource,constants);const end=evaluateAngleExpression(endSource,constants);const step=evaluateAngleExpression(stepSource,constants);if(start==null||end==null||step==null||step===0){pushInvalidPropertyDiagnostic(line);return void 0}const values2=[];const epsilon=Math.abs(step)*1e-9+1e-12;const canContinue=value=>step>0?value<=end+epsilon:value>=end-epsilon;for(let value=start;canContinue(value)&&values2.length<MAX_PROPERTY_CASES;value+=step){values2.push(Number.parseFloat(value.toFixed(12)))}if(values2.length===0){pushInvalidPropertyDiagnostic(line);return void 0}const nextValue=values2.at(-1)+step;if(canContinue(nextValue)){diagnostics.push(createDiagnostic({code:invalidPropertyBlockDiagnostic.code,severity:"warning",message:`Property forall range is capped to ${MAX_PROPERTY_CASES} case(s).`,hint:"Use a larger step or a narrower range while experimenting in the browser.",translationKey:invalidPropertyBlockDiagnostic.translationKey,translationValues:{block:line.text},line:line.line}))}return values2};const parsePropertyCaseBody=(bodyLines,parameter,value,caseIndex,targetStatements,bindingLine)=>{const substituted=bodyLines.map(bodyLine=>({...bodyLine,text:substituteForallValue(bodyLine.text,parameter,value)}));if(computeApplyReader&&loweredFunctions.provenance)targetStatements.push({kind:"classicalDecl",name:parameter,valueType:{kind:"scalar",name:"Float"},expression:{kind:"number",numberType:"Float",value},line:bindingLine});for(let cursor=0;cursor<substituted.length;cursor++){const substitutedLine=substituted[cursor];if(/^compute\s*\{$/u.test(substitutedLine.text)||computeApplyReader&&/^(?:if|for)\b/u.test(substitutedLine.text)){const parsed=parseBlockStatement(cursor,[...statements,...targetStatements],substituted);if(parsed.statement)targetStatements.push(parsed.statement);cursor=parsed.end;continue}if(/^(?:const|param|observable)\b/.test(substitutedLine.text)){pushInvalidPropertyDiagnostic(substitutedLine);continue}const qreg=parseQReg(substitutedLine,diagnostics);if(qreg){if(caseIndex===0){targetStatements.push(qreg);pushQRegDeclaration(qreg)}continue}const statement=parseExecutableStatement(substitutedLine,constants,observables,diagnostics,observableUses,propertyAssertionsEnabled,typedClassicalValuesEnabled,functionResultType,feedForwardEnabled,typedCollectionEnabled);if(statement){targetStatements.push(statement);continue}const diagnosticCount=diagnostics.length;validateUnsupportedSyntax(substitutedLine,diagnostics);if(diagnostics.length===diagnosticCount){diagnostics.push(createDiagnostic({code:invalidPropertyBlockDiagnostic.code,severity:"error",message:`${invalidPropertyBlockDiagnostic.messagePrefix}: ${substitutedLine.text}.`,hint:invalidPropertyBlockDiagnostic.hint,translationKey:invalidPropertyBlockDiagnostic.translationKey,translationValues:{block:substitutedLine.text},line:substitutedLine.line}))}}};const parseBlockLeaf=current=>parseExecutableStatement(current,constants,observables,diagnostics,observableUses,propertyAssertionsEnabled,typedClassicalValuesEnabled,functionResultType,feedForwardEnabled,typedCollectionEnabled);const parseComputeApply=(start,lines=sourceLines4)=>parseNMComputeApplyPair(lines,start,parseBlockLeaf,diagnostics,()=>computeApplyId++);const parseBlockStatement=(start,visible=statements,lines=sourceLines4)=>{if(/^compute\s*\{$/u.test(lines[start].text))return parseComputeApply(start,lines);if(computeApplyReader&&(/^(?:if|for)\b/u.test(lines[start].text)||isNMMainResultMatch(lines,start,visible))){return parseNMMainConditional(lines,start,{diagnostics,visible,numericNames:[...Object.keys(constants),...Object.keys(params)],feedForward:feedForwardEnabled,classicalControl:options.experimental?.classicalFunctions===true&&options.experimental?.typedClassicalValues===true,parseComputeApply:index=>parseComputeApply(index,lines),parseStatement:parseBlockLeaf})}return{statement:parseBlockLeaf(lines[start]),end:start}};for(let idx=0;idx<sourceLines4.length;idx+=1){const line=sourceLines4[idx];if(/^compute\s*\{$/u.test(line.text)){const pair=parseComputeApply(idx);if(pair.statement)statements.push(pair.statement);idx=pair.end;continue}if(closesNMSourceBlock(line)){continue}if(/^train\s*\{\s*$/.test(line.text)){const parsedTrain=parseNMTrainBlock(sourceLines4,idx,{qmlTrainingControls:qmlTrainingControlsEnabled,classicalFunctions:options.experimental?.classicalFunctions,typedClassicalValues:options.experimental?.typedClassicalValues});statements.push(parsedTrain.block);diagnostics.push(...parsedTrain.diagnostics);idx=parsedTrain.nextIndex;continue}if(/^train\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-QML-104",severity:"error",message:`Invalid train block syntax: ${line.text}.`,hint:"Use train { followed by objective, optimizer, and steps directives.",translationKey:"invalidTrainDirective",translationValues:{directive:line.text},line:line.line}));continue}const goalMatch=line.text.match(/^@goal\s*\(\s*"((?:\\.|[^"\\])*)"\s*\)\s*;?$/);if(goalMatch){goals.push({text:goalMatch[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\"),line:line.line});continue}if(/^@goal\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-024",severity:"warning",message:`Invalid @goal annotation: ${line.text}.`,hint:'Use @goal("Describe the lab objective."); near the top of the program.',translationKey:"invalidGoalAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}const outcomeMatch=line.text.match(/^@outcome\s*\(\s*"((?:\\.|[^"\\])*)"\s*\)\s*;?$/);if(outcomeMatch){outcomes.push({text:outcomeMatch[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\"),line:line.line});continue}if(/^@outcome\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-029",severity:"warning",message:`Invalid @outcome annotation: ${line.text}.`,hint:'Use @outcome("Explain why H creates a balanced state."); near the top of the program.',translationKey:"invalidOutcomeAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}const rubricMatch=line.text.match(/^@rubric\s*\(\s*"((?:\\.|[^"\\])*)"\s*(?:,\s*weight\s*:\s*(-?\d+(?:\.\d+)?))?\s*\)\s*;?$/);if(rubricMatch){const weight=rubricMatch[2]!=null?Number.parseFloat(rubricMatch[2]):void 0;if(weight!=null&&(weight<0||weight>1)){diagnostics.push(createDiagnostic({code:"NM-PARSE-030",severity:"warning",message:`Invalid @rubric annotation: ${line.text}.`,hint:'Use @rubric("Explain the probability distribution.", weight: 0.5); with weight between 0 and 1.',translationKey:"invalidRubricAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}rubrics.push({text:rubricMatch[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\"),...weight!=null?{weight}:{},line:line.line});continue}if(/^@rubric\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-030",severity:"warning",message:`Invalid @rubric annotation: ${line.text}.`,hint:'Use @rubric("Explain the probability distribution.", weight: 0.5); near the top of the program.',translationKey:"invalidRubricAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}const misconceptionMatch=line.text.match(/^@misconception\s*\(\s*"((?:\\.|[^"\\])*)"\s*\)\s*;?$/);if(misconceptionMatch){misconceptions.push({text:misconceptionMatch[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\"),line:line.line});continue}if(/^@misconception\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-031",severity:"warning",message:`Invalid @misconception annotation: ${line.text}.`,hint:'Use @misconception("H is not a random classical coin flip."); near the top of the program.',translationKey:"invalidMisconceptionAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}const quizMatch=line.text.match(/^@quiz\s*\(\s*"((?:\\.|[^"\\])*)"\s*(?:,\s*answer\s*:\s*"((?:\\.|[^"\\])*)")?\s*\)\s*;?$/);if(quizMatch){quizzes.push({question:quizMatch[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\"),...quizMatch[2]!=null?{answer:quizMatch[2].replace(/\\"/g,'"').replace(/\\\\/g,"\\")}:{},line:line.line});continue}if(/^@quiz\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-032",severity:"warning",message:`Invalid @quiz annotation: ${line.text}.`,hint:'Use @quiz("What are the final probabilities?", answer: "50% for |0> and 50% for |1>."); near the top of the program.',translationKey:"invalidQuizAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}const labMatch=line.text.match(/^@lab\s*\(\s*"((?:\\.|[^"\\])*)"\s*(?:,\s*minutes\s*:\s*(-?\d+))?\s*\)\s*;?$/);if(labMatch){const minutes=labMatch[2]!=null?Number.parseInt(labMatch[2],10):void 0;if(minutes!=null&&minutes<=0){diagnostics.push(createDiagnostic({code:"NM-PARSE-033",severity:"warning",message:`Invalid @lab annotation: ${line.text}.`,hint:'Use @lab("bell-basics", minutes: 10); with a positive minutes value.',translationKey:"invalidLabAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}labs.push({id:labMatch[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\"),...minutes!=null?{minutes}:{},line:line.line});continue}if(/^@lab\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-033",severity:"warning",message:`Invalid @lab annotation: ${line.text}.`,hint:'Use @lab("bell-basics", minutes: 10); near the top of the program.',translationKey:"invalidLabAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}const challengeMatch=line.text.match(/^@challenge\s*\(\s*"((?:\\.|[^"\\])*)"\s*(?:,\s*difficulty\s*:\s*"(beginner|intermediate|advanced)")?\s*\)\s*;?$/);if(challengeMatch){challenges.push({id:challengeMatch[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\"),...challengeMatch[2]!=null?{difficulty:challengeMatch[2]}:{},line:line.line});continue}if(/^@challenge\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-041",severity:"warning",message:`Invalid @challenge annotation: ${line.text}.`,hint:'Use @challenge("bell-from-scratch", difficulty: "beginner"); near the top of the program.',translationKey:"invalidChallengeAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}const datasetMatch=line.text.match(/^@dataset\s*\(\s*"((?:\\.|[^"\\])*)"\s*(?:,\s*split\s*:\s*"((?:\\.|[^"\\])*)")?\s*\)\s*;?$/);if(datasetMatch){const split=datasetMatch[2]?.replace(/\\"/g,'"').replace(/\\\\/g,"\\");if(split!=null&&!["train","validation","test","synthetic"].includes(split)){diagnostics.push(createDiagnostic({code:"NM-PARSE-034",severity:"warning",message:`Invalid @dataset annotation: ${line.text}.`,hint:'Use @dataset("bell-balanced", split: "train"); with split train, validation, test, or synthetic.',translationKey:"invalidDatasetAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}datasets.push({id:datasetMatch[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\"),...split!=null?{split}:{},line:line.line});continue}if(/^@dataset\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-034",severity:"warning",message:`Invalid @dataset annotation: ${line.text}.`,hint:'Use @dataset("bell-balanced", split: "train"); near the top of the program.',translationKey:"invalidDatasetAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}const checkpointMatch=line.text.match(/^@checkpoint\s*\(\s*"((?:\\.|[^"\\])*)"\s*(?:,\s*kind\s*:\s*"((?:\\.|[^"\\])*)")?\s*\)\s*;?$/);if(checkpointMatch){const kind=checkpointMatch[2]?.replace(/\\"/g,'"').replace(/\\\\/g,"\\");if(kind!=null&&!["predict","inspect","explain","debug"].includes(kind)){diagnostics.push(createDiagnostic({code:"NM-PARSE-035",severity:"warning",message:`Invalid @checkpoint annotation: ${line.text}.`,hint:'Use @checkpoint("Predict before running.", kind: "predict"); with kind predict, inspect, explain, or debug.',translationKey:"invalidCheckpointAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}checkpoints.push({text:checkpointMatch[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\"),...kind!=null?{kind}:{},line:line.line});continue}if(/^@checkpoint\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-035",severity:"warning",message:`Invalid @checkpoint annotation: ${line.text}.`,hint:'Use @checkpoint("Predict before running.", kind: "predict"); near the top of the program.',translationKey:"invalidCheckpointAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}const hintMatch=line.text.match(/^@hint\s*\(\s*"((?:\\.|[^"\\])*)"\s*\)\s*;?$/);if(hintMatch){hints.push({text:hintMatch[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\"),line:line.line});continue}if(/^@hint\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-025",severity:"warning",message:`Invalid @hint annotation: ${line.text}.`,hint:'Use @hint("Try changing the rotation angle."); near the top of the program.',translationKey:"invalidHintAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}const conceptMatch=line.text.match(/^@concept\s*\(\s*"((?:\\.|[^"\\])*)"\s*\)\s*;?$/);if(conceptMatch){concepts.push({name:conceptMatch[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\"),line:line.line});continue}if(/^@concept\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-026",severity:"warning",message:`Invalid @concept annotation: ${line.text}.`,hint:'Use @concept("superposition"); near the top of the program.',translationKey:"invalidConceptAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}const levelMatch=line.text.match(/^@level\s*\(\s*"(beginner|intermediate|advanced)"\s*\)\s*;?$/);if(levelMatch){level={value:levelMatch[1],line:line.line};continue}if(/^@level\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-027",severity:"warning",message:`Invalid @level annotation: ${line.text}.`,hint:'Use @level("beginner");, @level("intermediate");, or @level("advanced"); near the top of the program.',translationKey:"invalidLevelAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}const prereqMatch=line.text.match(/^@prereq\s*\(\s*"((?:\\.|[^"\\])*)"\s*\)\s*;?$/);if(prereqMatch){prerequisites.push({name:prereqMatch[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\"),line:line.line});continue}if(/^@prereq\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-028",severity:"warning",message:`Invalid @prereq annotation: ${line.text}.`,hint:'Use @prereq("basic-gates"); near the top of the program.',translationKey:"invalidPrereqAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}const explain=parseExplain(line,diagnostics);if(explain){statements.push(explain);continue}if(/^@explain\b/.test(line.text)){continue}const compilerMatch=line.text.match(/^@compiler\s*\(\s*trace\s*:\s*(true|false)\s*\)\s*;?$/);if(compilerMatch){compiler={...compiler,trace:compilerMatch[1]==="true"};continue}if(/^@compiler\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-020",severity:"warning",message:`Invalid @compiler annotation: ${line.text}.`,hint:"Use @compiler(trace: true); to show compiler steps in the Trace tab.",translationKey:"invalidCompilerAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}const semanticsMatch=line.text.match(/^@semantics\s*\(\s*"(default|strict)"\s*\)\s*;?$/);if(semanticsMatch){semantics={mode:semanticsMatch[1],line:line.line};continue}if(/^@semantics\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-SEM-000",severity:"warning",message:`Invalid @semantics annotation: ${line.text}.`,hint:'Use @semantics("strict"); to promote semantic warnings to errors.',translationKey:"invalidSemanticsAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}const optimizeMatch=line.text.match(/^@optimize\s*\((.*)\)\s*;?$/);if(optimizeMatch){optimize=parseOptimizeAnnotation(optimizeMatch[1],line,diagnostics);continue}if(/^@optimize\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-022",severity:"warning",message:`Invalid @optimize annotation: ${line.text}.`,hint:'Use @optimize(method: "adam", steps: 40, learningRate: 0.2, objective: "minimize");',translationKey:"invalidOptimizeAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}const estimateMatch=line.text.match(/^@estimate\s*\((.*)\)\s*;?$/);if(estimateMatch){estimate=parseEstimateAnnotation(estimateMatch[1],line,diagnostics);continue}if(/^@estimate\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-047",severity:"warning",message:`Invalid @estimate annotation: ${line.text}.`,hint:'Use @estimate(code: "surface", distance: 7, target_error: 1e-3);',translationKey:"invalidEstimateAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}if(/^@target_capabilities\b/u.test(line.text)){const match=line.text.match(/^@target_capabilities\s*\((.*)\)\s*;?$/u);const result2=parseNMTargetCapabilityConstraint(match?.[1]??"",line,targetCapabilityConstraintsEnabled);diagnostics.push(...result2.diagnostics);if(result2.requirement){if(targetCapabilityRequirement){diagnostics.push(createDiagnostic({code:nmTargetCapabilityConstraintDiagnosticCodes.invalidDeclaration,severity:"error",message:"Duplicate @target_capabilities annotation.",hint:"Declare one closed target capability requirement per module.",line:line.line}))}else{targetCapabilityRequirement=result2.requirement}}continue}const targetMatch=line.text.match(/^@target\s*\(\s*"([^"]+)"\s*\)\s*;?$/);if(targetMatch){target2=targetMatch[1];continue}const constraintsMatch=line.text.match(/^@constraints\s*\((.*)\)\s*;?$/);if(constraintsMatch){constraints=parseConstraintsAnnotation(constraintsMatch[1],line,diagnostics);continue}const seedMatch=line.text.match(/^@seed\s*\(\s*(\d+)\s*\)\s*;?$/);if(seedMatch){seed=Number.parseInt(seedMatch[1],10);continue}const shotsMatch=line.text.match(/^@shots\s*\(\s*(\d+)\s*\)\s*;?$/);if(shotsMatch){const count=Number.parseInt(shotsMatch[1],10);if(count<1){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-027",severity:"warning",message:`Invalid @shots annotation: ${line.text}.`,hint:"Use @shots(1024); with a positive shot count for finite-shot expectation estimates.",line:line.line}))}else{const capped=Math.min(count,1e5);if(count>capped){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-027",severity:"warning",message:`@shots(${count}) is capped to ${capped} in the playground runtime.`,hint:"Use a smaller finite-shot expectation count while experimenting in the browser.",line:line.line}))}expectationShots=capped}continue}if(/^@shots\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-027",severity:"warning",message:`Invalid @shots annotation: ${line.text}.`,hint:"Use @shots(1024); with a positive shot count for finite-shot expectation estimates.",line:line.line}));continue}const noiseMatch=line.text.match(/^@noise\s*\(\s*"([^"]+)"\s*,\s*(0(?:\.\d+)?|1(?:\.0+)?)\s*\)\s*;?$/);if(noiseMatch){if(noiseMatch[1]!=="depolarizing"&&noiseMatch[1]!=="pauli"&&noiseMatch[1]!=="readout"&&noiseMatch[1]!=="amplitude_damping"&&noiseMatch[1]!=="phase_damping"){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-005",severity:"warning",message:`Unsupported noise model: ${noiseMatch[1]}.`,hint:'The playground runtime models @noise("depolarizing", p), @noise("pauli", p), @noise("readout", p), @noise("amplitude_damping", p), and @noise("phase_damping", p).',translationKey:"unsupportedNoiseModel",translationValues:{model:noiseMatch[1]},line:line.line}))}else{noise={model:noiseMatch[1],probability:Number.parseFloat(noiseMatch[2])}}continue}const mitigationMatch=line.text.match(/^@mitigation\s*\(\s*"([^"]+)"\s*\)\s*;?$/);if(mitigationMatch){if(mitigationMatch[1]!=="readout"&&mitigationMatch[1]!=="zne"){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-028",severity:"warning",message:`Unsupported mitigation model: ${mitigationMatch[1]}.`,hint:'The playground runtime models @mitigation("readout") and @mitigation("zne").',translationKey:"unsupportedMitigationModel",translationValues:{model:mitigationMatch[1]},line:line.line}))}else{mitigation={model:mitigationMatch[1]}}continue}if(/^@mitigation\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-028",severity:"warning",message:`Invalid @mitigation annotation: ${line.text}.`,hint:'Use @mitigation("readout"); or @mitigation("zne"); after a noise annotation.',translationKey:"invalidMitigationAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}const moduleMatch=line.text.match(/^module\s+([A-Za-z_]\w*)\s*;?$/);if(moduleMatch){moduleName=moduleMatch[1];continue}const functionResultSignature=parseNMFunctionResultSignature(line,functionResultsEnabled);if(functionResultSignature.candidate){mainLine=line.line;diagnostics.push(...functionResultSignature.diagnostics);functionResultType=functionResultSignature.resultType;continue}const mainMatch=line.text.match(/^fn\s+main\s*\(\s*\)\s*\{?$/);if(mainMatch){mainLine=line.line;continue}const constDecl=parseConst(line,constants,diagnostics);if(constDecl){statements.push(constDecl);constants[constDecl.name]=constDecl.value;continue}if(parseObservable(line,constants,observables,observableNames,observableMetadata,diagnostics)){continue}const paramDecl=parseParam(line,constants,diagnostics);if(paramDecl){statements.push(paramDecl);constants[paramDecl.name]=paramDecl.value;params[paramDecl.name]=paramDecl.value;continue}const qreg=parseQReg(line,diagnostics);if(qreg){statements.push(qreg);pushQRegDeclaration(qreg);continue}const snapshotMatch=line.text.match(/^snapshot\s+"((?:\\.|[^"\\])*)"\s*\{\s*$/);if(snapshotMatch){const body=[];let closed=false;idx+=1;while(idx<sourceLines4.length){if(closesNMSourceBlock(sourceLines4[idx])){closed=true;break}idx=parseScopedStatement(idx,body,invalidSnapshotBlockDiagnostic)+1}if(!closed){diagnostics.push(createDiagnostic({code:invalidSnapshotBlockDiagnostic.code,severity:"error",message:`Unterminated snapshot block: ${snapshotMatch[1]}.`,hint:"Close snapshot blocks with } after the final setup or assertion statement.",translationKey:invalidSnapshotBlockDiagnostic.translationKey,translationValues:{block:line.text},line:line.line}))}const snapshotStatement={kind:"snapshot",name:snapshotMatch[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\"),body,line:line.line};statements.push(snapshotStatement);continue}if(/^snapshot\b/.test(line.text)){diagnostics.push(createDiagnostic({code:invalidSnapshotBlockDiagnostic.code,severity:"error",message:`Invalid snapshot block syntax: ${line.text}.`,hint:'Use snapshot "bell golden" { H(q[0]); assert probability(|0>) > 0.4; }',translationKey:invalidSnapshotBlockDiagnostic.translationKey,translationValues:{block:line.text},line:line.line}));continue}const propertyMatch=line.text.match(/^property\s+"((?:\\.|[^"\\])*)"\s*\{\s*$/);if(propertyMatch){const propertyName=propertyMatch[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\");const cases=[];let closedForall=false;let closedProperty=false;idx+=1;const forallLine=sourceLines4[idx];const forallMatch=forallLine?.text.match(/^forall\s+([A-Za-z_]\w*)\s+in\s+(.+?)\s*\.\.\s*(.+?)\s+step\s+(.+?)\s*\{\s*$/);if(!forallLine||!forallMatch){pushInvalidPropertyDiagnostic(line,line.text);while(idx<sourceLines4.length&&!closesNMSourceBlock(sourceLines4[idx])){idx+=1}continue}const parameter=forallMatch[1];const values2=buildForallValues(forallLine,forallMatch[2],forallMatch[3],forallMatch[4])??[];const bodyLines=[];let forallDepth=1;idx+=1;while(idx<sourceLines4.length){if(closesNMSourceBlock(sourceLines4[idx])&&--forallDepth===0){closedForall=true;break}if(opensNMSourceBlock(sourceLines4[idx]))forallDepth++;bodyLines.push(sourceLines4[idx]);idx+=1}if(!closedForall){pushInvalidPropertyDiagnostic(line,line.text)}else{idx+=1;while(idx<sourceLines4.length){if(closesNMSourceBlock(sourceLines4[idx])){closedProperty=true;break}pushInvalidPropertyDiagnostic(sourceLines4[idx]);idx+=1}}if(!closedProperty){pushInvalidPropertyDiagnostic(line,line.text)}values2.forEach((value,caseIndex)=>{const body=[];parsePropertyCaseBody(bodyLines,parameter,value,caseIndex,body,forallLine.line);cases.push({value,body,line:forallLine.line})});statements.push({kind:"property",name:propertyName,parameter,cases,line:line.line});continue}if(/^property\b/.test(line.text)||/^forall\b/.test(line.text)){diagnostics.push(createDiagnostic({code:invalidPropertyBlockDiagnostic.code,severity:"error",message:`Invalid property block syntax: ${line.text}.`,hint:invalidPropertyBlockDiagnostic.hint,translationKey:invalidPropertyBlockDiagnostic.translationKey,translationValues:{block:line.text},line:line.line}));continue}const testMatch=line.text.match(/^test\s+"((?:\\.|[^"\\])*)"\s*\{\s*$/);if(testMatch){const body=[];let closed=false;idx+=1;while(idx<sourceLines4.length){if(closesNMSourceBlock(sourceLines4[idx])){closed=true;break}idx=parseScopedStatement(idx,body)+1}if(!closed){diagnostics.push(createDiagnostic({code:"NM-PARSE-043",severity:"error",message:`Unterminated test block: ${testMatch[1]}.`,hint:"Close test blocks with } after the final assertion.",translationKey:"invalidTestBlock",translationValues:{block:line.text},line:line.line}))}const testStatement={kind:"test",name:testMatch[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\"),body,line:line.line};statements.push(testStatement);continue}if(/^test\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-043",severity:"error",message:`Invalid test block syntax: ${line.text}.`,hint:'Use test "bell behavior" { assert probability(|00>) > 0.45; }',translationKey:"invalidTestBlock",translationValues:{block:line.text},line:line.line}));continue}const observeMatch=line.text.match(/^observe\s+([A-Za-z_]\w*)\s*\{\s*$/);if(observeMatch){const body=[];let closed=false;idx+=1;while(idx<sourceLines4.length){if(closesNMSourceBlock(sourceLines4[idx])){closed=true;break}const bodyLine=sourceLines4[idx],{statement:bodyStmt,end}=parseBlockStatement(idx,[...statements,...body]);idx=end;if(bodyStmt&&(isObserveBodyStatement(bodyStmt)||options.experimental?.classicalFunctions===true&&["classicalDecl","return"].includes(bodyStmt.kind))){body.push(bodyStmt)}else if(bodyStmt){diagnostics.push(createDiagnostic({code:"NM-TYPE-021",severity:"error",message:`Unsupported statement inside observe block: ${bodyLine.text}.`,hint:"Observe blocks support metric, expect, assert probability, assert expectation, assert entangled, and assert equivalent statements.",translationKey:"unsupportedObserveStatement",translationValues:{statement:bodyLine.text},line:bodyLine.line}))}else{validateUnsupportedSyntax(sourceLines4[idx],diagnostics)}idx+=1}if(!closed){diagnostics.push(createDiagnostic({code:"NM-PARSE-021",severity:"error",message:`Unterminated observe block: ${observeMatch[1]}.`,hint:"Close observe blocks with } after the final metric or assertion.",translationKey:"unterminatedObserveBlock",translationValues:{name:observeMatch[1]},line:line.line}))}const observeStatement={kind:"observe",name:observeMatch[1],body,line:line.line};statements.push(observeStatement);continue}if(/^observe\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-022",severity:"error",message:`Invalid observe block syntax: ${line.text}.`,hint:"Use observe report_name { metric p00 = probability(|00>); }",translationKey:"invalidObserveBlock",translationValues:{block:line.text},line:line.line}));continue}if(options.experimental?.classicalFunctions===true&&options.experimental?.typedClassicalValues===true&&(/^(?:if|for)\b/u.test(line.text)||isNMMainResultMatch(sourceLines4,idx,statements))||computeApplyReader&&/^if\b/u.test(line.text)){const parsed=parseNMMainConditional(sourceLines4,idx,{diagnostics,visible:statements,numericNames:[...Object.keys(constants),...Object.keys(params)],feedForward:feedForwardEnabled,parseComputeApply,classicalControl:options.experimental?.classicalFunctions===true&&options.experimental?.typedClassicalValues===true,parseStatement:current=>parseExecutableStatement(current,constants,observables,diagnostics,observableUses,propertyAssertionsEnabled,typedClassicalValuesEnabled,functionResultType,feedForwardEnabled,typedCollectionEnabled)});if(parsed.statement)statements.push(parsed.statement);idx=parsed.end;continue}const simpleIfMatch=line.text.match(new RegExp(`^if\\s*\\(\\s*(${IDENTIFIER_SOURCE4})\\s*(==|!=)\\s*([01])\\s*\\)\\s*\\{\\s*$`,"u"));const extendedIfMatch=simpleIfMatch?void 0:line.text.match(/^if\s*\(\s*(.*?)\s*\)\s*\{\s*$/u);if(simpleIfMatch||extendedIfMatch){const predicateResult=extendedIfMatch?parseNMClassicalPredicate(extendedIfMatch[1]):void 0;if(extendedIfMatch&&!feedForwardEnabled){diagnostics.push(createDiagnostic({code:nmFeedForwardDiagnosticCodes.featureDisabled,severity:"error",message:"Extended measurement-conditioned predicate syntax requires explicit experimental negotiation.",hint:"Set parse options experimental.feedForward=true while evaluating NM-RFC-0011. Stable simple if/else remains available without this flag.",line:line.line}))}if(extendedIfMatch&&predicateResult&&!predicateResult.success){diagnostics.push(createDiagnostic({code:nmFeedForwardDiagnosticCodes.unsupportedPredicate,severity:"error",message:`Unsupported measurement-conditioned predicate: ${extendedIfMatch[1]}.`,hint:predicateResult.reason,line:line.line}))}const body=[];idx+=1;while(idx<sourceLines4.length&&!closesNMSourceBlock(sourceLines4[idx])){const{statement:bodyStmt,end}=parseBlockStatement(idx,[...statements,...body]);idx=end;if(bodyStmt){body.push(bodyStmt)}else if(extendedIfMatch&&feedForwardEnabled&&/^(?:if|until|match|train|sample|qreg)\b|^let\b.*\bqreg\s*\[/u.test(sourceLines4[idx].text)){diagnostics.push(createDiagnostic({code:nmFeedForwardDiagnosticCodes.invalidConditionalBody,severity:"error",message:`Extended conditional body contains unsupported syntax: ${sourceLines4[idx].text}.`,hint:"Move allocation, training, sampling, and nested control regions outside the extended conditional.",line:sourceLines4[idx].line}))}else{validateUnsupportedSyntax(sourceLines4[idx],diagnostics)}idx+=1}const elseBody=[];if(idx+1<sourceLines4.length&&sourceLines4[idx+1].text==="else {"){idx+=2;while(idx<sourceLines4.length&&!closesNMSourceBlock(sourceLines4[idx])){const{statement:bodyStmt,end}=parseBlockStatement(idx,[...statements,...elseBody]);idx=end;if(bodyStmt){elseBody.push(bodyStmt)}else if(extendedIfMatch&&feedForwardEnabled&&/^(?:if|until|match|train|sample|qreg)\b|^let\b.*\bqreg\s*\[/u.test(sourceLines4[idx].text)){diagnostics.push(createDiagnostic({code:nmFeedForwardDiagnosticCodes.invalidConditionalBody,severity:"error",message:`Extended conditional else body contains unsupported syntax: ${sourceLines4[idx].text}.`,hint:"Move allocation, training, sampling, and nested control regions outside the extended conditional.",line:sourceLines4[idx].line}))}else{validateUnsupportedSyntax(sourceLines4[idx],diagnostics)}idx+=1}}if(simpleIfMatch){statements.push({kind:"if",binding:simpleIfMatch[1],operator:simpleIfMatch[2],value:Number.parseInt(simpleIfMatch[3],10),body,...elseBody.length>0?{elseBody}:{},line:line.line})}else if(predicateResult?.success){statements.push({kind:"if",predicate:predicateResult.predicate,body,...elseBody.length>0?{elseBody}:{},line:line.line})}continue}if(/^else\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-006",severity:"error",message:`Unsupported else block without a matching if: ${line.text}.`,hint:"Attach else directly after a supported if block: if (m == 1) { X(q[0]); } else { Z(q[0]); }",translationKey:"unsupportedConditional",translationValues:{conditional:line.text},line:line.line}));continue}const untilMatch=line.text.match(new RegExp(`^until\\s*\\(\\s*(${IDENTIFIER_SOURCE4})\\s*(==|!=)\\s*([01])\\s*\\)\\s+max\\s+(\\d+)\\s*\\{\\s*$`,"u"));if(untilMatch){const declaredMaxIterations=Number.parseInt(untilMatch[4],10);const body=[];let closed=false;idx+=1;while(idx<sourceLines4.length){if(closesNMSourceBlock(sourceLines4[idx])){closed=true;break}const{statement:bodyStmt,end}=parseBlockStatement(idx,[...statements,...body]);idx=end;if(bodyStmt){body.push(bodyStmt)}else{validateUnsupportedSyntax(sourceLines4[idx],diagnostics)}idx+=1}if(!closed){diagnostics.push(createDiagnostic({code:"NM-PARSE-042",severity:"error",message:`Unterminated until block: ${line.text}.`,hint:"Close until blocks with } after the retry body.",translationKey:"invalidUntilBlock",translationValues:{block:line.text},line:line.line}))}if(declaredMaxIterations<1){diagnostics.push(createDiagnostic({code:"NM-PARSE-042",severity:"error",message:`Invalid until max iteration count: ${untilMatch[4]}.`,hint:"Use until (flag == 1) max 10 { ... } with max between 1 and 32.",translationKey:"invalidUntilBlock",translationValues:{block:line.text},line:line.line}))}const maxIterations=Math.min(Math.max(declaredMaxIterations,1),MAX_UNTIL_ITERATIONS);if(declaredMaxIterations>MAX_UNTIL_ITERATIONS){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-009",severity:"warning",message:`until max ${declaredMaxIterations} is capped to ${MAX_UNTIL_ITERATIONS} in the playground runtime.`,hint:"Use a smaller retry budget while experimenting in the browser.",line:line.line}))}const untilStatement={kind:"until",binding:untilMatch[1],operator:untilMatch[2],value:Number.parseInt(untilMatch[3],10),maxIterations,body,line:line.line};statements.push(untilStatement);continue}if(/^until\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-042",severity:"error",message:`Invalid until block syntax: ${line.text}.`,hint:"Use until (flag == 1) max 10 { ... } with a measured or derived Bit.",translationKey:"invalidUntilBlock",translationValues:{block:line.text},line:line.line}));continue}const matchBlock=line.text.match(new RegExp(`^match\\s*\\(\\s*(${IDENTIFIER_SOURCE4}(?:\\s*,\\s*${IDENTIFIER_SOURCE4})*)\\s*\\)\\s*\\{\\s*$`,"u"));if(matchBlock){const bindings3=matchBlock[1].split(",").map(binding=>binding.trim());const cases=[];const seenPatterns=new Set;let closed=false;idx+=1;while(idx<sourceLines4.length){if(closesNMSourceBlock(sourceLines4[idx])){closed=true;break}const caseLine=sourceLines4[idx];const caseMatch=caseLine.text.match(/^\(\s*([01](?:\s*,\s*[01])*)\s*\)\s*=>\s*\{\s*$/);if(!caseMatch){diagnostics.push(createDiagnostic({code:"NM-PARSE-006",severity:"error",message:`Unsupported match case: ${caseLine.text}.`,hint:"Use cases such as (0, 1) => { X(q[2]); } with one 0/1 value per matched Bit.",translationKey:"unsupportedConditional",translationValues:{conditional:caseLine.text},line:caseLine.line}));idx+=1;continue}const pattern=caseMatch[1].split(",").map(part=>Number.parseInt(part.trim(),10));if(pattern.length!==bindings3.length){diagnostics.push(createDiagnostic({code:"NM-PARSE-006",severity:"error",message:`Match case width ${pattern.length} does not match selector width ${bindings3.length}.`,hint:"Use exactly one 0/1 pattern value for each Bit in the match selector.",translationKey:"unsupportedConditional",translationValues:{conditional:caseLine.text},line:caseLine.line}))}const patternKey=pattern.join(",");if(seenPatterns.has(patternKey)){diagnostics.push(createDiagnostic({code:"NM-PARSE-006",severity:"error",message:`Duplicate match case pattern: (${patternKey}).`,hint:"Each match pattern should appear once so export and runtime semantics stay deterministic.",translationKey:"unsupportedConditional",translationValues:{conditional:caseLine.text},line:caseLine.line}))}seenPatterns.add(patternKey);const body=[];idx+=1;while(idx<sourceLines4.length&&!closesNMSourceBlock(sourceLines4[idx])){const{statement:bodyStmt,end}=parseBlockStatement(idx,[...statements,...body]);idx=end;if(bodyStmt){body.push(bodyStmt)}else{validateUnsupportedSyntax(sourceLines4[idx],diagnostics)}idx+=1}cases.push({pattern,body,line:caseLine.line});idx+=1}if(!closed){diagnostics.push(createDiagnostic({code:"NM-PARSE-006",severity:"error",message:`Unterminated match block: ${line.text}.`,hint:"Close match blocks with } after the final case.",translationKey:"unsupportedConditional",translationValues:{conditional:line.text},line:line.line}))}statements.push({kind:"match",bindings:bindings3,cases,line:line.line});continue}if(/^match\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-006",severity:"error",message:`Unsupported match block: ${line.text}.`,hint:"Use match (a, b) { (0, 1) => { X(q[2]); } } with measured or derived Bit names.",translationKey:"unsupportedConditional",translationValues:{conditional:line.text},line:line.line}));continue}if(/^if\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-006",severity:"error",message:`Unsupported conditional: ${line.text}.`,hint:"Use a classical-bit guard such as: if (m == 1) { X(q[1]); }",translationKey:"unsupportedConditional",translationValues:{conditional:line.text},line:line.line}));continue}if(/^for\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-008",severity:"error",message:`Unsupported for loop: ${line.text}.`,hint:"Use an integer range, for example: for i in 0..3 { H(q[i]); }",line:line.line}));continue}const statement=parseExecutableStatement(line,constants,observables,diagnostics,observableUses,propertyAssertionsEnabled,typedClassicalValuesEnabled,functionResultType,feedForwardEnabled,typedCollectionEnabled);if(statement){statements.push(statement);continue}validateUnsupportedSyntax(line,diagnostics)}if(!moduleName){diagnostics.push(createDiagnostic({code:"NM-PARSE-002",severity:"error",message:"Missing module declaration.",hint:"Start with a declaration such as: module bell_state;",translationKey:"missingModule"}))}if(!mainLine){diagnostics.push(createDiagnostic({code:"NM-PARSE-003",severity:"error",message:"Missing fn main() entry point.",hint:"The playground currently executes a single fn main() block.",translationKey:"missingMain"}))}if(numQubits===0){diagnostics.push(createDiagnostic({code:"NM-TYPE-004",severity:"error",message:"No qreg declaration found.",hint:"Declare a register before gates, for example: let q = qreg[2];",translationKey:"missingQreg"}))}const executableQubitLimit=target2==="browser-stabilizer"?nmStabilizerMaxQubits:target2==="browser-mps"||target2==="matrix-product-state"?NM_MPS_MAX_QUBITS:playgroundRuntimeLimits.maxQubits;const executableQubitLimitLabel=target2==="browser-stabilizer"?"browser-stabilizer target":target2==="browser-mps"||target2==="matrix-product-state"?"browser-mps target":"browser playground";if(numQubits>executableQubitLimit){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-002",severity:"error",message:`Too many qubits: ${numQubits}.`,hint:`The ${executableQubitLimitLabel} supports up to ${executableQubitLimit} qubits.`,translationKey:"tooManyQubits",translationValues:{count:numQubits,max:executableQubitLimit}}))}const stdObservableBlockedLines=validateStdObservableRequirements(observableMetadata,observableUses,qregSizes,diagnostics);validateNMQubitReferences(statements,qubitMap,numQubits,diagnostics,stdObservableBlockedLines,computeApply.active);if(feedForwardEnabled){diagnostics.push(...validateNMFeedForwardPredicates(statements))}if(typedClassicalValuesEnabled){if(functionResultType&&loweredFunctions.mainResultType)functionResultType=loweredFunctions.mainResultType;attachClassicalFunctionRuntimeExpressions(statements,loweredFunctions.runtimeExpressions,loweredFunctions.runtimeAngles,loweredFunctions.runtimeConditions,loweredFunctions.runtimeTargets);diagnostics.push(...validateNMTypedClassicalValues(statements,options.experimental?.classicalFunctions===true,{resultContext:Boolean(functionResultType),functionResults:functionResultsEnabled&&options.experimental?.classicalFunctions===true}))}else diagnostics.push(...validateNMDisabledDynamicIndices(statements));if(computeApply.active&&!validateNMComputeApplyProgram(statements,Boolean(noise||mitigation||preprocessed.composedNoise),diagnostics))return failedNMParseResult(diagnostics);const typedCollectionValidation=validateNMTypedCollection(typedCollectionEnabled?preprocessed.typedCollectionRequest:void 0,statements,seed,noise,mitigation);diagnostics.push(...typedCollectionValidation.diagnostics);const typedCollectionBodyLines=new Set(sourceLines4.filter(line=>line.typedCollectionBody===true).map(line=>line.line));const feedForwardSyntaxUsed=feedForwardEnabled&&usesNMFeedForwardSyntax(statements,typedCollectionBodyLines);if(functionResultType&&mainLine){diagnostics.push(...validateNMFunctionResults(statements,functionResultType,mainLine,options.experimental?.classicalFunctions===true))}diagnostics.push(...validateNMTrainingSelections(statements,params,mainLine,loweredFunctions.provenance,options.experimental));if(propertyAssertionsEnabled&&(seed==null||expectationShots==null)){const missing=[seed==null?"@seed":void 0,expectationShots==null?"@shots":void 0].filter(value=>value!=null).join(" and ");for(const assertion of collectFiniteShotPropertyAssertions(statements)){diagnostics.push(createDiagnostic({code:nmPropertyAssertionDiagnosticCodes.deterministicSamplingRequired,severity:"error",message:`Finite-shot tolerance assertions require ${missing}.`,hint:"Declare both @seed(<unsigned integer>); and @shots(<positive integer>); before fn main.",translationKey:"propertyAssertionDeterministicSamplingRequired",translationValues:{missing},line:assertion.line}))}}const parameterizedDepth=statements.filter(statement=>statement.kind==="gate"&&(statement.thetaName||statement.angleNames?.some(Boolean))).length;if(Object.keys(params).length>=nmTrainabilityThresholds.minParams&&numQubits>=nmTrainabilityThresholds.minQubits&¶meterizedDepth>=nmTrainabilityThresholds.minParameterizedDepth)diagnostics.push(createDiagnostic({code:"NM-QML-301",severity:"warning",message:"This ansatz risks vanishing gradients (barren plateau).",hint:"Consider fewer layers, layer-wise training, or an identity-block initialization.",translationKey:"barrenPlateauRisk",line:statements.find(statement=>statement.kind==="param")?.line}));const composedNoise=preprocessed.composedNoise?resolveNMComposedNoiseProgram(preprocessed.composedNoise,{qregSizes,qubitMap,statements,target:target2,seed,sampleShots:preprocessed.sampleShots,numQubits,noise,mitigation,hasQECExperiments:preprocessed.qecExperiments!=null},diagnostics):void 0;let program={...loweredFunctions.provenance?{classicalFunctions:loweredFunctions.provenance}:{},moduleName,...preprocessed.unitaryModifiers.length?{unitaryModifiers:preprocessed.unitaryModifiers}:{},...options.experimental?.moduleVisibility?{moduleVisibility:{experimental:true,declarations:preprocessed.moduleVisibilityDeclarations}}:{},...options.experimental?.exactImports||options.experimental?.genericCircuits||options.experimental?.genericOracles?{imports:{experimentalExact:true,declarations:preprocessed.importDeclarations}}:{},...preprocessed.genericOracles?{genericOracles:preprocessed.genericOracles}:{},...preprocessed.genericCircuits?{genericCircuits:preprocessed.genericCircuits}:{},...preprocessed.qecExperiments?{qecExperiments:preprocessed.qecExperiments}:{},...composedNoise?{composedNoise}:{},...preprocessed.comptimeConstants?{comptimeConstants:preprocessed.comptimeConstants}:{},...propertyAssertionsEnabled?{propertyAssertions:{experimental:true,contractVersion:NM_PROPERTY_ASSERTIONS_CONTRACT_VERSION}}:{},...typedClassicalValuesEnabled?{typedClassicalValues:{experimental:true,contractVersion:NM_TYPED_CLASSICAL_VALUES_CONTRACT_VERSION}}:{},...functionResultType?{functionResults:{experimental:true,contractVersion:NM_FUNCTION_RESULTS_CONTRACT_VERSION,resultType:functionResultType,errorType:"Error"}}:{},...qmlTrainingControlsEnabled?{qmlTrainingControls:{experimental:true,contractVersion:NM_QML_TRAINING_CONTROLS_CONTRACT_VERSION}}:{},...feedForwardSyntaxUsed?{feedForward:{experimental:true,contractVersion:NM_FEED_FORWARD_CONTRACT_VERSION}}:{},...typedCollectionValidation.metadata?{typedCollection:typedCollectionValidation.metadata}:{},compiler,semantics,optimize,estimate,...goals.length>0?{goals}:{},...outcomes.length>0?{outcomes}:{},...rubrics.length>0?{rubrics}:{},...misconceptions.length>0?{misconceptions}:{},...quizzes.length>0?{quizzes}:{},...labs.length>0?{labs}:{},...challenges.length>0?{challenges}:{},...datasets.length>0?{datasets}:{},...checkpoints.length>0?{checkpoints}:{},...hints.length>0?{hints}:{},...concepts.length>0?{concepts}:{},...level?{level}:{},...prerequisites.length>0?{prerequisites}:{},target:target2,constraints,noise,mitigation,seed,expectationShots,sampleShots:preprocessed.sampleShots,functions:mainLine?[{name:"main",body:statements,...functionResultType?{resultType:functionResultType}:{},line:mainLine}]:[],statements};if(targetCapabilityConstraintsEnabled){const evaluation=targetCapabilityRequirement&&!diagnostics.some(diagnostic5=>diagnostic5.severity==="error")?evaluateNMTargetCapabilityConstraint(program,numQubits,targetCapabilityRequirement):void 0;if(evaluation)diagnostics.push(...evaluation.diagnostics);program={...program,targetCapabilityConstraints:{experimental:true,contractVersion:NM_TARGET_CAPABILITY_CONSTRAINTS_CONTRACT_VERSION,...targetCapabilityRequirement?{requirement:targetCapabilityRequirement}:{},...evaluation?{evidence:evaluation.evidence}:{}}}}if(!diagnostics.some(diagnostic5=>diagnostic5.severity==="error")){diagnostics.push(...checkSemantics(program))}if(!diagnostics.some(diagnostic5=>diagnostic5.severity==="error")){analyzeTargetProfile(program,numQubits,diagnostics)}return attachNMComptimeStructureProvenance(code,{program,diagnostics,sourceLines:sourceLines4.map(stripNMTokenLineBoundary),qubitMap,constants,params,numQubits})}function parseOptimizeAnnotation(body,line,diagnostics){const optimize={optimizer:"gd",steps:40,learningRate:.2,objective:"minimize",line:line.line};const parts=body.split(",").map(part=>part.trim()).filter(part=>part.length>0);const warn=message=>{diagnostics.push(createDiagnostic({code:"NM-RUNTIME-022",severity:"warning",message,hint:'Use @optimize(method: "adam", steps: 40, learningRate: 0.2, objective: "minimize");',translationKey:"invalidOptimizeAnnotation",translationValues:{annotation:line.text},line:line.line}))};for(const part of parts){const match=part.match(/^([A-Za-z_]\w*)\s*:\s*(.+)$/);if(!match){warn(`Invalid @optimize field: ${part}.`);continue}const key4=match[1];const value=match[2].trim();if(key4==="method"||key4==="optimizer"){const method=value.match(/^"(gd|momentum|adam)"$/);if(!method){warn(`Invalid @optimize method: ${value}.`);continue}optimize.optimizer=method[1];continue}if(key4==="objective"){const objective=value.match(/^"(minimize|maximize)"$/);if(!objective){warn(`Invalid @optimize objective: ${value}.`);continue}optimize.objective=objective[1];continue}if(key4==="steps"){if(!/^\d+$/.test(value)){warn(`Invalid @optimize steps: ${value}.`);continue}optimize.steps=Math.min(Math.max(Number.parseInt(value,10),1),100);continue}if(key4==="learningRate"){if(!/^\d+(?:\.\d+)?$/.test(value)){warn(`Invalid @optimize learningRate: ${value}.`);continue}optimize.learningRate=Math.min(Math.max(Number.parseFloat(value),.001),2);continue}warn(`Unknown @optimize field: ${key4}.`)}return optimize}var numericAnnotationPattern=/^-?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?$/i;function parseEstimateAnnotation(body,line,diagnostics){const estimate={code:"surface",distance:7,line:line.line};const parts=body.split(",").map(part=>part.trim()).filter(part=>part.length>0);const warn=message=>{diagnostics.push(createDiagnostic({code:"NM-PARSE-047",severity:"warning",message,hint:'Use @estimate(code: "surface", distance: 7, target_error: 1e-3);',translationKey:"invalidEstimateAnnotation",translationValues:{annotation:line.text},line:line.line}))};if(parts.length===0){warn("Empty @estimate annotation.");return estimate}for(const part of parts){const match=part.match(/^([A-Za-z_]\w*)\s*:\s*(.+)$/);if(!match){warn(`Invalid @estimate field: ${part}.`);continue}const key4=match[1];const value=match[2].trim();if(key4==="code"){const code=value.match(/^"(surface)"$/);if(!code){warn(`Invalid @estimate code: ${value}.`);continue}estimate.code=code[1];continue}if(key4==="distance"){if(!/^\d+$/.test(value)){warn(`Invalid @estimate distance: ${value}.`);continue}const distance=Number.parseInt(value,10);estimate.distance=Math.min(Math.max(distance,3),101);continue}if(key4==="target_error"||key4==="targetError"){if(!numericAnnotationPattern.test(value)){warn(`Invalid @estimate target_error: ${value}.`);continue}const targetError=Number.parseFloat(value);if(!Number.isFinite(targetError)||targetError<=0||targetError>=1){warn(`Invalid @estimate target_error: ${value}.`);continue}estimate.targetError=targetError;continue}if(key4==="physical_gate_time_ns"||key4==="physicalGateTimeNs"){if(!numericAnnotationPattern.test(value)){warn(`Invalid @estimate physical_gate_time_ns: ${value}.`);continue}const gateTime=Number.parseFloat(value);if(!Number.isFinite(gateTime)||gateTime<=0){warn(`Invalid @estimate physical_gate_time_ns: ${value}.`);continue}estimate.physicalGateTimeNs=Math.min(gateTime,1e6);continue}warn(`Unknown @estimate field: ${key4}.`)}return estimate}function parseConstraintsAnnotation(body,line,diagnostics){const constraints={};const parts=body.split(",").map(part=>part.trim()).filter(part=>part.length>0);if(parts.length===0){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-015",severity:"warning",message:"Empty @constraints annotation.",hint:'Use fields such as @constraints(maxDepth: 8, maxTwoQubit: 4, connectivity: "line").',translationKey:"invalidConstraintsAnnotation",line:line.line}));return constraints}for(const part of parts){const match=part.match(/^([A-Za-z_]\w*)\s*:\s*(.+)$/);if(!match){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-015",severity:"warning",message:`Invalid @constraints field: ${part}.`,hint:'Use key/value fields such as maxDepth: 8, maxTwoQubit: 4, connectivity: "line".',translationKey:"invalidConstraintsAnnotation",line:line.line}));continue}const key4=match[1];const value=match[2].trim();if(key4==="maxDepth"||key4==="maxTwoQubit"||key4==="maxQubits"){if(!/^\d+$/.test(value)){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-015",severity:"warning",message:`Invalid numeric @constraints value for ${key4}: ${value}.`,hint:"Constraint budgets must be non-negative integers.",translationKey:"invalidConstraintsAnnotation",line:line.line}));continue}const parsed=Number.parseInt(value,10);if(key4==="maxDepth"){constraints.maxDepth=parsed}else if(key4==="maxTwoQubit"){constraints.maxTwoQubit=parsed}else{constraints.maxQubits=parsed}continue}if(key4==="connectivity"){const connectivityMatch=value.match(/^"(all-to-all|line|grid)"$/);if(!connectivityMatch){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-015",severity:"warning",message:`Invalid @constraints connectivity: ${value}.`,hint:'Use connectivity: "all-to-all", "line", or "grid".',translationKey:"invalidConstraintsAnnotation",line:line.line}));continue}constraints.connectivity=connectivityMatch[1];continue}diagnostics.push(createDiagnostic({code:"NM-RUNTIME-015",severity:"warning",message:`Unknown @constraints field: ${key4}.`,hint:"Supported fields are maxQubits, maxDepth, maxTwoQubit, and connectivity.",translationKey:"invalidConstraintsAnnotation",line:line.line}))}return constraints}function parseConst(line,constants,diagnostics){const match=line.text.match(/^const\s+([A-Za-z_]\w*)(?:\s*:\s*(Angle|Float|Int))?\s*=\s*([^;]+?)\s*;?$/);if(!match){return void 0}const value=evaluateAngleExpression(match[3],constants);if(value==null){diagnostics.push(createDiagnostic({code:"NM-PARSE-007",severity:"error",message:`Invalid constant expression: ${match[3]}.`,hint:"Use numbers, PI, earlier constants and + - * / , for example: const theta: Angle = PI / 4;",translationKey:"invalidConstantExpression",translationValues:{expression:match[3]},line:line.line}));return void 0}return{kind:"const",name:match[1],valueType:match[2],sourceExpression:match[3],value,line:line.line}}function parseParam(line,constants,diagnostics){const match=line.text.match(/^param\s+([A-Za-z_]\w*)(?:\s*:\s*Angle)?\s*=\s*([^;]+?)\s*;?$/);if(!match){return void 0}const value=evaluateAngleExpression(match[2],constants);if(value==null){diagnostics.push(createDiagnostic({code:"NM-PARSE-007",severity:"error",message:`Invalid parameter expression: ${match[2]}.`,hint:"Use a number, PI, or arithmetic, for example: param theta: Angle = 0.1;",translationKey:"invalidParameterExpression",translationValues:{expression:match[2]},line:line.line}));return void 0}return{kind:"param",name:match[1],value,line:line.line}}function parseReset(line){const match=line.text.match(/^reset\s+([A-Za-z_]\w*)(?:\[(\d+)\])?\s*;?$/);if(!match){return void 0}return{kind:"reset",target:toQubitRef(match[1],match[2]),line:line.line}}function splitPauliTerms(expr){const terms=[];let depth3=0;let start=0;for(let i=0;i<expr.length;i+=1){const char=expr[i];if(char==="("){depth3+=1;continue}if(char===")"){depth3=Math.max(0,depth3-1);continue}if(depth3!==0||char!=="+"&&char!=="-"){continue}const before=expr.slice(0,i).trimEnd();const previous=before[before.length-1];const isUnarySign=!previous||"+-*/(".includes(previous);if(isUnarySign){continue}terms.push(expr.slice(start,i).trim());start=i}terms.push(expr.slice(start).trim());return terms.filter(term=>term.length>0)}function evaluatePauliCoeff(source,constants){const trimmed=source.trim().replace(/\*\s*$/,"").trim();if(trimmed.length===0){return 1}return evaluateAngleExpression(trimmed,constants)}function parsePauliSum(expr,constants){const factorPattern=/([XYZ])\s*\(\s*([A-Za-z_]\w*)\[(\d+)\]\s*\)/g;const termSources=splitPauliTerms(expr);const terms=[];if(termSources.length===0){return void 0}for(const source of termSources){const sign=source.trimStart().startsWith("-")?-1:1;const unsigned=source.trimStart().replace(/^[+-]\s*/,"");const factorMatches=[...unsigned.matchAll(factorPattern)];if(factorMatches.length>0){const firstFactorIndex=factorMatches[0].index??0;const factorSource=unsigned.slice(firstFactorIndex);if(factorSource.replace(factorPattern,"").trim()!==""){return void 0}const coeff2=evaluatePauliCoeff(unsigned.slice(0,firstFactorIndex),constants);if(coeff2==null){return void 0}terms.push({coeff:sign*coeff2,...coefficientProvenance(unsigned.slice(0,firstFactorIndex),sign),factors:factorMatches.map(factorMatch=>({observable:factorMatch[1],target:toQubitRef(factorMatch[2],factorMatch[3])}))});continue}if(unsigned==="I"){terms.push({coeff:sign,factors:[]});continue}const identityMatch=unsigned.match(/^(.+?)(?:\s*\*\s*|\s+)I$/);if(!identityMatch){return void 0}const coeff=evaluatePauliCoeff(identityMatch[1],constants);if(coeff==null){return void 0}terms.push({coeff:sign*coeff,...coefficientProvenance(identityMatch[1],sign),factors:[]})}return terms.length>0?terms:void 0}function cloneTerms(terms){return terms.map(term=>({coeff:term.coeff,...term.coefficientExpression?{coefficientExpression:term.coefficientExpression}:{},factors:term.factors.map(factor=>({observable:factor.observable,target:{register:factor.target.register,index:factor.target.index}}))}))}function unknownObservableDiagnostic(name2,line,diagnostics){diagnostics.push(createDiagnostic({code:"NM-PARSE-010",severity:"error",message:`Unknown observable: ${name2}.`,hint:"Declare it before use, for example: observable H = Z(q[0]) + X(q[1]);",translationKey:"unknownObservable",translationValues:{name:name2},line:line.line}))}function resolveExpectationTerms(expr,line,constants,observables,diagnostics,observableUses){if(/^[A-Za-z_]\w*$/.test(expr)){const named=observables[expr];if(named){observableUses?.push({name:expr,line:line.line});return cloneTerms(named)}unknownObservableDiagnostic(expr,line,diagnostics);return void 0}return parsePauliSum(expr,constants)}function parseObservable(line,constants,observables,observableNames,observableMetadata,diagnostics){const match=line.text.match(/^observable\s+([A-Za-z_]\w*)\s*=\s*(.+?)\s*;?$/);if(!match){return false}if(observableNames.has(match[1])){diagnostics.push(createDiagnostic({code:"NM-TYPE-019",severity:"error",message:`Observable name collision: ${match[1]}.`,hint:"Rename the user observable or choose a standard-library Hamiltonian with a different exported name.",translationKey:"stdObservableCollision",translationValues:{name:match[1]},line:line.line}));return true}const terms=parsePauliSum(match[2],constants);if(!terms){diagnostics.push(createDiagnostic({code:"NM-PARSE-009",severity:"error",message:`Invalid observable definition: ${match[2]}.`,hint:"Define observables as a weighted Pauli sum, for example: observable H = shift * I + J * Z(q[0]) Z(q[1]);",translationKey:"invalidObservable",translationValues:{name:match[1]},line:line.line}));return true}observables[match[1]]=terms;observableNames.add(match[1]);const stdImport=line.stdImport;const stdEntry=stdImport?getNMStdLibraryEntry(stdImport):void 0;observableMetadata[match[1]]={name:match[1],stdImport:stdEntry?.kind==="observable"?stdImport:void 0,minQubits:stdEntry?.kind==="observable"?stdEntry.minQubits:void 0,registers:[...new Set(terms.flatMap(term=>term.factors.map(factor=>factor.target.register)))],line:line.line};return true}function parseExpectation(line,constants,observables,diagnostics,observableUses){const head=line.text.match(/^(?:let\s+([A-Za-z_]\w*)\s*=\s*)?expect\s+(.+?)\s*;?$/);if(!head){return void 0}const expr=head[2].trim();const terms=resolveExpectationTerms(expr,line,constants,observables,diagnostics,observableUses);if(!terms){return void 0}return{kind:"expectation",binding:head[1],terms,line:line.line}}function parseMetric(line,constants,observables,diagnostics,observableUses){const match=line.text.match(/^metric\s+([A-Za-z_]\w*)\s*=\s*(.+?)\s*;?$/);if(!match){return void 0}const name2=match[1];const expression=match[2].trim();const probabilityMatch=expression.match(/^probability\s*\(\s*\|([01]+)>\s*\)$/);if(probabilityMatch){return{kind:"metric",name:name2,expression:{kind:"probability",state:probabilityMatch[1]},line:line.line}}const expectationMatch=expression.match(/^expect\s+(.+)$/);if(expectationMatch){const terms=resolveExpectationTerms(expectationMatch[1].trim(),line,constants,observables,diagnostics,observableUses);if(!terms){return void 0}return{kind:"metric",name:name2,expression:{kind:"expectation",terms},line:line.line}}diagnostics.push(createDiagnostic({code:"NM-PARSE-020",severity:"error",message:`Invalid metric expression: ${expression}.`,hint:"Use metric bell = probability(|00>); or metric energy = expect H;",translationKey:"invalidMetricExpression",translationValues:{expression},line:line.line}));return void 0}function parseGradient(line,diagnostics){const match=line.text.match(/^let\s+([A-Za-z_]\w*)\s*=\s*gradient\s+([A-Za-z_]\w*)\s+wrt\s+([A-Za-z_]\w*)\s*;?$/);if(!match){if(/\bgradient\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-029",severity:"error",message:`Invalid gradient statement: ${line.text}.`,hint:"Use let g = gradient cost wrt theta; after binding an expectation such as let cost = expect Z(q[0]);",translationKey:"invalidGradientStatement",translationValues:{statement:line.text},line:line.line}))}return void 0}return{kind:"gradient",binding:match[1],target:match[2],parameter:match[3],line:line.line}}function parseEncode(line,diagnostics){const match=line.text.match(/^encode\s*\(\s*sample_row\s*\(\s*(\d+)?\s*\)\s*,\s*([A-Za-z_]\w*)\s*,\s*method\s*:\s*"(angle|reupload|amplitude|iqp)"\s*\)\s*;?$/);if(!match){if(/^encode\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-036",severity:"error",message:`Invalid encode statement: ${line.text}.`,hint:'Use encode(sample_row(), q, method: "angle" | "reupload" | "amplitude" | "iqp"); after @dataset.',translationKey:"invalidEncodeStatement",translationValues:{statement:line.text},line:line.line}))}return void 0}return{kind:"encode",row:match[1]!=null?Number.parseInt(match[1],10):0,register:match[2],method:match[3],line:line.line}}function parseQReg(line,diagnostics){const typedMatch=line.text.match(/^let\s+([A-Za-z_]\w*)\s*:\s*QReg<(\d+)>\s*=\s*qreg\[(\d+)\]\s*;?$/);const letMatch=line.text.match(/^let\s+([A-Za-z_]\w*)\s*=\s*qreg\[(\d+)\]\s*;?$/);const legacyMatch=line.text.match(/^qreg\s+([A-Za-z_]\w*)\[(\d+)\]\s*;?$/);const match=typedMatch??letMatch??legacyMatch;if(!match){return void 0}const name2=match[1];const declaredSize=typedMatch?Number.parseInt(typedMatch[2],10):void 0;const sizeText=typedMatch?typedMatch[3]:match[2];const size=Number.parseInt(sizeText,10);if(size<=0){diagnostics.push(createDiagnostic({code:"NM-TYPE-003",severity:"error",message:`Invalid qreg size: ${sizeText}.`,hint:"Use a positive register size such as qreg[2].",translationKey:"invalidQregSize",translationValues:{size:sizeText},line:line.line}))}if(declaredSize!=null&&declaredSize!==size){diagnostics.push(createDiagnostic({code:"NM-TYPE-005",severity:"error",message:`QReg type size ${declaredSize} does not match qreg allocation size ${size}.`,hint:"Keep the type and allocation aligned, for example: let q: QReg<2> = qreg[2];",translationKey:"qregSizeMismatch",translationValues:{declared:declaredSize,allocated:size},line:line.line}))}return{kind:"qreg",name:name2,size,declaredSize,...line.comptimeQReg?.allocated?{sizeSource:line.comptimeQReg?.allocated}:{},...line.comptimeQReg?.declared?{declaredSizeSource:line.comptimeQReg?.declared}:{},line:line.line}}function parseExplain(line,diagnostics){if(!/^@explain\b/.test(line.text)){return void 0}const match=line.text.match(/^@explain\s*\(\s*"((?:\\.|[^"\\])*)"\s*\)\s*;?$/);if(!match){diagnostics.push(createDiagnostic({code:"NM-PARSE-023",severity:"warning",message:`Invalid @explain annotation: ${line.text}.`,hint:'Use @explain("Describe this step."); before the statement you want to document.',translationKey:"invalidExplainAnnotation",translationValues:{annotation:line.text},line:line.line}));return void 0}return{kind:"explain",text:match[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\"),line:line.line}}function isObserveBodyStatement(statement){return statement.kind==="metric"||statement.kind==="expectation"||statement.kind==="assertProbability"||statement.kind==="assertExpectation"||statement.kind==="assertExpectationRange"||statement.kind==="assertEntangled"||statement.kind==="assertFidelity"||statement.kind==="assertEquivalent"||statement.kind==="assertResource"}function parseExecutableStatementCore(line,constants,observables,diagnostics,observableUses,propertyAssertionsEnabled=false,typedClassicalValuesEnabled=false,functionResultType,feedForwardEnabled=false,typedCollectionEnabled=false,functionAngles){const anglePlaceholder=/^const\s+(__nm_cfn_angle_\d+)\s*:\s*Float\s*=\s*0\.0\s*;?$/u.exec(line.text);if(typedClassicalValuesEnabled&&anglePlaceholder&&functionAngles?.has(anglePlaceholder[1])){const placeholder=parseConst(line,constants,diagnostics);if(placeholder){constants[placeholder.name]=placeholder.value;return placeholder}}const explain=parseExplain(line,diagnostics);if(explain){return explain}if(/^@explain\b/.test(line.text)){return void 0}const encode=parseEncode(line,diagnostics);if(encode){return encode}if(/^encode\b/.test(line.text)){return void 0}const branchInvariant=parseNMBranchInvariantAssertion(line,diagnostics,feedForwardEnabled);if(branchInvariant){return branchInvariant}if(/^assert_branch_invariant\b/u.test(line.text)){return void 0}const gate=parseGate(line,constants,diagnostics);if(gate){return gate}const reset=parseReset(line);if(reset){return reset}if(/^barrier\s*;?$/.test(line.text)){return{kind:"barrier",line:line.line}}const show=parseShow(line,diagnostics);if(show){return show}if(/^show\b/.test(line.text)){return void 0}const expectation=parseExpectation(line,constants,observables,diagnostics,observableUses);if(expectation){return expectation}const metric=parseMetric(line,constants,observables,diagnostics,observableUses);if(metric){return metric}if(/^metric\b/.test(line.text)){return void 0}const gradient=parseGradient(line,diagnostics);if(gradient){return gradient}if(/\bgradient\b/.test(line.text)){return void 0}const expectationAssertion=parseExpectationAssertion(line,constants,observables,diagnostics,observableUses,propertyAssertionsEnabled);if(expectationAssertion){return expectationAssertion}if(/^assert\s+expectation\b/.test(line.text)){return void 0}const entanglementAssertion=parseEntanglementAssertion(line,diagnostics);if(entanglementAssertion){return entanglementAssertion}if(/^assert\s+entangled\b/.test(line.text)){return void 0}const fidelityAssertion=parseFidelityAssertion(line,diagnostics);if(fidelityAssertion){return fidelityAssertion}if(/^assert\s+fidelity\b/.test(line.text)){return void 0}const equivalentAssertion=parseEquivalentAssertion(line,diagnostics,propertyAssertionsEnabled);if(equivalentAssertion){return equivalentAssertion}if(/^assert\s+equivalent\b/.test(line.text)){return void 0}const resourceAssertion=parseResourceAssertion(line,diagnostics);if(resourceAssertion){return resourceAssertion}if(/^assert\s+(?:depth|gates|twoQubitCount|measurements)\b/.test(line.text)){return void 0}const measurement=parseMeasurement(line);if(measurement){return measurement}const measurementBinding=parseNMMeasurementBinding(line,diagnostics,feedForwardEnabled||typedCollectionEnabled&&line.typedCollectionBody===true);if(measurementBinding){return measurementBinding}const classicalDeclaration=parseNMClassicalDeclaration(line.text,line.line,typedClassicalValuesEnabled);diagnostics.push(...classicalDeclaration.diagnostics);if(classicalDeclaration.statement){return classicalDeclaration.statement}if(classicalDeclaration.candidate){return void 0}const syndrome=parseSyndromeMeasurement(line,diagnostics);if(syndrome){return syndrome}if(/^let\s+[A-Za-z_]\w*\s*:\s*Bit\s*=\s*syndrome\b/.test(line.text)){return void 0}const bitAssignment=parseBitAssignment(line,diagnostics);if(bitAssignment){return bitAssignment}if(new RegExp(`^let\\s+${IDENTIFIER_SOURCE4}\\s*:\\s*Bit\\s*=`,"u").test(line.text)){return void 0}const functionResult=parseNMFunctionResultReturn(line,functionResultType);diagnostics.push(...functionResult.diagnostics);if(functionResult.statement){return functionResult.statement}if(functionResult.candidate){return void 0}const returnStmt=parseReturn(line,diagnostics);if(returnStmt){return returnStmt}return parseProbabilityAssertion(line,diagnostics,propertyAssertionsEnabled)}function parseShow(line,diagnostics){if(!/^show\b/.test(line.text)){return void 0}if(/^show\s+state\s*;?$/.test(line.text)){return{kind:"show",subject:"state",line:line.line}}diagnostics.push(createDiagnostic({code:"NM-PARSE-046",severity:"error",message:`Invalid show statement: ${line.text}.`,hint:"Use show state; to print the current state vector in Dirac notation.",translationKey:"invalidShowStatement",translationValues:{statement:line.text},line:line.line}));return void 0}function parseGate(line,constants,diagnostics){const singleGateMatch=line.text.match(/^(Sdg|Tdg|H|X|Y|Z|S|T)\s*\(\s*([A-Za-z_]\w*)(?:\[(\d+)\])?\s*\)\s*;?$/);if(singleGateMatch){return{kind:"gate",gate:singleGateMatch[1],targets:[toQubitRef(singleGateMatch[2],singleGateMatch[3])],line:line.line}}const twoQubitMatch=line.text.match(/^(CNOT|CZ|SWAP|iSWAP|CY|CH)\s*\(\s*([A-Za-z_]\w*)\[(\d+)\]\s*,\s*([A-Za-z_]\w*)\[(\d+)\]\s*\)\s*;?$/);if(twoQubitMatch){return{kind:"gate",gate:twoQubitMatch[1],targets:[toQubitRef(twoQubitMatch[2],twoQubitMatch[3]),toQubitRef(twoQubitMatch[4],twoQubitMatch[5])],line:line.line}}const threeQubitMatch=line.text.match(/^(CCNOT|CSWAP)\s*\(\s*([A-Za-z_]\w*)\[(\d+)\]\s*,\s*([A-Za-z_]\w*)\[(\d+)\]\s*,\s*([A-Za-z_]\w*)\[(\d+)\]\s*\)\s*;?$/);if(threeQubitMatch){return{kind:"gate",gate:threeQubitMatch[1],targets:[toQubitRef(threeQubitMatch[2],threeQubitMatch[3]),toQubitRef(threeQubitMatch[4],threeQubitMatch[5]),toQubitRef(threeQubitMatch[6],threeQubitMatch[7])],line:line.line}}const globalPhaseMatch=line.text.match(/^GPhase\s*\(\s*(.+)\)\s*;?$/);if(globalPhaseMatch){const thetaSource=globalPhaseMatch[1].trim();const theta=evaluateAngleExpression(thetaSource,constants);const isLiteral=/^-?\d+(?:\.\d+)?$/.test(thetaSource);if(theta==null){diagnostics.push(createDiagnostic({code:"NM-TYPE-006",severity:"error",message:`Invalid rotation angle: ${thetaSource}.`,hint:"Use a number, PI, or a declared constant, for example: GPhase(PI / 4);",translationKey:"invalidRotationAngle",translationValues:{angle:thetaSource,example:"GPhase(PI / 4);"},line:line.line}))}return{kind:"gate",gate:"GPhase",targets:[],theta:theta??0,thetaName:isLiteral?void 0:thetaSource,line:line.line}}const rotationMatch=line.text.match(/^(Rx|Ry|Rz|P)\s*\(\s*([A-Za-z_]\w*)\[(\d+)\]\s*,\s*(.+)\)\s*;?$/);if(rotationMatch){const thetaSource=rotationMatch[4].trim();const theta=evaluateAngleExpression(thetaSource,constants);const isLiteral=/^-?\d+(?:\.\d+)?$/.test(thetaSource);if(theta==null){diagnostics.push(createDiagnostic({code:"NM-TYPE-006",severity:"error",message:`Invalid rotation angle: ${thetaSource}.`,hint:"Use a number, PI, or a declared constant, for example: Ry(q[0], PI / 2);",translationKey:"invalidRotationAngle",translationValues:{angle:thetaSource,example:"Ry(q[0], PI / 2);"},line:line.line}))}return{kind:"gate",gate:rotationMatch[1],targets:[toQubitRef(rotationMatch[2],rotationMatch[3])],theta:theta??0,thetaName:isLiteral?void 0:thetaSource,line:line.line}}const uMatch=line.text.match(/^U\s*\(\s*([A-Za-z_]\w*)\[(\d+)\]\s*,\s*([^,]+)\s*,\s*([^,]+)\s*,\s*(.+)\)\s*;?$/);if(uMatch){const angleSources=[uMatch[3].trim(),uMatch[4].trim(),uMatch[5].trim()];const angles=angleSources.map(source=>evaluateAngleExpression(source,constants));angles.forEach((angle,index)=>{if(angle==null){diagnostics.push(createDiagnostic({code:"NM-TYPE-006",severity:"error",message:`Invalid rotation angle: ${angleSources[index]}.`,hint:"Use numbers, PI, or declared constants, for example: U(q[0], PI / 2, 0, PI);",translationKey:"invalidRotationAngle",translationValues:{angle:angleSources[index],example:"U(q[0], PI / 2, 0, PI);"},line:line.line}))}});const numericAngles=angles.map(angle=>angle??0);return{kind:"gate",gate:"U",targets:[toQubitRef(uMatch[1],uMatch[2])],theta:numericAngles[0],thetaName:/^-?\d+(?:\.\d+)?$/.test(angleSources[0])?void 0:angleSources[0],angles:numericAngles,angleNames:angleSources.map(source=>/^-?\d+(?:\.\d+)?$/.test(source)?"":source),line:line.line}}const twoQubitRotationMatch=line.text.match(/^(RXX|RYY|RZZ)\s*\(\s*([A-Za-z_]\w*)\[(\d+)\]\s*,\s*([A-Za-z_]\w*)\[(\d+)\]\s*,\s*(.+)\)\s*;?$/);if(twoQubitRotationMatch){const thetaSource=twoQubitRotationMatch[6].trim();const theta=evaluateAngleExpression(thetaSource,constants);const isLiteral=/^-?\d+(?:\.\d+)?$/.test(thetaSource);if(theta==null){diagnostics.push(createDiagnostic({code:"NM-TYPE-006",severity:"error",message:`Invalid rotation angle: ${thetaSource}.`,hint:"Use a number, PI, or a declared constant, for example: RZZ(q[0], q[1], PI / 2);",translationKey:"invalidRotationAngle",translationValues:{angle:thetaSource,example:"RZZ(q[0], q[1], PI / 2);"},line:line.line}))}return{kind:"gate",gate:twoQubitRotationMatch[1],targets:[toQubitRef(twoQubitRotationMatch[2],twoQubitRotationMatch[3]),toQubitRef(twoQubitRotationMatch[4],twoQubitRotationMatch[5])],theta:theta??0,thetaName:isLiteral?void 0:thetaSource,line:line.line}}const controlledRotationMatch=line.text.match(/^(CRy|CRz|CP)\s*\(\s*([A-Za-z_]\w*)\[(\d+)\]\s*,\s*([A-Za-z_]\w*)\[(\d+)\]\s*,\s*(.+)\)\s*;?$/);if(controlledRotationMatch){const thetaSource=controlledRotationMatch[6].trim();const theta=evaluateAngleExpression(thetaSource,constants);const isLiteral=/^-?\d+(?:\.\d+)?$/.test(thetaSource);if(theta==null){diagnostics.push(createDiagnostic({code:"NM-TYPE-006",severity:"error",message:`Invalid rotation angle: ${thetaSource}.`,hint:"Use a number, PI, or a declared constant, for example: CRz(q[0], q[1], PI / 2);",translationKey:"invalidRotationAngle",translationValues:{angle:thetaSource,example:"CRz(q[0], q[1], PI / 2);"},line:line.line}))}return{kind:"gate",gate:controlledRotationMatch[1],targets:[toQubitRef(controlledRotationMatch[2],controlledRotationMatch[3]),toQubitRef(controlledRotationMatch[4],controlledRotationMatch[5])],theta:theta??0,thetaName:isLiteral?void 0:thetaSource,line:line.line}}const gateLike=line.text.match(/^([A-Za-z_]\w*)\s*\(/);if(gateLike&&!["fn","return","measure","measure_all"].includes(gateLike[1])){const gate=gateLike[1];const supported=SUPPORTED_GATES.includes(gate);if(!supported){const suggestion=findClosestGate(gate);diagnostics.push(createDiagnostic({code:"NM-RUNTIME-001",severity:"error",message:`Unknown or unsupported gate: ${gate}.`,hint:suggestion?`Did you mean ${suggestion}(q[0])?`:`Supported operations: ${playgroundRuntimeLimits.supportedGates.join(", ")}.`,translationKey:"unsupportedGate",translationValues:{gate},hintTranslationKey:suggestion?"unsupportedGateSuggestion":"unsupportedGateSupported",hintTranslationValues:suggestion?{suggestion:`${suggestion}(q[0])`}:{operations:playgroundRuntimeLimits.supportedGates.join(", ")},line:line.line}))}}return void 0}function parseMeasurement(line){const match=line.text.match(new RegExp(`^(?:let\\s+(${IDENTIFIER_SOURCE4})(?:\\s*:\\s*(Bit))?\\s*=\\s*)?measure\\s*(?:(X|Y|Z)\\s*)?\\(\\s*(${IDENTIFIER_SOURCE4})(?:\\[(\\d+)\\])?\\s*\\)\\s*;?$`,"u"));if(!match){return void 0}return{kind:"measurement",binding:match[1],bindingType:match[2],basis:match[3],target:toQubitRef(match[4],match[5]),line:line.line}}function parseSyndromeFactors(expr){const factorPattern=/([XYZ])\s*\(\s*([A-Za-z_]\w*)\[(\d+)\]\s*\)/g;const matches=[...expr.matchAll(factorPattern)];if(matches.length===0||expr.replace(factorPattern,"").trim()!==""){return void 0}return matches.map(match=>({observable:match[1],target:toQubitRef(match[2],match[3])}))}function parseSyndromeMeasurement(line,diagnostics){const match=line.text.match(/^let\s+([A-Za-z_]\w*)\s*:\s*Bit\s*=\s*syndrome\s+(.+?)\s*;?$/);if(!match){return void 0}const factors=parseSyndromeFactors(match[2]);if(!factors){diagnostics.push(createDiagnostic({code:"NM-PARSE-013",severity:"error",message:`Invalid syndrome measurement: ${match[2]}.`,hint:"Use a Pauli string, for example: let s: Bit = syndrome Z(q[0]) Z(q[1]);",translationKey:"invalidSyndromeMeasurement",translationValues:{expression:match[2]},line:line.line}));return void 0}const seenTargets=new Set;for(const factor of factors){const key4=qubitRefKey3(factor.target);if(seenTargets.has(key4)){diagnostics.push(createDiagnostic({code:"NM-TYPE-012",severity:"error",message:`Duplicate qubit in syndrome measurement: ${key4}.`,hint:"A syndrome Pauli string can reference each qubit at most once.",translationKey:"duplicateSyndromeQubit",translationValues:{qubit:key4},line:line.line}))}seenTargets.add(key4)}return{kind:"syndrome",binding:match[1],factors,line:line.line}}function parseBitAssignment(line,diagnostics){const match=line.text.match(new RegExp(`^let\\s+(${IDENTIFIER_SOURCE4})\\s*:\\s*Bit\\s*=\\s*(.+?)\\s*;?$`,"u"));if(!match){return void 0}const expression=parseNMBitExpression(match[2]);if(!expression){diagnostics.push(createDiagnostic({code:"NM-PARSE-012",severity:"error",message:`Invalid Bit expression: ${match[2]}.`,hint:"Use measured bits with not/and/xor/or, for example: let parity: Bit = a xor b;",translationKey:"invalidBitExpression",translationValues:{expression:match[2]},line:line.line}));return void 0}return{kind:"bitAssign",name:match[1],expression,line:line.line}}function pushPropertyAssertionsFeatureDisabledDiagnostic(line,diagnostics){if(diagnostics.some(diagnostic5=>diagnostic5.code===nmPropertyAssertionDiagnosticCodes.featureDisabled&&diagnostic5.line===line.line)){return}diagnostics.push(createDiagnostic({code:nmPropertyAssertionDiagnosticCodes.featureDisabled,severity:"error",message:"Property assertion syntax requires the experimental parser flag.",hint:"Set parse options experimental.propertyAssertions=true while evaluating NM-RFC-0003.",translationKey:"propertyAssertionsFeatureDisabled",line:line.line}))}function parseProbabilityAssertion(line,diagnostics,propertyAssertionsEnabled=false){const experimentalCandidate=/^assert\s+probability\b/.test(line.text)&&/(?:~=|\btolerance\b)/.test(line.text);if(experimentalCandidate){if(!propertyAssertionsEnabled){pushPropertyAssertionsFeatureDisabledDiagnostic(line,diagnostics);return void 0}const approximate=line.text.match(/^assert\s+probability\s*\(\s*\|([01]+)>\s*\)\s*~=\s*(0(?:\.\d+)?|1(?:\.0+)?)\s+tolerance\s+(\d+(?:\.\d+)?)\s*;?$/);const tolerance=approximate?Number.parseFloat(approximate[3]):Number.NaN;if(!approximate||!Number.isFinite(tolerance)||tolerance<=0||tolerance>NM_PROPERTY_ASSERTION_MAX_TOLERANCE){diagnostics.push(createDiagnostic({code:nmPropertyAssertionDiagnosticCodes.invalidAssertion,severity:"error",message:`Invalid finite-shot probability assertion: ${line.text}.`,hint:`Use assert probability(|0>) ~= 0.5 tolerance 0.1; with 0 < tolerance <= ${NM_PROPERTY_ASSERTION_MAX_TOLERANCE}.`,translationKey:"invalidPropertyProbabilityAssertion",translationValues:{expression:line.text},line:line.line}));return void 0}return{kind:"assertProbability",state:approximate[1],operator:"~=",expected:Number.parseFloat(approximate[2]),tolerance,line:line.line}}const match=line.text.match(/^assert\s+probability\s*\(\s*\|([01]+)>\s*\)\s*(>=|<=|==|!=|>|<)\s*(0(?:\.\d+)?|1(?:\.0+)?)\s*;?$/);if(!match){if(line.text.startsWith("assert ")){diagnostics.push(createDiagnostic({code:"NM-PARSE-005",severity:"error",message:`Unsupported assert expression: ${line.text}.`,hint:"Use assert probability(|00>) > 0.45;",translationKey:"unsupportedAssert",translationValues:{expression:line.text},line:line.line}))}return void 0}return{kind:"assertProbability",state:match[1],operator:match[2],expected:Number.parseFloat(match[3]),line:line.line}}function parseEntanglementAssertion(line,diagnostics){if(!/^assert\s+entangled\b/.test(line.text)){return void 0}const match=line.text.match(/^assert\s+entangled\s*\(\s*([A-Za-z_]\w*)\[(\d+)\]\s*,\s*([A-Za-z_]\w*)\[(\d+)\]\s*\)\s*;?$/);if(!match){diagnostics.push(createDiagnostic({code:"NM-PARSE-037",severity:"error",message:`Invalid entanglement assertion: ${line.text}.`,hint:"Use assert entangled(q[0], q[1]); after preparing an entangled pair.",translationKey:"invalidEntanglementAssertion",translationValues:{statement:line.text},line:line.line}));return void 0}return{kind:"assertEntangled",targets:[toQubitRef(match[1],match[2]),toQubitRef(match[3],match[4])],line:line.line}}function parseFidelityAssertion(line,diagnostics){if(!/^assert\s+fidelity\b/.test(line.text)){return void 0}const match=line.text.match(/^assert\s+fidelity\s*\(\s*"((?:\\.|[^"\\])*)"\s*\)\s*(>=|<=|==|!=|>|<)\s*(0(?:\.\d+)?|1(?:\.0+)?)\s*;?$/);if(!match){diagnostics.push(createDiagnostic({code:"NM-PARSE-038",severity:"error",message:`Invalid fidelity assertion: ${line.text}.`,hint:'Use assert fidelity("bell") > 0.95; with a supported target such as bell, ghz, zero, or plus.',translationKey:"invalidFidelityAssertion",translationValues:{statement:line.text},line:line.line}));return void 0}return{kind:"assertFidelity",target:match[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\"),operator:match[2],expected:Number.parseFloat(match[3]),line:line.line}}function parseEquivalentAssertion(line,diagnostics,propertyAssertionsEnabled=false){if(!/^assert\s+equivalent\b/.test(line.text)){return void 0}if(/\bup_to_phase\b/.test(line.text)){if(!propertyAssertionsEnabled){pushPropertyAssertionsFeatureDisabledDiagnostic(line,diagnostics);return void 0}const phaseMatch=line.text.match(/^assert\s+equivalent\s*\(\s*"((?:\\.|[^"\\])*)"\s*\)\s+up_to_phase\s*;?$/);if(!phaseMatch){diagnostics.push(createDiagnostic({code:nmPropertyAssertionDiagnosticCodes.invalidAssertion,severity:"error",message:`Invalid up-to-phase equivalence assertion: ${line.text}.`,hint:'Use assert equivalent("bell") up_to_phase;.',translationKey:"invalidPhaseEquivalenceAssertion",translationValues:{statement:line.text},line:line.line}));return void 0}return{kind:"assertEquivalent",target:phaseMatch[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\"),phasePolicy:"global",line:line.line}}const match=line.text.match(/^assert\s+equivalent\s*\(\s*"((?:\\.|[^"\\])*)"\s*\)\s*;?$/);if(!match){diagnostics.push(createDiagnostic({code:"NM-PARSE-040",severity:"error",message:`Invalid equivalence assertion: ${line.text}.`,hint:'Use assert equivalent("bell"); after preparing a named target state.',translationKey:"invalidEquivalentAssertion",translationValues:{statement:line.text},line:line.line}));return void 0}return{kind:"assertEquivalent",target:match[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\"),line:line.line}}function parseResourceAssertion(line,diagnostics){if(!/^assert\s+(?:depth|gates|twoQubitCount|measurements)\b/.test(line.text)){return void 0}const match=line.text.match(/^assert\s+(depth|gates|twoQubitCount|measurements)\s*(>=|<=|==|!=|>|<)\s*(\d+(?:\.\d+)?)\s*;?$/);if(!match){diagnostics.push(createDiagnostic({code:"NM-PARSE-039",severity:"error",message:`Invalid resource assertion: ${line.text}.`,hint:"Use assert depth <= 20; or assert twoQubitCount <= 4; to check resource budgets.",translationKey:"invalidResourceAssertion",translationValues:{statement:line.text},line:line.line}));return void 0}return{kind:"assertResource",metric:match[1],operator:match[2],expected:Number.parseFloat(match[3]),line:line.line}}function parseExpectationAssertion(line,constants,observables,diagnostics,observableUses,propertyAssertionsEnabled=false){if(!/^assert\s+expectation\b/.test(line.text)){return void 0}const experimentalCandidate=/(?:~=|\btolerance\b|\s+in\s*\[)/.test(line.text);if(experimentalCandidate&&!propertyAssertionsEnabled){pushPropertyAssertionsFeatureDisabledDiagnostic(line,diagnostics);return void 0}const resolveTerms=source=>{const diagnosticCount2=diagnostics.length;const terms2=resolveExpectationTerms(source.trim(),line,constants,observables,diagnostics,observableUses);if(!terms2&&diagnostics.length===diagnosticCount2){diagnostics.push(createDiagnostic({code:nmPropertyAssertionDiagnosticCodes.invalidAssertion,severity:"error",message:`Invalid property expectation assertion: ${line.text}.`,hint:"Use a declared observable or Pauli expression.",translationKey:"invalidPropertyExpectationAssertion",translationValues:{expression:line.text},line:line.line}))}return terms2};if(experimentalCandidate&&/(?:~=|\btolerance\b)/.test(line.text)){const approximate=line.text.match(/^assert\s+expectation\s+(.+?)\s*~=\s*(-?\d+(?:\.\d+)?)\s+tolerance\s+(\d+(?:\.\d+)?)\s*;?$/);const expected=approximate?Number.parseFloat(approximate[2]):Number.NaN;const tolerance=approximate?Number.parseFloat(approximate[3]):Number.NaN;if(!approximate||!Number.isFinite(expected)||Math.abs(expected)>NM_PROPERTY_ASSERTION_MAX_ABSOLUTE_BOUND||!Number.isFinite(tolerance)||tolerance<=0||tolerance>NM_PROPERTY_ASSERTION_MAX_TOLERANCE){diagnostics.push(createDiagnostic({code:nmPropertyAssertionDiagnosticCodes.invalidAssertion,severity:"error",message:`Invalid finite-shot expectation assertion: ${line.text}.`,hint:`Use assert expectation Z(q[0]) ~= 0 tolerance 0.1; with 0 < tolerance <= ${NM_PROPERTY_ASSERTION_MAX_TOLERANCE}.`,translationKey:"invalidPropertyExpectationAssertion",translationValues:{expression:line.text},line:line.line}));return void 0}const terms2=resolveTerms(approximate[1]);return terms2?{kind:"assertExpectation",terms:terms2,operator:"~=",expected,tolerance,line:line.line}:void 0}if(experimentalCandidate){const range2=line.text.match(/^assert\s+expectation\s+(.+?)\s+in\s*\[\s*(-?\d+(?:\.\d+)?)\s*,\s*(-?\d+(?:\.\d+)?)\s*\]\s*;?$/);const minimum=range2?Number.parseFloat(range2[2]):Number.NaN;const maximum=range2?Number.parseFloat(range2[3]):Number.NaN;if(!range2||!Number.isFinite(minimum)||!Number.isFinite(maximum)||Math.abs(minimum)>NM_PROPERTY_ASSERTION_MAX_ABSOLUTE_BOUND||Math.abs(maximum)>NM_PROPERTY_ASSERTION_MAX_ABSOLUTE_BOUND||minimum>maximum){diagnostics.push(createDiagnostic({code:nmPropertyAssertionDiagnosticCodes.invalidRange,severity:"error",message:`Invalid observable range assertion: ${line.text}.`,hint:"Use an ordered inclusive range, for example: assert expectation Z(q[0]) in [-1, 1];",translationKey:"invalidObservableRangeAssertion",translationValues:{expression:line.text},line:line.line}));return void 0}const terms2=resolveTerms(range2[1]);return terms2?{kind:"assertExpectationRange",terms:terms2,minimum,maximum,line:line.line}:void 0}const match=line.text.match(/^assert\s+expectation\s+(.+?)\s*(>=|<=|==|!=|>|<)\s*(-?\d+(?:\.\d+)?)\s*;?$/);if(!match){diagnostics.push(createDiagnostic({code:"NM-PARSE-011",severity:"error",message:`Invalid expectation assertion: ${line.text}.`,hint:"Use assert expectation H < -0.5; or assert expectation Z(q[0]) > 0.9;",translationKey:"invalidExpectationAssertion",translationValues:{expression:line.text},line:line.line}));return void 0}const diagnosticCount=diagnostics.length;const terms=resolveExpectationTerms(match[1].trim(),line,constants,observables,diagnostics,observableUses);if(!terms){if(diagnostics.length===diagnosticCount){diagnostics.push(createDiagnostic({code:"NM-PARSE-011",severity:"error",message:`Invalid expectation assertion: ${line.text}.`,hint:"Use assert expectation H < -0.5; or assert expectation Z(q[0]) > 0.9;",translationKey:"invalidExpectationAssertion",translationValues:{expression:line.text},line:line.line}))}return void 0}return{kind:"assertExpectation",terms,operator:match[2],expected:Number.parseFloat(match[3]),line:line.line}}function parseReturn(line,diagnostics){const match=line.text.match(/^return\b\s*(.*?)\s*;?$/);if(!match){return void 0}const expression=match[1].trim();const containsCall=/[\p{L}_][\p{L}\p{N}_]*\s*\(/u.test(expression);if(containsCall){diagnostics.push(createDiagnostic({code:"NM-PARSE-004",severity:"error",message:`Calls in untyped return expressions are not executable: ${expression}.`,hint:"Evaluate measurements in explicit statements, then return their bound values, for example: let result = measure(q[0]); return result;",translationKey:"unsupportedReturnCall",translationValues:{expression},line:line.line}))}const isValidExpression=expression.length>0&&/^[\p{L}\p{N}_().,\s[\]]+$/u.test(expression);if(!isValidExpression){diagnostics.push(createDiagnostic({code:"NM-PARSE-004",severity:"warning",message:`Unrecognized return expression: ${expression||"(empty)"}.`,hint:"Return an identifier, a number, or a tuple such as return (a, b);",translationKey:"unrecognizedReturn",translationValues:{expression:expression||"(empty)"},line:line.line}))}return{kind:"return",expression,line:line.line}}function validateStdObservableRequirements(observableMetadata,observableUses,qregSizes,diagnostics){const blockedLines=new Set;const emitted=new Set;for(const use of observableUses){const metadata=observableMetadata[use.name];if(!metadata?.stdImport||metadata.minQubits==null){continue}for(const register of metadata.registers){const actual=qregSizes[register];if(actual==null||actual>=metadata.minQubits){continue}const key4=`${use.line}:${metadata.stdImport}:${register}`;if(emitted.has(key4)){continue}emitted.add(key4);blockedLines.add(use.line);diagnostics.push(createDiagnostic({code:"NM-TYPE-022",severity:"error",message:`Standard library observable ${metadata.stdImport} requires at least ${metadata.minQubits} qubits, but ${register} has ${actual}.`,hint:`Allocate ${register} with qreg[${metadata.minQubits}] before using ${metadata.name}.`,translationKey:"stdObservableQubitRequirement",translationValues:{import:metadata.stdImport,name:metadata.name,register,min:metadata.minQubits,actual},line:use.line}))}}return blockedLines}function toQubitRef(register,indexText){return{register,index:indexText==null?void 0:Number.parseInt(indexText,10)}}function qubitRefKey3(ref2){return ref2.index==null?ref2.register:`${ref2.register}[${ref2.index}]`}function getNodeBuffer(){return globalThis.Buffer}function encodeSharedCode(value){if(typeof btoa==="function"){const bytes2=new TextEncoder().encode(value);let binary="";bytes2.forEach(byte=>{binary+=String.fromCharCode(byte)});return btoa(binary).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}const nodeBuffer=getNodeBuffer();if(!nodeBuffer){throw new Error("Shared code encoding is not available in this runtime.")}return nodeBuffer.from(value,"utf8").toString("base64url")}var NM_LANGUAGE_PREVIEW_READINESS_FORMAT="nm-language-preview-readiness";var NM_LANGUAGE_PREVIEW_READINESS_VERSION="0.1";var nmVersionManifest={languageVersion:"0.2.0",packageVersion:"0.2.0",irVersion:"0.1",qasm3SidecarVersion:"0.3",learningPackageVersion:"0.1",authoringBundleVersion:"0.1",workspaceManifestVersion:"0.1",workspaceSnapshotVersion:"0.1",stability:"preview",capabilities:{parser:"stable",statevectorRuntime:"stable",stabilizerRuntime:"preview",sourcePreservingFormatter:"preview",turkishSourceSurface:"preview",languageServer:"preview",multiFileWorkspace:"preview",workspaceSnapshots:"preview",targetNativeLowering:"preview",calibratedPlacement:"preview",targetScheduling:"preview",quantumJobApi:"preview",cli:"preview",verifiedCopilot:"experimental",verifiedTutor:"experimental",learningPackages:"preview",qasm3Export:"preview",strictQasm3Carrier:"preview",hardwareExecution:"experimental",trainBlock:"preview",adjointGradients:"preview",qmlLosses:"preview",spsaOptimizer:"preview",extendedEncodings:"preview",embeddedQmlDatasets:"preview",mlStdLibrary:"preview",quantumKernels:"preview",qaoaRuntime:"preview",qngOptimizer:"preview",trainingStudio:"preview",trainabilityDiagnostics:"preview",modelPackages:"preview",qmlCopilot:"preview",pennylaneExport:"preview",mcpServer:"preview",sourceDebugger:"preview",experimentRecords:"preview",localWorkspaceStore:"preview",qmlBenchmarks:"preview",experimentHistory:"preview",qmlTrainingControls:"experimental",qmlTrainingCheckpoints:"experimental",typedClassicalValues:"experimental",targetCapabilityConstraints:"experimental",functionResults:"experimental",moduleVisibility:"experimental",exactImports:"experimental",propertyAssertions:"experimental",genericOracles:"experimental",genericCircuits:"experimental",qecExperiments:"experimental",composedNoise:"experimental",feedForward:"experimental",typedCollection:"experimental",comptimeConst:"experimental",classicalFunctions:"experimental",parameterGroups:"experimental",computeApply:"experimental"}};function evaluateNMLanguagePreviewReadiness(manifest=nmVersionManifest){const capabilities=manifest.capabilities;const productStatus=id=>capabilities[id]==="stable"||capabilities[id]==="preview";const statuses=Object.values(capabilities);const requirements=[{id:"stable-core",passed:capabilities.parser==="stable"&&capabilities.statevectorRuntime==="stable",evidence:["tests/nm-parser.spec.ts","tests/nm-runtime.spec.ts","tests/nm-toolchain.spec.ts"]},{id:"workspace-product-spine",passed:productStatus("multiFileWorkspace")&&productStatus("workspaceSnapshots")&&productStatus("localWorkspaceStore"),evidence:["tests/nm-workspace.spec.ts","tests/nm-workspace-snapshot-conformance.spec.ts","tests/nm-workspace-store.spec.ts","tests/workspace-snapshot-e2e.spec.ts"]},{id:"tooling-product-spine",passed:productStatus("cli")&&productStatus("languageServer")&&productStatus("sourcePreservingFormatter"),evidence:["tests/nm-cli.spec.ts","tests/nm-language-server.spec.ts","tests/nm-source-formatter-surface-conformance.spec.ts"]},{id:"transparent-capability-separation",passed:statuses.every(status=>["stable","preview","experimental"].includes(status))&&statuses.includes("experimental"),evidence:["app/[locale]/docs/nm-language/CapabilityMatrix.tsx","tests/nm-capability-stability.spec.ts","tests/schema-route.spec.ts"]}];return{format:NM_LANGUAGE_PREVIEW_READINESS_FORMAT,version:NM_LANGUAGE_PREVIEW_READINESS_VERSION,ready:requirements.every(({passed})=>passed),targetStatus:"preview",requirements,experimentalCapabilityPolicy:"explicit-opt-in-and-independently-versioned",stableCorePolicy:"parser-and-statevector-remain-stable"}}var nmLanguagePreviewReadiness=evaluateNMLanguagePreviewReadiness();var nmLanguageReleaseChangelog=[{languageVersion:"0.2.0",date:"2026-09-26",from:"preview",to:"preview",breaking:false,summary:{en:"Coordinated 0.2.0 preview for the expanded language, numerical library, training workflows and toolchain. New sessions use the default language profile; saved feature choices and supported 0.1.0 artifacts remain readable. Capability statuses and artifact format versions are unchanged.",tr:"Geni\u015Fletilmi\u015F dil, say\u0131sal k\xFCt\xFCphane, e\u011Fitim ak\u0131\u015Flar\u0131 ve ara\xE7 zinciri i\xE7in e\u015Fle\u015Fen 0.2.0 \xF6n izlemesi. Yeni oturumlar varsay\u0131lan dil profilini kullan\u0131r; kay\u0131tl\u0131 \xF6zellik se\xE7imleri ve desteklenen 0.1.0 dosyalar\u0131 okunabilir kal\u0131r. Yetenek durumlar\u0131 ve dosya bi\xE7imi s\xFCr\xFCmleri de\u011Fi\u015Fmedi."}},{languageVersion:"0.1.0",date:"2026-07-15",from:"experimental",to:"preview",breaking:false,summary:{en:"Promoted the overall N/M product label to preview after the stable parser/statevector core, usable workspace spine, version-aligned tooling, and gate-transparent capability matrix were verified; experimental N/M 0.2 capabilities remain explicit opt-ins.",tr:"Kararl\u0131 parser/statevector \xE7ekirde\u011Fi, kullan\u0131labilir workspace omurgas\u0131, s\xFCr\xFCmle e\u015Fle\u015Fen ara\xE7lar ve kap\u0131lar\u0131 g\xF6r\xFCn\xFCr capability matrisi do\u011Fruland\u0131ktan sonra genel N/M \xFCr\xFCn etiketi \xF6n izlemeye y\xFCkseltildi; deneysel N/M 0.2 yetenekleri a\xE7\u0131k opt-in olarak kal\u0131r."}}];var nmReadableArtifactLanguageVersions=["0.1.0",nmVersionManifest.languageVersion];function isNMReadableArtifactLanguageVersion(value){return typeof value==="string"&&nmReadableArtifactLanguageVersions.includes(value)}function isNMReadableModelLanguageVersion(value){return isNMReadableArtifactLanguageVersion(value)||value.split(".").slice(0,2).join(".")===nmVersionManifest.languageVersion.split(".").slice(0,2).join(".")}var NM_WORKSPACE_MANIFEST_FORMAT="nm-workspace";var NM_WORKSPACE_MANIFEST_VERSION="0.1";var NM_WORKSPACE_MANIFEST_SCHEMA_PATH="/schemas/nm-workspace-manifest-0.1.schema.json";var NM_WORKSPACE_MANIFEST_SCHEMA_ID=`https://quantumsoftware.tech${NM_WORKSPACE_MANIFEST_SCHEMA_PATH}`;var NM_WORKSPACE_MANIFEST_MAX_JSON_BYTES=65536;var NM_WORKSPACE_MANIFEST_MAX_PATH_BYTES=512;var NM_WORKSPACE_MANIFEST_MAX_SOURCE_ROOTS=16;var nmWorkspaceManifestDiagnosticCodes={parse:"NM-WORKSPACE-MANIFEST-PARSE-001",type:"NM-WORKSPACE-MANIFEST-TYPE-001",format:"NM-WORKSPACE-MANIFEST-FORMAT-001",version:"NM-WORKSPACE-MANIFEST-VERSION-001",required:"NM-WORKSPACE-MANIFEST-REQUIRED-001",limit:"NM-WORKSPACE-MANIFEST-LIMIT-001",unknown:"NM-WORKSPACE-MANIFEST-UNKNOWN-001",duplicate:"NM-WORKSPACE-MANIFEST-DUPLICATE-001"};var packageNamePattern=/^[a-z0-9](?:[a-z0-9._-]{0,62}[a-z0-9])?$/;var moduleNamePattern=/^[A-Za-z_]\w*$/;var unsafeUnicodePattern=/[\u0000-\u001f\u007f\u202a-\u202e\u2066-\u2069]/u;var manifestKeys=new Set(["format","version","name","entry","sourceRoots","packageNamespace"]);var utf8Encoder2=new TextEncoder;function isRecord3(value){return typeof value==="object"&&value!==null&&!Array.isArray(value)}function issue5(code,path,keyword,message){return{code,path,keyword,message}}function normalizeNMWorkspaceRelativePath(value){const canonical2=value.normalize("NFC");if(unsafeUnicodePattern.test(canonical2)||utf8Encoder2.encode(canonical2).byteLength>NM_WORKSPACE_MANIFEST_MAX_PATH_BYTES)return void 0;if(canonical2==="."||canonical2==="./"||canonical2===".\\")return".";const normalized=canonical2.replace(/\\/g,"/").replace(/^\.\//,"").replace(/\/{2,}/g,"/");if(normalized===".")return".";if(!normalized||normalized.startsWith("/")||/^[A-Za-z]:\//u.test(normalized)||normalized.split("/").some(segment=>segment===""||segment==="."||segment===".."))return void 0;return normalized}function validateNMWorkspaceManifest(value){if(!isRecord3(value)){return{valid:false,issues:[issue5(nmWorkspaceManifestDiagnosticCodes.type,"$","type","Expected an object.")]}}const issues=[];for(const key4 of Object.keys(value)){if(!manifestKeys.has(key4))issues.push(issue5(nmWorkspaceManifestDiagnosticCodes.unknown,`$.${key4}`,"additionalProperties","Unknown workspace manifest property."))}if(value.format!==NM_WORKSPACE_MANIFEST_FORMAT){issues.push(issue5(nmWorkspaceManifestDiagnosticCodes.format,"$.format","const",`Expected "${NM_WORKSPACE_MANIFEST_FORMAT}".`))}if(value.version!==NM_WORKSPACE_MANIFEST_VERSION){issues.push(issue5(nmWorkspaceManifestDiagnosticCodes.version,"$.version","const",`Expected "${NM_WORKSPACE_MANIFEST_VERSION}".`))}if(typeof value.name!=="string"||!packageNamePattern.test(value.name)){issues.push(issue5(nmWorkspaceManifestDiagnosticCodes.format,"$.name","format","Expected a lowercase workspace name using letters, numbers, dots, underscores, or hyphens."))}const entry=typeof value.entry==="string"?normalizeNMWorkspaceRelativePath(value.entry):void 0;if(!entry||!entry.endsWith(".nm")){issues.push(issue5(nmWorkspaceManifestDiagnosticCodes.format,"$.entry","format","Expected a safe NFC-normalized relative path ending in .nm."))}const sourceRoots=Array.isArray(value.sourceRoots)?value.sourceRoots:void 0;if(!sourceRoots){issues.push(issue5(nmWorkspaceManifestDiagnosticCodes.required,"$.sourceRoots","required","Expected an array of source roots."))}else if(sourceRoots.length===0||sourceRoots.length>NM_WORKSPACE_MANIFEST_MAX_SOURCE_ROOTS){issues.push(issue5(nmWorkspaceManifestDiagnosticCodes.limit,"$.sourceRoots","maxItems",`Expected between 1 and ${NM_WORKSPACE_MANIFEST_MAX_SOURCE_ROOTS} source roots.`))}const normalizedRoots=sourceRoots?.slice(0,NM_WORKSPACE_MANIFEST_MAX_SOURCE_ROOTS).map((root,index)=>{if(typeof root!=="string"){issues.push(issue5(nmWorkspaceManifestDiagnosticCodes.type,`$.sourceRoots[${index}]`,"type","Expected a string."));return void 0}const normalized=normalizeNMWorkspaceRelativePath(root);if(!normalized)issues.push(issue5(nmWorkspaceManifestDiagnosticCodes.format,`$.sourceRoots[${index}]`,"format","Expected a safe NFC-normalized relative directory path."));return normalized})??[];const validRoots=normalizedRoots.filter(root=>Boolean(root));if(new Set(validRoots).size!==validRoots.length){issues.push(issue5(nmWorkspaceManifestDiagnosticCodes.duplicate,"$.sourceRoots","uniqueItems","Source roots must be unique after normalization."))}if(entry&&validRoots.length>0&&!validRoots.some(root=>root==="."||entry===root||entry.startsWith(`${root}/`))){issues.push(issue5(nmWorkspaceManifestDiagnosticCodes.format,"$.entry","format","Entry must be located under one of the declared source roots."))}let packageNamespace;if(value.packageNamespace!==void 0){if(typeof value.packageNamespace!=="string"||!moduleNamePattern.test(value.packageNamespace)){issues.push(issue5(nmWorkspaceManifestDiagnosticCodes.format,"$.packageNamespace","format","Expected an N/M identifier."))}else packageNamespace=value.packageNamespace}if(issues.length>0||!entry||typeof value.name!=="string")return{valid:false,issues};return{valid:true,issues:[],manifest:{format:NM_WORKSPACE_MANIFEST_FORMAT,version:NM_WORKSPACE_MANIFEST_VERSION,name:value.name,entry,sourceRoots:validRoots,...packageNamespace?{packageNamespace}:{}}}}function validateNMWorkspaceManifestJsonText(json){if(utf8Encoder2.encode(json).byteLength>NM_WORKSPACE_MANIFEST_MAX_JSON_BYTES){return{valid:false,issues:[issue5(nmWorkspaceManifestDiagnosticCodes.limit,"$","maxLength","Workspace manifest JSON is too large.")]}}try{return validateNMWorkspaceManifest(JSON.parse(json))}catch{return{valid:false,issues:[issue5(nmWorkspaceManifestDiagnosticCodes.parse,"$","parse","Could not parse workspace manifest JSON.")]}}}var NM_WORKSPACE_SNAPSHOT_FORMAT="nm-workspace-snapshot";var NM_WORKSPACE_SNAPSHOT_VERSION="0.1";var NM_WORKSPACE_SNAPSHOT_SCHEMA_PATH="/schemas/nm-workspace-snapshot-0.1.schema.json";var NM_WORKSPACE_SNAPSHOT_SCHEMA_ID=`https://quantumsoftware.tech${NM_WORKSPACE_SNAPSHOT_SCHEMA_PATH}`;var NM_WORKSPACE_SNAPSHOT_SHARE_PATH="/playground/workspace";var NM_WORKSPACE_SNAPSHOT_MAX_DOCUMENTS=5e3;var NM_WORKSPACE_SNAPSHOT_MAX_SOURCE_BYTES=5e6;var NM_WORKSPACE_SNAPSHOT_MAX_JSON_BYTES=4e7;var NM_WORKSPACE_SNAPSHOT_MAX_SHARE_BYTES=15e4;var NM_WORKSPACE_SNAPSHOT_MAX_PATH_BYTES=512;var NM_WORKSPACE_SNAPSHOT_MAX_MODULE_CHARS=128;var nmWorkspaceSnapshotDiagnosticCodes={parse:"NM-SNAPSHOT-PARSE-001",type:"NM-SNAPSHOT-TYPE-001",format:"NM-SNAPSHOT-FORMAT-001",version:"NM-SNAPSHOT-VERSION-001",limit:"NM-SNAPSHOT-LIMIT-001",integrity:"NM-SNAPSHOT-INTEGRITY-001",workspace:"NM-SNAPSHOT-WORKSPACE-001"};function isRecord4(value){return typeof value==="object"&&value!==null&&!Array.isArray(value)}function snapshotIssue(code,path,keyword,message){return{code,path,keyword,message}}function normalizeSource(source){return source.replace(/\r\n?/g,"\n")}var unsafeSnapshotPathCharacters=/[\u0000-\u001f\u007f\u202a-\u202e\u2066-\u2069]/u;function normalizeSnapshotPath(value){if(unsafeSnapshotPathCharacters.test(value))return void 0;return normalizeNMWorkspaceRelativePath(value.normalize("NFC"))}function hashNMWorkspaceText(value){let hash2=BigInt("0xcbf29ce484222325");const prime=BigInt("0x100000001b3");for(const byte of new TextEncoder().encode(value)){hash2^=BigInt(byte);hash2=BigInt.asUintN(64,hash2*prime)}return hash2.toString(16).padStart(16,"0")}function canonicalSourceInput(entryModule,documents){return JSON.stringify({entryModule,documents:documents.map(document=>({path:document.path,moduleName:document.moduleName,source:normalizeSource(document.source)}))})}function createReproducibilityManifest(entryModule,documents,engine,seed,feedForwardBranchRecord,versions=nmVersionManifest){const sourceHash=hashNMWorkspaceText(canonicalSourceInput(entryModule,documents));const runFingerprint=hashNMWorkspaceText(JSON.stringify({sourceHash,languageVersion:versions.languageVersion,packageVersion:versions.packageVersion,engine,seed,...feedForwardBranchRecord?{feedForwardBranchRecord:cloneNMFeedForwardBranchRecord(feedForwardBranchRecord)}:{}}));return{hashAlgorithm:"fnv1a-64",sourceHash,runFingerprint,languageVersion:versions.languageVersion,packageVersion:versions.packageVersion,engine,seed,entryModule,documentCount:documents.length,...feedForwardBranchRecord?{feedForwardBranchRecord:cloneNMFeedForwardBranchRecord(feedForwardBranchRecord)}:{}}}function createNMWorkspaceSnapshot(input){if(!/^[a-z0-9](?:[a-z0-9._-]{0,62}[a-z0-9])?$/.test(input.name)){throw new Error("Workspace snapshot name must be lowercase and filesystem-safe.")}if(input.entryModule.length>NM_WORKSPACE_SNAPSHOT_MAX_MODULE_CHARS||!/^[A-Za-z_]\w*$/.test(input.entryModule)){throw new Error("Workspace snapshot entryModule must be an N/M identifier.")}if(input.documents.length===0||input.documents.length>NM_WORKSPACE_SNAPSHOT_MAX_DOCUMENTS){throw new Error(`Workspace snapshots require 1-${NM_WORKSPACE_SNAPSHOT_MAX_DOCUMENTS} documents.`)}const paths=new Set;const documents=input.documents.map(document=>{const path=normalizeSnapshotPath(document.path);if(!path||new TextEncoder().encode(path).byteLength>NM_WORKSPACE_SNAPSHOT_MAX_PATH_BYTES||!path.endsWith(".nm")||paths.has(path)){throw new Error(`Invalid or duplicate workspace document path: ${document.path}.`)}paths.add(path);const source=normalizeSource(document.source);const moduleName=getNMWorkspaceModuleName(source);if(!moduleName||moduleName.length>NM_WORKSPACE_SNAPSHOT_MAX_MODULE_CHARS){throw new Error(`Workspace document ${path} is missing a module declaration.`)}return{path,moduleName,source,sourceHash:hashNMWorkspaceText(source)}}).sort((left,right)=>left.path.localeCompare(right.path));const totalBytes=documents.reduce((total,document)=>total+new TextEncoder().encode(document.source).byteLength,0);if(totalBytes>NM_WORKSPACE_SNAPSHOT_MAX_SOURCE_BYTES){throw new Error(`Workspace snapshot source exceeds ${NM_WORKSPACE_SNAPSHOT_MAX_SOURCE_BYTES} bytes.`)}if(!documents.some(document=>document.moduleName===input.entryModule)){throw new Error(`Workspace entry module not found: ${input.entryModule}.`)}const index=createNMWorkspaceIndex(documents.map(document=>({uri:document.path,source:document.source})));if(index.diagnostics.length>0){throw new Error(index.diagnostics.map(diagnostic5=>diagnostic5.message).join(" "))}const branchValidation=input.feedForwardBranchRecord?validateNMFeedForwardBranchRecord(input.feedForwardBranchRecord):void 0;if(branchValidation&&!branchValidation.valid){throw new Error(`Invalid feed-forward branch record at ${branchValidation.path}: ${branchValidation.reason}`)}const branchRecord=branchValidation?.valid?branchValidation.record:void 0;const branchSeed=branchRecord?Number(branchRecord.seed):null;if(branchSeed!=null&&input.seed!=null&&input.seed!==branchSeed){throw new Error("Workspace snapshot seed does not match the feed-forward branch record.")}const engine=input.engine??"statevector";const seed=input.seed??branchSeed??null;if(seed!==null&&(!Number.isSafeInteger(seed)||seed<0)){throw new Error("Workspace snapshot seed must be a non-negative safe integer or null.")}return{format:NM_WORKSPACE_SNAPSHOT_FORMAT,version:NM_WORKSPACE_SNAPSHOT_VERSION,readonly:true,name:input.name,entryModule:input.entryModule,documents,reproducibility:createReproducibilityManifest(input.entryModule,documents,engine,seed,branchRecord)}}function validateNMWorkspaceSnapshotV01(value){const issues=[];const topLevelKeys=new Set(["format","version","readonly","name","entryModule","documents","reproducibility"]);const unknownTopLevelKey=Object.keys(value).find(key4=>!topLevelKeys.has(key4));if(unknownTopLevelKey){issues.push(snapshotIssue(nmWorkspaceSnapshotDiagnosticCodes.format,`$.${unknownTopLevelKey}`,"format","Unknown workspace snapshot property."))}if(value.format!==NM_WORKSPACE_SNAPSHOT_FORMAT){issues.push(snapshotIssue(nmWorkspaceSnapshotDiagnosticCodes.format,"$.format","const",`Expected "${NM_WORKSPACE_SNAPSHOT_FORMAT}".`))}if(value.readonly!==true){issues.push(snapshotIssue(nmWorkspaceSnapshotDiagnosticCodes.format,"$.readonly","const","Workspace snapshots must be read-only."))}if(typeof value.name!=="string"||typeof value.entryModule!=="string"||!Array.isArray(value.documents)){issues.push(snapshotIssue(nmWorkspaceSnapshotDiagnosticCodes.type,"$","type","Snapshot name, entryModule, and documents are required."));return{valid:false,issues}}if(value.documents.length===0||value.documents.length>NM_WORKSPACE_SNAPSHOT_MAX_DOCUMENTS){issues.push(snapshotIssue(nmWorkspaceSnapshotDiagnosticCodes.limit,"$.documents","limit","Snapshot document count is out of bounds."));return{valid:false,issues}}try{const documentKeys=new Set(["path","moduleName","source","sourceHash"]);const documents=value.documents.map((document,index)=>{if(!isRecord4(document)||typeof document.path!=="string"||typeof document.source!=="string"){throw new Error(`$.documents[${index}]: Expected path and source strings.`)}const unknownKey=Object.keys(document).find(key4=>!documentKeys.has(key4));if(unknownKey)throw new Error(`$.documents[${index}].${unknownKey}: Unknown workspace snapshot property.`);return{path:document.path,source:document.source}});const reproducibility=isRecord4(value.reproducibility)?value.reproducibility:{};const reproducibilityKeys=new Set(["hashAlgorithm","sourceHash","runFingerprint","languageVersion","packageVersion","engine","seed","entryModule","documentCount","feedForwardBranchRecord"]);const unknownReproducibilityKey=Object.keys(reproducibility).find(key4=>!reproducibilityKeys.has(key4));if(unknownReproducibilityKey)throw new Error(`$.reproducibility.${unknownReproducibilityKey}: Unknown workspace snapshot property.`);if(!isNMReadableArtifactLanguageVersion(reproducibility.languageVersion)||reproducibility.packageVersion!==reproducibility.languageVersion){throw new Error("$.reproducibility: Unsupported language/package version pair.")}const recreated=createNMWorkspaceSnapshot({name:value.name,entryModule:value.entryModule,documents,engine:reproducibility.engine==="stabilizer"?"stabilizer":"statevector",seed:typeof reproducibility.seed==="number"?reproducibility.seed:null,...reproducibility.feedForwardBranchRecord!==void 0?{feedForwardBranchRecord:reproducibility.feedForwardBranchRecord}:{}});recreated.reproducibility=createReproducibilityManifest(recreated.entryModule,recreated.documents,recreated.reproducibility.engine,recreated.reproducibility.seed,recreated.reproducibility.feedForwardBranchRecord,{languageVersion:reproducibility.languageVersion,packageVersion:reproducibility.packageVersion});const normalizedCandidate={format:value.format,version:value.version,readonly:value.readonly,name:value.name,entryModule:value.entryModule,documents:value.documents.map(document=>{const record3=isRecord4(document)?document:{};return{path:record3.path,moduleName:record3.moduleName,source:record3.source,sourceHash:record3.sourceHash}}),reproducibility:{hashAlgorithm:reproducibility.hashAlgorithm,sourceHash:reproducibility.sourceHash,runFingerprint:reproducibility.runFingerprint,languageVersion:reproducibility.languageVersion,packageVersion:reproducibility.packageVersion,engine:reproducibility.engine,seed:reproducibility.seed,entryModule:reproducibility.entryModule,documentCount:reproducibility.documentCount,...reproducibility.feedForwardBranchRecord!==void 0?{feedForwardBranchRecord:reproducibility.feedForwardBranchRecord}:{}}};if(JSON.stringify(recreated)!==JSON.stringify(normalizedCandidate)||issues.length>0){issues.push(snapshotIssue(nmWorkspaceSnapshotDiagnosticCodes.integrity,"$.reproducibility","integrity","Snapshot hashes or reproducibility metadata do not match the source bundle."));return{valid:false,issues}}return{valid:true,snapshot:recreated,issues:[]}}catch(error){issues.push(snapshotIssue(nmWorkspaceSnapshotDiagnosticCodes.workspace,"$.documents","workspace",error instanceof Error?error.message:"Invalid workspace snapshot."));return{valid:false,issues}}}function readNMWorkspaceSnapshot(value){if(!isRecord4(value)){return{valid:false,issues:[snapshotIssue(nmWorkspaceSnapshotDiagnosticCodes.type,"$","type","Expected an object.")]}}if(value.version!==NM_WORKSPACE_SNAPSHOT_VERSION){return{valid:false,issues:[snapshotIssue(nmWorkspaceSnapshotDiagnosticCodes.version,"$.version","const",`Unsupported workspace snapshot version; expected "${NM_WORKSPACE_SNAPSHOT_VERSION}".`)]}}return validateNMWorkspaceSnapshotV01(value)}function validateNMWorkspaceSnapshot(value){return readNMWorkspaceSnapshot(value)}function serializeNMWorkspaceSnapshot(snapshot2){const validation=validateNMWorkspaceSnapshot(snapshot2);if(!validation.valid){throw new Error(validation.issues.map(issue11=>`${issue11.path}: ${issue11.message}`).join(" "))}return JSON.stringify(validation.snapshot,null,2)}function importNMWorkspaceSnapshotJson(json){if(new TextEncoder().encode(json).byteLength>NM_WORKSPACE_SNAPSHOT_MAX_JSON_BYTES){return{valid:false,issues:[snapshotIssue(nmWorkspaceSnapshotDiagnosticCodes.limit,"$","limit","Workspace snapshot JSON is too large.")]}}try{return readNMWorkspaceSnapshot(JSON.parse(json))}catch{return{valid:false,issues:[snapshotIssue(nmWorkspaceSnapshotDiagnosticCodes.parse,"$","parse","Could not parse workspace snapshot JSON.")]}}}function encodeNMWorkspaceSnapshot(snapshot2){const json=serializeNMWorkspaceSnapshot(snapshot2);if(new TextEncoder().encode(json).byteLength>NM_WORKSPACE_SNAPSHOT_MAX_SHARE_BYTES){throw new Error(`Shareable workspace snapshots are limited to ${NM_WORKSPACE_SNAPSHOT_MAX_SHARE_BYTES} bytes.`)}return encodeSharedCode(json)}function createNMWorkspaceSnapshotHref(snapshot2,locale="en"){return`/${locale}${NM_WORKSPACE_SNAPSHOT_SHARE_PATH}#snapshot=${encodeNMWorkspaceSnapshot(snapshot2)}`}var NM_QML_BENCHMARK_CONTRACT_VERSION="0.2";var NM_BENCHMARK_MAX_REPEATS=5;var NM_BENCHMARK_MAX_WORKLOADS=25;var NM_BENCHMARK_MAX_STEPS=100;var NM_BENCHMARK_MAX_SOURCE_CHARS=2e5;var nmBenchmarkOptimizers=["gd","momentum","adam","spsa","qng"];var nmQmlBenchmarkDiagnosticCodes={input:"NM-QML-BENCH-001",trainer:"NM-QML-BENCH-002",timing:"NM-QML-BENCH-003",invariant:"NM-QML-BENCH-004"};function failure3(kind,code,error){return{success:false,code,kind,error}}function validateTrainingResult(result2,supervised){if(!result2||typeof result2!=="object")return false;const candidate=result2;if(typeof candidate.success!=="boolean"||!Array.isArray(candidate.costHistory)||candidate.costHistory.some(value=>!Number.isFinite(value)))return false;if(candidate.circuitEvaluations!=null&&(!Number.isInteger(candidate.circuitEvaluations)||candidate.circuitEvaluations<0))return false;if(!candidate.success)return true;if(candidate.costHistory.length<1||!candidate.finalParams||Object.values(candidate.finalParams).some(value=>!Number.isFinite(value)))return false;if(!supervised)return true;return typeof candidate.datasetId==="string"&&typeof candidate.datasetVersion==="string"&&candidate.datasetSplit==="train"&&isPositiveInteger(candidate.trainSamples)&&isPositiveInteger(candidate.validationSamples)&&isPositiveInteger(candidate.testSamples)&&isFiniteProbability(candidate.validationAccuracy)&&isFiniteProbability(candidate.testAccuracy)&&isFiniteNumber(candidate.validationLoss)&&isFiniteNumber(candidate.testLoss)&&typeof candidate.loss==="string"}function executeNMBenchmark(train,source,options={}){if(typeof train!=="function"||typeof source!=="string"||source.length<1||source.length>NM_BENCHMARK_MAX_SOURCE_CHARS||!options||typeof options!=="object"||Array.isArray(options)){return failure3("input",nmQmlBenchmarkDiagnosticCodes.input,`Benchmark requires a trainer, 1-${NM_BENCHMARK_MAX_SOURCE_CHARS} source characters, and an options object.`)}let parsed;try{parsed=parseNMCode(source)}catch{return failure3("input",nmQmlBenchmarkDiagnosticCodes.input,"Benchmark source parsing threw an exception.")}const blocking=diagnosticsToError(parsed.diagnostics);if(blocking)return failure3("input",nmQmlBenchmarkDiagnosticCodes.input,blocking);if(Object.keys(parsed.params).length===0)return failure3("input",nmQmlBenchmarkDiagnosticCodes.input,"Benchmark source requires at least one trainable parameter.");const trainBlock=parsed.program.statements.find(statement=>statement.kind==="train");const dataset=trainBlock?.datasetId?getNMEmbeddedDataset(trainBlock.datasetId):void 0;if(trainBlock?.datasetId&&!dataset)return failure3("input",nmQmlBenchmarkDiagnosticCodes.input,`Unknown embedded benchmark dataset: ${trainBlock.datasetId}.`);const supervised=dataset!=null;const supportedOptimizers2=supervised?["gd","momentum","adam"]:nmBenchmarkOptimizers;const requestedOptimizers=options.optimizers??[...supportedOptimizers2];if(!Array.isArray(requestedOptimizers)||requestedOptimizers.some(optimizer=>!nmBenchmarkOptimizers.includes(optimizer))){return failure3("input",nmQmlBenchmarkDiagnosticCodes.input,"Benchmark optimizers must be selected from gd, momentum, adam, spsa, and qng.")}if(requestedOptimizers.some(optimizer=>!supportedOptimizers2.includes(optimizer))){return failure3("input",nmQmlBenchmarkDiagnosticCodes.input,"Supervised benchmarks support gd, momentum, and adam; unsupported optimizers are never downgraded silently.")}const optimizers2=[...new Set(requestedOptimizers)];const repeats=options.repeats??1;const steps=options.steps??trainBlock?.steps??20;const learningRate=options.learningRate??trainBlock?.optimizer?.options.lr??.2;const objective=options.objective??trainBlock?.objective.mode??"minimize";const seed=options.seed??parsed.program.seed??20045;if(optimizers2.length===0||optimizers2.length>nmBenchmarkOptimizers.length)return failure3("input",nmQmlBenchmarkDiagnosticCodes.input,"Select between 1 and 5 unique optimizers.");if(!Number.isInteger(repeats)||repeats<1||repeats>NM_BENCHMARK_MAX_REPEATS)return failure3("input",nmQmlBenchmarkDiagnosticCodes.input,`Benchmark repeats must be between 1 and ${NM_BENCHMARK_MAX_REPEATS}.`);if(!Number.isInteger(steps)||steps<1||steps>NM_BENCHMARK_MAX_STEPS)return failure3("input",nmQmlBenchmarkDiagnosticCodes.input,`Benchmark steps must be between 1 and ${NM_BENCHMARK_MAX_STEPS}.`);if(!Number.isFinite(learningRate)||learningRate<=0||learningRate>5)return failure3("input",nmQmlBenchmarkDiagnosticCodes.input,"Benchmark learning rate must be in (0, 5].");if(objective!=="minimize"&&objective!=="maximize")return failure3("input",nmQmlBenchmarkDiagnosticCodes.input,"Benchmark objective must be minimize or maximize.");if(!Number.isSafeInteger(seed))return failure3("input",nmQmlBenchmarkDiagnosticCodes.input,"Benchmark seed must be a safe integer.");if(typeof(options.warmup??false)!=="boolean"||options.now!=null&&typeof options.now!=="function"||options.onProgress!=null&&typeof options.onProgress!=="function"){return failure3("input",nmQmlBenchmarkDiagnosticCodes.input,"Benchmark warmup, clock, and progress options have invalid types.")}if(optimizers2.length*repeats>NM_BENCHMARK_MAX_WORKLOADS)return failure3("input",nmQmlBenchmarkDiagnosticCodes.input,`Benchmark supports at most ${NM_BENCHMARK_MAX_WORKLOADS} workloads.`);const benchmarkSource=applyBenchmarkSeed(source,seed);const workload=dataset?{kind:"supervised-classifier",datasetId:dataset.id,datasetVersion:dataset.version,splitPolicy:dataset.splitPolicy,samples:{train:dataset.splits.train.length,validation:dataset.splits.validation.length,test:dataset.splits.test.length},loss:trainBlock?.loss??"mse"}:{kind:"expectation-objective"};const now=options.now??(()=>performance.now());const total=optimizers2.length*repeats;let completed=0;const series=[];for(const optimizer of optimizers2){if(options.warmup){try{const warmup=train(benchmarkSource,{optimizer,steps:1,learningRate,objective});if(!validateTrainingResult(warmup,supervised))return failure3("trainer",nmQmlBenchmarkDiagnosticCodes.trainer,"Benchmark warmup returned an invalid training result.")}catch{return failure3("trainer",nmQmlBenchmarkDiagnosticCodes.trainer,"Benchmark warmup trainer threw an exception.")}}const runs=[];for(let repeat=0;repeat<repeats;repeat+=1){let startedAt;let endedAt;let result2;try{startedAt=now()}catch{return failure3("timing",nmQmlBenchmarkDiagnosticCodes.timing,"Benchmark clock threw before a run.")}if(!Number.isFinite(startedAt))return failure3("timing",nmQmlBenchmarkDiagnosticCodes.timing,"Benchmark clock must return finite timestamps.");try{result2=train(benchmarkSource,{optimizer,steps,learningRate,objective})}catch{return failure3("trainer",nmQmlBenchmarkDiagnosticCodes.trainer,"Benchmark trainer threw an exception.")}if(!validateTrainingResult(result2,supervised))return failure3("trainer",nmQmlBenchmarkDiagnosticCodes.trainer,"Benchmark trainer returned malformed or non-finite evidence.");if(dataset&&result2.success&&(result2.datasetId!==dataset.id||result2.datasetVersion!==dataset.version||result2.trainSamples!==dataset.splits.train.length||result2.validationSamples!==dataset.splits.validation.length||result2.testSamples!==dataset.splits.test.length))return failure3("invariant",nmQmlBenchmarkDiagnosticCodes.invariant,"Supervised benchmark evidence does not match the frozen dataset split contract.");try{endedAt=now()}catch{return failure3("timing",nmQmlBenchmarkDiagnosticCodes.timing,"Benchmark clock threw after a run.")}if(!Number.isFinite(endedAt)||endedAt<startedAt)return failure3("timing",nmQmlBenchmarkDiagnosticCodes.timing,"Benchmark clock must be finite and monotonic within each run.");const durationMs=endedAt-startedAt;const initialCost=result2.costHistory[0];const finalCost=result2.costHistory.at(-1);completed+=1;try{options.onProgress?.({completed,total,optimizer,repeat})}catch{return failure3("invariant",nmQmlBenchmarkDiagnosticCodes.invariant,"Benchmark progress callback threw an exception.")}runs.push({optimizer,repeat,success:result2.success,improved:result2.success&&initialCost!=null&&finalCost!=null&&(objective==="minimize"?finalCost<=initialCost:finalCost>=initialCost),durationMs,circuitEvaluations:result2.circuitEvaluations??0,...initialCost==null?{}:{initialCost},...finalCost==null?{}:{finalCost},costHistory:[...result2.costHistory],paramHistory:result2.paramHistory.map(entry=>({...entry})),finalParams:{...result2.finalParams},...result2.gradientMethod?{gradientMethod:result2.gradientMethod}:{},...result2.validationLoss==null?{}:{validationLoss:result2.validationLoss},...result2.validationAccuracy==null?{}:{validationAccuracy:result2.validationAccuracy},...result2.testLoss==null?{}:{testLoss:result2.testLoss},...result2.testAccuracy==null?{}:{testAccuracy:result2.testAccuracy},...result2.error?{error:result2.error}:{}})}const successful=runs.filter(run=>run.success);const finalCosts=successful.flatMap(run=>run.finalCost==null?[]:[run.finalCost]);const summary={successfulRuns:successful.length,medianDurationMs:percentile(successful.map(run=>run.durationMs),.5),p95DurationMs:percentile(successful.map(run=>run.durationMs),.95),...finalCosts.length?{medianFinalCost:percentile(finalCosts,.5)}:{},medianCircuitEvaluations:percentile(successful.map(run=>run.circuitEvaluations),.5),...medianMetric(successful,"validationLoss","medianValidationLoss"),...medianMetric(successful,"validationAccuracy","medianValidationAccuracy"),...medianMetric(successful,"testLoss","medianTestLoss"),...medianMetric(successful,"testAccuracy","medianTestAccuracy")};if(Object.values(summary).some(value=>!Number.isFinite(value)))return failure3("invariant",nmQmlBenchmarkDiagnosticCodes.invariant,"Benchmark summary produced non-finite evidence.");series.push({optimizer,runs,summary})}const sourceHash=hashNMWorkspaceText(benchmarkSource.replace(/\r\n?/g,"\n").trimEnd());const fairness={seed,steps,learningRate,objective,repeats,warmup:options.warmup??false,initialParams:{...parsed.params}};const reproducibleEvidence={contractVersion:NM_QML_BENCHMARK_CONTRACT_VERSION,sourceHash,workload,fairness,series:series.map(({optimizer,runs,summary})=>({optimizer,runs:runs.map(excludeBenchmarkDuration),summary:{...summary,medianDurationMs:0,p95DurationMs:0}}))};return{success:true,contractVersion:NM_QML_BENCHMARK_CONTRACT_VERSION,sourceHash,workloads:total,workload,timingPolicy:"monotonic-finite-nonnegative-duration-excluded-from-deterministic-identity",fairness,reproducibility:{policy:"same-source-seed-workload-and-options-produce-identical-nontiming-evidence",timingExcluded:true,algorithm:"fnv1a-64",artifactHash:hashNMWorkspaceText(canonicalJson(reproducibleEvidence))},series}}function excludeBenchmarkDuration(run){const portableRun={...run};delete portableRun.durationMs;return portableRun}function applyBenchmarkSeed(source,seed){if(/^\s*@seed\s*\(/mu.test(source))return source.replace(/^\s*@seed\s*\(\s*-?\d+\s*\)\s*;?/mu,`@seed(${seed});`);const moduleMatch=/^\s*module\s+[\p{L}_][\p{L}\p{N}_]*\s*;?/mu.exec(source);if(!moduleMatch||moduleMatch.index==null)return`@seed(${seed});
|
|
1483
|
+
${indent2}${code.slice(offset)}`}return code}const lines=code.split(/\r?\n/u);let returnIndex=-1;let fallbackIndex=-1;for(let index=lines.length-1;index>=0;index-=1){if(returnIndex<0&&/^\s*return\b/u.test(lines[index]))returnIndex=index;if(fallbackIndex<0&&/^\s*\}\s*$/u.test(lines[index]))fallbackIndex=index;if(returnIndex>=0&&fallbackIndex>=0)break}const insertionIndex=returnIndex>=0?returnIndex:fallbackIndex>=0?fallbackIndex:lines.length;const indent=insertionIndex<lines.length?lines[insertionIndex].match(/^\s*/u)?.[0]??" ":" ";const injected=hiddenChecks.map(check=>indentHiddenChallengeCode(check.code,indent));return[...lines.slice(0,insertionIndex),...injected,...lines.slice(insertionIndex)].join("\n")}function findHiddenCheckResult(result2,check){if(check.kind==="test"){return result2.testResults?.find(testResult=>testResult.name===check.name)}if(check.kind==="property"){return result2.propertyResults?.find(propertyResult=>propertyResult.name===check.name)}return result2.snapshotResults?.find(snapshotResult=>snapshotResult.name===check.name)}function evaluateNMHiddenChecksCore(execute,code,hiddenChecks,parseOptions={}){if(hiddenChecks.length===0)return[];const hiddenResult=execute(injectNMHiddenChallengeChecks(code,hiddenChecks),{skipChallengeEvaluation:true,parseOptions});const fallbackDiagnosticCodes=(hiddenResult.diagnostics??[]).filter(diagnostic5=>diagnostic5.severity==="error").map(diagnostic5=>diagnostic5.code);return hiddenChecks.map(check=>{const checkResult=findHiddenCheckResult(hiddenResult,check);const diagnosticCodes=checkResult?.diagnosticCodes.length?checkResult.diagnosticCodes:checkResult?[]:fallbackDiagnosticCodes.length>0?fallbackDiagnosticCodes:["NM-CHALLENGE-001"];return{kind:check.kind,name:check.name,passed:Boolean(checkResult?.passed),diagnosticCodes,...checkResult?.line!=null?{line:checkResult.line}:{}}})}function evaluateHiddenChallengeChecksCore(execute,code,challengeId,parseOptions={}){const hiddenChecks=getNMChallenge(challengeId)?.hiddenChecks??[];return evaluateNMHiddenChecksCore(execute,code,hiddenChecks,parseOptions)}function buildNMCompilerTrace(code,parsed,resources){const sourceLines4=code.split("\n").map(line=>line.replace(/\/\/.*$/,"").trim()).filter(Boolean);const imports=[...code.matchAll(/^\s*use\s+([A-Za-z_]\w*(?:\.[A-Za-z_]\w*)+)\s*;?/gm)].map(match=>match[1]);const statementKinds=parsed.program.statements.reduce((counts,statement)=>{counts[statement.kind]=(counts[statement.kind]??0)+1;return counts},{});const loweringHints=[/\bcircuit\s+[A-Za-z_]\w*/.test(code)?"circuit templates":void 0,/\badjoint\b|\binverse\b/.test(code)?"adjoint/inverse":void 0,/\bcontrolled\s+[A-Za-z_]\w*\[\d+\]/.test(code)?"controlled blocks":void 0,/\bfor\s+[A-Za-z_]\w*\s+in\s+\d+\.\.\d+/.test(code)?"indexed for loops":void 0,/\brepeat\s+\d+/.test(code)?"repeat blocks":void 0,/\bsample\s+\d+/.test(code)?"sample block":void 0,/observable\s+[A-Za-z_]\w*\s*=\s*\{/.test(code)?"observable blocks":void 0].filter(item=>Boolean(item));const diagnosticSummary=parsed.diagnostics.reduce((counts,diagnostic5)=>{counts[diagnostic5.severity]=(counts[diagnostic5.severity]??0)+1;return counts},{});return["compiler: trace enabled by @compiler(trace: true)",`compiler: source scan lines=${sourceLines4.length}`,imports.length?`compiler: std imports expanded ${imports.join(", ")}`:"compiler: std imports expanded none",loweringHints.length?`compiler: lowering passes ${loweringHints.join(", ")}`:"compiler: lowering passes none required",`compiler: module ${parsed.program.moduleName??"(missing)"}`,`compiler: statements ${Object.entries(statementKinds).map(([kind,count])=>`${kind}=${count}`).join(" ")||"none"}`,`compiler: qreg qubits=${parsed.numQubits}`,`compiler: resources depth=${resources.depth} gates=${resources.gates} twoQubit=${resources.twoQubitGates} measurements=${resources.measurements} metrics=${resources.metrics} observes=${resources.observations}`,`compiler: diagnostics errors=${diagnosticSummary.error??0} warnings=${diagnosticSummary.warning??0} info=${diagnosticSummary.info??0}`,parsed.program.target?`compiler: target analyzer queued for ${parsed.program.target}`:"compiler: target analyzer skipped (no @target)"]}var NM_FEATURE_ENCODING_MAX_FEATURES=8;var nmFeatureEncodingDiagnosticCodes={firstUse:"NM-QML-201",overflow:"NM-QML-202",zeroVector:"NM-QML-203",input:"NM-QML-204",invariant:"NM-QML-205"};function amplitudeEncode(state,indices,features){const capacity=2**indices.length;if(features.length>capacity)return{code:"NM-QML-202",error:`Feature count ${features.length} exceeds amplitude capacity ${capacity}.`};const norm=Math.sqrt(features.reduce((sum,value)=>sum+value*value,0));if(norm===0)return{code:"NM-QML-203",error:"Amplitude encoding cannot normalize an all-zero feature vector."};const amplitudes=state.amplitudes.map(()=>complex(0));state.amplitudes.forEach((source,basis)=>{if(indices.some(qubit3=>(basis>>qubit3&1)===1))return;features.forEach((feature,encodedBasis)=>{const target2=indices.reduce((value,qubit3,bit)=>value|(encodedBasis>>bit&1)<<qubit3,basis);amplitudes[target2]=complexAdd(amplitudes[target2],complexMul(source,complex(feature/norm)))})});return{state:{...state,amplitudes}}}function encodeNMFeatures(state,indices,features,method){if(!state||!Number.isInteger(state.numQubits)||state.numQubits<1||state.numQubits>NM_FEATURE_ENCODING_MAX_FEATURES||state.amplitudes.length!==2**state.numQubits||state.amplitudes.some(amplitude=>!Number.isFinite(amplitude.re)||!Number.isFinite(amplitude.im))){return{code:nmFeatureEncodingDiagnosticCodes.input,error:"Encoding requires a finite, shape-valid state of 1-8 qubits."}}const norm=state.amplitudes.reduce((sum,amplitude)=>sum+amplitude.re**2+amplitude.im**2,0);if(!Number.isFinite(norm)||Math.abs(norm-1)>1e-6)return{code:nmFeatureEncodingDiagnosticCodes.input,error:"Encoding input state must be normalized."};if(indices.length<1||indices.length>NM_FEATURE_ENCODING_MAX_FEATURES||new Set(indices).size!==indices.length||indices.some(index=>!Number.isInteger(index)||index<0||index>=state.numQubits)){return{code:nmFeatureEncodingDiagnosticCodes.input,error:"Encoding qubit indices must be unique, in range, and non-empty."}}if(features.length<1||features.length>NM_FEATURE_ENCODING_MAX_FEATURES||features.some(feature=>!Number.isFinite(feature))){return{code:nmFeatureEncodingDiagnosticCodes.input,error:"Encoding features must contain 1-8 finite numbers."}}if(!["angle","reupload","amplitude","iqp"].includes(method)){return{code:nmFeatureEncodingDiagnosticCodes.input,error:"Unknown feature encoding method."}}if(method==="amplitude")return checkedEncodingState(amplitudeEncode(state,indices,features));if(method==="iqp"&&features.length>indices.length){return{code:"NM-QML-202",error:`Feature count ${features.length} exceeds IQP register size ${indices.length}.`}}let encoded=state;if(method==="iqp"){indices.forEach(target2=>{encoded=applySingleQubitGate(encoded,GATES.H,target2)});features.forEach((feature,index)=>{encoded=applyRz(encoded,indices[index],feature)});for(let left=0;left<features.length;left+=1)for(let right=left+1;right<features.length;right+=1){const gate={kind:"gate",gate:"RZZ",targets:[indices[left],indices[right]].map(resolvedIndex=>({register:"encode",resolvedIndex})),theta:features[left]*features[right],line:0};encoded=applyGateToState(encoded,gate)}return checkedEncodingState({state:encoded})}features.forEach((feature,index)=>{const target2=indices[index%indices.length];encoded=applyRy(encoded,target2,feature);if(method==="reupload")encoded=applyRz(encoded,target2,feature/2)});return checkedEncodingState({state:encoded})}function checkedEncodingState(result2){if("error"in result2)return result2;return result2.state.amplitudes.some(amplitude=>!Number.isFinite(amplitude.re)||!Number.isFinite(amplitude.im))?{code:nmFeatureEncodingDiagnosticCodes.invariant,error:"Feature encoding produced a non-finite amplitude."}:result2}function executeNMEncoding(parsed,state,statement){const datasetId=parsed.program.datasets?.[0]?.id;const requestedSplit=parsed.program.datasets?.[0]?.split;const split=requestedSplit==="validation"||requestedSplit==="test"?requestedSplit:"train";const dataset=datasetId?getNMEmbeddedDataset(datasetId):void 0;const row=datasetId?getNMEmbeddedDatasetSplitRow(datasetId,statement.row,split):void 0;const entries=Object.entries(parsed.qubitMap).filter(([name2])=>name2.startsWith(`${statement.register}[`));const indices=entries.sort(([a],[b])=>Number(a.match(/\d+/)?.[0])-Number(b.match(/\d+/)?.[0])).map(([,index])=>index);if(!datasetId||!dataset||!row||indices.length===0)return{diagnostic:createDiagnostic({code:"NM-RUNTIME-023",severity:"error",message:`Unable to encode dataset row for ${datasetId??"(missing dataset)"}.`,hint:'Use @dataset("xor_2d", split: "train") before encode.',translationKey:"datasetEncodingFailed",translationValues:{dataset:datasetId??"(missing dataset)"},line:statement.line})};const priorUse=parsed.program.statements.some(item=>item.line<statement.line&&(item.kind==="gate"&&item.targets.some(target2=>target2.register===statement.register)||item.kind==="encode"&&item.register===statement.register));if(statement.method==="amplitude"&&priorUse)return{diagnostic:createDiagnostic({code:"NM-QML-201",severity:"error",message:"Amplitude encoding must be the first operation on the register.",hint:"Move amplitude encoding before gates and other encodings on this register.",translationKey:"amplitudeEncodingNotFirst",line:statement.line})};const encoded=encodeNMFeatures(state,indices,row.features,statement.method);if("error"in encoded)return{diagnostic:createDiagnostic({code:encoded.code,severity:"error",message:encoded.error,hint:encoded.code==="NM-QML-202"?"Use a larger register or fewer features.":encoded.code==="NM-QML-203"?"Provide at least one non-zero feature.":"Use finite, normalized, bounded encoding inputs.",...encoded.code==="NM-QML-202"?{translationKey:"encodingFeatureOverflow"}:encoded.code==="NM-QML-203"?{translationKey:"zeroAmplitudeVector"}:{},line:statement.line})};const values2=row.features.map(value=>value.toFixed(3)).join(", ");return{state:encoded.state,output:`Encoded ${dataset.id}[${statement.row}] into ${statement.register} with ${statement.method} (${values2})`,trace:`runtime:encode ${statement.method} features=[${row.features.join(",")}]`}}var NM_PARAMETER_GROUPS_VERSION="0.1.0-experimental";var nmParameterGroupLimits=Object.freeze({sourceBytes:131072,groups:16,members:64});var nmParameterGroupDiagnosticCodes={disabled:"NM-PGR-001",syntax:"NM-PGR-002",scope:"NM-PGR-003",duplicate:"NM-PGR-004",unknown:"NM-PGR-005",bound:"NM-PGR-006",collision:"NM-PGR-007",unsupportedCarrier:"NM-PGR-008"};var messages4={disabled:["Parameter groups require experimental.parameterGroups=true.","Parametre gruplar\u0131 i\xE7in experimental.parameterGroups=true gereklidir."],syntax:["Use paramgroup name = [parameter, vector[index]]; with at least one member.","En az bir \xFCyeyle paramgroup ad = [parametre, vektor[indis]]; bi\xE7imini kullan\u0131n."],scope:["Parameter groups may only be declared at module scope.","Parametre gruplar\u0131 yaln\u0131z mod\xFCl kapsam\u0131nda bildirilebilir."],duplicate:["A group name or resolved parameter member is repeated.","Grup ad\u0131 veya \xE7\xF6z\xFCmlenmi\u015F parametre \xFCyesi tekrarlan\u0131yor."],unknown:["Group members must name declared entry-program trainable parameters.","Grup \xFCyeleri giri\u015F program\u0131nda bildirilen e\u011Fitilebilir parametreleri se\xE7melidir."],bound:["Parameter group source, count, member or vector-index limit exceeded.","Parametre grubu kaynak, say\u0131, \xFCye veya vekt\xF6r indisi s\u0131n\u0131r\u0131 a\u015F\u0131ld\u0131."],collision:["A parameter group name conflicts with another declaration or reserved name.","Parametre grubu ad\u0131 ba\u015Fka bir bildirimle veya ayr\u0131lm\u0131\u015F adla \xE7ak\u0131\u015F\u0131yor."],unsupportedCarrier:["This source carrier does not yet preserve parameter groups.","Bu kaynak ta\u015F\u0131y\u0131c\u0131s\u0131 hen\xFCz parametre gruplar\u0131n\u0131 korumuyor."]};function parameterGroupDiagnostic(issue11,range2){return{code:nmParameterGroupDiagnosticCodes[issue11],severity:"error",message:messages4[issue11][0],translationKey:`parameterGroups.${issue11}`,...range2?{line:range2.start.line+1,column:range2.start.column+1}:{}}}var identifier4=token=>token?.kind==="identifier"&&/^[A-Za-z_]\w*$/u.test(token.text);var span2=(first,last)=>({start:{...first.range.start},end:{...last.range.end}});function readNMParameterGroupSource(source,enabled){const result2={source,originalSource:source,declarations:[],parameters:[],names:new Set,diagnostics:[],imports:[]};if(!/\bparamgroup\b/u.test(source))return result2;const cst=parseNMSourceCST(source),tokens=cst.tokens.filter(token=>!token.trivia);const declarations=[];let depth3=0,functionName,nextFunction;const error=(issue11,token)=>result2.diagnostics.push(parameterGroupDiagnostic(issue11,token.range));for(let i=0;i<tokens.length;i++){const token=tokens[i],next=tokens[i+1];if(!depth3&&token.text==="use"&&next?.text==="workspace"&&tokens[i+2]?.text==="."&&identifier4(tokens[i+3])){const alias=tokens[i+4]?.text==="as"&&identifier4(tokens[i+5])?tokens[i+5].text:void 0;result2.imports.push({name:tokens[i+3].text,...alias?{alias}:{}});if(alias)result2.names.add(alias)}if(!depth3&&["fn","record","enum","const","param","circuit","observable"].includes(token.text)&&next?.kind==="identifier")result2.names.add(next.text);if(!depth3&&token.text==="fn")nextFunction=next?.text;if(token.text==="{"){depth3++;if(depth3===1){functionName=nextFunction;nextFunction=void 0}continue}if(token.text==="}"){depth3--;if(!depth3)functionName=void 0;continue}if((token.text==="param"||token.text==="parametre")&&identifier4(next)&&(!depth3||depth3===1&&functionName==="main")){const vector=tokens[i+2]?.text===":"&&tokens[i+3]?.text==="Angle"&&tokens[i+4]?.text==="[";const literal=vector&&tokens[i+5]?.kind==="number"&&/^\d+$/u.test(tokens[i+5].text)&&tokens[i+6]?.text==="]";result2.parameters.push({name:next.text,vector,...literal?{literalSize:Number(tokens[i+5].text)}:{},range:span2(token,next)});result2.names.add(next.text)}if(token.text!=="paramgroup"||next?.kind!=="identifier"||["fn","let","const","param","."].includes(tokens[i-1]?.text))continue;if(source.length>nmParameterGroupLimits.sourceBytes||new TextEncoder().encode(source).length>nmParameterGroupLimits.sourceBytes){error("bound",token);return result2}if(depth3!==0){error("scope",token);continue}if(!enabled){error("disabled",token);continue}let end=i+1;while(end<tokens.length&&![";","{","}"].includes(tokens[end].text))end++;if(tokens[end]?.text!==";"||!identifier4(next)||tokens[i+2]?.text!=="="||tokens[i+3]?.text!=="["||tokens[end-1]?.text!=="]"){error("syntax",token);continue}const members=[];let cursor=i+4,invalid5=false;while(cursor<end-1){const name2=tokens[cursor++];if(!identifier4(name2)){invalid5=true;break}let index,last=name2;if(tokens[cursor]?.text==="["){const value=tokens[cursor+1];if(value?.kind!=="number"||!/^\d+$/u.test(value.text)||tokens[cursor+2]?.text!=="]"||!Number.isSafeInteger(Number(value.text))){invalid5=true;break}index=Number(value.text);last=tokens[cursor+2];cursor+=3}members.push({name:name2.text,...index!==void 0?{index}:{},range:span2(name2,last)});if(cursor===end-1)break;if(tokens[cursor++]?.text!==","||cursor===end-1){invalid5=true;break}}if(invalid5||!members.length||cursor!==end-1)error("syntax",token);else if(members.length>nmParameterGroupLimits.members||result2.declarations.length>=nmParameterGroupLimits.groups)error("bound",token);else{result2.declarations.push({name:next.text,range:span2(token,tokens[end]),nameRange:next.range,members});declarations.push({start:token.range.start.offset,end:tokens[end].range.end.offset})}i=end}if(result2.declarations.length&&cst.issues.length)result2.diagnostics.push(parameterGroupDiagnostic("syntax",cst.issues[0].range));for(const declaration of declarations.reverse())result2.source=result2.source.slice(0,declaration.start)+result2.source.slice(declaration.start,declaration.end).replace(/[^\r\n]/g," ")+result2.source.slice(declaration.end);return result2}function attachNMParameterGroups(read5,result2,options){if(!read5.declarations.length||result2.diagnostics.some(item=>item.severity==="error"))return result2;const importedModules=new Set(read5.imports.filter(item=>!item.alias).map(item=>item.name));const provenance=result2.program.classicalFunctions;for(const symbol of provenance?.workspace?.symbols??[]){if(importedModules.has(symbol.module)&&symbol.visibility==="public")read5.names.add(symbol.name)}if(provenance?.nominalWorkspace){const snapshot2=provenance.nominalWorkspace;const graph=createNMNominalWorkspace(snapshot2.entrySource,snapshot2.sources,{enabled:true,moduleVisibility:options.experimental?.moduleVisibility});for(const imported of graph.modules)if(importedModules.has(imported.name)){for(const symbol of imported.symbols)if(symbol.visibility==="public")read5.names.add(symbol.name)}}const groups=[],groupNames=new Set;for(const declaration of read5.declarations){if(groupNames.has(declaration.name)){result2.diagnostics.push(parameterGroupDiagnostic("duplicate",declaration.nameRange));continue}groupNames.add(declaration.name);if(read5.names.has(declaration.name)||["main","PI"].includes(declaration.name)||declaration.name.startsWith("__nm_")){result2.diagnostics.push(parameterGroupDiagnostic("collision",declaration.nameRange));continue}const members=[],selected=new Set;for(const member of declaration.members){const candidates=read5.parameters.filter(parameter2=>parameter2.name===member.name);if(candidates.length!==1){result2.diagnostics.push(parameterGroupDiagnostic("unknown",member.range));continue}const parameter=candidates[0];const actual=result2.program.statements.filter(statement=>statement.kind==="param"&&statement.line===parameter.range.start.line+1);const foldedSize=result2.program.comptimeConstants?.uses.find(use=>use.position==="vector-param-size"&&use.line===parameter.range.start.line+1)?.foldedValue;const size=parameter.literalSize??foldedSize;const names=parameter.vector?Number.isSafeInteger(size)&&size>=1&&size<=NM_COMPTIME_MAX_VECTOR_PARAMETERS?Array.from({length:size},(_,index)=>`${member.name}_${index}`):[]:actual.some(statement=>statement.kind==="param"&&statement.name===member.name)?[member.name]:[];if(!names.length||names.some(name2=>!Object.prototype.hasOwnProperty.call(result2.params,name2)||!actual.some(statement=>statement.kind==="param"&&statement.name===name2))){result2.diagnostics.push(parameterGroupDiagnostic("unknown",member.range));continue}if(parameter.vector&&names.some(name2=>read5.parameters.some(other=>other.name===name2))){result2.diagnostics.push(parameterGroupDiagnostic("collision",member.range));continue}if(member.index!==void 0&&(!parameter.vector||member.index>=names.length)){result2.diagnostics.push(parameterGroupDiagnostic("bound",member.range));continue}const chosen=member.index===void 0?names:[names[member.index]];for(const name2 of chosen){if(selected.has(name2)){result2.diagnostics.push(parameterGroupDiagnostic("duplicate",member.range));continue}if(members.length>=nmParameterGroupLimits.members){result2.diagnostics.push(parameterGroupDiagnostic("bound",member.range));break}selected.add(name2);members.push({name:member.name,...parameter.vector?{index:Number(name2.slice(member.name.length+1))}:{},parameterName:name2,referenceRange:member.range,declarationRange:parameter.range})}}groups.push({name:declaration.name,range:declaration.range,nameRange:declaration.nameRange,members})}if(!result2.diagnostics.some(item=>item.severity==="error"))result2.program.parameterGroups={experimental:true,contractVersion:NM_PARAMETER_GROUPS_VERSION,declarations:groups,originalSource:read5.originalSource,parseOptions:{experimental:{...options.experimental},...options.workspaceModules?{workspaceModules:{...options.workspaceModules}}:{}}};return result2}function validateUnsupportedSyntax(line,diagnostics){const operation=line.text.match(/^([A-Za-z_]\w*)\b/u)?.[1];const measurement=/^(?:let\s+[\p{L}_][\p{L}\p{N}_]*(?:\s*:\s*[^=]+)?\s*=\s*)?measure(?:[XYZ]|_all)?\b/u.test(line.text);const knownOperation=measurement||playgroundRuntimeLimits.supportedGates.includes(operation??"");if(knownOperation){if(!diagnostics.some(item=>item.severity==="error"&&item.line===line.line)){diagnostics.push(createDiagnostic({code:"NM-PARSE-008",severity:"error",message:`Invalid operation arguments: ${line.text}`,hint:"Use the operation's required operands, for example: H(q[0]); CNOT(q[0], q[1]); Rx(q[0], PI / 2); measure(q[0]);",translationKey:"invalidOperationArguments",translationValues:{statement:line.text},line:line.line}))}return}if(/^let\b/u.test(line.text)){if(!diagnostics.some(item=>item.severity==="error"&&item.line===line.line)){diagnostics.push(createDiagnostic({code:"NM-PARSE-068",severity:"error",message:`Unsupported local declaration: ${line.text}`,hint:"Use a supported initializer and an explicit type for classical or record values, for example: let value: Float = 0.3; Enable the required experimental features.",translationKey:"unsupportedLocalDeclaration",translationValues:{declaration:line.text},line:line.line}))}return}if(/^circuit\s+[A-Za-z_]\w*\s*\([^)]*\)\s*\{.+\}\s*;?$/u.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-060",severity:"error",message:"Inline circuit declarations are not part of the executable N/M block grammar.",hint:"Put the opening brace at the end of the declaration line, the circuit body on following lines, and the closing brace on its own line.",line:line.line}));return}if(/^(quantum|classical|hybrid)\s+(fn|module)\b/.test(line.text)||/^@(?!target\s*\(|constraints\s*\(|compiler\s*\(|optimize\s*\(|estimate\s*\(|goal\s*\(|outcome\s*\(|rubric\s*\(|misconception\s*\(|quiz\s*\(|lab\s*\(|challenge\s*\(|dataset\s*\(|checkpoint\s*\(|hint\s*\(|concept\s*\(|level\s*\(|prereq\s*\(|explain\s*\(|noise\s*\(|mitigation\s*\(|seed\s*\(|shots\s*\()/.test(line.text)||/\b(while|import|logical)\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-003",severity:"error",message:"This syntax is part of the N/M spec preview and is not executable in the playground runtime.",hint:"Use the supported subset: module, fn main, qreg, supported gates, measure, and return.",translationKey:"specPreviewSyntax",line:line.line}))}}function readNMMainAssignment(tokens){if(tokens[0]?.kind!=="identifier")return{candidate:false};let cursor=1,index;if(tokens[cursor]?.text==="["){const begin=++cursor;let depth3=1;while(cursor<tokens.length&&depth3){if(tokens[cursor].text==="[")depth3++;if(tokens[cursor].text==="]")depth3--;if(depth3)cursor++}if(depth3)return{candidate:true};index=tokens.slice(begin,cursor++)}const operator=tokens[cursor]?.text;if(!index&&!["=","+=","-=","*=","/=","%="].includes(operator))return{candidate:false};if(operator!=="="||index?.length===0)return{candidate:true};const end=tokens.at(-1)?.text===";"?tokens.length-1:tokens.length;const value=tokens.slice(cursor+1,end);return value.length?{candidate:true,name:tokens[0].text,index,value}:{candidate:true}}function parseNMMainMutation(line,enabled){const mutable=/^let\s+mut\b/u.test(line.text);if(!mutable&&!/^[\p{L}_][\p{L}\p{N}_]*\s*(?:\[|[+\-*/%]?=(?!=))/u.test(line.text))return{candidate:false,diagnostics:[]};const assignment=readNMMainAssignment(parseNMSourceCST(line.text).tokens.filter(token=>!token.trivia));if(!mutable&&!assignment.candidate)return{candidate:false,diagnostics:[]};const error=(code,message)=>({candidate:true,diagnostics:[createDiagnostic({code,severity:"error",message,line:line.line})]});if(!enabled)return error("NM-PARSE-062","Main mutable values require classicalFunctions and typedClassicalValues experimental features.");if(mutable){const name2=/^let\s+mut\s+([\p{L}_][\p{L}\p{N}_]*)/u.exec(line.text)?.[1];if(!name2)return error("NM-PARSE-063","A mutable main binding requires a name and explicit numeric type.");if(isNMClassicalFunctionReservedName(name2))return error("NM-CFN-004",`Reserved mutable binding name: ${name2}.`);const parsed=parseNMClassicalDeclaration(line.text.replace(/^let\s+mut\s+/u,"let "),line.line,true);if(!parsed.statement||!isNMMutableClassicalType(parsed.statement.valueType))return error("NM-PARSE-063","A mutable main binding requires Int, Float or a fixed Int/Float array and initializer.");return{...parsed,candidate:true,...parsed.statement?{statement:{...parsed.statement,mutable:true}}:{}}}if(!assignment.name||!assignment.value)return error("NM-PARSE-063","Assignment requires NAME or NAME[INDEX] = EXPRESSION; compound assignment is not supported.");if(isNMClassicalFunctionReservedName(assignment.name))return error("NM-CFN-004",`Reserved assignment binding name: ${assignment.name}.`);const expression=parseNMTypedClassicalExpressionSource(assignment.value.map(token=>token.text).join(" "));const indexed=assignment.index&&parseNMTypedClassicalExpressionSource(`${assignment.name}[${assignment.index.map(token=>token.text).join(" ")}]`);if(!expression||assignment.index&&indexed?.kind!=="index")return error("NM-PARSE-063","Invalid assignment expression or index.");return{candidate:true,diagnostics:[],statement:{kind:"classicalAssign",name:assignment.name,...indexed?.kind==="index"?{index:indexed.index}:{},expression,line:line.line}}}function parseNMMainForHeader(line,diagnostics){const match=/^for\s+([\p{L}_][\p{L}\p{N}_]*)\s+in\s+(\d+)\s*\.\.\s*(\d+)\s*\{$/u.exec(line.text);if(!match){diagnostics.push(createDiagnostic({code:"NM-PARSE-008",severity:"error",message:"A bounded main loop requires for i in START..END with literal integer bounds.",line:line.line}));return void 0}if(isNMClassicalFunctionReservedName(match[1])){diagnostics.push(createDiagnostic({code:"NM-CFN-004",severity:"error",message:`Reserved loop index name: ${match[1]}.`,line:line.line}));return void 0}const start=Number(match[2]),end=Number(match[3]);if(!Number.isSafeInteger(start)||!Number.isSafeInteger(end)||start<0||start>end||end>256){diagnostics.push(createDiagnostic({code:"NM-CFN-003",severity:"error",message:"Main loop bounds must satisfy 0 <= START <= END <= 256; END is exclusive.",line:line.line}));return void 0}return{index:match[1],start,end}}function isNMMainResultMatch(lines,start,visible=[]){if(!/^match\b/u.test(lines[start]?.text??""))return false;if(/^(?:ok\b|error\b)/u.test(lines[start+1]?.text??""))return true;const selector=/^match\s*\(\s*([\p{L}_][\p{L}\p{N}_]*)\s*\)/u.exec(lines[start].text)?.[1];return Boolean(selector&&(selector.startsWith("__nm_cfn_result_")||visible.some(statement=>statement.kind==="classicalDecl"&&statement.name===selector&&statement.valueType.kind==="result")))}function parseNMMainResultMatch(lines,start,options,nested,depth3){const line=lines[start];const report=(at,message)=>options.diagnostics.push(createDiagnostic({code:"NM-PARSE-067",severity:"error",message,line:at.line}));const closeBlock=open=>{let level=1;for(let index=open+1;index<lines.length;index++){if(closesNMSourceBlock(lines[index])&&--level===0)return index;if(lines[index].text.trimEnd().endsWith("{"))level++}report(lines[open],"Result match block is missing its closing brace.");return lines.length-1};const match=/^match\s*\((.*)\)\s*\{$/u.exec(line.text);const selector=match&&parseNMTypedClassicalExpressionSource(match[1]);if(!selector||depth3>=32){report(line,"Invalid or excessively nested Result match.");return{end:closeBlock(start)}}const end=closeBlock(start);let cursor=start+1;let okBinding,okBody,errorBody;while(cursor<end){const arm=lines[cursor];const ok=/^ok\s*\(\s*([\p{L}_][\p{L}\p{N}_]*)\s*\)\s*=>\s*\{$/u.exec(arm.text);const error=/^error\s*=>\s*\{$/u.test(arm.text);if(!ok&&!error){report(arm,"Result match requires ok(value) and error arms.");return{end}}if(ok?okBody!==void 0:errorBody!==void 0){report(arm,"Result match arms must occur exactly once.");return{end}}const armEnd=closeBlock(cursor);if(armEnd>=end){report(arm,"Invalid Result match arm boundary.");return{end}}const body=[];cursor++;while(cursor<armEnd){const current=lines[cursor];if(/^compute\s*\{$/u.test(current.text)&&options.parseComputeApply){const pair=options.parseComputeApply(cursor);if(pair.statement)body.push(pair.statement);cursor=pair.end+1;continue}if(/^(?:if|for)\b/u.test(current.text)||isNMMainResultMatch(lines,cursor,[...options.visible,...body])){const child=nested(lines,cursor,{...options,visible:[...options.visible,...body],numericNames:ok?[...options.numericNames,ok[1]]:options.numericNames},depth3+1);if(child.statement)body.push(child.statement);cursor=child.end+1}else if(current.text.trimEnd().endsWith("{")){report(current,"Unsupported block inside Result match.");cursor=closeBlock(cursor)+1}else{const before=options.diagnostics.length;const statement=options.parseStatement(current);if(statement)body.push(statement);else if(before===options.diagnostics.length)report(current,"Unsupported statement inside Result match.");cursor++}}if(ok){okBinding=ok[1];okBody=body}else errorBody=body;cursor=armEnd+1}if(!okBinding||!okBody||!errorBody){report(line,"Result match must cover both ok and error.");return{end}}return{statement:{kind:"classicalMatchResult",selector,okBinding,okBody,errorBody,line:line.line},end}}function parseNMMainConditional(lines,start,options,depth3=0){if(isNMMainResultMatch(lines,start,options.visible))return parseNMMainResultMatch(lines,start,options,parseNMMainConditional,depth3);const line=lines[start];const report=(at,code,message)=>options.diagnostics.push(createDiagnostic({code,severity:"error",message,line:at.line}));const closeBlock=open=>{let level=1;for(let i=open+1;i<lines.length;i++){if(closesNMSourceBlock(lines[i])&&--level===0)return i;if(lines[i].text.trimEnd().endsWith("{"))level++}return lines.length-1};if(depth3>=32){report(line,"NM-CFN-003","Main conditional nesting exceeds the bounded control-flow limit.");return{end:closeBlock(start)}}const isLoop=/^for\b/u.test(line.text);const loop=isLoop?parseNMMainForHeader(line,options.diagnostics):void 0;if(loop&&options.visible.some(statement2=>statement2.kind==="qreg"&&statement2.name===loop.index)){report(line,"NM-CFN-004",`Loop index conflicts with a quantum register: ${loop.index}.`);return{end:closeBlock(start)}}if(isLoop&&!loop)return{end:closeBlock(start)};const match=/^if\s*\(\s*(.*?)\s*\)\s*\{\s*$/u.exec(line.text);if(!match&&!isLoop){report(line,"NM-PARSE-006",`Malformed main condition: ${line.text}.`);return{end:line.text.trimEnd().endsWith("{")?closeBlock(start):start}}const numericNames=new Set(options.numericNames);for(const statement2 of options.visible){if(statement2.kind==="classicalDecl"){if(statement2.valueType.kind!=="array"||statement2.valueType.elementType!=="Bit")numericNames.add(statement2.name)}else if(statement2.kind==="const"||statement2.kind==="param")numericNames.add(statement2.name)}const measured=parseNMClassicalPredicate(match?.[1]??"");const useMeasured=measured.success&&!getNMClassicalPredicateResults(measured.predicate).some(name2=>numericNames.has(name2));const condition=useMeasured?void 0:parseNMTypedClassicalExpressionSource(match?.[1]??"");if(options.classicalControl===false&&(isLoop||!useMeasured)&&!isNMComputeApplyRepeatScope(line)){report(line,"NM-PARSE-062","Typed conditions and runtime loops require classicalFunctions and typedClassicalValues experimental features.");return{end:closeBlock(start)}}const simple=/^([\p{L}_][\p{L}\p{N}_]*)\s*(==|!=)\s*([01])$/u.exec(match?.[1]??"");if(useMeasured&&!simple&&!options.feedForward){report(line,"NM-FF-001","Extended measurement conditions require experimental.feedForward=true.")}else if(!isLoop&&!useMeasured&&!condition){report(line,"NM-PARSE-063",`Invalid typed main condition: ${match?.[1]}.`)}let cursor=start+1;const parseBody=()=>{const body2=[];while(cursor<lines.length&&!closesNMSourceBlock(lines[cursor])){const current=lines[cursor];if(/^compute\s*\{$/u.test(current.text)&&options.parseComputeApply){const pair=options.parseComputeApply(cursor);if(pair.statement)body2.push(pair.statement);cursor=pair.end+1;continue}if(/^(?:if|for)\b/u.test(current.text)||isNMMainResultMatch(lines,cursor,[...options.visible,...body2])){const nested=parseNMMainConditional(lines,cursor,{...options,numericNames:loop?[...options.numericNames,loop.index]:options.numericNames,visible:[...options.visible,...body2]},depth3+1);if(nested.statement)body2.push(nested.statement);cursor=nested.end+1;continue}if(current.text.trimEnd().endsWith("{")){report(current,"NM-PARSE-006",`Unsupported block inside main condition: ${current.text}.`);cursor=closeBlock(cursor)+1;continue}const before=options.diagnostics.length;const statement2=options.parseStatement(current);if(statement2)body2.push(statement2);else if(before===options.diagnostics.length)report(current,"NM-PARSE-006",`Unsupported statement inside main condition: ${current.text}.`);cursor++}if(cursor>=lines.length)report(line,"NM-PARSE-006","Main conditional body is missing its closing brace.");return body2};const body=parseBody();if(loop)return{statement:{kind:"classicalFor",...loop,body,line:line.line},end:cursor};let elseBody;if(!isNMComputeApplyRepeatScope(line)&&/^else\s*\{$/u.test(lines[cursor+1]?.text??"")){cursor+=2;elseBody=parseBody()}const shared={kind:"if",body,...elseBody?{elseBody}:{},line:line.line};const statement=useMeasured&&measured.success?simple?{...shared,binding:simple[1],operator:simple[2],value:Number(simple[3])}:{...shared,predicate:measured.predicate}:condition?{...shared,condition}:void 0;return{statement,end:cursor}}function readNMEnumResultMainMatch(tokens,start,end){let cursor=start;const fail11=message=>{const at=(tokens[cursor]??tokens[start]).range.start;throw new NMNominalExpressionError(message,at.line+1,at.column+1)};const expect=value=>{if(tokens[cursor]?.text!==value)fail11(`Expected ${value}`);return cursor++};const close=(open,left,right)=>{let depth3=1;for(let i=open+1;i<end;i++){if(tokens[i].text===left)depth3++;if(tokens[i].text===right)depth3--;if(!depth3)return i}return fail11("Unclosed Result match delimiter")};expect("match");const begin=expect("("),finish2=close(begin,"(",")");if(finish2===begin+1)fail11("Expected Result selector");cursor=finish2+1;expect("{");const arms=[];while(tokens[cursor]?.text!=="}"){const kind=tokens[cursor++]?.text;if(kind!=="ok"&&kind!=="error"||arms.some(arm=>arm.kind===kind))fail11("Result match requires one ok and one error arm");let binding;if(kind==="ok"||tokens[cursor]?.text==="("){expect("(");if(tokens[cursor]?.kind!=="identifier")fail11("Expected match binding");binding=tokens[cursor++].text;expect(")")}expect("=>");const open=expect("{"),last=close(open,"{","}");arms.push({kind,binding,open,close:last});cursor=last+1;if(tokens[cursor]?.text===",")cursor++}if(arms.length!==2)fail11("Result match requires one ok and one error arm");return{selector:tokens.slice(begin+1,finish2).map(token=>token.text).join(" "),arms,close:cursor}}var targetCounts={H:1,X:1,Y:1,Z:1,S:1,T:1,Sdg:1,Tdg:1,P:1,U:1,GPhase:0,CNOT:2,CZ:2,SWAP:2,iSWAP:2,CCNOT:3,CSWAP:3,CY:2,CH:2,Rx:1,Ry:1,Rz:1,RXX:2,RYY:2,RZZ:2,CRy:2,CRz:2,CP:2};function prepareFunctionGateTargets(tokens,types,signatures){const gate=tokens[0]?.text;if(!Object.prototype.hasOwnProperty.call(targetCounts,gate)||targetCounts[gate]===0)return void 0;const args=argumentsOf(tokens);const angleCount=gate==="U"?3:["P","Rx","Ry","Rz","RXX","RYY","RZZ","CRy","CRz","CP"].includes(gate)?1:0;if(args.length!==targetCounts[gate]+angleCount)fail3("NM-CFN-009",tokenLocation(tokens[0]));const targets=args.slice(0,targetCounts[gate]).map(argument=>{const text=functionTokenText(argument);if(argument[0]?.kind!=="identifier"||argument[1]?.text!=="["||argument.at(-1)?.text!=="]")return{text};const input=argument.slice(2,-1);if(input.length===1&&input[0].kind==="number"&&/^\d+$/u.test(input[0].text))return{text};const at=tokenLocation(argument[0]);const expression=parseNMTypedClassicalExpressionSource(functionTokenText(input),signatures);if(!expression)fail3("NM-CFN-002",at);checkFunctionExpressionBudget(expression,at);const inferred=inferNMTypedClassicalExpressionType(expression,types).type;if(inferred?.kind!=="scalar"||inferred.name!=="Int")fail3("NM-CFN-005",at);return{text,register:argument[0].text,expression}});return targets.some(target2=>target2.expression)?{gate,targets}:void 0}function visitMainSourceStatements(tokens,start,end,visitor,depth3=0){if(depth3>=nmClassicalFunctionLimits.expressionDepth)fail3("NM-CFN-003",tokenLocation(tokens[start]));let pending=start;for(let index=start;index<end;index++){if(tokens[index].text==="{"){const header=tokens.slice(pending,index);let close=index+1,level=1;while(close<end&&level){if(tokens[close].text==="{")level++;if(tokens[close].text==="}")level--;if(level)close++}if(level)fail3("NM-CFN-002",tokenLocation(tokens[index]));const kind=header[0]?.text;visitor.header?.(pending,index);const executable=["if","else","for","until","observe","test","snapshot","match","ok","error","compute","apply"].includes(kind)||visitor.containers?.includes(kind)||kind==="("&&header.at(-1)?.text==="=>";if(executable)visitor.scope(()=>visitMainSourceStatements(tokens,index+1,close,visitor,depth3+1),header);else visitor.opaque?.(index+1,close,header);index=close;pending=close+1}else if(tokens[index].text===";"){if(pending<index)visitor.statement(pending,index);pending=index+1}}}function nmCircuitInvocationTokens(tokens){if(["adjoint","inverse"].includes(tokens[0]?.text))return tokens.slice(1);if(tokens[0]?.text==="inv"&&tokens[1]?.text==="@")return tokens.slice(2);if(!["ctrl","pow"].includes(tokens[0]?.text)||tokens[1]?.text!=="(")return tokens;let depth3=1,index=2;for(;index<tokens.length&&depth3;index++){if(tokens[index].text==="(")depth3++;if(tokens[index].text===")")depth3--}return!depth3&&tokens[index]?.text==="@"?tokens.slice(index+1):tokens}function readNMCheckedCircuitSignature(text){const header=/^(?:(?:pub|public|private)\s+)?circuit\s+([A-Za-z_]\w*)\s*(?:<[^(){}]*>)?\s*\((.*)\)\s*\{$/u.exec(text);if(!header)return;const parts=[];let start=0,depth3=0;for(let i=0;i<header[2].length;i++){const char=header[2][i];if("<([".includes(char))depth3++;if(">)]".includes(char)&&--depth3<0)return;if(char===","&&depth3===0){parts.push(header[2].slice(start,i));start=i+1}}if(depth3)return;parts.push(header[2].slice(start));const parameters=[];for(const part of parts){const parameter=/^\s*[A-Za-z_]\w*\s*:\s*(Angle|QReg\s*<.+>)\s*$/u.exec(part);if(!parameter)return;parameters.push(parameter[1]==="Angle"?"angle":"register")}return{name:header[1],signature:{parameters}}}function nmCircuitCallOpen(tokens){let open=1;if(tokens[open]?.text==="<"){let depth3=1;for(open++;open<tokens.length;open++){if(tokens[open].text==="<")depth3++;if(tokens[open].text===">"&&--depth3===0){open++;break}}}return tokens[open]?.text==="("?open:-1}function nmCircuitValueTokens(tokens){const open=nmCircuitCallOpen(tokens);if(open<0)fail3("NM-CFN-002",tokenLocation(tokens[0]));return[tokens[0],...tokens.slice(open)]}function indexNMComputeApplyCircuitArguments(source,modules){const signatures=new Map;const lines=[source,...Object.values(modules??{})].flatMap(text=>parseNMClassicalControlDocument(text).lines);const registry=lines.flatMap(line=>{const specifier=/^use\s+(\S+?)\s*;?$/u.exec(line.text)?.[1];if(!specifier||specifier.startsWith("workspace."))return[];const result2=resolveNMStdLibraryImport(specifier.replace(/^package\./u,""));return result2.status==="resolved"?parseNMClassicalControlDocument(result2.entry.source).lines:[]});for(const line of[...lines,...registry]){const declaration=readNMCheckedCircuitSignature(line.text);if(declaration)signatures.set(declaration.name,declaration.signature)}return signatures}function prepareNMComputeApplyCircuitArguments(source,tokens,signature,functions,types,angles,angleTypes,generated,nominal){const args=argumentsOf(nmCircuitValueTokens(tokens),nominal?.typeEnd),at=tokenLocation(tokens[0]);if(args.length!==signature.parameters.length||args.some((argument,index)=>signature.parameters[index]==="register"&&!/^[A-Za-z_]\w*(?:\[[^\[\]]+\.\.[^\[\]]+\])?$/u.test(argument.map(item=>item.text).join(""))))fail3("NM-CFN-009",at);const compile=text=>{if(nominal)return nominal.compile(text);const expression=parseNMTypedClassicalExpressionSource(text,functions);if(!expression)fail3("NM-CFN-002",at);const type=inferNMTypedClassicalExpressionType(expression,types).type;if(!type||type.kind!=="angle"&&(type.kind!=="scalar"||!["Float","Int"].includes(type.name)))fail3("NM-CFN-005",at);return{expression,type}};return args.filter((_,index)=>signature.parameters[index]==="angle").map(argument=>{let{expression,type}=compile(functionTokenText(argument));if(type.kind==="scalar"&&type.name==="Int"){({expression,type}=compile(`int_to_float(${functionTokenText(argument)})`))}checkFunctionExpressionBudget(expression,at);if(generated.length>=1024)fail3("NM-CFN-003",at);const name2=`__nm_cfn_circuit_arg_${generated.length}`;generated.push(name2);angles.set(name2,expression);angleTypes.set(name2,type);const start=argument[0].range.start.offset,end=argument.at(-1).range.end.offset;return{start,end,text:name2+source.slice(start,end).replace(/[^\r\n]/gu,"")}})}function lowerNMComputeApplyExpandedAngles(lines,angles,types,generated,functions=new Map){let nodes=0;function substitute(value,depth3=0){if(++nodes>32768||depth3>64)fail3("NM-CFN-003");if(!value||typeof value!=="object")return value;if("kind"in value&&value.kind==="ref"&&"name"in value&&typeof value.name==="string"&&angles.has(value.name))return angles.get(value.name);if(Array.isArray(value))return value.map(item=>substitute(item,depth3+1));return Object.fromEntries(Object.entries(value).map(([key4,item])=>[key4,substitute(item,depth3+1)]))}const result2=lines.map(line=>{const calls=[...line.text.matchAll(/\b([A-Za-z_]\w*)\s*\(/gu)];if(![...types.keys()].some(name2=>angles.has(name2)&&line.text.includes(name2))&&!calls.some(([,name2])=>functions.has(name2)||isNMFloatMathBuiltinName(name2)||isNMNumericBuiltinName(name2)||isNMAngleConversion(name2)))return line;const{tokens}=readFunctionSource(line.text.replace(/;\s*$/u,""));const gate=prepareFunctionGateAngles(tokens,"",new Map,types,functions);if(!gate)return line;const names=gate.expressions.map(expression=>{if(generated.length>=1024)fail3("NM-CFN-003");const composed=substitute(expression);checkFunctionExpressionBudget(composed,{line:line.line,column:1});const name2=`__nm_cfn_circuit_angle_${generated.length}`;angles.set(name2,composed);generated.push(name2);return name2});return{...line,text:`${gate.gate}(${[...gate.targets,...names].join(",")});`}});if(new TextEncoder().encode(result2.map(line=>line.text).join("\n")+JSON.stringify([...angles])).length>131072)fail3("NM-CFN-003");return result2}var NM_CLASSICAL_FUNCTION_LOWERING_VERSION="0.2.0-runtime-experimental";var nmClassicalFunctionLoweringLimits={bindings:1024,outputBytes:131072};function functionDiagnostic(issue11){return createDiagnostic({code:issue11.diagnostic.code,severity:"error",message:issue11.diagnostic.message.en,line:issue11.diagnostic.line,column:issue11.diagnostic.column,translationKey:`classicalFunctions.${issue11.diagnostic.code}`})}function classicalFunctionExportDiagnostic(program){return program.classicalFunctions?functionDiagnostic(new FunctionIssue("NM-CFN-011",{line:program.classicalFunctions.declarations[0]?.line??1,column:1})):void 0}function lowerNMClassicalFunctions(source,options){if(options.experimental?.classicalFunctions!==true||!/\bfn\b/u.test(source))return{source,diagnostics:[]};try{const localCircuitProgram=options.experimental?.computeApply===true&&(/\bcircuit\b/u.test(source)||options.experimental?.typedClassicalValues===true&&/\buse\s+workspace\./u.test(source))&&readNMComputeApplySource(source,true).blocks.length>0;const linked=linkNMFunctionWorkspace(source,options,localCircuitProgram);const result2=lower(linked?.source??source,options,linked?.quantumModules);if(linked&&"provenance"in result2&&result2.provenance){result2.provenance.originalSource=source;result2.provenance.parseOptions.workspaceModules=linked.modules;const references=linked.references.filter(reference=>reference.replacementStart!==void 0);result2.provenance.workspace={entryModule:linked.entryModule,symbols:linked.symbols,...references.length?{references}:{}}}return{...result2,...linked?.quantumModules?{quantumModules:linked.quantumModules}:{}}}catch(error){if(error instanceof NMFunctionWorkspaceIssue)return{source:"",diagnostics:[error.diagnostic]};if(!(error instanceof FunctionIssue))throw error;return{source:"",diagnostics:[functionDiagnostic(error)]}}}function lower(source,options,quantumModules){const checkedWorkspaceCircuits=quantumModules!==void 0;const{tokens,regions}=readFunctionSource(source,{discovery:true});const named=regions.filter(region=>region.name!=="main");const helperNames2=new Set(named.map(region=>region.name));const hasNumericCalls=tokens.some((token,index)=>(isNMNumericBuiltinName(token.text)||isNMNumericMatrixBuiltinName(token.text)||(isNMComplexBuiltinName(token.text)||isNMAngleConversion(token.text)))&&!helperNames2.has(token.text)&&tokens[index+1]?.text==="(");const hasMathCalls=hasNumericCalls||tokens.some((token,index)=>isNMFloatMathBuiltinName(token.text)&&tokens[index+1]?.text==="(");const mainRegion=regions.find(region=>region.name==="main");const mainTokens=mainRegion?tokens.slice(mainRegion.body+1,mainRegion.close):[];const hasMainResults=mainTokens.some(token=>token.text==="Result"||token.text==="?");const hasDynamicIndex=mainTokens.some((token,index)=>token.text==="["&&(mainTokens[index-1]?.kind==="identifier"||["]",")","?"].includes(mainTokens[index-1]?.text))&&mainTokens[index-1]?.text!=="in"&&!(mainTokens[index+1]?.kind==="number"&&/^\d+$/u.test(mainTokens[index+1].text)&&mainTokens[index+2]?.text===".."&&mainTokens[index+3]?.kind==="number"&&/^\d+$/u.test(mainTokens[index+3].text)&&mainTokens[index+4]?.text==="]")&&!(mainTokens[index+1]?.kind==="number"&&/^\d+$/u.test(mainTokens[index+1].text)&&mainTokens[index+2]?.text==="]"));const hasMainMutation=mainTokens.some((token,index)=>token.text==="mut"||token.text==="for"||token.kind==="identifier"&&mainTokens[index+1]?.text==="="&&(index===0||[";","{","}"].includes(mainTokens[index-1]?.text)));const computeContainers=options.experimental?.computeApply===true&&[source,...Object.values(quantumModules??{})].some(text=>readNMComputeApplySource(text,true).blocks.length>0);const hasComputeLocals=computeContainers&&mainTokens.some((token,index)=>token.text==="let"&&mainTokens[index+2]?.text===":"&&["Int","Float","Bool","Angle","Array","Matrix","Complex","Result"].includes(mainTokens[index+3]?.text));if(!named.length&&!hasMathCalls&&!hasMainMutation&&!hasDynamicIndex&&!hasMainResults&&!checkedWorkspaceCircuits&&!hasComputeLocals)return{source,diagnostics:[]};assertFunctionSourceBudget(source,tokens.length);if(!options.experimental?.typedClassicalValues)fail3("NM-CFN-010");const quantumImports=tokens.some(token=>token.text==="use")&&(checkedWorkspaceCircuits||canLowerNMComputeApplyQuantumImports(source,options));const circuitArguments=checkedWorkspaceCircuits||quantumImports?indexNMComputeApplyCircuitArguments(source,quantumModules):new Map;if(tokens.some(token=>token.kind==="identifier"&&["use","circuit","algorithm","xor_oracle","phase_oracle","comptime","property","collect","sample"].includes(token.text)&&!(token.text==="use"&&quantumImports||token.text==="circuit"&&checkedWorkspaceCircuits||computeContainers&&["sample","collect","property"].includes(token.text)&&mainRegion&&token.range.start.offset>mainRegion.start&&token.range.end.offset<mainRegion.end)))fail3("NM-CFN-010");if(tokens.some(token=>token.kind==="identifier"&&token.text.startsWith("__nm_cfn_")))fail3("NM-CFN-004");const mains=regions.filter(region=>region.name==="main");if(mains.length!==1)fail3("NM-CFN-009");const main=mains[0];const functionSource=applySourcePatches(blankSource(source),named.map(({start,end})=>({start,end,text:source.slice(start,end)})));const templates=named.length?parseFunctionTemplates(functionSource):[];const hasGenerics=templates.some(template=>template.sizeParameters.length>0);if(hasGenerics)validateGenericFunctionTemplates(templates);const functions=hasGenerics?new Map(templates.filter(template=>!template.sizeParameters.length).map(template=>[template.name,instantiateGenericFunction(template,new Map)])):named.length?validatedFunctions(functionSource,{enabled:true}):new Map;const callableLocations=new Map(templates.map(template=>[template.name,template]));const hasResultHelpers=hasGenerics?parseNMSourceCST(functionSource).tokens.some(token=>!token.trivia&&token.text==="Result"):[...functions.values()].some(functionUsesResults);if(hasResultHelpers&&options.experimental?.functionResults!==true)fail3("NM-CFN-012");const mainReturnsResult=tokens.some(token=>token.range.start.offset>=main.start&&token.range.start.offset<tokens[main.body].range.start.offset&&token.text==="Result");if(!mainReturnsResult&&tokens.slice(main.body+1,main.close).some(token=>token.text==="?"))fail3("NM-CFN-012");const runtimeExpressions=new Map;const runtimeAngles=new Map;const runtimeConditions=new Map;const runtimeTargets=new Map;const deferred=hasMainResults||hasGenerics||hasNumericCalls||hasDynamicIndex||options.debugClassicalFunctions===true||hasResultHelpers||[...functions.values()].some(fn=>fn.returns.startsWith("Array<")||functionUsesImperativeExecution(fn))||tokens.some((token,index)=>(token.text==="]"||token.text===")")&&tokens[index+1]?.text==="[")||tokens.some(token=>["if","for","mut","Bool","true","false","&&","||"].includes(token.text));const runtimeFunctions=new Map(templates.map(template=>[template.name,template.sizeParameters.length?{source:functionSource,generic:true,returns:template.returns}:{source:functionSource,returns:functions.get(template.name).returns}]));const provenance={experimental:true,contractVersion:NM_CLASSICAL_FUNCTION_LOWERING_VERSION,declarations:named.map(region=>{const token=tokens.find(token2=>token2.range.start.offset===region.start);return{name:region.name,line:token.range.start.line+1,...checkedWorkspaceCircuits?{column:token.range.start.column+1}:{},source:source.slice(region.start,region.end)}}),calls:[],generatedBindings:[],originalSource:source,parseOptions:{experimental:{...options.experimental}}};const patches=named.map(({start,end})=>({start,end,text:blankSource(source.slice(start,end))}));let mainTypes=new Map([["PI",{kind:"scalar",name:"Float"}]]);let globalStart=0;for(let i=0;i<tokens.length;i++){const region=regions.find(entry=>entry.start===tokens[i].range.start.offset);const declarationBoundary=["const","param"].includes(tokens[i].text)&&tokens[i+1]?.kind==="identifier"&&i>globalStart&&tokens[i].range.start.line>tokens[i-1].range.end.line;if(region||declarationBoundary){recordMainArithmeticBinding(tokens.slice(globalStart,i),mainTypes);globalStart=i}if(region?.name==="main")break;if(region){i=region.close;globalStart=i+1;continue}if(tokens[i].text===";"){recordMainArithmeticBinding(tokens.slice(globalStart,i),mainTypes);globalStart=i+1}}const circuitAngleTypes=new Map(mainTypes);let work2=0;const charge=()=>{if(++work2>4096)fail3("NM-CFN-003")};function emit(type,expression,lines){if(provenance.generatedBindings.length>=nmClassicalFunctionLoweringLimits.bindings)fail3("NM-CFN-003");const name2=`__nm_cfn_${provenance.generatedBindings.length}`;provenance.generatedBindings.push(name2);const inferred=typeof type==="string"?inferredFunctionType(type):type;mainTypes.set(name2,inferred);const label3=typeof type==="string"?type:type.kind==="matrix"?`Matrix<${type.elementType}, ${type.rows}, ${type.columns}>`:`Array<${type.elementType}, ${type.length}>`;lines.push(`let ${name2}: ${label3} = ${expression};`);return name2}function call(fn,args,lines,line){charge();if(resultPayloadType(fn.returns)||fn.parameters.some(parameter=>resultPayloadType(parameter.type)))fail3("NM-CFN-009",fn);const returnType=fn.returns;if(args.length!==fn.parameters.length)fail3("NM-CFN-005",{line,column:1});const environment=new Map;provenance.calls.push({name:fn.name,line,declarationLine:fn.line});fn.parameters.forEach((parameter,index)=>{const type=baseFunctionType(parameter.type,parameter);environment.set(parameter.name,{text:emit(type,args[index],lines),type})});function expression(node){charge();switch(node.kind){case"resultOk":case"resultError":case"propagate":case"boolean":case"not":case"compare":case"logical":return fail3("NM-CFN-009",node);case"literal":return{text:emit(node.type,node.type==="Float"&&Number.isInteger(node.value)?`${node.value}.0`:String(node.value),lines),type:node.type};case"ref":return environment.get(node.name);case"array":{const items=node.items.map(expression);const type=arrayType(scalarFunctionType(items[0].type,node),items.length,node);return{text:emit(type,`[${items.map(item=>item.text).join(", ")}]`,lines),type}}case"index":{if(typeof node.index!=="number")fail3("NM-CFN-009",node);const target2=expression(node.target);const array3=inferredFunctionType(target2.type);if(array3.kind!=="array")fail3("NM-CFN-005",node);const type=array3.elementType;return{text:emit(type,`${target2.text}[${node.index}]`,lines),type}}case"unary":{const operand2=expression(node.operand);return{text:emit(operand2.type,`(-${operand2.text})`,lines),type:operand2.type}}case"binary":{const left=expression(node.left),right=expression(node.right);const type=numericType(node,[left.type,right.type].map(type2=>scalarFunctionType(type2,node)));return{text:emit(type,`(${left.text} ${node.operator} ${right.text})`,lines),type}}case"call":{const values2=node.args.map(expression);if(node.name==="int_to_float")return{text:emit("Float",`int_to_float(${values2[0].text})`,lines),type:"Float"};if(isNMFloatMathBuiltinName(node.name))return{text:emit("Float",`${node.name}(${values2[0].text})`,lines),type:"Float"};if(node.name==="mean"&&!functions.has("mean"))return{text:emit("Float",`mean(${values2[0].text})`,lines),type:"Float"};const target2=functions.get(node.name);if(!target2)fail3("NM-CFN-009",node);return{text:call(target2,values2.map(value=>value.text),lines,line),type:target2.returns}}}}for(const statement of fn.body){if(statement.kind==="let"){if(resultPayloadType(statement.binding.type))fail3("NM-CFN-009",statement);const type=statement.binding.type;environment.set(statement.binding.name,{text:emit(type,expression(statement.expression).text,lines),type})}else if(statement.kind==="return")return emit(returnType,expression(statement.expression).text,lines);else fail3("NM-CFN-009",statement)}return fail3("NM-CFN-002",fn)}function replaceCalls(input,lines,depth3=0,propagateResult=false){if(depth3>=32)fail3("NM-CFN-003");charge();if(deferred){let nesting=0;for(const token2 of input){if(token2.text==="("||token2.text==="["){if(++nesting>=32)fail3("NM-CFN-003",tokenLocation(token2))}else if(token2.text===")"||token2.text==="]")nesting--}const text=functionTokenText(input);const expression=parseNMTypedClassicalExpressionSource(propagateResult?`(${text})?`:text,runtimeFunctions);if(!expression)fail3("NM-CFN-002",input[0]&&tokenLocation(input[0]));checkFunctionExpressionBudget(expression,tokenLocation(input[0]));const inferred=inferNMTypedClassicalExpressionType(expression,mainTypes).type;if(!inferred||inferred.kind==="result"||inferred.kind==="scalar"&&inferred.name==="Bit")fail3("NM-CFN-005",tokenLocation(input[0]));const placeholder=inferred.kind==="angle"?"radians(0.0)":inferred.kind==="complex"?"complex(0.0, 0.0)":inferred.kind==="matrix"?`${inferred.elementType==="Complex"?"complex_matrix":"matrix"}(${inferred.rows}, ${inferred.columns}, [${Array(inferred.rows*inferred.columns).fill("0.0").join(", ")}]${inferred.elementType==="Complex"?`, [${Array(inferred.rows*inferred.columns).fill("0.0").join(", ")}]`:""})`:inferred.kind==="array"?`[${Array(inferred.length).fill(inferred.elementType==="Float"?"0.0":"0").join(", ")}]`:inferred.name==="Bool"?"false":inferred.name==="Float"?"0.0":"0";const name2=emit(inferred.kind==="angle"?"Angle":inferred.kind==="complex"?"Complex":inferred.kind==="array"||inferred.kind==="matrix"?inferred:inferred.name,placeholder,lines);runtimeExpressions.set(name2,expression);for(const token2 of input){const target2=callableLocations.get(token2.text);if(target2)provenance.calls.push({name:target2.name,line:token2.range.start.line+1,declarationLine:target2.line})}return name2}if(input[0]?.text==="("&&input.at(-1)?.text===")"){let nesting=0;const close=input.findIndex(token2=>{if(token2.text==="(")nesting+=1;if(token2.text===")")nesting-=1;return nesting===0});if(close===input.length-1)return replaceCalls(input.slice(1,-1),lines,depth3+1)}const token=input[0];if(!token)fail3("NM-CFN-009");const operator=mainArithmeticOperator(input);if(operator!==void 0){const left=replaceCalls(input.slice(0,operator),lines,depth3+1);const right=replaceCalls(input.slice(operator+1),lines,depth3+1);const expression=`(${left} ${input[operator].text} ${right})`;return emit(mainArithmeticType(expression,mainTypes,token),expression,lines)}if(token.text==="-"){const operand2=replaceCalls(input.slice(1),lines,depth3+1);const expression=`(-${operand2})`;return emit(mainArithmeticType(expression,mainTypes,token),expression,lines)}if(!input.some(item=>item.kind==="identifier"&&functions.has(item.text))){const text=functionTokenText(input);return emit(mainArithmeticType(text,mainTypes,token),text,lines)}if(token.text==="["){const values2=mainArrayItems(input).map(item=>replaceCalls(item,lines,depth3+1));const types=values2.map(value=>mainArithmeticType(value,mainTypes,token));if(types.some(type=>type!==types[0]))fail3("NM-CFN-005",tokenLocation(token));return emit({kind:"array",elementType:types[0],length:values2.length},`[${values2.join(", ")}]`,lines)}if(token.text==="int_to_float"||isNMFloatMathBuiltinName(token.text)||token.text==="mean"&&!functions.has("mean")){const argument=replaceCalls(singleMainCallArgument(input),lines,depth3+1);const expression=`${token.text}(${argument})`;return emit(mainArithmeticType(expression,mainTypes,token),expression,lines)}const fn=token&&functions.get(token.text);if(!fn||input[1]?.text!=="(")fail3("NM-CFN-009",token&&tokenLocation(token));let level=1,end=2,start=end;const args=[];for(;end<input.length;end+=1){const text=input[end].text;if(text==="("||text==="[")level+=1;if(text===")"||text==="]")level-=1;if(level===0||level===1&&text===","){if(end>start){if(args.length>=fn.parameters.length)fail3("NM-CFN-005",tokenLocation(token));const argument=input.slice(start,end);const value=argument.some(item=>item.kind==="identifier"&&functions.has(item.text))?replaceCalls(argument,lines,depth3+1):functionTokenText(argument);const parameter=fn.parameters[args.length];if(resultPayloadType(parameter.type))fail3("NM-CFN-009",parameter);args.push(emit(baseFunctionType(parameter.type,parameter),value,lines))}else if(text===","||args.length)fail3("NM-CFN-002",tokenLocation(token));start=end+1;if(level===0)break}}if(level!==0||input[end]?.text!==")"||end!==input.length-1)fail3("NM-CFN-009",tokenLocation(token));return call(fn,args,lines,token.range.start.line+1)}const covered=new Set;const acceptedMathCalls=new Set;let mainTypedBindings=new Set;let matchPayload;const matchPayloads=new Map;const cover=(items,start)=>items.forEach((item,index)=>{covered.add(start+index);if((isNMFloatMathBuiltinName(item.text)||isNMNumericBuiltinName(item.text)||(isNMComplexBuiltinName(item.text)||isNMAngleConversion(item.text)))&&items[index+1]?.text==="(")acceptedMathCalls.add(start+index);const target2=callableLocations.get(item.text);if(target2)provenance.calls.push({name:target2.name,line:item.range.start.line+1,declarationLine:target2.line})});const resultMarker=(expression,at)=>{checkFunctionExpressionBudget(expression,tokenLocation(at));if(provenance.generatedBindings.length>=nmClassicalFunctionLoweringLimits.bindings)fail3("NM-CFN-003",tokenLocation(at));const marker=`__nm_cfn_result_${runtimeExpressions.size}`;provenance.generatedBindings.push(marker);runtimeExpressions.set(marker,expression);return marker};visitMainSourceStatements(tokens,main.body+1,main.close,{containers:computeContainers?["repeat","sample","collect","controlled","property","forall"]:[],opaque(start,end,header){if(!["train","e\u011Fit"].includes(header[0]?.text))return;for(let index=start;index<end;index++){covered.add(index);acceptedMathCalls.add(index)}},header(start,end){const header=tokens.slice(start,end);if(header[0]?.text==="match"&&header[1]?.text==="("&&header.at(-1)?.text===")"){const expression2=parseNMTypedClassicalExpressionSource(functionTokenText(header.slice(2,-1)),runtimeFunctions);if(!expression2)return;checkFunctionExpressionBudget(expression2,tokenLocation(header[0]));const inferred2=inferNMTypedClassicalExpressionType(expression2,mainTypes).type;if(inferred2?.kind!=="result")return;if(!options.experimental?.functionResults)fail3("NM-CFN-012",tokenLocation(header[0]));matchPayloads.set(header[0].range.start.offset,inferred2.payload);const marker2=resultMarker(expression2,header[0]);const offset2=header[0].range.start.offset,finish3=tokens[end].range.end.offset;patches.push({start:offset2,end:finish3,text:`match (${marker2}) {`+(source.slice(offset2,finish3).match(/\r\n|\r|\n/g)??[]).join("")});cover(header,start);return}if(header[0]?.text!=="if")return;const containsCall=header.some((token,index)=>header[index+1]?.text==="("&&(runtimeFunctions.has(token.text)||isNMFloatMathBuiltinName(token.text)||isNMNumericBuiltinName(token.text)||(isNMComplexBuiltinName(token.text)||isNMAngleConversion(token.text))));if(!containsCall)return;if(header[1]?.text!=="("||header.at(-1)?.text!==")")fail3("NM-CFN-002",tokenLocation(header[0]));const input=header.slice(2,-1);const expression=parseNMTypedClassicalExpressionSource(functionTokenText(input),runtimeFunctions);if(!expression)fail3("NM-CFN-002",tokenLocation(header[0]));checkFunctionExpressionBudget(expression,tokenLocation(header[0]));const inferred=inferNMTypedClassicalExpressionType(expression,mainTypes).type;if(!inferred||inferred.kind!=="scalar"||inferred.name!=="Bool")fail3("NM-CFN-005",tokenLocation(header[0]));if(provenance.generatedBindings.length>=nmClassicalFunctionLoweringLimits.bindings)fail3("NM-CFN-003",tokenLocation(header[0]));const marker=`__nm_cfn_condition_${runtimeConditions.size}`;provenance.generatedBindings.push(marker);runtimeConditions.set(marker,expression);const offset=header[0].range.start.offset,finish2=tokens[end].range.end.offset;patches.push({start:offset,end:finish2,text:`if (${marker}) {`+(source.slice(offset,finish2).match(/\r\n|\r|\n/g)??[]).join("")});header.forEach((token,index)=>{covered.add(start+index);if((isNMFloatMathBuiltinName(token.text)||isNMNumericBuiltinName(token.text)||(isNMComplexBuiltinName(token.text)||isNMAngleConversion(token.text)))&&header[index+1]?.text==="(")acceptedMathCalls.add(start+index);const target2=callableLocations.get(token.text);if(target2)provenance.calls.push({name:target2.name,line:token.range.start.line+1,declarationLine:target2.line})})},scope(visit,header){const parentTypes=mainTypes,parentBindings=mainTypedBindings,parentMatchPayload=matchPayload;mainTypes=new Map(parentTypes);mainTypedBindings=new Set(parentBindings);if(header[0]?.text==="match")matchPayload=matchPayloads.get(header[0].range.start.offset);if(header[0]?.text==="ok"&&matchPayload&&header[2]?.kind==="identifier"){const binding=header[2];if(mainTypes.has(binding.text)||runtimeFunctions.has(binding.text)||isNMClassicalFunctionReservedName(binding.text))fail3("NM-CFN-004",tokenLocation(binding));mainTypes.set(binding.text,matchPayload);mainTypedBindings.add(binding.text)}if(header[0]?.text==="for"&&header[1]?.kind==="identifier"){if(isNMClassicalFunctionReservedName(header[1].text))fail3("NM-CFN-004",tokenLocation(header[1]));mainTypes.set(header[1].text,{kind:"scalar",name:"Int"});mainTypedBindings.add(header[1].text)}if(computeContainers&&header[0]?.text==="forall"&&header[1]?.kind==="identifier"){if(mainTypes.has(header[1].text)||isNMClassicalFunctionReservedName(header[1].text))fail3("NM-CFN-004",tokenLocation(header[1]));mainTypes.set(header[1].text,{kind:"scalar",name:"Float"});mainTypedBindings.add(header[1].text)}try{visit()}finally{mainTypes=parentTypes;mainTypedBindings=parentBindings;matchPayload=parentMatchPayload}},statement(start,i){const token=tokens[i];const statement=tokens.slice(start,i);const mutable=statement[0]?.text==="let"&&statement[1]?.text==="mut";const bindingName=statement[mutable?2:1];const resultBinding=mainFunctionBinding(statement);const isDirectReturn=statement[0]?.text==="return"&&!["ok","error","err"].includes(statement[1]?.text);if(resultBinding?.valueType.kind==="result"||isDirectReturn){const expression=parseNMTypedClassicalExpressionSource(functionTokenText(statement.slice(resultBinding?resultBinding.expressionStart:1)),runtimeFunctions);const expected=resultBinding?.valueType;if(expression)checkFunctionExpressionBudget(expression,tokenLocation(statement[0]));const inferred=expression&&inferNMTypedClassicalExpressionType(expression,mainTypes,expected).type;if(resultBinding?.valueType.kind==="result"&&(!inferred||!sameNMTypedClassicalType(inferred,resultBinding.valueType)))fail3("NM-CFN-005",tokenLocation(statement[0]));if(inferred?.kind==="result"&&expression){if(!options.experimental?.functionResults||!resultBinding&&!mainReturnsResult)fail3("NM-CFN-012",tokenLocation(statement[0]));if(resultBinding&&(mutable||mainTypes.has(bindingName.text)||runtimeFunctions.has(bindingName.text)||isNMClassicalFunctionReservedName(bindingName.text)))fail3("NM-CFN-004",tokenLocation(bindingName));const marker=resultMarker(expression,statement[0]);const offset=statement[0].range.start.offset,end=token.range.end.offset;const text=resultBinding?`let ${bindingName.text}: ${resultBinding.type} = ${marker};`:`return ${marker};`;patches.push({start:offset,end,text:text+(source.slice(offset,end).match(/\r\n|\r|\n/g)??[]).join("")});cover(statement,start);if(resultBinding){mainTypes.set(bindingName.text,resultBinding.valueType);mainTypedBindings.add(bindingName.text)}return}}const assignment=readNMMainAssignment(statement);if(assignment.candidate){if(!assignment.name||!assignment.value)fail3("NM-CFN-002",tokenLocation(statement[0]));const expression=parseNMTypedClassicalExpressionSource(functionTokenText(assignment.value),runtimeFunctions);if(!expression)fail3("NM-CFN-002",tokenLocation(statement[0]));checkFunctionExpressionBudget(expression,tokenLocation(statement[0]));if(provenance.generatedBindings.length>=nmClassicalFunctionLoweringLimits.bindings)fail3("NM-CFN-003",tokenLocation(statement[0]));const marker=`__nm_cfn_assignment_${runtimeExpressions.size}`;provenance.generatedBindings.push(marker);runtimeExpressions.set(marker,expression);let target2=assignment.name;if(assignment.index){const indexed=parseNMTypedClassicalExpressionSource(`${target2}[${functionTokenText(assignment.index)}]`,runtimeFunctions);if(indexed?.kind!=="index")fail3("NM-CFN-002",tokenLocation(statement[0]));checkFunctionExpressionBudget(indexed,tokenLocation(statement[0]));if(typeof indexed.index==="number")target2+=`[${indexed.index}]`;else{if(provenance.generatedBindings.length>=nmClassicalFunctionLoweringLimits.bindings)fail3("NM-CFN-003",tokenLocation(statement[0]));const indexMarker=`__nm_cfn_assignment_index_${runtimeExpressions.size}`;provenance.generatedBindings.push(indexMarker);runtimeExpressions.set(indexMarker,indexed.index);target2+=`[${indexMarker}]`}}const offset=statement[0].range.start.offset,end=token.range.end.offset;patches.push({start:offset,end,text:`${target2} = ${marker};`+(source.slice(offset,end).match(/\r\n|\r|\n/g)??[]).join("")});statement.forEach((item,index)=>{covered.add(start+index);if((isNMFloatMathBuiltinName(item.text)||isNMNumericBuiltinName(item.text)||(isNMComplexBuiltinName(item.text)||isNMAngleConversion(item.text)))&&statement[index+1]?.text==="(")acceptedMathCalls.add(start+index);const target3=callableLocations.get(item.text);if(target3)provenance.calls.push({name:target3.name,line:item.range.start.line+1,declarationLine:target3.line})});return}const circuitCall=nmCircuitInvocationTokens(statement);const circuitArity=circuitArguments.get(circuitCall[0]?.text);if(circuitArity){patches.push(...prepareNMComputeApplyCircuitArguments(source,circuitCall,circuitArity,runtimeFunctions,mainTypes,runtimeAngles,circuitAngleTypes,provenance.generatedBindings));cover(statement,start);return}const targetGate=prepareFunctionGateTargets(statement,mainTypes,runtimeFunctions);if(targetGate){const targets=targetGate.targets.map(target2=>{if(!target2.expression)return target2.text;if(provenance.generatedBindings.length>=nmClassicalFunctionLoweringLimits.bindings)fail3("NM-CFN-003",tokenLocation(statement[0]));const marker=`__nm_cfn_target_${runtimeTargets.size}`;provenance.generatedBindings.push(marker);runtimeTargets.set(marker,target2.expression);return`${target2.register}[${marker}]`});const angleGate=prepareFunctionGateAngles(statement,functionSource,functions,mainTypes,runtimeFunctions,targets);const names=angleGate?.expressions.map(expression=>{if(provenance.generatedBindings.length>=nmClassicalFunctionLoweringLimits.bindings)fail3("NM-CFN-003",tokenLocation(statement[0]));const marker=`__nm_cfn_angle_${runtimeAngles.size}`;provenance.generatedBindings.push(marker);runtimeAngles.set(marker,expression);return marker})??[];const text=names.map(name2=>`const ${name2}: Float = 0.0;`).join(" ")+` ${targetGate.gate}(${[...targets,...names].join(", ")});`;const offset=statement[0].range.start.offset,end=token.range.end.offset;patches.push({start:offset,end,text:text+(source.slice(offset,end).match(/\r\n|\r|\n/g)??[]).join("")});statement.forEach((item,index)=>{covered.add(start+index);if((isNMFloatMathBuiltinName(item.text)||isNMNumericBuiltinName(item.text)||(isNMComplexBuiltinName(item.text)||isNMAngleConversion(item.text)))&&statement[index+1]?.text==="(")acceptedMathCalls.add(start+index);const target2=callableLocations.get(item.text);if(target2)provenance.calls.push({name:target2.name,line:item.range.start.line+1,declarationLine:target2.line})});return}const angleTokens=functionGateAngleTokens(statement);const needsTypedAngle=angleTokens.some((item,index)=>mainTypedBindings.has(item.text)||(isNMFloatMathBuiltinName(item.text)||isNMNumericBuiltinName(item.text)||(isNMComplexBuiltinName(item.text)||isNMAngleConversion(item.text)))&&angleTokens[index+1]?.text==="(");const mathGate=needsTypedAngle?prepareFunctionGateAngles(statement,functionSource,functions,mainTypes,runtimeFunctions):void 0;if(mathGate||mainFunctionBinding(statement)||statement[0]?.text==="return"){statement.forEach((item,index)=>{if((isNMFloatMathBuiltinName(item.text)||isNMNumericBuiltinName(item.text)||(isNMComplexBuiltinName(item.text)||isNMAngleConversion(item.text)))&&statement[index+1]?.text==="(")acceptedMathCalls.add(start+index)})}if(mathGate||statement.some(item=>item.kind==="identifier"&&runtimeFunctions.has(item.text))){const typedLet=mainFunctionBinding(statement);const okReturn=statement[0]?.text==="return"&&statement[1]?.text==="ok"&&statement[2]?.text==="("&&statement.at(-1)?.text===")";const returnedCall=statement[0]?.text==="return"&&!okReturn?parseNMTypedClassicalExpressionSource(functionTokenText(statement.slice(1)),runtimeFunctions):void 0;const resultReturn=returnedCall?.kind==="genericFunctionCall"?!returnedCall.propagate&&returnedCall.returns.kind==="result":returnedCall?.kind==="functionCall"&&!returnedCall.propagate&&Boolean(resultPayloadType(returnedCall.returns));if(resultReturn&&!mainReturnsResult)fail3("NM-CFN-012",tokenLocation(statement[0]));const gate=mathGate??(!typedLet&&!okReturn&&!resultReturn?prepareFunctionGateAngles(statement,functionSource,functions,mainTypes,runtimeFunctions):void 0);if(!typedLet&&!okReturn&&!resultReturn&&!gate)fail3("NM-CFN-009",tokenLocation(statement[0]));if(typedLet&&runtimeFunctions.has(bindingName.text))fail3("NM-CFN-004",tokenLocation(bindingName));const prelude=[];let text;if(gate){const bindings3=gate.expressions.map(expression=>{if(provenance.generatedBindings.length>=nmClassicalFunctionLoweringLimits.bindings)fail3("NM-CFN-003");const name2=`__nm_cfn_angle_${runtimeAngles.size}`;provenance.generatedBindings.push(name2);runtimeAngles.set(name2,expression);return name2});text=bindings3.map(name2=>`const ${name2}: Float = 0.0;`).join(" ")+` ${gate.gate}(${[...gate.targets,...bindings3].join(", ")});`;for(const token2 of statement){const fn=callableLocations.get(token2.text);if(fn)provenance.calls.push({name:fn.name,line:token2.range.start.line+1,declarationLine:fn.line})}}else{const rewritten=replaceCalls(statement.slice(typedLet?typedLet.expressionStart:resultReturn?1:3,okReturn?-1:void 0),prelude,0,resultReturn);text=prelude.join(" ")+" "+(typedLet?`let ${mutable?"mut ":""}${bindingName.text}: ${typedLet.type} = ${rewritten};`:`return ok(${rewritten});`)}const offset=statement[0].range.start.offset;const end=token.range.end.offset;patches.push({start:offset,end,text:text+(source.slice(offset,end).match(/\r\n|\r|\n/g)??[]).join("")});for(let j=start;j<=i;j+=1)covered.add(j)}if(mainFunctionBinding(statement))mainTypedBindings.add(bindingName.text);recordMainArithmeticBinding(mutable?[statement[0],...statement.slice(2)]:statement,mainTypes)}});if(checkedWorkspaceCircuits)for(let i=0;i<tokens.length;i++){if(tokens[i].text!=="circuit")continue;const circuit=readNMComputeApplyWorkspaceCircuit(tokens,i);for(let j=i;j<=circuit.close;j++){acceptedMathCalls.add(j);if(runtimeFunctions.has(tokens[j].text)&&tokens[j+1]?.text==="(")covered.add(j)}i=circuit.close}tokens.forEach((token,index)=>{if((isNMFloatMathBuiltinName(token.text)||isNMNumericBuiltinName(token.text)||(isNMComplexBuiltinName(token.text)||isNMAngleConversion(token.text)))&&tokens[index+1]?.text==="("&&!acceptedMathCalls.has(index)&&!named.some(({start,end})=>token.range.start.offset>=start&&token.range.end.offset<=end))fail3("NM-CFN-009",tokenLocation(token));if(token.kind!=="identifier"||!runtimeFunctions.has(token.text)||covered.has(index))return;if(named.some(({start,end})=>token.range.start.offset>=start&&token.range.end.offset<=end))return;fail3("NM-CFN-009",tokenLocation(token))});const lowered=applySourcePatches(source,patches);if(new TextEncoder().encode(lowered+JSON.stringify([...runtimeExpressions,...runtimeAngles,...runtimeConditions,...runtimeTargets])).length>nmClassicalFunctionLoweringLimits.outputBytes)fail3("NM-CFN-003");return{source:lowered,provenance,runtimeExpressions,runtimeAngles,runtimeConditions,runtimeTargets,...circuitArguments.size?{circuitAngleTypes,circuitAngleFunctions:runtimeFunctions}:{},diagnostics:[]}}function isNMComputeApplyNominalContainer(header,bitNames){const text=header.map(token=>token.text).join(" ");if(/^(?:(?:compute|apply)|(?:repeat|sample) [0-9]+|collect < [0-9]+ >|controlled [A-Za-z_]\w* \[ [0-9]+ \])$/u.test(text))return true;if(/^(?:test|snapshot|property) "(?:\\.|[^"\\])*"$/u.test(text))return true;if(/^until \( [A-Za-z_]\w* (?:==|!=) [01] \) max [0-9]+$/u.test(text))return true;if(/^forall [A-Za-z_]\w* in .+ \.\. .+ step .+$/u.test(text))return true;if(/^\( [01](?: , [01])* \) =>$/u.test(text))return true;return/^match \( [A-Za-z_]\w*(?: , [A-Za-z_]\w*)* \)$/u.test(text)&&header.slice(2,-1).filter(token=>token.text!==",").every(token=>bitNames.has(token.text))}function lowerNMNominalMain(source,options,helperSource,parameters=[],workspace,composition,mixed){const{tokens,regions}=readFunctionSource(source),main=regions.find(r=>r.name==="main");const mainHeader=source.slice(main.start,tokens[main.body].range.start.offset),mainResultType=readNMEnumMainResultType(mainHeader,helperSource,workspace);const mainReturnName=mainResultType?mainHeader.replace(/\s/g,"").split("->")[1]:void 0;const graph=workspace?createNMNominalWorkspace(workspace.entrySource,workspace.sources,{enabled:true,moduleVisibility:true}):void 0;const enumMode=!!mainResultType||(graph?graph.modules.some(item=>hasNMEnumResultHelpers(item.source)):hasNMEnumResultHelpers(helperSource))||tokens.slice(main.body+1,main.close).some(t=>t.text==="Result");const typedModule=enumMode?prepareNMEnumRuntimeContext(helperSource,workspace):void 0;const ordinary=graph?enumMode?void 0:compileNMNominalWorkspace(helperSource,workspace.sources,{enabled:true,moduleVisibility:true}):compileNMNominalExecutionModule(helperSource,{enabled:true});const names=graph?{has:name2=>graph.typeScope(workspace.owner).hasRoot(name2)}:{has:name2=>ordinary.scope.hasRoot(name2)};const angleHelper=ordinary?.signatures.some(fn=>isNominalAngleType(fn.returns)||fn.parameters.some(isNominalAngleType));const lossSelectors=indexNMCustomLossSelectors(tokens).selectors.filter(selector=>selector.directive>main.body&&selector.close<main.close);const hasMainHelperCall=tokens.slice(main.body+1,main.close).some((token,i,body)=>body[i+1]?.text==="("&&ordinary?.signatures.some(fn=>fn.name===token.text));const computeApply=options.experimental?.computeApply===true&&(readNMComputeApplySource(source,true).blocks.length>0||mixed?.active===true);const circuitArguments=computeApply?indexNMComputeApplyCircuitArguments(mixed?.effectSource??source,mixed?.quantumModules):new Map;const circuitAngleTypes=new Map([["PI",{kind:"scalar",name:"Float"}],...parameters.map(({name:name2})=>[name2,{kind:"scalar",name:"Float"}])]);if(!computeApply&&!workspace&&!enumMode&&!angleHelper&&!lossSelectors.length&&hasMainHelperCall&&!tokens.slice(main.body+1,main.close).some((t,i,a)=>isNMAngleConversion(t.text)||t.text==="let"&&(a[i+1]?.text==="mut"||a[i+2]?.text===":"&&(names.has(a[i+3]?.text)||["Array","Matrix","Complex","Angle"].includes(a[i+3]?.text)))))return;const patches=regions.filter(r=>r!==main).map(r=>({start:r.start,end:r.end,text:blankSource(source.slice(r.start,r.end))}));if(mixed)patches.push(...mixed.entryPatches);for(const selector of lossSelectors){const start=tokens[selector.directive].range.start.offset,hasSemicolon=tokens[selector.close+1]?.text===";";const end=tokens[selector.close+(hasSemicolon?1:0)].range.end.offset;const name2=(selector.qualifier===void 0?"":tokens[selector.qualifier].text+".")+tokens[selector.member].text;patches.push({start,end,text:`loss:custom(${name2});`+source.slice(start,end).replace(/[^\r\n]/g,"")})}if(mainResultType){const end=tokens[main.body].range.start.offset;patches.push({start:main.start,end,text:`fn main() -> Result<${mainResultType.kind!=="scalar"?"Float":mainResultType.name}, Error> `+source.slice(main.start,end).replace(/[^\r\n]/g,"")})}for(let i=0;i<tokens.length;i++){const region=regions.find(r=>r.start===tokens[i].range.start.offset);if(region){i=region.close;continue}const circuit=composition?.circuits.find(item=>item.start===tokens[i].range.start.offset);if(circuit){if(circuit.prefix)patches.push(circuit.prefix);i=circuit.close;continue}if(workspace&&["pub","public","private"].includes(tokens[i].text)){const start2=tokens[i].range.start.offset,end2=tokens[i].range.end.offset;patches.push({start:start2,end:end2,text:blankSource(source.slice(start2,end2))});continue}if(workspace&&tokens[i].text==="use"&&!composition?.registryImports.has(tokens[i].range.start.offset)){const start2=tokens[i].range.start.offset,target2=tokens[i+3].text;while(i<tokens.length&&tokens[i].text!==";")i++;if(i===tokens.length)throw new Error("Unterminated workspace import");const end2=tokens[i].range.end.offset;patches.push({start:start2,end:end2,text:mixed?`use workspace.${target2};`+source.slice(start2,end2).replace(/[^\r\n]/g,""):blankSource(source.slice(start2,end2))});continue}if(!["record","enum"].includes(tokens[i].text))continue;const start=tokens[i].range.start.offset;while(tokens[i]?.text!=="}")i++;const end=tokens[i].range.end.offset;patches.push({start,end,text:blankSource(source.slice(start,end))})}const bindings3=parameters.map(parameter=>({...parameter})),runtimeExpressions=new Map,runtimeAngles=new Map,runtimeConditions=new Map,generatedBindings=[];if(computeApply&&tokens.slice(main.body+1,main.close).some((token,index,list)=>token.text==="PI"&&list[index-1]?.text!=="."&&list[index+1]?.text!==":"))bindings3.unshift({name:"PI",type:"Float"});const compoundTypes=createNMCompoundTypeRegistry();let expressionLine=tokens[main.body].range.start.line+1;const expression=(text,returns,operation="value")=>{const metadata={moduleSource:helperSource,source:text,bindings:bindings3.map(({name:name2,type})=>({name:name2,type})),returns,...workspace?{workspace}:{}};try{if(enumMode){const result3={kind:"enumResultExpression",...metadata,operation,...mainReturnName?{mainResult:{name:mainReturnName,line:expressionLine}}:{}};enumResultExpressionType(result3);return result3}const result2={kind:"nominalExpression",...metadata};nominalExpressionType(result2);return result2}catch(error){if(error instanceof NMNominalExpressionError){if(error.sourceId&&error.sourceId!==workspace?.owner)throw error;throw new NMNominalExpressionError(error.message,expressionLine,1,error.sourceId)}throw error}};const marker=kind=>{if(generatedBindings.length>=nmClassicalFunctionLoweringLimits.bindings)throw new Error("Nominal binding limit exceeded");const name2=`__nm_cfn_${kind}_${generatedBindings.length}`;generatedBindings.push(name2);return name2};const closeOf=(open,left,right,end)=>{let depth3=1;for(let i=open+1;i<end;i++){if(tokens[i].text===left)depth3++;if(tokens[i].text===right)depth3--;if(depth3===0)return i}throw new Error("Unclosed nominal block")};function visit(from,to,level=0){if(level>=32)throw new Error("Nominal control depth exceeded");let start=from,depth3=0;for(let i=start;i<to;i++){if(i===start)expressionLine=tokens[i].range.start.line+1;if(i===start&&["train","e\u011Fit"].includes(tokens[i].text)&&tokens[i+1]?.text==="{"){i=closeOf(i+1,"{","}",to);start=i+1;continue}if(i===start&&computeApply&&["compute","apply","repeat","sample","collect","controlled","test","snapshot","property","forall","until","match","("].includes(tokens[i].text)){let open=i+1;while(open<to&&!["{",";","}"].includes(tokens[open].text))open++;if(tokens[open]?.text==="{"&&isNMComputeApplyNominalContainer(tokens.slice(i,open),new Set(bindings3.filter(binding=>binding.type==="Bit").map(binding=>binding.name)))){const close=closeOf(open,"{","}",to),size=bindings3.length;if(tokens[i].text==="forall"){const name2=tokens[i+1].text;if(bindings3.some(binding=>binding.name===name2)||names.has(name2)||isNMClassicalFunctionReservedName(name2))throw new Error("Invalid or duplicate forall binding");bindings3.push({name:name2,type:"Float"})}try{visit(open+1,close,level+1)}finally{bindings3.length=size}i=close;start=close+1;continue}}if(i===start&&tokens[i].text==="match"&&typedModule){const match=readNMEnumResultMainMatch(tokens,i,to),type=typedModule.resultExpressionType(match.selector,new Map(bindings3.map(b=>[b.name,b.type])),mainReturnName);const resultName=typedModule.scopeName(type),size=bindings3.length;const temporary=marker("match"),valueKey=marker("result"),conditionKey=marker("condition");runtimeExpressions.set(valueKey,expression(match.selector,resultName));bindings3.push({name:temporary,type:resultName});runtimeConditions.set(conditionKey,expression(temporary,resultName,match.arms[0].kind==="ok"?"isOk":"isError"));const armPrefix=arm=>{if(!arm.binding)return"";if(!/^[A-Za-z_][A-Za-z0-9_]{0,63}$/.test(arm.binding)||isNMClassicalFunctionReservedName(arm.binding)||bindings3.some(b=>b.name===arm.binding)||names.has(arm.binding))throw new Error("Invalid or duplicate main match binding");const key4=marker("result"),bindingType=typedModule.scopeName(arm.kind==="ok"?type.payload:type.error);runtimeExpressions.set(key4,expression(temporary,resultName,arm.kind));bindings3.push({name:arm.binding,type:bindingType});return`let ${arm.binding}: ${["Int","Float","Bool"].includes(bindingType)?bindingType:"Float"} = ${key4};`};const patch=(begin2,end2,text)=>patches.push({start:begin2,end:end2,text:text+source.slice(begin2,end2).replace(/[^\r\n]/g,"")});try{const first=match.arms[0],second=match.arms[1];patch(tokens[i].range.start.offset,tokens[first.open].range.end.offset,`if (true) { let ${temporary}: Float = ${valueKey}; if (${conditionKey}) { ${armPrefix(first)}`);visit(first.open+1,first.close,level+1);bindings3.length=size+1;patch(tokens[first.close].range.start.offset,tokens[second.open].range.end.offset,`} else { ${armPrefix(second)}`);visit(second.open+1,second.close,level+1);patch(tokens[second.close].range.start.offset,tokens[match.close].range.end.offset,"} }")}finally{bindings3.length=size}i=match.close;start=i+1;continue}if(i===start&&["if","else","for"].includes(tokens[i].text)){const kind=tokens[i].text;let open=i+1;if(kind==="if"){if(tokens[open].text!=="(")throw new Error("Expected if condition");const close2=closeOf(open,"(",")",to),key4=marker("condition");runtimeConditions.set(key4,expression(tokens.slice(open+1,close2).map(t=>t.text).join(" "),"Bool"));open=close2+1;if(tokens[open]?.text!=="{")throw new Error("Expected if body");const begin2=tokens[i].range.start.offset,end2=tokens[open].range.end.offset;patches.push({start:begin2,end:end2,text:`if (${key4}) {`+source.slice(begin2,end2).replace(/[^\r\n]/g,"")})}else if(kind==="for"){while(open<to&&tokens[open].text!=="{")open++;if(!/^for [A-Za-z_][A-Za-z0-9_]* in [0-9]+ \.\. [0-9]+$/.test(tokens.slice(i,open).map(t=>t.text).join(" ")))throw new Error("Nominal loops require literal bounds")}else if(tokens[open]?.text!=="{")throw new Error("Expected else body");const close=closeOf(open,"{","}",to),size=bindings3.length;if(kind==="for"){const name2=tokens[i+1].text;if(bindings3.some(b=>b.name===name2))throw new Error("Duplicate loop binding");bindings3.push({name:name2,type:"Int"})}try{visit(open+1,close,level+1)}finally{bindings3.length=size}i=close;start=close+1;continue}if(tokens[i].text==="{")depth3++;if(tokens[i].text==="}")depth3--;if(tokens[i].text!==";"||depth3!==0)continue;let stmt=tokens.slice(start,i);start=i+1;const mutable=stmt[0]?.text==="let"&&stmt[1]?.text==="mut";if(mutable){stmt=[stmt[0],...stmt.slice(2)];const annotation=stmt[2]?.text===":"?mainBindingAnnotation(stmt,3):void 0;if(!annotation||!isNMMutableClassicalType(annotation.valueType))throw new Error("Mutable nominal main bindings require numeric scalars or arrays")}const begin=stmt[0].range.start.offset,end=tokens[i].range.end.offset;expressionLine=stmt[0].range.start.line+1;let circuitCall=nmCircuitInvocationTokens(stmt);const circuitName=mixed?.entryPatches.find(patch=>patch.start===circuitCall[0].range.start.offset)?.text??circuitCall[0].text;const circuitArity=circuitArguments.get(circuitName);if(circuitArity){if(circuitCall[1]?.text===".")circuitCall=[{...circuitCall[0],text:circuitName},...circuitCall.slice(3)];circuitCall=nmCircuitValueTokens(circuitCall);const scope=graph?graph.typeScope(workspace.owner):ordinary.scope;const context=typedModule??prepareNMEnumRuntimeContext(helperSource,workspace);patches.push(...prepareNMComputeApplyCircuitArguments(source,circuitCall,circuitArity,new Map,new Map,runtimeAngles,circuitAngleTypes,generatedBindings,{compile(text){const type=context.scopeName(context.compileMainExpression(text,new Map(bindings3.map(b=>[b.name,b.type])),void 0,mainReturnName).type);if(!["Int","Float","Angle"].includes(type))throw new Error("Circuit angle requires a number or Angle");return{expression:expression(text,type),type:type==="Angle"?{kind:"angle"}:{kind:"scalar",name:type}}},typeEnd(index){const reference=readNMNominalReference(circuitCall,index,scope);if(!reference||!scope.hasRoot(reference.name))return;const type=readNMNominalType(circuitCall,index,scope);if(type?.trailingEquals)throw new Error("Unexpected assignment in circuit type");return type?.end}}));continue}let replacement;if(computeApply&&readNMReadoutBinding(stmt.map(token=>token.text).join(" "))?.kind==="measure_all")continue;const measured=stmt[0].text==="let"&&(stmt[2]?.text==="="&&stmt[3]?.text==="measure"||stmt[2]?.text===":"&&stmt[3]?.text==="Bit"&&stmt[4]?.text==="="&&stmt[5]?.text==="measure");const bitBinding=stmt[0].text==="let"&&stmt[2]?.text===":"&&stmt[3]?.text==="Bit"&&stmt[4]?.text==="="&&!stmt.some(t=>t.text==="?");const assignment=readNMMainAssignment(stmt);if(assignment.candidate){if(!assignment.name||!assignment.value)throw new Error("Invalid main assignment target or expression");const binding=bindings3.find(item=>item.name===assignment.name);if(!binding?.mutable)throw new Error("Assignment requires an earlier mutable main binding");let target2=binding.name,type=binding.type;if(assignment.index){const array3=/^Array<(Int|Float),(\d+)>$/.exec(binding.type);if(!array3)throw new Error("Indexed assignment requires a mutable numeric array");const indexKey=marker("assignment_index");runtimeExpressions.set(indexKey,expression(assignment.index.map(t=>t.text).join(" "),"Int"));target2+=`[${indexKey}]`;type=array3[1]}const key4=marker("assignment");runtimeExpressions.set(key4,expression(assignment.value.map(t=>t.text).join(" "),type));replacement=`${target2} = ${key4};`}else if(stmt[0].text==="return"&&mainResultType){const key4=marker("result");runtimeExpressions.set(key4,expression(stmt.slice(1).map(t=>t.text).join(" "),mainReturnName));replacement=`return ${key4};`}else if(mainResultType&&stmt[0].text==="let"&&stmt[2]?.text==="="&&stmt[3]?.text==="expect"){const name2=stmt[1].text;if(bindings3.some(b=>b.name===name2)||names.has(name2)||isNMClassicalFunctionReservedName(name2))throw new Error("Invalid or duplicate main expectation binding");bindings3.push({name:name2,type:"Float"})}else if(measured||bitBinding){const name2=stmt[1].text;if(bindings3.some(b=>b.name===name2))throw new Error("Duplicate main measurement binding");bindings3.push({name:name2,type:"Bit"})}else if(enumMode&&stmt[0].text==="let"&&stmt[2]?.text===":"&&stmt[3]?.text==="Result"){const name2=stmt[1].text;if(bindings3.some(b=>b.name===name2)||names.has(name2)||isNMClassicalFunctionReservedName(name2))throw new Error("Invalid or duplicate main Result binding");const assign=stmt.findIndex((t,index)=>index>3&&(t.text==="="||t.text===">="));if(assign<0)throw new Error("Expected Result initializer");const type=stmt.slice(3,assign).map(t=>t.text).join("")+(stmt[assign].text===">="?">":""),key4=marker("result");runtimeExpressions.set(key4,expression(stmt.slice(assign+1).map(t=>t.text).join(" "),type));bindings3.push({name:name2,type});replacement=`let ${name2}: Float = ${key4};`}else if(stmt[0].text==="let"&&stmt[2]?.text===":"){const assign=stmt.findIndex((token,index)=>index>3&&(token.text==="="||token.text===">="));if(assign<0)throw new Error("Expected typed main initializer");if(["Array","Matrix","Complex","Angle"].includes(stmt[3]?.text)){const checked3=readNMCompoundType(stmt,3,compoundTypes);if(!checked3||checked3.end!==assign+(stmt[assign].text===">="?1:0))throw new Error("Malformed compound main type")}const name2=stmt[1].text,type=stmt.slice(3,assign).map(t=>t.text).join("")+(stmt[assign].text===">="?">":"");if(bindings3.some(b=>b.name===name2)||names.has(name2)||workspace&&isNMClassicalFunctionReservedName(name2))throw new Error("Duplicate or invalid main binding");const value=expression(stmt.slice(assign+1).map(t=>t.text).join(" "),type);const key4=marker("result");runtimeExpressions.set(key4,value);bindings3.push({name:name2,type,...mutable?{mutable:true}:{}});replacement=`let ${mutable?"mut ":""}${name2}: ${mutable||["Int","Float","Bool"].includes(type)?type:"Float"} = ${key4};`}else if(["Rx","Ry","Rz","P","GPhase"].includes(stmt[0].text)){const scope=graph?graph.typeScope(workspace.owner):ordinary.scope;const args=argumentsOf(stmt,index=>{const reference=readNMNominalReference(stmt,index,scope);if(!reference||!scope.hasRoot(reference.name))return;const type2=readNMNominalType(stmt,index,scope);if(type2?.trailingEquals)throw new Error("Unexpected assignment in gate type");return type2?.end}),expected=stmt[0].text==="GPhase"?1:2;if(args.length!==expected)throw new Error("Invalid gate arity");const angle=args.at(-1);const key4=marker("angle");const text=angle.map(t=>t.text).join(" "),context=typedModule??prepareNMEnumRuntimeContext(helperSource,workspace);const type=context.scopeName(context.compileMainExpression(text,new Map(bindings3.map(b=>[b.name,b.type])),void 0,mainReturnName).type);if(!["Int","Float","Angle"].includes(type))throw new Error("Gate expression requires a number or Angle");runtimeAngles.set(key4,expression(text,type));replacement=`const ${key4}: Float = 0.0; ${stmt[0].text}(${args.slice(0,-1).map(a=>a.map(t=>t.text).join("")).concat(key4).join(",")});`}else if(stmt.some(t=>["{","}"].includes(t.text)))throw new Error("Unsupported nominal main block");if(replacement)patches.push({start:begin,end,text:replacement+source.slice(begin,end).replace(/[^\r\n]/g,"")})}if(start!==to)throw new Error("Incomplete nominal statement")}visit(main.body+1,main.close);const lowered=applySourcePatches(source,patches);if(new TextEncoder().encode(lowered+JSON.stringify([...runtimeExpressions,...runtimeAngles,...runtimeConditions])).length>nmClassicalFunctionLoweringLimits.outputBytes)throw new Error("Nominal output limit exceeded");const workspaceModules=graph?Object.fromEntries(graph.modules.filter(item=>item.name!==graph.entryModule).map(item=>[item.name,item.source])):void 0;return{source:lowered,diagnostics:[],runtimeExpressions,runtimeAngles,runtimeConditions,mainResultType,...circuitArguments.size?{circuitAngleTypes}:{},provenance:{experimental:true,contractVersion:NM_CLASSICAL_FUNCTION_LOWERING_VERSION,originalSource:source,parseOptions:{experimental:{...options.experimental},...workspaceModules?{workspaceModules}:{}},...workspace?{nominalWorkspace:workspace}:{},declarations:[{name:ordinary?.signatures[0]?.name??"main",line:1,source:helperSource}],calls:[],generatedBindings}}}function readNMComputeApplyBodyType(tokens,start,scope,constants){const reference=readNMNominalReference(tokens,start,scope);if(!reference||!scope.hasRoot(reference.name))return void 0;const dimensions=[];let end=reference.end;if(constants.size&&tokens[end]?.text==="<"){const stack=[];for(;end<tokens.length;end++){if(end-start>nmNominalGenericLimits.typeNodes)throw new Error("Type reference resource limit exceeded");const token=tokens[end];if(token.text==="<"){if(stack.length>nmNominalGenericLimits.typeDepth)throw new Error("Type reference resource limit exceeded");stack.push({name:tokens[end-1].text,argument:0})}else if(token.text===">"){stack.pop();if(!stack.length){end++;break}}else if(token.text===",")stack.at(-1).argument++;else{const parent=stack.at(-1);if((parent.name==="Array"&&parent.argument===1||parent.name==="Matrix"&&[1,2].includes(parent.argument))&&token.kind==="identifier"&&constants.has(token.text))dimensions.push(token);else if(!["identifier","number"].includes(token.kind)&&token.text!==".")throw new Error("Invalid type argument")}}if(stack.length)throw new Error("Unclosed type argument")}if(!dimensions.length){const concrete=readNMNominalType(tokens,start,scope);if(!concrete||concrete.trailingEquals)throw new Error("Invalid circuit body type");end=concrete.end}return{end,dimensions}}function specializeNMComputeApplyBodyTypes(tokens,dimensions,bindings3,args){if(args.length!==bindings3.length)throw new Error("Invalid circuit body arguments");const replacements=new Map;for(const token of dimensions){const value=args[bindings3.findIndex(binding=>binding.name===token.text)];if(value?.kind!=="number"||value.numberType!=="Int"||!Number.isSafeInteger(value.value)||value.value<1||value.value>4096)throw new Error("Circuit type dimension requires a positive compile-time integer");replacements.set(token,String(value.value))}return functionTokenText(tokens.map(token=>replacements.has(token)?{...token,text:replacements.get(token)}:token))}function bindNMComputeApplyNominalBodies(source,modules,helperSource,graph,parameters=[]){const functions=new Map;const circuits=indexNMComputeApplyCircuitArguments(source,modules);function bind(text,owner){const{tokens}=readFunctionSource(text),patches=[];const moduleSource=owner?graph.sources[owner]:helperSource;const workspace=graph?snapshotNMWorkspace(graph,owner??graph.entryModule):void 0;const context=prepareNMEnumRuntimeContext(moduleSource,workspace);const scope=graph?graph.typeScope(owner??graph.entryModule):compileNMNominalExecutionModule(helperSource,{enabled:true}).scope;for(let start=0;start<tokens.length;start++){if(tokens[start].text!=="circuit")continue;const circuit=readNMComputeApplyWorkspaceCircuit(tokens,start);let open=start+2;while(tokens[open].text!=="{")open++;const formals=new Map;const constants=new Set;for(let i=start+2;i<open;i++)if(tokens[i].text==="Angle"&&tokens[i-1]?.text===":")formals.set(tokens[i-2].text,"Float");for(let i=start+2;i<open;i++)if(tokens[i].text==="const"&&tokens[i+2]?.text===":"&&tokens[i+3]?.text==="Int"){formals.set(tokens[i+1].text,"Int");constants.add(tokens[i+1].text)}const visible=new Map([...[...formals],...!owner?parameters.map(({name:name2,type})=>[name2,type]):[],["PI","Float"]]);const loops=[];for(let i=open+1;i<circuit.close;i++)if(tokens[i].text==="for"&&tokens[i+2]?.text==="in"){let begin=i+3;while(begin<circuit.close&&tokens[begin].text!=="{")begin++;let end=begin+1,depth3=1;for(;end<circuit.close;end++){if(tokens[end].text==="{")depth3++;if(tokens[end].text==="}"&&--depth3===0)break}if(end===circuit.close)fail3("NM-CFN-002",tokenLocation(tokens[i]));loops.push({name:tokens[i+1].text,open:begin,close:end})}for(let i=open+1;i<circuit.close;i++){if(!["(","<"].includes(tokens[i+1]?.text)||!["{","}",";","adjoint","inverse","@"].includes(tokens[i-1].text))continue;const layout=functionGateAngleLayouts[tokens[i].text];const arity=circuits.get(tokens[i].text);if(!layout&&arity===void 0)continue;const callOpen=nmCircuitCallOpen(tokens.slice(i,circuit.close));if(callOpen<0)fail3("NM-CFN-002",tokenLocation(tokens[i]));let end=i+callOpen+1,depth3=1;for(;end<circuit.close;end++){if(tokens[end].text==="(")depth3++;if(tokens[end].text===")"&&--depth3===0)break}if(end===circuit.close)fail3("NM-CFN-002",tokenLocation(tokens[i]));const call=nmCircuitValueTokens(tokens.slice(i,end+1)),at=tokenLocation(tokens[i]);try{const scoped=new Map(visible),typeConstants=new Set(constants);for(const loop of loops)if(i>loop.open&&i<loop.close){scoped.set(loop.name,"Int");typeConstants.add(loop.name)}const dimensions=[];const args=argumentsOf(call,index=>{const type=readNMComputeApplyBodyType(call,index,scope,typeConstants);if(type)dimensions.push(...type.dimensions);return type?.end});if(args.length!==(layout?layout.targets+layout.angles:arity.parameters.length))fail3("NM-CFN-009",at);const angles=args.filter((_,index)=>layout?index>=layout.targets:arity.parameters[index]==="angle");for(const angle of angles){if(functions.size>=1024)fail3("NM-CFN-003",at);const used=new Set(angle.flatMap((token,index)=>token.kind==="identifier"&&scoped.has(token.text)&&angle[index-1]?.text!=="."&&angle[index+1]?.text!==":"?[token.text]:[]));const bindings3=[...used].map(name3=>({name:name3,type:scoped.get(name3)}));const inputTypes=new Map(bindings3.map(binding=>[binding.name,binding.type]));const compile=expression=>{let returns=context.scopeName(context.compileMainExpression(expression,inputTypes).type);if(!layout&&returns==="Int"){expression=`int_to_float(${expression})`;returns="Float"}if(!["Int","Float","Angle"].includes(returns))fail3("NM-CFN-005",at);return{kind:"enumResultExpression",moduleSource,source:expression,bindings:bindings3,returns,operation:"value",...workspace?{workspace}:{}}};const name2=`__nm_cfn_circuit_body_${functions.size}`;const typeDimensions=dimensions.filter(token=>angle.includes(token));functions.set(name2,typeDimensions.length?{circuitBodyTemplate:args2=>({kind:"circuitAngleExpression",body:compile(specializeNMComputeApplyBodyTypes(angle,typeDimensions,bindings3,args2)),inputs:bindings3.map((binding,index)=>({name:binding.name,value:args2[index]}))})}:{circuitBody:compile(functionTokenText(angle))});const first=angle[0].range.start.offset,last=angle.at(-1).range.end.offset;patches.push({start:first,end:last,text:`${name2}(${bindings3.map(binding=>binding.name==="PI"?String(Math.PI):binding.name).join(",")})`+text.slice(first,last).replace(/[^\r\n]/gu,"")})}}catch(error){if(error instanceof FunctionIssue)throw error;fail3("NM-CFN-005",at)}i=end}start=circuit.close}return applySourcePatches(text,patches)}const entry=bind(source);const quantumModules=modules?Object.fromEntries(Object.entries(modules).map(([owner,text])=>[owner,bind(text,owner)])):void 0;return{source:entry,...quantumModules?{quantumModules}:{},circuitAngleFunctions:functions}}function lowerNMSourceFunctions(source,options){let workspaceMode=false;try{workspaceMode=needsNMNominalWorkspace(source,options.workspaceModules)}catch(error){if(error instanceof NMNominalWorkspaceIssue)return{source:"",diagnostics:[{...error.diagnostic,message:error.diagnostic.message.en,severity:"error",translationKey:`nominalTypes.${error.diagnostic.code}`}]};if(error instanceof FunctionIssue)return{source:"",diagnostics:[functionDiagnostic(error)]};throw error}const diagnostics=validateNMNominalFrontend(source,options.experimental?.classicalFunctions===true&&options.experimental?.typedClassicalValues===true);if(!workspaceMode&&!diagnostics.length)return lowerNMClassicalFunctions(source,options);if(!workspaceMode&&diagnostics[0].code!=="NM-NOM-006")return{source:"",diagnostics};try{const mixed=workspaceMode?linkNMComputeApplyNominalWorkspace(source,options):void 0;const composition=mixed?.composition??readNMComputeApplyNominalDeclarations(source,options);const helperModules=mixed?.helperModules??options.workspaceModules;if(workspaceMode)validateNMNominalQuantumNames(composition,createNMNominalWorkspace(mixed?.helperEntry??composition?.helperSource??source,helperModules,{enabled:options.experimental?.classicalFunctions===true&&options.experimental?.typedClassicalValues===true,moduleVisibility:options.experimental?.moduleVisibility}));const{tokens,regions}=readFunctionSource(source),mains=regions.filter(region=>region.name==="main");if(mains.length!==1)throw new Error("Nominal source requires one main");const main=mains[0];if(tokens.some(token=>token.kind==="identifier"&&token.text.startsWith("__nm_cfn_")))throw new Error("Reserved compiler name");const mainHeader=tokens.filter(token=>token.range.start.offset>=main.start&&token.range.start.offset<tokens[main.body].range.start.offset);if(mainHeader.slice(0,4).map(token=>token.text).join(" ")!=="fn main ( )"||mainHeader.length>4&&(mainHeader[4]?.text!=="->"||mainHeader[5]?.text!=="Result"))throw new Error("Nominal source requires an ordinary or supported typed Result main signature");const helperPatches=[{start:main.start,end:main.end,text:blankSource(source.slice(main.start,main.end))},...composition?.helperPatches??[]];const parameterBindings=[];for(let i=0;i<tokens.length;i++){const region=regions.find(r=>r.start===tokens[i].range.start.offset);if(region){i=region.close;continue}if(tokens[i].text==="{"){let depth3=1;while(++i<tokens.length&&depth3){if(tokens[i].text==="{")depth3++;if(tokens[i].text==="}")depth3--}i--;continue}if(tokens[i].text==="param"){const begin=i;if(tokens[i+1]?.kind!=="identifier"||tokens[i+2]?.text!==":"||tokens[i+3]?.text!=="Angle"||tokens[i+4]?.text!=="=")throw new Error("Nominal parameters require Angle declarations");const name2=tokens[i+1].text;if(parameterBindings.some(binding=>binding.name===name2))throw new Error("Duplicate nominal parameter");parameterBindings.push({name:name2,type:"Float"});while(i<tokens.length&&tokens[i].text!==";")i++;if(i===tokens.length)throw new Error("Unterminated nominal parameter");const start3=tokens[begin].range.start.offset,end2=tokens[i].range.end.offset;helperPatches.push({start:start3,end:end2,text:blankSource(source.slice(start3,end2))});continue}if(tokens[i].text!=="@"||!["target","seed","shots","optimize","dataset"].includes(tokens[i+1]?.text))continue;const start2=tokens[i].range.start.offset;while(i<tokens.length&&tokens[i].text!==";")i++;if(i===tokens.length)throw new Error("Unterminated nominal runtime directive");const end=tokens[i].range.end.offset;helperPatches.push({start:start2,end,text:blankSource(source.slice(start2,end))})}const helperSource=applySourcePatches(source,helperPatches);const workspaceGraph=workspaceMode?createNMNominalWorkspace(helperSource,helperModules,{enabled:true,moduleVisibility:options.experimental?.moduleVisibility}):void 0;const nominalMain=lowerNMNominalMain(source,options,helperSource,parameterBindings,workspaceGraph?snapshotNMWorkspace(workspaceGraph,workspaceGraph.entryModule):void 0,composition,mixed);if(nominalMain){if(mixed&&nominalMain.provenance)nominalMain.provenance.parseOptions.workspaceModules=mixed.originalModules;const bodies=nominalMain.circuitAngleTypes?bindNMComputeApplyNominalBodies(nominalMain.source,mixed?.quantumModules,helperSource,workspaceGraph,parameterBindings):void 0;return{...nominalMain,...mixed?{quantumModules:mixed.quantumModules}:{},...bodies}}const compiled=compileNMNominalExecutionModule(helperSource,{enabled:true});const scalar4=type=>type==="Float"||type==="Int"||type==="Bool";const functions=new Map;for(const signature of compiled.signatures)if(scalar4(signature.returns)&&signature.parameters.every(scalar4))functions.set(signature.name,{source:helperSource,returns:signature.returns});const patches=regions.filter(region=>region!==main).map(region=>({start:region.start,end:region.end,text:blankSource(source.slice(region.start,region.end))}));for(let i=0;i<tokens.length;i++){const region=regions.find(region2=>region2.start===tokens[i].range.start.offset);if(region){i=region.close;continue}if(tokens[i].text!=="record"&&tokens[i].text!=="enum")continue;const begin=i;while(i<tokens.length&&tokens[i].text!=="}")i++;if(i===tokens.length)throw new Error("Invalid nominal declaration");const start2=tokens[begin].range.start.offset,end=tokens[i].range.end.offset;patches.push({start:start2,end,text:blankSource(source.slice(start2,end))})}const floatBindings=new Set,generatedBindings=[];const runtimeExpressions=new Map,runtimeAngles=new Map,calls=[];let start=main.body+1;for(let i=start;i<main.close;i++){if(i===start&&tokens[i].text==="train"&&tokens[i+1]?.text==="{"){let depth3=1;i++;while(++i<main.close&&depth3){if(tokens[i].text==="{")depth3++;if(tokens[i].text==="}")depth3--}if(depth3)throw new Error("Unclosed nominal train block");i--;start=i+1;continue}if(tokens[i].text==="{"||tokens[i].text==="}")throw new Error("Nested main blocks are not supported with nominal helpers yet");if(tokens[i].text!==";")continue;const statement=tokens.slice(start,i);start=i+1;const callTokens=statement.filter((token,index)=>compiled.signatures.some(fn=>fn.name===token.text)&&statement[index+1]?.text==="(");if(["Rx","Ry","Rz","P","GPhase"].includes(statement[0]?.text)){const args=argumentsOf(statement),expected=statement[0].text==="GPhase"?1:2;if(args.length!==expected)throw new Error("Invalid gate argument count");const angle=args.at(-1);if(args.slice(0,-1).flat().some(token=>compiled.signatures.some(fn=>fn.name===token.text)))throw new Error("Nominal helper calls cannot select qubit targets");if(callTokens.length||angle.some(token=>floatBindings.has(token.text))){const expression2=parseNMTypedClassicalExpressionSource(angle.map(token=>token.text).join(" "),functions);if(!expression2)throw new Error("Invalid nominal gate angle expression");const marker=`__nm_cfn_angle_${generatedBindings.length}`;generatedBindings.push(marker);runtimeAngles.set(marker,expression2);const begin2=statement[0].range.start.offset,end2=statement.at(-1).range.end.offset;const prefix2=statement.slice(0,statement.indexOf(angle[0])).map(token=>token.text).join("");patches.push({start:begin2,end:tokens[i].range.end.offset,text:`const ${marker}: Float = 0.0; ${prefix2} ${marker});`+source.slice(begin2,end2).replace(/[^\r\n]/g,"")});for(const token of callTokens){const declaration=regions.find(region=>region.name===token.text);calls.push({name:token.text,line:token.range.start.line+1,declarationLine:tokens.find(item=>item.range.start.offset===declaration.start).range.start.line+1})}}continue}if(!callTokens.length)continue;if(statement[0]?.text!=="let"||statement[1]?.kind!=="identifier"||statement[2]?.text!==":"||!scalar4(statement[3]?.text)||statement[4]?.text!=="=")throw new Error("Nominal calls currently require a scalar let initializer");const name2=statement[1].text;if(runtimeExpressions.has(name2))throw new Error("Duplicate nominal main binding");const exprTokens=statement.slice(5);const expression=parseNMTypedClassicalExpressionSource(exprTokens.map(token=>token.text).join(" "),functions);if(!expression)throw new Error("Invalid nominal scalar expression");runtimeExpressions.set(name2,expression);if(statement[3].text==="Float")floatBindings.add(name2);const begin=exprTokens[0].range.start.offset,end=exprTokens.at(-1).range.end.offset;const placeholder=statement[3].text==="Bool"?"false":statement[3].text==="Int"?"0":"0.0";patches.push({start:begin,end,text:placeholder+source.slice(begin,end).replace(/[^\r\n]/g,"")});for(const token of callTokens){const declaration=regions.find(region=>region.name===token.text);calls.push({name:token.text,line:token.range.start.line+1,declarationLine:tokens.find(item=>item.range.start.offset===declaration.start).range.start.line+1})}}if(!runtimeExpressions.size&&!runtimeAngles.size)throw new Error("No supported nominal scalar call in main");const lowered=applySourcePatches(source,patches);const provenance={experimental:true,contractVersion:NM_CLASSICAL_FUNCTION_LOWERING_VERSION,declarations:[{name:compiled.signatures[0].name,line:1,source:helperSource}],calls,generatedBindings,originalSource:source,parseOptions:{experimental:{...options.experimental}}};return{source:lowered,diagnostics:[],provenance,runtimeExpressions,runtimeAngles}}catch(error){if(error instanceof NMCircuitLibraryIssue)return{source:"",diagnostics:[error.diagnostic]};if(error instanceof NMNominalWorkspaceIssue)return{source:"",diagnostics:[{...error.diagnostic,message:error.diagnostic.message.en,severity:"error",translationKey:`nominalTypes.${error.diagnostic.code}`}]};if(error instanceof FunctionIssue)return{source:"",diagnostics:[functionDiagnostic(error)]};return{source:"",diagnostics:[{...diagnostics[0]??{code:"NM-NOM-006",severity:"error",line:1,column:1,translationKey:"nominalTypes.NM-NOM-006"},...error instanceof NMNominalExpressionError?{line:error.line,column:error.column,...error.sourceId?{sourceId:error.sourceId}:{}}:{},message:error instanceof Error?error.message:"Invalid nominal workspace source"}]}}}function attachClassicalFunctionRuntimeExpressions(statements,expressions,angles,conditions,targets){for(const statement of statements){if(statement.kind==="computeApply")attachClassicalFunctionRuntimeExpressions(computeApplyStatements(statement),expressions,angles,conditions,targets);if(statement.kind==="gate"){for(const target2 of statement.targets){if(target2.classicalIndex?.kind==="ref"){const expression=targets?.get(target2.classicalIndex.name);if(expression)target2.classicalIndex=expression}}const names=statement.angleNames??(statement.thetaName?[statement.thetaName]:[]);if(names.some(name2=>angles?.has(name2))){const values2=names.map(name2=>angles?.get(name2));if(values2.every(value=>value!==void 0))statement.classicalAngles=values2}}else if(statement.kind==="classicalDecl"){const expression=statement.expression.kind==="ref"&&statement.expression.name.startsWith("__nm_cfn_result_")&&expressions?.get(statement.expression.name)||expressions?.get(statement.name);if(expression){statement.expression=expression;if(expression.kind==="enumResultExpression")statement.valueType=enumResultExpressionType(expression);if(expression.kind==="nominalExpression")statement.valueType=nominalExpressionType(expression)}}if(statement.kind==="return"&&statement.functionResult&&statement.functionResult.kind!=="error"&&statement.functionResult.expression.kind==="ref"&&statement.functionResult.expression.name.startsWith("__nm_cfn_result_")){const expression=expressions?.get(statement.functionResult.expression.name);if(expression)statement.functionResult.expression=expression}if(statement.kind==="classicalMatchResult"){if(statement.selector.kind==="ref"){const expression=expressions?.get(statement.selector.name);if(expression)statement.selector=expression}attachClassicalFunctionRuntimeExpressions(statement.okBody,expressions,angles,conditions,targets);attachClassicalFunctionRuntimeExpressions(statement.errorBody,expressions,angles,conditions,targets)}if(statement.kind==="classicalAssign"){if(statement.expression.kind==="ref")statement.expression=expressions?.get(statement.expression.name)??statement.expression;if(typeof statement.index==="object"&&statement.index.kind==="ref")statement.index=expressions?.get(statement.index.name)??statement.index}if(statement.kind==="if"){if(statement.condition?.kind==="ref"){const condition=conditions?.get(statement.condition.name);if(condition)statement.condition=condition}attachClassicalFunctionRuntimeExpressions(statement.body,expressions,angles,conditions,targets);attachClassicalFunctionRuntimeExpressions(statement.elseBody??[],expressions,angles,conditions,targets)}else if(["until","observe","test","snapshot","classicalFor"].includes(statement.kind)&&"body"in statement){attachClassicalFunctionRuntimeExpressions(statement.body,expressions,angles,conditions,targets)}else if(statement.kind==="match"||statement.kind==="property"){statement.cases.forEach(item=>attachClassicalFunctionRuntimeExpressions(item.body,expressions,angles,conditions,targets))}}}var projectedCarrier=Symbol("nm-classical-function-projected-carrier");function classicalFunctionCarrierOptions(options){return{...options,[projectedCarrier]:true}}function isClassicalFunctionCarrier(options){return options[projectedCarrier]===true}function coefficientProvenance(source,sign){const expression=source.trim().replace(/\*\s*$/,"").trim().replace(/([A-Za-z_]\w*)\s*\[\s*(\d+)\s*\]/g,"$1_$2");if(!/[A-Za-z_]/.test(expression))return{};return{coefficientExpression:sign<0?`-(${expression})`:expression}}function qubitRefKey(ref2){return ref2.index==null?ref2.register:`${ref2.register}[${ref2.index}]`}function qubitIdentity(ref2){return ref2.resolvedIndex==null?qubitRefKey(ref2):`#${ref2.resolvedIndex}`}function flattenStatements(statements){const flat=[];for(const statement of statements){flat.push(statement);if(statement.kind==="computeApply"){flat.push(...computeApplyProjection(statement))}else if(statement.kind==="if"){flat.push(...flattenStatements(statement.body));if(statement.elseBody){flat.push(...flattenStatements(statement.elseBody))}}else if(statement.kind==="classicalMatchResult"){flat.push(...flattenStatements(statement.okBody),...flattenStatements(statement.errorBody))}else if(["until","classicalFor","observe","test","snapshot"].includes(statement.kind)&&"body"in statement){flat.push(...flattenStatements(statement.body))}else if(statement.kind==="match"){for(const matchCase of statement.cases){flat.push(...flattenStatements(matchCase.body))}}else if(statement.kind==="property"){for(const propertyCase of statement.cases){flat.push(...flattenStatements(propertyCase.body))}}}return flat}function addPauliTargets(targets,factors){for(const factor of factors){targets.add(qubitRefKey(factor.target))}}function addMetricTargets(targets,expression){if(expression.kind!=="expectation"){return}for(const term of expression.terms){addPauliTargets(targets,term.factors)}}function getStatementTargets(statement,qregSizes){const targets=new Set;if(statement.kind==="gate"){for(const target2 of statement.targets){if(target2.classicalIndex){for(let index=0;index<(qregSizes[target2.register]??0);index+=1)targets.add(`${target2.register}[${index}]`)}else targets.add(qubitRefKey(target2))}}else if(statement.kind==="measurement"||statement.kind==="reset"){targets.add(qubitRefKey(statement.target))}else if(statement.kind==="measurement-binding"){if(!isBoundedNMMeasurementSlice(statement.operand.start,statement.operand.endInclusive))return[];for(let index=statement.operand.start;index<=statement.operand.endInclusive;index+=1){targets.add(`${statement.operand.register}[${index}]`)}}else if(statement.kind==="assertBranchInvariant"){if(statement.target.index!=null){targets.add(`${statement.target.register}[${statement.target.index}]`)}else{const size=qregSizes[statement.target.register]??0;for(let index=0;index<size;index+=1){targets.add(`${statement.target.register}[${index}]`)}}}else if(statement.kind==="syndrome"){addPauliTargets(targets,statement.factors)}else if(statement.kind==="expectation"||statement.kind==="assertExpectation"||statement.kind==="assertExpectationRange"){for(const term of statement.terms){addPauliTargets(targets,term.factors)}}else if(statement.kind==="metric"){addMetricTargets(targets,statement.expression)}else if(statement.kind==="assertEntangled"){for(const target2 of statement.targets){targets.add(qubitRefKey(target2))}}else if(statement.kind==="encode"){const size=qregSizes[statement.register]??0;for(let index=0;index<size;index+=1){targets.add(`${statement.register}[${index}]`)}}return[...targets]}function findDuplicateGateTarget(gate){if(gate.targets.length<2){return void 0}const seen=new Map;for(const target2 of gate.targets){if(target2.classicalIndex)continue;const identity=qubitIdentity(target2);const key4=qubitRefKey(target2);if(seen.has(identity)){return key4}seen.set(identity,key4)}return void 0}function createGateAliasDiagnostic(gate,qubit3){return createDiagnostic({code:"NM-SEM-001",severity:"error",message:`Gate ${gate.gate} uses ${qubit3} more than once.`,hint:"Multi-qubit gates need distinct physical qubits for each operand.",translationKey:"semanticGateQubitAlias",translationValues:{gate:gate.gate,qubit:qubit3},line:gate.line})}function createGateAfterMeasurementDiagnostic(gate,qubit3,strict){return createDiagnostic({code:"NM-SEM-002",severity:strict?"error":"warning",message:`Gate ${gate.gate} touches ${qubit3} after it was measured.`,hint:"A measured qubit has collapsed to a classical outcome; use reset before more quantum gates if you want a fresh |0> state.",translationKey:"semanticGateAfterMeasurement",translationValues:{gate:gate.gate,qubit:qubit3},line:gate.line})}function createUnusedQubitDiagnostic(qubit3,line,strict){return createDiagnostic({code:"NM-SEM-003",severity:strict?"error":"warning",message:`Allocated qubit ${qubit3} is never used.`,hint:"Remove the unused qubit or include it in a gate, measurement, expectation, reset, or encode step.",translationKey:"semanticUnusedQubit",translationValues:{qubit:qubit3},line})}function checkSemantics(program){const diagnostics=[];const strict=program.semantics?.mode==="strict";const statements=flattenStatements(program.statements);const qregSizes={};const qregLines={};const usedTargets=new Set;const measuredTargets=new Set;for(const statement of statements){if(statement.kind==="qreg"){qregSizes[statement.name]=statement.size;qregLines[statement.name]=statement.line;continue}const statementTargets=getStatementTargets(statement,qregSizes);for(const target2 of statementTargets){usedTargets.add(target2)}if(statement.kind==="measurement"){measuredTargets.add(qubitRefKey(statement.target));continue}if(statement.kind==="measurement-binding"){for(const target2 of statementTargets)measuredTargets.add(target2);continue}if(statement.kind==="reset"){measuredTargets.delete(qubitRefKey(statement.target));continue}if(statement.kind!=="gate"){continue}const duplicateTarget=findDuplicateGateTarget(statement);if(duplicateTarget){diagnostics.push(createGateAliasDiagnostic(statement,duplicateTarget))}for(const target2 of statement.targets){const key4=qubitRefKey(target2);if(measuredTargets.has(key4)){diagnostics.push(createGateAfterMeasurementDiagnostic(statement,key4,strict))}}}for(const[register,size]of Object.entries(qregSizes)){for(let index=0;index<size;index+=1){const qubit3=`${register}[${index}]`;if(!usedTargets.has(qubit3)){diagnostics.push(createUnusedQubitDiagnostic(qubit3,qregLines[register]??1,strict))}}}return diagnostics}function findNMMainImperativeStatement(statements){for(const statement of statements){if(statement.kind==="classicalAssign"||statement.kind==="classicalFor"||statement.kind==="classicalDecl"&&statement.mutable)return statement;const nested=findNMMainImperativeStatement(statement.body??[])??findNMMainImperativeStatement(statement.elseBody??[]);if(nested)return nested;for(const entry of statement.cases??[]){const found=findNMMainImperativeStatement(entry.body);if(found)return found}}return void 0}var NM_MAIN_IMPERATIVE_TRANSFORM_UNSUPPORTED="NM-CFN-011: This transformation cannot preserve main mutable locals, assignment, or bounded runtime loops. Keep the N/M source or JSON IR carrier.";function resolvedIndices(refs){return refs.map(ref2=>ref2.resolvedIndex).filter(index=>index!=null)}function gateWidth(gate){if(gate.targets.length>=3){return 3}if(gate.targets.length===2){return 2}return 1}function isNearInteger(value){return Math.abs(value-Math.round(value))<1e-9}function rotationTCost(gate){const theta=gate.theta;if(theta==null){return{tCount:8,tDepth:2,clifford:false}}const quarterTurns=theta/(Math.PI/2);if(isNearInteger(quarterTurns)){return{tCount:0,tDepth:0,clifford:true}}const eighthTurns=theta/(Math.PI/4);if(isNearInteger(eighthTurns)){return{tCount:1,tDepth:1,clifford:false}}return{tCount:8,tDepth:2,clifford:false}}function classifyGateForFTQC(gate){switch(gate.gate){case"T":case"Tdg":return{tCount:1,tDepth:1,clifford:false};case"CCNOT":case"CSWAP":return{tCount:7,tDepth:3,clifford:false};case"Rx":case"Ry":case"Rz":case"P":case"RXX":case"RYY":case"RZZ":case"CRy":case"CRz":case"CP":return rotationTCost(gate);case"U":return{tCount:24,tDepth:6,clifford:false};default:return{tCount:0,tDepth:0,clifford:true}}}function estimateNMResources(program,qubits){const distance=program.estimate?.distance??7;const surfaceCodeOverhead=2*distance*distance;const estimate={qubits,statements:0,gates:0,singleQubitGates:0,twoQubitGates:0,threeQubitGates:0,measurements:0,resets:0,barriers:0,assertions:0,expectations:0,metrics:0,gradients:0,encodings:0,observations:0,tests:0,properties:0,snapshots:0,shows:0,expectationTerms:0,conditionals:0,depth:0,ftqcEnabled:Boolean(program.estimate),logicalGates:0,logicalQubits:qubits,cliffordCount:0,tCount:0,tDepth:0,codeDistance:distance,surfaceCodeOverhead,physicalQubits:qubits>0?surfaceCodeOverhead*qubits:0,magicStates:0,estimatedRuntimeMs:0,...program.estimate?.targetError!=null?{targetError:program.estimate.targetError}:{}};const layerByQubit=new Array(Math.max(0,qubits)).fill(0);const bounded=Boolean(findNMMainImperativeStatement(program.statements));let visits=0;const consume=()=>{if(!bounded||++visits<=nmClassicalFunctionLimits.evaluationSteps)return true;estimate.incomplete={reason:"main-loop-budget",maximumVisits:nmClassicalFunctionLimits.evaluationSteps};return false};const addDepth=indices=>{const touched=[...new Set(indices)].filter(index=>index>=0&&index<layerByQubit.length);if(touched.length===0){return}const layer=Math.max(...touched.map(index=>layerByQubit[index]))+1;touched.forEach(index=>{layerByQubit[index]=layer});estimate.depth=Math.max(estimate.depth,layer)};const visit=statements=>{for(const statement of statements){if(!consume())return;switch(statement.kind){case"computeApply":visit(computeApplyProjection(statement));continue;case"qreg":case"const":case"param":case"explain":case"return":continue;case"bitAssign":case"classicalAssign":estimate.statements+=1;continue;case"classicalDecl":if(statement.mutable)estimate.statements+=1;continue;case"classicalFor":estimate.statements+=1;for(let index=statement.start;index<statement.end;index++){if(!consume())return;visit(statement.body);if(estimate.incomplete)return}continue;case"classicalMatchResult":estimate.statements+=1;estimate.conditionals+=1;continue;case"gate":{estimate.statements+=1;estimate.gates+=1;estimate.logicalGates+=1;const width=gateWidth(statement);if(width===1){estimate.singleQubitGates+=1}else if(width===2){estimate.twoQubitGates+=1}else{estimate.threeQubitGates+=1}const ftqcCost=classifyGateForFTQC(statement);estimate.tCount+=ftqcCost.tCount;estimate.tDepth+=ftqcCost.tDepth;if(ftqcCost.clifford){estimate.cliffordCount+=1}addDepth(statement.targets.some(target2=>target2.classicalIndex)?layerByQubit.map((_,index)=>index):resolvedIndices(statement.targets));continue}case"measurement":estimate.statements+=1;estimate.measurements+=1;addDepth(resolvedIndices([statement.target]));continue;case"measurement-binding":estimate.statements+=1;estimate.measurements+=statement.width;addDepth(statement.operand.resolvedIndices??[]);continue;case"assertBranchInvariant":estimate.statements+=1;estimate.assertions+=1;continue;case"syndrome":estimate.statements+=1;estimate.measurements+=1;addDepth(resolvedIndices(statement.factors.map(factor=>factor.target)));continue;case"reset":estimate.statements+=1;estimate.resets+=1;addDepth(resolvedIndices([statement.target]));continue;case"barrier":estimate.statements+=1;estimate.barriers+=1;continue;case"assertProbability":estimate.statements+=1;estimate.assertions+=1;continue;case"assertExpectation":estimate.statements+=1;estimate.assertions+=1;estimate.expectationTerms+=statement.terms.length;addDepth(resolvedIndices(statement.terms.flatMap(term=>term.factors.map(factor=>factor.target))));continue;case"assertExpectationRange":estimate.statements+=1;estimate.assertions+=1;estimate.expectationTerms+=statement.terms.length;addDepth(resolvedIndices(statement.terms.flatMap(term=>term.factors.map(factor=>factor.target))));continue;case"assertEntangled":estimate.statements+=1;estimate.assertions+=1;continue;case"assertFidelity":estimate.statements+=1;estimate.assertions+=1;continue;case"assertEquivalent":estimate.statements+=1;estimate.assertions+=1;continue;case"assertResource":estimate.statements+=1;estimate.assertions+=1;continue;case"expectation":estimate.statements+=1;estimate.expectations+=1;estimate.expectationTerms+=statement.terms.length;addDepth(resolvedIndices(statement.terms.flatMap(term=>term.factors.map(factor=>factor.target))));continue;case"metric":estimate.statements+=1;estimate.metrics+=1;if(statement.expression.kind==="expectation"){estimate.expectationTerms+=statement.expression.terms.length;addDepth(resolvedIndices(statement.expression.terms.flatMap(term=>term.factors.map(factor=>factor.target))))}continue;case"gradient":estimate.statements+=1;estimate.gradients+=1;continue;case"encode":estimate.statements+=1;estimate.encodings+=1;continue;case"observe":estimate.statements+=1;estimate.observations+=1;visit(statement.body);continue;case"test":estimate.statements+=1;estimate.tests+=1;visit(statement.body);continue;case"property":estimate.statements+=1;estimate.properties+=1;statement.cases.forEach(propertyCase=>visit(propertyCase.body));continue;case"snapshot":estimate.statements+=1;estimate.snapshots+=1;visit(statement.body);continue;case"show":estimate.statements+=1;estimate.shows+=1;continue;case"if":estimate.statements+=1;estimate.conditionals+=1;visit(statement.body);if(statement.elseBody){visit(statement.elseBody)}continue;case"until":estimate.statements+=1;estimate.conditionals+=1;visit(statement.body);continue;case"match":estimate.statements+=1;estimate.conditionals+=1;statement.cases.forEach(matchCase=>visit(matchCase.body));continue;default:continue}}};visit(program.statements);if(!estimate.incomplete&&hasNMMainResult(program.statements))estimate.incomplete={reason:"main-result-control"};if(!estimate.incomplete&&hasNMMainDynamicTarget(program.statements))estimate.incomplete={reason:"dynamic-qubit-target"};estimate.magicStates=estimate.tCount;const physicalGateTimeNs=program.estimate?.physicalGateTimeNs??1e3;estimate.estimatedRuntimeMs=Number.parseFloat(((estimate.depth+estimate.tDepth*estimate.codeDistance)*physicalGateTimeNs/1e6).toFixed(6));return estimate}var nmTargetProfiles=[{id:"browser-statevector",label:"Browser state-vector",description:"Local educational simulator profile used by the playground runtime.",nativeGates:["H","X","Y","Z","S","T","Sdg","Tdg","P","U","GPhase","Rx","Ry","Rz","CNOT","CZ","SWAP","iSWAP","CCNOT","CSWAP","CY","CH","RXX","RYY","RZZ","CRy","CRz","CP"],maxQubits:14,recommendedMaxDepth:64,recommendedMaxTwoQubitGates:32,connectivity:"all-to-all"},{id:"browser-mps",label:"Browser Matrix Product State (MPS)",description:"Tensor network simulator profile for 50-100 qubit low-entanglement circuits.",nativeGates:["H","X","Y","Z","S","T","Sdg","Tdg","P","U","GPhase","Rx","Ry","Rz","CNOT","CZ","CY","CH","SWAP","iSWAP","CCNOT","CSWAP","CRy","CRz","CP"],maxQubits:100,recommendedMaxDepth:512,recommendedMaxTwoQubitGates:256,connectivity:"all-to-all"},{id:"browser-stabilizer",label:"Browser stabilizer",description:"Clifford-only tableau simulator profile for large educational circuits in the browser.",nativeGates:nmStabilizerNativeGates,maxQubits:nmStabilizerMaxQubits,recommendedMaxDepth:2048,recommendedMaxTwoQubitGates:1024,connectivity:"all-to-all"},{id:"openqasm3-stdgates",label:"OpenQASM 3 stdgates",description:"Portable OpenQASM 3.0 carrier profile lowered to the standard gate library.",nativeGates:["H","X","Y","Z","S","T","Sdg","Tdg","P","U","GPhase","Rx","Ry","Rz","CNOT","CZ","CY","CH","SWAP","CCNOT","CSWAP","CRy","CRz","CP"],maxQubits:5,recommendedMaxDepth:256,recommendedMaxTwoQubitGates:128,connectivity:"all-to-all"},{id:"ion-trap",label:"Ion trap",description:"All-to-all educational profile with native rotations and entangling gates.",nativeGates:["H","X","Y","Z","S","Sdg","P","U","Rx","Ry","Rz","RXX","RYY","CNOT","CRy","CRz"],maxQubits:5,recommendedMaxDepth:48,recommendedMaxTwoQubitGates:16,connectivity:"all-to-all"},{id:"superconducting",label:"Superconducting",description:"Line-connectivity profile that highlights non-local two-qubit operations.",nativeGates:["H","X","Y","Z","S","T","Sdg","Tdg","P","U","Rx","Ry","Rz","RZZ","CNOT","CZ","CP"],maxQubits:5,recommendedMaxDepth:24,recommendedMaxTwoQubitGates:8,connectivity:"line"},{id:"neutral-atom",label:"Neutral atom",description:"Grid-style educational profile with native Rydberg-style controlled-Z intuition.",nativeGates:["H","X","Y","Z","P","Ry","Rz","CZ","CCNOT","CSWAP"],maxQubits:5,recommendedMaxDepth:32,recommendedMaxTwoQubitGates:12,connectivity:"grid"}];var profileById=new Map(nmTargetProfiles.map(profile=>[profile.id,profile]));function getNMTargetProfile(id){return profileById.get(id)}function visitStatements2(statements,visit){for(const statement of statements){visit(statement);if(statement.kind==="computeApply"){visitStatements2(computeApplyProjection(statement),visit)}else if(statement.kind==="if"){visitStatements2(statement.body,visit);if(statement.elseBody){visitStatements2(statement.elseBody,visit)}}else if(statement.kind==="classicalMatchResult"){visitStatements2(statement.okBody,visit);visitStatements2(statement.errorBody,visit)}else if(statement.kind==="classicalFor"||statement.kind==="until"){visitStatements2(statement.body,visit)}else if(statement.kind==="match"){statement.cases.forEach(matchCase=>visitStatements2(matchCase.body,visit))}}}function gateDistance(gate){const indices=gate.targets.map(target2=>target2.resolvedIndex).filter(index=>index!=null);if(indices.length<2){return void 0}return Math.max(...indices)-Math.min(...indices)}function lineRoutingSketch(gate){if(gate.targets.length!==2){return void 0}const[anchor,mover]=gate.targets.map(target2=>target2.resolvedIndex);if(anchor==null||mover==null||Math.abs(anchor-mover)<=1){return void 0}const swaps=[];const step=mover>anchor?-1:1;const adjacent=anchor+(mover>anchor?1:-1);for(let cursor=mover;cursor!==adjacent;cursor+=step){const next=cursor+step;swaps.push(`SWAP(q[${Math.min(cursor,next)}], q[${Math.max(cursor,next)}]);`)}const routedGate=`${gate.gate}(q[${anchor}], q[${adjacent}]${gate.theta!=null?`, ${Number.parseFloat(gate.theta.toFixed(6)).toString()}`:""});`;return[...swaps,routedGate,...swaps.slice().reverse()].join(" ")}function analyzeTargetProfile(program,qubits,diagnostics){const resources=estimateNMResources(program,qubits);if(resources.incomplete)diagnostics.push(createDiagnostic({code:"NM-RUNTIME-006",severity:program.constraints?.maxDepth!=null||program.constraints?.maxTwoQubit!=null||resources.incomplete.reason!=="main-loop-budget"&&(program.constraints?.connectivity==="line"||program.target&&getNMTargetProfile(program.target)?.connectivity==="line")?"error":"warning",message:resources.incomplete.reason==="main-loop-budget"?`Static main-loop resource estimation exceeded ${resources.incomplete.maximumVisits} visits; reported resource counts are partial.`:resources.incomplete.reason==="main-result-control"?"Main Result control flow is unresolved; reported resource counts are partial.":"Runtime qubit targets are unresolved; resource scheduling and target connectivity cannot be verified statically.",hint:"Inspect the bounded runtime execution separately; these partial counts do not prove a resource budget is satisfied."}));const constraints=program.constraints;if(constraints){if(constraints.maxQubits!=null&&qubits>constraints.maxQubits){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-016",severity:"warning",message:`Program uses ${qubits} qubits, exceeding @constraints maxQubits ${constraints.maxQubits}.`,hint:"Reduce register size or relax the maxQubits constraint for this experiment.",translationKey:"constraintQubitBudget",translationValues:{actual:qubits,max:constraints.maxQubits}}))}if(constraints.maxDepth!=null&&resources.depth>constraints.maxDepth){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-017",severity:"warning",message:`Circuit depth ${resources.depth} exceeds @constraints maxDepth ${constraints.maxDepth}.`,hint:"Use fewer sequential gates, split the circuit, or raise maxDepth if the target budget allows it.",translationKey:"constraintDepthBudget",translationValues:{depth:resources.depth,max:constraints.maxDepth}}))}if(constraints.maxTwoQubit!=null&&resources.twoQubitGates>constraints.maxTwoQubit){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-018",severity:"warning",message:`Two-qubit gate count ${resources.twoQubitGates} exceeds @constraints maxTwoQubit ${constraints.maxTwoQubit}.`,hint:"Reduce entangling operations or decompose the algorithm into a lower two-qubit budget.",translationKey:"constraintTwoQubitBudget",translationValues:{count:resources.twoQubitGates,max:constraints.maxTwoQubit}}))}if(constraints.connectivity==="line"){let emittedConstraintConnectivityWarning=false;visitStatements2(program.statements,statement=>{if(emittedConstraintConnectivityWarning||statement.kind!=="gate"){return}const distance=gateDistance(statement);if(distance!=null&&distance>1){emittedConstraintConnectivityWarning=true;const route=lineRoutingSketch(statement);diagnostics.push(createDiagnostic({code:"NM-RUNTIME-019",severity:"warning",message:`Gate ${statement.gate} violates @constraints line connectivity with distance ${distance}.`,hint:route?`Read-only routing sketch: ${route}`:'Insert SWAP routing, remap logical qubits, or choose connectivity: "all-to-all" for this experiment.',translationKey:"constraintConnectivityWarning",translationValues:{gate:statement.gate,distance,route:route??"manual routing required"},line:statement.line}))}})}}if(!program.target){return}const profile=getNMTargetProfile(program.target);if(!profile){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-009",severity:"warning",message:`Unknown target profile: ${program.target}.`,hint:"Use browser-statevector, browser-stabilizer, ion-trap, superconducting, or neutral-atom for target-aware diagnostics.",translationKey:"unknownTargetProfile",translationValues:{target:program.target}}));return}if(profile.id==="browser-statevector"){return}if(profile.id==="browser-stabilizer"){const eligibility=analyzeNMStabilizerEligibility(program,qubits);if(eligibility.eligible){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-029",severity:"info",message:eligibility.diagnosticMessage,hint:"The program is Clifford-only, so it can use the stabilizer path instead of allocating a full state vector."}))}else{const firstUnsupported=eligibility.unsupportedStatements[0];diagnostics.push(createDiagnostic({code:"NM-RUNTIME-030",severity:qubits>playgroundRuntimeLimits.maxQubits?"error":"warning",message:eligibility.diagnosticMessage,hint:qubits>playgroundRuntimeLimits.maxQubits?`Remove unsupported stabilizer features or reduce the program to ${playgroundRuntimeLimits.maxQubits} qubits for statevector fallback.`:"The playground can fall back to statevector for this small program, but it will not scale like a Clifford-only stabilizer circuit.",line:firstUnsupported?.line}))}}if(qubits>profile.maxQubits){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-014",severity:"warning",message:`Target ${profile.id} recommends at most ${profile.maxQubits} qubits; program uses ${qubits}.`,hint:"Reduce the register size or choose a target profile with a larger educational qubit budget.",translationKey:"targetQubitLimit",translationValues:{target:profile.id,max:profile.maxQubits,actual:qubits}}))}if(resources.depth>profile.recommendedMaxDepth){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-011",severity:"warning",message:`Circuit depth ${resources.depth} exceeds ${profile.id} recommendation ${profile.recommendedMaxDepth}.`,hint:"Shorten the circuit, reduce repeat counts, or split the algorithm into shallower stages.",translationKey:"targetDepthExceeded",translationValues:{target:profile.id,depth:resources.depth,max:profile.recommendedMaxDepth}}))}if(resources.twoQubitGates>profile.recommendedMaxTwoQubitGates){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-012",severity:"warning",message:`Two-qubit gate count ${resources.twoQubitGates} exceeds ${profile.id} recommendation ${profile.recommendedMaxTwoQubitGates}.`,hint:"Two-qubit gates usually dominate hardware error; consider fewer entangling operations.",translationKey:"targetTwoQubitGateBudget",translationValues:{target:profile.id,count:resources.twoQubitGates,max:profile.recommendedMaxTwoQubitGates}}))}const native=new Set(profile.nativeGates);const warnedGates=new Set;let emittedConnectivityWarning=false;visitStatements2(program.statements,statement=>{if(statement.kind!=="gate"){return}if(!native.has(statement.gate)&&!warnedGates.has(statement.gate)){warnedGates.add(statement.gate);diagnostics.push(createDiagnostic({code:"NM-RUNTIME-010",severity:"warning",message:`Gate ${statement.gate} is not native for target ${profile.id}.`,hint:`Run nm transpile <file> --target ${profile.id} to lower supported gates and emit an auditable resource/verification trace.`,translationKey:"nonNativeTargetGate",translationValues:{gate:statement.gate,target:profile.id},line:statement.line}))}if(profile.connectivity==="line"&&!emittedConnectivityWarning){const distance=gateDistance(statement);if(distance!=null&&distance>1){emittedConnectivityWarning=true;const route=lineRoutingSketch(statement);diagnostics.push(createDiagnostic({code:"NM-RUNTIME-013",severity:"warning",message:`Gate ${statement.gate} touches qubits at line distance ${distance} on target ${profile.id}.`,hint:route?`Read-only routing sketch: ${route}`:"Line-connectivity targets prefer adjacent two-qubit gates; insert routing or choose an all-to-all profile.",translationKey:"targetConnectivityWarning",translationValues:{gate:statement.gate,target:profile.id,distance,route:route??"manual routing required"},line:statement.line}))}}})}var NM_PROPERTY_ASSERTIONS_CONTRACT_VERSION="0.2.0-runtime-experimental";var NM_PROPERTY_ASSERTION_MAX_TOLERANCE=1;var NM_PROPERTY_ASSERTION_MAX_ABSOLUTE_BOUND=1e6;var nmPropertyAssertionDiagnosticCodes={featureDisabled:"NM-PARSE-056",invalidAssertion:"NM-PARSE-057",deterministicSamplingRequired:"NM-PARSE-058",invalidRange:"NM-PARSE-059",finiteShotToleranceFailed:"NM-ASSERT-007",observableRangeFailed:"NM-ASSERT-008",phaseEquivalenceFailed:"NM-ASSERT-009"};var encoder=new TextEncoder;function canonicalPropertyValue(value){return Number.parseFloat(value.toFixed(12)).toString()}function deriveNMPropertyCaseSeed(input){const source=[String(input.baseSeed>>>0),input.propertyName,input.parameter,canonicalPropertyValue(input.value)].join("\0");let hash2=2166136261;for(const byte of encoder.encode(source)){hash2^=byte;hash2=Math.imul(hash2,16777619)}return hash2>>>0}var NM_TARGET_CAPABILITY_CONSTRAINTS_CONTRACT_VERSION="0.2.0-runtime-experimental";var nmTargetCapabilityConstraintLimits={maximumAnnotationBytes:2048,maximumProfileIdBytes:64,maximumGateSetSize:32,minimumErrorBudget:1e-9,maximumErrorBudget:1};var nmTargetCapabilityConstraintDiagnosticCodes={featureDisabled:"NM-PARSE-064",invalidDeclaration:"NM-PARSE-065",profileMismatch:"NM-TARGET-040",gateSetMismatch:"NM-TARGET-041",connectivityMismatch:"NM-TARGET-042",errorBudgetMismatch:"NM-TARGET-043"};var nmTargetCapabilityReferenceErrorRates={"browser-statevector":{singleQubit:0,twoQubit:0,threeQubit:0,measurement:0},"browser-mps":{singleQubit:0,twoQubit:0,threeQubit:0,measurement:0},"browser-stabilizer":{singleQubit:0,twoQubit:0,threeQubit:0,measurement:0},"openqasm3-stdgates":void 0,"ion-trap":{singleQubit:5e-4,twoQubit:.005,threeQubit:.02,measurement:.01},superconducting:{singleQubit:.002,twoQubit:.025,threeQubit:.06,measurement:.02},"neutral-atom":{singleQubit:.003,twoQubit:.02,threeQubit:.05,measurement:.015}};var knownGates=new Set(["H","X","Y","Z","S","T","Sdg","Tdg","P","U","GPhase","CNOT","CZ","SWAP","iSWAP","CCNOT","CSWAP","CY","CH","Rx","Ry","Rz","RXX","RYY","RZZ","CRy","CRz","CP"]);function parseNMTargetCapabilityConstraint(body,line,enabled){if(!enabled){return{diagnostics:[createDiagnostic({code:nmTargetCapabilityConstraintDiagnosticCodes.featureDisabled,severity:"error",message:"Target capability constraints require explicit experimental negotiation.",hint:"Set parse options experimental.targetCapabilityConstraints=true while evaluating NM-RFC-0006.",line:line.line})]}}const diagnostics=[];const invalid5=message=>{diagnostics.push(createDiagnostic({code:nmTargetCapabilityConstraintDiagnosticCodes.invalidDeclaration,severity:"error",message,hint:'Use @target_capabilities(profile: "superconducting", gate_set: ["H", "Rz", "CNOT"], connectivity: "line", max_error: 0.1);',line:line.line}))};if(new TextEncoder().encode(body).byteLength>nmTargetCapabilityConstraintLimits.maximumAnnotationBytes){invalid5(`@target_capabilities exceeds ${nmTargetCapabilityConstraintLimits.maximumAnnotationBytes} UTF-8 bytes.`);return{diagnostics}}const fields=splitTopLevelFields(body);if(!fields||fields.length===0){invalid5("@target_capabilities must contain named fields.");return{diagnostics}}const seen=new Set;let profile;let gateSet;let connectivity;let maxError;for(const field of fields){const match=field.match(/^([A-Za-z_][A-Za-z0-9_]*)\s*:\s*(.+)$/u);if(!match){invalid5(`Invalid target capability field: ${field}.`);continue}const key4=match[1];const value=match[2].trim();if(seen.has(key4)){invalid5(`Duplicate target capability field: ${key4}.`);continue}seen.add(key4);if(key4==="profile"){const parsed=parseQuotedString(value);if(!parsed||!/^[a-z0-9][a-z0-9-]{0,63}$/u.test(parsed)){invalid5(`Invalid target profile reference: ${value}.`)}else if(new TextEncoder().encode(parsed).byteLength>nmTargetCapabilityConstraintLimits.maximumProfileIdBytes){invalid5(`Target profile reference exceeds ${nmTargetCapabilityConstraintLimits.maximumProfileIdBytes} UTF-8 bytes.`)}else{profile=parsed}continue}if(key4==="gate_set"){const parsed=parseGateSet(value);if(!parsed){invalid5(`Invalid closed gate_set: ${value}.`)}else if(parsed.length===0||parsed.length>nmTargetCapabilityConstraintLimits.maximumGateSetSize){invalid5(`gate_set must contain 1..${nmTargetCapabilityConstraintLimits.maximumGateSetSize} unique gates.`)}else if(new Set(parsed).size!==parsed.length){invalid5("gate_set must not contain duplicate gates.")}else if(parsed.some(gate=>!knownGates.has(gate))){invalid5("gate_set contains an unknown N/M gate.")}else{gateSet=parsed}continue}if(key4==="connectivity"){const parsed=parseQuotedString(value);if(parsed!=="all-to-all"&&parsed!=="line"&&parsed!=="grid"){invalid5(`Invalid connectivity requirement: ${value}.`)}else{connectivity=parsed}continue}if(key4==="max_error"){if(!/^(?:0(?:\.\d+)?|1(?:\.0+)?)$/u.test(value)){invalid5(`Invalid max_error budget: ${value}.`)}else{const parsed=Number.parseFloat(value);if(!Number.isFinite(parsed)||parsed<nmTargetCapabilityConstraintLimits.minimumErrorBudget||parsed>nmTargetCapabilityConstraintLimits.maximumErrorBudget){invalid5(`max_error must be in [${nmTargetCapabilityConstraintLimits.minimumErrorBudget}, 1].`)}else{maxError=parsed}}continue}invalid5(`Unknown target capability field: ${key4}.`)}if(!profile)invalid5("@target_capabilities requires a profile field.");if(!gateSet&&!connectivity&&maxError==null){invalid5("@target_capabilities requires gate_set, connectivity, or max_error in addition to profile.")}if(diagnostics.length>0||!profile)return{diagnostics};return{requirement:{profile,...gateSet?{gateSet}:{},...connectivity?{connectivity}:{},...maxError!=null?{maxError}:{},line:line.line},diagnostics}}function evaluateNMTargetCapabilityConstraint(program,qubits,requirement){const diagnostics=[];const profile=getNMTargetProfile(requirement.profile);const programGates=collectProgramGates(program.statements);const requiredGates=[...new Set([...requirement.gateSet??[],...programGates])].sort();const declared=requirement.gateSet?new Set(requirement.gateSet):void 0;const undeclaredProgramGates=declared?programGates.filter(gate=>!declared.has(gate)).sort():[];const native=new Set(profile?.nativeGates??[]);const missingGates=requiredGates.filter(gate=>!native.has(gate)).sort();if(!profile||program.target!=null&&program.target!==requirement.profile){diagnostics.push(createDiagnostic({code:nmTargetCapabilityConstraintDiagnosticCodes.profileMismatch,severity:"error",message:!profile?`Unknown target capability profile: ${requirement.profile}.`:`@target(${JSON.stringify(program.target)}) conflicts with required profile ${requirement.profile}.`,hint:"Use one registered profile consistently across @target and @target_capabilities.",line:requirement.line}))}if(missingGates.length>0||undeclaredProgramGates.length>0){diagnostics.push(createDiagnostic({code:nmTargetCapabilityConstraintDiagnosticCodes.gateSetMismatch,severity:"error",message:missingGates.length>0?`Target ${requirement.profile} lacks required native gates: ${missingGates.join(", ")}.`:`Program uses gates outside the declared closed gate_set: ${undeclaredProgramGates.join(", ")}.`,hint:"Choose a compatible profile or make the closed gate_set include every source gate without relying on lowering.",line:requirement.line}))}const connectivityEvidence=requirement.connectivity?{required:requirement.connectivity,actual:profile?.connectivity??"unknown",satisfied:profile?.connectivity===requirement.connectivity}:void 0;if(connectivityEvidence&&!connectivityEvidence.satisfied){diagnostics.push(createDiagnostic({code:nmTargetCapabilityConstraintDiagnosticCodes.connectivityMismatch,severity:"error",message:`Target ${requirement.profile} connectivity ${connectivityEvidence.actual} does not exactly match ${connectivityEvidence.required}.`,hint:"Topology matching is exact in NM-RFC-0006; choose the declared topology without implicit subsumption.",line:requirement.line}))}const errorRates=nmTargetCapabilityReferenceErrorRates[requirement.profile];const estimatedError=errorRates?estimateReferenceCircuitError(program,qubits,errorRates):null;const errorBudgetEvidence=requirement.maxError!=null?{maximum:requirement.maxError,estimated:estimatedError,source:estimatedError!=null?"bounded-reference-profile":"unavailable",satisfied:estimatedError!=null&&estimatedError<=requirement.maxError}:void 0;if(errorBudgetEvidence&&!errorBudgetEvidence.satisfied){diagnostics.push(createDiagnostic({code:nmTargetCapabilityConstraintDiagnosticCodes.errorBudgetMismatch,severity:"error",message:estimatedError==null?errorRates?"Bounded resource counts are unavailable; max_error cannot be verified.":`Target ${requirement.profile} has no bounded reference error model.`:`Estimated reference circuit error ${estimatedError} exceeds max_error ${requirement.maxError}.`,hint:"Reference error evidence is static and conservative; live calibrated guarantees require a separate signed calibration workflow.",line:requirement.line}))}const evidence={contractVersion:NM_TARGET_CAPABILITY_CONSTRAINTS_CONTRACT_VERSION,profile:requirement.profile,...program.target?{target:program.target}:{},requiredGates,missingGates,undeclaredProgramGates,...connectivityEvidence?{connectivity:connectivityEvidence}:{},...errorBudgetEvidence?{errorBudget:errorBudgetEvidence}:{},passed:diagnostics.length===0};return{evidence,diagnostics}}function formatNMTargetCapabilityConstraint(requirement){const fields=[`profile: ${JSON.stringify(requirement.profile)}`];if(requirement.gateSet)fields.push(`gate_set: [${requirement.gateSet.map(gate=>JSON.stringify(gate)).join(", ")}]`);if(requirement.connectivity)fields.push(`connectivity: ${JSON.stringify(requirement.connectivity)}`);if(requirement.maxError!=null)fields.push(`max_error: ${formatNumber(requirement.maxError)}`);return`@target_capabilities(${fields.join(", ")});`}function splitTopLevelFields(body){const fields=[];let start=0;let depth3=0;let quote=false;let escaped=false;for(let index=0;index<body.length;index+=1){const char=body[index];if(quote){if(escaped)escaped=false;else if(char==="\\")escaped=true;else if(char==='"')quote=false;continue}if(char==='"')quote=true;else if(char==="[")depth3+=1;else if(char==="]"){depth3-=1;if(depth3<0)return void 0}else if(char===","&&depth3===0){fields.push(body.slice(start,index).trim());start=index+1}}if(quote||depth3!==0)return void 0;fields.push(body.slice(start).trim());return fields.filter(Boolean)}function parseQuotedString(value){if(!/^"(?:\\.|[^"\\])*"$/u.test(value))return void 0;try{const parsed=JSON.parse(value);return typeof parsed==="string"?parsed:void 0}catch{return void 0}}function parseGateSet(value){if(!/^\[[\s\S]*\]$/u.test(value))return void 0;try{const parsed=JSON.parse(value);return Array.isArray(parsed)&&parsed.every(gate=>typeof gate==="string")?parsed:void 0}catch{return void 0}}function collectProgramGates(statements,target2=[]){for(const statement of statements){if(statement.kind==="gate")target2.push(statement.gate);if(statement.kind==="computeApply"){collectProgramGates(computeApplyProjection(statement),target2)}else if(statement.kind==="if"){collectProgramGates(statement.body,target2);if(statement.elseBody)collectProgramGates(statement.elseBody,target2)}else if(statement.kind==="classicalMatchResult"){collectProgramGates(statement.okBody,target2);collectProgramGates(statement.errorBody,target2)}else if(statement.kind==="classicalFor"||statement.kind==="until"||statement.kind==="observe"||statement.kind==="test"||statement.kind==="snapshot"){collectProgramGates(statement.body,target2)}else if(statement.kind==="match"){statement.cases.forEach(entry=>collectProgramGates(entry.body,target2))}else if(statement.kind==="property"){statement.cases.forEach(entry=>collectProgramGates(entry.body,target2))}}return[...new Set(target2)]}function estimateReferenceCircuitError(program,qubits,rates){const resources=estimateNMResources(program,qubits);if(resources.incomplete)return null;const success=Math.pow(1-rates.singleQubit,resources.singleQubitGates)*Math.pow(1-rates.twoQubit,resources.twoQubitGates)*Math.pow(1-rates.threeQubit,resources.threeQubitGates)*Math.pow(1-rates.measurement,resources.measurements);return Number.parseFloat((1-success).toFixed(12))}function formatNumber(value){return Number.parseFloat(value.toPrecision(12)).toString()}function*scopedNMClassicalBindings(statements,bindings3=new Set){for(const statement of statements){yield{statement,bindings:bindings3};if(statement.kind==="computeApply"){yield*scopedNMClassicalBindings(computeApplyStatements(statement),new Set(bindings3))}else if(statement.kind==="if"){yield*scopedNMClassicalBindings(statement.body,new Set(bindings3));yield*scopedNMClassicalBindings(statement.elseBody??[],new Set(bindings3))}else if(statement.kind==="classicalMatchResult"){yield*scopedNMClassicalBindings(statement.okBody,new Set(bindings3));yield*scopedNMClassicalBindings(statement.errorBody,new Set(bindings3))}else if(["classicalFor","until","observe","test","snapshot"].includes(statement.kind)&&"body"in statement){yield*scopedNMClassicalBindings(statement.body,new Set(bindings3))}else if(statement.kind==="match"||statement.kind==="property"){for(const arm of statement.cases)yield*scopedNMClassicalBindings(arm.body,new Set(bindings3))}}}function flattenStatements2(statements){const flat=[];for(const statement of statements){flat.push(statement);if(statement.kind==="computeApply"){flat.push(...computeApplyStatements(statement))}else if(statement.kind==="if"){flat.push(...flattenStatements2(statement.body));if(statement.elseBody)flat.push(...flattenStatements2(statement.elseBody))}else if(statement.kind==="classicalMatchResult"){flat.push(...flattenStatements2(statement.okBody),...flattenStatements2(statement.errorBody))}else if(statement.kind==="classicalFor"||statement.kind==="until"||statement.kind==="observe"||statement.kind==="test"||statement.kind==="snapshot"){flat.push(...flattenStatements2(statement.body))}else if(statement.kind==="match"){for(const matchCase of statement.cases){flat.push(...flattenStatements2(matchCase.body))}}else if(statement.kind==="property"){for(const propertyCase of statement.cases){flat.push(...flattenStatements2(propertyCase.body))}}}return flat}function validateNMQubitReferences(topLevelStatements,qubitMap,numQubits,diagnostics,skipInvalidQubitReferenceLines=new Set,lexicalClassicalBindings=false){const statements=flattenStatements2(topLevelStatements);let classicalBindings=new Set;const addClassicalBinding=(name2,line)=>{if(classicalBindings.has(name2)){diagnostics.push(createDiagnostic({code:"NM-TYPE-010",severity:"error",message:`Duplicate classical Bit binding: ${name2}.`,hint:"Use a fresh Bit name for each measurement or classical expression.",translationKey:"duplicateClassicalBit",translationValues:{binding:name2},line}))}classicalBindings.add(name2)};const collectClassicalBindings=nestedStatements=>{const bindings3=new Set;for(const statement of flattenStatements2(nestedStatements)){if(statement.kind==="measurement"&&statement.binding){bindings3.add(statement.binding)}else if(statement.kind==="measurement-binding"){bindings3.add(statement.name)}else if(statement.kind==="syndrome"){bindings3.add(statement.binding)}else if(statement.kind==="bitAssign"){bindings3.add(statement.name)}}return bindings3};const bindingStatements=lexicalClassicalBindings?scopedNMClassicalBindings(topLevelStatements):statements.map(statement=>({statement,bindings:classicalBindings}));for(const{statement,bindings:bindings3}of bindingStatements){classicalBindings=bindings3;if(statement.kind==="if"){if(statement.condition||statement.predicate)continue;if(!classicalBindings.has(statement.binding)){diagnostics.push(createDiagnostic({code:"NM-TYPE-009",severity:"error",message:`Unknown classical bit in conditional: ${statement.binding}.`,hint:"Guard on a measured Bit, for example: let m: Bit = measure(q[0]); if (m == 1) { ... }",translationKey:"unknownClassicalBit",translationValues:{binding:statement.binding},line:statement.line}))}continue}if(statement.kind==="until"){const loopBindings=collectClassicalBindings(statement.body);if(!classicalBindings.has(statement.binding)&&!loopBindings.has(statement.binding)){diagnostics.push(createDiagnostic({code:"NM-TYPE-009",severity:"error",message:`Unknown classical bit in until condition: ${statement.binding}.`,hint:"Guard on a measured Bit before the loop or produce it in the until body, for example: until (flag == 1) max 8 { let flag: Bit = measure(q[0]); }",translationKey:"unknownClassicalBit",translationValues:{binding:statement.binding},line:statement.line}))}continue}if(statement.kind==="match"){for(const binding of statement.bindings){if(classicalBindings.has(binding))continue;diagnostics.push(createDiagnostic({code:"NM-TYPE-009",severity:"error",message:`Unknown classical bit in match selector: ${binding}.`,hint:"Match on measured or derived Bits, for example: match (a, b) { (0, 1) => { X(q[2]); } }",translationKey:"unknownClassicalBit",translationValues:{binding},line:statement.line}))}continue}if(statement.kind==="bitAssign"){for(const binding of[...new Set(getNMBitExpressionRefs(statement.expression))]){if(classicalBindings.has(binding))continue;diagnostics.push(createDiagnostic({code:"NM-TYPE-011",severity:"error",message:`Unknown classical Bit in expression: ${binding}.`,hint:"Build Bit expressions from measured or earlier classical bits, for example: let parity: Bit = a xor b;",translationKey:"unknownBitExpressionBinding",translationValues:{binding},line:statement.line}))}addClassicalBinding(statement.name,statement.line);continue}const metricProbabilityState=statement.kind==="metric"&&statement.expression.kind==="probability"?statement.expression.state:void 0;const probabilityState=statement.kind==="assertProbability"?statement.state:metricProbabilityState;if(probabilityState&&numQubits>0&&probabilityState.length!==numQubits){diagnostics.push(createDiagnostic({code:"NM-TYPE-008",severity:"error",message:`Probability state |${probabilityState}> has ${probabilityState.length} bit(s) but the register holds ${numQubits} qubit(s).`,hint:`Use a ${numQubits}-bit basis state, for example: assert probability(|${"0".repeat(numQubits)}>) > 0.45;`,translationKey:"assertionWidthMismatch",translationValues:{state:probabilityState,width:probabilityState.length,qubits:numQubits,exampleState:"0".repeat(numQubits)},line:statement.line}));continue}if(statement.kind==="measurement"){if(statement.binding)addClassicalBinding(statement.binding,statement.line);continue}if(statement.kind==="measurement-binding"){addClassicalBinding(statement.name,statement.line);continue}if(statement.kind==="syndrome"){addClassicalBinding(statement.binding,statement.line)}}for(const statement of statements){if(!hasQubitReferences(statement))continue;if(resolveNMFeedForwardStatementTargets(statement,qubitMap,numQubits,diagnostics)){continue}if(statement.kind==="measurement-binding"||statement.kind==="assertBranchInvariant"){continue}for(const ref2 of getQubitReferences(statement)){if(ref2.classicalIndex){delete ref2.resolvedIndex;if(!Object.prototype.hasOwnProperty.call(qubitMap,`${ref2.register}[0]`)){diagnostics.push(createDiagnostic({code:"NM-TYPE-002",severity:"error",line:statement.line,message:`Unknown register for dynamic qubit target: ${ref2.register}.`}))}continue}const key4=qubitRefKey2(ref2);const resolvedIndex=qubitMap[key4];if(resolvedIndex==null&&numQubits>0){if(skipInvalidQubitReferenceLines.has(statement.line))continue;diagnostics.push(createDiagnostic({code:"NM-TYPE-002",severity:"error",message:`Invalid qubit reference: ${key4}.`,hint:`Declared registers expose indexes 0 through ${numQubits-1} in this playground program.`,translationKey:"invalidQubitReference",translationValues:{qubit:key4,maxIndex:numQubits-1},line:statement.line}))}else{ref2.resolvedIndex=resolvedIndex}}}}function hasQubitReferences(statement){return["gate","measurement","measurement-binding","assertBranchInvariant","syndrome","expectation","metric","assertExpectation","assertEntangled","reset"].includes(statement.kind)}function getQubitReferences(statement){if(statement.kind==="gate")return statement.targets;if(statement.kind==="syndrome")return statement.factors.map(factor=>factor.target);if(statement.kind==="metric"){return statement.expression.kind==="expectation"?statement.expression.terms.flatMap(term=>term.factors.map(factor=>factor.target)):[]}if(statement.kind==="expectation"||statement.kind==="assertExpectation"){return statement.terms.flatMap(term=>term.factors.map(factor=>factor.target))}if(statement.kind==="assertEntangled")return statement.targets;return[statement.target]}function qubitRefKey2(ref2){return ref2.index==null?ref2.register:`${ref2.register}[${ref2.index}]`}var NM_COMPTIME_STRUCTURE_PROVENANCE_CONTRACT_VERSION="0.1.0-experimental";var NM_COMPTIME_STRUCTURE_PROVENANCE_MAX_NODES=4096;var NM_COMPTIME_STRUCTURE_PROVENANCE_MAX_EXPRESSION_DEPTH=32;var gateNames2=new Set(["H","X","Y","Z","S","T","Sdg","Tdg","P","U","GPhase","CNOT","CZ","SWAP","iSWAP","CCNOT","CSWAP","CY","CH","Rx","Ry","Rz","RXX","RYY","RZZ","CRy","CRz","CP"]);function validateNMComptimeStructureProvenance(program){const issues=[];const value=program.comptimeStructures;if(value==null)return issues;if(!validateCarrierSchema(value,issues))return issues;validateCarrierSemantics(program,value,issues);return issues}function validateCarrierSchema(value,issues){if(!exactRecord(value,["experimental","contractVersion","nodes"],[],"$",issues)){return false}if(value.experimental!==true)schemaIssue(issues,"$.experimental","must be true");if(value.contractVersion!==NM_COMPTIME_STRUCTURE_PROVENANCE_CONTRACT_VERSION){schemaIssue(issues,"$.contractVersion","is not the supported contract version")}if(!Array.isArray(value.nodes)){schemaIssue(issues,"$.nodes","must be an array");return false}if(value.nodes.length>NM_COMPTIME_STRUCTURE_PROVENANCE_MAX_NODES){schemaIssue(issues,"$.nodes","exceeds the carrier node budget");return false}value.nodes.forEach((node,index)=>validateNodeSchema(node,`$.nodes[${index}]`,issues));return issues.every(({code})=>code!=="schema")}function validateNodeSchema(value,path,issues){if(!isRecord2(value)||typeof value.kind!=="string"){schemaIssue(issues,path,"must be a structure node with a string kind");return}if(value.kind==="vector-param"){if(!exactRecord(value,["kind","line","name","size","elements","scalarNames","declarationSpan"],[],path,issues))return;validatePositiveLine(value.line,`${path}.line`,issues);validateIdentifier(value.name,`${path}.name`,issues);validateSourceSchema(value.size,`${path}.size`,issues);validateExpressionArray(value.elements,`${path}.elements`,issues);validateIdentifierArray(value.scalarNames,`${path}.scalarNames`,issues);validateSpanSchema(value.declarationSpan,`${path}.declarationSpan`,issues);return}if(value.kind==="repeat"){if(!exactRecord(value,["kind","line","count","effectiveIterations","body","expansionSpan"],[],path,issues))return;validatePositiveLine(value.line,`${path}.line`,issues);validateSourceSchema(value.count,`${path}.count`,issues);validateNonNegativeInteger(value.effectiveIterations,`${path}.effectiveIterations`,issues);validateGateTemplateArray(value.body,`${path}.body`,issues);validateSpanSchema(value.expansionSpan,`${path}.expansionSpan`,issues);return}if(value.kind==="for-range"){if(!exactRecord(value,["kind","line","variable","start","endExclusive","effectiveIterations","body","expansionSpan"],[],path,issues))return;validatePositiveLine(value.line,`${path}.line`,issues);validateIdentifier(value.variable,`${path}.variable`,issues);validateSourceSchema(value.start,`${path}.start`,issues);validateSourceSchema(value.endExclusive,`${path}.endExclusive`,issues);validateNonNegativeInteger(value.effectiveIterations,`${path}.effectiveIterations`,issues);validateGateTemplateArray(value.body,`${path}.body`,issues);validateSpanSchema(value.expansionSpan,`${path}.expansionSpan`,issues);return}schemaIssue(issues,`${path}.kind`,`unknown structure kind ${JSON.stringify(value.kind)}`)}function validateSourceSchema(value,path,issues){if(!exactRecord(value,["sourceExpression","foldedValue","referencedConstants"],[],path,issues))return;if(typeof value.sourceExpression!=="string"||value.sourceExpression.trim()===""){schemaIssue(issues,`${path}.sourceExpression`,"must be a non-empty string")}if(!Number.isSafeInteger(value.foldedValue)){schemaIssue(issues,`${path}.foldedValue`,"must be a safe integer")}validateIdentifierArray(value.referencedConstants,`${path}.referencedConstants`,issues)}function validateSpanSchema(value,path,issues){if(!exactRecord(value,["statementStart","statementCount"],[],path,issues))return;validateNonNegativeInteger(value.statementStart,`${path}.statementStart`,issues);validateNonNegativeInteger(value.statementCount,`${path}.statementCount`,issues)}function validateExpressionArray(value,path,issues){if(!Array.isArray(value)){schemaIssue(issues,path,"must be an array");return}if(value.length>NM_COMPTIME_STRUCTURE_PROVENANCE_MAX_NODES){schemaIssue(issues,path,"exceeds the expression-array budget");return}value.forEach((expression,index)=>validateExpressionSchema(expression,`${path}[${index}]`,issues,0))}function validateExpressionSchema(value,path,issues,depth3){if(depth3>NM_COMPTIME_STRUCTURE_PROVENANCE_MAX_EXPRESSION_DEPTH){schemaIssue(issues,path,"exceeds the expression depth budget");return}if(!isRecord2(value)||typeof value.kind!=="string"){schemaIssue(issues,path,"must be a typed expression node");return}if(value.kind==="literal"){if(!exactRecord(value,["kind","value"],[],path,issues))return;if(typeof value.value!=="number"||!Number.isFinite(value.value)){schemaIssue(issues,`${path}.value`,"must be finite")}return}if(value.kind==="pi"){exactRecord(value,["kind"],[],path,issues);return}if(value.kind==="scalar-reference"){if(!exactRecord(value,["kind","binding","name"],[],path,issues))return;if(value.binding!=="const"&&value.binding!=="param"){schemaIssue(issues,`${path}.binding`,"must be const or param")}validateIdentifier(value.name,`${path}.name`,issues);return}if(value.kind==="vector-element"){if(!exactRecord(value,["kind","name","index"],[],path,issues))return;validateIdentifier(value.name,`${path}.name`,issues);validateNonNegativeInteger(value.index,`${path}.index`,issues);return}if(value.kind==="induction"){if(!exactRecord(value,["kind","name"],[],path,issues))return;validateIdentifier(value.name,`${path}.name`,issues);return}if(value.kind==="unary"){if(!exactRecord(value,["kind","operator","operand"],[],path,issues))return;if(value.operator!=="+"&&value.operator!=="-"){schemaIssue(issues,`${path}.operator`,"must be + or -")}validateExpressionSchema(value.operand,`${path}.operand`,issues,depth3+1);return}if(value.kind==="binary"){if(!exactRecord(value,["kind","operator","left","right"],[],path,issues))return;if(!["+","-","*","/"].includes(String(value.operator))){schemaIssue(issues,`${path}.operator`,"must be +, -, *, or /")}validateExpressionSchema(value.left,`${path}.left`,issues,depth3+1);validateExpressionSchema(value.right,`${path}.right`,issues,depth3+1);return}schemaIssue(issues,`${path}.kind`,`unknown expression kind ${JSON.stringify(value.kind)}`)}function validateGateTemplateArray(value,path,issues){if(!Array.isArray(value)){schemaIssue(issues,path,"must be an array");return}if(value.length>NM_COMPTIME_STRUCTURE_PROVENANCE_MAX_NODES){schemaIssue(issues,path,"exceeds the gate-template budget");return}value.forEach((template,index)=>{const entryPath=`${path}[${index}]`;if(!exactRecord(template,["gate","targets","angles"],[],entryPath,issues))return;if(typeof template.gate!=="string"||!gateNames2.has(template.gate)){schemaIssue(issues,`${entryPath}.gate`,"is not a supported N/M gate")}if(!Array.isArray(template.targets)){schemaIssue(issues,`${entryPath}.targets`,"must be an array")}else{template.targets.forEach((target2,targetIndex)=>validateTargetSchema(target2,`${entryPath}.targets[${targetIndex}]`,issues))}validateExpressionArray(template.angles,`${entryPath}.angles`,issues)})}function validateTargetSchema(value,path,issues){if(!exactRecord(value,["register"],["index"],path,issues))return;validateIdentifier(value.register,`${path}.register`,issues);if(value.index==null)return;if(!isRecord2(value.index)||typeof value.index.kind!=="string"){schemaIssue(issues,`${path}.index`,"must be a typed index template");return}if(value.index.kind==="literal"){if(!exactRecord(value.index,["kind","value"],[],`${path}.index`,issues))return;validateNonNegativeInteger(value.index.value,`${path}.index.value`,issues);return}if(value.index.kind==="induction"){if(!exactRecord(value.index,["kind","offset"],[],`${path}.index`,issues))return;if(!Number.isSafeInteger(value.index.offset)){schemaIssue(issues,`${path}.index.offset`,"must be a safe integer")}return}schemaIssue(issues,`${path}.index.kind`,"must be literal or induction")}function validateCarrierSemantics(program,carrier,issues){const statements=program.statements;const layouts2=createQRegLayouts(statements);const vectors=new Map;const scalarAliases=new Set;const coveredUses=new Set;let previousEnd=0;let previousLine=0;carrier.nodes.forEach((node,nodeIndex)=>{const path=`$.nodes[${nodeIndex}]`;const span3=structureSpan(node);const scalars=createScalarEnvironment(program,span3.statementStart);const end=span3.statementStart+span3.statementCount;if(span3.statementStart>statements.length||end>statements.length||span3.statementStart<previousEnd||node.line<previousLine){issue4(issues,"span",path,"statement span or encounter order is invalid")}if(span3.statementCount===0&&!allowsEmptySpan(node)){issue4(issues,"span",path,"zero statement span is not valid for this node")}previousEnd=Math.max(previousEnd,end);previousLine=Math.max(previousLine,node.line);if(node.kind==="vector-param"){recordCoveredUse(coveredUses,"vector-param-size",node.line,path,issues);validateSourceUse(program,node.size,"vector-param-size",node.line,`${path}.size`,issues);validateVectorNode(program,node,path,{scalars,vectors},scalarAliases,issues);return}if(node.kind==="repeat"){recordCoveredUse(coveredUses,"repeat-count",node.line,path,issues);validateSourceUse(program,node.count,"repeat-count",node.line,`${path}.count`,issues);const expectedIterations2=Math.min(node.count.foldedValue,32);if(node.count.foldedValue<1||node.effectiveIterations!==expectedIterations2){issue4(issues,"expansion",path,"repeat effective iteration policy does not match");return}validateExpansion(program,node.body,node.expansionSpan,Array.from({length:Math.max(0,node.effectiveIterations)},()=>void 0),{scalars,vectors},layouts2,path,issues);return}recordCoveredUse(coveredUses,"for-start",node.line,path,issues);recordCoveredUse(coveredUses,"for-end",node.line,path,issues);validateSourceUse(program,node.start,"for-start",node.line,`${path}.start`,issues);validateSourceUse(program,node.endExclusive,"for-end",node.line,`${path}.endExclusive`,issues);const requested=node.endExclusive.foldedValue-node.start.foldedValue;const expectedIterations=Math.min(Math.max(0,requested),32);if(node.start.foldedValue<0||!Number.isSafeInteger(requested)||requested<0||node.effectiveIterations!==expectedIterations){issue4(issues,"expansion",path,"for-range effective iteration policy does not match");return}validateExpansion(program,node.body,node.expansionSpan,Array.from({length:Math.max(0,node.effectiveIterations)},(_,index)=>({name:node.variable,value:node.start.foldedValue+index})),{scalars,vectors},layouts2,path,issues)});for(const use of program.comptimeConstants?.uses??[]){if(!isProvenancePosition(use.position))continue;if(!coveredUses.has(sourceUseKey(use.position,use.line))){issue4(issues,"source-metadata","$.nodes",`missing carrier node for ${use.position} at line ${use.line}`)}}}function recordCoveredUse(coveredUses,position,line,path,issues){const key4=sourceUseKey(position,line);if(coveredUses.has(key4)){issue4(issues,"source-metadata",path,`duplicate carrier coverage for ${position} at line ${line}`)}coveredUses.add(key4)}function sourceUseKey(position,line){return`${position}:${line}`}function isProvenancePosition(position){return position==="vector-param-size"||position==="repeat-count"||position==="for-start"||position==="for-end"}function validateVectorNode(program,node,path,environment,scalarAliases,issues){const{declarationSpan:span3}=node;if(node.size.foldedValue<1||node.elements.length!==node.size.foldedValue||node.scalarNames.length!==node.size.foldedValue||span3.statementCount!==node.size.foldedValue){issue4(issues,"vector",path,"vector size, elements, aliases and declaration span disagree");return}const values2=[];node.scalarNames.forEach((name2,index)=>{if(scalarAliases.has(name2)){issue4(issues,"vector",`${path}.scalarNames[${index}]`,"scalar alias is not unique")}scalarAliases.add(name2);const statement=program.statements[span3.statementStart+index];const value=evaluateExpression(node.elements[index],environment,`${path}.elements[${index}]`,issues);if(statement?.kind!=="param"||statement.name!==name2||statement.line!==node.line||value==null||!Object.is(statement.value,value)){issue4(issues,"vector",`${path}.declarationSpan`,"lowered vector parameter statements do not match")}if(value!=null)values2.push(value)});if(values2.length===node.elements.length){vectorsSet(environment.vectors,node.name,values2,node.scalarNames,path,issues)}}function validateExpansion(program,body,span3,iterations,baseEnvironment,layouts2,path,issues){const expectedCount=body.length*iterations.length;if(span3.statementCount!==expectedCount){issue4(issues,"expansion",`${path}.expansionSpan`,"span length does not match the typed expansion");return}let offset=0;for(const induction of iterations){const environment={...baseEnvironment,...induction?{induction}:{}};for(let templateIndex=0;templateIndex<body.length;templateIndex+=1){validateExpandedGate(program.statements[span3.statementStart+offset],body[templateIndex],environment,layouts2,`${path}.body[${templateIndex}]`,issues);offset+=1}}}function validateExpandedGate(statement,template,environment,layouts2,path,issues){if(statement?.kind!=="gate"||statement.gate!==template.gate){issue4(issues,"expansion",path,"lowered statement is not the expected gate");return}if(statement.targets.length!==template.targets.length){issue4(issues,"expansion",`${path}.targets`,"target arity does not match")}else{template.targets.forEach((target2,index)=>{const actual=statement.targets[index];const resolvedIndex=evaluateIndex(target2.index,environment.induction,`${path}.targets[${index}]`,issues);const layout=layouts2.get(target2.register);const expectedResolved=resolvedIndex==null||!layout?void 0:layout.base+resolvedIndex;if(actual.register!==target2.register||actual.index!==resolvedIndex||actual.resolvedIndex!==expectedResolved||resolvedIndex!=null&&(!layout||resolvedIndex>=layout.size)){issue4(issues,"expansion",`${path}.targets[${index}]`,"lowered target does not match")}})}const actualAngles=statement.angles??(statement.theta==null?[]:[statement.theta]);const actualAngleNames=statement.angleNames??(statement.thetaName?[statement.thetaName]:actualAngles.map(()=>""));if(actualAngles.length!==template.angles.length){issue4(issues,"expansion",`${path}.angles`,"angle arity does not match");return}template.angles.forEach((expression,index)=>{const value=evaluateExpression(expression,environment,`${path}.angles[${index}]`,issues);if(value==null||!Object.is(value,actualAngles[index])){issue4(issues,"expansion",`${path}.angles[${index}]`,"lowered angle value does not match")}validateAngleBinding(expression,actualAngleNames[index]??"",environment,`${path}.angles[${index}]`,issues)})}function evaluateExpression(expression,environment,path,issues){let value;if(expression.kind==="literal")value=expression.value;else if(expression.kind==="pi")value=Math.PI;else if(expression.kind==="scalar-reference"){const binding=environment.scalars.get(expression.name);if(!binding||binding.binding!==expression.binding){issue4(issues,"expression",path,"scalar reference is missing or has the wrong binding kind");return void 0}value=binding.value}else if(expression.kind==="vector-element"){value=environment.vectors.get(expression.name)?.values[expression.index];if(value==null){issue4(issues,"expression",path,"vector element reference is missing or out of bounds");return void 0}}else if(expression.kind==="induction"){if(!environment.induction||environment.induction.name!==expression.name){issue4(issues,"expression",path,"induction reference is outside its owning for-range");return void 0}value=environment.induction.value}else if(expression.kind==="unary"){const operand2=evaluateExpression(expression.operand,environment,`${path}.operand`,issues);if(operand2==null)return void 0;value=expression.operator==="-"?-operand2:operand2}else{const left=evaluateExpression(expression.left,environment,`${path}.left`,issues);const right=evaluateExpression(expression.right,environment,`${path}.right`,issues);if(left==null||right==null)return void 0;if(expression.operator==="+")value=left+right;else if(expression.operator==="-")value=left-right;else if(expression.operator==="*")value=left*right;else if(right===0){issue4(issues,"expression",path,"division by zero is not valid provenance");return void 0}else value=left/right}if(!Number.isFinite(value)){issue4(issues,"expression",path,"expression does not resolve to a finite value");return void 0}return value}function validateAngleBinding(expression,actualName,environment,path,issues){const expectedReferences=collectExpressionReferences(expression,environment,path,issues);const actualReferences=new Set((actualName.match(/\b[_A-Za-z]\w*\b/gu)??[]).filter(name2=>name2!=="PI"));if(!sameStringSet([...expectedReferences],[...actualReferences])){issue4(issues,"expansion",path,"lowered angle bindings do not match")}if(actualName===""!==isSyntacticLiteral(expression)){issue4(issues,"expansion",path,"lowered angle literal classification does not match")}}function collectExpressionReferences(expression,environment,path,issues){if(expression.kind==="scalar-reference")return new Set([expression.name]);if(expression.kind==="vector-element"){const alias=environment.vectors.get(expression.name)?.scalarNames[expression.index];if(!alias){issue4(issues,"expression",path,"vector element has no lowered scalar alias");return new Set}return new Set([alias])}if(expression.kind==="unary"){return collectExpressionReferences(expression.operand,environment,`${path}.operand`,issues)}if(expression.kind==="binary"){return new Set([...collectExpressionReferences(expression.left,environment,`${path}.left`,issues),...collectExpressionReferences(expression.right,environment,`${path}.right`,issues)])}return new Set}function isSyntacticLiteral(expression){return expression.kind==="literal"||expression.kind==="induction"||expression.kind==="unary"&&isSyntacticLiteral(expression.operand)}function evaluateIndex(index,induction,path,issues){if(index==null)return void 0;const value=index.kind==="literal"?index.value:induction==null?void 0:induction.value+index.offset;if(value==null||!Number.isSafeInteger(value)||value<0){issue4(issues,"expression",`${path}.index`,"target index does not resolve to a non-negative safe integer");return void 0}return value}function validateSourceUse(program,source,position,line,path,issues){const match=program.comptimeConstants?.uses.find(use=>use.position===position&&use.line===line);if(!match||match.sourceExpression!==source.sourceExpression||match.foldedValue!==source.foldedValue||!sameStringSet(match.referencedConstants,source.referencedConstants)){issue4(issues,"source-metadata",path,"does not match the owning comptime use")}}function createScalarEnvironment(program,beforeStatement){const scalars=new Map;for(const declaration of program.comptimeConstants?.declarations??[]){scalars.set(declaration.name,{binding:"const",value:declaration.foldedValue})}for(const statement of program.statements.slice(0,beforeStatement)){if(statement.kind==="const"){scalars.set(statement.name,{binding:"const",value:statement.value})}else if(statement.kind==="param"){scalars.set(statement.name,{binding:"param",value:statement.value})}}return scalars}function createQRegLayouts(statements){const layouts2=new Map;let base2=0;for(const statement of statements){if(statement.kind!=="qreg")continue;layouts2.set(statement.name,{base:base2,size:statement.size});base2+=statement.size}return layouts2}function structureSpan(node){return node.kind==="vector-param"?node.declarationSpan:node.expansionSpan}function allowsEmptySpan(node){if(node.kind==="vector-param")return false;return node.body.length===0}function vectorsSet(vectors,name2,values2,scalarNames,path,issues){if(vectors.has(name2)){issue4(issues,"vector",path,"vector name is not unique");return}vectors.set(name2,{values:values2,scalarNames:[...scalarNames]})}function sameStringSet(left,right){const sortedRight=[...right].sort();return left.length===right.length&&[...left].sort().every((value,index)=>value===sortedRight[index])}function validateIdentifierArray(value,path,issues){if(!Array.isArray(value)){schemaIssue(issues,path,"must be an array");return}value.forEach((entry,index)=>validateIdentifier(entry,`${path}[${index}]`,issues));if(new Set(value).size!==value.length)schemaIssue(issues,path,"must not contain duplicates")}function validateIdentifier(value,path,issues){if(typeof value!=="string"||!/^[_A-Za-z]\w*$/u.test(value)){schemaIssue(issues,path,"must be an N/M identifier")}}function validatePositiveLine(value,path,issues){if(!Number.isSafeInteger(value)||Number(value)<1){schemaIssue(issues,path,"must be a positive source line")}}function validateNonNegativeInteger(value,path,issues){if(!Number.isSafeInteger(value)||Number(value)<0){schemaIssue(issues,path,"must be a non-negative safe integer")}}function exactRecord(value,required,optional,path,issues){if(!isRecord2(value)){schemaIssue(issues,path,"must be an object");return false}const allowed=new Set([...required,...optional]);for(const key4 of Object.keys(value)){if(!allowed.has(key4))schemaIssue(issues,`${path}.${key4}`,"is an unknown field")}for(const key4 of required){if(!Object.prototype.hasOwnProperty.call(value,key4)){schemaIssue(issues,`${path}.${key4}`,"is required")}}return true}function isRecord2(value){return typeof value==="object"&&value!==null&&!Array.isArray(value)}function schemaIssue(issues,path,message){issue4(issues,"schema",path,message)}function issue4(issues,code,path,message){issues.push({code,path,message})}var simpleGateArities=new Map([["H",1],["X",1],["Y",1],["Z",1],["S",1],["T",1],["Sdg",1],["Tdg",1],["CNOT",2],["CZ",2],["SWAP",2],["iSWAP",2],["CY",2],["CH",2],["CCNOT",3],["CSWAP",3]]);var angleGateArities=new Map([["P",1],["Rx",1],["Ry",1],["Rz",1],["RXX",2],["RYY",2],["RZZ",2],["CRy",2],["CRz",2],["CP",2]]);function attachNMComptimeStructureProvenance(source,result2){if(result2.diagnostics.some(({severity})=>severity==="error"))return result2;const carrier=extractNMComptimeStructureProvenance(source,result2.program);if(!carrier)return result2;return{...result2,program:{...result2.program,comptimeStructures:carrier}}}function extractNMComptimeStructureProvenance(source,program){const relevantUses=program.comptimeConstants?.uses.filter(({position})=>position==="vector-param-size"||position==="repeat-count"||position==="for-start"||position==="for-end")??[];if(relevantUses.length===0)return void 0;const canonicalSource=replaceNMKeywordTokens(source,nmTurkishKeywordAliases);const lines=canonicalSource.split(/\r\n|\r|\n/u).map((raw,index)=>({line:index+1,text:stripLineComment(raw).trim()}));const scalarBindings=createScalarBindings(program);const constBindings=createComptimeBindings(program);const vectors=new Map;const nodes=[];let statementCursor=0;for(let lineIndex=0;lineIndex<lines.length;lineIndex+=1){const sourceLine=lines[lineIndex];const vectorMatch=/^param\s+([A-Za-z_]\w*)\s*:\s*Angle\s*\[\s*(.+?)\s*\]\s*=\s*\[(.*)\]\s*;?$/u.exec(sourceLine.text);if(vectorMatch){const size=copySourceUse(program,"vector-param-size",sourceLine.line);if(!size)return void 0;const elementSources=splitTopLevel3(vectorMatch[3]);if(elementSources.length!==size.foldedValue)return void 0;const context2={scalarBindings,vectors};const elements=elementSources.map(candidate2=>parseAngleExpression(candidate2,context2));if(elements.some(candidate2=>candidate2==null))return void 0;const scalarNames=Array.from({length:size.foldedValue},(_,index)=>`${vectorMatch[1]}_${index}`);const sequence=scalarNames.map(name2=>({kind:"param",name:name2,line:sourceLine.line}));const statementStart=findStatementSequence(program.statements,statementCursor,sequence);if(statementStart==null)return void 0;nodes.push({kind:"vector-param",line:sourceLine.line,name:vectorMatch[1],size,elements,scalarNames,declarationSpan:{statementStart,statementCount:sequence.length}});vectors.set(vectorMatch[1],scalarNames);scalarNames.forEach(name2=>scalarBindings.delete(name2));statementCursor=statementStart+sequence.length;continue}const repeatMatch=/^repeat\s+(.+?)\s*\{$/u.exec(sourceLine.text);const forMatch=/^for\s+([A-Za-z_]\w*)\s+in\s+(.+?)\.\.(.+?)\s*\{$/u.exec(sourceLine.text);if(!repeatMatch&&!forMatch)continue;const block=readGateBlock(lines,lineIndex);if(!block)return void 0;const induction=forMatch?.[1];const context={scalarBindings,vectors,...induction?{induction}:{}};const templates=block.body.map(({text})=>parseGateTemplate(text,context,constBindings));if(templates.some(candidate2=>candidate2==null))return void 0;const body=templates;if(repeatMatch){const count=copySourceUse(program,"repeat-count",sourceLine.line);if(!count)return void 0;const effectiveIterations=Math.min(count.foldedValue,32);const sequence=repeatedGateSequence(block.body,body,effectiveIterations);const statementStart=findStructureSpan(program.statements,statementCursor,sequence,block.closeLine);if(statementStart==null)return void 0;nodes.push({kind:"repeat",line:sourceLine.line,count,effectiveIterations,body,expansionSpan:{statementStart,statementCount:sequence.length}});statementCursor=statementStart+sequence.length}else if(forMatch){const start=copySourceUse(program,"for-start",sourceLine.line);const endExclusive=copySourceUse(program,"for-end",sourceLine.line);if(!start||!endExclusive)return void 0;const effectiveIterations=Math.min(Math.max(0,endExclusive.foldedValue-start.foldedValue),32);const sequence=repeatedGateSequence(block.body,body,effectiveIterations);const statementStart=findStructureSpan(program.statements,statementCursor,sequence,block.closeLine);if(statementStart==null)return void 0;nodes.push({kind:"for-range",line:sourceLine.line,variable:forMatch[1],start,endExclusive,effectiveIterations,body,expansionSpan:{statementStart,statementCount:sequence.length}});statementCursor=statementStart+sequence.length}lineIndex=block.closeIndex}const carrier={experimental:true,contractVersion:NM_COMPTIME_STRUCTURE_PROVENANCE_CONTRACT_VERSION,nodes};const candidate={...program,comptimeStructures:carrier};return validateNMComptimeStructureProvenance(candidate).length===0?carrier:void 0}function readGateBlock(lines,headerIndex){const body=[];for(let index=headerIndex+1;index<lines.length;index+=1){const line=lines[index];if(line.text==="}"){return{body,closeIndex:index,closeLine:line.line}}if(!line.text)continue;if(line.text.includes("{")||line.text.includes("}"))return void 0;body.push(line)}return void 0}function parseGateTemplate(source,context,constBindings){const match=/^([A-Za-z_]\w*)\s*\((.*)\)\s*;?$/u.exec(source);if(!match)return void 0;const gate=match[1];const simpleArity=simpleGateArities.get(gate);const targetCount=simpleArity??angleGateArities.get(gate)??(gate==="U"?1:gate==="GPhase"?0:void 0);const angleCount=simpleArity!=null?0:gate==="U"?3:1;if(targetCount==null)return void 0;const arguments_=splitTopLevel3(match[2]);if(arguments_.length!==targetCount+angleCount)return void 0;const targets=arguments_.slice(0,targetCount).map(candidate=>parseTargetTemplate(candidate,context.induction,constBindings));const angles=arguments_.slice(targetCount).map(candidate=>parseAngleExpression(candidate,context));if(targets.some(candidate=>candidate==null)||angles.some(candidate=>candidate==null)){return void 0}return{gate,targets,angles}}function parseTargetTemplate(source,induction,constBindings){const match=/^([A-Za-z_]\w*)(?:\[\s*(.+?)\s*\])?$/u.exec(source.trim());if(!match)return void 0;if(match[2]==null)return{register:match[1]};const expression=match[2].trim();if(induction){if(expression===induction){return{register:match[1],index:{kind:"induction",offset:0}}}const offset=new RegExp(`^${induction}\\s*([+-])\\s*(\\d+)$`,"u").exec(expression);if(offset){return{register:match[1],index:{kind:"induction",offset:Number.parseInt(offset[2],10)*(offset[1]==="-"?-1:1)}}}const commuted=new RegExp(`^(\\d+)\\s*\\+\\s*${induction}$`,"u").exec(expression);if(commuted){return{register:match[1],index:{kind:"induction",offset:Number.parseInt(commuted[1],10)}}}}const evaluated=evaluateNMComptimeExpression(expression,constBindings);if(!evaluated.success||evaluated.foldedValue<0)return void 0;return{register:match[1],index:{kind:"literal",value:evaluated.foldedValue}}}function parseAngleExpression(source,context){const rawTokens=source.match(/\d+\.\d+|\d+|[A-Za-z_]\w*|[+\-*/()[\]]/gu);if(!rawTokens||rawTokens.join("")!==source.replace(/\s+/gu,""))return void 0;let position=0;const peek=()=>rawTokens[position];const take=()=>rawTokens[position++];const primary=()=>{const token=take();if(!token)return void 0;if(/^\d/u.test(token)){const value=Number.parseFloat(token);return Number.isFinite(value)?{kind:"literal",value}:void 0}if(token==="("){const expression2=sum();return take()===")"?expression2:void 0}if(!/^[A-Za-z_]\w*$/u.test(token))return void 0;if(token==="PI")return{kind:"pi"};if(peek()==="["){take();const indexSource=take();if(!/^\d+$/u.test(indexSource??"")||take()!=="]")return void 0;const index=Number.parseInt(indexSource,10);if(context.vectors.get(token)?.[index]==null)return void 0;return{kind:"vector-element",name:token,index}}if(context.induction===token)return{kind:"induction",name:token};const binding=context.scalarBindings.get(token);return binding?{kind:"scalar-reference",binding,name:token}:void 0};const unary=()=>{const token=peek();if(token==="+"||token==="-"){take();const operand2=unary();return operand2?{kind:"unary",operator:token,operand:operand2}:void 0}return primary()};const product=()=>{let left=unary();while(left&&(peek()==="*"||peek()==="/")){const operator=take();const right=unary();if(!right)return void 0;left={kind:"binary",operator,left,right}}return left};function sum(){let left=product();while(left&&(peek()==="+"||peek()==="-")){const operator=take();const right=product();if(!right)return void 0;left={kind:"binary",operator,left,right}}return left}const expression=sum();return expression&&position===rawTokens.length?expression:void 0}function splitTopLevel3(source){const values2=[];let current="";let roundDepth=0;let squareDepth=0;for(const char of source){if(char==="(")roundDepth+=1;else if(char===")")roundDepth-=1;else if(char==="[")squareDepth+=1;else if(char==="]")squareDepth-=1;if(char===","&&roundDepth===0&&squareDepth===0){values2.push(current.trim());current=""}else current+=char}if(current.trim()||source.trim())values2.push(current.trim());return values2}function repeatedGateSequence(sourceBody,templates,iterations){return Array.from({length:iterations},()=>templates.map((template,index)=>({kind:"gate",gate:template.gate,line:sourceBody[index].line}))).flat()}function findStructureSpan(statements,cursor,sequence,closeLine){if(sequence.length>0)return findStatementSequence(statements,cursor,sequence);const insertion=statements.findIndex((statement,index)=>index>=cursor&&statement.line>closeLine);return insertion<0?statements.length:insertion}function findStatementSequence(statements,cursor,sequence){for(let start=cursor;start+sequence.length<=statements.length;start+=1){const matches=sequence.every((expected,offset)=>{const actual=statements[start+offset];if(expected.kind==="param"){return actual?.kind==="param"&&actual.name===expected.name&&actual.line===expected.line}return actual?.kind==="gate"&&actual.gate===expected.gate&&actual.line===expected.line});if(matches)return start}return void 0}function copySourceUse(program,position,line){const use=program.comptimeConstants?.uses.find(candidate=>candidate.position===position&&candidate.line===line);return use?{sourceExpression:use.sourceExpression,foldedValue:use.foldedValue,referencedConstants:[...use.referencedConstants]}:void 0}function createScalarBindings(program){const bindings3=new Map;for(const declaration of program.comptimeConstants?.declarations??[]){bindings3.set(declaration.name,"const")}for(const statement of program.statements){if(statement.kind==="const")bindings3.set(statement.name,"const");else if(statement.kind==="param")bindings3.set(statement.name,"param")}return bindings3}function createComptimeBindings(program){return Object.fromEntries((program.comptimeConstants?.declarations??[]).map(declaration=>[declaration.name,{kind:"const",value:declaration.foldedValue,valueType:"Int"}]))}function stripLineComment(source){let quote;let escaping=false;for(let index=0;index<source.length-1;index+=1){const char=source[index];if(escaping)escaping=false;else if(char==="\\")escaping=true;else if(quote&&char===quote)quote=void 0;else if(!quote&&(char==='"'||char==="'"))quote=char;else if(!quote&&char==="/"&&source[index+1]==="/")return source.slice(0,index)}return source}var SUPPORTED_SINGLE_QUBIT_GATES=["H","X","Y","Z","S","T","Sdg","Tdg"];var SUPPORTED_GATES=[...SUPPORTED_SINGLE_QUBIT_GATES,"P","U","GPhase","CNOT","CZ","SWAP","iSWAP","CCNOT","CSWAP","CY","CH","Rx","Ry","Rz","RXX","RYY","RZZ","CRy","CRz","CP"];var MAX_UNTIL_ITERATIONS=32;var MAX_PROPERTY_CASES=32;var IDENTIFIER_SOURCE4=String.raw`[\p{L}_][\p{L}\p{N}_]*`;function collectFiniteShotPropertyAssertions(source,target2=[]){for(const statement of source){if((statement.kind==="assertProbability"||statement.kind==="assertExpectation")&&statement.operator==="~="){target2.push(statement)}if(statement.kind==="if"){collectFiniteShotPropertyAssertions(statement.body,target2);if(statement.elseBody)collectFiniteShotPropertyAssertions(statement.elseBody,target2)}else if(statement.kind==="until"){collectFiniteShotPropertyAssertions(statement.body,target2)}else if(statement.kind==="match"){statement.cases.forEach(matchCase=>collectFiniteShotPropertyAssertions(matchCase.body,target2))}else if(statement.kind==="observe"||statement.kind==="test"||statement.kind==="snapshot"){collectFiniteShotPropertyAssertions(statement.body,target2)}else if(statement.kind==="property"){statement.cases.forEach(propertyCase=>collectFiniteShotPropertyAssertions(propertyCase.body,target2))}}return target2}function usesNMFeedForwardSyntax(source,typedCollectionBodyLines){for(const statement of source){if(statement.kind==="assertBranchInvariant")return true;if(statement.kind==="measurement-binding"&&!typedCollectionBodyLines.has(statement.line)){return true}if(statement.kind==="if"){if(statement.predicate)return true;if(usesNMFeedForwardSyntax(statement.body,typedCollectionBodyLines))return true;if(statement.elseBody&&usesNMFeedForwardSyntax(statement.elseBody,typedCollectionBodyLines)){return true}}else if(statement.kind==="until"||statement.kind==="observe"||statement.kind==="test"||statement.kind==="snapshot"){if(usesNMFeedForwardSyntax(statement.body,typedCollectionBodyLines))return true}else if(statement.kind==="match"){if(statement.cases.some(matchCase=>usesNMFeedForwardSyntax(matchCase.body,typedCollectionBodyLines))){return true}}else if(statement.kind==="property"){if(statement.cases.some(propertyCase=>usesNMFeedForwardSyntax(propertyCase.body,typedCollectionBodyLines))){return true}}}return false}function parseNMCode(code,options={}){return parseNMCodeWithLineReader(code,options,getExecutableLines)}function parseNMCodeWithLineReader(code,options,lineReader,tokenStructuralBoundaries=false){const computeApply=admitNMComputeApplySource(code,options);if(computeApply.diagnostics.some(item=>item.severity==="error"))return failedNMParseResult([...computeApply.diagnostics]);const groups=readNMParameterGroupSource(code,options.experimental?.parameterGroups===true);if(groups.diagnostics.length)return failedNMParseResult(groups.diagnostics);const result2=attachNMComputeApplyParseResult(parseNMCodeWithLineReaderCore(groups.source,options,lineReader,tokenStructuralBoundaries,computeApply),code,computeApply.active,computeApply.incomplete,options);if(groups.declarations.length&&result2.program.classicalFunctions)result2.program.classicalFunctions.originalSource=code;return attachNMParameterGroups(groups,result2,options)}function parseNMCodeWithLineReaderCore(code,options,lineReader,tokenStructuralBoundaries=false,computeApply){const loweredFunctions=isClassicalFunctionCarrier(options)?{source:code,diagnostics:[]}:lowerNMSourceFunctions(code,options);if(loweredFunctions.diagnostics.some(diagnostic5=>diagnostic5.severity==="error"))return failedNMParseResult(loweredFunctions.diagnostics);const diagnostics=[...loweredFunctions.diagnostics];let computeApplyId=0;const computeApplyReader=computeApply.active?createNMComputeApplyLineReader(computeApply,diagnostics,new Set(loweredFunctions.runtimeAngles?.keys()),options.workspaceModules):void 0;function parseExecutableStatement(...args){return attachNMReadoutDebugBindings(args[0],parseReadoutLeaf(...args))}function parseReadoutLeaf(...args){if(rejectNMComputeApplyLeaf(args[0],diagnostics))return void 0;const mutation=parseNMMainMutation(args[0],options.experimental?.classicalFunctions===true&&options.experimental?.typedClassicalValues===true);if(mutation.candidate){diagnostics.push(...mutation.diagnostics);return mutation.statement}const dynamicGate=parseNMDynamicGate(args[0],options.experimental?.classicalFunctions===true&&options.experimental?.typedClassicalValues===true,line=>parseGate(line,args[1],args[3]));if(dynamicGate.candidate){diagnostics.push(...dynamicGate.diagnostics);return dynamicGate.statement}return parseExecutableStatementCore(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8],args[9],loweredFunctions.runtimeAngles)}code=loweredFunctions.source;const genericOraclesEnabled=options.experimental?.genericOracles===true;const propertyAssertionsEnabled=options.experimental?.propertyAssertions===true;const qmlTrainingControlsEnabled=options.experimental?.qmlTrainingControls===true;const feedForwardEnabled=options.experimental?.feedForward===true;const typedCollectionEnabled=options.experimental?.typedCollection===true;const typedClassicalValuesEnabled=options.experimental?.typedClassicalValues===true||genericOraclesEnabled;const targetCapabilityConstraintsEnabled=options.experimental?.targetCapabilityConstraints===true;const functionResultsEnabled=options.experimental?.functionResults===true||genericOraclesEnabled;if(options.experimental?.classicalFunctions===true&&options.experimental?.typedClassicalValues===true){const structural=parseNMClassicalControlDocument(code,true);if(structural){const reportStructuralIssues=document=>{for(const issue11 of document.issues)diagnostics.push(createDiagnostic({code:issue11.code==="NM-FRONTEND-PARITY-004"?"NM-CFN-003":"NM-PARSE-006",severity:"error",message:issue11.message,line:issue11.range?issue11.range.start.line+1:void 0}))};reportStructuralIssues(structural);lineReader=source=>{if(source===code)return structural.lines;const document=parseNMClassicalControlDocument(source);reportStructuralIssues(document);return document.lines};tokenStructuralBoundaries=true}}if(computeApplyReader){lineReader=computeApplyReader;tokenStructuralBoundaries=true}const preprocessed=preprocessNMSource(code,diagnostics,loweredFunctions.quantumModules?{...options,workspaceModules:loweredFunctions.quantumModules}:options,lineReader,tokenStructuralBoundaries,computeApply.active);let sourceLines4=computeApplyReader?.remap(preprocessed)??preprocessed.lines;if(computeApply.active&&loweredFunctions.runtimeAngles&&loweredFunctions.circuitAngleTypes&&loweredFunctions.provenance){try{sourceLines4=lowerNMComputeApplyExpandedAngles(sourceLines4,loweredFunctions.runtimeAngles,loweredFunctions.circuitAngleTypes,loweredFunctions.provenance.generatedBindings,loweredFunctions.circuitAngleFunctions)}catch(error){if(error instanceof FunctionIssue)return failedNMParseResult([...diagnostics,functionDiagnostic(error)]);throw error}}const statements=[];const qubitMap={};const constants=computeApply.active?Object.fromEntries([...loweredFunctions.runtimeAngles?.keys()??[]].map(name2=>[name2,0])):{};const observables={};const observableMetadata={};const observableUses=[];const observableNames=new Set;const params={};const qregSizes={};let numQubits=0;let moduleName;let compiler;let semantics;const goals=[];const outcomes=[];const rubrics=[];const misconceptions=[];const quizzes=[];const labs=[];const challenges=[];const datasets=[];const checkpoints=[];const hints=[];const concepts=[];let level;const prerequisites=[];let target2;let constraints;let targetCapabilityRequirement;let noise;let mitigation;let seed;let expectationShots;if(options.expectationShots!==void 0){const count=options.expectationShots;if(!Number.isInteger(count)||count<1){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-027",severity:"error",message:"Expectation shot override must be a positive integer."}))}else{expectationShots=Math.min(count,1e5);if(count>expectationShots)diagnostics.push(createDiagnostic({code:"NM-RUNTIME-027",severity:"warning",message:`Expectation shot override (${count}) is capped to ${expectationShots} in the playground runtime.`}))}}let optimize;let estimate;let mainLine;let functionResultType;const pushQRegDeclaration=qreg=>{for(let i=0;i<qreg.size;i+=1){qubitMap[`${qreg.name}[${i}]`]=numQubits+i}qregSizes[qreg.name]=qreg.size;numQubits+=qreg.size};const invalidTestBlockDiagnostic={code:"NM-PARSE-043",translationKey:"invalidTestBlock",messagePrefix:"Unsupported statement inside test block",hint:"The first test block MVP supports qreg, const, param, observable, gates, measurements, metrics, expectations, assertions, reset, barrier, and return statements."};const invalidPropertyBlockDiagnostic={code:"NM-PARSE-044",translationKey:"invalidPropertyBlock",messagePrefix:"Unsupported statement inside property block",hint:"Property/forall blocks support qreg declarations in the first case plus executable gates, measurements, metrics, expectations, assertions, reset, barrier, and return statements. Declare const, param, and observable values outside the property."};const invalidSnapshotBlockDiagnostic={code:"NM-PARSE-045",translationKey:"invalidSnapshotBlock",messagePrefix:"Unsupported statement inside snapshot block",hint:"Snapshot blocks support qreg, const, param, observable, gates, measurements, metrics, expectations, assertions, reset, barrier, and return statements."};const formatPropertyValue=value=>Number.parseFloat(value.toFixed(12)).toString();const pushInvalidPropertyDiagnostic=(sourceLine,block=sourceLine.text)=>{diagnostics.push(createDiagnostic({code:invalidPropertyBlockDiagnostic.code,severity:"error",message:`Invalid property block syntax: ${block}.`,hint:invalidPropertyBlockDiagnostic.hint,translationKey:invalidPropertyBlockDiagnostic.translationKey,translationValues:{block},line:sourceLine.line}))};const parseScopedStatement=(sourceIndex2,targetStatements,diagnosticConfig=invalidTestBlockDiagnostic)=>{const sourceLine=sourceLines4[sourceIndex2];if(/^compute\s*\{$/u.test(sourceLine.text)||computeApplyReader&&/^(?:if|for)\b/u.test(sourceLine.text)){const parsed=parseBlockStatement(sourceIndex2,[...statements,...targetStatements]);if(parsed.statement)targetStatements.push(parsed.statement);return parsed.end}const constDecl=parseConst(sourceLine,constants,diagnostics);if(constDecl){targetStatements.push(constDecl);constants[constDecl.name]=constDecl.value;return sourceIndex2}if(parseObservable(sourceLine,constants,observables,observableNames,observableMetadata,diagnostics)){return sourceIndex2}const paramDecl=parseParam(sourceLine,constants,diagnostics);if(paramDecl){targetStatements.push(paramDecl);constants[paramDecl.name]=paramDecl.value;params[paramDecl.name]=paramDecl.value;return sourceIndex2}const qreg=parseQReg(sourceLine,diagnostics);if(qreg){targetStatements.push(qreg);pushQRegDeclaration(qreg);return sourceIndex2}const statement=parseExecutableStatement(sourceLine,constants,observables,diagnostics,observableUses,propertyAssertionsEnabled,typedClassicalValuesEnabled,functionResultType,feedForwardEnabled,typedCollectionEnabled);if(statement){targetStatements.push(statement);return sourceIndex2}const diagnosticCount=diagnostics.length;validateUnsupportedSyntax(sourceLine,diagnostics);if(diagnostics.length===diagnosticCount){diagnostics.push(createDiagnostic({code:diagnosticConfig.code,severity:"error",message:`${diagnosticConfig.messagePrefix}: ${sourceLine.text}.`,hint:diagnosticConfig.hint,translationKey:diagnosticConfig.translationKey,translationValues:{block:sourceLine.text},line:sourceLine.line}))}return sourceIndex2};const substituteForallValue=(text,parameter,value)=>text.replace(new RegExp(`\\b${parameter}\\b`,"g"),formatPropertyValue(value));const buildForallValues=(line,startSource,endSource,stepSource)=>{const start=evaluateAngleExpression(startSource,constants);const end=evaluateAngleExpression(endSource,constants);const step=evaluateAngleExpression(stepSource,constants);if(start==null||end==null||step==null||step===0){pushInvalidPropertyDiagnostic(line);return void 0}const values2=[];const epsilon=Math.abs(step)*1e-9+1e-12;const canContinue=value=>step>0?value<=end+epsilon:value>=end-epsilon;for(let value=start;canContinue(value)&&values2.length<MAX_PROPERTY_CASES;value+=step){values2.push(Number.parseFloat(value.toFixed(12)))}if(values2.length===0){pushInvalidPropertyDiagnostic(line);return void 0}const nextValue=values2.at(-1)+step;if(canContinue(nextValue)){diagnostics.push(createDiagnostic({code:invalidPropertyBlockDiagnostic.code,severity:"warning",message:`Property forall range is capped to ${MAX_PROPERTY_CASES} case(s).`,hint:"Use a larger step or a narrower range while experimenting in the browser.",translationKey:invalidPropertyBlockDiagnostic.translationKey,translationValues:{block:line.text},line:line.line}))}return values2};const parsePropertyCaseBody=(bodyLines,parameter,value,caseIndex,targetStatements,bindingLine)=>{const substituted=bodyLines.map(bodyLine=>({...bodyLine,text:substituteForallValue(bodyLine.text,parameter,value)}));if(computeApplyReader&&loweredFunctions.provenance)targetStatements.push({kind:"classicalDecl",name:parameter,valueType:{kind:"scalar",name:"Float"},expression:{kind:"number",numberType:"Float",value},line:bindingLine});for(let cursor=0;cursor<substituted.length;cursor++){const substitutedLine=substituted[cursor];if(/^compute\s*\{$/u.test(substitutedLine.text)||computeApplyReader&&/^(?:if|for)\b/u.test(substitutedLine.text)){const parsed=parseBlockStatement(cursor,[...statements,...targetStatements],substituted);if(parsed.statement)targetStatements.push(parsed.statement);cursor=parsed.end;continue}if(/^(?:const|param|observable)\b/.test(substitutedLine.text)){pushInvalidPropertyDiagnostic(substitutedLine);continue}const qreg=parseQReg(substitutedLine,diagnostics);if(qreg){if(caseIndex===0){targetStatements.push(qreg);pushQRegDeclaration(qreg)}continue}const statement=parseExecutableStatement(substitutedLine,constants,observables,diagnostics,observableUses,propertyAssertionsEnabled,typedClassicalValuesEnabled,functionResultType,feedForwardEnabled,typedCollectionEnabled);if(statement){targetStatements.push(statement);continue}const diagnosticCount=diagnostics.length;validateUnsupportedSyntax(substitutedLine,diagnostics);if(diagnostics.length===diagnosticCount){diagnostics.push(createDiagnostic({code:invalidPropertyBlockDiagnostic.code,severity:"error",message:`${invalidPropertyBlockDiagnostic.messagePrefix}: ${substitutedLine.text}.`,hint:invalidPropertyBlockDiagnostic.hint,translationKey:invalidPropertyBlockDiagnostic.translationKey,translationValues:{block:substitutedLine.text},line:substitutedLine.line}))}}};const parseBlockLeaf=current=>parseExecutableStatement(current,constants,observables,diagnostics,observableUses,propertyAssertionsEnabled,typedClassicalValuesEnabled,functionResultType,feedForwardEnabled,typedCollectionEnabled);const parseComputeApply=(start,lines=sourceLines4)=>parseNMComputeApplyPair(lines,start,parseBlockLeaf,diagnostics,()=>computeApplyId++);const parseBlockStatement=(start,visible=statements,lines=sourceLines4)=>{if(/^compute\s*\{$/u.test(lines[start].text))return parseComputeApply(start,lines);if(computeApplyReader&&(/^(?:if|for)\b/u.test(lines[start].text)||isNMMainResultMatch(lines,start,visible))){return parseNMMainConditional(lines,start,{diagnostics,visible,numericNames:[...Object.keys(constants),...Object.keys(params)],feedForward:feedForwardEnabled,classicalControl:options.experimental?.classicalFunctions===true&&options.experimental?.typedClassicalValues===true,parseComputeApply:index=>parseComputeApply(index,lines),parseStatement:parseBlockLeaf})}return{statement:parseBlockLeaf(lines[start]),end:start}};for(let idx=0;idx<sourceLines4.length;idx+=1){const line=sourceLines4[idx];if(/^compute\s*\{$/u.test(line.text)){const pair=parseComputeApply(idx);if(pair.statement)statements.push(pair.statement);idx=pair.end;continue}if(closesNMSourceBlock(line)){continue}if(/^train\s*\{\s*$/.test(line.text)){const parsedTrain=parseNMTrainBlock(sourceLines4,idx,{qmlTrainingControls:qmlTrainingControlsEnabled,classicalFunctions:options.experimental?.classicalFunctions,typedClassicalValues:options.experimental?.typedClassicalValues});statements.push(parsedTrain.block);diagnostics.push(...parsedTrain.diagnostics);idx=parsedTrain.nextIndex;continue}if(/^train\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-QML-104",severity:"error",message:`Invalid train block syntax: ${line.text}.`,hint:"Use train { followed by objective, optimizer, and steps directives.",translationKey:"invalidTrainDirective",translationValues:{directive:line.text},line:line.line}));continue}const goalMatch=line.text.match(/^@goal\s*\(\s*"((?:\\.|[^"\\])*)"\s*\)\s*;?$/);if(goalMatch){goals.push({text:goalMatch[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\"),line:line.line});continue}if(/^@goal\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-024",severity:"warning",message:`Invalid @goal annotation: ${line.text}.`,hint:'Use @goal("Describe the lab objective."); near the top of the program.',translationKey:"invalidGoalAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}const outcomeMatch=line.text.match(/^@outcome\s*\(\s*"((?:\\.|[^"\\])*)"\s*\)\s*;?$/);if(outcomeMatch){outcomes.push({text:outcomeMatch[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\"),line:line.line});continue}if(/^@outcome\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-029",severity:"warning",message:`Invalid @outcome annotation: ${line.text}.`,hint:'Use @outcome("Explain why H creates a balanced state."); near the top of the program.',translationKey:"invalidOutcomeAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}const rubricMatch=line.text.match(/^@rubric\s*\(\s*"((?:\\.|[^"\\])*)"\s*(?:,\s*weight\s*:\s*(-?\d+(?:\.\d+)?))?\s*\)\s*;?$/);if(rubricMatch){const weight=rubricMatch[2]!=null?Number.parseFloat(rubricMatch[2]):void 0;if(weight!=null&&(weight<0||weight>1)){diagnostics.push(createDiagnostic({code:"NM-PARSE-030",severity:"warning",message:`Invalid @rubric annotation: ${line.text}.`,hint:'Use @rubric("Explain the probability distribution.", weight: 0.5); with weight between 0 and 1.',translationKey:"invalidRubricAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}rubrics.push({text:rubricMatch[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\"),...weight!=null?{weight}:{},line:line.line});continue}if(/^@rubric\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-030",severity:"warning",message:`Invalid @rubric annotation: ${line.text}.`,hint:'Use @rubric("Explain the probability distribution.", weight: 0.5); near the top of the program.',translationKey:"invalidRubricAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}const misconceptionMatch=line.text.match(/^@misconception\s*\(\s*"((?:\\.|[^"\\])*)"\s*\)\s*;?$/);if(misconceptionMatch){misconceptions.push({text:misconceptionMatch[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\"),line:line.line});continue}if(/^@misconception\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-031",severity:"warning",message:`Invalid @misconception annotation: ${line.text}.`,hint:'Use @misconception("H is not a random classical coin flip."); near the top of the program.',translationKey:"invalidMisconceptionAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}const quizMatch=line.text.match(/^@quiz\s*\(\s*"((?:\\.|[^"\\])*)"\s*(?:,\s*answer\s*:\s*"((?:\\.|[^"\\])*)")?\s*\)\s*;?$/);if(quizMatch){quizzes.push({question:quizMatch[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\"),...quizMatch[2]!=null?{answer:quizMatch[2].replace(/\\"/g,'"').replace(/\\\\/g,"\\")}:{},line:line.line});continue}if(/^@quiz\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-032",severity:"warning",message:`Invalid @quiz annotation: ${line.text}.`,hint:'Use @quiz("What are the final probabilities?", answer: "50% for |0> and 50% for |1>."); near the top of the program.',translationKey:"invalidQuizAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}const labMatch=line.text.match(/^@lab\s*\(\s*"((?:\\.|[^"\\])*)"\s*(?:,\s*minutes\s*:\s*(-?\d+))?\s*\)\s*;?$/);if(labMatch){const minutes=labMatch[2]!=null?Number.parseInt(labMatch[2],10):void 0;if(minutes!=null&&minutes<=0){diagnostics.push(createDiagnostic({code:"NM-PARSE-033",severity:"warning",message:`Invalid @lab annotation: ${line.text}.`,hint:'Use @lab("bell-basics", minutes: 10); with a positive minutes value.',translationKey:"invalidLabAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}labs.push({id:labMatch[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\"),...minutes!=null?{minutes}:{},line:line.line});continue}if(/^@lab\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-033",severity:"warning",message:`Invalid @lab annotation: ${line.text}.`,hint:'Use @lab("bell-basics", minutes: 10); near the top of the program.',translationKey:"invalidLabAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}const challengeMatch=line.text.match(/^@challenge\s*\(\s*"((?:\\.|[^"\\])*)"\s*(?:,\s*difficulty\s*:\s*"(beginner|intermediate|advanced)")?\s*\)\s*;?$/);if(challengeMatch){challenges.push({id:challengeMatch[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\"),...challengeMatch[2]!=null?{difficulty:challengeMatch[2]}:{},line:line.line});continue}if(/^@challenge\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-041",severity:"warning",message:`Invalid @challenge annotation: ${line.text}.`,hint:'Use @challenge("bell-from-scratch", difficulty: "beginner"); near the top of the program.',translationKey:"invalidChallengeAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}const datasetMatch=line.text.match(/^@dataset\s*\(\s*"((?:\\.|[^"\\])*)"\s*(?:,\s*split\s*:\s*"((?:\\.|[^"\\])*)")?\s*\)\s*;?$/);if(datasetMatch){const split=datasetMatch[2]?.replace(/\\"/g,'"').replace(/\\\\/g,"\\");if(split!=null&&!["train","validation","test","synthetic"].includes(split)){diagnostics.push(createDiagnostic({code:"NM-PARSE-034",severity:"warning",message:`Invalid @dataset annotation: ${line.text}.`,hint:'Use @dataset("bell-balanced", split: "train"); with split train, validation, test, or synthetic.',translationKey:"invalidDatasetAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}datasets.push({id:datasetMatch[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\"),...split!=null?{split}:{},line:line.line});continue}if(/^@dataset\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-034",severity:"warning",message:`Invalid @dataset annotation: ${line.text}.`,hint:'Use @dataset("bell-balanced", split: "train"); near the top of the program.',translationKey:"invalidDatasetAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}const checkpointMatch=line.text.match(/^@checkpoint\s*\(\s*"((?:\\.|[^"\\])*)"\s*(?:,\s*kind\s*:\s*"((?:\\.|[^"\\])*)")?\s*\)\s*;?$/);if(checkpointMatch){const kind=checkpointMatch[2]?.replace(/\\"/g,'"').replace(/\\\\/g,"\\");if(kind!=null&&!["predict","inspect","explain","debug"].includes(kind)){diagnostics.push(createDiagnostic({code:"NM-PARSE-035",severity:"warning",message:`Invalid @checkpoint annotation: ${line.text}.`,hint:'Use @checkpoint("Predict before running.", kind: "predict"); with kind predict, inspect, explain, or debug.',translationKey:"invalidCheckpointAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}checkpoints.push({text:checkpointMatch[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\"),...kind!=null?{kind}:{},line:line.line});continue}if(/^@checkpoint\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-035",severity:"warning",message:`Invalid @checkpoint annotation: ${line.text}.`,hint:'Use @checkpoint("Predict before running.", kind: "predict"); near the top of the program.',translationKey:"invalidCheckpointAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}const hintMatch=line.text.match(/^@hint\s*\(\s*"((?:\\.|[^"\\])*)"\s*\)\s*;?$/);if(hintMatch){hints.push({text:hintMatch[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\"),line:line.line});continue}if(/^@hint\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-025",severity:"warning",message:`Invalid @hint annotation: ${line.text}.`,hint:'Use @hint("Try changing the rotation angle."); near the top of the program.',translationKey:"invalidHintAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}const conceptMatch=line.text.match(/^@concept\s*\(\s*"((?:\\.|[^"\\])*)"\s*\)\s*;?$/);if(conceptMatch){concepts.push({name:conceptMatch[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\"),line:line.line});continue}if(/^@concept\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-026",severity:"warning",message:`Invalid @concept annotation: ${line.text}.`,hint:'Use @concept("superposition"); near the top of the program.',translationKey:"invalidConceptAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}const levelMatch=line.text.match(/^@level\s*\(\s*"(beginner|intermediate|advanced)"\s*\)\s*;?$/);if(levelMatch){level={value:levelMatch[1],line:line.line};continue}if(/^@level\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-027",severity:"warning",message:`Invalid @level annotation: ${line.text}.`,hint:'Use @level("beginner");, @level("intermediate");, or @level("advanced"); near the top of the program.',translationKey:"invalidLevelAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}const prereqMatch=line.text.match(/^@prereq\s*\(\s*"((?:\\.|[^"\\])*)"\s*\)\s*;?$/);if(prereqMatch){prerequisites.push({name:prereqMatch[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\"),line:line.line});continue}if(/^@prereq\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-028",severity:"warning",message:`Invalid @prereq annotation: ${line.text}.`,hint:'Use @prereq("basic-gates"); near the top of the program.',translationKey:"invalidPrereqAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}const explain=parseExplain(line,diagnostics);if(explain){statements.push(explain);continue}if(/^@explain\b/.test(line.text)){continue}const compilerMatch=line.text.match(/^@compiler\s*\(\s*trace\s*:\s*(true|false)\s*\)\s*;?$/);if(compilerMatch){compiler={...compiler,trace:compilerMatch[1]==="true"};continue}if(/^@compiler\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-020",severity:"warning",message:`Invalid @compiler annotation: ${line.text}.`,hint:"Use @compiler(trace: true); to show compiler steps in the Trace tab.",translationKey:"invalidCompilerAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}const semanticsMatch=line.text.match(/^@semantics\s*\(\s*"(default|strict)"\s*\)\s*;?$/);if(semanticsMatch){semantics={mode:semanticsMatch[1],line:line.line};continue}if(/^@semantics\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-SEM-000",severity:"warning",message:`Invalid @semantics annotation: ${line.text}.`,hint:'Use @semantics("strict"); to promote semantic warnings to errors.',translationKey:"invalidSemanticsAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}const optimizeMatch=line.text.match(/^@optimize\s*\((.*)\)\s*;?$/);if(optimizeMatch){optimize=parseOptimizeAnnotation(optimizeMatch[1],line,diagnostics);continue}if(/^@optimize\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-022",severity:"warning",message:`Invalid @optimize annotation: ${line.text}.`,hint:'Use @optimize(method: "adam", steps: 40, learningRate: 0.2, objective: "minimize");',translationKey:"invalidOptimizeAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}const estimateMatch=line.text.match(/^@estimate\s*\((.*)\)\s*;?$/);if(estimateMatch){estimate=parseEstimateAnnotation(estimateMatch[1],line,diagnostics);continue}if(/^@estimate\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-047",severity:"warning",message:`Invalid @estimate annotation: ${line.text}.`,hint:'Use @estimate(code: "surface", distance: 7, target_error: 1e-3);',translationKey:"invalidEstimateAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}if(/^@target_capabilities\b/u.test(line.text)){const match=line.text.match(/^@target_capabilities\s*\((.*)\)\s*;?$/u);const result2=parseNMTargetCapabilityConstraint(match?.[1]??"",line,targetCapabilityConstraintsEnabled);diagnostics.push(...result2.diagnostics);if(result2.requirement){if(targetCapabilityRequirement){diagnostics.push(createDiagnostic({code:nmTargetCapabilityConstraintDiagnosticCodes.invalidDeclaration,severity:"error",message:"Duplicate @target_capabilities annotation.",hint:"Declare one closed target capability requirement per module.",line:line.line}))}else{targetCapabilityRequirement=result2.requirement}}continue}const targetMatch=line.text.match(/^@target\s*\(\s*"([^"]+)"\s*\)\s*;?$/);if(targetMatch){target2=targetMatch[1];continue}const constraintsMatch=line.text.match(/^@constraints\s*\((.*)\)\s*;?$/);if(constraintsMatch){constraints=parseConstraintsAnnotation(constraintsMatch[1],line,diagnostics);continue}const seedMatch=line.text.match(/^@seed\s*\(\s*(\d+)\s*\)\s*;?$/);if(seedMatch){seed=Number.parseInt(seedMatch[1],10);continue}const shotsMatch=line.text.match(/^@shots\s*\(\s*(\d+)\s*\)\s*;?$/);if(shotsMatch){const count=Number.parseInt(shotsMatch[1],10);if(count<1){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-027",severity:"warning",message:`Invalid @shots annotation: ${line.text}.`,hint:"Use @shots(1024); with a positive shot count for finite-shot expectation estimates.",line:line.line}))}else{const capped=Math.min(count,1e5);if(count>capped){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-027",severity:"warning",message:`@shots(${count}) is capped to ${capped} in the playground runtime.`,hint:"Use a smaller finite-shot expectation count while experimenting in the browser.",line:line.line}))}if(options.expectationShots===void 0)expectationShots=capped}continue}if(/^@shots\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-027",severity:"warning",message:`Invalid @shots annotation: ${line.text}.`,hint:"Use @shots(1024); with a positive shot count for finite-shot expectation estimates.",line:line.line}));continue}const noiseMatch=line.text.match(/^@noise\s*\(\s*"([^"]+)"\s*,\s*(0(?:\.\d+)?|1(?:\.0+)?)\s*\)\s*;?$/);if(noiseMatch){if(noiseMatch[1]!=="depolarizing"&&noiseMatch[1]!=="pauli"&&noiseMatch[1]!=="readout"&&noiseMatch[1]!=="amplitude_damping"&&noiseMatch[1]!=="phase_damping"){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-005",severity:"warning",message:`Unsupported noise model: ${noiseMatch[1]}.`,hint:'The playground runtime models @noise("depolarizing", p), @noise("pauli", p), @noise("readout", p), @noise("amplitude_damping", p), and @noise("phase_damping", p).',translationKey:"unsupportedNoiseModel",translationValues:{model:noiseMatch[1]},line:line.line}))}else{noise={model:noiseMatch[1],probability:Number.parseFloat(noiseMatch[2])}}continue}const mitigationMatch=line.text.match(/^@mitigation\s*\(\s*"([^"]+)"\s*\)\s*;?$/);if(mitigationMatch){if(mitigationMatch[1]!=="readout"&&mitigationMatch[1]!=="zne"){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-028",severity:"warning",message:`Unsupported mitigation model: ${mitigationMatch[1]}.`,hint:'The playground runtime models @mitigation("readout") and @mitigation("zne").',translationKey:"unsupportedMitigationModel",translationValues:{model:mitigationMatch[1]},line:line.line}))}else{mitigation={model:mitigationMatch[1]}}continue}if(/^@mitigation\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-028",severity:"warning",message:`Invalid @mitigation annotation: ${line.text}.`,hint:'Use @mitigation("readout"); or @mitigation("zne"); after a noise annotation.',translationKey:"invalidMitigationAnnotation",translationValues:{annotation:line.text},line:line.line}));continue}const moduleMatch=line.text.match(/^module\s+([A-Za-z_]\w*)\s*;?$/);if(moduleMatch){moduleName=moduleMatch[1];continue}const functionResultSignature=parseNMFunctionResultSignature(line,functionResultsEnabled);if(functionResultSignature.candidate){mainLine=line.line;diagnostics.push(...functionResultSignature.diagnostics);functionResultType=functionResultSignature.resultType;continue}const mainMatch=line.text.match(/^fn\s+main\s*\(\s*\)\s*\{?$/);if(mainMatch){mainLine=line.line;continue}const constDecl=parseConst(line,constants,diagnostics);if(constDecl){statements.push(constDecl);constants[constDecl.name]=constDecl.value;continue}if(parseObservable(line,constants,observables,observableNames,observableMetadata,diagnostics)){continue}const paramDecl=parseParam(line,constants,diagnostics);if(paramDecl){statements.push(paramDecl);constants[paramDecl.name]=paramDecl.value;params[paramDecl.name]=paramDecl.value;continue}const qreg=parseQReg(line,diagnostics);if(qreg){statements.push(qreg);pushQRegDeclaration(qreg);continue}const snapshotMatch=line.text.match(/^snapshot\s+"((?:\\.|[^"\\])*)"\s*\{\s*$/);if(snapshotMatch){const body=[];let closed=false;idx+=1;while(idx<sourceLines4.length){if(closesNMSourceBlock(sourceLines4[idx])){closed=true;break}idx=parseScopedStatement(idx,body,invalidSnapshotBlockDiagnostic)+1}if(!closed){diagnostics.push(createDiagnostic({code:invalidSnapshotBlockDiagnostic.code,severity:"error",message:`Unterminated snapshot block: ${snapshotMatch[1]}.`,hint:"Close snapshot blocks with } after the final setup or assertion statement.",translationKey:invalidSnapshotBlockDiagnostic.translationKey,translationValues:{block:line.text},line:line.line}))}const snapshotStatement={kind:"snapshot",name:snapshotMatch[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\"),body,line:line.line};statements.push(snapshotStatement);continue}if(/^snapshot\b/.test(line.text)){diagnostics.push(createDiagnostic({code:invalidSnapshotBlockDiagnostic.code,severity:"error",message:`Invalid snapshot block syntax: ${line.text}.`,hint:'Use snapshot "bell golden" { H(q[0]); assert probability(|0>) > 0.4; }',translationKey:invalidSnapshotBlockDiagnostic.translationKey,translationValues:{block:line.text},line:line.line}));continue}const propertyMatch=line.text.match(/^property\s+"((?:\\.|[^"\\])*)"\s*\{\s*$/);if(propertyMatch){const propertyName=propertyMatch[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\");const cases=[];let closedForall=false;let closedProperty=false;idx+=1;const forallLine=sourceLines4[idx];const forallMatch=forallLine?.text.match(/^forall\s+([A-Za-z_]\w*)\s+in\s+(.+?)\s*\.\.\s*(.+?)\s+step\s+(.+?)\s*\{\s*$/);if(!forallLine||!forallMatch){pushInvalidPropertyDiagnostic(line,line.text);while(idx<sourceLines4.length&&!closesNMSourceBlock(sourceLines4[idx])){idx+=1}continue}const parameter=forallMatch[1];const values2=buildForallValues(forallLine,forallMatch[2],forallMatch[3],forallMatch[4])??[];const bodyLines=[];let forallDepth=1;idx+=1;while(idx<sourceLines4.length){if(closesNMSourceBlock(sourceLines4[idx])&&--forallDepth===0){closedForall=true;break}if(opensNMSourceBlock(sourceLines4[idx]))forallDepth++;bodyLines.push(sourceLines4[idx]);idx+=1}if(!closedForall){pushInvalidPropertyDiagnostic(line,line.text)}else{idx+=1;while(idx<sourceLines4.length){if(closesNMSourceBlock(sourceLines4[idx])){closedProperty=true;break}pushInvalidPropertyDiagnostic(sourceLines4[idx]);idx+=1}}if(!closedProperty){pushInvalidPropertyDiagnostic(line,line.text)}values2.forEach((value,caseIndex)=>{const body=[];parsePropertyCaseBody(bodyLines,parameter,value,caseIndex,body,forallLine.line);cases.push({value,body,line:forallLine.line})});statements.push({kind:"property",name:propertyName,parameter,cases,line:line.line});continue}if(/^property\b/.test(line.text)||/^forall\b/.test(line.text)){diagnostics.push(createDiagnostic({code:invalidPropertyBlockDiagnostic.code,severity:"error",message:`Invalid property block syntax: ${line.text}.`,hint:invalidPropertyBlockDiagnostic.hint,translationKey:invalidPropertyBlockDiagnostic.translationKey,translationValues:{block:line.text},line:line.line}));continue}const testMatch=line.text.match(/^test\s+"((?:\\.|[^"\\])*)"\s*\{\s*$/);if(testMatch){const body=[];let closed=false;idx+=1;while(idx<sourceLines4.length){if(closesNMSourceBlock(sourceLines4[idx])){closed=true;break}idx=parseScopedStatement(idx,body)+1}if(!closed){diagnostics.push(createDiagnostic({code:"NM-PARSE-043",severity:"error",message:`Unterminated test block: ${testMatch[1]}.`,hint:"Close test blocks with } after the final assertion.",translationKey:"invalidTestBlock",translationValues:{block:line.text},line:line.line}))}const testStatement={kind:"test",name:testMatch[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\"),body,line:line.line};statements.push(testStatement);continue}if(/^test\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-043",severity:"error",message:`Invalid test block syntax: ${line.text}.`,hint:'Use test "bell behavior" { assert probability(|00>) > 0.45; }',translationKey:"invalidTestBlock",translationValues:{block:line.text},line:line.line}));continue}const observeMatch=line.text.match(/^observe\s+([A-Za-z_]\w*)\s*\{\s*$/);if(observeMatch){const body=[];let closed=false;idx+=1;while(idx<sourceLines4.length){if(closesNMSourceBlock(sourceLines4[idx])){closed=true;break}const bodyLine=sourceLines4[idx],{statement:bodyStmt,end}=parseBlockStatement(idx,[...statements,...body]);idx=end;if(bodyStmt&&(isObserveBodyStatement(bodyStmt)||options.experimental?.classicalFunctions===true&&["classicalDecl","return"].includes(bodyStmt.kind))){body.push(bodyStmt)}else if(bodyStmt){diagnostics.push(createDiagnostic({code:"NM-TYPE-021",severity:"error",message:`Unsupported statement inside observe block: ${bodyLine.text}.`,hint:"Observe blocks support metric, expect, assert probability, assert expectation, assert entangled, and assert equivalent statements.",translationKey:"unsupportedObserveStatement",translationValues:{statement:bodyLine.text},line:bodyLine.line}))}else{validateUnsupportedSyntax(sourceLines4[idx],diagnostics)}idx+=1}if(!closed){diagnostics.push(createDiagnostic({code:"NM-PARSE-021",severity:"error",message:`Unterminated observe block: ${observeMatch[1]}.`,hint:"Close observe blocks with } after the final metric or assertion.",translationKey:"unterminatedObserveBlock",translationValues:{name:observeMatch[1]},line:line.line}))}const observeStatement={kind:"observe",name:observeMatch[1],body,line:line.line};statements.push(observeStatement);continue}if(/^observe\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-022",severity:"error",message:`Invalid observe block syntax: ${line.text}.`,hint:"Use observe report_name { metric p00 = probability(|00>); }",translationKey:"invalidObserveBlock",translationValues:{block:line.text},line:line.line}));continue}if(options.experimental?.classicalFunctions===true&&options.experimental?.typedClassicalValues===true&&(/^(?:if|for)\b/u.test(line.text)||isNMMainResultMatch(sourceLines4,idx,statements))||computeApplyReader&&/^if\b/u.test(line.text)){const parsed=parseNMMainConditional(sourceLines4,idx,{diagnostics,visible:statements,numericNames:[...Object.keys(constants),...Object.keys(params)],feedForward:feedForwardEnabled,parseComputeApply,classicalControl:options.experimental?.classicalFunctions===true&&options.experimental?.typedClassicalValues===true,parseStatement:current=>parseExecutableStatement(current,constants,observables,diagnostics,observableUses,propertyAssertionsEnabled,typedClassicalValuesEnabled,functionResultType,feedForwardEnabled,typedCollectionEnabled)});if(parsed.statement)statements.push(parsed.statement);idx=parsed.end;continue}const simpleIfMatch=line.text.match(new RegExp(`^if\\s*\\(\\s*(${IDENTIFIER_SOURCE4})\\s*(==|!=)\\s*([01])\\s*\\)\\s*\\{\\s*$`,"u"));const extendedIfMatch=simpleIfMatch?void 0:line.text.match(/^if\s*\(\s*(.*?)\s*\)\s*\{\s*$/u);if(simpleIfMatch||extendedIfMatch){const predicateResult=extendedIfMatch?parseNMClassicalPredicate(extendedIfMatch[1]):void 0;if(extendedIfMatch&&!feedForwardEnabled){diagnostics.push(createDiagnostic({code:nmFeedForwardDiagnosticCodes.featureDisabled,severity:"error",message:"Extended measurement-conditioned predicate syntax requires explicit experimental negotiation.",hint:"Set parse options experimental.feedForward=true while evaluating NM-RFC-0011. Stable simple if/else remains available without this flag.",line:line.line}))}if(extendedIfMatch&&predicateResult&&!predicateResult.success){diagnostics.push(createDiagnostic({code:nmFeedForwardDiagnosticCodes.unsupportedPredicate,severity:"error",message:`Unsupported measurement-conditioned predicate: ${extendedIfMatch[1]}.`,hint:predicateResult.reason,line:line.line}))}const body=[];idx+=1;while(idx<sourceLines4.length&&!closesNMSourceBlock(sourceLines4[idx])){const{statement:bodyStmt,end}=parseBlockStatement(idx,[...statements,...body]);idx=end;if(bodyStmt){body.push(bodyStmt)}else if(extendedIfMatch&&feedForwardEnabled&&/^(?:if|until|match|train|sample|qreg)\b|^let\b.*\bqreg\s*\[/u.test(sourceLines4[idx].text)){diagnostics.push(createDiagnostic({code:nmFeedForwardDiagnosticCodes.invalidConditionalBody,severity:"error",message:`Extended conditional body contains unsupported syntax: ${sourceLines4[idx].text}.`,hint:"Move allocation, training, sampling, and nested control regions outside the extended conditional.",line:sourceLines4[idx].line}))}else{validateUnsupportedSyntax(sourceLines4[idx],diagnostics)}idx+=1}const elseBody=[];if(idx+1<sourceLines4.length&&sourceLines4[idx+1].text==="else {"){idx+=2;while(idx<sourceLines4.length&&!closesNMSourceBlock(sourceLines4[idx])){const{statement:bodyStmt,end}=parseBlockStatement(idx,[...statements,...elseBody]);idx=end;if(bodyStmt){elseBody.push(bodyStmt)}else if(extendedIfMatch&&feedForwardEnabled&&/^(?:if|until|match|train|sample|qreg)\b|^let\b.*\bqreg\s*\[/u.test(sourceLines4[idx].text)){diagnostics.push(createDiagnostic({code:nmFeedForwardDiagnosticCodes.invalidConditionalBody,severity:"error",message:`Extended conditional else body contains unsupported syntax: ${sourceLines4[idx].text}.`,hint:"Move allocation, training, sampling, and nested control regions outside the extended conditional.",line:sourceLines4[idx].line}))}else{validateUnsupportedSyntax(sourceLines4[idx],diagnostics)}idx+=1}}if(simpleIfMatch){statements.push({kind:"if",binding:simpleIfMatch[1],operator:simpleIfMatch[2],value:Number.parseInt(simpleIfMatch[3],10),body,...elseBody.length>0?{elseBody}:{},line:line.line})}else if(predicateResult?.success){statements.push({kind:"if",predicate:predicateResult.predicate,body,...elseBody.length>0?{elseBody}:{},line:line.line})}continue}if(/^else\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-006",severity:"error",message:`Unsupported else block without a matching if: ${line.text}.`,hint:"Attach else directly after a supported if block: if (m == 1) { X(q[0]); } else { Z(q[0]); }",translationKey:"unsupportedConditional",translationValues:{conditional:line.text},line:line.line}));continue}const untilMatch=line.text.match(new RegExp(`^until\\s*\\(\\s*(${IDENTIFIER_SOURCE4})\\s*(==|!=)\\s*([01])\\s*\\)\\s+max\\s+(\\d+)\\s*\\{\\s*$`,"u"));if(untilMatch){const declaredMaxIterations=Number.parseInt(untilMatch[4],10);const body=[];let closed=false;idx+=1;while(idx<sourceLines4.length){if(closesNMSourceBlock(sourceLines4[idx])){closed=true;break}const{statement:bodyStmt,end}=parseBlockStatement(idx,[...statements,...body]);idx=end;if(bodyStmt){body.push(bodyStmt)}else{validateUnsupportedSyntax(sourceLines4[idx],diagnostics)}idx+=1}if(!closed){diagnostics.push(createDiagnostic({code:"NM-PARSE-042",severity:"error",message:`Unterminated until block: ${line.text}.`,hint:"Close until blocks with } after the retry body.",translationKey:"invalidUntilBlock",translationValues:{block:line.text},line:line.line}))}if(declaredMaxIterations<1){diagnostics.push(createDiagnostic({code:"NM-PARSE-042",severity:"error",message:`Invalid until max iteration count: ${untilMatch[4]}.`,hint:"Use until (flag == 1) max 10 { ... } with max between 1 and 32.",translationKey:"invalidUntilBlock",translationValues:{block:line.text},line:line.line}))}const maxIterations=Math.min(Math.max(declaredMaxIterations,1),MAX_UNTIL_ITERATIONS);if(declaredMaxIterations>MAX_UNTIL_ITERATIONS){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-009",severity:"warning",message:`until max ${declaredMaxIterations} is capped to ${MAX_UNTIL_ITERATIONS} in the playground runtime.`,hint:"Use a smaller retry budget while experimenting in the browser.",line:line.line}))}const untilStatement={kind:"until",binding:untilMatch[1],operator:untilMatch[2],value:Number.parseInt(untilMatch[3],10),maxIterations,body,line:line.line};statements.push(untilStatement);continue}if(/^until\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-042",severity:"error",message:`Invalid until block syntax: ${line.text}.`,hint:"Use until (flag == 1) max 10 { ... } with a measured or derived Bit.",translationKey:"invalidUntilBlock",translationValues:{block:line.text},line:line.line}));continue}const matchBlock=line.text.match(new RegExp(`^match\\s*\\(\\s*(${IDENTIFIER_SOURCE4}(?:\\s*,\\s*${IDENTIFIER_SOURCE4})*)\\s*\\)\\s*\\{\\s*$`,"u"));if(matchBlock){const bindings3=matchBlock[1].split(",").map(binding=>binding.trim());const cases=[];const seenPatterns=new Set;let closed=false;idx+=1;while(idx<sourceLines4.length){if(closesNMSourceBlock(sourceLines4[idx])){closed=true;break}const caseLine=sourceLines4[idx];const caseMatch=caseLine.text.match(/^\(\s*([01](?:\s*,\s*[01])*)\s*\)\s*=>\s*\{\s*$/);if(!caseMatch){diagnostics.push(createDiagnostic({code:"NM-PARSE-006",severity:"error",message:`Unsupported match case: ${caseLine.text}.`,hint:"Use cases such as (0, 1) => { X(q[2]); } with one 0/1 value per matched Bit.",translationKey:"unsupportedConditional",translationValues:{conditional:caseLine.text},line:caseLine.line}));idx+=1;continue}const pattern=caseMatch[1].split(",").map(part=>Number.parseInt(part.trim(),10));if(pattern.length!==bindings3.length){diagnostics.push(createDiagnostic({code:"NM-PARSE-006",severity:"error",message:`Match case width ${pattern.length} does not match selector width ${bindings3.length}.`,hint:"Use exactly one 0/1 pattern value for each Bit in the match selector.",translationKey:"unsupportedConditional",translationValues:{conditional:caseLine.text},line:caseLine.line}))}const patternKey=pattern.join(",");if(seenPatterns.has(patternKey)){diagnostics.push(createDiagnostic({code:"NM-PARSE-006",severity:"error",message:`Duplicate match case pattern: (${patternKey}).`,hint:"Each match pattern should appear once so export and runtime semantics stay deterministic.",translationKey:"unsupportedConditional",translationValues:{conditional:caseLine.text},line:caseLine.line}))}seenPatterns.add(patternKey);const body=[];idx+=1;while(idx<sourceLines4.length&&!closesNMSourceBlock(sourceLines4[idx])){const{statement:bodyStmt,end}=parseBlockStatement(idx,[...statements,...body]);idx=end;if(bodyStmt){body.push(bodyStmt)}else{validateUnsupportedSyntax(sourceLines4[idx],diagnostics)}idx+=1}cases.push({pattern,body,line:caseLine.line});idx+=1}if(!closed){diagnostics.push(createDiagnostic({code:"NM-PARSE-006",severity:"error",message:`Unterminated match block: ${line.text}.`,hint:"Close match blocks with } after the final case.",translationKey:"unsupportedConditional",translationValues:{conditional:line.text},line:line.line}))}statements.push({kind:"match",bindings:bindings3,cases,line:line.line});continue}if(/^match\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-006",severity:"error",message:`Unsupported match block: ${line.text}.`,hint:"Use match (a, b) { (0, 1) => { X(q[2]); } } with measured or derived Bit names.",translationKey:"unsupportedConditional",translationValues:{conditional:line.text},line:line.line}));continue}if(/^if\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-006",severity:"error",message:`Unsupported conditional: ${line.text}.`,hint:"Use a classical-bit guard such as: if (m == 1) { X(q[1]); }",translationKey:"unsupportedConditional",translationValues:{conditional:line.text},line:line.line}));continue}if(/^for\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-008",severity:"error",message:`Unsupported for loop: ${line.text}.`,hint:"Use an integer range, for example: for i in 0..3 { H(q[i]); }",line:line.line}));continue}const statement=parseExecutableStatement(line,constants,observables,diagnostics,observableUses,propertyAssertionsEnabled,typedClassicalValuesEnabled,functionResultType,feedForwardEnabled,typedCollectionEnabled);if(statement){statements.push(statement);continue}validateUnsupportedSyntax(line,diagnostics)}if(!moduleName){diagnostics.push(createDiagnostic({code:"NM-PARSE-002",severity:"error",message:"Missing module declaration.",hint:"Start with a declaration such as: module bell_state;",translationKey:"missingModule"}))}if(!mainLine){diagnostics.push(createDiagnostic({code:"NM-PARSE-003",severity:"error",message:"Missing fn main() entry point.",hint:"The playground currently executes a single fn main() block.",translationKey:"missingMain"}))}if(numQubits===0){diagnostics.push(createDiagnostic({code:"NM-TYPE-004",severity:"error",message:"No qreg declaration found.",hint:"Declare a register before gates, for example: let q = qreg[2];",translationKey:"missingQreg"}))}const executableQubitLimit=target2==="browser-stabilizer"?nmStabilizerMaxQubits:target2==="browser-mps"||target2==="matrix-product-state"?NM_MPS_MAX_QUBITS:playgroundRuntimeLimits.maxQubits;const executableQubitLimitLabel=target2==="browser-stabilizer"?"browser-stabilizer target":target2==="browser-mps"||target2==="matrix-product-state"?"browser-mps target":"browser playground";if(numQubits>executableQubitLimit){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-002",severity:"error",message:`Too many qubits: ${numQubits}.`,hint:`The ${executableQubitLimitLabel} supports up to ${executableQubitLimit} qubits.`,translationKey:"tooManyQubits",translationValues:{count:numQubits,max:executableQubitLimit}}))}const stdObservableBlockedLines=validateStdObservableRequirements(observableMetadata,observableUses,qregSizes,diagnostics);validateNMQubitReferences(statements,qubitMap,numQubits,diagnostics,stdObservableBlockedLines,computeApply.active);if(feedForwardEnabled){diagnostics.push(...validateNMFeedForwardPredicates(statements))}if(typedClassicalValuesEnabled){if(functionResultType&&loweredFunctions.mainResultType)functionResultType=loweredFunctions.mainResultType;attachClassicalFunctionRuntimeExpressions(statements,loweredFunctions.runtimeExpressions,loweredFunctions.runtimeAngles,loweredFunctions.runtimeConditions,loweredFunctions.runtimeTargets);diagnostics.push(...validateNMTypedClassicalValues(statements,options.experimental?.classicalFunctions===true,{resultContext:Boolean(functionResultType),functionResults:functionResultsEnabled&&options.experimental?.classicalFunctions===true}))}else diagnostics.push(...validateNMDisabledDynamicIndices(statements));if(computeApply.active&&!validateNMComputeApplyProgram(statements,Boolean(noise||mitigation||preprocessed.composedNoise),diagnostics))return failedNMParseResult(diagnostics);const typedCollectionValidation=validateNMTypedCollection(typedCollectionEnabled?preprocessed.typedCollectionRequest:void 0,statements,seed,noise,mitigation);diagnostics.push(...typedCollectionValidation.diagnostics);const typedCollectionBodyLines=new Set(sourceLines4.filter(line=>line.typedCollectionBody===true).map(line=>line.line));const feedForwardSyntaxUsed=feedForwardEnabled&&usesNMFeedForwardSyntax(statements,typedCollectionBodyLines);if(functionResultType&&mainLine){diagnostics.push(...validateNMFunctionResults(statements,functionResultType,mainLine,options.experimental?.classicalFunctions===true))}diagnostics.push(...validateNMTrainingSelections(statements,params,mainLine,loweredFunctions.provenance,options.experimental));if(propertyAssertionsEnabled&&(seed==null||expectationShots==null)){const missing=[seed==null?"@seed":void 0,expectationShots==null?"@shots":void 0].filter(value=>value!=null).join(" and ");for(const assertion of collectFiniteShotPropertyAssertions(statements)){diagnostics.push(createDiagnostic({code:nmPropertyAssertionDiagnosticCodes.deterministicSamplingRequired,severity:"error",message:`Finite-shot tolerance assertions require ${missing}.`,hint:"Declare both @seed(<unsigned integer>); and @shots(<positive integer>); before fn main.",translationKey:"propertyAssertionDeterministicSamplingRequired",translationValues:{missing},line:assertion.line}))}}const parameterizedDepth=statements.filter(statement=>statement.kind==="gate"&&(statement.thetaName||statement.angleNames?.some(Boolean))).length;if(Object.keys(params).length>=nmTrainabilityThresholds.minParams&&numQubits>=nmTrainabilityThresholds.minQubits&¶meterizedDepth>=nmTrainabilityThresholds.minParameterizedDepth)diagnostics.push(createDiagnostic({code:"NM-QML-301",severity:"warning",message:"This ansatz risks vanishing gradients (barren plateau).",hint:"Consider fewer layers, layer-wise training, or an identity-block initialization.",translationKey:"barrenPlateauRisk",line:statements.find(statement=>statement.kind==="param")?.line}));const composedNoise=preprocessed.composedNoise?resolveNMComposedNoiseProgram(preprocessed.composedNoise,{qregSizes,qubitMap,statements,target:target2,seed,sampleShots:preprocessed.sampleShots,numQubits,noise,mitigation,hasQECExperiments:preprocessed.qecExperiments!=null},diagnostics):void 0;let program={...loweredFunctions.provenance?{classicalFunctions:loweredFunctions.provenance}:{},moduleName,...preprocessed.unitaryModifiers.length?{unitaryModifiers:preprocessed.unitaryModifiers}:{},...options.experimental?.moduleVisibility?{moduleVisibility:{experimental:true,declarations:preprocessed.moduleVisibilityDeclarations}}:{},...options.experimental?.exactImports||options.experimental?.genericCircuits||options.experimental?.genericOracles?{imports:{experimentalExact:true,declarations:preprocessed.importDeclarations}}:{},...preprocessed.genericOracles?{genericOracles:preprocessed.genericOracles}:{},...preprocessed.genericCircuits?{genericCircuits:preprocessed.genericCircuits}:{},...preprocessed.qecExperiments?{qecExperiments:preprocessed.qecExperiments}:{},...composedNoise?{composedNoise}:{},...preprocessed.comptimeConstants?{comptimeConstants:preprocessed.comptimeConstants}:{},...propertyAssertionsEnabled?{propertyAssertions:{experimental:true,contractVersion:NM_PROPERTY_ASSERTIONS_CONTRACT_VERSION}}:{},...typedClassicalValuesEnabled?{typedClassicalValues:{experimental:true,contractVersion:NM_TYPED_CLASSICAL_VALUES_CONTRACT_VERSION}}:{},...functionResultType?{functionResults:{experimental:true,contractVersion:NM_FUNCTION_RESULTS_CONTRACT_VERSION,resultType:functionResultType,errorType:"Error"}}:{},...qmlTrainingControlsEnabled?{qmlTrainingControls:{experimental:true,contractVersion:NM_QML_TRAINING_CONTROLS_CONTRACT_VERSION}}:{},...feedForwardSyntaxUsed?{feedForward:{experimental:true,contractVersion:NM_FEED_FORWARD_CONTRACT_VERSION}}:{},...typedCollectionValidation.metadata?{typedCollection:typedCollectionValidation.metadata}:{},compiler,semantics,optimize,estimate,...goals.length>0?{goals}:{},...outcomes.length>0?{outcomes}:{},...rubrics.length>0?{rubrics}:{},...misconceptions.length>0?{misconceptions}:{},...quizzes.length>0?{quizzes}:{},...labs.length>0?{labs}:{},...challenges.length>0?{challenges}:{},...datasets.length>0?{datasets}:{},...checkpoints.length>0?{checkpoints}:{},...hints.length>0?{hints}:{},...concepts.length>0?{concepts}:{},...level?{level}:{},...prerequisites.length>0?{prerequisites}:{},target:target2,constraints,noise,mitigation,seed,expectationShots,sampleShots:preprocessed.sampleShots,functions:mainLine?[{name:"main",body:statements,...functionResultType?{resultType:functionResultType}:{},line:mainLine}]:[],statements};if(targetCapabilityConstraintsEnabled){const evaluation=targetCapabilityRequirement&&!diagnostics.some(diagnostic5=>diagnostic5.severity==="error")?evaluateNMTargetCapabilityConstraint(program,numQubits,targetCapabilityRequirement):void 0;if(evaluation)diagnostics.push(...evaluation.diagnostics);program={...program,targetCapabilityConstraints:{experimental:true,contractVersion:NM_TARGET_CAPABILITY_CONSTRAINTS_CONTRACT_VERSION,...targetCapabilityRequirement?{requirement:targetCapabilityRequirement}:{},...evaluation?{evidence:evaluation.evidence}:{}}}}if(!diagnostics.some(diagnostic5=>diagnostic5.severity==="error")){diagnostics.push(...checkSemantics(program))}if(!diagnostics.some(diagnostic5=>diagnostic5.severity==="error")){analyzeTargetProfile(program,numQubits,diagnostics)}return attachNMComptimeStructureProvenance(code,{program,diagnostics,sourceLines:sourceLines4.map(stripNMTokenLineBoundary),qubitMap,constants,params,numQubits})}function parseOptimizeAnnotation(body,line,diagnostics){const optimize={optimizer:"gd",steps:40,learningRate:.2,objective:"minimize",line:line.line};const parts=body.split(",").map(part=>part.trim()).filter(part=>part.length>0);const warn=message=>{diagnostics.push(createDiagnostic({code:"NM-RUNTIME-022",severity:"warning",message,hint:'Use @optimize(method: "adam", steps: 40, learningRate: 0.2, objective: "minimize");',translationKey:"invalidOptimizeAnnotation",translationValues:{annotation:line.text},line:line.line}))};for(const part of parts){const match=part.match(/^([A-Za-z_]\w*)\s*:\s*(.+)$/);if(!match){warn(`Invalid @optimize field: ${part}.`);continue}const key4=match[1];const value=match[2].trim();if(key4==="method"||key4==="optimizer"){const method=value.match(/^"(gd|momentum|adam)"$/);if(!method){warn(`Invalid @optimize method: ${value}.`);continue}optimize.optimizer=method[1];continue}if(key4==="objective"){const objective=value.match(/^"(minimize|maximize)"$/);if(!objective){warn(`Invalid @optimize objective: ${value}.`);continue}optimize.objective=objective[1];continue}if(key4==="steps"){if(!/^\d+$/.test(value)){warn(`Invalid @optimize steps: ${value}.`);continue}optimize.steps=Math.min(Math.max(Number.parseInt(value,10),1),100);continue}if(key4==="learningRate"){if(!/^\d+(?:\.\d+)?$/.test(value)){warn(`Invalid @optimize learningRate: ${value}.`);continue}optimize.learningRate=Math.min(Math.max(Number.parseFloat(value),.001),2);continue}warn(`Unknown @optimize field: ${key4}.`)}return optimize}var numericAnnotationPattern=/^-?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?$/i;function parseEstimateAnnotation(body,line,diagnostics){const estimate={code:"surface",distance:7,line:line.line};const parts=body.split(",").map(part=>part.trim()).filter(part=>part.length>0);const warn=message=>{diagnostics.push(createDiagnostic({code:"NM-PARSE-047",severity:"warning",message,hint:'Use @estimate(code: "surface", distance: 7, target_error: 1e-3);',translationKey:"invalidEstimateAnnotation",translationValues:{annotation:line.text},line:line.line}))};if(parts.length===0){warn("Empty @estimate annotation.");return estimate}for(const part of parts){const match=part.match(/^([A-Za-z_]\w*)\s*:\s*(.+)$/);if(!match){warn(`Invalid @estimate field: ${part}.`);continue}const key4=match[1];const value=match[2].trim();if(key4==="code"){const code=value.match(/^"(surface)"$/);if(!code){warn(`Invalid @estimate code: ${value}.`);continue}estimate.code=code[1];continue}if(key4==="distance"){if(!/^\d+$/.test(value)){warn(`Invalid @estimate distance: ${value}.`);continue}const distance=Number.parseInt(value,10);estimate.distance=Math.min(Math.max(distance,3),101);continue}if(key4==="target_error"||key4==="targetError"){if(!numericAnnotationPattern.test(value)){warn(`Invalid @estimate target_error: ${value}.`);continue}const targetError=Number.parseFloat(value);if(!Number.isFinite(targetError)||targetError<=0||targetError>=1){warn(`Invalid @estimate target_error: ${value}.`);continue}estimate.targetError=targetError;continue}if(key4==="physical_gate_time_ns"||key4==="physicalGateTimeNs"){if(!numericAnnotationPattern.test(value)){warn(`Invalid @estimate physical_gate_time_ns: ${value}.`);continue}const gateTime=Number.parseFloat(value);if(!Number.isFinite(gateTime)||gateTime<=0){warn(`Invalid @estimate physical_gate_time_ns: ${value}.`);continue}estimate.physicalGateTimeNs=Math.min(gateTime,1e6);continue}warn(`Unknown @estimate field: ${key4}.`)}return estimate}function parseConstraintsAnnotation(body,line,diagnostics){const constraints={};const parts=body.split(",").map(part=>part.trim()).filter(part=>part.length>0);if(parts.length===0){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-015",severity:"warning",message:"Empty @constraints annotation.",hint:'Use fields such as @constraints(maxDepth: 8, maxTwoQubit: 4, connectivity: "line").',translationKey:"invalidConstraintsAnnotation",line:line.line}));return constraints}for(const part of parts){const match=part.match(/^([A-Za-z_]\w*)\s*:\s*(.+)$/);if(!match){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-015",severity:"warning",message:`Invalid @constraints field: ${part}.`,hint:'Use key/value fields such as maxDepth: 8, maxTwoQubit: 4, connectivity: "line".',translationKey:"invalidConstraintsAnnotation",line:line.line}));continue}const key4=match[1];const value=match[2].trim();if(key4==="maxDepth"||key4==="maxTwoQubit"||key4==="maxQubits"){if(!/^\d+$/.test(value)){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-015",severity:"warning",message:`Invalid numeric @constraints value for ${key4}: ${value}.`,hint:"Constraint budgets must be non-negative integers.",translationKey:"invalidConstraintsAnnotation",line:line.line}));continue}const parsed=Number.parseInt(value,10);if(key4==="maxDepth"){constraints.maxDepth=parsed}else if(key4==="maxTwoQubit"){constraints.maxTwoQubit=parsed}else{constraints.maxQubits=parsed}continue}if(key4==="connectivity"){const connectivityMatch=value.match(/^"(all-to-all|line|grid)"$/);if(!connectivityMatch){diagnostics.push(createDiagnostic({code:"NM-RUNTIME-015",severity:"warning",message:`Invalid @constraints connectivity: ${value}.`,hint:'Use connectivity: "all-to-all", "line", or "grid".',translationKey:"invalidConstraintsAnnotation",line:line.line}));continue}constraints.connectivity=connectivityMatch[1];continue}diagnostics.push(createDiagnostic({code:"NM-RUNTIME-015",severity:"warning",message:`Unknown @constraints field: ${key4}.`,hint:"Supported fields are maxQubits, maxDepth, maxTwoQubit, and connectivity.",translationKey:"invalidConstraintsAnnotation",line:line.line}))}return constraints}function parseConst(line,constants,diagnostics){const match=line.text.match(/^const\s+([A-Za-z_]\w*)(?:\s*:\s*(Angle|Float|Int))?\s*=\s*([^;]+?)\s*;?$/);if(!match){return void 0}const value=evaluateAngleExpression(match[3],constants);if(value==null){diagnostics.push(createDiagnostic({code:"NM-PARSE-007",severity:"error",message:`Invalid constant expression: ${match[3]}.`,hint:"Use numbers, PI, earlier constants and + - * / , for example: const theta: Angle = PI / 4;",translationKey:"invalidConstantExpression",translationValues:{expression:match[3]},line:line.line}));return void 0}return{kind:"const",name:match[1],valueType:match[2],sourceExpression:match[3],value,line:line.line}}function parseParam(line,constants,diagnostics){const match=line.text.match(/^param\s+([A-Za-z_]\w*)(?:\s*:\s*Angle)?\s*=\s*([^;]+?)\s*;?$/);if(!match){return void 0}const value=evaluateAngleExpression(match[2],constants);if(value==null){diagnostics.push(createDiagnostic({code:"NM-PARSE-007",severity:"error",message:`Invalid parameter expression: ${match[2]}.`,hint:"Use a number, PI, or arithmetic, for example: param theta: Angle = 0.1;",translationKey:"invalidParameterExpression",translationValues:{expression:match[2]},line:line.line}));return void 0}return{kind:"param",name:match[1],value,line:line.line}}function parseReset(line){const match=line.text.match(/^reset\s+([A-Za-z_]\w*)(?:\[(\d+)\])?\s*;?$/);if(!match){return void 0}return{kind:"reset",target:toQubitRef(match[1],match[2]),line:line.line}}function splitPauliTerms(expr){const terms=[];let depth3=0;let start=0;for(let i=0;i<expr.length;i+=1){const char=expr[i];if(char==="("){depth3+=1;continue}if(char===")"){depth3=Math.max(0,depth3-1);continue}if(depth3!==0||char!=="+"&&char!=="-"){continue}const before=expr.slice(0,i).trimEnd();const previous=before[before.length-1];const isUnarySign=!previous||"+-*/(".includes(previous);if(isUnarySign){continue}terms.push(expr.slice(start,i).trim());start=i}terms.push(expr.slice(start).trim());return terms.filter(term=>term.length>0)}function evaluatePauliCoeff(source,constants){const trimmed=source.trim().replace(/\*\s*$/,"").trim();if(trimmed.length===0){return 1}return evaluateAngleExpression(trimmed,constants)}function parsePauliSum(expr,constants){const factorPattern=/([XYZ])\s*\(\s*([A-Za-z_]\w*)\[(\d+)\]\s*\)/g;const termSources=splitPauliTerms(expr);const terms=[];if(termSources.length===0){return void 0}for(const source of termSources){const sign=source.trimStart().startsWith("-")?-1:1;const unsigned=source.trimStart().replace(/^[+-]\s*/,"");const factorMatches=[...unsigned.matchAll(factorPattern)];if(factorMatches.length>0){const firstFactorIndex=factorMatches[0].index??0;const factorSource=unsigned.slice(firstFactorIndex);if(factorSource.replace(factorPattern,"").trim()!==""){return void 0}const coeff2=evaluatePauliCoeff(unsigned.slice(0,firstFactorIndex),constants);if(coeff2==null){return void 0}terms.push({coeff:sign*coeff2,...coefficientProvenance(unsigned.slice(0,firstFactorIndex),sign),factors:factorMatches.map(factorMatch=>({observable:factorMatch[1],target:toQubitRef(factorMatch[2],factorMatch[3])}))});continue}if(unsigned==="I"){terms.push({coeff:sign,factors:[]});continue}const identityMatch=unsigned.match(/^(.+?)(?:\s*\*\s*|\s+)I$/);if(!identityMatch){return void 0}const coeff=evaluatePauliCoeff(identityMatch[1],constants);if(coeff==null){return void 0}terms.push({coeff:sign*coeff,...coefficientProvenance(identityMatch[1],sign),factors:[]})}return terms.length>0?terms:void 0}function cloneTerms(terms){return terms.map(term=>({coeff:term.coeff,...term.coefficientExpression?{coefficientExpression:term.coefficientExpression}:{},factors:term.factors.map(factor=>({observable:factor.observable,target:{register:factor.target.register,index:factor.target.index}}))}))}function unknownObservableDiagnostic(name2,line,diagnostics){diagnostics.push(createDiagnostic({code:"NM-PARSE-010",severity:"error",message:`Unknown observable: ${name2}.`,hint:"Declare it before use, for example: observable H = Z(q[0]) + X(q[1]);",translationKey:"unknownObservable",translationValues:{name:name2},line:line.line}))}function resolveExpectationTerms(expr,line,constants,observables,diagnostics,observableUses){if(/^[A-Za-z_]\w*$/.test(expr)){const named=observables[expr];if(named){observableUses?.push({name:expr,line:line.line});return cloneTerms(named)}unknownObservableDiagnostic(expr,line,diagnostics);return void 0}return parsePauliSum(expr,constants)}function parseObservable(line,constants,observables,observableNames,observableMetadata,diagnostics){const match=line.text.match(/^observable\s+([A-Za-z_]\w*)\s*=\s*(.+?)\s*;?$/);if(!match){return false}if(observableNames.has(match[1])){diagnostics.push(createDiagnostic({code:"NM-TYPE-019",severity:"error",message:`Observable name collision: ${match[1]}.`,hint:"Rename the user observable or choose a standard-library Hamiltonian with a different exported name.",translationKey:"stdObservableCollision",translationValues:{name:match[1]},line:line.line}));return true}const terms=parsePauliSum(match[2],constants);if(!terms){diagnostics.push(createDiagnostic({code:"NM-PARSE-009",severity:"error",message:`Invalid observable definition: ${match[2]}.`,hint:"Define observables as a weighted Pauli sum, for example: observable H = shift * I + J * Z(q[0]) Z(q[1]);",translationKey:"invalidObservable",translationValues:{name:match[1]},line:line.line}));return true}observables[match[1]]=terms;observableNames.add(match[1]);const stdImport=line.stdImport;const stdEntry=stdImport?getNMStdLibraryEntry(stdImport):void 0;observableMetadata[match[1]]={name:match[1],stdImport:stdEntry?.kind==="observable"?stdImport:void 0,minQubits:stdEntry?.kind==="observable"?stdEntry.minQubits:void 0,registers:[...new Set(terms.flatMap(term=>term.factors.map(factor=>factor.target.register)))],line:line.line};return true}function parseExpectation(line,constants,observables,diagnostics,observableUses){const head=line.text.match(/^(?:let\s+([A-Za-z_]\w*)\s*=\s*)?expect\s+(.+?)\s*;?$/);if(!head){return void 0}const expr=head[2].trim();const terms=resolveExpectationTerms(expr,line,constants,observables,diagnostics,observableUses);if(!terms){return void 0}return{kind:"expectation",binding:head[1],terms,line:line.line}}function parseMetric(line,constants,observables,diagnostics,observableUses){const match=line.text.match(/^metric\s+([A-Za-z_]\w*)\s*=\s*(.+?)\s*;?$/);if(!match){return void 0}const name2=match[1];const expression=match[2].trim();const probabilityMatch=expression.match(/^probability\s*\(\s*\|([01]+)>\s*\)$/);if(probabilityMatch){return{kind:"metric",name:name2,expression:{kind:"probability",state:probabilityMatch[1]},line:line.line}}const expectationMatch=expression.match(/^expect\s+(.+)$/);if(expectationMatch){const terms=resolveExpectationTerms(expectationMatch[1].trim(),line,constants,observables,diagnostics,observableUses);if(!terms){return void 0}return{kind:"metric",name:name2,expression:{kind:"expectation",terms},line:line.line}}diagnostics.push(createDiagnostic({code:"NM-PARSE-020",severity:"error",message:`Invalid metric expression: ${expression}.`,hint:"Use metric bell = probability(|00>); or metric energy = expect H;",translationKey:"invalidMetricExpression",translationValues:{expression},line:line.line}));return void 0}function parseGradient(line,diagnostics){const match=line.text.match(/^let\s+([A-Za-z_]\w*)\s*=\s*gradient\s+([A-Za-z_]\w*)\s+wrt\s+([A-Za-z_]\w*)\s*;?$/);if(!match){if(/\bgradient\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-029",severity:"error",message:`Invalid gradient statement: ${line.text}.`,hint:"Use let g = gradient cost wrt theta; after binding an expectation such as let cost = expect Z(q[0]);",translationKey:"invalidGradientStatement",translationValues:{statement:line.text},line:line.line}))}return void 0}return{kind:"gradient",binding:match[1],target:match[2],parameter:match[3],line:line.line}}function parseEncode(line,diagnostics){const match=line.text.match(/^encode\s*\(\s*sample_row\s*\(\s*(\d+)?\s*\)\s*,\s*([A-Za-z_]\w*)\s*,\s*method\s*:\s*"(angle|reupload|amplitude|iqp)"\s*\)\s*;?$/);if(!match){if(/^encode\b/.test(line.text)){diagnostics.push(createDiagnostic({code:"NM-PARSE-036",severity:"error",message:`Invalid encode statement: ${line.text}.`,hint:'Use encode(sample_row(), q, method: "angle" | "reupload" | "amplitude" | "iqp"); after @dataset.',translationKey:"invalidEncodeStatement",translationValues:{statement:line.text},line:line.line}))}return void 0}return{kind:"encode",row:match[1]!=null?Number.parseInt(match[1],10):0,register:match[2],method:match[3],line:line.line}}function parseQReg(line,diagnostics){const typedMatch=line.text.match(/^let\s+([A-Za-z_]\w*)\s*:\s*QReg<(\d+)>\s*=\s*qreg\[(\d+)\]\s*;?$/);const letMatch=line.text.match(/^let\s+([A-Za-z_]\w*)\s*=\s*qreg\[(\d+)\]\s*;?$/);const legacyMatch=line.text.match(/^qreg\s+([A-Za-z_]\w*)\[(\d+)\]\s*;?$/);const match=typedMatch??letMatch??legacyMatch;if(!match){return void 0}const name2=match[1];const declaredSize=typedMatch?Number.parseInt(typedMatch[2],10):void 0;const sizeText=typedMatch?typedMatch[3]:match[2];const size=Number.parseInt(sizeText,10);if(size<=0){diagnostics.push(createDiagnostic({code:"NM-TYPE-003",severity:"error",message:`Invalid qreg size: ${sizeText}.`,hint:"Use a positive register size such as qreg[2].",translationKey:"invalidQregSize",translationValues:{size:sizeText},line:line.line}))}if(declaredSize!=null&&declaredSize!==size){diagnostics.push(createDiagnostic({code:"NM-TYPE-005",severity:"error",message:`QReg type size ${declaredSize} does not match qreg allocation size ${size}.`,hint:"Keep the type and allocation aligned, for example: let q: QReg<2> = qreg[2];",translationKey:"qregSizeMismatch",translationValues:{declared:declaredSize,allocated:size},line:line.line}))}return{kind:"qreg",name:name2,size,declaredSize,...line.comptimeQReg?.allocated?{sizeSource:line.comptimeQReg?.allocated}:{},...line.comptimeQReg?.declared?{declaredSizeSource:line.comptimeQReg?.declared}:{},line:line.line}}function parseExplain(line,diagnostics){if(!/^@explain\b/.test(line.text)){return void 0}const match=line.text.match(/^@explain\s*\(\s*"((?:\\.|[^"\\])*)"\s*\)\s*;?$/);if(!match){diagnostics.push(createDiagnostic({code:"NM-PARSE-023",severity:"warning",message:`Invalid @explain annotation: ${line.text}.`,hint:'Use @explain("Describe this step."); before the statement you want to document.',translationKey:"invalidExplainAnnotation",translationValues:{annotation:line.text},line:line.line}));return void 0}return{kind:"explain",text:match[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\"),line:line.line}}function isObserveBodyStatement(statement){return statement.kind==="metric"||statement.kind==="expectation"||statement.kind==="assertProbability"||statement.kind==="assertExpectation"||statement.kind==="assertExpectationRange"||statement.kind==="assertEntangled"||statement.kind==="assertFidelity"||statement.kind==="assertEquivalent"||statement.kind==="assertResource"}function parseExecutableStatementCore(line,constants,observables,diagnostics,observableUses,propertyAssertionsEnabled=false,typedClassicalValuesEnabled=false,functionResultType,feedForwardEnabled=false,typedCollectionEnabled=false,functionAngles){const anglePlaceholder=/^const\s+(__nm_cfn_angle_\d+)\s*:\s*Float\s*=\s*0\.0\s*;?$/u.exec(line.text);if(typedClassicalValuesEnabled&&anglePlaceholder&&functionAngles?.has(anglePlaceholder[1])){const placeholder=parseConst(line,constants,diagnostics);if(placeholder){constants[placeholder.name]=placeholder.value;return placeholder}}const explain=parseExplain(line,diagnostics);if(explain){return explain}if(/^@explain\b/.test(line.text)){return void 0}const encode=parseEncode(line,diagnostics);if(encode){return encode}if(/^encode\b/.test(line.text)){return void 0}const branchInvariant=parseNMBranchInvariantAssertion(line,diagnostics,feedForwardEnabled);if(branchInvariant){return branchInvariant}if(/^assert_branch_invariant\b/u.test(line.text)){return void 0}const gate=parseGate(line,constants,diagnostics);if(gate){return gate}const reset=parseReset(line);if(reset){return reset}if(/^barrier\s*;?$/.test(line.text)){return{kind:"barrier",line:line.line}}const show=parseShow(line,diagnostics);if(show){return show}if(/^show\b/.test(line.text)){return void 0}const expectation=parseExpectation(line,constants,observables,diagnostics,observableUses);if(expectation){return expectation}const metric=parseMetric(line,constants,observables,diagnostics,observableUses);if(metric){return metric}if(/^metric\b/.test(line.text)){return void 0}const gradient=parseGradient(line,diagnostics);if(gradient){return gradient}if(/\bgradient\b/.test(line.text)){return void 0}const expectationAssertion=parseExpectationAssertion(line,constants,observables,diagnostics,observableUses,propertyAssertionsEnabled);if(expectationAssertion){return expectationAssertion}if(/^assert\s+expectation\b/.test(line.text)){return void 0}const entanglementAssertion=parseEntanglementAssertion(line,diagnostics);if(entanglementAssertion){return entanglementAssertion}if(/^assert\s+entangled\b/.test(line.text)){return void 0}const fidelityAssertion=parseFidelityAssertion(line,diagnostics);if(fidelityAssertion){return fidelityAssertion}if(/^assert\s+fidelity\b/.test(line.text)){return void 0}const equivalentAssertion=parseEquivalentAssertion(line,diagnostics,propertyAssertionsEnabled);if(equivalentAssertion){return equivalentAssertion}if(/^assert\s+equivalent\b/.test(line.text)){return void 0}const resourceAssertion=parseResourceAssertion(line,diagnostics);if(resourceAssertion){return resourceAssertion}if(/^assert\s+(?:depth|gates|twoQubitCount|measurements)\b/.test(line.text)){return void 0}const measurement=parseMeasurement(line);if(measurement){return measurement}const measurementBinding=parseNMMeasurementBinding(line,diagnostics,feedForwardEnabled||typedCollectionEnabled&&line.typedCollectionBody===true);if(measurementBinding){return measurementBinding}const classicalDeclaration=parseNMClassicalDeclaration(line.text,line.line,typedClassicalValuesEnabled);diagnostics.push(...classicalDeclaration.diagnostics);if(classicalDeclaration.statement){return classicalDeclaration.statement}if(classicalDeclaration.candidate){return void 0}const syndrome=parseSyndromeMeasurement(line,diagnostics);if(syndrome){return syndrome}if(/^let\s+[A-Za-z_]\w*\s*:\s*Bit\s*=\s*syndrome\b/.test(line.text)){return void 0}const bitAssignment=parseBitAssignment(line,diagnostics);if(bitAssignment){return bitAssignment}if(new RegExp(`^let\\s+${IDENTIFIER_SOURCE4}\\s*:\\s*Bit\\s*=`,"u").test(line.text)){return void 0}const functionResult=parseNMFunctionResultReturn(line,functionResultType);diagnostics.push(...functionResult.diagnostics);if(functionResult.statement){return functionResult.statement}if(functionResult.candidate){return void 0}const returnStmt=parseReturn(line,diagnostics);if(returnStmt){return returnStmt}return parseProbabilityAssertion(line,diagnostics,propertyAssertionsEnabled)}function parseShow(line,diagnostics){if(!/^show\b/.test(line.text)){return void 0}if(/^show\s+state\s*;?$/.test(line.text)){return{kind:"show",subject:"state",line:line.line}}diagnostics.push(createDiagnostic({code:"NM-PARSE-046",severity:"error",message:`Invalid show statement: ${line.text}.`,hint:"Use show state; to print the current state vector in Dirac notation.",translationKey:"invalidShowStatement",translationValues:{statement:line.text},line:line.line}));return void 0}function parseGate(line,constants,diagnostics){const singleGateMatch=line.text.match(/^(Sdg|Tdg|H|X|Y|Z|S|T)\s*\(\s*([A-Za-z_]\w*)(?:\[(\d+)\])?\s*\)\s*;?$/);if(singleGateMatch){return{kind:"gate",gate:singleGateMatch[1],targets:[toQubitRef(singleGateMatch[2],singleGateMatch[3])],line:line.line}}const twoQubitMatch=line.text.match(/^(CNOT|CZ|SWAP|iSWAP|CY|CH)\s*\(\s*([A-Za-z_]\w*)\[(\d+)\]\s*,\s*([A-Za-z_]\w*)\[(\d+)\]\s*\)\s*;?$/);if(twoQubitMatch){return{kind:"gate",gate:twoQubitMatch[1],targets:[toQubitRef(twoQubitMatch[2],twoQubitMatch[3]),toQubitRef(twoQubitMatch[4],twoQubitMatch[5])],line:line.line}}const threeQubitMatch=line.text.match(/^(CCNOT|CSWAP)\s*\(\s*([A-Za-z_]\w*)\[(\d+)\]\s*,\s*([A-Za-z_]\w*)\[(\d+)\]\s*,\s*([A-Za-z_]\w*)\[(\d+)\]\s*\)\s*;?$/);if(threeQubitMatch){return{kind:"gate",gate:threeQubitMatch[1],targets:[toQubitRef(threeQubitMatch[2],threeQubitMatch[3]),toQubitRef(threeQubitMatch[4],threeQubitMatch[5]),toQubitRef(threeQubitMatch[6],threeQubitMatch[7])],line:line.line}}const globalPhaseMatch=line.text.match(/^GPhase\s*\(\s*(.+)\)\s*;?$/);if(globalPhaseMatch){const thetaSource=globalPhaseMatch[1].trim();const theta=evaluateAngleExpression(thetaSource,constants);const isLiteral=/^-?\d+(?:\.\d+)?$/.test(thetaSource);if(theta==null){diagnostics.push(createDiagnostic({code:"NM-TYPE-006",severity:"error",message:`Invalid rotation angle: ${thetaSource}.`,hint:"Use a number, PI, or a declared constant, for example: GPhase(PI / 4);",translationKey:"invalidRotationAngle",translationValues:{angle:thetaSource,example:"GPhase(PI / 4);"},line:line.line}))}return{kind:"gate",gate:"GPhase",targets:[],theta:theta??0,thetaName:isLiteral?void 0:thetaSource,line:line.line}}const rotationMatch=line.text.match(/^(Rx|Ry|Rz|P)\s*\(\s*([A-Za-z_]\w*)\[(\d+)\]\s*,\s*(.+)\)\s*;?$/);if(rotationMatch){const thetaSource=rotationMatch[4].trim();const theta=evaluateAngleExpression(thetaSource,constants);const isLiteral=/^-?\d+(?:\.\d+)?$/.test(thetaSource);if(theta==null){diagnostics.push(createDiagnostic({code:"NM-TYPE-006",severity:"error",message:`Invalid rotation angle: ${thetaSource}.`,hint:"Use a number, PI, or a declared constant, for example: Ry(q[0], PI / 2);",translationKey:"invalidRotationAngle",translationValues:{angle:thetaSource,example:"Ry(q[0], PI / 2);"},line:line.line}))}return{kind:"gate",gate:rotationMatch[1],targets:[toQubitRef(rotationMatch[2],rotationMatch[3])],theta:theta??0,thetaName:isLiteral?void 0:thetaSource,line:line.line}}const uMatch=line.text.match(/^U\s*\(\s*([A-Za-z_]\w*)\[(\d+)\]\s*,\s*([^,]+)\s*,\s*([^,]+)\s*,\s*(.+)\)\s*;?$/);if(uMatch){const angleSources=[uMatch[3].trim(),uMatch[4].trim(),uMatch[5].trim()];const angles=angleSources.map(source=>evaluateAngleExpression(source,constants));angles.forEach((angle,index)=>{if(angle==null){diagnostics.push(createDiagnostic({code:"NM-TYPE-006",severity:"error",message:`Invalid rotation angle: ${angleSources[index]}.`,hint:"Use numbers, PI, or declared constants, for example: U(q[0], PI / 2, 0, PI);",translationKey:"invalidRotationAngle",translationValues:{angle:angleSources[index],example:"U(q[0], PI / 2, 0, PI);"},line:line.line}))}});const numericAngles=angles.map(angle=>angle??0);return{kind:"gate",gate:"U",targets:[toQubitRef(uMatch[1],uMatch[2])],theta:numericAngles[0],thetaName:/^-?\d+(?:\.\d+)?$/.test(angleSources[0])?void 0:angleSources[0],angles:numericAngles,angleNames:angleSources.map(source=>/^-?\d+(?:\.\d+)?$/.test(source)?"":source),line:line.line}}const twoQubitRotationMatch=line.text.match(/^(RXX|RYY|RZZ)\s*\(\s*([A-Za-z_]\w*)\[(\d+)\]\s*,\s*([A-Za-z_]\w*)\[(\d+)\]\s*,\s*(.+)\)\s*;?$/);if(twoQubitRotationMatch){const thetaSource=twoQubitRotationMatch[6].trim();const theta=evaluateAngleExpression(thetaSource,constants);const isLiteral=/^-?\d+(?:\.\d+)?$/.test(thetaSource);if(theta==null){diagnostics.push(createDiagnostic({code:"NM-TYPE-006",severity:"error",message:`Invalid rotation angle: ${thetaSource}.`,hint:"Use a number, PI, or a declared constant, for example: RZZ(q[0], q[1], PI / 2);",translationKey:"invalidRotationAngle",translationValues:{angle:thetaSource,example:"RZZ(q[0], q[1], PI / 2);"},line:line.line}))}return{kind:"gate",gate:twoQubitRotationMatch[1],targets:[toQubitRef(twoQubitRotationMatch[2],twoQubitRotationMatch[3]),toQubitRef(twoQubitRotationMatch[4],twoQubitRotationMatch[5])],theta:theta??0,thetaName:isLiteral?void 0:thetaSource,line:line.line}}const controlledRotationMatch=line.text.match(/^(CRy|CRz|CP)\s*\(\s*([A-Za-z_]\w*)\[(\d+)\]\s*,\s*([A-Za-z_]\w*)\[(\d+)\]\s*,\s*(.+)\)\s*;?$/);if(controlledRotationMatch){const thetaSource=controlledRotationMatch[6].trim();const theta=evaluateAngleExpression(thetaSource,constants);const isLiteral=/^-?\d+(?:\.\d+)?$/.test(thetaSource);if(theta==null){diagnostics.push(createDiagnostic({code:"NM-TYPE-006",severity:"error",message:`Invalid rotation angle: ${thetaSource}.`,hint:"Use a number, PI, or a declared constant, for example: CRz(q[0], q[1], PI / 2);",translationKey:"invalidRotationAngle",translationValues:{angle:thetaSource,example:"CRz(q[0], q[1], PI / 2);"},line:line.line}))}return{kind:"gate",gate:controlledRotationMatch[1],targets:[toQubitRef(controlledRotationMatch[2],controlledRotationMatch[3]),toQubitRef(controlledRotationMatch[4],controlledRotationMatch[5])],theta:theta??0,thetaName:isLiteral?void 0:thetaSource,line:line.line}}const gateLike=line.text.match(/^([A-Za-z_]\w*)\s*\(/);if(gateLike&&!["fn","return","measure","measure_all"].includes(gateLike[1])){const gate=gateLike[1];const supported=SUPPORTED_GATES.includes(gate);if(!supported){const suggestion=findClosestGate(gate);diagnostics.push(createDiagnostic({code:"NM-RUNTIME-001",severity:"error",message:`Unknown or unsupported gate: ${gate}.`,hint:suggestion?`Did you mean ${suggestion}(q[0])?`:`Supported operations: ${playgroundRuntimeLimits.supportedGates.join(", ")}.`,translationKey:"unsupportedGate",translationValues:{gate},hintTranslationKey:suggestion?"unsupportedGateSuggestion":"unsupportedGateSupported",hintTranslationValues:suggestion?{suggestion:`${suggestion}(q[0])`}:{operations:playgroundRuntimeLimits.supportedGates.join(", ")},line:line.line}))}}return void 0}function parseMeasurement(line){const match=line.text.match(new RegExp(`^(?:let\\s+(${IDENTIFIER_SOURCE4})(?:\\s*:\\s*(Bit))?\\s*=\\s*)?measure\\s*(?:(X|Y|Z)\\s*)?\\(\\s*(${IDENTIFIER_SOURCE4})(?:\\[(\\d+)\\])?\\s*\\)\\s*;?$`,"u"));if(!match){return void 0}return{kind:"measurement",binding:match[1],bindingType:match[2],basis:match[3],target:toQubitRef(match[4],match[5]),line:line.line}}function parseSyndromeFactors(expr){const factorPattern=/([XYZ])\s*\(\s*([A-Za-z_]\w*)\[(\d+)\]\s*\)/g;const matches=[...expr.matchAll(factorPattern)];if(matches.length===0||expr.replace(factorPattern,"").trim()!==""){return void 0}return matches.map(match=>({observable:match[1],target:toQubitRef(match[2],match[3])}))}function parseSyndromeMeasurement(line,diagnostics){const match=line.text.match(/^let\s+([A-Za-z_]\w*)\s*:\s*Bit\s*=\s*syndrome\s+(.+?)\s*;?$/);if(!match){return void 0}const factors=parseSyndromeFactors(match[2]);if(!factors){diagnostics.push(createDiagnostic({code:"NM-PARSE-013",severity:"error",message:`Invalid syndrome measurement: ${match[2]}.`,hint:"Use a Pauli string, for example: let s: Bit = syndrome Z(q[0]) Z(q[1]);",translationKey:"invalidSyndromeMeasurement",translationValues:{expression:match[2]},line:line.line}));return void 0}const seenTargets=new Set;for(const factor of factors){const key4=qubitRefKey3(factor.target);if(seenTargets.has(key4)){diagnostics.push(createDiagnostic({code:"NM-TYPE-012",severity:"error",message:`Duplicate qubit in syndrome measurement: ${key4}.`,hint:"A syndrome Pauli string can reference each qubit at most once.",translationKey:"duplicateSyndromeQubit",translationValues:{qubit:key4},line:line.line}))}seenTargets.add(key4)}return{kind:"syndrome",binding:match[1],factors,line:line.line}}function parseBitAssignment(line,diagnostics){const match=line.text.match(new RegExp(`^let\\s+(${IDENTIFIER_SOURCE4})\\s*:\\s*Bit\\s*=\\s*(.+?)\\s*;?$`,"u"));if(!match){return void 0}const expression=parseNMBitExpression(match[2]);if(!expression){diagnostics.push(createDiagnostic({code:"NM-PARSE-012",severity:"error",message:`Invalid Bit expression: ${match[2]}.`,hint:"Use measured bits with not/and/xor/or, for example: let parity: Bit = a xor b;",translationKey:"invalidBitExpression",translationValues:{expression:match[2]},line:line.line}));return void 0}return{kind:"bitAssign",name:match[1],expression,line:line.line}}function pushPropertyAssertionsFeatureDisabledDiagnostic(line,diagnostics){if(diagnostics.some(diagnostic5=>diagnostic5.code===nmPropertyAssertionDiagnosticCodes.featureDisabled&&diagnostic5.line===line.line)){return}diagnostics.push(createDiagnostic({code:nmPropertyAssertionDiagnosticCodes.featureDisabled,severity:"error",message:"Property assertion syntax requires the experimental parser flag.",hint:"Set parse options experimental.propertyAssertions=true while evaluating NM-RFC-0003.",translationKey:"propertyAssertionsFeatureDisabled",line:line.line}))}function parseProbabilityAssertion(line,diagnostics,propertyAssertionsEnabled=false){const experimentalCandidate=/^assert\s+probability\b/.test(line.text)&&/(?:~=|\btolerance\b)/.test(line.text);if(experimentalCandidate){if(!propertyAssertionsEnabled){pushPropertyAssertionsFeatureDisabledDiagnostic(line,diagnostics);return void 0}const approximate=line.text.match(/^assert\s+probability\s*\(\s*\|([01]+)>\s*\)\s*~=\s*(0(?:\.\d+)?|1(?:\.0+)?)\s+tolerance\s+(\d+(?:\.\d+)?)\s*;?$/);const tolerance=approximate?Number.parseFloat(approximate[3]):Number.NaN;if(!approximate||!Number.isFinite(tolerance)||tolerance<=0||tolerance>NM_PROPERTY_ASSERTION_MAX_TOLERANCE){diagnostics.push(createDiagnostic({code:nmPropertyAssertionDiagnosticCodes.invalidAssertion,severity:"error",message:`Invalid finite-shot probability assertion: ${line.text}.`,hint:`Use assert probability(|0>) ~= 0.5 tolerance 0.1; with 0 < tolerance <= ${NM_PROPERTY_ASSERTION_MAX_TOLERANCE}.`,translationKey:"invalidPropertyProbabilityAssertion",translationValues:{expression:line.text},line:line.line}));return void 0}return{kind:"assertProbability",state:approximate[1],operator:"~=",expected:Number.parseFloat(approximate[2]),tolerance,line:line.line}}const match=line.text.match(/^assert\s+probability\s*\(\s*\|([01]+)>\s*\)\s*(>=|<=|==|!=|>|<)\s*(0(?:\.\d+)?|1(?:\.0+)?)\s*;?$/);if(!match){if(line.text.startsWith("assert ")){diagnostics.push(createDiagnostic({code:"NM-PARSE-005",severity:"error",message:`Unsupported assert expression: ${line.text}.`,hint:"Use assert probability(|00>) > 0.45;",translationKey:"unsupportedAssert",translationValues:{expression:line.text},line:line.line}))}return void 0}return{kind:"assertProbability",state:match[1],operator:match[2],expected:Number.parseFloat(match[3]),line:line.line}}function parseEntanglementAssertion(line,diagnostics){if(!/^assert\s+entangled\b/.test(line.text)){return void 0}const match=line.text.match(/^assert\s+entangled\s*\(\s*([A-Za-z_]\w*)\[(\d+)\]\s*,\s*([A-Za-z_]\w*)\[(\d+)\]\s*\)\s*;?$/);if(!match){diagnostics.push(createDiagnostic({code:"NM-PARSE-037",severity:"error",message:`Invalid entanglement assertion: ${line.text}.`,hint:"Use assert entangled(q[0], q[1]); after preparing an entangled pair.",translationKey:"invalidEntanglementAssertion",translationValues:{statement:line.text},line:line.line}));return void 0}return{kind:"assertEntangled",targets:[toQubitRef(match[1],match[2]),toQubitRef(match[3],match[4])],line:line.line}}function parseFidelityAssertion(line,diagnostics){if(!/^assert\s+fidelity\b/.test(line.text)){return void 0}const match=line.text.match(/^assert\s+fidelity\s*\(\s*"((?:\\.|[^"\\])*)"\s*\)\s*(>=|<=|==|!=|>|<)\s*(0(?:\.\d+)?|1(?:\.0+)?)\s*;?$/);if(!match){diagnostics.push(createDiagnostic({code:"NM-PARSE-038",severity:"error",message:`Invalid fidelity assertion: ${line.text}.`,hint:'Use assert fidelity("bell") > 0.95; with a supported target such as bell, ghz, zero, or plus.',translationKey:"invalidFidelityAssertion",translationValues:{statement:line.text},line:line.line}));return void 0}return{kind:"assertFidelity",target:match[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\"),operator:match[2],expected:Number.parseFloat(match[3]),line:line.line}}function parseEquivalentAssertion(line,diagnostics,propertyAssertionsEnabled=false){if(!/^assert\s+equivalent\b/.test(line.text)){return void 0}if(/\bup_to_phase\b/.test(line.text)){if(!propertyAssertionsEnabled){pushPropertyAssertionsFeatureDisabledDiagnostic(line,diagnostics);return void 0}const phaseMatch=line.text.match(/^assert\s+equivalent\s*\(\s*"((?:\\.|[^"\\])*)"\s*\)\s+up_to_phase\s*;?$/);if(!phaseMatch){diagnostics.push(createDiagnostic({code:nmPropertyAssertionDiagnosticCodes.invalidAssertion,severity:"error",message:`Invalid up-to-phase equivalence assertion: ${line.text}.`,hint:'Use assert equivalent("bell") up_to_phase;.',translationKey:"invalidPhaseEquivalenceAssertion",translationValues:{statement:line.text},line:line.line}));return void 0}return{kind:"assertEquivalent",target:phaseMatch[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\"),phasePolicy:"global",line:line.line}}const match=line.text.match(/^assert\s+equivalent\s*\(\s*"((?:\\.|[^"\\])*)"\s*\)\s*;?$/);if(!match){diagnostics.push(createDiagnostic({code:"NM-PARSE-040",severity:"error",message:`Invalid equivalence assertion: ${line.text}.`,hint:'Use assert equivalent("bell"); after preparing a named target state.',translationKey:"invalidEquivalentAssertion",translationValues:{statement:line.text},line:line.line}));return void 0}return{kind:"assertEquivalent",target:match[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\"),line:line.line}}function parseResourceAssertion(line,diagnostics){if(!/^assert\s+(?:depth|gates|twoQubitCount|measurements)\b/.test(line.text)){return void 0}const match=line.text.match(/^assert\s+(depth|gates|twoQubitCount|measurements)\s*(>=|<=|==|!=|>|<)\s*(\d+(?:\.\d+)?)\s*;?$/);if(!match){diagnostics.push(createDiagnostic({code:"NM-PARSE-039",severity:"error",message:`Invalid resource assertion: ${line.text}.`,hint:"Use assert depth <= 20; or assert twoQubitCount <= 4; to check resource budgets.",translationKey:"invalidResourceAssertion",translationValues:{statement:line.text},line:line.line}));return void 0}return{kind:"assertResource",metric:match[1],operator:match[2],expected:Number.parseFloat(match[3]),line:line.line}}function parseExpectationAssertion(line,constants,observables,diagnostics,observableUses,propertyAssertionsEnabled=false){if(!/^assert\s+expectation\b/.test(line.text)){return void 0}const experimentalCandidate=/(?:~=|\btolerance\b|\s+in\s*\[)/.test(line.text);if(experimentalCandidate&&!propertyAssertionsEnabled){pushPropertyAssertionsFeatureDisabledDiagnostic(line,diagnostics);return void 0}const resolveTerms=source=>{const diagnosticCount2=diagnostics.length;const terms2=resolveExpectationTerms(source.trim(),line,constants,observables,diagnostics,observableUses);if(!terms2&&diagnostics.length===diagnosticCount2){diagnostics.push(createDiagnostic({code:nmPropertyAssertionDiagnosticCodes.invalidAssertion,severity:"error",message:`Invalid property expectation assertion: ${line.text}.`,hint:"Use a declared observable or Pauli expression.",translationKey:"invalidPropertyExpectationAssertion",translationValues:{expression:line.text},line:line.line}))}return terms2};if(experimentalCandidate&&/(?:~=|\btolerance\b)/.test(line.text)){const approximate=line.text.match(/^assert\s+expectation\s+(.+?)\s*~=\s*(-?\d+(?:\.\d+)?)\s+tolerance\s+(\d+(?:\.\d+)?)\s*;?$/);const expected=approximate?Number.parseFloat(approximate[2]):Number.NaN;const tolerance=approximate?Number.parseFloat(approximate[3]):Number.NaN;if(!approximate||!Number.isFinite(expected)||Math.abs(expected)>NM_PROPERTY_ASSERTION_MAX_ABSOLUTE_BOUND||!Number.isFinite(tolerance)||tolerance<=0||tolerance>NM_PROPERTY_ASSERTION_MAX_TOLERANCE){diagnostics.push(createDiagnostic({code:nmPropertyAssertionDiagnosticCodes.invalidAssertion,severity:"error",message:`Invalid finite-shot expectation assertion: ${line.text}.`,hint:`Use assert expectation Z(q[0]) ~= 0 tolerance 0.1; with 0 < tolerance <= ${NM_PROPERTY_ASSERTION_MAX_TOLERANCE}.`,translationKey:"invalidPropertyExpectationAssertion",translationValues:{expression:line.text},line:line.line}));return void 0}const terms2=resolveTerms(approximate[1]);return terms2?{kind:"assertExpectation",terms:terms2,operator:"~=",expected,tolerance,line:line.line}:void 0}if(experimentalCandidate){const range2=line.text.match(/^assert\s+expectation\s+(.+?)\s+in\s*\[\s*(-?\d+(?:\.\d+)?)\s*,\s*(-?\d+(?:\.\d+)?)\s*\]\s*;?$/);const minimum=range2?Number.parseFloat(range2[2]):Number.NaN;const maximum=range2?Number.parseFloat(range2[3]):Number.NaN;if(!range2||!Number.isFinite(minimum)||!Number.isFinite(maximum)||Math.abs(minimum)>NM_PROPERTY_ASSERTION_MAX_ABSOLUTE_BOUND||Math.abs(maximum)>NM_PROPERTY_ASSERTION_MAX_ABSOLUTE_BOUND||minimum>maximum){diagnostics.push(createDiagnostic({code:nmPropertyAssertionDiagnosticCodes.invalidRange,severity:"error",message:`Invalid observable range assertion: ${line.text}.`,hint:"Use an ordered inclusive range, for example: assert expectation Z(q[0]) in [-1, 1];",translationKey:"invalidObservableRangeAssertion",translationValues:{expression:line.text},line:line.line}));return void 0}const terms2=resolveTerms(range2[1]);return terms2?{kind:"assertExpectationRange",terms:terms2,minimum,maximum,line:line.line}:void 0}const match=line.text.match(/^assert\s+expectation\s+(.+?)\s*(>=|<=|==|!=|>|<)\s*(-?\d+(?:\.\d+)?)\s*;?$/);if(!match){diagnostics.push(createDiagnostic({code:"NM-PARSE-011",severity:"error",message:`Invalid expectation assertion: ${line.text}.`,hint:"Use assert expectation H < -0.5; or assert expectation Z(q[0]) > 0.9;",translationKey:"invalidExpectationAssertion",translationValues:{expression:line.text},line:line.line}));return void 0}const diagnosticCount=diagnostics.length;const terms=resolveExpectationTerms(match[1].trim(),line,constants,observables,diagnostics,observableUses);if(!terms){if(diagnostics.length===diagnosticCount){diagnostics.push(createDiagnostic({code:"NM-PARSE-011",severity:"error",message:`Invalid expectation assertion: ${line.text}.`,hint:"Use assert expectation H < -0.5; or assert expectation Z(q[0]) > 0.9;",translationKey:"invalidExpectationAssertion",translationValues:{expression:line.text},line:line.line}))}return void 0}return{kind:"assertExpectation",terms,operator:match[2],expected:Number.parseFloat(match[3]),line:line.line}}function parseReturn(line,diagnostics){const match=line.text.match(/^return\b\s*(.*?)\s*;?$/);if(!match){return void 0}const expression=match[1].trim();const containsCall=/[\p{L}_][\p{L}\p{N}_]*\s*\(/u.test(expression);if(containsCall){diagnostics.push(createDiagnostic({code:"NM-PARSE-004",severity:"error",message:`Calls in untyped return expressions are not executable: ${expression}.`,hint:"Evaluate measurements in explicit statements, then return their bound values, for example: let result = measure(q[0]); return result;",translationKey:"unsupportedReturnCall",translationValues:{expression},line:line.line}))}const isValidExpression=expression.length>0&&/^[\p{L}\p{N}_().,\s[\]]+$/u.test(expression);if(!isValidExpression){diagnostics.push(createDiagnostic({code:"NM-PARSE-004",severity:"warning",message:`Unrecognized return expression: ${expression||"(empty)"}.`,hint:"Return an identifier, a number, or a tuple such as return (a, b);",translationKey:"unrecognizedReturn",translationValues:{expression:expression||"(empty)"},line:line.line}))}return{kind:"return",expression,line:line.line}}function validateStdObservableRequirements(observableMetadata,observableUses,qregSizes,diagnostics){const blockedLines=new Set;const emitted=new Set;for(const use of observableUses){const metadata=observableMetadata[use.name];if(!metadata?.stdImport||metadata.minQubits==null){continue}for(const register of metadata.registers){const actual=qregSizes[register];if(actual==null||actual>=metadata.minQubits){continue}const key4=`${use.line}:${metadata.stdImport}:${register}`;if(emitted.has(key4)){continue}emitted.add(key4);blockedLines.add(use.line);diagnostics.push(createDiagnostic({code:"NM-TYPE-022",severity:"error",message:`Standard library observable ${metadata.stdImport} requires at least ${metadata.minQubits} qubits, but ${register} has ${actual}.`,hint:`Allocate ${register} with qreg[${metadata.minQubits}] before using ${metadata.name}.`,translationKey:"stdObservableQubitRequirement",translationValues:{import:metadata.stdImport,name:metadata.name,register,min:metadata.minQubits,actual},line:use.line}))}}return blockedLines}function toQubitRef(register,indexText){return{register,index:indexText==null?void 0:Number.parseInt(indexText,10)}}function qubitRefKey3(ref2){return ref2.index==null?ref2.register:`${ref2.register}[${ref2.index}]`}function getNodeBuffer(){return globalThis.Buffer}function encodeSharedCode(value){if(typeof btoa==="function"){const bytes2=new TextEncoder().encode(value);let binary="";bytes2.forEach(byte=>{binary+=String.fromCharCode(byte)});return btoa(binary).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}const nodeBuffer=getNodeBuffer();if(!nodeBuffer){throw new Error("Shared code encoding is not available in this runtime.")}return nodeBuffer.from(value,"utf8").toString("base64url")}var NM_LANGUAGE_PREVIEW_READINESS_FORMAT="nm-language-preview-readiness";var NM_LANGUAGE_PREVIEW_READINESS_VERSION="0.1";var nmVersionManifest={languageVersion:"0.2.0",packageVersion:"0.2.1",irVersion:"0.1",qasm3SidecarVersion:"0.3",learningPackageVersion:"0.1",authoringBundleVersion:"0.1",workspaceManifestVersion:"0.1",workspaceSnapshotVersion:"0.1",stability:"preview",capabilities:{parser:"stable",statevectorRuntime:"stable",stabilizerRuntime:"preview",sourcePreservingFormatter:"preview",turkishSourceSurface:"preview",languageServer:"preview",multiFileWorkspace:"preview",workspaceSnapshots:"preview",targetNativeLowering:"preview",calibratedPlacement:"preview",targetScheduling:"preview",quantumJobApi:"preview",cli:"preview",verifiedCopilot:"experimental",verifiedTutor:"experimental",learningPackages:"preview",qasm3Export:"preview",strictQasm3Carrier:"preview",hardwareExecution:"experimental",trainBlock:"preview",adjointGradients:"preview",qmlLosses:"preview",spsaOptimizer:"preview",extendedEncodings:"preview",embeddedQmlDatasets:"preview",mlStdLibrary:"preview",quantumKernels:"preview",qaoaRuntime:"preview",qngOptimizer:"preview",trainingStudio:"preview",trainabilityDiagnostics:"preview",modelPackages:"preview",qmlCopilot:"preview",pennylaneExport:"preview",mcpServer:"preview",sourceDebugger:"preview",experimentRecords:"preview",localWorkspaceStore:"preview",qmlBenchmarks:"preview",experimentHistory:"preview",qmlTrainingControls:"experimental",qmlTrainingCheckpoints:"experimental",typedClassicalValues:"experimental",targetCapabilityConstraints:"experimental",functionResults:"experimental",moduleVisibility:"experimental",exactImports:"experimental",propertyAssertions:"experimental",genericOracles:"experimental",genericCircuits:"experimental",qecExperiments:"experimental",composedNoise:"experimental",feedForward:"experimental",typedCollection:"experimental",comptimeConst:"experimental",classicalFunctions:"experimental",parameterGroups:"experimental",computeApply:"experimental"}};function evaluateNMLanguagePreviewReadiness(manifest=nmVersionManifest){const capabilities=manifest.capabilities;const productStatus=id=>capabilities[id]==="stable"||capabilities[id]==="preview";const statuses=Object.values(capabilities);const requirements=[{id:"stable-core",passed:capabilities.parser==="stable"&&capabilities.statevectorRuntime==="stable",evidence:["tests/nm-parser.spec.ts","tests/nm-runtime.spec.ts","tests/nm-toolchain.spec.ts"]},{id:"workspace-product-spine",passed:productStatus("multiFileWorkspace")&&productStatus("workspaceSnapshots")&&productStatus("localWorkspaceStore"),evidence:["tests/nm-workspace.spec.ts","tests/nm-workspace-snapshot-conformance.spec.ts","tests/nm-workspace-store.spec.ts","tests/workspace-snapshot-e2e.spec.ts"]},{id:"tooling-product-spine",passed:productStatus("cli")&&productStatus("languageServer")&&productStatus("sourcePreservingFormatter"),evidence:["tests/nm-cli.spec.ts","tests/nm-language-server.spec.ts","tests/nm-source-formatter-surface-conformance.spec.ts"]},{id:"transparent-capability-separation",passed:statuses.every(status=>["stable","preview","experimental"].includes(status))&&statuses.includes("experimental"),evidence:["app/[locale]/docs/nm-language/CapabilityMatrix.tsx","tests/nm-capability-stability.spec.ts","tests/schema-route.spec.ts"]}];return{format:NM_LANGUAGE_PREVIEW_READINESS_FORMAT,version:NM_LANGUAGE_PREVIEW_READINESS_VERSION,ready:requirements.every(({passed})=>passed),targetStatus:"preview",requirements,experimentalCapabilityPolicy:"explicit-opt-in-and-independently-versioned",stableCorePolicy:"parser-and-statevector-remain-stable"}}var nmLanguagePreviewReadiness=evaluateNMLanguagePreviewReadiness();var nmLanguageReleaseChangelog=[{languageVersion:"0.2.0",date:"2026-09-26",from:"preview",to:"preview",breaking:false,summary:{en:"Coordinated 0.2.0 preview for the expanded language, numerical library, training workflows and toolchain. New sessions use the default language profile; saved feature choices and supported 0.1.0 artifacts remain readable. Capability statuses and artifact format versions are unchanged.",tr:"Geni\u015Fletilmi\u015F dil, say\u0131sal k\xFCt\xFCphane, e\u011Fitim ak\u0131\u015Flar\u0131 ve ara\xE7 zinciri i\xE7in e\u015Fle\u015Fen 0.2.0 \xF6n izlemesi. Yeni oturumlar varsay\u0131lan dil profilini kullan\u0131r; kay\u0131tl\u0131 \xF6zellik se\xE7imleri ve desteklenen 0.1.0 dosyalar\u0131 okunabilir kal\u0131r. Yetenek durumlar\u0131 ve dosya bi\xE7imi s\xFCr\xFCmleri de\u011Fi\u015Fmedi."}},{languageVersion:"0.1.0",date:"2026-07-15",from:"experimental",to:"preview",breaking:false,summary:{en:"Promoted the overall N/M product label to preview after the stable parser/statevector core, usable workspace spine, version-aligned tooling, and gate-transparent capability matrix were verified; experimental N/M 0.2 capabilities remain explicit opt-ins.",tr:"Kararl\u0131 parser/statevector \xE7ekirde\u011Fi, kullan\u0131labilir workspace omurgas\u0131, s\xFCr\xFCmle e\u015Fle\u015Fen ara\xE7lar ve kap\u0131lar\u0131 g\xF6r\xFCn\xFCr capability matrisi do\u011Fruland\u0131ktan sonra genel N/M \xFCr\xFCn etiketi \xF6n izlemeye y\xFCkseltildi; deneysel N/M 0.2 yetenekleri a\xE7\u0131k opt-in olarak kal\u0131r."}}];var nmReadableArtifactLanguageVersions=["0.1.0",nmVersionManifest.languageVersion];function isNMReadableArtifactLanguageVersion(value){return typeof value==="string"&&nmReadableArtifactLanguageVersions.includes(value)}function isNMReadableModelLanguageVersion(value){return isNMReadableArtifactLanguageVersion(value)||value.split(".").slice(0,2).join(".")===nmVersionManifest.languageVersion.split(".").slice(0,2).join(".")}var NM_WORKSPACE_MANIFEST_FORMAT="nm-workspace";var NM_WORKSPACE_MANIFEST_VERSION="0.1";var NM_WORKSPACE_MANIFEST_SCHEMA_PATH="/schemas/nm-workspace-manifest-0.1.schema.json";var NM_WORKSPACE_MANIFEST_SCHEMA_ID=`https://quantumsoftware.tech${NM_WORKSPACE_MANIFEST_SCHEMA_PATH}`;var NM_WORKSPACE_MANIFEST_MAX_JSON_BYTES=65536;var NM_WORKSPACE_MANIFEST_MAX_PATH_BYTES=512;var NM_WORKSPACE_MANIFEST_MAX_SOURCE_ROOTS=16;var nmWorkspaceManifestDiagnosticCodes={parse:"NM-WORKSPACE-MANIFEST-PARSE-001",type:"NM-WORKSPACE-MANIFEST-TYPE-001",format:"NM-WORKSPACE-MANIFEST-FORMAT-001",version:"NM-WORKSPACE-MANIFEST-VERSION-001",required:"NM-WORKSPACE-MANIFEST-REQUIRED-001",limit:"NM-WORKSPACE-MANIFEST-LIMIT-001",unknown:"NM-WORKSPACE-MANIFEST-UNKNOWN-001",duplicate:"NM-WORKSPACE-MANIFEST-DUPLICATE-001"};var packageNamePattern=/^[a-z0-9](?:[a-z0-9._-]{0,62}[a-z0-9])?$/;var moduleNamePattern=/^[A-Za-z_]\w*$/;var unsafeUnicodePattern=/[\u0000-\u001f\u007f\u202a-\u202e\u2066-\u2069]/u;var manifestKeys=new Set(["format","version","name","entry","sourceRoots","packageNamespace"]);var utf8Encoder2=new TextEncoder;function isRecord3(value){return typeof value==="object"&&value!==null&&!Array.isArray(value)}function issue5(code,path,keyword,message){return{code,path,keyword,message}}function normalizeNMWorkspaceRelativePath(value){const canonical2=value.normalize("NFC");if(unsafeUnicodePattern.test(canonical2)||utf8Encoder2.encode(canonical2).byteLength>NM_WORKSPACE_MANIFEST_MAX_PATH_BYTES)return void 0;if(canonical2==="."||canonical2==="./"||canonical2===".\\")return".";const normalized=canonical2.replace(/\\/g,"/").replace(/^\.\//,"").replace(/\/{2,}/g,"/");if(normalized===".")return".";if(!normalized||normalized.startsWith("/")||/^[A-Za-z]:\//u.test(normalized)||normalized.split("/").some(segment=>segment===""||segment==="."||segment===".."))return void 0;return normalized}function validateNMWorkspaceManifest(value){if(!isRecord3(value)){return{valid:false,issues:[issue5(nmWorkspaceManifestDiagnosticCodes.type,"$","type","Expected an object.")]}}const issues=[];for(const key4 of Object.keys(value)){if(!manifestKeys.has(key4))issues.push(issue5(nmWorkspaceManifestDiagnosticCodes.unknown,`$.${key4}`,"additionalProperties","Unknown workspace manifest property."))}if(value.format!==NM_WORKSPACE_MANIFEST_FORMAT){issues.push(issue5(nmWorkspaceManifestDiagnosticCodes.format,"$.format","const",`Expected "${NM_WORKSPACE_MANIFEST_FORMAT}".`))}if(value.version!==NM_WORKSPACE_MANIFEST_VERSION){issues.push(issue5(nmWorkspaceManifestDiagnosticCodes.version,"$.version","const",`Expected "${NM_WORKSPACE_MANIFEST_VERSION}".`))}if(typeof value.name!=="string"||!packageNamePattern.test(value.name)){issues.push(issue5(nmWorkspaceManifestDiagnosticCodes.format,"$.name","format","Expected a lowercase workspace name using letters, numbers, dots, underscores, or hyphens."))}const entry=typeof value.entry==="string"?normalizeNMWorkspaceRelativePath(value.entry):void 0;if(!entry||!entry.endsWith(".nm")){issues.push(issue5(nmWorkspaceManifestDiagnosticCodes.format,"$.entry","format","Expected a safe NFC-normalized relative path ending in .nm."))}const sourceRoots=Array.isArray(value.sourceRoots)?value.sourceRoots:void 0;if(!sourceRoots){issues.push(issue5(nmWorkspaceManifestDiagnosticCodes.required,"$.sourceRoots","required","Expected an array of source roots."))}else if(sourceRoots.length===0||sourceRoots.length>NM_WORKSPACE_MANIFEST_MAX_SOURCE_ROOTS){issues.push(issue5(nmWorkspaceManifestDiagnosticCodes.limit,"$.sourceRoots","maxItems",`Expected between 1 and ${NM_WORKSPACE_MANIFEST_MAX_SOURCE_ROOTS} source roots.`))}const normalizedRoots=sourceRoots?.slice(0,NM_WORKSPACE_MANIFEST_MAX_SOURCE_ROOTS).map((root,index)=>{if(typeof root!=="string"){issues.push(issue5(nmWorkspaceManifestDiagnosticCodes.type,`$.sourceRoots[${index}]`,"type","Expected a string."));return void 0}const normalized=normalizeNMWorkspaceRelativePath(root);if(!normalized)issues.push(issue5(nmWorkspaceManifestDiagnosticCodes.format,`$.sourceRoots[${index}]`,"format","Expected a safe NFC-normalized relative directory path."));return normalized})??[];const validRoots=normalizedRoots.filter(root=>Boolean(root));if(new Set(validRoots).size!==validRoots.length){issues.push(issue5(nmWorkspaceManifestDiagnosticCodes.duplicate,"$.sourceRoots","uniqueItems","Source roots must be unique after normalization."))}if(entry&&validRoots.length>0&&!validRoots.some(root=>root==="."||entry===root||entry.startsWith(`${root}/`))){issues.push(issue5(nmWorkspaceManifestDiagnosticCodes.format,"$.entry","format","Entry must be located under one of the declared source roots."))}let packageNamespace;if(value.packageNamespace!==void 0){if(typeof value.packageNamespace!=="string"||!moduleNamePattern.test(value.packageNamespace)){issues.push(issue5(nmWorkspaceManifestDiagnosticCodes.format,"$.packageNamespace","format","Expected an N/M identifier."))}else packageNamespace=value.packageNamespace}if(issues.length>0||!entry||typeof value.name!=="string")return{valid:false,issues};return{valid:true,issues:[],manifest:{format:NM_WORKSPACE_MANIFEST_FORMAT,version:NM_WORKSPACE_MANIFEST_VERSION,name:value.name,entry,sourceRoots:validRoots,...packageNamespace?{packageNamespace}:{}}}}function validateNMWorkspaceManifestJsonText(json){if(utf8Encoder2.encode(json).byteLength>NM_WORKSPACE_MANIFEST_MAX_JSON_BYTES){return{valid:false,issues:[issue5(nmWorkspaceManifestDiagnosticCodes.limit,"$","maxLength","Workspace manifest JSON is too large.")]}}try{return validateNMWorkspaceManifest(JSON.parse(json))}catch{return{valid:false,issues:[issue5(nmWorkspaceManifestDiagnosticCodes.parse,"$","parse","Could not parse workspace manifest JSON.")]}}}var NM_WORKSPACE_SNAPSHOT_FORMAT="nm-workspace-snapshot";var NM_WORKSPACE_SNAPSHOT_VERSION="0.1";var NM_WORKSPACE_SNAPSHOT_SCHEMA_PATH="/schemas/nm-workspace-snapshot-0.1.schema.json";var NM_WORKSPACE_SNAPSHOT_SCHEMA_ID=`https://quantumsoftware.tech${NM_WORKSPACE_SNAPSHOT_SCHEMA_PATH}`;var NM_WORKSPACE_SNAPSHOT_SHARE_PATH="/playground/workspace";var NM_WORKSPACE_SNAPSHOT_MAX_DOCUMENTS=5e3;var NM_WORKSPACE_SNAPSHOT_MAX_SOURCE_BYTES=5e6;var NM_WORKSPACE_SNAPSHOT_MAX_JSON_BYTES=4e7;var NM_WORKSPACE_SNAPSHOT_MAX_SHARE_BYTES=15e4;var NM_WORKSPACE_SNAPSHOT_MAX_PATH_BYTES=512;var NM_WORKSPACE_SNAPSHOT_MAX_MODULE_CHARS=128;var nmWorkspaceSnapshotDiagnosticCodes={parse:"NM-SNAPSHOT-PARSE-001",type:"NM-SNAPSHOT-TYPE-001",format:"NM-SNAPSHOT-FORMAT-001",version:"NM-SNAPSHOT-VERSION-001",limit:"NM-SNAPSHOT-LIMIT-001",integrity:"NM-SNAPSHOT-INTEGRITY-001",workspace:"NM-SNAPSHOT-WORKSPACE-001"};function isRecord4(value){return typeof value==="object"&&value!==null&&!Array.isArray(value)}function snapshotIssue(code,path,keyword,message){return{code,path,keyword,message}}function normalizeSource(source){return source.replace(/\r\n?/g,"\n")}var unsafeSnapshotPathCharacters=/[\u0000-\u001f\u007f\u202a-\u202e\u2066-\u2069]/u;function normalizeSnapshotPath(value){if(unsafeSnapshotPathCharacters.test(value))return void 0;return normalizeNMWorkspaceRelativePath(value.normalize("NFC"))}function hashNMWorkspaceText(value){let hash2=BigInt("0xcbf29ce484222325");const prime=BigInt("0x100000001b3");for(const byte of new TextEncoder().encode(value)){hash2^=BigInt(byte);hash2=BigInt.asUintN(64,hash2*prime)}return hash2.toString(16).padStart(16,"0")}function canonicalSourceInput(entryModule,documents){return JSON.stringify({entryModule,documents:documents.map(document=>({path:document.path,moduleName:document.moduleName,source:normalizeSource(document.source)}))})}function createReproducibilityManifest(entryModule,documents,engine,seed,feedForwardBranchRecord,versions=nmVersionManifest){const sourceHash=hashNMWorkspaceText(canonicalSourceInput(entryModule,documents));const runFingerprint=hashNMWorkspaceText(JSON.stringify({sourceHash,languageVersion:versions.languageVersion,packageVersion:versions.packageVersion,engine,seed,...feedForwardBranchRecord?{feedForwardBranchRecord:cloneNMFeedForwardBranchRecord(feedForwardBranchRecord)}:{}}));return{hashAlgorithm:"fnv1a-64",sourceHash,runFingerprint,languageVersion:versions.languageVersion,packageVersion:versions.packageVersion,engine,seed,entryModule,documentCount:documents.length,...feedForwardBranchRecord?{feedForwardBranchRecord:cloneNMFeedForwardBranchRecord(feedForwardBranchRecord)}:{}}}function createNMWorkspaceSnapshot(input){if(!/^[a-z0-9](?:[a-z0-9._-]{0,62}[a-z0-9])?$/.test(input.name)){throw new Error("Workspace snapshot name must be lowercase and filesystem-safe.")}if(input.entryModule.length>NM_WORKSPACE_SNAPSHOT_MAX_MODULE_CHARS||!/^[A-Za-z_]\w*$/.test(input.entryModule)){throw new Error("Workspace snapshot entryModule must be an N/M identifier.")}if(input.documents.length===0||input.documents.length>NM_WORKSPACE_SNAPSHOT_MAX_DOCUMENTS){throw new Error(`Workspace snapshots require 1-${NM_WORKSPACE_SNAPSHOT_MAX_DOCUMENTS} documents.`)}const paths=new Set;const documents=input.documents.map(document=>{const path=normalizeSnapshotPath(document.path);if(!path||new TextEncoder().encode(path).byteLength>NM_WORKSPACE_SNAPSHOT_MAX_PATH_BYTES||!path.endsWith(".nm")||paths.has(path)){throw new Error(`Invalid or duplicate workspace document path: ${document.path}.`)}paths.add(path);const source=normalizeSource(document.source);const moduleName=getNMWorkspaceModuleName(source);if(!moduleName||moduleName.length>NM_WORKSPACE_SNAPSHOT_MAX_MODULE_CHARS){throw new Error(`Workspace document ${path} is missing a module declaration.`)}return{path,moduleName,source,sourceHash:hashNMWorkspaceText(source)}}).sort((left,right)=>left.path.localeCompare(right.path));const totalBytes=documents.reduce((total,document)=>total+new TextEncoder().encode(document.source).byteLength,0);if(totalBytes>NM_WORKSPACE_SNAPSHOT_MAX_SOURCE_BYTES){throw new Error(`Workspace snapshot source exceeds ${NM_WORKSPACE_SNAPSHOT_MAX_SOURCE_BYTES} bytes.`)}if(!documents.some(document=>document.moduleName===input.entryModule)){throw new Error(`Workspace entry module not found: ${input.entryModule}.`)}const index=createNMWorkspaceIndex(documents.map(document=>({uri:document.path,source:document.source})));if(index.diagnostics.length>0){throw new Error(index.diagnostics.map(diagnostic5=>diagnostic5.message).join(" "))}const branchValidation=input.feedForwardBranchRecord?validateNMFeedForwardBranchRecord(input.feedForwardBranchRecord):void 0;if(branchValidation&&!branchValidation.valid){throw new Error(`Invalid feed-forward branch record at ${branchValidation.path}: ${branchValidation.reason}`)}const branchRecord=branchValidation?.valid?branchValidation.record:void 0;const branchSeed=branchRecord?Number(branchRecord.seed):null;if(branchSeed!=null&&input.seed!=null&&input.seed!==branchSeed){throw new Error("Workspace snapshot seed does not match the feed-forward branch record.")}const engine=input.engine??"statevector";const seed=input.seed??branchSeed??null;if(seed!==null&&(!Number.isSafeInteger(seed)||seed<0)){throw new Error("Workspace snapshot seed must be a non-negative safe integer or null.")}return{format:NM_WORKSPACE_SNAPSHOT_FORMAT,version:NM_WORKSPACE_SNAPSHOT_VERSION,readonly:true,name:input.name,entryModule:input.entryModule,documents,reproducibility:createReproducibilityManifest(input.entryModule,documents,engine,seed,branchRecord)}}function validateNMWorkspaceSnapshotV01(value){const issues=[];const topLevelKeys=new Set(["format","version","readonly","name","entryModule","documents","reproducibility"]);const unknownTopLevelKey=Object.keys(value).find(key4=>!topLevelKeys.has(key4));if(unknownTopLevelKey){issues.push(snapshotIssue(nmWorkspaceSnapshotDiagnosticCodes.format,`$.${unknownTopLevelKey}`,"format","Unknown workspace snapshot property."))}if(value.format!==NM_WORKSPACE_SNAPSHOT_FORMAT){issues.push(snapshotIssue(nmWorkspaceSnapshotDiagnosticCodes.format,"$.format","const",`Expected "${NM_WORKSPACE_SNAPSHOT_FORMAT}".`))}if(value.readonly!==true){issues.push(snapshotIssue(nmWorkspaceSnapshotDiagnosticCodes.format,"$.readonly","const","Workspace snapshots must be read-only."))}if(typeof value.name!=="string"||typeof value.entryModule!=="string"||!Array.isArray(value.documents)){issues.push(snapshotIssue(nmWorkspaceSnapshotDiagnosticCodes.type,"$","type","Snapshot name, entryModule, and documents are required."));return{valid:false,issues}}if(value.documents.length===0||value.documents.length>NM_WORKSPACE_SNAPSHOT_MAX_DOCUMENTS){issues.push(snapshotIssue(nmWorkspaceSnapshotDiagnosticCodes.limit,"$.documents","limit","Snapshot document count is out of bounds."));return{valid:false,issues}}try{const documentKeys=new Set(["path","moduleName","source","sourceHash"]);const documents=value.documents.map((document,index)=>{if(!isRecord4(document)||typeof document.path!=="string"||typeof document.source!=="string"){throw new Error(`$.documents[${index}]: Expected path and source strings.`)}const unknownKey=Object.keys(document).find(key4=>!documentKeys.has(key4));if(unknownKey)throw new Error(`$.documents[${index}].${unknownKey}: Unknown workspace snapshot property.`);return{path:document.path,source:document.source}});const reproducibility=isRecord4(value.reproducibility)?value.reproducibility:{};const reproducibilityKeys=new Set(["hashAlgorithm","sourceHash","runFingerprint","languageVersion","packageVersion","engine","seed","entryModule","documentCount","feedForwardBranchRecord"]);const unknownReproducibilityKey=Object.keys(reproducibility).find(key4=>!reproducibilityKeys.has(key4));if(unknownReproducibilityKey)throw new Error(`$.reproducibility.${unknownReproducibilityKey}: Unknown workspace snapshot property.`);const currentProducerPair=reproducibility.languageVersion===nmVersionManifest.languageVersion&&reproducibility.packageVersion===nmVersionManifest.packageVersion;const historicalProducerPair=isNMReadableArtifactLanguageVersion(reproducibility.languageVersion)&&reproducibility.packageVersion===reproducibility.languageVersion;if(!currentProducerPair&&!historicalProducerPair){throw new Error("$.reproducibility: Unsupported language/package version pair.")}const recreated=createNMWorkspaceSnapshot({name:value.name,entryModule:value.entryModule,documents,engine:reproducibility.engine==="stabilizer"?"stabilizer":"statevector",seed:typeof reproducibility.seed==="number"?reproducibility.seed:null,...reproducibility.feedForwardBranchRecord!==void 0?{feedForwardBranchRecord:reproducibility.feedForwardBranchRecord}:{}});recreated.reproducibility=createReproducibilityManifest(recreated.entryModule,recreated.documents,recreated.reproducibility.engine,recreated.reproducibility.seed,recreated.reproducibility.feedForwardBranchRecord,{languageVersion:reproducibility.languageVersion,packageVersion:reproducibility.packageVersion});const normalizedCandidate={format:value.format,version:value.version,readonly:value.readonly,name:value.name,entryModule:value.entryModule,documents:value.documents.map(document=>{const record3=isRecord4(document)?document:{};return{path:record3.path,moduleName:record3.moduleName,source:record3.source,sourceHash:record3.sourceHash}}),reproducibility:{hashAlgorithm:reproducibility.hashAlgorithm,sourceHash:reproducibility.sourceHash,runFingerprint:reproducibility.runFingerprint,languageVersion:reproducibility.languageVersion,packageVersion:reproducibility.packageVersion,engine:reproducibility.engine,seed:reproducibility.seed,entryModule:reproducibility.entryModule,documentCount:reproducibility.documentCount,...reproducibility.feedForwardBranchRecord!==void 0?{feedForwardBranchRecord:reproducibility.feedForwardBranchRecord}:{}}};if(JSON.stringify(recreated)!==JSON.stringify(normalizedCandidate)||issues.length>0){issues.push(snapshotIssue(nmWorkspaceSnapshotDiagnosticCodes.integrity,"$.reproducibility","integrity","Snapshot hashes or reproducibility metadata do not match the source bundle."));return{valid:false,issues}}return{valid:true,snapshot:recreated,issues:[]}}catch(error){issues.push(snapshotIssue(nmWorkspaceSnapshotDiagnosticCodes.workspace,"$.documents","workspace",error instanceof Error?error.message:"Invalid workspace snapshot."));return{valid:false,issues}}}function readNMWorkspaceSnapshot(value){if(!isRecord4(value)){return{valid:false,issues:[snapshotIssue(nmWorkspaceSnapshotDiagnosticCodes.type,"$","type","Expected an object.")]}}if(value.version!==NM_WORKSPACE_SNAPSHOT_VERSION){return{valid:false,issues:[snapshotIssue(nmWorkspaceSnapshotDiagnosticCodes.version,"$.version","const",`Unsupported workspace snapshot version; expected "${NM_WORKSPACE_SNAPSHOT_VERSION}".`)]}}return validateNMWorkspaceSnapshotV01(value)}function validateNMWorkspaceSnapshot(value){return readNMWorkspaceSnapshot(value)}function serializeNMWorkspaceSnapshot(snapshot2){const validation=validateNMWorkspaceSnapshot(snapshot2);if(!validation.valid){throw new Error(validation.issues.map(issue11=>`${issue11.path}: ${issue11.message}`).join(" "))}return JSON.stringify(validation.snapshot,null,2)}function importNMWorkspaceSnapshotJson(json){if(new TextEncoder().encode(json).byteLength>NM_WORKSPACE_SNAPSHOT_MAX_JSON_BYTES){return{valid:false,issues:[snapshotIssue(nmWorkspaceSnapshotDiagnosticCodes.limit,"$","limit","Workspace snapshot JSON is too large.")]}}try{return readNMWorkspaceSnapshot(JSON.parse(json))}catch{return{valid:false,issues:[snapshotIssue(nmWorkspaceSnapshotDiagnosticCodes.parse,"$","parse","Could not parse workspace snapshot JSON.")]}}}function encodeNMWorkspaceSnapshot(snapshot2){const json=serializeNMWorkspaceSnapshot(snapshot2);if(new TextEncoder().encode(json).byteLength>NM_WORKSPACE_SNAPSHOT_MAX_SHARE_BYTES){throw new Error(`Shareable workspace snapshots are limited to ${NM_WORKSPACE_SNAPSHOT_MAX_SHARE_BYTES} bytes.`)}return encodeSharedCode(json)}function createNMWorkspaceSnapshotHref(snapshot2,locale="en"){return`/${locale}${NM_WORKSPACE_SNAPSHOT_SHARE_PATH}#snapshot=${encodeNMWorkspaceSnapshot(snapshot2)}`}var NM_QML_BENCHMARK_CONTRACT_VERSION="0.2";var NM_BENCHMARK_MAX_REPEATS=5;var NM_BENCHMARK_MAX_WORKLOADS=25;var NM_BENCHMARK_MAX_STEPS=100;var NM_BENCHMARK_MAX_SOURCE_CHARS=2e5;var nmBenchmarkOptimizers=["gd","momentum","adam","spsa","qng"];var nmQmlBenchmarkDiagnosticCodes={input:"NM-QML-BENCH-001",trainer:"NM-QML-BENCH-002",timing:"NM-QML-BENCH-003",invariant:"NM-QML-BENCH-004"};function failure3(kind,code,error){return{success:false,code,kind,error}}function validateTrainingResult(result2,supervised){if(!result2||typeof result2!=="object")return false;const candidate=result2;if(typeof candidate.success!=="boolean"||!Array.isArray(candidate.costHistory)||candidate.costHistory.some(value=>!Number.isFinite(value)))return false;if(candidate.circuitEvaluations!=null&&(!Number.isInteger(candidate.circuitEvaluations)||candidate.circuitEvaluations<0))return false;if(!candidate.success)return true;if(candidate.costHistory.length<1||!candidate.finalParams||Object.values(candidate.finalParams).some(value=>!Number.isFinite(value)))return false;if(!supervised)return true;return typeof candidate.datasetId==="string"&&typeof candidate.datasetVersion==="string"&&candidate.datasetSplit==="train"&&isPositiveInteger(candidate.trainSamples)&&isPositiveInteger(candidate.validationSamples)&&isPositiveInteger(candidate.testSamples)&&isFiniteProbability(candidate.validationAccuracy)&&isFiniteProbability(candidate.testAccuracy)&&isFiniteNumber(candidate.validationLoss)&&isFiniteNumber(candidate.testLoss)&&typeof candidate.loss==="string"}function executeNMBenchmark(train,source,options={}){if(typeof train!=="function"||typeof source!=="string"||source.length<1||source.length>NM_BENCHMARK_MAX_SOURCE_CHARS||!options||typeof options!=="object"||Array.isArray(options)){return failure3("input",nmQmlBenchmarkDiagnosticCodes.input,`Benchmark requires a trainer, 1-${NM_BENCHMARK_MAX_SOURCE_CHARS} source characters, and an options object.`)}let parsed;try{parsed=parseNMCode(source)}catch{return failure3("input",nmQmlBenchmarkDiagnosticCodes.input,"Benchmark source parsing threw an exception.")}const blocking=diagnosticsToError(parsed.diagnostics);if(blocking)return failure3("input",nmQmlBenchmarkDiagnosticCodes.input,blocking);if(Object.keys(parsed.params).length===0)return failure3("input",nmQmlBenchmarkDiagnosticCodes.input,"Benchmark source requires at least one trainable parameter.");const trainBlock=parsed.program.statements.find(statement=>statement.kind==="train");const dataset=trainBlock?.datasetId?getNMEmbeddedDataset(trainBlock.datasetId):void 0;if(trainBlock?.datasetId&&!dataset)return failure3("input",nmQmlBenchmarkDiagnosticCodes.input,`Unknown embedded benchmark dataset: ${trainBlock.datasetId}.`);const supervised=dataset!=null;const supportedOptimizers2=supervised?["gd","momentum","adam"]:nmBenchmarkOptimizers;const requestedOptimizers=options.optimizers??[...supportedOptimizers2];if(!Array.isArray(requestedOptimizers)||requestedOptimizers.some(optimizer=>!nmBenchmarkOptimizers.includes(optimizer))){return failure3("input",nmQmlBenchmarkDiagnosticCodes.input,"Benchmark optimizers must be selected from gd, momentum, adam, spsa, and qng.")}if(requestedOptimizers.some(optimizer=>!supportedOptimizers2.includes(optimizer))){return failure3("input",nmQmlBenchmarkDiagnosticCodes.input,"Supervised benchmarks support gd, momentum, and adam; unsupported optimizers are never downgraded silently.")}const optimizers2=[...new Set(requestedOptimizers)];const repeats=options.repeats??1;const steps=options.steps??trainBlock?.steps??20;const learningRate=options.learningRate??trainBlock?.optimizer?.options.lr??.2;const objective=options.objective??trainBlock?.objective.mode??"minimize";const seed=options.seed??parsed.program.seed??20045;if(optimizers2.length===0||optimizers2.length>nmBenchmarkOptimizers.length)return failure3("input",nmQmlBenchmarkDiagnosticCodes.input,"Select between 1 and 5 unique optimizers.");if(!Number.isInteger(repeats)||repeats<1||repeats>NM_BENCHMARK_MAX_REPEATS)return failure3("input",nmQmlBenchmarkDiagnosticCodes.input,`Benchmark repeats must be between 1 and ${NM_BENCHMARK_MAX_REPEATS}.`);if(!Number.isInteger(steps)||steps<1||steps>NM_BENCHMARK_MAX_STEPS)return failure3("input",nmQmlBenchmarkDiagnosticCodes.input,`Benchmark steps must be between 1 and ${NM_BENCHMARK_MAX_STEPS}.`);if(!Number.isFinite(learningRate)||learningRate<=0||learningRate>5)return failure3("input",nmQmlBenchmarkDiagnosticCodes.input,"Benchmark learning rate must be in (0, 5].");if(objective!=="minimize"&&objective!=="maximize")return failure3("input",nmQmlBenchmarkDiagnosticCodes.input,"Benchmark objective must be minimize or maximize.");if(!Number.isSafeInteger(seed))return failure3("input",nmQmlBenchmarkDiagnosticCodes.input,"Benchmark seed must be a safe integer.");if(typeof(options.warmup??false)!=="boolean"||options.now!=null&&typeof options.now!=="function"||options.onProgress!=null&&typeof options.onProgress!=="function"){return failure3("input",nmQmlBenchmarkDiagnosticCodes.input,"Benchmark warmup, clock, and progress options have invalid types.")}if(optimizers2.length*repeats>NM_BENCHMARK_MAX_WORKLOADS)return failure3("input",nmQmlBenchmarkDiagnosticCodes.input,`Benchmark supports at most ${NM_BENCHMARK_MAX_WORKLOADS} workloads.`);const benchmarkSource=applyBenchmarkSeed(source,seed);const workload=dataset?{kind:"supervised-classifier",datasetId:dataset.id,datasetVersion:dataset.version,splitPolicy:dataset.splitPolicy,samples:{train:dataset.splits.train.length,validation:dataset.splits.validation.length,test:dataset.splits.test.length},loss:trainBlock?.loss??"mse"}:{kind:"expectation-objective"};const now=options.now??(()=>performance.now());const total=optimizers2.length*repeats;let completed=0;const series=[];for(const optimizer of optimizers2){if(options.warmup){try{const warmup=train(benchmarkSource,{optimizer,steps:1,learningRate,objective});if(!validateTrainingResult(warmup,supervised))return failure3("trainer",nmQmlBenchmarkDiagnosticCodes.trainer,"Benchmark warmup returned an invalid training result.")}catch{return failure3("trainer",nmQmlBenchmarkDiagnosticCodes.trainer,"Benchmark warmup trainer threw an exception.")}}const runs=[];for(let repeat=0;repeat<repeats;repeat+=1){let startedAt;let endedAt;let result2;try{startedAt=now()}catch{return failure3("timing",nmQmlBenchmarkDiagnosticCodes.timing,"Benchmark clock threw before a run.")}if(!Number.isFinite(startedAt))return failure3("timing",nmQmlBenchmarkDiagnosticCodes.timing,"Benchmark clock must return finite timestamps.");try{result2=train(benchmarkSource,{optimizer,steps,learningRate,objective})}catch{return failure3("trainer",nmQmlBenchmarkDiagnosticCodes.trainer,"Benchmark trainer threw an exception.")}if(!validateTrainingResult(result2,supervised))return failure3("trainer",nmQmlBenchmarkDiagnosticCodes.trainer,"Benchmark trainer returned malformed or non-finite evidence.");if(dataset&&result2.success&&(result2.datasetId!==dataset.id||result2.datasetVersion!==dataset.version||result2.trainSamples!==dataset.splits.train.length||result2.validationSamples!==dataset.splits.validation.length||result2.testSamples!==dataset.splits.test.length))return failure3("invariant",nmQmlBenchmarkDiagnosticCodes.invariant,"Supervised benchmark evidence does not match the frozen dataset split contract.");try{endedAt=now()}catch{return failure3("timing",nmQmlBenchmarkDiagnosticCodes.timing,"Benchmark clock threw after a run.")}if(!Number.isFinite(endedAt)||endedAt<startedAt)return failure3("timing",nmQmlBenchmarkDiagnosticCodes.timing,"Benchmark clock must be finite and monotonic within each run.");const durationMs=endedAt-startedAt;const initialCost=result2.costHistory[0];const finalCost=result2.costHistory.at(-1);completed+=1;try{options.onProgress?.({completed,total,optimizer,repeat})}catch{return failure3("invariant",nmQmlBenchmarkDiagnosticCodes.invariant,"Benchmark progress callback threw an exception.")}runs.push({optimizer,repeat,success:result2.success,improved:result2.success&&initialCost!=null&&finalCost!=null&&(objective==="minimize"?finalCost<=initialCost:finalCost>=initialCost),durationMs,circuitEvaluations:result2.circuitEvaluations??0,...initialCost==null?{}:{initialCost},...finalCost==null?{}:{finalCost},costHistory:[...result2.costHistory],paramHistory:result2.paramHistory.map(entry=>({...entry})),finalParams:{...result2.finalParams},...result2.gradientMethod?{gradientMethod:result2.gradientMethod}:{},...result2.validationLoss==null?{}:{validationLoss:result2.validationLoss},...result2.validationAccuracy==null?{}:{validationAccuracy:result2.validationAccuracy},...result2.testLoss==null?{}:{testLoss:result2.testLoss},...result2.testAccuracy==null?{}:{testAccuracy:result2.testAccuracy},...result2.error?{error:result2.error}:{}})}const successful=runs.filter(run=>run.success);const finalCosts=successful.flatMap(run=>run.finalCost==null?[]:[run.finalCost]);const summary={successfulRuns:successful.length,medianDurationMs:percentile(successful.map(run=>run.durationMs),.5),p95DurationMs:percentile(successful.map(run=>run.durationMs),.95),...finalCosts.length?{medianFinalCost:percentile(finalCosts,.5)}:{},medianCircuitEvaluations:percentile(successful.map(run=>run.circuitEvaluations),.5),...medianMetric(successful,"validationLoss","medianValidationLoss"),...medianMetric(successful,"validationAccuracy","medianValidationAccuracy"),...medianMetric(successful,"testLoss","medianTestLoss"),...medianMetric(successful,"testAccuracy","medianTestAccuracy")};if(Object.values(summary).some(value=>!Number.isFinite(value)))return failure3("invariant",nmQmlBenchmarkDiagnosticCodes.invariant,"Benchmark summary produced non-finite evidence.");series.push({optimizer,runs,summary})}const sourceHash=hashNMWorkspaceText(benchmarkSource.replace(/\r\n?/g,"\n").trimEnd());const fairness={seed,steps,learningRate,objective,repeats,warmup:options.warmup??false,initialParams:{...parsed.params}};const reproducibleEvidence={contractVersion:NM_QML_BENCHMARK_CONTRACT_VERSION,sourceHash,workload,fairness,series:series.map(({optimizer,runs,summary})=>({optimizer,runs:runs.map(excludeBenchmarkDuration),summary:{...summary,medianDurationMs:0,p95DurationMs:0}}))};return{success:true,contractVersion:NM_QML_BENCHMARK_CONTRACT_VERSION,sourceHash,workloads:total,workload,timingPolicy:"monotonic-finite-nonnegative-duration-excluded-from-deterministic-identity",fairness,reproducibility:{policy:"same-source-seed-workload-and-options-produce-identical-nontiming-evidence",timingExcluded:true,algorithm:"fnv1a-64",artifactHash:hashNMWorkspaceText(canonicalJson(reproducibleEvidence))},series}}function excludeBenchmarkDuration(run){const portableRun={...run};delete portableRun.durationMs;return portableRun}function applyBenchmarkSeed(source,seed){if(/^\s*@seed\s*\(/mu.test(source))return source.replace(/^\s*@seed\s*\(\s*-?\d+\s*\)\s*;?/mu,`@seed(${seed});`);const moduleMatch=/^\s*module\s+[\p{L}_][\p{L}\p{N}_]*\s*;?/mu.exec(source);if(!moduleMatch||moduleMatch.index==null)return`@seed(${seed});
|
|
1484
1484
|
${source}`;const end=moduleMatch.index+moduleMatch[0].length;return`${source.slice(0,end)}
|
|
1485
1485
|
@seed(${seed});${source.slice(end)}`}function percentile(values2,quantile){if(values2.length===0)return 0;const sorted=[...values2].sort((left,right)=>left-right);return sorted[Math.min(sorted.length-1,Math.max(0,Math.ceil(quantile*sorted.length)-1))]}function medianMetric(runs,source,target2){const values2=runs.flatMap(run=>run[source]==null?[]:[run[source]]);return values2.length>0?{[target2]:percentile(values2,.5)}:{}}function canonicalJson(value){if(Array.isArray(value))return`[${value.map(canonicalJson).join(",")}]`;if(value&&typeof value==="object"){const record3=value;return`{${Object.keys(record3).sort().map(key4=>`${JSON.stringify(key4)}:${canonicalJson(record3[key4])}`).join(",")}}`}return JSON.stringify(value)}function isFiniteNumber(value){return typeof value==="number"&&Number.isFinite(value)}function isFiniteProbability(value){return isFiniteNumber(value)&&value>=0&&value<=1}function isPositiveInteger(value){return Number.isInteger(value)&&value>0}function captureNMComputeApplyOperations(nodes,resolve){const result2=captureNMComputeApplyData(nodes,gate=>({gate:resolve(gate),data:void 0}));return{gates:result2.gates,operations:result2.operations,diagnostics:result2.diagnostics}}function captureNMComputeApplyData(nodes,resolve){const data3=new WeakMap,gateData=[];const admitted7=prepareNMComputeApplyOperations(nodes,false);if(admitted7.diagnostics.length)return{gates:[],operations:[],diagnostics:admitted7.diagnostics,gateData};const prepared2=structuredClone(admitted7.prepared);const diagnostics=[];function capture(items){const result3=[];for(const item of items){if(diagnostics.length)break;if(item.node.kind==="compute-apply"){const compute=capture(item.compute),apply=diagnostics.length?[]:capture(item.apply);result3.push({...item.node,compute,apply})}else if(item.node.statement.kind==="barrier"){result3.push(structuredClone(item.node))}else{const original=item.gate;const captured2=structuredClone(resolve(structuredClone(original))),gate=captured2.gate;data3.set(gate,captured2.data);if(gate.kind!=="gate"||gate.gate!==original.gate||gate.targets.length!==original.targets.length||gate.targets.some((target2,index)=>target2.register!==original.targets[index].register)){diagnostics.push(computeApplyDiagnostic("inverse",item.node.range));break}gate.line=original.line;if(original.computeApplyOrigin)gate.computeApplyOrigin=structuredClone(original.computeApplyOrigin);else delete gate.computeApplyOrigin;delete gate.classicalAngles;for(const target2 of gate.targets)delete target2.classicalIndex;const node={...item.node,statement:gate};const checked3=prepareNMComputeApplyOperations([node],true);if(checked3.diagnostics.length){diagnostics.push(...checked3.diagnostics);break}result3.push(node)}}return result3}const captured=capture(prepared2);if(diagnostics.length)return{gates:[],operations:[],diagnostics,gateData};const result2=expandNMComputeApplyOperations(captured,source=>{gateData.push(structuredClone(data3.get(source)))});return{...result2,gateData}}function createNMAdjointGateResolver(statements,numQubits,classical,differentiate){const targets=createNMDynamicQubitTargetResolver(statements,expression=>({type:"Int",value:classical.index(expression)}));function resolve(statement){const gate=targets(structuredClone(statement),new Map);for(const target2 of gate.targets){delete target2.classicalIndex;if(!Number.isSafeInteger(target2.resolvedIndex)||target2.resolvedIndex<0||target2.resolvedIndex>=numQubits)throw new Error("Adjoint requires valid resolved gate targets.")}if(new Set(gate.targets.map(target2=>target2.resolvedIndex)).size!==gate.targets.length)throw new Error("Adjoint requires distinct gate targets.");const inverse=getNMUnitaryInverse(gate.gate);if(!inverse||inverse.targets!==gate.targets.length)throw new Error(`Adjoint gradients cannot reverse the ${gate.gate} gate.`);if(gate.classicalAngles&&gate.classicalAngles.length!==inverse.angles.length)throw new Error("Invalid adjoint angle arity.");const derivatives=inverse.angles.map((_,index)=>{if(gate.classicalAngles)return classical.differentiate(gate.classicalAngles[index]);const value=inverse.angles.length===3?gate.angles?.[index]:gate.theta;const name2=inverse.angles.length===3?gate.angleNames?.[index]:gate.thetaName;const derivative=name2?differentiate(name2):{value,partials:{}};if(!derivative||!Number.isFinite(value)||Math.abs(derivative.value-value)>1e-10*Math.max(1,Math.abs(value)))throw new Error("Adjoint requires finite angle expressions with matching source values.");return derivative});if(derivatives.some(item=>!Number.isFinite(item.value)||Object.values(item.partials).some(value=>!Number.isFinite(value))))throw new Error("Non-finite adjoint angle derivative.");if(derivatives.length)gate.theta=derivatives[0].value;if(derivatives.length===3)gate.angles=derivatives.map(item=>item.value);delete gate.classicalAngles;delete gate.thetaName;delete gate.angleNames;return{gate,data:derivatives.map(item=>item.partials)}}function normalize(gate,data3){const leaf=(name2,indices,theta,partials={})=>({gate:{...gate,gate:name2,targets:indices.map(index=>gate.targets[index]),theta,angles:void 0},partials});if(gate.gate==="U")return[leaf("P",[0],gate.angles[2],data3[2]),leaf("Ry",[0],gate.angles[0],data3[0]),leaf("P",[0],gate.angles[1],data3[1])];if(gate.gate==="iSWAP")return[leaf("SWAP",[0,1]),leaf("CZ",[0,1]),leaf("S",[0]),leaf("S",[1])];return[{gate,partials:data3[0]??{}}]}return statement=>{if(statement.kind==="gate"){const{gate,data:data3}=resolve(statement);return normalize(gate,data3)}const captured=captureNMComputeApplyData([computeApplyOperationTree(statement)],gate=>{classical.step();return resolve(gate)});if(captured.diagnostics.length)throw new Error(`${captured.diagnostics[0].code}: ${captured.diagnostics[0].message}`);captured.operations.forEach(()=>classical.step());return captured.gates.flatMap((item,index)=>{const data3=captured.gateData[index];const partials=item.adjoint?getNMUnitaryInverse(item.gate.gate).angles.map(position=>Object.fromEntries(Object.entries(data3[position]).map(([name2,value])=>[name2,-value]))):data3;return normalize(item.gate,partials)})}}var nmSupervisedWorkLimits=Object.freeze({evalCalls:32768,adjointApplications:8e6});var NMSupervisedWorkError=class extends Error{constructor(kind){super(`Supervised custom ${kind} budget exhausted.`);this.kind=kind;this.code="NM-QML-CUSTOM-008"}};function createNMSupervisedWorkBudget(limits={}){const kinds=["evalCalls","adjointApplications"];if(!limits||typeof limits!=="object"||Array.isArray(limits)||Object.keys(limits).some(key4=>!kinds.includes(key4)))throw new RangeError("Invalid supervised budget limits.");const ceiling={...nmSupervisedWorkLimits,...limits};for(const kind of kinds)if(!Number.isSafeInteger(ceiling[kind])||ceiling[kind]<1||ceiling[kind]>nmSupervisedWorkLimits[kind])throw new RangeError(`Invalid supervised ${kind} budget.`);const admitted7={evalCalls:0,adjointApplications:0};let exhausted;return Object.freeze({charge(kind){if(!kinds.includes(kind))throw new RangeError("Invalid supervised work kind.");if(exhausted)throw new NMSupervisedWorkError(exhausted);if(admitted7[kind]===ceiling[kind]){exhausted=kind;throw new NMSupervisedWorkError(kind)}admitted7[kind]++},snapshot:()=>Object.freeze({...admitted7,...exhausted?{quantumExhausted:exhausted}:{}})})}var nmQmlLossDiagnosticCodes={kind:"NM-QML-LOSS-001",input:"NM-QML-LOSS-002",invariant:"NM-QML-LOSS-003"};var NMQMLLossError=class extends RangeError{constructor(code,message){super(`${code}: ${message}`);this.code=code;this.name="NMQMLLossError"}};var CROSS_ENTROPY_EPSILON=1e-7;var supportedLosses=new Set(["mse","cross_entropy","hinge"]);function crossEntropyProbability(prediction){return Math.min(1-CROSS_ENTROPY_EPSILON,Math.max(CROSS_ENTROPY_EPSILON,(1+prediction)/2))}function validateInputs(kind,prediction,label3){if(!supportedLosses.has(kind)){return{success:false,code:nmQmlLossDiagnosticCodes.kind,error:`Unsupported loss kind: ${String(kind)}.`}}if(!Number.isFinite(prediction)||prediction<-1||prediction>1){return{success:false,code:nmQmlLossDiagnosticCodes.input,error:"Prediction must be a finite expectation in the closed interval [-1, 1]."}}if(label3!==-1&&label3!==1){return{success:false,code:nmQmlLossDiagnosticCodes.input,error:"Binary label must be exactly -1 or 1."}}return void 0}function checkedValue(value){return Number.isFinite(value)?{success:true,value}:{success:false,code:nmQmlLossDiagnosticCodes.invariant,error:"Loss evaluation produced a non-finite result."}}function computeNMLossChecked(kind,prediction,label3){const invalid5=validateInputs(kind,prediction,label3);if(invalid5)return invalid5;if(kind==="mse")return checkedValue((prediction-label3)**2);if(kind==="hinge")return checkedValue(Math.max(0,1-label3*prediction));const probability=crossEntropyProbability(prediction);const target2=(1+label3)/2;return checkedValue(-(target2*Math.log(probability)+(1-target2)*Math.log(1-probability)))}function computeNMLossGradientChecked(kind,prediction,label3){const invalid5=validateInputs(kind,prediction,label3);if(invalid5)return invalid5;if(kind==="mse")return checkedValue(2*(prediction-label3));if(kind==="hinge")return checkedValue(prediction*label3<1?-label3:0);const probability=crossEntropyProbability(prediction);const target2=(1+label3)/2;return checkedValue(.5*((1-target2)/(1-probability)-target2/probability))}function unwrap(result2){if(result2.success)return result2.value;throw new NMQMLLossError(result2.code,result2.error)}function computeNMLoss(kind,prediction,label3){return unwrap(computeNMLossChecked(kind,prediction,label3))}function computeNMLossGradient(kind,prediction,label3){return unwrap(computeNMLossGradientChecked(kind,prediction,label3))}function createNMCustomLossSession(source,name2="loss",options={}){let budget;try{budget=createNMCustomLossBudget(options.limits)}catch{return{success:false,stage:"prepare",code:"NM-QML-CUSTOM-007",error:"Invalid custom loss request budget."}}const prepared2=prepareNMCustomLoss(source,name2,options);if(!prepared2.success)return prepared2;const session=Object.freeze({evaluate(prediction,label3){try{budget.beginEvaluation()}catch(error){if(!(error instanceof NMCustomLossBudgetError))throw error;return{success:false,stage:"evaluate",code:error.code,error:error.message,work:0}}return evaluateNMCustomLossWithWork(prepared2.loss,prediction,label3,budget.step)},work:budget.snapshot});return{success:true,session}}function createNMNominalLossLocationReader(provenance){const locations=new Map,entries=new Set;try{const source=provenance.declarations.map(item=>item.source).join("\n");const{compiled:{graph}}=readNMWorkspaceCompiler(source,provenance.nominalWorkspace,(entry,sources)=>({graph:createNMNominalWorkspace(entry,sources,{enabled:true,moduleVisibility:true})}));for(const document of graph.modules){const isEntry=document.name===graph.entryModule;const original=isEntry?provenance.originalSource:provenance.parseOptions.workspaceModules?.[document.name];if(typeof original!=="string")continue;const from=readFunctionSource(document.source),to=readFunctionSource(original);for(const helper of from.regions){const target2=to.regions.find(item=>item.name===helper.name);if(!target2||document.source.slice(helper.start,helper.end)!==original.slice(target2.start,target2.end))continue;const input=from.tokens.filter(token=>token.range.start.offset>=helper.start&&token.range.end.offset<=helper.end);const output=to.tokens.filter(token=>token.range.start.offset>=target2.start&&token.range.end.offset<=target2.end);if(!input.length||input.length!==output.length||input.some((token,i)=>token.text!==output[i].text))continue;input.forEach((token,i)=>{const key4=`${document.name}:${token.range.start.line+1}:${token.range.start.column+1}`;locations.set(key4,{kind:"diagnostic",sourceKind:isEntry?"entry":"workspace",module:document.name,line:output[i].range.start.line+1,column:output[i].range.start.column+1});if(i===0)entries.add(key4)})}}}catch{locations.clear();entries.clear()}return failure8=>{const key4=`${failure8.sourceId}:${failure8.line}:${failure8.column}`,location2=locations.get(key4);if(!location2||failure8.locationKind!=="diagnostic"&&!(failure8.locationKind==="function-entry"&&entries.has(key4)))return{kind:"unmapped"};return{...location2,kind:failure8.locationKind}}}var key3=token=>`${token.range.start.line+1}:${token.range.start.column+1}`;function createNMCustomLossFailureMapper(provenance,sourceIdentity){if(provenance?.nominalWorkspace){const readLocation=createNMNominalLossLocationReader(provenance);return failure8=>{const{line,column,locationKind,sourceId:sourceId2,...rest}=failure8,location2=readLocation(failure8);return{...rest,sourceIdentity,sourceLocation:location2,...line===void 0?{}:{generatedLocation:{line,column,locationKind,sourceId:sourceId2}},...location2.kind==="unmapped"?{}:{line:location2.line,column:location2.column,locationKind:location2.kind,sourceId:location2.module}}}}const regions=[];if(provenance){try{const joined=provenance.declarations.map(item=>item.source).join("\n");const generated=parseNMSourceCST(joined).tokens.filter(token=>!token.trivia);const originalDocuments=new Map;let offset=0;for(const declaration of provenance.declarations){const end=offset+declaration.source.length;const linked=generated.filter(token=>token.range.start.offset>=offset&&token.range.end.offset<=end);if(!provenance.workspace&&provenance.declarations.length===1&&isNMNominalCallSource(declaration.source)){const nominal=readFunctionSource(declaration.source),original2=readFunctionSource(provenance.originalSource);for(const helper of nominal.regions){const target2=original2.regions.find(item=>item.name===helper.name);if(!target2||declaration.source.slice(helper.start,helper.end)!==provenance.originalSource.slice(target2.start,target2.end))continue;const from=nominal.tokens.filter(token=>token.range.start.offset>=helper.start&&token.range.end.offset<=helper.end);const to=original2.tokens.filter(token=>token.range.start.offset>=target2.start&&token.range.end.offset<=target2.end);if(!from.length||from.length!==to.length||from.some((token,i)=>token.text!==to[i].text))continue;const location2={sourceKind:"entry"};const entry={...location2,kind:"function-entry",line:to[0].range.start.line+1,column:to[0].range.start.column+1};const exact3=new Map(from.map((token,i)=>[key3(token),{...location2,kind:"diagnostic",line:to[i].range.start.line+1,column:to[i].range.start.column+1}]));regions.push({start:from[0].range.start.line+1,end:from.at(-1).range.end.line+1,entry,tokens:exact3})}offset=end+1;continue}const symbol=provenance.workspace?.symbols.find(item=>item.internalName===declaration.name);const moduleName=symbol?.module??provenance.workspace?.entryModule;const isEntry=!symbol||symbol.module===provenance.workspace?.entryModule;const original=isEntry?provenance.originalSource:provenance.parseOptions.workspaceModules?.[symbol.module];if(original!==void 0){let read5=originalDocuments.get(original);if(!read5){read5=readFunctionSource(original);originalDocuments.set(original,read5)}const region=symbol??read5.regions.find(item=>item.name===declaration.name);if(region){const tokens=read5.tokens.filter(token=>token.range.start.offset>=region.start&&token.range.end.offset<=region.end);const head=tokens[0];if(head&&linked.length){const base2={sourceKind:isEntry?"entry":"workspace",...moduleName?{module:moduleName}:{}};const entry={...base2,kind:"function-entry",line:head.range.start.line+1,column:head.range.start.column+1};const replacements=provenance.workspace?.references?.filter(ref2=>ref2.module===moduleName&&ref2.replacementStart!==void 0)??[];const originals=[];for(const token of tokens){const replacement=replacements.find(ref2=>token.range.start.offset>=ref2.replacementStart&&token.range.end.offset<=ref2.replacementEnd);if(replacement&&token.range.start.offset!==replacement.replacementStart)continue;originals.push({token,text:replacement?.internalName??token.text})}const aligned=linked.length===originals.length&&linked.every((token,index)=>{const text=originals[index].text;return token.text===text||provenance.workspace?.symbols.some(item=>item.internalName===token.text&&item.name===text)});const exact3=new Map;if(aligned)linked.forEach((token,index)=>exact3.set(key3(token),{...base2,kind:"diagnostic",line:originals[index].token.range.start.line+1,column:originals[index].token.range.start.column+1}));regions.push({start:linked[0].range.start.line+1,end:linked.at(-1).range.end.line+1,entry,tokens:exact3})}}}offset=end+1}}catch{}}return failure8=>{const{line,column,locationKind,...rest}=failure8;const candidates=Number.isInteger(line)?regions.filter(region=>line>=region.start&&line<=region.end):[];const exact3=locationKind!==void 0&&column!==void 0?candidates.flatMap(region=>region.tokens.get(`${line}:${column}`)??[]):[];const location2=exact3.length===1?{...exact3[0],kind:locationKind}:candidates.length===1?candidates[0].entry:{kind:"unmapped"};return{...rest,sourceIdentity,sourceLocation:{...location2},...line!==void 0?{generatedLocation:{line,...column!==void 0?{column}:{},...locationKind?{locationKind}:{}}}:{},...location2.kind!=="unmapped"?{line:location2.line,column:location2.column,locationKind:location2.kind}:{}}}}var contexts=new WeakMap;var fail10=error=>({success:false,stage:"prepare",code:"NM-QML-CUSTOM-001",error});var optionsKey=options=>JSON.stringify({experimental:Object.entries(options.experimental??{}).filter(([,value])=>value===true).sort(([a],[b])=>a.localeCompare(b)),workspaceModules:Object.entries(options.workspaceModules??{}).sort(([a],[b])=>a.localeCompare(b)),debugClassicalFunctions:options.debugClassicalFunctions===true});function resolveNMSupervisedLoss(originalSource,parseOptions={},options={}){if(typeof originalSource!=="string"||originalSource.length>262144)return fail10("Invalid supervised loss source.");try{const snapshot2=snapshotNMQMLParseOptions(parseOptions);const parsed=parseNMCode(originalSource,snapshot2);const blocking=diagnosticsToError(parsed.diagnostics);if(blocking)return{...fail10(blocking),code:parsed.diagnostics.find(item=>item.severity==="error")?.code??"NM-QML-CUSTOM-001"};const blocks=parsed.program.statements.filter(statement=>statement.kind==="train");if(blocks.length>1)return fail10("Expected at most one supervised train block.");const block=blocks[0];const selector=block?.customLoss;const key4=optionsKey(snapshot2);const sourceHash=hashNMWorkspaceText(JSON.stringify([originalSource,key4]));const mapFailure=createNMCustomLossFailureMapper(parsed.program.classicalFunctions,sourceHash);let session;let lossIdentity;if(selector){if(options.builtin!==void 0||block.loss!==void 0)return fail10("Custom loss cannot also select a builtin loss.");const helperSource=parsed.program.classicalFunctions?.declarations.map(item=>item.source).join("\n")??"";const prepared2=createNMCustomLossSession(helperSource,selector.name,{enabled:snapshot2.experimental?.classicalFunctions===true&&snapshot2.experimental?.typedClassicalValues===true,limits:options.limits,nominalWorkspace:parsed.program.classicalFunctions?.nominalWorkspace});if(!prepared2.success)return mapFailure(prepared2);session=prepared2.session;lossIdentity=Object.freeze({kind:"custom",name:selector.name,version:"0.1",sourceHash})}else{const name2=options.builtin??block?.loss??"mse";const valid2=computeNMLossChecked(name2,0,1);if(!valid2.success)return{...valid2,stage:"prepare"};lossIdentity=Object.freeze({kind:"builtin",name:name2,version:"0.1",sourceHash})}const context=Object.freeze({});contexts.set(context,{originalSource,trainingSource:stripNMTrainBlocks(originalSource),parseOptions:snapshot2,optionsKey:key4,lossIdentity,mapFailure,...session?{session,quantum:createNMSupervisedWorkBudget(options.quantumLimits)}:{},...block?{trainBlock:structuredClone(block)}:{}});return{success:true,context}}catch(error){return fail10(error instanceof Error?error.message:"Supervised loss preparation failed.")}}function readNMSupervisedLossBinding(context){const state=contexts.get(context);if(!state)return fail10("Expected a locally resolved supervised loss context.");return{success:true,originalSource:state.originalSource,trainingSource:state.trainingSource,parseOptions:state.parseOptions,lossIdentity:state.lossIdentity}}function validateNMSupervisedLossBinding(context,trainingSource,parseOptions){const state=contexts.get(context);if(!state||state.trainingSource!==trainingSource||state.optionsKey!==optionsKey(parseOptions)){return fail10("Supervised loss context does not match the training source and language context.")}return{success:true}}function validateNMSupervisedLossTrainBlock(context,block){const state=contexts.get(context);if(!state?.trainBlock||JSON.stringify(state.trainBlock)!==JSON.stringify(block)){return fail10("Supervised loss context does not match the original training directives.")}return{success:true}}function evaluateNMSupervisedLoss(context,prediction,label3){const state=contexts.get(context);if(!state)return fail10("Expected a locally resolved supervised loss context.");const terminal=supervisedWorkFailure(context);if(terminal){const located=state.mapFailure(terminal);state.lastFailure=structuredClone(located);return located}if(state.session){const result2=state.session.evaluate(prediction,label3);if(result2.success)return{success:true,value:result2.value,dPrediction:result2.derivative};const located=state.mapFailure(result2);state.lastFailure=structuredClone(located);return located}const kind=state.lossIdentity;if(kind.kind!=="builtin")return fail10("Missing custom loss session.");const value=computeNMLossChecked(kind.name,prediction,label3);if(!value.success)return{...value,stage:"evaluate"};const derivative=computeNMLossGradientChecked(kind.name,prediction,label3);return derivative.success?{success:true,value:value.value,dPrediction:derivative.value}:{...derivative,stage:"evaluate"}}function readNMSupervisedLossEvidence(context){const state=contexts.get(context);if(!state)return fail10("Expected a locally resolved supervised loss context.");const terminal=supervisedWorkFailure(context);const lastFailure=state.lastFailure??(terminal?state.mapFailure(terminal):void 0);return{success:true,lossIdentity:{...state.lossIdentity},...lastFailure?{failure:structuredClone(lastFailure)}:{},...state.session?{work:{...state.session.work(),...state.quantum?.snapshot()}}:{}}}function supervisedWorkFailure(context){if(!context)return void 0;const state=contexts.get(context);const quantum=state?.quantum?.snapshot().quantumExhausted;const derivative=state?.session?.work().exhausted;return quantum?{success:false,stage:"evaluate",code:"NM-QML-CUSTOM-008",error:`Supervised custom ${quantum} budget exhausted.`}:derivative?{success:false,stage:"evaluate",code:"NM-QML-CUSTOM-007",error:`Custom loss request ${derivative} budget exhausted.`}:void 0}function supervisedWorkError(context){const failure8=supervisedWorkFailure(context);return failure8?`${failure8.code}: ${failure8.error}`:void 0}function chargeNMSupervisedWork(context,kind){const failure8=supervisedWorkFailure(context);if(failure8)throw Object.assign(new Error(failure8.error),{code:failure8.code});if(context)contexts.get(context)?.quantum?.charge(kind)}var chargedExecutors=new WeakMap;function budgetNMSupervisedExecutor(context,execute,admitted7){const wrapped=(code,options)=>{try{if(!context||chargedExecutors.get(execute)!==context)chargeNMSupervisedWork(context,"evalCalls")}catch(error){if(!supervisedWorkFailure(context))throw error;return{success:false,error:supervisedWorkError(context),output:[],measurements:[],executionTime:0}}admitted7();return execute(code,options)};if(context)chargedExecutors.set(wrapped,context);return wrapped}function differentiateNMAngleExpression(source,constants,parameters,constantDerivatives=new Map){if(source.length>4096)return void 0;const expression=source.replace(/([A-Za-z_]\w*)\s*\[\s*(\d+)\s*\]/g,"$1_$2");const tokens=expression.match(/\d+\.\d+|\d+|[A-Za-z_]\w*|[+\-*/()]/g)??[];if(tokens.length===0||tokens.length>512||tokens.join("")!==expression.replace(/\s+/g,""))return void 0;let position=0;let depth3=0;const literal=value=>({value,partials:{}});const combine=(left,right,op)=>{const a=left.value;const b=right.value;if(op==="/"&&b===0)throw new Error("Zero denominator");const value=op==="+"?a+b:op==="-"?a-b:op==="*"?a*b:a/b;const partials=Object.create(null);for(const name2 of new Set([...Object.keys(left.partials),...Object.keys(right.partials)])){const da=Object.prototype.hasOwnProperty.call(left.partials,name2)?left.partials[name2]:0;const db=Object.prototype.hasOwnProperty.call(right.partials,name2)?right.partials[name2]:0;partials[name2]=op==="+"?da+db:op==="-"?da-db:op==="*"?da*b+a*db:(da-value*db)/b}if(![value,...Object.values(partials)].every(Number.isFinite))throw new Error("Non-finite derivative");return{value,partials}};const factor=()=>{if(++depth3>64)throw new Error("Expression nesting limit");try{const token=tokens[position++];if(token==="("){const result2=sum();if(tokens[position++]!==")")throw new Error("Missing parenthesis");return result2}if(token==="+")return factor();if(token==="-")return combine(literal(0),factor(),"-");if(!token)throw new Error("Missing operand");if(/^\d/.test(token))return literal(Number(token));if(token==="PI")return literal(Math.PI);if(Object.prototype.hasOwnProperty.call(parameters,token))return{value:parameters[token],partials:{[token]:1}};if(constantDerivatives.has(token))return constantDerivatives.get(token);if(Object.prototype.hasOwnProperty.call(constants,token))return literal(constants[token]);throw new Error("Unknown identifier")}finally{depth3-=1}};const term=()=>{let result2=factor();while(tokens[position]==="*"||tokens[position]==="/"){const op=tokens[position++];result2=combine(result2,factor(),op)}return result2};function sum(){let result2=term();while(tokens[position]==="+"||tokens[position]==="-"){const op=tokens[position++];result2=combine(result2,term(),op)}return result2}try{const result2=sum();return position===tokens.length&&[result2.value,...Object.values(result2.partials)].every(Number.isFinite)?result2:void 0}catch{return void 0}}function stateInnerProduct(left,right){const leftStorage=getNMDenseStatevectorStorage(left);const rightStorage=getNMDenseStatevectorStorage(right);const length=leftStorage.real.length;let re=0;let im=0;for(let index=0;index<length;index+=1){const leftRe=leftStorage.real[index];const leftIm=-leftStorage.imaginary[index];const rightRe=rightStorage.real[index];const rightIm=rightStorage.imaginary[index];re+=leftRe*rightRe-leftIm*rightIm;im+=leftRe*rightIm+leftIm*rightRe}return{re,im}}function stateInnerProductFidelity(left,right){const inner=stateInnerProduct(left,right);return Math.min(1,Math.max(0,inner.re*inner.re+inner.im*inner.im))}function prepareNMAdjointEncoding(parsed,statement,used){const invalid5=error=>({error});if(!Number.isInteger(parsed.numQubits)||parsed.numQubits<1||parsed.numQubits>8)return invalid5("Encoding adjoint requires 1-8 qubits.");const metadata=parsed.program.datasets?.[0];if(!metadata||typeof metadata.id!=="string"||!metadata.id.length||typeof statement.register!=="string"||![void 0,"train","validation","test","synthetic"].includes(metadata.split)||!Number.isSafeInteger(statement.row)||statement.row<0)return invalid5("Encoding adjoint requires a valid dataset row.");const split=metadata.split==="validation"||metadata.split==="test"?metadata.split:"train";const row=getNMEmbeddedDatasetSplitRow(metadata.id,statement.row,split);const entries=Object.entries(parsed.qubitMap).filter(([name2])=>name2.startsWith(`${statement.register}[`)).map(([name2,index])=>({local:Number(/\[(\d+)\]$/u.exec(name2)?.[1]),index})).sort((a,b)=>a.local-b.local);const indices=entries.map(entry=>entry.index);const declaration=parsed.program.statements.find(item=>item.kind==="qreg"&&item.name===statement.register);if(!row||!Array.isArray(row.features)||row.features.length<1||row.features.length>8||Array.from(row.features).some(value=>typeof value!=="number"||!Number.isFinite(value))||declaration?.kind!=="qreg"||!Number.isSafeInteger(declaration.size)||entries.length!==declaration.size||entries.length<1||entries.length>8||entries.some((entry,i)=>entry.local!==i)||new Set(indices).size!==indices.length||indices.some(index=>!Number.isInteger(index)||index<0||index>=parsed.numQubits))return invalid5("Encoding adjoint requires finite bounded features and a complete register map.");const features=row.features;if(statement.method==="amplitude"){if(indices.some(index=>used.has(index)))return invalid5("Amplitude encoding must be the first operation on its register in statement order.");const capacity=2**indices.length;if(features.length>capacity)return invalid5("Amplitude feature count exceeds register capacity.");const norm=Math.sqrt(features.reduce((sum,value)=>sum+value*value,0));if(!Number.isFinite(norm)||norm===0)return invalid5("Amplitude encoding requires a finite nonzero normalization.");const phase=features[0]>=0?-1:1;const reflection=Array.from({length:capacity},(_,i)=>(i===0?1:0)-phase*(features[i]??0)/norm);const denominator=reflection.reduce((sum,value)=>sum+value*value,0);return{indices,steps:[{kind:"amplitudeEncoding",indices,reflection,denominator,phase}]}}const steps=[];const gate=(name2,targets,theta)=>steps.push({kind:"gate",gate:name2,targets:targets.map(resolvedIndex=>({register:statement.register,resolvedIndex})),line:statement.line,...theta===void 0?{}:{theta}});if(statement.method==="iqp"){if(features.length>indices.length)return invalid5("IQP feature count exceeds register capacity.");indices.forEach(index=>gate("H",[index]));features.forEach((value,i)=>gate("Rz",[indices[i]],value));for(let i=0;i<features.length;i++)for(let j=i+1;j<features.length;j++){const theta=features[i]*features[j];if(!Number.isFinite(theta))return invalid5("IQP angle overflow.");gate("RZZ",[indices[i],indices[j]],theta)}}else if(statement.method==="angle"||statement.method==="reupload"){features.forEach((value,i)=>{const index=indices[i%indices.length];gate("Ry",[index],value);if(statement.method==="reupload")gate("Rz",[index],value/2)})}else return invalid5("Unsupported encoding method.");return{steps,indices}}function applyNMAmplitudeAdjointStep(state,step){if(!Number.isInteger(state.numQubits)||state.numQubits<1||state.numQubits>8||!Array.isArray(step.indices)||step.indices.length<1||step.indices.length>state.numQubits||new Set(step.indices).size!==step.indices.length||Array.from(step.indices).some(index=>!Number.isInteger(index)||index<0||index>=state.numQubits)||!Array.isArray(step.reflection)||step.reflection.length!==2**step.indices.length||Array.from(step.reflection).some(value=>!Number.isFinite(value))||!Number.isFinite(step.denominator)||step.denominator<=0||![1,-1].includes(step.phase)||Math.abs(step.reflection.reduce((sum,value)=>sum+value*value,0)-step.denominator)>1e-12)throw new Error("Invalid amplitude adjoint operator.");const input=getNMDenseStatevectorStorage(state),real=input.real.slice(),imaginary=input.imaginary.slice();const mask=step.indices.reduce((value,index)=>value|1<<index,0);const offsets=step.reflection.map((_,basis)=>step.indices.reduce((value,index,bit)=>value|(basis>>bit&1)<<index,0));for(let base2=0;base2<real.length;base2++){if(base2&mask)continue;let dotReal=0,dotImaginary=0;for(let i=0;i<offsets.length;i++){dotReal+=step.reflection[i]*input.real[base2|offsets[i]];dotImaginary+=step.reflection[i]*input.imaginary[base2|offsets[i]]}for(let i=0;i<offsets.length;i++){const factor=2*step.reflection[i]/step.denominator;real[base2|offsets[i]]=step.phase*(real[base2|offsets[i]]-factor*dotReal);imaginary[base2|offsets[i]]=step.phase*(imaginary[base2|offsets[i]]-factor*dotImaginary)}}return createNMDenseQubitState(real,imaginary,state.numQubits)}var nmAdjointGradientDiagnosticCodes={input:"NM-QML-ADJOINT-001",unsupported:"NM-QML-ADJOINT-002",invariant:"NM-QML-ADJOINT-003"};var parameterizedAdjointGates=new Set(["Rx","Ry","Rz","RXX","RYY","RZZ","P","GPhase","CRy","CRz","CP"]);var reversibleStaticGates=new Set(["H","X","Y","Z","S","T","Sdg","Tdg","P","GPhase","CRy","CRz","CP","CNOT","CZ","SWAP","CCNOT","CSWAP","CY","CH","Rx","Ry","Rz","RXX","RYY","RZZ"]);var passiveStatementKinds=new Set(["qreg","const","param","expectation","metric","gradient","train","explain","barrier","return","classicalDecl","classicalAssign"]);function inverseGate(gate){if(!reversibleStaticGates.has(gate.gate))return void 0;if(gate.gate==="S")return{...gate,gate:"Sdg"};if(gate.gate==="Sdg")return{...gate,gate:"S"};if(gate.gate==="T")return{...gate,gate:"Tdg"};if(gate.gate==="Tdg")return{...gate,gate:"T"};if(parameterizedAdjointGates.has(gate.gate)){return{...gate,theta:-(gate.theta??0)}}return gate}function addStates(left,right){const leftStorage=getNMDenseStatevectorStorage(left);const rightStorage=getNMDenseStatevectorStorage(right);const length=leftStorage.real.length;const output=allocateNMDenseStatevectorStorage(length);for(let index=0;index<length;index+=1){output.real[index]=leftStorage.real[index]+rightStorage.real[index];output.imaginary[index]=leftStorage.imaginary[index]+rightStorage.imaginary[index]}return createNMDenseQubitState(output.real,output.imaginary,left.numQubits)}function scaleState(state,coefficient){const storage=getNMDenseStatevectorStorage(state);const length=storage.real.length;const output=allocateNMDenseStatevectorStorage(length);for(let index=0;index<length;index+=1){const valueRe=storage.real[index];const valueIm=storage.imaginary[index];output.real[index]=coefficient.re*valueRe-coefficient.im*valueIm;output.imaginary[index]=coefficient.re*valueIm+coefficient.im*valueRe}return createNMDenseQubitState(output.real,output.imaginary,state.numQubits)}function hasNonFiniteAmplitude(state){const storage=getNMDenseStatevectorStorage(state);for(let index=0;index<storage.real.length;index+=1){if(!Number.isFinite(storage.real[index])||!Number.isFinite(storage.imaginary[index]))return true}return false}function observableState(state,expectation){return expectation.terms.reduce((sum,term)=>{chargeNMSweepWork("adjointApplications");const factors=term.factors.map(factor=>({qubit:factor.target.resolvedIndex??factor.target.index??0,pauli:factor.observable}));const applied=factors.length===0?state:applyPauliString(state,factors);return addStates(sum,scaleState(applied,{re:term.coeff,im:0}))},scaleState(state,{re:0,im:0}))}function projectOne(state,target2){const z=applyPauliString(state,[{qubit:target2.resolvedIndex??target2.index??0,pauli:"Z"}]);return scaleState(addStates(state,scaleState(z,{re:-1,im:0})),{re:.5,im:0})}function generatorState(state,gate){if(gate.gate==="GPhase")return state;if(gate.gate==="P"){return projectOne(state,gate.targets[0])}if(gate.gate==="CRy"||gate.gate==="CRz"||gate.gate==="CP"){const controlled=projectOne(state,gate.targets[0]);const target2=gate.targets[1];if(gate.gate==="CP")return projectOne(controlled,target2);return applyPauliString(controlled,[{qubit:target2.resolvedIndex??target2.index??0,pauli:gate.gate==="CRy"?"Y":"Z"}])}const pauliByGate={Rx:"X",Ry:"Y",Rz:"Z",RXX:"XX",RYY:"YY",RZZ:"ZZ"};const pauli=pauliByGate[gate.gate];const factors=gate.targets.map((target2,index)=>({qubit:target2.resolvedIndex??target2.index??0,pauli:pauli[index]}));return applyPauliString(state,factors)}function selectObjective(statements,target2){const expectations=statements.filter(statement=>statement.kind==="expectation");return target2?expectations.find(expectation=>expectation.binding===target2):expectations.at(-1)}function computeNMGradientsAdjoint(code,paramValues,options={}){return computeAdjoint(code,paramValues,options)}function computeNMGradientsAdjointWithBudget(code,paramValues,options={},context){try{const terminal=supervisedWorkFailure(context);if(terminal)return{code:terminal.code,error:terminal.error};return computeAdjoint(code,paramValues,options,context)}catch(error){const failure8=supervisedWorkFailure(context);if(failure8)return{code:failure8.code,error:failure8.error};throw error}}function computeAdjoint(code,paramValues,options={},context){const unsupported4=error=>({code:nmAdjointGradientDiagnosticCodes.unsupported,error});if(!paramValues||typeof paramValues!=="object"||Array.isArray(paramValues)){return{code:nmAdjointGradientDiagnosticCodes.input,error:"Adjoint parameter values must be an object."}}const suppliedParameters=Object.entries(paramValues);if(suppliedParameters.length>8||suppliedParameters.some(([name2,value])=>!/^[A-Za-z_]\w{0,127}$/.test(name2)||!Number.isFinite(value))){return{code:nmAdjointGradientDiagnosticCodes.input,error:"Adjoint gradients accept at most eight finite, bounded parameter values."}}if(options.objectiveTarget!=null&&!/^[A-Za-z_]\w{0,127}$/.test(options.objectiveTarget)){return{code:nmAdjointGradientDiagnosticCodes.input,error:"Adjoint objectiveTarget must be a bounded identifier."}}const executableCode=applyNMParameterValues(stripNMTrainBlocks(code),paramValues);const parsed=parseNMCode(executableCode,options.parseOptions);const blockingError=diagnosticsToError(parsed.diagnostics);if(blockingError)return{error:blockingError};if(parsed.program.noise)return unsupported4("Adjoint gradients require a noiseless statevector circuit.");const hasEncoding=parsed.program.statements.some(statement=>statement.kind==="encode");if((hasEncoding||parsed.program.computeApply)&&(parsed.program.composedNoise||parsed.program.mitigation||parsed.program.sampleShots!==void 0||parsed.program.expectationShots!==void 0||parsed.program.typedCollection||parsed.program.qecExperiments||parsed.program.target&&parsed.program.target!=="browser-statevector"))return unsupported4("Encoding and compute/apply adjoint require exact noiseless local statevector execution.");const unknownParameter=suppliedParameters.find(([name2])=>!Object.prototype.hasOwnProperty.call(parsed.params,name2));if(unknownParameter){return{code:nmAdjointGradientDiagnosticCodes.input,error:`Unknown adjoint parameter: ${unknownParameter[0]}.`}}const expectation=selectObjective(parsed.program.statements,options.objectiveTarget);if(!expectation)return{code:nmAdjointGradientDiagnosticCodes.input,error:"The requested expectation objective was not found."};const objectivePrefix=parsed.program.statements.slice(0,parsed.program.statements.indexOf(expectation)+1);const controlError=adjointMainControlError(objectivePrefix,new Set([...passiveStatementKinds,"gate","encode"]));if(controlError)return unsupported4(controlError);const parameterNames=Object.keys(parsed.params);const constantDerivatives=new Map;const differentiate=expression=>differentiateNMAngleExpression(expression,parsed.constants,parsed.params,constantDerivatives);const matchesValue=(derivative,value)=>!!derivative&&Math.abs(derivative.value-value)<=1e-10*Math.max(1,Math.abs(value));for(const statement of objectivePrefix){if(statement.kind!=="const")continue;const expression=statement.sourceExpression;const derivative=expression?differentiate(expression):void 0;if(!matchesValue(derivative,statement.value)||constantDerivatives.has(statement.name)){return unsupported4("Adjoint gradients require unique constant declarations with finite supported expression provenance.")}constantDerivatives.set(statement.name,derivative)}const dependentConstants=[...constantDerivatives].filter(([,value])=>Object.keys(value.partials).length>0).map(([name2])=>name2);if(dependentConstants.length>0){const source=executableCode.replace(/\/\/[^\n]*/g,"");const structuralPattern=parsed.program.classicalFunctions?/\b[A-Za-z_]\w*\s*\[([^\]]*)\]/g:/\[([^\]]*)\]/g;const structuralReference=[...source.matchAll(structuralPattern)].some(([,expression])=>(expression.match(/[A-Za-z_]\w*/g)??[]).some(name2=>dependentConstants.includes(name2)));if(structuralReference||/\b(?:repeat|for|circuit|oracle|ctrl|inv|pow|adjoint|inverse|power)\b/.test(source)){return unsupported4("Parameter-dependent constants require a flat circuit without loops, circuit expansion, modifiers or dependent indices.")}}const coefficientPartials=[];for(const term of expectation.terms){const derivative=term.coefficientExpression?differentiate(term.coefficientExpression):{value:term.coeff,partials:{}};if(!matchesValue(derivative,term.coeff))return unsupported4("Adjoint gradients require finite observable coefficient expressions with matching source values.");coefficientPartials.push(derivative.partials)}const gates2=[];const usedQubits=new Set;const anglePartials=new Map;const classical=createFunctionAngleGradientScope(parsed.params);try{const resolveGates=createNMAdjointGateResolver(parsed.program.statements,parsed.numQubits,classical,differentiate);visitAdjointMain(objectivePrefix,classical,statement=>{if(statement.kind==="const"){const derivative=constantDerivatives.get(statement.name)??(statement.sourceExpression?differentiate(statement.sourceExpression):void 0);if(!matchesValue(derivative,statement.value))throw new Error("Invalid adjoint constant provenance.");classical.bindConstant(statement.name,statement.valueType==="Int"?"Int":"Float",derivative)}else if(statement.kind==="classicalDecl"){classical.bindDeclaration(statement)}else if(statement.kind==="classicalAssign"){classical.assign(statement)}else if(statement.kind==="encode"){const encoding=prepareNMAdjointEncoding(parsed,statement,usedQubits);if("error"in encoding)throw new Error(encoding.error);gates2.push(...encoding.steps);encoding.indices.forEach(index=>usedQubits.add(index))}else if(statement.kind==="gate"||statement.kind==="computeApply"){for(const{gate,partials}of resolveGates(statement)){if(!inverseGate(gate))throw new Error(`Adjoint gradients cannot reverse the ${gate.gate} gate.`);anglePartials.set(gate,partials);gates2.push(gate);gate.targets.forEach(target2=>usedQubits.add(target2.resolvedIndex))}}})}catch(error){return unsupported4(error instanceof Error?error.message:"Classical gate angle differentiation failed.")}chargeNMSweepWork("adjointEvaluations");const forwardStates=[initState(parsed.numQubits)];let gateApplications=0;let encodingApplications=0;for(const gate of gates2){chargeNMSweepWork("adjointApplications");chargeNMSupervisedWork(context,"adjointApplications");const nextState=gate.kind==="amplitudeEncoding"?applyNMAmplitudeAdjointStep(forwardStates[forwardStates.length-1],gate):applyGateToState(forwardStates[forwardStates.length-1],gate);if(hasNonFiniteAmplitude(nextState)){return{code:nmAdjointGradientDiagnosticCodes.invariant,error:"Adjoint forward pass produced a non-finite state."}}forwardStates.push(nextState);if(gate.kind==="amplitudeEncoding")encodingApplications+=1;else gateApplications+=1}const gradients=Object.fromEntries(parameterNames.map(name2=>[name2,0]));const finalState=forwardStates[forwardStates.length-1];for(let index=0;index<expectation.terms.length;index+=1){const partials=coefficientPartials[index];if(Object.keys(partials).length===0)continue;const termState=observableState(finalState,{...expectation,terms:[{...expectation.terms[index],coeff:1}]});const expectedPauli=stateInnerProduct(finalState,termState).re;for(const[parameter,partial]of Object.entries(partials))gradients[parameter]+=partial*expectedPauli}let adjointState=observableState(forwardStates[forwardStates.length-1],expectation);if(hasNonFiniteAmplitude(adjointState)){return{code:nmAdjointGradientDiagnosticCodes.invariant,error:"Adjoint observable pass produced a non-finite state."}}for(let index=gates2.length-1;index>=0;index-=1){const gate=gates2[index];if(gate.kind==="amplitudeEncoding"){chargeNMSweepWork("adjointApplications");chargeNMSupervisedWork(context,"adjointApplications");adjointState=applyNMAmplitudeAdjointStep(adjointState,gate);if(hasNonFiniteAmplitude(adjointState))return{code:nmAdjointGradientDiagnosticCodes.invariant,error:"Adjoint encoding reverse pass produced a non-finite state."};encodingApplications+=1;continue}const partials=anglePartials.get(gate);if(partials&&Object.keys(partials).length>0&¶meterizedAdjointGates.has(gate.gate)){chargeNMSweepWork("adjointApplications");chargeNMSupervisedWork(context,"adjointApplications");const generated=generatorState(forwardStates[index+1],gate);const derivative=scaleState(generated,{re:0,im:gate.gate==="P"||gate.gate==="GPhase"||gate.gate==="CP"?1:-.5});const angleGradient=2*stateInnerProduct(adjointState,derivative).re;for(const[parameter,partial]of Object.entries(partials))gradients[parameter]+=angleGradient*partial}chargeNMSweepWork("adjointApplications");chargeNMSupervisedWork(context,"adjointApplications");adjointState=applyGateToState(adjointState,inverseGate(gate));if(hasNonFiniteAmplitude(adjointState)){return{code:nmAdjointGradientDiagnosticCodes.invariant,error:"Adjoint reverse pass produced a non-finite state."}}gateApplications+=1}if(Object.values(gradients).some(gradient=>!Number.isFinite(gradient))){return{code:nmAdjointGradientDiagnosticCodes.invariant,error:"Adjoint gradient evaluation produced a non-finite value."}}return{gradients,method:"adjoint",gateApplications,...encodingApplications?{encodingApplications}:{}}}var NM_DEBUG_MAX_BREAKPOINTS=64;var record=value=>!!value&&typeof value==="object"&&!Array.isArray(value);var keys=(value,allowed)=>Object.keys(value).every(key4=>allowed.includes(key4));var positive=value=>Number.isSafeInteger(value)&&value>0;var name=value=>typeof value==="string"&&value.length<=nmClassicalFunctionLimits.sourceBytes&&/^[\p{L}_][\p{L}\p{N}_]*$/u.test(value);var sourceId=value=>typeof value==="string"&&value.length>0&&value.length<=256&&value.normalize("NFC")===value&&new TextEncoder().encode(value).length<=256&&!/[\u0000-\u001f\u007f-\u009f\u202a-\u202e\u2066-\u2069]/u.test(value);var number=(value,type)=>typeof value==="number"&&Number.isFinite(value)&&(type==="Int"?Number.isSafeInteger(value):Math.abs(value)<=nmTypedClassicalValueLimits.maximumAbsoluteFloat);function functionValue(value,allowBit=false){if(!record(value))return false;const tag=Object.getOwnPropertyDescriptor(value,"type");if(!tag||!("value"in tag))return false;if(tag.value==="Angle"){if(!keys(value,["type","radians"]))return false;try{readNMAngleValue(value);return true}catch{return false}}if(allowBit&&value.type==="Bit")return keys(value,["type","value"])&&(value.value===0||value.value===1);if(value.type==="Bool")return keys(value,["type","value"])&&typeof value.value==="boolean";if(value.type==="Int"||value.type==="Float")return keys(value,["type","value"])&&number(value.value,value.type);if(value.type!=="Array"||!keys(value,["type","elementType","values"])||value.elementType!=="Int"&&value.elementType!=="Float"&&!(allowBit&&value.elementType==="Bit")||!Array.isArray(value.values)||value.values.length<1||value.values.length>nmTypedClassicalValueLimits.maximumArrayLength)return false;for(let i=0;i<value.values.length;i++)if(!Object.prototype.hasOwnProperty.call(value.values,i)||(value.elementType==="Bit"?value.values[i]!==0&&value.values[i]!==1:!number(value.values[i],value.elementType)))return false;return true}function returnValue(value){if(record(value)&&Object.getOwnPropertyDescriptor(value,"type")?.value==="EnumResult"){try{copyEnumResultRuntime(value);return true}catch{return false}}if(record(value)&&["Record","Enum"].includes(Object.getOwnPropertyDescriptor(value,"type")?.value))return isNMNominalDebugValue(value);if(record(value)&&Object.getOwnPropertyDescriptor(value,"type")?.value==="Complex"){if(!keys(value,["type","re","im"]))return false;try{readNMComplexValue(value);return true}catch{return false}}if(record(value)&&Object.getOwnPropertyDescriptor(value,"type")?.value==="Matrix")return matrixValue(value);if(!record(value)||Object.getOwnPropertyDescriptor(value,"type")?.value!=="Result")return functionValue(value,true);if(typeof value.valueType!=="string")return false;const scalar4=["Int","Float","Bool","Angle"].includes(value.valueType);const array3=/^Array<(Int|Float), ([1-9]\d*)>$/u.exec(value.valueType);if(!scalar4&&(!array3||Number(array3[2])>nmTypedClassicalValueLimits.maximumArrayLength))return false;if(value.status==="error")return keys(value,["type","valueType","status","code"])&&typeof value.code==="string"&&/^[A-Z][A-Z0-9_]{0,63}$/u.test(value.code);if(value.status!=="ok"||!keys(value,["type","valueType","status","value"])||!functionValue(value.value))return false;const payload=value.value;return scalar4?payload.type===value.valueType:payload.type==="Array"&&payload.elementType===array3[1]&&payload.values.length===Number(array3[2])}function matrixValue(value){if(!record(value)||!keys(value,["type","elementType","rows","columns","values"]))return false;try{if(Object.getOwnPropertyDescriptor(value,"elementType")?.value==="Complex")readNMComplexMatrixValue(value);else readNMMatrixValue(value);return true}catch{return false}}function mainValue(value){if(record(value)&&Object.getOwnPropertyDescriptor(value,"type")?.value==="EnumResult"){try{copyEnumResultRuntime(value);return true}catch{return false}}if(record(value)&&["Record","Enum"].includes(Object.getOwnPropertyDescriptor(value,"type")?.value))return isNMNominalDebugValue(value);if(record(value)&&Object.getOwnPropertyDescriptor(value,"type")?.value==="Complex")return returnValue(value);if(record(value)&&Object.getOwnPropertyDescriptor(value,"type")?.value==="Matrix")return matrixValue(value);if(!record(value)||Object.getOwnPropertyDescriptor(value,"type")?.value!=="Result")return functionValue(value,true);const type=value.valueType;if(!record(type))return false;const angle=type.kind==="angle"&&keys(type,["kind"]);const scalar4=type.kind==="scalar"&&keys(type,["kind","name"])&&["Bit","Int","Float","Bool"].includes(type.name);const array3=type.kind==="array"&&keys(type,["kind","elementType","length"])&&["Bit","Int","Float"].includes(type.elementType)&&positive(type.length)&&type.length<=nmTypedClassicalValueLimits.maximumArrayLength;if(!scalar4&&!array3&&!angle)return false;if(value.status==="error")return keys(value,["type","valueType","status","code"])&&typeof value.code==="string"&&/^[A-Z][A-Z0-9_]{0,63}$/u.test(value.code);if(value.status!=="ok"||!keys(value,["type","valueType","status","value"])||!functionValue(value.value,true))return false;const payload=value.value;return angle?payload.type==="Angle":scalar4?payload.type===type.name:payload.type==="Array"&&payload.elementType===type.elementType&&payload.values.length===type.length}function bindings2(value,limit,main=false){return record(value)&&Object.keys(value).length<=limit&&Object.entries(value).every(([key4,item])=>name(key4)&&(main?mainValue(item):returnValue(item)))}function isNMDebugClassicalEvidence(value){if(!record(value)||!keys(value,["kind","line","column","sourceId","stack","result","error"])||!["enter","statement","return","error"].includes(value.kind)||!positive(value.line)||!positive(value.column)||value.sourceId!==void 0&&!sourceId(value.sourceId)||!Array.isArray(value.stack)||value.stack.length<1||value.stack.length>nmClassicalFunctionLimits.callDepth+(record(value.stack[0])&&value.stack[0].name==="main"?1:0))return false;const ids=new Set;for(const frame of value.stack){if(!record(frame)||!keys(frame,["id","name","line","column","sourceId","arguments","locals"])||!positive(frame.id)||ids.has(frame.id)||!name(frame.name)||!positive(frame.line)||!positive(frame.column)||frame.sourceId!==void 0&&!sourceId(frame.sourceId)||!bindings2(frame.arguments,nmClassicalFunctionLimits.parameters)||!bindings2(frame.locals,frame===value.stack[0]&&frame.name==="main"?nmClassicalFunctionLimits.tokens:nmClassicalFunctionLimits.locals,frame===value.stack[0]&&frame.name==="main"))return false;ids.add(frame.id)}if(value.result!==void 0&&!returnValue(value.result)||value.error!==void 0&&!(typeof value.error==="string"&&value.error.length>0&&value.error.length<=4096))return false;if(value.kind==="enter"||value.kind==="statement")return value.result===void 0&&value.error===void 0;if(value.kind==="return")return value.error===void 0&&(value.result!==void 0||value.stack[value.stack.length-1].name==="main");return typeof value.error==="string"&&(value.result===void 0||record(value.result)&&value.result.type==="Result"&&value.result.status==="error"&&value.result.code===value.error)}function cloneNMDebugClassicalEvidence(value){return JSON.parse(JSON.stringify(value))}function data2(value,keys3){if(!value||typeof value!=="object"||Array.isArray(value)||![Object.prototype,null].includes(Object.getPrototypeOf(value)))return void 0;const descriptors=Object.getOwnPropertyDescriptors(value);if(Reflect.ownKeys(descriptors).length!==keys3.length||keys3.some(key4=>!descriptors[key4]||!("value"in descriptors[key4])))return void 0;return Object.fromEntries(keys3.map(key4=>[key4,descriptors[key4].value]))}function isNMComputeApplyDebugEvent(value){try{const event=data2(value,["version","invocation","operationIndex","adjoint","phases"]);if(!event||event.version!=="0.1"||!Number.isSafeInteger(event.invocation)||event.invocation<1||!Number.isSafeInteger(event.operationIndex)||event.operationIndex<0||event.operationIndex>=nmComputeApplyLimits.expandedOperations||typeof event.adjoint!=="boolean"||!Array.isArray(event.phases)||Object.getPrototypeOf(event.phases)!==Array.prototype)return false;const descriptors=Object.getOwnPropertyDescriptors(event.phases),length=descriptors.length?.value;if(!Number.isSafeInteger(length)||length<1||length>nmComputeApplyLimits.depth||Reflect.ownKeys(descriptors).length!==length+1)return false;const ids=new Set;let adjoint=false;for(let index=0;index<length;index++){if(!descriptors[index]||!("value"in descriptors[index]))return false;const phase=data2(descriptors[index].value,["blockId","phase"]);if(!phase||!Number.isSafeInteger(phase.blockId)||phase.blockId<0||!["compute","apply","uncompute"].includes(phase.phase)||ids.has(phase.blockId))return false;ids.add(phase.blockId);if(phase.phase!=="apply")adjoint=phase.phase==="uncompute"}return event.adjoint===adjoint}catch{return false}}function hasValidNMComputeApplyTimeline(frames){let invocation3=0,operationIndex=-1;try{for(const frame of frames){if(!frame||typeof frame!=="object")return false;const descriptor=Object.getOwnPropertyDescriptor(frame,"computeApply");if(!descriptor)continue;if(!("value"in descriptor))return false;const event=descriptor.value;if(event===void 0)continue;const phase=Object.getOwnPropertyDescriptor(frame,"phase")?.value;if(!["gate","barrier"].includes(phase)||!isNMComputeApplyDebugEvent(event)||event.invocation<invocation3)return false;if(event.invocation>invocation3){invocation3=event.invocation;operationIndex=-1}if(event.operationIndex!==++operationIndex)return false}return true}catch{return false}}function cloneNMComputeApplyDebugEvent(event){return{...event,phases:event.phases.map(phase=>({...phase}))}}var NM_DEBUG_MAX_SOURCE_BYTES=1e6;var NM_DEBUG_MAX_SOURCE_ID_BYTES=256;var NM_DEBUG_MAX_SOURCE_MAP_ENTRIES=1e4;var NM_DEBUG_SESSION_VERSION="0.1";var NM_DEBUG_CONTRACT_VERSION="2026-07-12";var NM_DEBUG_DEFAULT_SOURCE_ID="main.nm";var NM_DEBUG_MAX_TIMELINE_FRAMES=1e4;var NM_DEBUG_MAX_SESSION_BYTES=32e6;var nmDebugDiagnosticCodes={breakpoint:"NM-DEBUG-001",timeline:"NM-DEBUG-002",sourceMap:"NM-DEBUG-003",limit:"NM-DEBUG-004",cancelled:"NM-DEBUG-005",invariant:"NM-DEBUG-006"};function startNMDebugSession(execute,source,options={}){const normalizedSource=source.replace(/\r\n?/g,"\n");const sourceHash=hashNMWorkspaceText(normalizedSource);const sourceId2=normalizeSourceId(options.sourceId??NM_DEBUG_DEFAULT_SOURCE_ID);if(!sourceId2)return failedSession(sourceHash,NM_DEBUG_DEFAULT_SOURCE_ID,"N/M debugger source id is invalid.",diagnostic4(nmDebugDiagnosticCodes.sourceMap,"N/M debugger source id is invalid.","Use safe NFC text without control or bidirectional override characters."));if(new TextEncoder().encode(normalizedSource).byteLength>NM_DEBUG_MAX_SOURCE_BYTES)return failedSession(sourceHash,sourceId2,`N/M debugger source exceeds ${NM_DEBUG_MAX_SOURCE_BYTES} UTF-8 bytes.`,diagnostic4(nmDebugDiagnosticCodes.limit,`N/M debugger source exceeds ${NM_DEBUG_MAX_SOURCE_BYTES} UTF-8 bytes.`,"Reduce the debug entry source."));const sourceMapResult=normalizeSourceMap(options.sourceMap??[]);if("error"in sourceMapResult)return failedSession(sourceHash,sourceId2,sourceMapResult.error,sourceMapResult.diagnostic);const breakpointResult=normalizeBreakpoints(sourceId2,options.breakpointLines??[],options.breakpoints??[]);if("error"in breakpointResult)return failedSession(sourceHash,sourceId2,breakpointResult.error,breakpointResult.diagnostic,[],sourceMapResult.entries);if(options.signal?.aborted)return cancelledSession(sourceHash,sourceId2,breakpointResult.breakpoints,sourceMapResult.entries);let result2;try{result2=execute(source)}catch(error){const message=error instanceof Error?error.message:"N/M debug execution failed.";return failedSession(sourceHash,sourceId2,message,diagnostic4(nmDebugDiagnosticCodes.invariant,message,"Inspect the runtime failure and retry."),[],sourceMapResult.entries)}if(options.signal?.aborted)return cancelledSession(sourceHash,sourceId2,breakpointResult.breakpoints,sourceMapResult.entries);const replayableFailure=!result2.success&&!result2.error?.startsWith(`${nmDebugDiagnosticCodes.limit}:`)&&result2.stateTimeline?.some(frame=>frame.classicalDebug?.kind==="error");if(!result2.success&&!replayableFailure){const runtimeDiagnostic=result2.diagnostics?.find(item=>item.severity==="error")??result2.diagnostics?.[0];const error=result2.error??runtimeDiagnostic?.message??"N/M debug execution failed.";const debugDiagnostic=error.startsWith(`${nmDebugDiagnosticCodes.limit}:`)?diagnostic4(nmDebugDiagnosticCodes.limit,error,"Reduce operations or inspect a bounded trace."):runtimeDiagnostic;return failedSession(sourceHash,sourceId2,error,debugDiagnostic,[],sourceMapResult.entries)}if((result2.stateTimeline?.length??0)>NM_DEBUG_MAX_TIMELINE_FRAMES)return failedSession(sourceHash,sourceId2,"N/M debug timeline exceeds the frame limit.",diagnostic4(nmDebugDiagnosticCodes.limit,"N/M debug timeline exceeds the frame limit.","Reduce operations or inspect a bounded trace."));const sourceMapByLine=new Map(sourceMapResult.entries.map(entry=>[entry.generatedLine,entry]));let frames;try{if(!hasValidNMComputeApplyTimeline(result2.stateTimeline??[])||!hasValidNMReadoutDebugTimeline(result2.stateTimeline??[]))throw new Error("Invalid compute/apply or readout debug evidence.");if(result2.stateTimeline?.some(frame=>frame.classicalDebug!==void 0&&!isNMDebugClassicalEvidence(frame.classicalDebug)||frame.sourceLocation!==void 0&&!isSourceLocation(frame.sourceLocation)))throw new Error("Invalid classical debug evidence.");frames=(result2.stateTimeline??[]).map(frame=>cloneFrame(frame,sourceId2,sourceMapByLine))}catch{return failedSession(sourceHash,sourceId2,"N/M runtime produced invalid debug evidence.",diagnostic4(nmDebugDiagnosticCodes.invariant,"N/M runtime produced invalid debug evidence.","Inspect the runtime trace."))}if(frames.length===0)return failedSession(sourceHash,sourceId2,"N/M runtime did not produce a state timeline.",diagnostic4(nmDebugDiagnosticCodes.timeline,"N/M runtime did not produce a state timeline.","Run a program with at least one executable quantum statement."),[],sourceMapResult.entries);if(frames.some((frame,index)=>frame.index!==index))return failedSession(sourceHash,sourceId2,"N/M debug timeline indices are not contiguous.",diagnostic4(nmDebugDiagnosticCodes.invariant,"N/M debug timeline indices are not contiguous.","Report the runtime timeline invariant failure."),[],sourceMapResult.entries);if(frames.length>NM_DEBUG_MAX_TIMELINE_FRAMES){const message=`N/M debug timeline exceeds ${NM_DEBUG_MAX_TIMELINE_FRAMES} frames or ${NM_DEBUG_MAX_SESSION_BYTES} JSON bytes.`;return failedSession(sourceHash,sourceId2,message,diagnostic4(nmDebugDiagnosticCodes.limit,message,"Reduce operations or inspect a bounded trace."),[],sourceMapResult.entries)}const breakpointResolutions=breakpointResult.breakpoints.map(requested=>resolveBreakpoint(requested,frames));const breakpointLines=[...new Set(breakpointResolutions.flatMap(resolution=>resolution.generatedLines))].sort((left,right)=>left-right);let jsonBytes;try{jsonBytes=new TextEncoder().encode(JSON.stringify({sourceMap:sourceMapResult.entries,breakpointResolutions,frames})).byteLength}catch{return failedSession(sourceHash,sourceId2,"N/M debug evidence is not serializable.",diagnostic4(nmDebugDiagnosticCodes.invariant,"N/M debug evidence is not serializable.","Inspect the runtime trace."))}if(jsonBytes>NM_DEBUG_MAX_SESSION_BYTES){const message=`N/M debug session exceeds ${NM_DEBUG_MAX_SESSION_BYTES} JSON bytes.`;return failedSession(sourceHash,sourceId2,message,diagnostic4(nmDebugDiagnosticCodes.limit,message,"Reduce operations or source-map entries."),[],sourceMapResult.entries)}return{format:"nm-debug-session",version:NM_DEBUG_SESSION_VERSION,contractVersion:NM_DEBUG_CONTRACT_VERSION,sourceHash,sourceId:sourceId2,status:"paused",pauseReason:"entry",breakpointLines,breakpointResolutions,sourceMap:sourceMapResult.entries,frames,timeline:{frameCount:frames.length,jsonBytes,complete:true},cursor:0,currentFrame:frames[0],...replayableFailure?{executionFailed:true,error:result2.error??"N/M helper execution failed.",...result2.diagnostics?.find(item=>item.severity==="error")?{diagnostic:result2.diagnostics.find(item=>item.severity==="error")}:{}}:{}}}function normalizeBreakpoints(sourceId2,lines,breakpoints){if(lines.length+breakpoints.length>NM_DEBUG_MAX_BREAKPOINTS){const error=`N/M debugger supports at most ${NM_DEBUG_MAX_BREAKPOINTS} breakpoints.`;return{error,diagnostic:diagnostic4(nmDebugDiagnosticCodes.breakpoint,error,"Remove unused breakpoints and retry.")}}const combined=[...lines.map(line=>({sourceId:sourceId2,line})),...breakpoints];const normalized=[];for(const breakpoint of combined){const normalizedId=normalizeSourceId(breakpoint.sourceId);if(!normalizedId||!Number.isSafeInteger(breakpoint.line)||breakpoint.line<1||breakpoint.column!=null&&(!Number.isSafeInteger(breakpoint.column)||breakpoint.column<1)){const error="N/M debugger breakpoints require a safe source id and positive one-based line/column.";return{error,diagnostic:diagnostic4(nmDebugDiagnosticCodes.breakpoint,error,"Use one-based source locations.")}}const next={sourceId:normalizedId,line:breakpoint.line,...breakpoint.column==null?{}:{column:breakpoint.column}};if(!normalized.some(item=>breakpointKey(item)===breakpointKey(next)))normalized.push(next)}return{breakpoints:normalized.sort((left,right)=>left.sourceId.localeCompare(right.sourceId)||left.line-right.line||(left.column??1)-(right.column??1))}}function normalizeSourceMap(entries){if(entries.length>NM_DEBUG_MAX_SOURCE_MAP_ENTRIES){const error=`N/M debugger source map supports at most ${NM_DEBUG_MAX_SOURCE_MAP_ENTRIES} entries.`;return{error,diagnostic:diagnostic4(nmDebugDiagnosticCodes.limit,error,"Reduce source-map entries.")}}const generatedLines=new Set;const normalized=[];for(const entry of entries){const sourceId2=normalizeSourceId(entry.sourceId);if(!sourceId2||!Number.isSafeInteger(entry.generatedLine)||entry.generatedLine<1||!Number.isSafeInteger(entry.sourceLine)||entry.sourceLine<1||entry.sourceColumn!=null&&(!Number.isSafeInteger(entry.sourceColumn)||entry.sourceColumn<1)||generatedLines.has(entry.generatedLine)){const error="N/M debugger source-map entries require unique positive generated lines and safe one-based source locations.";return{error,diagnostic:diagnostic4(nmDebugDiagnosticCodes.sourceMap,error,"Regenerate the source map with unique generated lines.")}}generatedLines.add(entry.generatedLine);normalized.push({generatedLine:entry.generatedLine,sourceId:sourceId2,sourceLine:entry.sourceLine,...entry.sourceColumn==null?{}:{sourceColumn:entry.sourceColumn}})}return{entries:normalized.sort((left,right)=>left.generatedLine-right.generatedLine)}}function resolveBreakpoint(requested,frames){const matching=frames.filter(frame=>frame.sourceLocation?.sourceId===requested.sourceId&&frame.sourceLocation.line===requested.line&&(requested.column==null||frame.sourceLocation.column===requested.column));const generatedLines=[...new Set(matching.flatMap(frame=>frame.line==null?[]:[frame.line]))].sort((left,right)=>left-right);return matching.length?{requested:{...requested},verified:true,generatedLines}:{requested:{...requested},verified:false,generatedLines:[],code:nmDebugDiagnosticCodes.breakpoint,message:"No executable timeline frame resolves to this source location."}}function failedSession(sourceHash,sourceId2,error,debugDiagnostic,breakpointLines=[],sourceMap=[]){return{format:"nm-debug-session",version:NM_DEBUG_SESSION_VERSION,contractVersion:NM_DEBUG_CONTRACT_VERSION,sourceHash,sourceId:sourceId2,status:"failed",pauseReason:"error",breakpointLines,breakpointResolutions:[],sourceMap,frames:[],timeline:{frameCount:0,jsonBytes:0,complete:true},cursor:-1,...debugDiagnostic?{diagnostic:debugDiagnostic}:{},error}}function cancelledSession(sourceHash,sourceId2,breakpoints,sourceMap){return{format:"nm-debug-session",version:NM_DEBUG_SESSION_VERSION,contractVersion:NM_DEBUG_CONTRACT_VERSION,sourceHash,sourceId:sourceId2,status:"cancelled",pauseReason:"cancelled",breakpointLines:[],breakpointResolutions:breakpoints.map(requested=>({requested,verified:false,generatedLines:[],code:nmDebugDiagnosticCodes.cancelled,message:"Debug execution was cancelled before breakpoint resolution."})),sourceMap,frames:[],timeline:{frameCount:0,jsonBytes:0,complete:true},cursor:-1,diagnostic:diagnostic4(nmDebugDiagnosticCodes.cancelled,"N/M debug execution was cancelled.","Start a new debug session to retry.")}}function cloneFrame(frame,defaultSourceId,sourceMap){frame={...frame,...frame.readoutDebug?{readoutDebug:cloneNMReadoutDebugEvent(frame.readoutDebug)}:{}};frame={...frame,...frame.computeApply?{computeApply:cloneNMComputeApplyDebugEvent(frame.computeApply)}:{}};const mapped=frame.line==null?void 0:sourceMap.get(frame.line);const explicit=frame.sourceLocation;const location2=explicit??(frame.classicalDebug?.sourceId?{sourceId:frame.classicalDebug.sourceId,line:frame.classicalDebug.line,column:frame.classicalDebug.column}:mapped?{sourceId:mapped.sourceId,line:mapped.sourceLine,column:mapped.sourceColumn??1}:frame.line==null?void 0:{sourceId:defaultSourceId,line:frame.line,column:1});return{...frame,...location2?{sourceLocation:{...location2}}:{},...frame.classicalDebug?{classicalDebug:cloneNMDebugClassicalEvidence(frame.classicalDebug)}:{},...frame.state?{state:{...frame.state,amplitudes:frame.state.amplitudes.map(amplitude=>({...amplitude}))}}:{},probabilities:frame.probabilities.map(probability=>({...probability})),probabilityDeltas:frame.probabilityDeltas.map(delta=>({...delta})),blochVectors:frame.blochVectors.map(vector=>({...vector})),blochVectorDeltas:frame.blochVectorDeltas.map(delta=>({...delta,previous:{...delta.previous},current:{...delta.current},delta:{...delta.delta}})),...frame.stabilizerGenerators?{stabilizerGenerators:[...frame.stabilizerGenerators]}:{},...frame.stabilizerGeneratorDeltas?{stabilizerGeneratorDeltas:frame.stabilizerGeneratorDeltas.map(delta=>({...delta}))}:{},...frame.branchDecision?{branchDecision:{...frame.branchDecision,outcomes:frame.branchDecision.outcomes.map(outcome=>({...outcome}))}}:{}}}function normalizeSourceId(value){if(typeof value!=="string")return void 0;const normalized=value.normalize("NFC");return normalized&&normalized===value&&new TextEncoder().encode(normalized).byteLength<=NM_DEBUG_MAX_SOURCE_ID_BYTES&&!/[\u0000-\u001f\u007f-\u009f\u202a-\u202e\u2066-\u2069]/u.test(normalized)?normalized:void 0}function breakpointKey(value){return`${value.sourceId}\0${value.line}\0${value.column??1}`}function diagnostic4(code,message,hint){return{code,severity:"error",message,hint}}function isSourceLocation(value){return isRecord5(value)&&Object.keys(value).every(key4=>["sourceId","line","column"].includes(key4))&&typeof value.sourceId==="string"&&!!normalizeSourceId(value.sourceId)&&Number.isSafeInteger(value.line)&&value.line>0&&Number.isSafeInteger(value.column)&&value.column>0}function isRecord5(value){return!!value&&typeof value==="object"&&!Array.isArray(value)}var NMClassifierTemplateError=class extends Error{constructor(message){super(`NM-QML-DATASET-003: ${message}`)}};function read4(template){if(typeof template!=="string"||template.length>262144)throw new NMClassifierTemplateError("Invalid or oversized classifier source.");const cst=parseNMSourceCST(template);if(cst.issues.length)throw new NMClassifierTemplateError("Malformed classifier source.");return cst.tokens.filter(token=>!token.trivia)}function prepareNMClassifierDatasetSource(template,datasetId,split="train"){if(!["train","validation","test"].includes(split)||datasetId!==void 0&&(typeof datasetId!=="string"||!datasetId.length||datasetId.length>128))throw new NMClassifierTemplateError("Invalid dataset identity or split.");const tokens=read4(template),annotations=tokens.flatMap((token,i)=>token.text==="@"&&tokens[i+1]?.text==="dataset"?[i]:[]);if(annotations.length>1)throw new NMClassifierTemplateError("Duplicate dataset annotations.");const at=annotations[0];if(at!==void 0){let end2=at+4;if(tokens[at+2]?.text!=="("||tokens[at+3]?.kind!=="string")throw new NMClassifierTemplateError("Invalid dataset annotation.");let id,originalSplit="train";try{id=JSON.parse(tokens[at+3].text);if(tokens[end2]?.text===","){if(tokens[end2+1]?.text!=="split"||tokens[end2+2]?.text!==":"||tokens[end2+3]?.kind!=="string")throw new Error;originalSplit=JSON.parse(tokens[end2+3].text);end2+=4}}catch{throw new NMClassifierTemplateError("Invalid dataset annotation.")}if(tokens[end2]?.text!==")"||typeof id!=="string"||!id.length||id.length>128||!["train","validation","test","synthetic"].includes(originalSplit))throw new NMClassifierTemplateError("Invalid dataset annotation.");if(tokens[end2+1]&&tokens[end2+1].text!==";"&&tokens[end2+1].range.start.line===tokens[end2].range.end.line)throw new NMClassifierTemplateError("Invalid trailing dataset annotation tokens.");if(datasetId!==void 0&&id!==datasetId)throw new NMClassifierTemplateError("Source dataset identity does not match the requested dataset.");const value=end2===at+4?void 0:tokens[end2-1];const start=value?.range.start.offset??tokens[at+3].range.end.offset;return applySourcePatches(template,[{start,end:value?.range.end.offset??start,text:value?JSON.stringify(split):`, split: ${JSON.stringify(split)}`}])}if(datasetId===void 0)return template;const moduleAt=tokens.findIndex((token,i)=>token.text==="module"&&tokens[i+1]?.kind==="identifier"&&tokens[i+2]?.text===";");if(moduleAt<0)throw new NMClassifierTemplateError("A module declaration is required to inject dataset identity.");const end=tokens[moduleAt+2].range.end.offset;return applySourcePatches(template,[{start:end,end,text:`
|
|
1486
|
-
@dataset(${JSON.stringify(datasetId)}, split: ${JSON.stringify(split)});`}])}function createNMClassifierPointTemplates(template,rowCount,datasetId,split="train"){if(!Number.isInteger(rowCount)||rowCount<0||rowCount>80)throw new NMClassifierTemplateError("Classifier templates require at most 80 rows.");const source=prepareNMClassifierDatasetSource(template,datasetId,split),tokens=read4(source),calls=[];for(let i=0;i<tokens.length;i++){if(tokens[i].text!=="sample_row"||tokens[i+1]?.text!=="("||tokens[i-1]?.text==="."||tokens[i-1]?.text==="fn")continue;const end=tokens[i+2]?.text===")"?i+2:tokens[i+2]?.kind==="number"&&/^\d+$/u.test(tokens[i+2].text)&&tokens[i+3]?.text===")"?i+3:-1;if(end<0)throw new NMClassifierTemplateError("sample_row requires an empty or integer index.");calls.push(end===i+2?{start:tokens[i+1].range.end.offset,end:tokens[i+1].range.end.offset}:{start:tokens[i+2].range.start.offset,end:tokens[i+2].range.end.offset})}return Array.from({length:rowCount},(_,index)=>applySourcePatches(source,calls.map(call=>({...call,text:String(index)}))))}function bindNMClassifierFeatures(source,features){const tokens=read4(source),patches=[];const scopes=new Map,moduleFeatures=new Set;let depth3=0,pendingFunction,functionName;for(let i=0;i<tokens.length;i++){if(!depth3&&tokens[i].text==="fn")pendingFunction=tokens[i+1]?.text;if(tokens[i].text==="{"){depth3++;if(depth3===1){functionName=pendingFunction;pendingFunction=void 0}}if(tokens[i].text==="}"){depth3--;if(!depth3)functionName=void 0}if(tokens[i].text!=="const"||tokens[i+1]?.kind!=="identifier")continue;const name2=tokens[i+1].text;if(!Object.prototype.hasOwnProperty.call(features,name2))continue;if(!depth3){scopes.set(i,"module");moduleFeatures.add(name2)}else if(depth3===1&&functionName==="main")scopes.set(i,"main")}for(let i=0;i<tokens.length;i++){if(!scopes.has(i))continue;const name2=tokens[i+1].text;if(scopes.get(i)==="main"&&moduleFeatures.has(name2))continue;let equal2=i+2;while(equal2<tokens.length&&!["=",";","{","}","const","param","fn","@"].includes(tokens[equal2].text))equal2++;if(tokens[equal2]?.text!=="=")throw new NMClassifierTemplateError("Feature constant initializer is missing.");let end=equal2+1;while(end<tokens.length&&![";","{","}","const","param","fn","@","use","module"].includes(tokens[end].text))end++;if(end===equal2+1||!Number.isFinite(features[name2]))throw new NMClassifierTemplateError("Feature constant initializer is invalid.");const formatted=replaceNMParameterValue("const feature = 0;","feature",features[name2]).slice("const feature = ".length,-1);for(let value=equal2+1;value<end;value++){patches.push({start:tokens[value].range.start.offset,end:tokens[value].range.end.offset,text:value===equal2+1?formatted:tokens[value].text.replace(/[^\r\n]/gu," ")})}i=end-1}return applySourcePatches(source,patches)}function createNMClassifierOptimizerState(parameterNames){const zeros=()=>Object.fromEntries(parameterNames.map(name2=>[name2,0]));return{velocity:zeros(),adamM:zeros(),adamV:zeros()}}function applyNMClassifierOptimizerStep(values2,gradients,optimizer,learningRate,step,state){for(const name2 of Object.keys(values2)){const gradient=gradients[name2];if(optimizer==="momentum"){state.velocity[name2]=.9*state.velocity[name2]-learningRate*gradient;values2[name2]+=state.velocity[name2]}else if(optimizer==="adam"){state.adamM[name2]=.9*state.adamM[name2]+.1*gradient;state.adamV[name2]=.999*state.adamV[name2]+.001*gradient*gradient;const t=step+1;values2[name2]-=learningRate*(state.adamM[name2]/(1-.9**t))/(Math.sqrt(state.adamV[name2]/(1-.999**t))+1e-8)}else values2[name2]-=learningRate*gradient}}var NM_SPSA_MAX_PARAMETERS=8;var NM_SPSA_MAX_STEPS=100;var nmSpsaDiagnosticCodes={input:"NM-QML-SPSA-001",option:"NM-QML-SPSA-002",random:"NM-QML-SPSA-003",evaluation:"NM-QML-SPSA-004",invariant:"NM-QML-SPSA-005"};function failure4(code,error){return{code,error}}function positiveFinite(value){return Number.isFinite(value)&&value>0}function executeNMSPSAStep(values2,step,totalSteps,random,evaluate,descentSign,options={}){const names=Object.keys(values2);if(names.length===0||names.length>NM_SPSA_MAX_PARAMETERS||Object.values(values2).some(value=>!Number.isFinite(value))){return failure4(nmSpsaDiagnosticCodes.input,`SPSA requires 1-${NM_SPSA_MAX_PARAMETERS} finite parameter values.`)}if(!Number.isInteger(totalSteps)||totalSteps<1||totalSteps>NM_SPSA_MAX_STEPS||!Number.isInteger(step)||step<0||step>=totalSteps){return failure4(nmSpsaDiagnosticCodes.input,`SPSA step must be within a 1-${NM_SPSA_MAX_STEPS} step workload.`)}if(descentSign!==-1&&descentSign!==1){return failure4(nmSpsaDiagnosticCodes.input,"SPSA descentSign must be exactly -1 or 1.")}const a=options.a??.2;const c2=options.c??.1;const alpha=options.alpha??.602;const gamma=options.gamma??.101;const stability=options.stability??.1*totalSteps;if(!positiveFinite(a)||!positiveFinite(c2)||!positiveFinite(alpha)||alpha>1||!positiveFinite(gamma)||gamma>1||!Number.isFinite(stability)||stability<0){return failure4(nmSpsaDiagnosticCodes.option,"SPSA requires finite a/c > 0, alpha/gamma in (0, 1], and stability >= 0.")}const gain=a/(step+1+stability)**alpha;const perturbation=c2/(step+1)**gamma;if(!positiveFinite(gain)||!positiveFinite(perturbation)){return failure4(nmSpsaDiagnosticCodes.invariant,"SPSA gain schedule produced a non-finite value.")}const delta={};for(const name2 of names){let sample;try{sample=random()}catch{return failure4(nmSpsaDiagnosticCodes.random,"SPSA random source threw an exception.")}if(!Number.isFinite(sample)||sample<0||sample>=1){return failure4(nmSpsaDiagnosticCodes.random,"SPSA random source must return a finite value in [0, 1).")}delta[name2]=sample<.5?-1:1}const plus=Object.fromEntries(names.map(name2=>[name2,values2[name2]+perturbation*delta[name2]]));const minus=Object.fromEntries(names.map(name2=>[name2,values2[name2]-perturbation*delta[name2]]));let plusCost;let minusCost;try{plusCost=evaluate(plus);minusCost=evaluate(minus)}catch{return failure4(nmSpsaDiagnosticCodes.evaluation,"SPSA cost evaluation threw an exception.")}if(plusCost==null||minusCost==null||!Number.isFinite(plusCost)||!Number.isFinite(minusCost)){return failure4(nmSpsaDiagnosticCodes.evaluation,"SPSA cost evaluation must return two finite values.")}const scale=(plusCost-minusCost)/(2*perturbation);const nextValues=Object.fromEntries(names.map(name2=>[name2,values2[name2]-descentSign*gain*scale/delta[name2]]));const midpointCost=.5*(plusCost+minusCost);if(!Number.isFinite(scale)||!Number.isFinite(midpointCost)||Object.values(nextValues).some(value=>!Number.isFinite(value))){return failure4(nmSpsaDiagnosticCodes.invariant,"SPSA update produced a non-finite value.")}return{values:nextValues,midpointCost}}var NM_QNG_OPTIMIZER_CONTRACT_VERSION="0.1";var NM_QNG_MAX_PARAMETERS=8;var NM_QNG_DEFAULT_SHIFT=.01;var NM_QNG_MIN_SHIFT=1e-6;var NM_QNG_MAX_SHIFT=.5;var NM_QNG_DEFAULT_REGULARIZATION=.001;var NM_QNG_MAX_REGULARIZATION=1;var nmQngDiagnosticCodes={input:"NM-QNG-001",evaluation:"NM-QNG-002",invariant:"NM-QNG-003",singular:"NM-QNG-004"};function computeNMQNGDiagonal(execute,code,values2,shiftOrOptions={}){const options=typeof shiftOrOptions==="number"?{shift:shiftOrOptions}:shiftOrOptions;const shift=options.shift??NM_QNG_DEFAULT_SHIFT;const regularization=options.regularization??NM_QNG_DEFAULT_REGULARIZATION;const singularPolicy=options.singularPolicy??"regularize";const names=Object.keys(values2).sort();if(!Number.isFinite(shift)||shift<NM_QNG_MIN_SHIFT||shift>NM_QNG_MAX_SHIFT){return failure5(nmQngDiagnosticCodes.input,`QNG metric shift must be finite and in [${NM_QNG_MIN_SHIFT}, ${NM_QNG_MAX_SHIFT}].`)}if(!Number.isFinite(regularization)||regularization<=0||regularization>NM_QNG_MAX_REGULARIZATION){return failure5(nmQngDiagnosticCodes.input,`QNG regularization must be finite and in (0, ${NM_QNG_MAX_REGULARIZATION}].`)}if(singularPolicy!=="regularize"&&singularPolicy!=="reject"){return failure5(nmQngDiagnosticCodes.input,"QNG singularPolicy must be regularize or reject.")}if(names.length===0||names.length>NM_QNG_MAX_PARAMETERS){return failure5(nmQngDiagnosticCodes.input,`QNG requires 1 through ${NM_QNG_MAX_PARAMETERS} trainable parameters.`)}if(names.some(name2=>!/^[A-Za-z_]\w{0,127}$/.test(name2)||!Number.isFinite(values2[name2]))){return failure5(nmQngDiagnosticCodes.input,"QNG parameter names and values must be bounded and finite.")}const base2=execute(applyNMParameterValues(code,values2));if(!base2.success||!base2.finalState)return failure5(nmQngDiagnosticCodes.evaluation,"QNG base-state evaluation failed.");const diagonal={};for(const name2 of names){const shifted=execute(applyNMParameterValues(code,{...values2,[name2]:values2[name2]+shift}));if(!shifted.success||!shifted.finalState)return failure5(nmQngDiagnosticCodes.evaluation,`QNG fidelity evaluation failed for ${name2}.`);const fidelity=stateInnerProductFidelity(base2.finalState,shifted.finalState);const value=Math.max(0,(1-fidelity)/shift**2);if(!Number.isFinite(fidelity)||!Number.isFinite(value)){return failure5(nmQngDiagnosticCodes.invariant,`QNG metric produced a non-finite value for ${name2}.`)}diagonal[name2]=value}const singularParameters=names.filter(name2=>diagonal[name2]<regularization);if(singularPolicy==="reject"&&singularParameters.length>0){return failure5(nmQngDiagnosticCodes.singular,`QNG metric is singular for: ${singularParameters.join(", ")}.`)}const regularizedDiagonal=Object.fromEntries(names.map(name2=>[name2,Math.max(diagonal[name2],regularization)]));const regularizedValues=Object.values(regularizedDiagonal);const conditionNumber=Math.max(...regularizedValues)/Math.min(...regularizedValues);if(!Number.isFinite(conditionNumber)||conditionNumber<1){return failure5(nmQngDiagnosticCodes.invariant,"QNG regularized condition number is invalid.")}return{diagonal,regularizedDiagonal,singularParameters,conditionNumber,shift,regularization,singularPolicy,circuitEvaluations:names.length+1}}function failure5(code,error){return{code,error}}var supportedGates=new Set(["Rx","Ry","Rz","RXX","RYY","RZZ"]);function parameterShiftError(statements,parameter){const parameters=typeof parameter==="string"?[parameter]:parameter;const aliases=new Map(parameters.map(name2=>{const vector=name2.match(/^([A-Za-z_]\w*)_(\d+)$/);return[name2,new Set([name2,...vector?[`${vector[1]}[${vector[2]}]`]:[]])]}));const tokens=expression=>[...(expression??"").matchAll(/[A-Za-z_]\w*(?:\s*\[\s*\d+\s*\])?/g)].map(([token])=>token.replace(/\s+/g,""));const referenced=expression=>{const refs=tokens(expression);return parameters.filter(name2=>refs.some(token=>aliases.get(name2).has(token)))};const occurrences=new Map;const errors=new Map;const visit=(items,repeated=false)=>{for(const statement of items){if(statement.kind==="const"){const expression=statement.sourceExpression;for(const name2 of expression?referenced(expression):parameters){errors.set(name2,`Parameter-shift requires parameter-independent constant declarations; cannot differentiate ${statement.name} for ${name2}.`)}}if(statement.kind==="gate"){if(statement.classicalAngles){for(const name2 of parameters)errors.set(name2,"Function gate angles require the chain rule; the direct parameter-shift rule is not applicable.")}const names=new Set([referenced(statement.thetaName),...(statement.angleNames??[]).map(referenced)].flat());for(const name2 of names){occurrences.set(name2,(occurrences.get(name2)??0)+1);if(!supportedGates.has(statement.gate)){errors.set(name2,`Parameter-shift gradients support Rx, Ry, Rz, RXX, RYY, and RZZ parameters only. Unsupported gate(s) for ${name2}: ${statement.gate}.`)}else if(repeated||!aliases.get(name2).has((statement.thetaName??"").replace(/\s+/g,""))){errors.set(name2,`Parameter-shift requires one direct rotation reference for ${name2}; angle expressions and repeated execution require a different gradient rule.`)}}}if(statement.kind==="expectation"){for(const term of statement.terms){for(const name2 of referenced(term.coefficientExpression)){errors.set(name2,`Parameter-shift requires parameter-independent observable coefficients for ${name2}.`)}}}if(statement.kind==="if"){visit(statement.body,repeated);if(statement.elseBody)visit(statement.elseBody,repeated)}else if(statement.kind==="until"){visit(statement.body,true)}else if(statement.kind==="match"){statement.cases.forEach(branch=>visit(branch.body,repeated))}else if(statement.kind==="observe"||statement.kind==="test"||statement.kind==="snapshot"){visit(statement.body,repeated)}else if(statement.kind==="property"){statement.cases.forEach(item=>visit(item.body,true))}}};visit(statements);for(const name2 of parameters){if(errors.has(name2))return errors.get(name2);if((occurrences.get(name2)??0)>1)return`Parameter-shift requires one direct rotation reference for ${name2}; shared parameters require per-gate contributions or a supported adjoint gradient.`}return void 0}var NM_PARAMETER_SWEEP_VERSION="0.1.0-experimental";var nmParameterSweepLimits=Object.freeze({axes:64,values:256,evaluations:256,sourceBytes:131072,probabilityRows:256});var nmParameterSweepMessages={input:["Invalid parameter sweep request.","Parametre taramas\u0131 iste\u011Fi ge\xE7ersiz."],budget:["Parameter sweep exceeds its source, axis, value or evaluation limit.","Parametre taramas\u0131 kaynak, eksen, de\u011Fer veya deneme s\u0131n\u0131r\u0131n\u0131 a\u015F\u0131yor."],binding:["Sweep axes must select each resolved group member exactly once.","Tarama eksenleri \xE7\xF6z\xFCmlenmi\u015F her grup \xFCyesini tam bir kez se\xE7melidir."],source:["Parameter sweep source could not be compiled or preserved.","Parametre taramas\u0131 kayna\u011F\u0131 derlenemedi veya korunamad\u0131."],execution:["Parameter sweep execution failed.","Parametre taramas\u0131 \xE7al\u0131\u015Ft\u0131r\u0131lamad\u0131."],callback:["Parameter sweep progress or cancellation callback failed.","Parametre taramas\u0131 ilerleme veya iptal geri \xE7a\u011Fr\u0131s\u0131 ba\u015Far\u0131s\u0131z oldu."],nested:["Parameter sweep exhausted its shared evaluation or adjoint work budget.","Parametre taramas\u0131 ortak de\u011Ferlendirme veya adjoint i\u015Flem b\xFCt\xE7esini t\xFCketti."]};var nmParameterSweepDiagnosticCodes={input:"NM-SWP-001",budget:"NM-SWP-002",binding:"NM-SWP-003",source:"NM-SWP-004",execution:"NM-SWP-005",callback:"NM-SWP-006",nested:"NM-SWP-007"};function parameterSweepError(issue11,detail){return{code:nmParameterSweepDiagnosticCodes[issue11],message:nmParameterSweepMessages[issue11][0],translationKey:`parameterSweep.${issue11}`,...detail?{detail}:{}}}var NMParameterSweepInputError=class extends Error{constructor(issue11,message){super(message??nmParameterSweepMessages[issue11][0]);this.issue=issue11}};function sweepDataFields(input){if(!input||typeof input!=="object"||Array.isArray(input)||![Object.prototype,null].includes(Object.getPrototypeOf(input)))throw new NMParameterSweepInputError("input");const entries=Reflect.ownKeys(input).map(key4=>{const descriptor=Object.getOwnPropertyDescriptor(input,key4);if(typeof key4!=="string"||!descriptor.enumerable||!("value"in descriptor))throw new NMParameterSweepInputError("input");return[key4,descriptor.value]});return Object.fromEntries(entries)}function array2(input,max){if(!Array.isArray(input))throw new NMParameterSweepInputError("input");if(!input.length||input.length>max)throw new NMParameterSweepInputError("budget");if(Reflect.ownKeys(input).length!==input.length+1)throw new NMParameterSweepInputError("input");return Array.from({length:input.length},(_,index)=>{const descriptor=Object.getOwnPropertyDescriptor(input,String(index));if(!descriptor||!("value"in descriptor))throw new NMParameterSweepInputError("input");return descriptor.value})}function keys2(input,allowed){if(Object.keys(input).some(key4=>!allowed.includes(key4)))throw new NMParameterSweepInputError("input")}function readNMParameterGroupSweepRequest(input){const raw=sweepDataFields(input);keys2(raw,["groupName","combination","axes","failurePolicy"]);if(typeof raw.groupName!=="string"||!raw.groupName.length||raw.groupName.length>256||!["zip","cartesian"].includes(raw.combination)||raw.failurePolicy!==void 0&&!["stop","collect"].includes(raw.failurePolicy))throw new NMParameterSweepInputError("input");const axes=array2(raw.axes,nmParameterSweepLimits.axes).map(value=>{const axis=sweepDataFields(value);keys2(axis,["parameterName","values"]);if(typeof axis.parameterName!=="string"||!axis.parameterName.length||axis.parameterName.length>256)throw new NMParameterSweepInputError("input");const values2=array2(axis.values,nmParameterSweepLimits.values);if(!values2.every(value2=>typeof value2==="number"&&Number.isFinite(value2)))throw new NMParameterSweepInputError("input");return{parameterName:axis.parameterName,values:values2}});const request={groupName:raw.groupName,combination:raw.combination,axes,failurePolicy:raw.failurePolicy};countNMParameterSweepEvaluations(request);return request}function countNMParameterSweepEvaluations(request){let count=request.combination==="zip"?request.axes[0].values.length:1;for(const axis of request.axes){if(request.combination==="zip"&&axis.values.length!==count)throw new NMParameterSweepInputError("input","Zip axes must have equal lengths.");if(request.combination==="cartesian"){if(count>Math.floor(nmParameterSweepLimits.evaluations/axis.values.length))throw new NMParameterSweepInputError("budget");count*=axis.values.length}}if(count>nmParameterSweepLimits.evaluations)throw new NMParameterSweepInputError("budget");return count}var flags={computeApply:true,parameterGroups:true,moduleVisibility:true,exactImports:true,propertyAssertions:true,qmlTrainingControls:true,typedClassicalValues:true,targetCapabilityConstraints:true,functionResults:true,classicalFunctions:true,genericOracles:true,feedForward:true,typedCollection:true,comptimeConst:true,genericCircuits:true,qecExperiments:true,composedNoise:true};function snapshotNMParameterSweepOptions(source,input){const raw=sweepDataFields(input);keys2(raw,["experimental","workspaceModules","debugClassicalFunctions"]);if(raw.debugClassicalFunctions!==void 0&&typeof raw.debugClassicalFunctions!=="boolean")throw new NMParameterSweepInputError("input");const experimental=raw.experimental===void 0?void 0:sweepDataFields(raw.experimental);if(experimental&&Object.entries(experimental).some(([key4,value])=>!Object.prototype.hasOwnProperty.call(flags,key4)||value!==void 0&&typeof value!=="boolean"))throw new NMParameterSweepInputError("input");const workspaceModules=raw.workspaceModules===void 0?void 0:sweepDataFields(raw.workspaceModules);let bytes2=new TextEncoder().encode(source).length;if(workspaceModules){if(Object.keys(workspaceModules).length>64)throw new NMParameterSweepInputError("budget");for(const[name2,text]of Object.entries(workspaceModules)){if(!/^[A-Za-z_]\w{0,127}$/u.test(name2)||typeof text!=="string")throw new NMParameterSweepInputError("input");if(text.length>nmParameterSweepLimits.sourceBytes)throw new NMParameterSweepInputError("budget");bytes2+=new TextEncoder().encode(text).length}}if(bytes2>nmParameterSweepLimits.sourceBytes)throw new NMParameterSweepInputError("budget");return{...experimental?{experimental:Object.fromEntries(Object.entries(experimental).filter(([,value])=>value!==void 0))}:{},...workspaceModules?{workspaceModules}:{},...raw.debugClassicalFunctions!==void 0?{debugClassicalFunctions:raw.debugClassicalFunctions}:{}}}var boundary=new Set([";","}","{","param","parametre","const","let","fn","use","kullan","module","@","return","paramgroup"]);var continuation=new Set(["+","-","*","/","%","^","(",","]);function readNMParameterSweepSlots(source,members){const cst=parseNMSourceCST(source);if(cst.issues.length)throw new NMParameterSweepInputError("source");const tokens=cst.tokens.filter(token=>!token.trivia);const positions=new Map(tokens.map((token,index)=>[token.range.start.offset,index]));return members.map(member=>{const at=positions.get(member.declarationRange.start.offset);if(at===void 0||!(member.declarationKind==="const"?["const"]:["param","parametre"]).includes(tokens[at].text)||tokens[at+1]?.text!==member.name)throw new NMParameterSweepInputError("binding");let equal2=at+2;while(equal2<tokens.length&&!["=",";","{","}"].includes(tokens[equal2].text))equal2++;if(tokens[equal2]?.text!=="=")throw new NMParameterSweepInputError("source");const first=equal2+1;if(member.index!==void 0){if(tokens[first]?.text!=="[")throw new NMParameterSweepInputError("source");const entries=[];let current=[],depth4=0,closed=false;for(let i=first+1;i<tokens.length;i++){const token=tokens[i];if(depth4===0&&(token.text===","||token.text==="]")){if(!current.length)throw new NMParameterSweepInputError("source");entries.push(current);current=[];if(token.text==="]"){closed=true;break}continue}if(["(","["].includes(token.text))depth4++;if([")","]"].includes(token.text))depth4--;if(depth4<0||[";","{","}"].includes(token.text))throw new NMParameterSweepInputError("source");current.push(token)}if(!closed||!entries[member.index]?.length)throw new NMParameterSweepInputError("binding");return{parameterName:member.parameterName,tokens:entries[member.index]}}const value=[];let depth3=0;for(let i=first;i<tokens.length;i++){const token=tokens[i],previous=tokens[i-1];if(depth3===0&&(boundary.has(token.text)||i>first&&token.range.start.line>previous.range.end.line&&!continuation.has(previous.text)&&!continuation.has(token.text)))break;if(["(","["].includes(token.text))depth3++;if([")","]"].includes(token.text))depth3--;if(depth3<0)throw new NMParameterSweepInputError("source");value.push(token)}if(!value.length||depth3!==0)throw new NMParameterSweepInputError("source");return{parameterName:member.parameterName,tokens:value}})}function readNMLegacySweepMember(source,name2,kind,line){const tokens=parseNMSourceCST(source).tokens.filter(token=>!token.trivia),matches=[];let depth3=0,functionName,pending;for(let i=0;i<tokens.length;i++){const token=tokens[i],next=tokens[i+1];if(!depth3&&token.text==="fn")pending=next?.text;if(token.text==="{"){depth3++;if(depth3===1){functionName=pending;pending=void 0}}if(token.text==="}"){depth3--;if(!depth3)functionName=void 0}if(depth3!==0&&!(depth3===1&&functionName==="main"))continue;if(!(kind==="param"?["param","parametre"]:["const"]).includes(token.text)||next?.kind!=="identifier")continue;const vector=tokens[i+2]?.text===":"&&tokens[i+3]?.text==="Angle"&&tokens[i+4]?.text==="[";let index;if(vector&&name2.startsWith(`${next.text}_`)){const suffix=name2.slice(next.text.length+1);if(/^\d+$/u.test(suffix))index=Number(suffix)}if(next.text!==name2&&index===void 0)continue;if(token.range.start.line+1!==line)continue;matches.push({name:next.text,parameterName:name2,declarationKind:kind,...index!==void 0?{index}:{},declarationRange:{start:token.range.start,end:next.range.end},referenceRange:next.range})}if(matches.length!==1)throw new NMParameterSweepInputError("binding");return matches[0]}function bindNMParameterSweepPoint(source,slots,assignment){return applySourcePatches(source,slots.flatMap(slot=>{if(!Object.prototype.hasOwnProperty.call(assignment,slot.parameterName))throw new NMParameterSweepInputError("binding");const value=formatNMSourceNumber(assignment[slot.parameterName]);return slot.tokens.map((token,index)=>({start:token.range.start.offset,end:token.range.end.offset,text:index===0?value:blankSource(token.text)}))}))}var plans2=new WeakMap;function prepareNMParameterGroupSweep(source,input,options={}){try{if(typeof source!=="string")throw new NMParameterSweepInputError("input");if(source.length>nmParameterSweepLimits.sourceBytes)throw new NMParameterSweepInputError("budget");const request=readNMParameterGroupSweepRequest(input),parseOptions=snapshotNMParameterSweepOptions(source,options);const parsed=parseNMCode(source,parseOptions),error=diagnosticsToError(parsed.diagnostics);if(error)throw new NMParameterSweepInputError("source",error);const group=parsed.program.parameterGroups?.declarations.find(group2=>group2.name===request.groupName);if(!group)throw new NMParameterSweepInputError("binding");return createPlan(source,parsed,parseOptions,group.members,request,group.name)}catch(error){return failed(error)}}function failed(error){return{success:false,error:error instanceof NMParameterSweepInputError?parameterSweepError(error.issue,error.message):parameterSweepError("source",error instanceof Error?error.message:void 0)}}function prepareNMLegacyParameterSweep(source,input={},options={}){let parameterName="";try{if(typeof source!=="string")throw new NMParameterSweepInputError("input");if(source.length>nmParameterSweepLimits.sourceBytes)throw new NMParameterSweepInputError("budget");const raw=sweepDataFields(input);if(Object.keys(raw).some(key4=>!["parameterName","values"].includes(key4))||raw.parameterName!==void 0&&(typeof raw.parameterName!=="string"||!raw.parameterName.length))throw new NMParameterSweepInputError("input");const parseOptions=snapshotNMParameterSweepOptions(source,options),parsed=parseNMCode(source,parseOptions);const named=typeof raw.parameterName==="string"?raw.parameterName:void 0;const candidate=parsed.program.statements.find(statement=>named?(statement.kind==="const"||statement.kind==="param")&&statement.name===named:statement.kind==="const"&&(statement.valueType==="Angle"||statement.valueType==="Float"));if(!candidate&&!named)return void 0;parameterName=named??(candidate&&"name"in candidate?String(candidate.name):"");const error=diagnosticsToError(parsed.diagnostics);if(error)throw new NMParameterSweepInputError("source",error);if(!candidate||candidate.kind!=="const"&&candidate.kind!=="param")throw new NMParameterSweepInputError("binding");if(parsed.program.statements.filter(statement=>(statement.kind==="const"||statement.kind==="param")&&statement.name===parameterName).length!==1)throw new NMParameterSweepInputError("binding");const request=readNMParameterGroupSweepRequest({groupName:"legacy",combination:"zip",failurePolicy:"collect",axes:[{parameterName,values:raw.values===void 0?Array.from({length:9},(_,index)=>Math.PI*index/8):raw.values}]});if(candidate.kind==="const"&&candidate.valueType==="Int"&&request.axes[0].values.some(value=>!Number.isSafeInteger(value)))throw new NMParameterSweepInputError("input");const member=readNMLegacySweepMember(source,parameterName,candidate.kind,candidate.line);return{...createPlan(source,parsed,parseOptions,[member],request),parameterName,...candidate.kind==="const"?{parameterType:candidate.valueType}:{}}}catch(error){return{...failed(error),parameterName}}}function createPlan(source,parsed,parseOptions,members,request,groupName){const axisMap=new Map(request.axes.map(axis=>[axis.parameterName,axis]));if(axisMap.size!==request.axes.length||axisMap.size!==members.length)throw new NMParameterSweepInputError("binding");const axes=members.map(member=>{const axis=axisMap.get(member.parameterName);if(!axis)throw new NMParameterSweepInputError("binding");return axis});const count=countNMParameterSweepEvaluations(request);const slots=readNMParameterSweepSlots(source,members),points=[];const workspaceBytes=Object.values(parseOptions.workspaceModules??{}).reduce((bytes2,text)=>bytes2+new TextEncoder().encode(text).length,0);for(let index=0;index<count;index++){let remaining=index;const indices=Array.from({length:axes.length},()=>index);if(request.combination==="cartesian")for(let axis=axes.length-1;axis>=0;axis--){indices[axis]=remaining%axes[axis].values.length;remaining=Math.floor(remaining/axes[axis].values.length)}const assignments=Object.fromEntries(axes.map((axis,at)=>[axis.parameterName,axis.values[indices[at]]]));const candidate=bindNMParameterSweepPoint(source,slots,assignments);if(candidate.length>nmParameterSweepLimits.sourceBytes||new TextEncoder().encode(candidate).length+workspaceBytes>nmParameterSweepLimits.sourceBytes)throw new NMParameterSweepInputError("budget");points.push({source:candidate,assignments})}const context={source,parseOptions,seed:parsed.program.seed??null,...groupName?{groupName}:{},combination:request.combination,failurePolicy:request.failurePolicy??"stop",axes:[...axes]};const plan=Object.freeze({});plans2.set(plan,{context,points});return{success:true,plan,requestedEvaluations:count,context:structuredClone(context)}}function readNMParameterSweepPoint(plan,index){const state=plans2.get(plan);if(!state||!Number.isSafeInteger(index)||index<0||index>=state.points.length)return void 0;return structuredClone({...state.points[index],parseOptions:state.context.parseOptions,legacy:state.context.groupName===void 0})}function readNMParameterSweepPlan(plan){const state=plans2.get(plan);return state?{context:structuredClone(state.context),requestedEvaluations:state.points.length}:void 0}var NM_STATE_PROBABILITY_RELATIVE_FLOOR=.0032;function getStateProbabilities(state){const threshold=NM_STATE_PROBABILITY_RELATIVE_FLOOR/2**state.numQubits;return state.amplitudes.map((amplitude,index)=>({state:index.toString(2).padStart(state.numQubits,"0"),probability:Math.sqrt(amplitude.re*amplitude.re+amplitude.im*amplitude.im)**2})).filter(entry=>entry.probability>threshold)}var NM_STATE_PROBABILITY_DISPLAY_LIMIT=256;function boundStateRowsForDisplay(entries,rank,limit=NM_STATE_PROBABILITY_DISPLAY_LIMIT){if(entries.length<=limit)return{entries:[...entries],omitted:0};const ranked=entries.map(entry=>({state:entry.state,rank:rank(entry)}));ranked.sort((left,right)=>right.rank-left.rank||(left.state<right.state?-1:left.state>right.state?1:0));const kept=new Set(ranked.slice(0,limit).map(entry=>entry.state));return{entries:entries.filter(entry=>kept.has(entry.state)),omitted:entries.length-limit}}function boundStateTimelineForResult(timeline){return timeline.map(step=>{const probabilities=boundStateRowsForDisplay(step.probabilities,entry=>entry.probability);const deltas=boundStateRowsForDisplay(step.probabilityDeltas,entry=>Math.abs(entry.delta));if(probabilities.omitted===0&&deltas.omitted===0)return step;return{...step,probabilities:probabilities.entries,...probabilities.omitted>0?{omittedProbabilities:probabilities.omitted}:{},probabilityDeltas:deltas.entries,...deltas.omitted>0?{omittedProbabilityDeltas:deltas.omitted}:{}}})}var errorText=error=>error instanceof Error?error.message:void 0;var empty7=()=>({contractVersion:NM_PARAMETER_SWEEP_VERSION,success:false,status:"rejected",requestedEvaluations:0,pointEvaluations:0,circuitEvaluations:0,work:createNMSweepWorkBudget().snapshot(),points:[]});function runPoint(execute,plan,index,budget){const input=readNMParameterSweepPoint(plan,index);const point={index,assignments:input.assignments,parameters:{},status:"execution-error",executed:false,probabilityEvidence:{kind:"unavailable"}};try{const parsed=parseNMCode(input.source,input.parseOptions),error=diagnosticsToError(parsed.diagnostics);if(error){point.error=parameterSweepError("source",error);return point}point.parameters={...parsed.params};if(input.legacy)for(const statement of parsed.program.statements){if(statement.kind==="const"&&Object.prototype.hasOwnProperty.call(input.assignments,statement.name))point.parameters[statement.name]=statement.value}if(Object.entries(input.assignments).some(([name2,value])=>!Object.prototype.hasOwnProperty.call(point.parameters,name2)||point.parameters[name2]!==value)){point.error=parameterSweepError("binding");return point}point.executed=true;const result2=withNMSweepWorkBudget(budget,()=>execute(input.source,input.parseOptions));if(!result2||typeof result2.success!=="boolean")throw new Error("Executor returned an invalid result.");if(result2.execution)point.execution=structuredClone(result2.execution);if(result2.programResult)point.programResult=structuredClone(result2.programResult);if(!result2.success){point.error=parameterSweepError("execution",result2.error);return point}if(result2.cost!==void 0){if(!Number.isFinite(result2.cost))throw new Error("Nonfinite sweep cost.");point.cost=result2.cost}for(const key4 of["metrics","expectations","gradients"])if(result2[key4]){if(Object.values(result2[key4]).some(value=>!Number.isFinite(value)))throw new Error("Nonfinite sweep metric.");point[key4]={...result2[key4]}}if(result2.training)point.training=structuredClone(result2.training);if(result2.optimization)point.optimization=structuredClone(result2.optimization);const rows=result2.preMeasurementProbabilities?.length?result2.preMeasurementProbabilities:result2.finalState?getStateProbabilities(result2.finalState):void 0;if(rows){if(rows.some(row=>typeof row.state!=="string"||!Number.isFinite(row.probability)||row.probability<0||row.probability>1+1e-10))throw new Error("Invalid probability evidence.");const bounded=boundStateRowsForDisplay(rows,row=>row.probability,nmParameterSweepLimits.probabilityRows);point.probabilityEvidence={kind:"dense",rows:structuredClone(bounded.entries),omitted:bounded.omitted}}point.status=result2.programResult?.status==="error"?"program-error":"ok";return point}catch(error){return{...point,status:"execution-error",cost:void 0,metrics:void 0,expectations:void 0,gradients:void 0,probabilityEvidence:{kind:"unavailable"},error:parameterSweepError("execution",errorText(error))}}}function executeNMParameterSweepPlan(execute,plan,controls={}){const prepared2=readNMParameterSweepPlan(plan);if(!prepared2)return{...empty7(),error:parameterSweepError("input","Unknown or expired sweep plan.")};const result2={...empty7(),...prepared2,status:"completed"};const budget=createNMSweepWorkBudget();let shouldCancel,onPoint;try{shouldCancel=controls.shouldCancel;onPoint=controls.onPoint;if(shouldCancel!==void 0&&typeof shouldCancel!=="function"||onPoint!==void 0&&typeof onPoint!=="function")throw new Error("Invalid sweep callback.")}catch(error){return{...result2,status:"failed",error:parameterSweepError("callback",errorText(error))}}for(let index=0;index<prepared2.requestedEvaluations;index++){try{const cancelled=shouldCancel?.();if(shouldCancel&&typeof cancelled!=="boolean")throw new Error("Cancellation callback must return a boolean.");if(cancelled){result2.status="cancelled";break}}catch(error){result2.status="failed";result2.error=parameterSweepError("callback",errorText(error));break}const before=budget.snapshot(),point=runPoint(execute,plan,index,budget),after=budget.snapshot();point.work={programEvaluations:after.programEvaluations-before.programEvaluations,adjointEvaluations:after.adjointEvaluations-before.adjointEvaluations,secondaryEvaluations:after.secondaryEvaluations-before.secondaryEvaluations,adjointApplications:after.adjointApplications-before.adjointApplications,...after.exhausted?{exhausted:after.exhausted}:{}};result2.work=after;result2.circuitEvaluations=sweepCircuitEvaluations(after);result2.points.push(point);if(point.executed)result2.pointEvaluations++;if(after.exhausted){point.status="execution-error";point.error=parameterSweepError("nested",after.exhausted);point.cost=void 0;point.metrics=void 0;point.expectations=void 0;point.gradients=void 0;point.training=void 0;point.optimization=void 0;point.probabilityEvidence={kind:"unavailable"};result2.status="failed";result2.error=point.error}try{onPoint?.(structuredClone(point),prepared2.requestedEvaluations)}catch(error){result2.status="failed";result2.error=parameterSweepError("callback",errorText(error));break}if(after.exhausted)break;if(point.status!=="ok"&&prepared2.context.failurePolicy==="stop"&&index+1<prepared2.requestedEvaluations){result2.status="stopped";break}}result2.success=result2.status==="completed"&&result2.points.every(point=>point.status==="ok");return result2}function executeNMParameterGroupSweep(execute,source,request,options={},controls={}){const prepared2=prepareNMParameterGroupSweep(source,request,options);return prepared2.success?executeNMParameterSweepPlan(execute,prepared2.plan,controls):{...empty7(),error:prepared2.error}}function executeNMParameterSweep(execute,source,options={},parseOptions={}){const prepared2=prepareNMLegacyParameterSweep(source,options,parseOptions);if(!prepared2)return void 0;if(!prepared2.success)return{parameterName:prepared2.parameterName,points:[],status:"rejected",circuitEvaluations:0,error:`${prepared2.error.code}: ${prepared2.error.detail??prepared2.error.message}`};const result2=executeNMParameterSweepPlan(execute,prepared2.plan);return{parameterName:prepared2.parameterName,parameterType:prepared2.parameterType,status:result2.status,circuitEvaluations:result2.circuitEvaluations,pointEvaluations:result2.pointEvaluations,work:result2.work,...result2.error?{error:`${result2.error.code}: ${result2.error.detail??result2.error.message}`}:{},points:result2.points.map(point=>{const evidence=point.probabilityEvidence,probabilities=evidence.kind==="dense"?evidence.rows:[];const dominant=probabilities.reduce((best,row)=>!best||row.probability>best.probability?row:best,void 0);return{value:point.assignments[prepared2.parameterName],success:point.status==="ok",probabilities,probabilityEvidence:evidence,metrics:point.metrics,work:point.work,dominantState:dominant?.state,dominantProbability:dominant?.probability,...point.error?{error:`${point.error.code}: ${point.error.detail??point.error.message}`}:{},...point.programResult?{programResult:point.programResult}:{},...point.execution?{execution:point.execution}:{},...point.cost!==void 0?{cost:point.cost}:{},...evidence.kind==="dense"&&evidence.omitted?{omittedProbabilities:evidence.omitted}:{}}})}}function basisState2(index,numQubits){const amplitudes=new Array(2**numQubits).fill(null).map(()=>complex(0));amplitudes[index]=complex(1);return{amplitudes,numQubits}}var NM_VQE_EXACT_REFERENCE_MAX_QUBITS=10;function buildHamiltonianMatrix(hamiltonian,numQubits){const dim=2**numQubits;const matrix=Array.from({length:dim},()=>new Array(dim).fill(0));for(let i=0;i<dim;i+=1){for(const term of hamiltonian){let v=basisState2(i,numQubits);for(const factor of term.factors){v=applySingleQubitGate(v,GATES[factor.pauli],factor.qubit)}const storage=getNMDenseStatevectorStorage(v);for(let j=0;j<dim;j+=1){matrix[j][i]+=term.coeff*storage.real[j]}}}return matrix}function exactGroundEnergy(hamiltonian,numQubits){if(numQubits>NM_VQE_EXACT_REFERENCE_MAX_QUBITS){throw new RangeError(`Exact ground-energy reference requires at most ${NM_VQE_EXACT_REFERENCE_MAX_QUBITS} qubits; the dense Hamiltonian is 2^n x 2^n.`)}const dim=2**numQubits;const H=buildHamiltonianMatrix(hamiltonian,numQubits);let mu=0;for(let i=0;i<dim;i+=1){let rowSum=H[i][i];for(let j=0;j<dim;j+=1){if(j!==i)rowSum+=Math.abs(H[i][j])}mu=Math.max(mu,rowSum)}const random=createSeededRandom(3);let v=Array.from({length:dim},()=>random()-.5);const applyShifted=x=>{const out=new Array(dim).fill(0);for(let i=0;i<dim;i+=1){let sum=mu*x[i];for(let j=0;j<dim;j+=1){sum-=H[i][j]*x[j]}out[i]=sum}return out};let dominant=0;for(let iter=0;iter<300;iter+=1){const w=applyShifted(v);const norm=Math.sqrt(w.reduce((s,x)=>s+x*x,0))||1;v=w.map(x=>x/norm);dominant=norm}return mu-dominant}var NM_TRAINABILITY_CONTRACT_VERSION="0.1";var NM_TRAINABILITY_MAX_QUBITS=14;var NM_TRAINABILITY_MIN_SAMPLES=8;var NM_TRAINABILITY_MAX_SAMPLES=400;var NM_TRAINABILITY_MAX_LAYERS=4;var nmTrainabilityDiagnosticCodes={staticRisk:"NM-QML-301",input:"NM-QML-TRAINABILITY-001",evaluation:"NM-QML-TRAINABILITY-002",invariant:"NM-QML-TRAINABILITY-003"};function buildHardwareEfficientAnsatz(numQubits,layers){const decls=[];const gates2=[];let k=0;for(let layer=0;layer<layers;layer+=1){for(let i=0;i<numQubits;i+=1){decls.push(` param p${k}: Angle = 0;`);gates2.push(` Ry(q[${i}], p${k});`);k+=1}for(let i=0;i<numQubits-1;i+=1){gates2.push(` CNOT(q[${i}], q[${i+1}]);`)}}return["module barren;","","fn main() {",` let q: QReg<${numQubits}> = qreg[${numQubits}];`,...decls,...gates2," let cost = expect Z(q[0]);"," return cost;","}"].join("\n")}function computeBarrenPlateauProfileChecked(execute,options={}){if(typeof execute!=="function"||!options||typeof options!=="object"||Array.isArray(options)){return{success:false,code:nmTrainabilityDiagnosticCodes.input,kind:"input",error:"Trainability profiling requires an executor and options object.",circuitEvaluations:0}}const maxQubits=options.maxQubits??NM_TRAINABILITY_MAX_QUBITS;const samples=options.samples??80;const layers=options.layers??2;const seed=options.seed??1;if(!Number.isInteger(maxQubits)||maxQubits<1||maxQubits>NM_TRAINABILITY_MAX_QUBITS||!Number.isInteger(samples)||samples<NM_TRAINABILITY_MIN_SAMPLES||samples>NM_TRAINABILITY_MAX_SAMPLES||!Number.isInteger(layers)||layers<1||layers>NM_TRAINABILITY_MAX_LAYERS||!Number.isSafeInteger(seed)){return{success:false,code:nmTrainabilityDiagnosticCodes.input,kind:"input",error:`Trainability profiling requires 1-${NM_TRAINABILITY_MAX_QUBITS} qubits, ${NM_TRAINABILITY_MIN_SAMPLES}-${NM_TRAINABILITY_MAX_SAMPLES} samples, 1-${NM_TRAINABILITY_MAX_LAYERS} layers, and a safe-integer seed.`,circuitEvaluations:0}}const random=createSeededRandom(seed);const shift=Math.PI/2;let circuitEvaluations=0;const points=[];for(let numQubits=1;numQubits<=maxQubits;numQubits+=1){const code=buildHardwareEfficientAnsatz(numQubits,layers);const paramCount=layers*numQubits;const gradients=[];for(let sample=0;sample<samples;sample+=1){const values2={};for(let p=0;p<paramCount;p+=1){values2[`p${p}`]=random()*2*Math.PI}let plus;let minus;try{plus=evaluateNMCost(execute,code,{...values2,p0:values2.p0+shift});circuitEvaluations+=1;minus=evaluateNMCost(execute,code,{...values2,p0:values2.p0-shift});circuitEvaluations+=1}catch{return{success:false,code:nmTrainabilityDiagnosticCodes.evaluation,kind:"evaluation",error:"Trainability cost evaluation threw an exception.",circuitEvaluations}}if(plus==null||minus==null||!Number.isFinite(plus)||!Number.isFinite(minus)){return{success:false,code:nmTrainabilityDiagnosticCodes.evaluation,kind:"evaluation",error:"Trainability cost evaluation must return two finite values per sample.",circuitEvaluations}}const gradient=.5*(plus-minus);if(!Number.isFinite(gradient))return{success:false,code:nmTrainabilityDiagnosticCodes.invariant,kind:"invariant",error:"Trainability gradient produced a non-finite value.",circuitEvaluations};gradients.push(gradient)}const mean=gradients.reduce((sum,g)=>sum+g,0)/(gradients.length||1);const variance=gradients.reduce((sum,g)=>sum+(g-mean)**2,0)/(gradients.length||1);if(gradients.length!==samples||!Number.isFinite(variance)||variance<0)return{success:false,code:nmTrainabilityDiagnosticCodes.invariant,kind:"invariant",error:"Trainability variance or sample accounting drifted.",circuitEvaluations};points.push({qubits:numQubits,gradientVariance:variance,successfulSamples:gradients.length,circuitEvaluations:gradients.length*2})}if(circuitEvaluations!==maxQubits*samples*2)return{success:false,code:nmTrainabilityDiagnosticCodes.invariant,kind:"invariant",error:"Trainability circuit-evaluation accounting drifted.",circuitEvaluations};return{success:true,contractVersion:NM_TRAINABILITY_CONTRACT_VERSION,seed,maxQubits,samples,layers,circuitEvaluations,points}}function computeBarrenPlateauProfile(execute,options={}){const result2=computeBarrenPlateauProfileChecked(execute,options);return result2.success?result2.points.map(({qubits,gradientVariance})=>({qubits,gradientVariance})):[]}function vqeEnergy(execute,ansatz,hamiltonian,paramValues){let patched=ansatz;for(const[name2,value]of Object.entries(paramValues)){patched=replaceNMParameterValue(patched,name2,value)}const result2=execute(patched);if(!result2.success||!result2.finalState){return void 0}let energy=0;for(const term of hamiltonian){energy+=term.factors.length===0?term.coeff:term.coeff*expectationPauliString(result2.finalState,term.factors)}return energy}function executeNMVQE(execute,ansatz,hamiltonian,options={}){const parsed=parseNMCode(ansatz);const empty8={parameterNames:[],finalParams:{},energyHistory:[],exactGroundEnergy:0};const blockingError=diagnosticsToError(parsed.diagnostics);if(blockingError){return{success:false,error:blockingError,...empty8}}const parameterNames=Object.keys(parsed.params);if(parameterNames.length===0){return{success:false,error:"No trainable param declarations found.",...empty8}}if(parsed.numQubits>NM_VQE_EXACT_REFERENCE_MAX_QUBITS){return{success:false,error:`VQE requires an exact ground-energy reference, which supports at most ${NM_VQE_EXACT_REFERENCE_MAX_QUBITS} qubits; this ansatz uses ${parsed.numQubits}.`,...empty8}}const exact3=exactGroundEnergy(hamiltonian,parsed.numQubits);if(vqeEnergy(execute,ansatz,hamiltonian,parsed.params)==null){return{success:false,error:"Could not evaluate the ansatz energy.",...empty8,exactGroundEnergy:exact3}}const steps=Math.min(Math.max(options.steps??60,1),120);const learningRate=options.learningRate??.25;const shift=Math.PI/2;const values2={...parsed.params};const energyHistory=[];for(let step=0;step<steps;step+=1){const energy=vqeEnergy(execute,ansatz,hamiltonian,values2);if(energy==null){return{success:false,error:"Energy evaluation failed during VQE.",...empty8,exactGroundEnergy:exact3}}energyHistory.push(energy);const gradients={};for(const name2 of parameterNames){const plus=vqeEnergy(execute,ansatz,hamiltonian,{...values2,[name2]:values2[name2]+shift});const minus=vqeEnergy(execute,ansatz,hamiltonian,{...values2,[name2]:values2[name2]-shift});if(plus==null||minus==null){return{success:false,error:"Gradient evaluation failed during VQE.",...empty8,exactGroundEnergy:exact3}}gradients[name2]=.5*(plus-minus)}for(const name2 of parameterNames){values2[name2]-=learningRate*gradients[name2]}}const finalEnergy=vqeEnergy(execute,ansatz,hamiltonian,values2);if(finalEnergy!=null){energyHistory.push(finalEnergy)}return{success:true,parameterNames,finalParams:values2,energyHistory,metricHistory:{energy:[...energyHistory],residual:energyHistory.map(energy=>Math.abs(energy-exact3))},exactGroundEnergy:exact3}}var nmTrainingDiagnosticCodes={input:"NM-QML-TRAIN-001",learningRate:"NM-QML-TRAIN-002",objective:"NM-QML-TRAIN-003",cost:"NM-QML-TRAIN-004",gradient:"NM-QML-TRAIN-005",invariant:"NM-QML-TRAIN-006"};function executeNMCodeWithParams(execute,code,paramValues,parseOptions){let patched=code;for(const[name2,value]of Object.entries(paramValues)){patched=replaceNMParameterValue(patched,name2,value)}return execute(patched,parseOptions)}function stripGradientStatements(code){return code.split(/\r?\n/).filter(line=>!/^\s*let\s+[A-Za-z_]\w*\s*=\s*gradient\s+[A-Za-z_]\w*\s+wrt\s+[A-Za-z_]\w*\s*;?\s*$/.test(line)).join("\n")}function stripOptimizeAnnotations(code){return code.split(/\r?\n/).map(line=>/^\s*@optimize\b/.test(line)?" ".repeat(line.length):line).join("\n")}function evaluateNMGradient(execute,code,target2,parameter,parseOptions={}){parseOptions=snapshotNMQMLParseOptions(parseOptions);const parsed=parseNMCode(code,parseOptions);if(diagnosticsToError(parsed.diagnostics)){return{error:"Program has parser diagnostics."}}const currentValue=parsed.params[parameter];if(!Object.prototype.hasOwnProperty.call(parsed.params,parameter)||typeof currentValue!=="number"||!Number.isFinite(currentValue)){return{error:`Unknown trainable parameter: ${parameter}.`}}if(parsed.program.classicalFunctions||parsed.program.computeApply){const result2=computeNMGradientsAdjoint(stripGradientStatements(code),parsed.params,{objectiveTarget:target2,parseOptions});if(!("gradients"in result2))return{error:result2.error};const value=result2.gradients[parameter];return Object.prototype.hasOwnProperty.call(result2.gradients,parameter)&&typeof value==="number"&&Number.isFinite(value)?{value}:{error:`No finite gradient for parameter: ${parameter}.`}}const policyError=parameterShiftError(parsed.program.statements,parameter);if(policyError)return{error:policyError};const gradientCode=stripGradientStatements(code);const shift=Math.PI/2;const plus=executeNMCodeWithParams(execute,gradientCode,{[parameter]:currentValue+shift},parseOptions);const minus=executeNMCodeWithParams(execute,gradientCode,{[parameter]:currentValue-shift},parseOptions);const plusValue=plus.expectations?.[target2];const minusValue=minus.expectations?.[target2];if(!plus.success||!minus.success||plusValue==null||minusValue==null){return{error:`Unknown expectation target: ${target2}.`}}return{value:(plusValue-minusValue)/2}}function appendMetricHistory(metricHistory,metrics){if(!metrics){return}for(const[name2,value]of Object.entries(metrics)){metricHistory[name2]??(metricHistory[name2]=[]);metricHistory[name2].push(value)}}function maybeMetricHistory(metricHistory){return Object.values(metricHistory).some(values2=>values2.length>0)?metricHistory:void 0}function evaluateNMCost(execute,code,paramValues,parseOptions={}){const result2=executeNMCodeWithParams(execute,stripOptimizeAnnotations(code),paramValues,snapshotNMQMLParseOptions(parseOptions));return result2.success&&result2.programResult?.status!=="error"&&result2.cost!=null&&Number.isFinite(result2.cost)?result2.cost:void 0}function evaluateNMTrainingCost(execute,code,paramValues,objectiveTarget){const result2=executeNMCodeWithParams(execute,stripOptimizeAnnotations(code),paramValues);if(!result2.success||result2.programResult?.status==="error")return void 0;const value=objectiveTarget?result2.expectations?.[objectiveTarget]:result2.cost;return value!=null&&Number.isFinite(value)?value:void 0}function getNMBlochVector(execute,code,paramValues,parseOptions={}){const result2=executeNMCodeWithParams(execute,stripOptimizeAnnotations(code),paramValues,snapshotNMQMLParseOptions(parseOptions));const bloch=result2.blochVectors?.[0];return result2.success&&result2.programResult?.status!=="error"&&bloch?{x:bloch.x,y:bloch.y,z:bloch.z}:void 0}function computeNMCostLandscape(execute,code,options={},parseOptions={}){parseOptions=snapshotNMQMLParseOptions(parseOptions);const parsed=parseNMCode(code,parseOptions);if(diagnosticsToError(parsed.diagnostics)){return void 0}const availableParameters=Object.keys(parsed.params);const requestedParameters=[...new Set(options.parameterNames??[])].filter(name2=>availableParameters.includes(name2));const parameterNames=requestedParameters.length>0?requestedParameters.slice(0,2):availableParameters;const min=0;const max=2*Math.PI;if(parameterNames.length===1){const resolution=Math.min(Math.max(options.resolution??48,8),96);const values2=[];for(let i=0;i<resolution;i+=1){const v=min+i/(resolution-1)*(max-min);const cost3=evaluateNMCost(execute,code,{[parameterNames[0]]:v},parseOptions);if(cost3===void 0)return void 0;values2.push(cost3)}return{parameterNames,resolution,min,max,values:values2}}if(parameterNames.length===2){const resolution=Math.min(Math.max(options.resolution??28,8),48);const grid=[];for(let i=0;i<resolution;i+=1){const a=min+i/(resolution-1)*(max-min);const row=[];for(let j=0;j<resolution;j+=1){const b=min+j/(resolution-1)*(max-min);const cost3=evaluateNMCost(execute,code,{[parameterNames[0]]:a,[parameterNames[1]]:b},parseOptions);if(cost3===void 0)return void 0;row.push(cost3)}grid.push(row)}return{parameterNames,resolution,min,max,grid}}return void 0}function executeNMTraining(execute,code,options={},parseOptions={}){parseOptions=snapshotNMQMLParseOptions(parseOptions);options={...options};let circuitEvaluations=0;const countedExecute=candidate=>{circuitEvaluations+=1;return execute(candidate,parseOptions)};const trainingCode=stripNMTrainBlocks(stripOptimizeAnnotations(code));const parsed=parseNMCode(code,parseOptions);const empty8={parameterNames:[],initialParams:{},finalParams:{},costHistory:[],paramHistory:[]};const fail11=(code2,message)=>({success:false,error:`${code2}: ${message}`,circuitEvaluations,...empty8});if(options.steps!=null&&(!Number.isInteger(options.steps)||options.steps<1||options.steps>100)){return fail11(nmTrainingDiagnosticCodes.input,"Training steps must be an integer from 1 through 100.")}if(options.learningRate!=null&&(!Number.isFinite(options.learningRate)||options.learningRate<=0||options.learningRate>5)){return fail11(nmTrainingDiagnosticCodes.learningRate,"Training learningRate must be finite and in the interval (0, 5].")}if(options.objectiveTarget!=null&&!/^[A-Za-z_]\w{0,127}$/.test(options.objectiveTarget)){return fail11(nmTrainingDiagnosticCodes.objective,"Training objectiveTarget must be a bounded identifier.")}if(options.optimizer!=null&&!["gd","momentum","adam","spsa","qng"].includes(options.optimizer)){return fail11(nmTrainingDiagnosticCodes.input,"Training optimizer is not supported.")}if(options.objective!=null&&options.objective!=="minimize"&&options.objective!=="maximize"){return fail11(nmTrainingDiagnosticCodes.input,"Training objective must be minimize or maximize.")}if(options.gradientMethod!=null&&!["parameter-shift","adjoint","auto"].includes(options.gradientMethod)){return fail11(nmTrainingDiagnosticCodes.input,"Training gradientMethod is not supported.")}const blockingError=diagnosticsToError(parsed.diagnostics);if(blockingError){return{success:false,error:blockingError,...empty8}}const parameterNames=Object.keys(parsed.params);if(parameterNames.length===0){return{success:false,error:"No trainable param declarations found.",...empty8}}if(parameterNames.length>8){return{success:false,error:"The trainer supports up to 8 trainable parameters.",...empty8}}if(Object.values(parsed.params).some(value=>!Number.isFinite(value))){return fail11(nmTrainingDiagnosticCodes.invariant,"Training parameters must be finite.")}const initialParams={...parsed.params};const helperTraining=Boolean(parsed.program.classicalFunctions);const helperPolicyError=classicalFunctionTrainingError(parsed,options);if(helperPolicyError)return fail11(nmTrainingDiagnosticCodes.gradient,helperPolicyError);const optimizer=options.optimizer??"gd";const objectiveTarget=options.objectiveTarget;const objectiveExists=parsed.program.statements.some(statement=>statement.kind==="expectation"&&(!objectiveTarget||statement.binding===objectiveTarget));if(!objectiveExists||optimizer!=="spsa"&&evaluateNMTrainingCost(countedExecute,trainingCode,initialParams,objectiveTarget)==null){return fail11(nmTrainingDiagnosticCodes.cost,"The circuit has no finite expectation cost to optimize.")}const steps=options.steps??40;const learningRate=options.learningRate??.2;const descentSign=options.objective==="maximize"?-1:1;const shift=Math.PI/2;let gradientMethod="parameter-shift";const values2={...initialParams};const costHistory=[];const paramHistory=[];const metricHistory={};const qngMetricHistory={};const qngConditionHistory=[];const qngSingularSteps=[];const velocity=Object.fromEntries(parameterNames.map(n=>[n,0]));const adamM=Object.fromEntries(parameterNames.map(n=>[n,0]));const adamV=Object.fromEntries(parameterNames.map(n=>[n,0]));const beta=.9;const beta1=.9;const beta2=.999;const eps=1e-8;const spsaRandom=createSeededRandom(parsed.program.seed??20045);for(let step=0;step<steps;step+=1){if(optimizer==="spsa"){paramHistory.push({...values2});const spsa=executeNMSPSAStep(values2,step,steps,spsaRandom,candidate=>evaluateNMTrainingCost(countedExecute,trainingCode,candidate,objectiveTarget),descentSign,{...options.spsa,a:options.spsa?.a??options.learningRate});if("error"in spsa)return fail11(spsa.code,spsa.error);costHistory.push(spsa.midpointCost);options.onProgress?.({step,cost:spsa.midpointCost,params:{...values2}});Object.assign(values2,spsa.values);gradientMethod="spsa";continue}const cost3=evaluateNMTrainingCost(countedExecute,trainingCode,values2,objectiveTarget);if(cost3==null){return fail11(nmTrainingDiagnosticCodes.cost,"Cost evaluation failed or produced a non-finite value during training.")}costHistory.push(cost3);paramHistory.push({...values2});options.onProgress?.({step,cost:cost3,params:{...values2}});appendMetricHistory(metricHistory,executeNMCodeWithParams(countedExecute,trainingCode,values2).metrics);const adjoint=options.gradientMethod!=="parameter-shift"?computeNMGradientsAdjoint(trainingCode,values2,{objectiveTarget,parseOptions}):{error:"Parameter-shift requested."};const gradients="gradients"in adjoint?adjoint.gradients:{};gradientMethod="gradients"in adjoint?"adjoint":"parameter-shift";if(!("gradients"in adjoint)){if(helperTraining)return fail11(nmTrainingDiagnosticCodes.gradient,adjoint.error);const policyError=parameterShiftError(parsed.program.statements,parameterNames);if(policyError)return fail11(nmTrainingDiagnosticCodes.gradient,policyError)}for(const name2 of"gradients"in adjoint?[]:parameterNames){const plus=evaluateNMTrainingCost(countedExecute,trainingCode,{...values2,[name2]:values2[name2]+shift},objectiveTarget);const minus=evaluateNMTrainingCost(countedExecute,trainingCode,{...values2,[name2]:values2[name2]-shift},objectiveTarget);if(plus==null||minus==null){return fail11(nmTrainingDiagnosticCodes.gradient,"Gradient evaluation failed or produced a non-finite value during training.")}gradients[name2]=.5*(plus-minus)}if(parameterNames.some(name2=>!Number.isFinite(gradients[name2]))){return fail11(nmTrainingDiagnosticCodes.gradient,"Gradient evaluation produced a non-finite value during training.")}const t=step+1;const qng=optimizer==="qng"?computeNMQNGDiagonal(countedExecute,trainingCode,values2,options.qng):void 0;if(qng&&"error"in qng)return{success:false,error:`${qng.code}: ${qng.error}`,circuitEvaluations,...empty8};if(qng&&"diagonal"in qng){for(const name2 of parameterNames)(qngMetricHistory[name2]??(qngMetricHistory[name2]=[])).push(qng.diagonal[name2]);qngConditionHistory.push(qng.conditionNumber);if(qng.singularParameters.length>0)qngSingularSteps.push(step)}for(const name2 of parameterNames){const grad=descentSign*gradients[name2];if(optimizer==="qng"&&qng&&"diagonal"in qng){values2[name2]-=learningRate*grad/qng.regularizedDiagonal[name2]}else if(optimizer==="momentum"){velocity[name2]=beta*velocity[name2]-learningRate*grad;values2[name2]+=velocity[name2]}else if(optimizer==="adam"){adamM[name2]=beta1*adamM[name2]+(1-beta1)*grad;adamV[name2]=beta2*adamV[name2]+(1-beta2)*grad*grad;const mHat=adamM[name2]/(1-beta1**t);const vHat=adamV[name2]/(1-beta2**t);values2[name2]-=learningRate*(mHat/(Math.sqrt(vHat)+eps))}else{values2[name2]-=learningRate*grad}}if(Object.values(values2).some(value=>!Number.isFinite(value))){return fail11(nmTrainingDiagnosticCodes.invariant,"Optimizer update produced a non-finite parameter value.")}}const finalCost=optimizer==="spsa"?void 0:evaluateNMTrainingCost(countedExecute,trainingCode,values2,objectiveTarget);if(helperTraining&&finalCost==null)return fail11(nmTrainingDiagnosticCodes.cost,"Final helper-training evaluation failed or produced a typed error.");if(finalCost!=null){costHistory.push(finalCost);paramHistory.push({...values2});appendMetricHistory(metricHistory,executeNMCodeWithParams(countedExecute,trainingCode,values2).metrics)}return{success:true,parameterNames,initialParams,finalParams:values2,costHistory,paramHistory,metricHistory:maybeMetricHistory(metricHistory),gradientMethod,costHistoryKind:optimizer==="spsa"?"spsa-midpoint":"exact",circuitEvaluations,...optimizer==="qng"?{qng:{contractVersion:NM_QNG_OPTIMIZER_CONTRACT_VERSION,shift:options.qng?.shift??NM_QNG_DEFAULT_SHIFT,regularization:options.qng?.regularization??NM_QNG_DEFAULT_REGULARIZATION,singularPolicy:options.qng?.singularPolicy??"regularize",metricDiagonalHistory:qngMetricHistory,conditionHistory:qngConditionHistory,singularSteps:qngSingularSteps}}:{}}}function lossEvidence(context){if(!context)return{};const evidence=readNMSupervisedLossEvidence(context);return evidence.success&&evidence.lossIdentity.kind==="custom"?{lossIdentity:evidence.lossIdentity,...evidence.work?{lossWork:evidence.work}:{},...evidence.failure?{lossFailure:evidence.failure}:{}}:{}}function boundLossSource(context,source,settings){const valid2=validateNMSupervisedLossBinding(context,source,settings);if(!valid2.success)return valid2;return readNMSupervisedLossBinding(context)}function boundedRows(rows,names){return Array.isArray(names)&&names.length>0&&names.length<=8&&Array.isArray(rows)&&rows.length>0&&rows.length<=80&&Array.from(rows).every(row=>row&&typeof row==="object"&&Array.isArray(row.features)&&row.features.length===names.length)}function evaluateNMClassifierDataset(execute,template,dataset,featureNames2,params,options={},parseOptions={}){return evaluateNMClassifierDatasetWithLoss(execute,template,dataset,featureNames2,params,options,parseOptions)}function evaluateNMClassifierDatasetWithLoss(execute,template,dataset,featureNames2,params,options={},parseOptions={},lossContext){if(lossContext){const binding=boundLossSource(lossContext,template,parseOptions);if(!binding.success)return{success:false,error:`${binding.code}: ${binding.error}`,circuitEvaluations:0};template=binding.trainingSource;if(binding.lossIdentity.kind==="builtin")options={...options,loss:binding.lossIdentity.name};const parsed=parseNMCode(template,parseOptions);const error=diagnosticsToError(parsed.diagnostics)??classicalFunctionTrainingError(parsed,{},{supervised:true});if(error)return{success:false,error:`NM-QML-TRAIN-005: ${error}`,circuitEvaluations:0}}parseOptions=snapshotNMQMLParseOptions(parseOptions);options={...options};if(!boundedRows(dataset,featureNames2))return{success:false,error:"NM-QML-DATASET-002: Invalid classifier evaluation workload.",circuitEvaluations:0};if(featureNames2.some(name2=>Object.prototype.hasOwnProperty.call(params,name2)))return{success:false,error:"NM-QML-DATASET-002: Feature names collide with trainable parameters.",circuitEvaluations:0};params={...params};featureNames2=[...featureNames2];dataset=dataset.map(point=>({label:point.label,features:[...point.features]}));let circuitEvaluations=0;const countedExecute=budgetNMSupervisedExecutor(lossContext,execute,()=>{circuitEvaluations+=1});if(dataset.length<1||dataset.length>80||featureNames2.length<1||featureNames2.length>8||Object.values(params).some(value=>!Number.isFinite(value))){return{success:false,error:"NM-QML-DATASET-002: Invalid classifier evaluation workload.",circuitEvaluations}}if(dataset.some(point=>point.features.length!==featureNames2.length||point.features.some(value=>!Number.isFinite(value))||point.label!==-1&&point.label!==1)){return{success:false,error:"NM-QML-DATASET-002: Invalid classifier evaluation row.",circuitEvaluations}}let pointTemplates;try{pointTemplates=createNMClassifierPointTemplates(template,dataset.length,options.datasetId,options.datasetSplit).map((text,i)=>bindNMClassifierFeatures(text,Object.fromEntries(featureNames2.map((name2,j)=>[name2,dataset[i].features[j]]))))}catch(error){if(!(error instanceof NMClassifierTemplateError))throw error;return{success:false,error:error.message,circuitEvaluations}}let loss=0;let correct=0;for(const[index,point]of dataset.entries()){const prediction=evaluateNMCost(countedExecute,pointTemplates[index],params,parseOptions);if(prediction==null)return{success:false,error:supervisedWorkError(lossContext)??"NM-QML-DATASET-002: Classifier evaluation failed.",circuitEvaluations};if(lossContext){const pair=evaluateNMSupervisedLoss(lossContext,prediction,point.label);if(!pair.success)return{success:false,error:`${pair.code}: ${pair.error}`,circuitEvaluations};loss+=pair.value}else loss+=computeNMLoss(options.loss??"mse",prediction,point.label);if(Math.sign(prediction)===Math.sign(point.label))correct+=1}const meanLoss=loss/dataset.length;const accuracy=correct/dataset.length;return Number.isFinite(meanLoss)&&Number.isFinite(accuracy)?{success:true,loss:meanLoss,accuracy,samples:dataset.length,circuitEvaluations}:{success:false,error:"NM-QML-DATASET-002: Classifier evaluation produced a non-finite metric.",circuitEvaluations}}function trainNMClassifier(execute,template,dataset,featureNames2,options={},parseOptions={}){return trainNMClassifierWithLoss(execute,template,dataset,featureNames2,options,parseOptions)}function trainNMClassifierWithLoss(execute,template,dataset,featureNames2,options={},parseOptions={},lossContext){parseOptions=snapshotNMQMLParseOptions(parseOptions);options={...options};const empty8={parameterNames:[],initialParams:{},finalParams:{},lossHistory:[],accuracyHistory:[],paramHistory:[]};let circuitEvaluations=0;const countedExecute=budgetNMSupervisedExecutor(lossContext,execute,()=>{circuitEvaluations+=1});const fail11=error=>({success:false,error:supervisedWorkError(lossContext)??error,circuitEvaluations,...empty8,...lossEvidence(lossContext)});if(lossContext){const binding=boundLossSource(lossContext,template,parseOptions);if(!binding.success)return fail11(`${binding.code}: ${binding.error}`);template=binding.trainingSource;if(binding.lossIdentity.kind==="builtin")options={...options,loss:binding.lossIdentity.name}}if(!boundedRows(dataset,featureNames2))return fail11("NM-QML-DATASET-002: Invalid classifier input shape or bounds.");featureNames2=[...featureNames2];dataset=dataset.map(point=>({label:point.label,features:[...point.features]}));const parsed=parseNMCode(template,parseOptions);const blockingError=diagnosticsToError(parsed.diagnostics);if(blockingError){return fail11(blockingError)}const policyError=classicalFunctionTrainingError(parsed,options,lossContext?{supervised:true}:void 0);if(policyError)return fail11(`NM-QML-TRAIN-005: ${policyError}`);const parameterNames=Object.keys(parsed.params);if(featureNames2.some(name2=>Object.prototype.hasOwnProperty.call(parsed.params,name2)))return fail11("NM-QML-DATASET-002: Feature names collide with trainable parameters.");if(parameterNames.length===0){return fail11("No trainable param declarations found.")}if(parameterNames.length>8){return fail11("The classifier supports up to 8 parameters.")}if(dataset.length===0||dataset.length>80){return fail11("NM-QML-DATASET-002: Provide between 1 and 80 data points.")}if(featureNames2.length<1||featureNames2.length>8||new Set(featureNames2).size!==featureNames2.length||featureNames2.some(name2=>!/^[A-Za-z_]\w{0,127}$/.test(name2)))return fail11("NM-QML-DATASET-002: Invalid feature names.");if(dataset.some(point=>point.features.length!==featureNames2.length||point.features.some(value=>!Number.isFinite(value))||point.label!==-1&&point.label!==1))return fail11("NM-QML-DATASET-002: Invalid classifier row.");if(Object.values(parsed.params).some(value=>!Number.isFinite(value)))return fail11("NM-QML-TRAIN-006: Classifier parameters must be finite.");if(options.steps!=null&&(!Number.isInteger(options.steps)||options.steps<1||options.steps>100))return fail11("NM-QML-TRAIN-001: Classifier steps must be an integer from 1 through 100.");if(options.learningRate!=null&&(!Number.isFinite(options.learningRate)||options.learningRate<=0||options.learningRate>5))return fail11("NM-QML-TRAIN-002: Classifier learningRate must be finite and in (0, 5].");if(options.loss!=null&&!["mse","hinge","cross_entropy"].includes(options.loss))return fail11("NM-QML-LOSS-001: Unsupported classifier loss.");if(options.optimizer!=null&&!["gd","momentum","adam"].includes(options.optimizer))return fail11("NM-QML-TRAIN-001: Unsupported classifier optimizer.");const featureSubstitution=point=>Object.fromEntries(featureNames2.map((name2,i)=>[name2,point.features[i]??0]));let pointTemplates;try{pointTemplates=createNMClassifierPointTemplates(template,dataset.length,options.datasetId,"train").map((text,i)=>bindNMClassifierFeatures(text,featureSubstitution(dataset[i])))}catch(error){if(!(error instanceof NMClassifierTemplateError))throw error;return fail11(error.message)}const params={...parsed.params};const initialParams={...params};const steps=options.steps??30;const learningRate=options.learningRate??.3;const lossKind=options.loss??"mse";const optimizer=options.optimizer??"gd";const shift=Math.PI/2;const lossHistory=[];const accuracyHistory=[];const paramHistory=[];let gradientMethod="parameter-shift";const optimizerState=createNMClassifierOptimizerState(parameterNames);const customLoss=lossEvidence(lossContext).lossIdentity?.kind==="custom";let lossFailure;const epochMetrics=()=>{const pairs=[];let loss=0;let correct=0;for(const[index,point]of dataset.entries()){const pred=evaluateNMCost(countedExecute,pointTemplates[index],params,parseOptions);if(pred==null){return void 0}if(customLoss&&lossContext){const pair=evaluateNMSupervisedLoss(lossContext,pred,point.label);if(!pair.success){lossFailure=`${pair.code}: ${pair.error}`;return void 0}loss+=pair.value;pairs.push({prediction:pred,derivative:pair.dPrediction})}else loss+=computeNMLoss(lossKind,pred,point.label);if(Math.sign(pred)===Math.sign(point.label)){correct+=1}}return{loss:loss/dataset.length,accuracy:correct/dataset.length,pairs}};for(let step=0;step<steps;step+=1){paramHistory.push({...params});const metrics=epochMetrics();if(!metrics){return fail11(lossFailure??"NM-QML-TRAIN-004: Prediction failed during training.")}lossHistory.push(metrics.loss);accuracyHistory.push(metrics.accuracy);try{options.onProgress?.({step,cost:metrics.loss,accuracy:metrics.accuracy,params:{...params}})}catch(error){if(!customLoss)throw error;return fail11("NM-QML-TRAIN-004: Training progress callback failed.")}const gradients=Object.fromEntries(parameterNames.map(n=>[n,0]));for(const[index,point]of dataset.entries()){const pointTemplate=pointTemplates[index];const base2={...params};const pred=customLoss?metrics.pairs[index].prediction:evaluateNMCost(countedExecute,pointTemplate,base2,parseOptions);if(pred==null){return fail11(lossFailure??"NM-QML-TRAIN-004: Prediction failed during training.")}const lossDerivative=customLoss?metrics.pairs[index].derivative:computeNMLossGradient(lossKind,pred,point.label);const adjoint=options.gradientMethod!=="parameter-shift"?computeNMGradientsAdjointWithBudget(pointTemplate,base2,{parseOptions},lossContext):{error:"Parameter-shift requested."};gradientMethod="gradients"in adjoint?"adjoint":"parameter-shift";if(!("gradients"in adjoint)&&(parsed.program.classicalFunctions||options.gradientMethod==="adjoint"))return fail11(`NM-QML-TRAIN-005: ${adjoint.error}`);for(const name2 of parameterNames){if("gradients"in adjoint){gradients[name2]+=lossDerivative*adjoint.gradients[name2];continue}const plus=evaluateNMCost(countedExecute,pointTemplate,{...base2,[name2]:params[name2]+shift},parseOptions);const minus=evaluateNMCost(countedExecute,pointTemplate,{...base2,[name2]:params[name2]-shift},parseOptions);if(plus==null||minus==null){return fail11("NM-QML-TRAIN-005: Gradient evaluation failed during training.")}gradients[name2]+=lossDerivative*.5*(plus-minus)}}if(Object.values(gradients).some(gradient=>!Number.isFinite(gradient)))return fail11("NM-QML-TRAIN-005: Classifier gradient became non-finite.");applyNMClassifierOptimizerStep(params,Object.fromEntries(parameterNames.map(name2=>[name2,gradients[name2]/dataset.length])),optimizer,learningRate,step,optimizerState);if(Object.values(params).some(value=>!Number.isFinite(value)))return fail11("NM-QML-TRAIN-006: Classifier update became non-finite.")}const finalMetrics=epochMetrics();if(!finalMetrics)return fail11(lossFailure??"NM-QML-TRAIN-004: Final classifier metrics failed.");lossHistory.push(finalMetrics.loss);accuracyHistory.push(finalMetrics.accuracy);paramHistory.push({...params});return{success:true,parameterNames,initialParams,finalParams:params,lossHistory,accuracyHistory,gradientMethod,...lossEvidence(lossContext),paramHistory,circuitEvaluations}}function createNMControlledLossMetrics(input){let failure8;let derivatives=[];return{error:()=>failure8,derivative:index=>derivatives[index],evaluateRows(rows,templates,values2){if(input.context&&rows===input.validationRows){const result2=evaluateNMClassifierDatasetWithLoss(input.execute,input.source,rows,input.featureNames,values2,{datasetId:input.datasetId,datasetSplit:"validation"},input.parseOptions,input.context);if(!result2.success){failure8=result2.error;return void 0}return{loss:result2.loss,accuracy:result2.accuracy}}if(rows===input.trainRows)derivatives=[];let totalLoss=0,correct=0;for(const[index,row]of rows.entries()){const prediction=evaluateNMCost(input.execute,templates[index],values2,input.parseOptions);if(prediction==null)return void 0;if(input.context){const loss=evaluateNMSupervisedLoss(input.context,prediction,row.label);if(!loss.success){failure8=`${loss.code}: ${loss.error}`;return void 0}totalLoss+=loss.value;if(rows===input.trainRows)derivatives.push(loss.dPrediction)}else{totalLoss+=computeNMLoss(input.lossKind,prediction,row.label);if(rows===input.trainRows)derivatives.push(computeNMLossGradient(input.lossKind,prediction,row.label))}if(Math.sign(prediction)===Math.sign(row.label))correct++}const snapshot2={loss:totalLoss/rows.length,accuracy:correct/rows.length};return Number.isFinite(snapshot2.loss)&&Number.isFinite(snapshot2.accuracy)?snapshot2:void 0}}}var metricValue=(metric,snapshot2)=>metric==="validation_loss"?snapshot2.loss:snapshot2.accuracy;var improves=(metric,candidate,best,delta)=>metric==="validation_loss"?candidate<best-delta:candidate>best+delta;function executeNMQmlControlledTrainingWithLoss(execute,source,trainRows,validationRows,featureNames2,block,options={},parseOptions,context){return controlledTraining(execute,source,trainRows,validationRows,featureNames2,block,options,parseOptions,context)}function controlledTraining(execute,source,trainRows,validationRows,featureNames2,block,options={},parseOptions={},context){parseOptions=snapshotNMQMLParseOptions(parseOptions);options={...options};block=structuredClone(block);const parsed=parseNMCode(source,parseOptions);const parameterNames=Object.keys(parsed.params);let circuitEvaluations=0;const empty8={parameterNames:[],initialParams:{},finalParams:{},lossHistory:[],accuracyHistory:[],paramHistory:[]};const lossEvidence2=()=>{if(!context)return{};const evidence=readNMSupervisedLossEvidence(context);return evidence.success&&evidence.lossIdentity.kind==="custom"?{lossIdentity:evidence.lossIdentity,...evidence.work?{lossWork:evidence.work}:{},...evidence.failure?{lossFailure:evidence.failure}:{}}:{}};let metricError=()=>void 0;const fail11=message=>({success:false,error:supervisedWorkError(context)??metricError()??`${nmQmlTrainingControlDiagnosticCodes.runtimeFailure}: ${message}`,...empty8,circuitEvaluations,...lossEvidence2()});if(block.customLoss&&!context)return fail11(NM_CUSTOM_LOSS_TRAINING_PENDING);if(context){const binding=validateNMSupervisedLossBinding(context,source,parseOptions);if(!binding.success)return fail11(`${binding.code}: ${binding.error}`);const blockBinding=validateNMSupervisedLossTrainBlock(context,block);if(!blockBinding.success)return fail11(`${blockBinding.code}: ${blockBinding.error}`)}if(!Array.isArray(featureNames2)||featureNames2.length<1||featureNames2.length>8||[trainRows,validationRows].some(rows=>!Array.isArray(rows)||rows.length<1||rows.length>80||Array.from(rows).some(row=>!row||typeof row!=="object"||!Array.isArray(row.features)||row.features.length!==featureNames2.length))){return fail11("Controlled training input shape or bounds are invalid.")}featureNames2=[...featureNames2];trainRows=trainRows.map(row=>({label:row.label,features:[...row.features]}));validationRows=validationRows.map(row=>({label:row.label,features:[...row.features]}));if(diagnosticsToError(parsed.diagnostics))return fail11("Controlled training source has blocking diagnostics.");if(featureNames2.some(name2=>Object.prototype.hasOwnProperty.call(parsed.params,name2)))return fail11("Feature names collide with trainable parameters.");const policyError=classicalFunctionTrainingError({...parsed,program:{...parsed.program,statements:[...parsed.program.statements,block]}},options,context?{supervised:true}:void 0);if(policyError)return fail11(policyError);if(parameterNames.length<1||parameterNames.length>8||Object.values(parsed.params).some(value=>!Number.isFinite(value))||trainRows.length<1||validationRows.length<1||featureNames2.length<1||featureNames2.length>8||new Set(featureNames2).size!==featureNames2.length||featureNames2.some(name2=>!/^[A-Za-z_]\w{0,127}$/u.test(name2))||[...trainRows,...validationRows].some(row=>row.features.length!==featureNames2.length||row.features.some(value=>!Number.isFinite(value))||row.label!==-1&&row.label!==1)){return fail11("Controlled training requires bounded parameters and non-empty train/validation splits.")}const requestedSteps=options.steps??block.steps??40;const initialLearningRate=options.learningRate??block.optimizer?.options.lr??.2;if(!Number.isInteger(requestedSteps)||requestedSteps<1||requestedSteps>100||!Number.isFinite(initialLearningRate)||initialLearningRate<=0||initialLearningRate>5||options.optimizer!=null&&options.optimizer!=="gd"&&options.optimizer!=="momentum"&&options.optimizer!=="adam"){return fail11("Effective training options are outside the supervised control contract.")}if(block.validation?.every!=null&&block.validation.every>requestedSteps){return fail11("Validation cadence exceeds the effective training step count.")}if(block.scheduler?.every!=null&&block.scheduler.every>requestedSteps){return fail11("Scheduler cadence exceeds the effective training step count.")}if(block.scheduler?.minimumLearningRate!=null&&block.scheduler.minimumLearningRate>initialLearningRate){return fail11("Scheduler min_lr exceeds the effective initial learning rate.")}const countedExecute=budgetNMSupervisedExecutor(context,execute,()=>{circuitEvaluations+=1});const bindFeatures=(text,row)=>bindNMClassifierFeatures(text,Object.fromEntries(featureNames2.map((name2,i)=>[name2,row.features[i]])));let trainTemplates,validationTemplates;try{trainTemplates=createNMClassifierPointTemplates(source,trainRows.length,block.datasetId,"train").map((text,i)=>bindFeatures(text,trainRows[i]));validationTemplates=createNMClassifierPointTemplates(source,validationRows.length,block.datasetId,"validation").map((text,i)=>bindFeatures(text,validationRows[i]))}catch(error){if(!(error instanceof NMClassifierTemplateError))throw error;return fail11(error.message)}const optimizer=options.optimizer==="momentum"||options.optimizer==="adam"?options.optimizer:block.optimizer?.name==="momentum"||block.optimizer?.name==="adam"?block.optimizer.name:"gd";const params={...parsed.params};const initialParams={...params};const optimizerState=createNMClassifierOptimizerState(parameterNames);const lossHistory=[];const accuracyHistory=[];const paramHistory=[];const learningRateHistory=[];const validationHistory=[];let completedSteps=0;let stoppedEarly=false;let gradientMethod="parameter-shift";let earlyBest;let nonImprovingChecks=0;let bestCheckpoint;const metrics=createNMControlledLossMetrics({context,source,parseOptions,execute:countedExecute,featureNames:featureNames2,datasetId:block.datasetId,trainRows,validationRows,lossKind:block.loss??"mse"});const evaluateRows=metrics.evaluateRows;metricError=metrics.error;const learningRateAt=step=>{if(!block.scheduler)return initialLearningRate;const decays=Math.floor(step/block.scheduler.every);return Math.max(block.scheduler.minimumLearningRate??0,initialLearningRate*block.scheduler.factor**decays)};for(let step=0;step<requestedSteps;step+=1){const learningRate=learningRateAt(step);learningRateHistory.push(learningRate);paramHistory.push({...params});const training=evaluateRows(trainRows,trainTemplates,params);if(!training)return fail11("Training metric evaluation failed.");lossHistory.push(training.loss);accuracyHistory.push(training.accuracy);try{options.onProgress?.({step,cost:training.loss,accuracy:training.accuracy,learningRate,params:{...params}})}catch{return fail11("Training progress callback failed.")}const gradients=Object.fromEntries(parameterNames.map(name2=>[name2,0]));for(const index of trainRows.keys()){const base2={...params};const prediction=evaluateNMCost(countedExecute,trainTemplates[index],base2,parseOptions);if(prediction==null)return fail11("Training prediction failed.");const lossDerivative=metrics.derivative(index);if(lossDerivative===void 0)return fail11("Missing training loss derivative.");const adjoint=options.gradientMethod!=="parameter-shift"?computeNMGradientsAdjointWithBudget(trainTemplates[index],base2,{parseOptions},context):{error:"Parameter-shift requested."};gradientMethod="gradients"in adjoint?"adjoint":"parameter-shift";if(!("gradients"in adjoint)&&(parsed.program.classicalFunctions||options.gradientMethod==="adjoint"))return fail11(`Adjoint gradient failed: ${adjoint.error}`);for(const name2 of parameterNames){if("gradients"in adjoint){gradients[name2]+=lossDerivative*adjoint.gradients[name2];continue}const shift=Math.PI/2;const plus=evaluateNMCost(countedExecute,trainTemplates[index],{...base2,[name2]:params[name2]+shift},parseOptions);const minus=evaluateNMCost(countedExecute,trainTemplates[index],{...base2,[name2]:params[name2]-shift},parseOptions);if(plus==null||minus==null)return fail11("Training gradient evaluation failed.");gradients[name2]+=lossDerivative*.5*(plus-minus)}}if(Object.values(gradients).some(value=>!Number.isFinite(value)))return fail11("Training gradient became non-finite.");applyNMClassifierOptimizerStep(params,Object.fromEntries(parameterNames.map(name2=>[name2,gradients[name2]/trainRows.length])),optimizer,learningRate,step,optimizerState);if(Object.values(params).some(value=>!Number.isFinite(value)))return fail11("Training update became non-finite.");completedSteps=step+1;const shouldValidate=block.validation!=null&&(completedSteps%block.validation.every===0||completedSteps===requestedSteps);if(!shouldValidate)continue;const validation=evaluateRows(validationRows,validationTemplates,params);if(!validation)return fail11("Validation metric evaluation failed.");validationHistory.push({completedSteps,...validation});if(block.checkpoint){const candidate=metricValue(block.checkpoint.metric,validation);if(!bestCheckpoint||improves(block.checkpoint.metric,candidate,bestCheckpoint.value,0)){bestCheckpoint={value:candidate,step:completedSteps,params:{...params},validation}}}if(block.earlyStopping){const candidate=metricValue(block.earlyStopping.metric,validation);if(!earlyBest||improves(block.earlyStopping.metric,candidate,earlyBest.value,block.earlyStopping.minDelta)){earlyBest={value:candidate,step:completedSteps};nonImprovingChecks=0}else{nonImprovingChecks+=1}if(nonImprovingChecks>=block.earlyStopping.patience){stoppedEarly=true;break}}}const finalParams=bestCheckpoint?{...bestCheckpoint.params}:{...params};const finalTraining=evaluateRows(trainRows,trainTemplates,finalParams);if(!finalTraining)return fail11("Final training metric evaluation failed.");lossHistory.push(finalTraining.loss);accuracyHistory.push(finalTraining.accuracy);paramHistory.push({...finalParams});let finalValidation=bestCheckpoint?.validation;if(!finalValidation){const latest=validationHistory.at(-1);finalValidation=latest?{loss:latest.loss,accuracy:latest.accuracy}:evaluateRows(validationRows,validationTemplates,finalParams)}if(!finalValidation)return fail11("Final validation metric evaluation failed.");if(circuitEvaluations>nmQmlTrainingControlLimits.maximumCircuitEvaluations){return fail11("Controlled training exceeded its circuit-evaluation budget.")}return{success:true,parameterNames,initialParams,finalParams,lossHistory,accuracyHistory,paramHistory,gradientMethod,circuitEvaluations,...lossEvidence2(),validationLoss:finalValidation.loss,validationAccuracy:finalValidation.accuracy,validationSamples:validationRows.length,trainingControls:{contractVersion:NM_QML_TRAINING_CONTROLS_CONTRACT_VERSION,requestedSteps,completedSteps,stoppedEarly,...stoppedEarly?{stopReason:"patience-exhausted"}:{},...block.validation?{validation:{split:"validation",every:block.validation.every,history:validationHistory}}:{},...block.earlyStopping&&earlyBest?{earlyStopping:{...block.earlyStopping,bestValue:earlyBest.value,bestStep:earlyBest.step,nonImprovingChecks}}:{},...block.scheduler?{scheduler:{...block.scheduler,learningRateHistory}}:{},...block.checkpoint&&bestCheckpoint?{checkpoint:{...block.checkpoint,bestValue:bestCheckpoint.value,bestStep:bestCheckpoint.step,restored:bestCheckpoint.step!==completedSteps}}:{}}}}function prepareNMDatasetSource(source,datasetId){return prepareNMClassifierDatasetSource(source,datasetId,"train")}function executeNMSupervisedTraining(execute,source,block,options={},parseOptions={},lossContext){parseOptions=snapshotNMQMLParseOptions(parseOptions);options={...options};block=structuredClone(block);if(block.customLoss&&!lossContext)return{success:false,error:NM_CUSTOM_LOSS_TRAINING_PENDING,parameterNames:[],initialParams:{},finalParams:{},costHistory:[],paramHistory:[]};const selectedDataset=block.datasetId?getNMEmbeddedDataset(block.datasetId):void 0;const dataset=selectedDataset?{...selectedDataset,featureNames:[...selectedDataset.featureNames]}:void 0;const parsed=parseNMCode(source,parseOptions);const empty8={parameterNames:[],initialParams:{},finalParams:{},costHistory:[],paramHistory:[]};if(lossContext){const binding=validateNMSupervisedLossBinding(lossContext,source,parseOptions);if(!binding.success)return{success:false,error:`${binding.code}: ${binding.error}`,...empty8};const directives=validateNMSupervisedLossTrainBlock(lossContext,block);if(!directives.success)return{success:false,error:`${directives.code}: ${directives.error}`,...empty8}}const lossEvidence2=()=>{const evidence=lossContext?readNMSupervisedLossEvidence(lossContext):void 0;return evidence?.success&&evidence.lossIdentity.kind==="custom"?{lossIdentity:evidence.lossIdentity,lossWork:evidence.work,...evidence.failure?{lossFailure:evidence.failure}:{}}:{}};if(!dataset)return{success:false,error:`Unknown embedded dataset: ${block.datasetId}.`,...empty8};const policyError=classicalFunctionTrainingError({...parsed,program:{...parsed.program,statements:[...parsed.program.statements,block]}},{...options,optimizer:options.optimizer??block.optimizer?.name??"gd"},{supervised:Boolean(lossContext)});if(policyError)return{success:false,error:policyError,...empty8};const trainRows=getNMEmbeddedDatasetRows(dataset.id,"train")?.map(row=>({...row,features:[...row.features]}));const validationRows=getNMEmbeddedDatasetRows(dataset.id,"validation")?.map(row=>({...row,features:[...row.features]}));const testRows=getNMEmbeddedDatasetRows(dataset.id,"test")?.map(row=>({...row,features:[...row.features]}));if(!trainRows?.length||!validationRows?.length||!testRows?.length)return{success:false,error:"NM-QML-DATASET-003: Dataset split contract is incomplete.",...empty8};let circuitEvaluations=0;const countedExecute=candidate=>{circuitEvaluations+=1;return execute(candidate,parseOptions)};const loss=block.loss??"mse";const hasTrainingControls=Boolean(block.validation||block.earlyStopping||block.scheduler||block.checkpoint);const controlledResult=hasTrainingControls?executeNMQmlControlledTrainingWithLoss(countedExecute,source,trainRows,validationRows,dataset.featureNames,block,options,parseOptions,lossContext):void 0;const result2=controlledResult??trainNMClassifierWithLoss(countedExecute,source,trainRows,dataset.featureNames,{steps:options.steps??block.steps,learningRate:options.learningRate??block.optimizer?.options.lr,loss,datasetId:dataset.id,optimizer:options.optimizer==="momentum"||options.optimizer==="adam"?options.optimizer:block.optimizer?.name==="momentum"||block.optimizer?.name==="adam"?block.optimizer.name:"gd",gradientMethod:options.gradientMethod,onProgress:options.onProgress},parseOptions,lossContext);if(!result2.success)return{success:false,error:result2.error,circuitEvaluations,...lossEvidence2(),...empty8};const validation=controlledResult?{success:true,samples:controlledResult.validationSamples??validationRows.length,loss:controlledResult.validationLoss??Number.NaN,accuracy:controlledResult.validationAccuracy??Number.NaN}:evaluateNMClassifierDatasetWithLoss(countedExecute,source,validationRows,dataset.featureNames,result2.finalParams,{loss,datasetId:dataset.id,datasetSplit:"validation"},parseOptions,lossContext);if(!validation.success||!Number.isFinite(validation.loss)||!Number.isFinite(validation.accuracy))return{success:false,error:"error"in validation?validation.error:"NM-QML-109: Controlled validation evidence is invalid.",circuitEvaluations,...lossEvidence2(),...empty8};const test=evaluateNMClassifierDatasetWithLoss(countedExecute,source,testRows,dataset.featureNames,result2.finalParams,{loss,datasetId:dataset.id,datasetSplit:"test"},parseOptions,lossContext);if(!test.success||!Number.isFinite(test.loss)||!Number.isFinite(test.accuracy))return{success:false,error:"error"in test?test.error:"NM-QML-DATASET-003: Test split evidence is invalid.",circuitEvaluations,...lossEvidence2(),...empty8};return{success:true,parameterNames:Object.keys(parsed.params),initialParams:result2.initialParams??parsed.params,finalParams:result2.finalParams,costHistory:result2.lossHistory,paramHistory:result2.paramHistory??[],gradientMethod:result2.gradientMethod,costHistoryKind:"exact",circuitEvaluations,datasetId:dataset.id,datasetVersion:dataset.version,datasetSplit:"train",trainSamples:trainRows.length,validationSamples:validation.samples,validationLoss:validation.loss,validationAccuracy:validation.accuracy,testSamples:test.samples,testLoss:test.loss,testAccuracy:test.accuracy,...block.customLoss?lossEvidence2():{loss},accuracyHistory:result2.accuracyHistory,finalAccuracy:result2.accuracyHistory.at(-1),trainingControls:controlledResult?.trainingControls}}function prepareNMComputeApplyRuntime(nodes,frame){const targets=createNMDynamicQubitTargetResolver(frame.statements);const values2=structuredClone(functionGateValues(frame.constants,frame.values));return captureNMComputeApplyOperations(nodes,gate=>resolveFunctionGateAngles(targets(gate,values2,frame.context),values2,frame.context))}function resolveNMComputeApplyStatement(statement,frame){const prepared2=prepareNMComputeApplyRuntime([computeApplyOperationTree(statement)],frame);if(prepared2.diagnostics.length)throw new Error(`${prepared2.diagnostics[0].code}: ${prepared2.diagnostics[0].message}`);return prepared2.operations}function createNMComputeApplyExecutor(timeline,sourceId2){let invocation3=0;return(statement,frame,run)=>{const operations=resolveNMComputeApplyStatement(statement,frame),id=++invocation3;operations.forEach((operation,operationIndex)=>{const before=timeline.length;try{run(operation.statement)}finally{for(let index=before;index<timeline.length;index++){const recorded=timeline[index];if(recorded.phase!=="gate"&&recorded.phase!=="barrier")continue;const event={version:"0.1",invocation:id,operationIndex,adjoint:operation.adjoint,phases:operation.phases.map(phase=>({...phase}))};recorded.computeApply=event;const origin2=operation.statement.computeApplyOrigin;if(sourceId2&&origin2){let id2=origin2.moduleId?.startsWith("workspace.")?`${origin2.moduleId.slice(10)}.nm`:origin2.moduleId?`library/${origin2.moduleId}.nm`:sourceId2;if(origin2.moduleId)while(id2===sourceId2)id2=`workspace/${id2}`;Object.assign(recorded,{sourceLocation:{sourceId:id2,line:origin2.range.start.line+1,column:origin2.range.start.column+1}})}}}})}}function classicalFunctionWorkspaceSnapshot(source,modules){let bytes2=new TextEncoder().encode(source).length;if(bytes2>nmClassicalFunctionLimits.sourceBytes)return void 0;if(modules===void 0)return{};const snapshot2=readFunctionWorkspaceModules(modules);if(!snapshot2)return void 0;for(const text of Object.values(snapshot2)){bytes2+=new TextEncoder().encode(text).length;if(bytes2>nmClassicalFunctionLimits.sourceBytes)return void 0}return{workspaceModules:snapshot2}}function classicalFunctionDataEqual(left,right,depth3=0){if(Object.is(left,right))return true;if(depth3>128||!left||!right||typeof left!=="object"||typeof right!=="object"||Array.isArray(left)!==Array.isArray(right))return false;if(Array.isArray(left)&&Array.isArray(right)&&left.length!==right.length)return false;const a=left,b=right;const keys3=Object.keys(a).filter(key4=>a[key4]!==void 0);return keys3.length===Object.keys(b).filter(key4=>b[key4]!==void 0).length&&keys3.every(key4=>Object.prototype.hasOwnProperty.call(b,key4)&&classicalFunctionDataEqual(a[key4],b[key4],depth3+1))}function preservedClassicalFunctionSource(program){const provenance=program.classicalFunctions;if(!provenance||provenance.contractVersion!==NM_CLASSICAL_FUNCTION_LOWERING_VERSION||typeof provenance.originalSource!=="string"||provenance.originalSource.length>nmClassicalFunctionLimits.sourceBytes||provenance.parseOptions?.experimental?.classicalFunctions!==true)return void 0;try{const snapshot2=classicalFunctionWorkspaceSnapshot(provenance.originalSource,provenance.parseOptions.workspaceModules);if(!snapshot2)return void 0;const parsed=parseNMCode(provenance.originalSource,{...provenance.parseOptions,...snapshot2});if(parsed.diagnostics.some(item=>item.severity==="error"||item.code.startsWith("NM-PARSE-")))return void 0;return classicalFunctionDataEqual(program,parsed.program)?provenance.originalSource:void 0}catch{return void 0}}function preservedNMComputeApplySource(program){try{const candidate=copyNMComputeApplyCarrierData(program),metadata=candidate.computeApply;if(!metadata||metadata.experimental!==true||metadata.contractVersion!==NM_COMPUTE_APPLY_VERSION||typeof metadata.originalSource!=="string"||metadata.originalSource.length>nmComputeApplyLimits.sourceBytes||new TextEncoder().encode(metadata.originalSource).length>nmComputeApplyLimits.sourceBytes||!metadata.parseOptions||metadata.parseOptions.experimental?.computeApply!==true)return;const options=snapshotNMComputeApplyParseOptions(metadata.parseOptions);if(!options||!classicalFunctionDataEqual(options,metadata.parseOptions))return;const parsed=parseNMCode(metadata.originalSource,options);if(parsed.diagnostics.some(item=>item.severity==="error"))return;return classicalFunctionDataEqual(candidate,copyNMComputeApplyCarrierData(parsed.program))?metadata.originalSource:void 0}catch{return void 0}}function preservedNMParameterGroupSource(program){const groups=program.parameterGroups;if(!groups||groups.contractVersion!==NM_PARAMETER_GROUPS_VERSION||groups.experimental!==true||groups.parseOptions?.experimental?.parameterGroups!==true||typeof groups.originalSource!=="string"||groups.originalSource.length>nmParameterGroupLimits.sourceBytes)return void 0;try{const snapshot2=classicalFunctionWorkspaceSnapshot(groups.originalSource,groups.parseOptions.workspaceModules);if(!snapshot2)return void 0;const parsed=parseNMCode(groups.originalSource,{experimental:{...groups.parseOptions.experimental},...snapshot2});if(parsed.diagnostics.some(item=>item.severity==="error"))return void 0;return classicalFunctionDataEqual(parsed.program,program)?groups.originalSource:void 0}catch{return void 0}}function createNMComptimeStructurePrintPlan(program){if(!program.comptimeStructures)return{issues:[]};const issues=validateNMComptimeStructureProvenance(program);if(issues.length>0)return{issues};const vectorAliases=new Map;for(const node of program.comptimeStructures.nodes){if(node.kind!=="vector-param")continue;node.scalarNames.forEach((alias,index)=>{vectorAliases.set(alias,`${node.name}[${index}]`)})}return{plan:{nodes:program.comptimeStructures.nodes,vectorAliases},issues}}function printNMComptimeStructureNode(node,indent){if(node.kind==="vector-param"){return[`${indent}param ${node.name}: Angle[${node.size.sourceExpression}] = [${node.elements.map(expression=>printNMComptimeAngleExpression(expression)).join(", ")}];`]}if(node.kind==="repeat"){return[`${indent}repeat ${node.count.sourceExpression} {`,...node.body.map(gate=>`${indent} ${printNMComptimeGateTemplate(gate)}`),`${indent}}`]}return[`${indent}for ${node.variable} in ${node.start.sourceExpression}..${node.endExclusive.sourceExpression} {`,...node.body.map(gate=>`${indent} ${printNMComptimeGateTemplate(gate,node.variable)}`),`${indent}}`]}function rewriteNMComptimeVectorAliases(source,aliases){if(!aliases||aliases.size===0||source.trim()==="")return source;let rewritten=source;for(const[alias,replacement]of[...aliases.entries()].sort(([left],[right])=>right.length-left.length)){rewritten=rewritten.replace(new RegExp(`\\b${escapeRegExp(alias)}\\b`,"gu"),replacement)}return rewritten}function printNMComptimeAngleExpression(expression){if(expression.kind==="literal")return formatNumber2(expression.value);if(expression.kind==="pi")return"PI";if(expression.kind==="scalar-reference")return expression.name;if(expression.kind==="vector-element"){return`${expression.name}[${expression.index}]`}if(expression.kind==="induction")return expression.name;if(expression.kind==="unary"){const operand2=expression.operand.kind==="binary"?`(${printNMComptimeAngleExpression(expression.operand)})`:printNMComptimeAngleExpression(expression.operand);return`${expression.operator}${operand2}`}return`(${printNMComptimeAngleExpression(expression.left)} ${expression.operator} ${printNMComptimeAngleExpression(expression.right)})`}function printNMComptimeGateTemplate(template,induction){const targets=template.targets.map(target2=>{if(!target2.index)return target2.register;if(target2.index.kind==="literal"){return`${target2.register}[${target2.index.value}]`}const offset=target2.index.offset;const index=offset===0?induction:`${induction} ${offset>0?"+":"-"} ${Math.abs(offset)}`;return`${target2.register}[${index}]`});const angles=template.angles.map(printNMComptimeAngleExpression);return`${template.gate}(${[...targets,...angles].join(", ")});`}function formatNumber2(value){return Number.isInteger(value)?value.toString():Number.parseFloat(value.toFixed(12)).toString()}function escapeRegExp(value){return value.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}var NMComptimeStructurePrintError=class extends Error{constructor(reason){super(`N/M comptime structure provenance is ${reason}.`);this.reason=reason;this.name="NMComptimeStructurePrintError"}};function printNMProgram(program,options={}){if(program.computeApply){const source=preservedNMComputeApplySource(program);if(source!==void 0)return source;throw new Error("NM-CAP-007: Compute/apply source no longer matches the program or cannot be replayed.")}if(program.parameterGroups){const source=preservedNMParameterGroupSource(program);if(source!==void 0)return source;throw new Error("NM-PGR-008: Parameter-group source no longer matches the program.")}if(program.classicalFunctions){const source=preservedClassicalFunctionSource(program);if(source===void 0)throw new Error("NM-CFN-011: Classical function source is missing, invalid, or differs from the program.");return source}const indent=options.indent??" ";const structurePlan=requireNMComptimeStructurePrintPlan(program);const lines=[];lines.push(`module ${program.moduleName??"program"};`);if(program.compiler?.trace!=null){lines.push(`@compiler(trace: ${program.compiler.trace?"true":"false"});`)}if(program.optimize){lines.push(`@optimize(method: "${program.optimize.optimizer}", steps: ${program.optimize.steps}, learningRate: ${formatNumber3(program.optimize.learningRate)}, objective: "${program.optimize.objective}");`)}if(program.estimate){const parts=[`code: "${program.estimate.code}"`,`distance: ${program.estimate.distance}`,program.estimate.targetError!=null?`target_error: ${formatNumber3(program.estimate.targetError)}`:void 0,program.estimate.physicalGateTimeNs!=null?`physical_gate_time_ns: ${formatNumber3(program.estimate.physicalGateTimeNs)}`:void 0].filter(part=>part!=null);lines.push(`@estimate(${parts.join(", ")});`)}program.goals?.forEach(goal=>lines.push(`@goal("${escapeString(goal.text)}");`));program.outcomes?.forEach(outcome=>lines.push(`@outcome("${escapeString(outcome.text)}");`));program.rubrics?.forEach(rubric=>{const weight=rubric.weight!=null?`, weight: ${formatNumber3(rubric.weight)}`:"";lines.push(`@rubric("${escapeString(rubric.text)}"${weight});`)});program.misconceptions?.forEach(misconception=>lines.push(`@misconception("${escapeString(misconception.text)}");`));program.quizzes?.forEach(quiz=>{const answer=quiz.answer?`, answer: "${escapeString(quiz.answer)}"`:"";lines.push(`@quiz("${escapeString(quiz.question)}"${answer});`)});program.labs?.forEach(lab=>{const minutes=lab.minutes!=null?`, minutes: ${lab.minutes}`:"";lines.push(`@lab("${escapeString(lab.id)}"${minutes});`)});program.challenges?.forEach(challenge=>{const difficulty=challenge.difficulty?`, difficulty: "${challenge.difficulty}"`:"";lines.push(`@challenge("${escapeString(challenge.id)}"${difficulty});`)});program.datasets?.forEach(dataset=>{const split=dataset.split?`, split: "${dataset.split}"`:"";lines.push(`@dataset("${escapeString(dataset.id)}"${split});`)});program.checkpoints?.forEach(checkpoint=>{const kind=checkpoint.kind?`, kind: "${checkpoint.kind}"`:"";lines.push(`@checkpoint("${escapeString(checkpoint.text)}"${kind});`)});program.hints?.forEach(hint=>lines.push(`@hint("${escapeString(hint.text)}");`));program.concepts?.forEach(concept=>lines.push(`@concept("${escapeString(concept.name)}");`));if(program.level){lines.push(`@level("${program.level.value}");`)}program.prerequisites?.forEach(prereq=>lines.push(`@prereq("${escapeString(prereq.name)}");`));if(program.target){lines.push(`@target("${program.target}");`)}if(program.constraints){const parts=[program.constraints.maxQubits!=null?`maxQubits: ${program.constraints.maxQubits}`:void 0,program.constraints.maxDepth!=null?`maxDepth: ${program.constraints.maxDepth}`:void 0,program.constraints.maxTwoQubit!=null?`maxTwoQubit: ${program.constraints.maxTwoQubit}`:void 0,program.constraints.connectivity?`connectivity: "${program.constraints.connectivity}"`:void 0].filter(part=>part!=null);lines.push(`@constraints(${parts.join(", ")});`)}if(program.targetCapabilityConstraints?.requirement){lines.push(formatNMTargetCapabilityConstraint(program.targetCapabilityConstraints.requirement))}if(program.semantics){lines.push(`@semantics("${program.semantics.mode}");`)}if(program.noise){lines.push(`@noise("${program.noise.model}", ${formatNumber3(program.noise.probability)});`)}if(program.mitigation){lines.push(`@mitigation("${program.mitigation.model}");`)}if(program.seed!=null){lines.push(`@seed(${program.seed});`)}if(program.expectationShots!=null){lines.push(`@shots(${program.expectationShots});`)}program.comptimeConstants?.declarations.filter(declaration=>!program.statements.some(statement=>statement.kind==="const"&&statement.name===declaration.name&&statement.line===declaration.line)).forEach(declaration=>lines.push(`const ${declaration.name}: Int = ${declaration.sourceExpression};`));lines.push("");lines.push(program.functionResults?`fn main() -> Result<${formatNMFunctionResultType(program.functionResults.resultType)}, Error> {`:"fn main() {");const comptimeUse=position=>program.comptimeConstants?.uses.find(use=>use.position===position)?.sourceExpression;if(program.typedCollection){lines.push(`${indent}collect<${comptimeUse("collect-count")??program.typedCollection.shots}> {`);lines.push(...printProgramStatements(program,`${indent}${indent}`,structurePlan));lines.push(`${indent}}`)}else if(program.sampleShots!=null){lines.push(`${indent}sample ${comptimeUse("sample-count")??program.sampleShots} {`);lines.push(...printProgramStatements(program,`${indent}${indent}`,structurePlan));lines.push(`${indent}}`)}else{lines.push(...printProgramStatements(program,indent,structurePlan))}lines.push("}");return lines.join("\n")}function requireNMComptimeStructurePrintPlan(program){if(hasNMComptimeStructureUses(program)&&!program.comptimeStructures){throw new NMComptimeStructurePrintError("missing")}const result2=createNMComptimeStructurePrintPlan(program);if(result2.issues.length>0||program.comptimeStructures&&!result2.plan){throw new NMComptimeStructurePrintError("invalid")}return result2.plan}function hasNMComptimeStructureUses(program){return program.comptimeConstants?.uses.some(({position})=>["vector-param-size","repeat-count","for-start","for-end"].includes(position))===true}function printProgramStatements(program,indent,plan){if(!plan)return printStatements(program.statements,indent);const lines=[];let statementIndex=0;let nodeIndex=0;while(statementIndex<program.statements.length||nodeIndex<plan.nodes.length){let consumedStructure=false;while(nodeIndex<plan.nodes.length){const node=plan.nodes[nodeIndex];const span3=node.kind==="vector-param"?node.declarationSpan:node.expansionSpan;if(span3.statementStart!==statementIndex)break;lines.push(...printNMComptimeStructureNode(node,indent));nodeIndex+=1;if(span3.statementCount>0){statementIndex+=span3.statementCount;consumedStructure=true;break}}if(consumedStructure)continue;const statement=program.statements[statementIndex];if(!statement)break;lines.push(...printNMStatement(statement,indent,plan.vectorAliases));statementIndex+=1}return lines}function printNMStatement(statement,indent="",vectorAliases){switch(statement.kind){case"computeApply":throw new Error("NM-CAP-007: Compute/apply printing requires its validated source carrier.");case"qreg":{const declared=statement.declaredSizeSource?.sourceExpression??statement.declaredSize;const allocated=statement.sizeSource?.sourceExpression??statement.size;const type=declared!=null?`: QReg<${declared}>`:"";return[`${indent}let ${statement.name}${type} = qreg[${allocated}];`]}case"const":{const type=statement.valueType?`: ${statement.valueType}`:"";return[`${indent}const ${statement.name}${type} = ${formatNumber3(statement.value)};`]}case"param":return[`${indent}param ${statement.name}: Angle = ${formatNumber3(statement.value)};`];case"explain":return[`${indent}@explain("${escapeString(statement.text)}");`];case"gate":return[`${indent}${printGateCallWithAliases(statement,vectorAliases)}`];case"measurement":{const basis=statement.basis?`${statement.basis} `:"";const expression=`measure ${basis}(${formatQubitRef(statement.target)})`;return statement.binding?[`${indent}let ${statement.binding}: Bit = ${expression};`]:[`${indent}${expression};`]}case"measurement-binding":{const type=statement.declaredWidth!=null?`: BitVec<${statement.declaredWidth}>`:"";return[`${indent}let ${statement.name}${type} = measure_all(${statement.operand.register}[${statement.operand.start}..${statement.operand.endInclusive}]);`]}case"assertBranchInvariant":return[`${indent}assert_branch_invariant(${statement.target.register}${statement.target.index!=null?`[${statement.target.index}]`:""});`];case"bitAssign":return[`${indent}let ${statement.name}: Bit = ${printBitExpression(statement.expression)};`];case"classicalDecl":return[`${indent}let ${statement.mutable?"mut ":""}${statement.name}: ${declaredTypeLabel(statement.valueType)} = ${formatNMTypedClassicalExpression(statement.expression)};`];case"classicalAssign":return[`${indent}${statement.name}${statement.index===void 0?"":`[${typeof statement.index==="number"?statement.index:formatNMTypedClassicalExpression(statement.index)}]`} = ${formatNMTypedClassicalExpression(statement.expression)};`];case"classicalFor":return[`${indent}for ${statement.index} in ${statement.start}..${statement.end} {`,...printStatements(statement.body,`${indent} `,vectorAliases),`${indent}}`];case"classicalMatchResult":return[`${indent}match (${formatNMTypedClassicalExpression(statement.selector)}) {`,`${indent} ok(${statement.okBinding}) => {`,...printStatements(statement.okBody,`${indent} `,vectorAliases),`${indent} }`,`${indent} error => {`,...printStatements(statement.errorBody,`${indent} `,vectorAliases),`${indent} }`,`${indent}}`];case"syndrome":return[`${indent}let ${statement.binding}: Bit = syndrome ${formatPauliFactors(statement.factors)};`];case"assertProbability":return[`${indent}assert probability(|${statement.state}>) ${statement.operator} ${formatNumber3(statement.expected)}${statement.tolerance!=null?` tolerance ${formatNumber3(statement.tolerance)}`:""};`];case"assertExpectation":return[`${indent}assert expectation ${formatPauliTerms(statement.terms)} ${statement.operator} ${formatNumber3(statement.expected)}${statement.tolerance!=null?` tolerance ${formatNumber3(statement.tolerance)}`:""};`];case"assertExpectationRange":return[`${indent}assert expectation ${formatPauliTerms(statement.terms)} in [${formatNumber3(statement.minimum)}, ${formatNumber3(statement.maximum)}];`];case"assertEntangled":return[`${indent}assert entangled(${formatQubitRef(statement.targets[0])}, ${formatQubitRef(statement.targets[1])});`];case"assertFidelity":return[`${indent}assert fidelity("${escapeString(statement.target)}") ${statement.operator} ${formatNumber3(statement.expected)};`];case"assertEquivalent":return[`${indent}assert equivalent("${escapeString(statement.target)}")${statement.phasePolicy==="global"?" up_to_phase":""};`];case"assertResource":return[`${indent}assert ${statement.metric} ${statement.operator} ${formatNumber3(statement.expected)};`];case"expectation":{const head=statement.binding?`let ${statement.binding} = `:"";return[`${indent}${head}expect ${formatPauliTerms(statement.terms)};`]}case"metric":return[`${indent}metric ${statement.name} = ${formatMetricExpression(statement.expression)};`];case"gradient":return[`${indent}let ${statement.binding} = gradient ${statement.target} wrt ${statement.parameter};`];case"encode":return[`${indent}encode(sample_row(${statement.row}), ${statement.register}, method: "${statement.method}");`];case"train":{const options=statement.optimizer?Object.entries(statement.optimizer.options).map(([name2,value])=>`${name2} = ${formatNumber3(value)}`):[];const optimizer=statement.optimizer?`${statement.optimizer.name}${options.length?`(${options.join(", ")})`:""}`:void 0;return[`${indent}train {`,`${indent} objective: ${statement.objective.mode} ${statement.objective.target};`,...optimizer?[`${indent} optimizer: ${optimizer};`]:[],...statement.steps!=null?[`${indent} steps: ${statement.steps};`]:[],...statement.customLoss?[`${indent} loss: custom(${statement.customLoss.name});`]:statement.loss?[`${indent} loss: ${statement.loss};`]:[],...statement.datasetId?[`${indent} dataset: ${statement.datasetId};`]:[],...statement.validation?[`${indent} validation: split = ${statement.validation.split}, every = ${statement.validation.every};`]:[],...statement.earlyStopping?[`${indent} early_stopping: metric = ${statement.earlyStopping.metric}, patience = ${statement.earlyStopping.patience}, min_delta = ${formatNumber3(statement.earlyStopping.minDelta)};`]:[],...statement.scheduler?[`${indent} scheduler: step(every = ${statement.scheduler.every}, factor = ${formatNumber3(statement.scheduler.factor)}${statement.scheduler.minimumLearningRate!=null?`, min_lr = ${formatNumber3(statement.scheduler.minimumLearningRate)}`:""});`]:[],...statement.checkpoint?[`${indent} checkpoint: ${statement.checkpoint.strategy}(metric = ${statement.checkpoint.metric});`]:[],`${indent}}`]}case"reset":return[`${indent}reset ${formatQubitRef(statement.target)};`];case"barrier":return[`${indent}barrier;`];case"show":return[`${indent}show ${statement.subject};`];case"return":return[`${indent}return ${statement.functionResult?formatNMFunctionResultExpression(statement.functionResult,formatNMTypedClassicalExpression):statement.expression};`];case"if":{const condition=statement.condition?formatNMTypedClassicalExpression(statement.condition):statement.predicate?formatNMClassicalPredicate(statement.predicate):`${statement.binding} ${statement.operator} ${statement.value}`;const lines=[`${indent}if (${condition}) {`];lines.push(...printStatements(statement.body,`${indent} `,vectorAliases));if(statement.elseBody?.length){lines.push(`${indent}} else {`);lines.push(...printStatements(statement.elseBody,`${indent} `,vectorAliases))}lines.push(`${indent}}`);return lines}case"until":{const lines=[`${indent}until (${statement.binding} ${statement.operator} ${statement.value}) max ${statement.maxIterations} {`];lines.push(...printStatements(statement.body,`${indent} `,vectorAliases));lines.push(`${indent}}`);return lines}case"match":{const lines=[`${indent}match (${statement.bindings.join(", ")}) {`];for(const matchCase of statement.cases){lines.push(`${indent} (${matchCase.pattern.join(", ")}) => {`);lines.push(...printStatements(matchCase.body,`${indent} `,vectorAliases));lines.push(`${indent} }`)}lines.push(`${indent}}`);return lines}case"observe":{const lines=[`${indent}observe ${statement.name} {`];lines.push(...printStatements(statement.body,`${indent} `,vectorAliases));lines.push(`${indent}}`);return lines}case"test":{const lines=[`${indent}test "${escapeString(statement.name)}" {`];lines.push(...printStatements(statement.body,`${indent} `,vectorAliases));lines.push(`${indent}}`);return lines}case"snapshot":{const lines=[`${indent}snapshot "${escapeString(statement.name)}" {`];lines.push(...printStatements(statement.body,`${indent} `,vectorAliases));lines.push(`${indent}}`);return lines}case"property":return[`${indent}// property block is preserved in IR but not printable in this formatter slice.`]}}function printGateCall(gate){return printGateCallWithAliases(gate)}function printGateCallWithAliases(gate,vectorAliases){const targets=gate.targets.map(formatQubitRef);if(gate.gate==="GPhase"){return`GPhase(${formatAngle(gate,vectorAliases)});`}if(gate.angles&&gate.angles.length>0){const angles=gate.angles.map((angle,index)=>{const name2=gate.angleNames?.[index];return name2&&name2.trim()?rewriteNMComptimeVectorAliases(name2,vectorAliases):formatNumber3(angle)});return`${gate.gate}(${[...targets,...angles].join(", ")});`}if(gate.theta!=null){return`${gate.gate}(${[...targets,formatAngle(gate,vectorAliases)].join(", ")});`}return`${gate.gate}(${targets.join(", ")});`}function formatQubitRef(ref2){if(ref2.classicalIndex)return`${ref2.register}[${formatNMTypedClassicalExpression(ref2.classicalIndex)}]`;return ref2.index==null?ref2.register:`${ref2.register}[${ref2.index}]`}function printStatements(statements,indent,vectorAliases){return statements.flatMap(statement=>printNMStatement(statement,indent,vectorAliases))}function printBitExpression(expression){switch(expression.kind){case"literal":return expression.value.toString();case"ref":return expression.name;case"not":return`not ${printBitExpression(expression.expression)}`;case"binary":return`${printBitExpression(expression.left)} ${expression.operator} ${printBitExpression(expression.right)}`}}function formatMetricExpression(expression){switch(expression.kind){case"probability":return`probability(|${expression.state}>)`;case"expectation":return`expect ${formatPauliTerms(expression.terms)}`}}function formatPauliTerms(terms){if(terms.length===0){return"I"}return terms.map((term,index)=>{const sign=term.coeff<0?"-":index===0?"":"+";const source=formatPauliTermMagnitude(term);return sign?`${sign} ${source}`:source}).join(" ")}function formatPauliTermMagnitude(term){const coeff=Math.abs(term.coeff);const factors=formatPauliFactors(term.factors);if(factors==="I"){return coeff===1?"I":`${formatNumber3(coeff)} * I`}return coeff===1?factors:`${formatNumber3(coeff)} * ${factors}`}function formatPauliFactors(factors){if(factors.length===0){return"I"}return factors.map(factor=>`${factor.observable}(${formatQubitRef(factor.target)})`).join(" ")}function formatAngle(gate,vectorAliases){return gate.thetaName&&gate.thetaName.trim()?rewriteNMComptimeVectorAliases(gate.thetaName,vectorAliases):formatNumber3(gate.theta??0)}function formatNumber3(value){return formatNMSourceNumber(value)}function escapeString(value){return value.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function measurementColumn(statement,rows,indexByLabel){const{register,start,endInclusive}=statement.operand;if(!isBoundedNMMeasurementSlice(start,endInclusive)||statement.width!==endInclusive-start+1)return void 0;const cells=rows.map(()=>({label:"",kind:"empty"}));for(let offset=0;offset<statement.width;offset+=1){const target2=indexByLabel.get(`${register}[${start+offset}]`);if(target2!=null)cells[target2]={label:"M",kind:"measure"}}return cells.some(cell=>cell.kind==="measure")?cells:void 0}function dynamicTargetColumn(gate,rows){if(!gate.targets.some(target2=>target2.classicalIndex))return void 0;return rows.map(row=>row.label==="q[?]"?{label:`${gate.gate}(${gate.targets.map(formatQubitRef).join(", ")})`,kind:"gate"}:{label:"",kind:"empty"})}function mainResultColumn(statement,rows){if(statement.kind!=="classicalMatchResult")return void 0;return rows.map(row=>row.label==="Result<?>"?{label:`match (${formatNMTypedClassicalExpression(statement.selector)}): ok(${statement.okBinding}) | error`,kind:"gate"}:{label:"",kind:"empty"})}function createCircuitDiagram(statements){const qubitLabels=[];for(const statement of statements){if(statement.kind!=="qreg"){continue}for(let i=0;i<statement.size;i+=1){qubitLabels.push({label:`${statement.name}[${i}]`,index:qubitLabels.length})}}const rows=qubitLabels.map(qubit3=>({label:qubit3.label,cells:[]}));const indexByLabel=new Map(qubitLabels.map(qubit3=>[qubit3.label,qubit3.index]));if(hasNMMainDynamicTarget(statements))rows.push({label:"q[?]",cells:[]});if(hasNMMainResult(statements))rows.push({label:"Result<?>",cells:[]});const addColumn=cells=>{rows.forEach((row,index)=>{row.cells.push(cells[index]??{label:"",kind:"empty"})})};const drawWire=(cells,a,b)=>{for(let index=Math.min(a,b);index<=Math.max(a,b);index+=1){cells[index]={label:"|",kind:"wire"}}};const renderGate=statement=>{const pending=dynamicTargetColumn(statement,rows);if(pending){addColumn(pending);return}const cells=rows.map(()=>({label:"",kind:"empty"}));if(statement.gate==="GPhase"){if(cells.length>0){cells[0]={label:"GPhase",kind:"gate"};addColumn(cells)}return}if(statement.gate==="CNOT"||statement.gate==="CZ"||statement.gate==="CY"||statement.gate==="CH"){const control=indexByLabel.get(qubitRefKey3(statement.targets[0]));const target3=indexByLabel.get(qubitRefKey3(statement.targets[1]));if(control==null||target3==null){return}const targetLabel=statement.gate==="CNOT"?"X":statement.gate==="CZ"?"Z":statement.gate==="CY"?"Y":"H";drawWire(cells,control,target3);cells[control]={label:"C",kind:"control"};cells[target3]={label:targetLabel,kind:"target"};addColumn(cells);return}if(statement.gate==="SWAP"||statement.gate==="iSWAP"){const a=indexByLabel.get(qubitRefKey3(statement.targets[0]));const b=indexByLabel.get(qubitRefKey3(statement.targets[1]));if(a==null||b==null){return}drawWire(cells,a,b);cells[a]={label:statement.gate==="SWAP"?"x":"iS",kind:"target"};cells[b]={label:statement.gate==="SWAP"?"x":"iS",kind:"target"};addColumn(cells);return}if(statement.gate==="CCNOT"||statement.gate==="CSWAP"){const c1=indexByLabel.get(qubitRefKey3(statement.targets[0]));const c2=indexByLabel.get(qubitRefKey3(statement.targets[1]));const target3=indexByLabel.get(qubitRefKey3(statement.targets[2]));if(c1==null||c2==null||target3==null){return}drawWire(cells,Math.min(c1,c2,target3),Math.max(c1,c2,target3));cells[c1]={label:"C",kind:"control"};cells[c2]={label:statement.gate==="CSWAP"?"x":"C",kind:statement.gate==="CSWAP"?"target":"control"};cells[target3]={label:statement.gate==="CSWAP"?"x":"X",kind:"target"};addColumn(cells);return}if(statement.gate==="CRy"||statement.gate==="CRz"||statement.gate==="CP"){const control=indexByLabel.get(qubitRefKey3(statement.targets[0]));const target3=indexByLabel.get(qubitRefKey3(statement.targets[1]));if(control==null||target3==null){return}drawWire(cells,control,target3);cells[control]={label:"C",kind:"control"};cells[target3]={label:statement.gate==="CP"?"P":statement.gate.slice(1),kind:"target"};addColumn(cells);return}if(statement.gate==="RXX"||statement.gate==="RYY"||statement.gate==="RZZ"){const a=indexByLabel.get(qubitRefKey3(statement.targets[0]));const b=indexByLabel.get(qubitRefKey3(statement.targets[1]));if(a==null||b==null){return}drawWire(cells,a,b);cells[a]={label:statement.gate,kind:"gate"};cells[b]={label:statement.gate,kind:"gate"};addColumn(cells);return}const target2=indexByLabel.get(qubitRefKey3(statement.targets[0]));if(target2==null){return}cells[target2]={label:statement.gate,kind:"gate"};addColumn(cells)};const renderStatements=list=>{for(const statement of list){const resultMatch=mainResultColumn(statement,rows);if(resultMatch){addColumn(resultMatch);continue}if(statement.kind==="gate"){renderGate(statement);continue}if(statement.kind==="measurement"||statement.kind==="reset"){const target2=indexByLabel.get(qubitRefKey3(statement.target));if(target2==null){continue}const cells=rows.map(()=>({label:"",kind:"empty"}));const label3=statement.kind==="measurement"?`M${statement.basis??""}`:"R";cells[target2]={label:label3,kind:"measure"};addColumn(cells);continue}if(statement.kind==="measurement-binding"){const cells=measurementColumn(statement,rows,indexByLabel);if(cells)addColumn(cells);continue}if(statement.kind==="syndrome"){const targets=statement.factors.map(factor=>indexByLabel.get(qubitRefKey3(factor.target))).filter(target2=>target2!=null);if(targets.length===0){continue}const cells=rows.map(()=>({label:"",kind:"empty"}));drawWire(cells,Math.min(...targets),Math.max(...targets));for(const target2 of targets){cells[target2]={label:"S",kind:"measure"}}addColumn(cells);continue}if(statement.kind==="computeApply"){renderStatements(computeApplyProjection(statement));continue}if(statement.kind==="if"){renderStatements(statement.body);if(statement.elseBody){renderStatements(statement.elseBody)}continue}if(statement.kind==="classicalFor"||statement.kind==="until"){if(statement.kind==="classicalFor")addColumn(rows.map(()=>({label:`for ${statement.index}: ${statement.start}..${statement.end}`,kind:"gate"})));renderStatements(statement.body);if(statement.kind==="classicalFor")addColumn(rows.map(()=>({label:"end for",kind:"gate"})));continue}if(statement.kind==="match"){statement.cases.forEach(matchCase=>renderStatements(matchCase.body))}}};renderStatements(statements);return rows}function escapeQuantikzLabel(value){return value.replace(/\\/g,"\\textbackslash{}").replace(/_/g,"\\_").replace(/&/g,"\\&").replace(/%/g,"\\%").replace(/\$/g,"\\$").replace(/#/g,"\\#").replace(/\{/g,"\\{").replace(/\}/g,"\\}")}function quantikzCell(cells,rowIndex){const cell=cells[rowIndex]??{label:"",kind:"empty"};if(cell.kind==="empty"||cell.kind==="wire"){return"\\qw"}if(cell.kind==="gate"){return`\\gate{${escapeQuantikzLabel(cell.label)}}`}if(cell.kind==="measure"){return cell.label==="R"?"\\gate{R}":"\\meter{}"}if(cell.kind==="control"){const targetIndex=cells.findIndex((candidate,index)=>index!==rowIndex&&candidate.kind==="target");const offset=targetIndex>=0?targetIndex-rowIndex:1;return`\\ctrl{${offset}}`}if(cell.kind==="target"){const hasControl=cells.some(candidate=>candidate.kind==="control");if(hasControl&&cell.label==="X"){return"\\targ{}"}return`\\gate{${escapeQuantikzLabel(cell.label)}}`}return"\\qw"}function circuitDiagramToQuantikz(diagram){if(diagram.length===0){return""}const columnCount=Math.max(...diagram.map(row=>row.cells.length),0);if(columnCount===0){return""}const rows=diagram.map((row,rowIndex)=>{const cellsForRow=Array.from({length:columnCount},(_,columnIndex)=>{const columnCells=diagram.map(diagramRow=>diagramRow.cells[columnIndex]??{label:"",kind:"empty"});return quantikzCell(columnCells,rowIndex)});return`\\lstick{${escapeQuantikzLabel(row.label)}} & ${cellsForRow.join(" & ")} & \\qw`});return["\\begin{quantikz}",...rows.map((row,index)=>`${row}${index===rows.length-1?"":" \\\\"}`),"\\end{quantikz}"].join("\n")}var NM_STABILIZER_SCALE_VISUALIZATION_CONTRACT_VERSION="0.1";var nmStabilizerScaleVisualizationLimits={minimumQubits:13,maximumQubits:100,maximumSyndromeEvents:4096};var pauliPattern=/^[IXYZ]+$/u;function parseGenerator(generator,qubits,index){const sign=generator[0];const paulis=generator.slice(1);if(sign!=="+"&&sign!=="-"||paulis.length!==qubits||!pauliPattern.test(paulis)){throw new Error(`Invalid stabilizer generator g[${index}] for ${qubits}-qubit visualization.`)}const cells=[...paulis];return{generator:index,phase:sign==="+"?1:-1,weight:cells.filter(cell=>cell!=="I").length,cells}}function createGraphAdjacency(rows,qubits){const rowByPivot=new Map;for(const row of rows){if(row.cells.includes("Y")){return{status:"not-canonical",reason:"y-support"}}const pivots=row.cells.flatMap((cell,qubit3)=>cell==="X"?[qubit3]:[]);if(pivots.length!==1||rowByPivot.has(pivots[0])){return{status:"not-canonical",reason:"non-unique-x-pivot"}}rowByPivot.set(pivots[0],row)}if(rowByPivot.size!==qubits){return{status:"not-canonical",reason:"incomplete-x-basis"}}const nodes=Array.from({length:qubits},(_,qubit3)=>{const row=rowByPivot.get(qubit3);const neighbors=row.cells.flatMap((cell,candidate)=>cell==="Z"?[candidate]:[]);if(neighbors.includes(qubit3)){return void 0}return{qubit:qubit3,neighbors,byproductZ:row.phase===-1}});if(nodes.some(node=>node==null)){return{status:"not-canonical",reason:"self-loop"}}const exactNodes=nodes.filter(node=>node!=null);for(const node of exactNodes){if(node.neighbors.some(neighbor=>!exactNodes[neighbor]?.neighbors.includes(node.qubit))){return{status:"not-canonical",reason:"asymmetric-adjacency"}}}const edges=exactNodes.flatMap(node=>node.neighbors.filter(neighbor=>node.qubit<neighbor).map(neighbor=>({source:node.qubit,target:neighbor})));return{status:"canonical",nodes:exactNodes,edges}}function cloneSyndromeHistory(history,previouslyOmitted){if(!Number.isSafeInteger(previouslyOmitted)||previouslyOmitted<0){throw new Error("The omitted syndrome-event count must be a non-negative safe integer.")}const captured=history.slice(0,nmStabilizerScaleVisualizationLimits.maximumSyndromeEvents);const events=captured.map((event,index)=>{if(event.index!==index||!Number.isSafeInteger(event.line)||event.line<1||!Number.isFinite(event.probability)||event.probability<0||event.probability>1){throw new Error(`Invalid syndrome visualization event at index ${index}.`)}return{...event}});return{events,omitted:previouslyOmitted+history.length-captured.length}}function shouldUseNMStabilizerScaleVisualization(qubits){return Number.isSafeInteger(qubits)&&qubits>=nmStabilizerScaleVisualizationLimits.minimumQubits&&qubits<=nmStabilizerScaleVisualizationLimits.maximumQubits}function createNMStabilizerScaleVisualization(summary,syndromeHistory=[],syndromeHistoryOmitted=0){if(!shouldUseNMStabilizerScaleVisualization(summary.qubits)){return void 0}if(summary.generators.length!==summary.qubits||summary.qubits>summary.maxSupportedQubits){throw new Error("Stabilizer visualization requires one generator per supported qubit.")}const rows=summary.generators.map((generator,index)=>parseGenerator(generator,summary.qubits,index));const history=cloneSyndromeHistory(syndromeHistory,syndromeHistoryOmitted);return{contractVersion:NM_STABILIZER_SCALE_VISUALIZATION_CONTRACT_VERSION,qubits:summary.qubits,denseCircuitDiagramOmitted:true,tableau:{columns:Array.from({length:summary.qubits},(_,qubit3)=>qubit3),rows},graph:createGraphAdjacency(rows,summary.qubits),syndromeHistory:history.events,syndromeHistoryOmitted:history.omitted}}function createNMExpectationRuntime(output,trace,random,shots,bind){const expectations=Object.create(null),estimates=Object.create(null);let cost3;return{expectations,estimates,get cost(){return cost3},run(statement,evaluate){const terms=statement.terms.map(term=>{const expectation=term.factors.length?evaluate(term.factors):1;if(!Number.isFinite(expectation)||Math.abs(expectation)>1+1e-8||!Number.isFinite(term.coeff))throw new Error("Invalid Pauli expectation value");return{coeff:term.coeff,expectation:Math.max(-1,Math.min(1,expectation)),label:term.factors.map(factor=>`${factor.observable}(q${expectationQubitIndex(factor.target)})`).join("")||"I"}});const evaluated={value:terms.reduce((sum,term)=>sum+term.coeff*term.expectation,0),terms,labels:terms.map(term=>`${term.coeff>=0?"+":"-"}${Math.abs(term.coeff)}\xB7${term.label}`)};const estimate=shots===void 0?void 0:estimateExpectationFromShots(evaluated,shots,random),value=estimate?.value??evaluated.value;if(!Number.isFinite(value))throw new Error("Expectation result must be finite");bind(statement,value);cost3=value;const key4=statement.binding??"<H>";expectations[key4]=value;if(estimate)estimates[key4]=estimate;output.push(`Expectation ${evaluated.labels.join(" ")} = ${value.toFixed(4)}${estimate?` (${estimate.shots} shots, analytic ${estimate.analytic.toFixed(4)}, SE ${estimate.standardError.toFixed(4)})`:""}`);trace.push(`line ${statement.line}: expect ${evaluated.labels.join(" ")}${estimate?` shots=${estimate.shots}`:""} -> ${value.toFixed(4)}`)}}}function createEphemeralNMFeedForwardSeed(){if(typeof globalThis.crypto?.getRandomValues==="function"){const values2=new Uint32Array(1);globalThis.crypto.getRandomValues(values2);return values2[0]}return Math.floor(Math.random()*4294967296)}function createNMFeedForwardRuntime(declaredSeed,enabled,verification={tier:2,label:"sampled"}){const effectiveSeed=enabled?declaredSeed??createEphemeralNMFeedForwardSeed():declaredSeed;let source=effectiveSeed!=null?createSeededRandom(effectiveSeed):Math.random;let randomDraws=0;const outcomes=[];const branchesTaken=[];return{effectiveSeed,random:(()=>{if(enabled)randomDraws+=1;return source()}),replaceSource(next){source=next},currentSource(){return source},recordOutcome(bit){if(enabled)outcomes.push(bit===1?1:0)},recordBranch(taken){if(enabled)branchesTaken.push(taken)},branchRecord(){if(!enabled||effectiveSeed==null)return void 0;return{contractVersion:NM_FEED_FORWARD_CONTRACT_VERSION,seed:effectiveSeed.toString(),outcomes:[...outcomes],branchesTaken:[...branchesTaken],randomDraws,verification}}}}function runNMStabilizerRuntimeSummary(context){const{eligibility,parsed,resources,output,trace,stateTimeline,measurements,assertTimelineCapacity,feedForwardSeedOverride,feedForwardVerification,learningTimelineAnnotations,recordSyndromeHistory,syndromeHistory,getSyndromeHistoryOmitted,circuitDiagram,quantikzCircuit,buildChallengeResults,appendChallengeResults,buildTestResults,appendTestResults,buildPropertyResults,appendPropertyResults,appendSnapshotResults,snapshotResults,resultFields,executionProvenance,startTime}=context;const tableau=createNMStabilizerTableau(parsed.numQubits);const feedForwardRuntime=createNMFeedForwardRuntime(feedForwardSeedOverride??parsed.program.seed,parsed.program.feedForward!=null,feedForwardVerification);const random=feedForwardRuntime.random;const classicalBits={};const classicalPredicateValues={};const functionDebug=createFunctionDebugBridge(context.debugSourceId,parsed.program,stateTimeline,()=>classicalRuntime.values);const classicalRuntime=createNMTypedClassicalRuntimeStore(functionDebug?.context,usesNMMainMutableControl(parsed.program.statements),parsed.program.statements.filter(statement=>statement.kind==="qreg").map(statement=>statement.name));const resolveDynamicTargets=createNMDynamicQubitTargetResolver(parsed.program.statements);let programResult;const mainControl=createMainControlRuntime(classicalRuntime.values,()=>programResult,functionDebug,classicalRuntime);const expectationRuntime=createNMExpectationRuntime(output,trace,random,parsed.program.expectationShots,(statement,value)=>{if(parsed.program.typedClassicalValues)classicalRuntime.bindExpectation(statement,value)});let sampleSourceTableau;const formatQubitRef2=ref2=>ref2.resolvedIndex!=null?`q[${ref2.resolvedIndex}]`:ref2.index!=null?`${ref2.register}[${ref2.index}]`:ref2.register;const formatGateLabel=statement=>{const targets=statement.targets.map(formatQubitRef2).join(", ");return targets?`${statement.gate} ${targets}`:statement.gate};const runComputeApply=createNMComputeApplyExecutor(stateTimeline,context.debugSourceId);const recordStabilizerTimeline=(phase,label3,line,explanation,branchDecision,localization)=>{const generators2=formatNMStabilizerGenerators(tableau);const previousGenerators=stateTimeline.at(-1)?.stabilizerGenerators??[];const stabilizerGeneratorDeltas=generators2.map((current,index)=>{const previous=previousGenerators[index];return previous!=null&&previous!==current?{index,previous,current}:void 0}).filter(delta=>delta!=null);assertTimelineCapacity();stateTimeline.push({index:stateTimeline.length,phase,label:label3,...explanation?{explanation}:{},...localization,...line!=null?{line}:{},probabilities:[],probabilityDeltas:[],blochVectors:[],blochVectorDeltas:[],engine:"stabilizer",stabilizerGenerators:generators2,stabilizerGeneratorDeltas,...branchDecision?{branchDecision}:{}})};output.push(`Initialized ${parsed.numQubits}-qubit quantum register`);output.push("Simulation engine: stabilizer tableau");output.push(`Resources: depth ${resources.depth}, gates ${resources.gates} (${resources.twoQubitGates} two-qubit), measurements ${resources.measurements}`);output.push(`Target backend: ${parsed.program.target??"browser-stabilizer"}`);output.push(eligibility.diagnosticMessage);if(parsed.program.seed!=null){output.push(`Seed: ${parsed.program.seed} (deterministic sampling)`);trace.push(`runtime:seed ${parsed.program.seed}`)}else if(feedForwardRuntime.effectiveSeed!=null){output.push(`Feed-forward seed: ${feedForwardRuntime.effectiveSeed} (recorded for replay)`);trace.push(`runtime:feed-forward-seed ${feedForwardRuntime.effectiveSeed}`)}if(parsed.program.sampleShots!=null){output.push(`Sample mode: ${parsed.program.sampleShots} shots requested`);trace.push(`runtime:sample shots=${parsed.program.sampleShots}`)}trace.push(`runtime:init qubits=${parsed.numQubits}`);trace.push("runtime:engine stabilizer");trace.push(`runtime:target ${parsed.program.target??"browser-stabilizer"}`);trace.push(`runtime:resources depth=${resources.depth} gates=${resources.gates} twoQubit=${resources.twoQubitGates} measurements=${resources.measurements}`);recordStabilizerTimeline("init",`Initialized ${parsed.numQubits}-qubit stabilizer tableau`,void 0,"The stabilizer register starts with one Z generator per |0> qubit.");learningTimelineAnnotations.forEach(annotation=>{trace.push(`line ${annotation.line}: learning annotation ${annotation.kind}`);recordStabilizerTimeline("annotation",annotation.label,annotation.line,`${annotation.kind} annotation marks learner guidance without changing the stabilizer tableau.`)});const runStabilizerStatement=statement=>mainControl.statement(statement,()=>runStabilizerStatementBody(statement));const runStabilizerStatementBody=statement=>{switch(statement.kind){case"const":if(parsed.program.typedClassicalValues){classicalRuntime.bindConstant(statement.name,statement.valueType==="Int"?"Int":"Float",statement.value)}return;case"param":if(parsed.program.typedClassicalValues)classicalRuntime.bindConstant(statement.name,"Float",statement.value);return;case"computeApply":{runComputeApply(statement,{statements:parsed.program.statements,constants:parsed.constants,values:classicalRuntime.values,context:classicalRuntime.context},runStabilizerStatement);return}case"gate":{const resolved=resolveFunctionGateAngles(resolveDynamicTargets(statement,classicalRuntime.values,classicalRuntime.context),functionGateValues(parsed.constants,classicalRuntime.values),classicalRuntime.context);const result2=applyNMStabilizerGate(tableau,resolved);if(!result2.applied)throw new Error(result2.reason);output.push(`Applied ${formatGateLabel(resolved)} on stabilizer tableau`);trace.push(`line ${resolved.line}: stabilizer gate ${formatGateLabel(resolved)}`);recordStabilizerTimeline("gate",formatGateLabel(resolved),statement.line,`${statement.gate} updates the stabilizer generator set without allocating a state vector.`);return}case"measurement":{const qubitIdx=statement.target.resolvedIndex??statement.target.index;if(qubitIdx==null)return;sampleSourceTableau??(sampleSourceTableau=cloneNMStabilizerTableau(tableau));const basis=statement.basis??"Z";const result2=measureNMStabilizerQubit(tableau,qubitIdx,basis,random);if(parsed.program.feedForward==null&&result2.deterministic)random();measurements.push({state:result2.state,probability:result2.probability,basis});if(statement.binding){const value=Number.parseInt(result2.state,10);classicalBits[statement.binding]=value;classicalPredicateValues[statement.binding]=[value===1?1:0];classicalRuntime.bindBit(statement.binding,value)}feedForwardRuntime.recordOutcome(Number.parseInt(result2.state,10));const basisLabel2=basis==="Z"?"":` in ${basis} basis`;const deterministicLabel=result2.deterministic?", deterministic":"";output.push(`Measured qubit ${qubitIdx}${basisLabel2}: |${result2.state}> (p=${(result2.probability*100).toFixed(1)}%${deterministicLabel})`);trace.push(`line ${statement.line}: stabilizer measure ${basis}(q${qubitIdx}) -> ${result2.state}`);recordStabilizerTimeline("measurement",`measure ${basis}(${formatQubitRef2(statement.target)})`,statement.line,"Measurement updates the stabilizer generator set instead of collapsing amplitudes.");return}case"expectation":{expectationRuntime.run(statement,factors=>{const result2=measureNMStabilizerPauliString(cloneNMStabilizerTableau(tableau),factors,()=>0);return result2.deterministic?result2.eigenvalue:0});return}case"measurement-binding":{const bits=[];sampleSourceTableau??(sampleSourceTableau=cloneNMStabilizerTableau(tableau));for(let offset=0;offset<statement.width;offset+=1){const qubitIdx=statement.operand.resolvedIndices?.[offset]??nmMeasurementSliceIndex(statement.operand,offset);const result2=measureNMStabilizerQubit(tableau,qubitIdx,"Z",random);const bit=Number.parseInt(result2.state,10)===1?1:0;bits.push(bit);feedForwardRuntime.recordOutcome(bit);measurements.push({state:result2.state,probability:result2.probability,basis:"Z"})}classicalPredicateValues[statement.name]=bits;classicalRuntime.bindBitVec(statement.name,bits,statement.line);output.push(`Measured ${statement.name}: BitVec<${statement.width}> = 0b${bits.join("")}`);trace.push(`line ${statement.line}: stabilizer measure_all ${formatNMMeasurementSlice(statement.operand)} -> ${bits.join("")}`);recordStabilizerTimeline("measurement",`measure_all ${statement.name}`,statement.line,"Vector measurement projects each qubit in source-slice order and records one BitVec result.");return}case"syndrome":{const factors=statement.factors.map(factor=>({qubit:factor.target.resolvedIndex??factor.target.index??0,pauli:factor.observable}));sampleSourceTableau??(sampleSourceTableau=cloneNMStabilizerTableau(tableau));const result2=measureNMStabilizerPauliString(tableau,statement.factors,random);if(parsed.program.feedForward==null&&result2.deterministic)random();classicalBits[statement.binding]=result2.bit;classicalPredicateValues[statement.binding]=[result2.bit];classicalRuntime.bindBit(statement.binding,result2.bit);feedForwardRuntime.recordOutcome(result2.bit);const eigen=result2.eigenvalue===1?"+1":"-1";recordSyndromeHistory({line:statement.line,binding:statement.binding,pauli:pauliStringLabel(factors),bit:result2.bit,eigenvalue:result2.eigenvalue,probability:result2.probability,deterministic:result2.deterministic});output.push(`Syndrome ${statement.binding} = ${result2.bit} for ${pauliStringLabel(factors)} (${eigen}, p=${(result2.probability*100).toFixed(1)}%)`);trace.push(`line ${statement.line}: stabilizer syndrome ${statement.binding} ${pauliStringLabel(factors)} -> ${result2.bit}`);recordStabilizerTimeline("syndrome",`syndrome ${statement.binding}`,statement.line,"Syndrome measurement projects a Pauli string into a classical stabilizer check bit.");return}case"assertProbability":{const actual=getNMStabilizerBasisStateProbability(tableau,statement.state);const passed=compareProbability(actual,statement.operator,statement.expected);const assertionText=`P(|${statement.state}>) ${statement.operator} ${statement.expected}`;if(!passed){parsed.diagnostics.push(createDiagnostic({code:"NM-ASSERT-001",severity:"error",message:`Assertion failed: ${assertionText}. Actual probability is ${actual.toFixed(4)}.`,hint:"Move the assertion before measurement or update the expected probability.",translationKey:"assertionFailed",translationValues:{assertion:assertionText,actual:actual.toFixed(4)},line:statement.line}));throw new Error(diagnosticsToError(parsed.diagnostics))}output.push(`Assertion passed: ${assertionText} (actual ${actual.toFixed(4)})`);trace.push(`line ${statement.line}: stabilizer assert probability |${statement.state}> actual=${actual.toFixed(4)}`);return}case"bitAssign":{const value=evaluateBitExpression(statement.expression,classicalBits);classicalBits[statement.name]=value;classicalPredicateValues[statement.name]=[value===1?1:0];classicalRuntime.bindBit(statement.name,value);output.push(`Classical Bit ${statement.name} = ${value} (${formatBitExpression(statement.expression)})`);trace.push(`line ${statement.line}: stabilizer bit ${statement.name}=${value}`);return}case"classicalAssign":case"classicalDecl":{const result2=statement.kind==="classicalAssign"?classicalRuntime.executeAssignment(statement):classicalRuntime.executeDeclaration(statement);if(!result2.success){parsed.diagnostics.push(result2.diagnostic);throw new Error(diagnosticsToError(parsed.diagnostics))}output.push(result2.output);trace.push(result2.trace);return}case"classicalFor":mainControl.loop(statement,body=>body.forEach(runStabilizerStatement));return;case"classicalMatchResult":mainControl.matchResult(statement,body=>body.forEach(runStabilizerStatement));return;case"return":if(!parsed.program.functionResults)return;programResult=executeNMFunctionResultRuntime(statement,parsed.program.functionResults.resultType,classicalRuntime.values,parsed.diagnostics,output,trace,classicalRuntime.context);return;case"reset":{const qubitIdx=statement.target.resolvedIndex??statement.target.index;if(qubitIdx==null)return;const result2=resetNMStabilizerQubit(tableau,qubitIdx,random);if(parsed.program.feedForward==null&&result2.deterministic)random();output.push(result2.state==="1"?`Reset qubit ${qubitIdx}: measured |1> and applied X correction`:`Reset qubit ${qubitIdx}: already |0>`);trace.push(`line ${statement.line}: stabilizer reset q${qubitIdx} measured=${result2.state}`);recordStabilizerTimeline("reset",`reset ${formatQubitRef2(statement.target)}`,statement.line,"Reset measures in Z and conditionally flips the stabilizer generator back to |0>.");return}case"barrier":output.push("Barrier");trace.push(`line ${statement.line}: stabilizer barrier`);recordStabilizerTimeline("barrier","barrier",statement.line,"Barrier marks a circuit stage boundary without changing the stabilizer tableau.");return;case"if":{const bitValue=statement.condition||statement.predicate?void 0:classicalBits[statement.binding]??0;const conditionMet=statement.condition?evaluateNMTypedClassicalCondition(statement.condition,classicalRuntime.values,classicalRuntime.context):statement.predicate?evaluateNMClassicalPredicate(statement.predicate,classicalPredicateValues):statement.operator==="=="?bitValue===statement.value:bitValue!==statement.value;const conditionLabel=statement.condition?formatNMTypedClassicalExpression(statement.condition):statement.predicate?formatNMClassicalPredicate(statement.predicate):`${statement.binding} ${statement.operator} ${statement.value}`;const traceConditionLabel=statement.condition||statement.predicate?conditionLabel:`${statement.binding}(${bitValue}) ${statement.operator} ${statement.value}`;trace.push(`line ${statement.line}: stabilizer if ${traceConditionLabel} -> ${conditionMet?"run":"skip"}`);feedForwardRuntime.recordBranch(conditionMet);if(parsed.program.feedForward){const branchDecision={predicate:conditionLabel,taken:conditionMet,selected:conditionMet?"then":statement.elseBody?.length?"else":"skip",outcomes:statement.condition?[]:statement.predicate?getNMClassicalPredicateResults(statement.predicate).map(binding=>({binding,bits:classicalPredicateValues[binding]?.join("")??""})):[{binding:statement.binding,bits:String(bitValue??0)}]};recordStabilizerTimeline("branch",`if ${conditionLabel} -> ${branchDecision.selected}`,statement.line,statement.condition?`The Bool condition result selected the ${branchDecision.selected} path.`:`The recorded measurement outcome selected the ${branchDecision.selected} path.`,branchDecision,{explanationKey:statement.condition?"ui.timelineExplanationBoolBranch":"ui.timelineExplanationFeedForwardBranch",explanationValues:{selected:branchDecision.selected}})}if(!conditionMet&&statement.elseBody?.length){output.push(`Condition (${conditionLabel}) not met -> applying else ${statement.elseBody.length} statement(s)`);mainControl.scope(()=>statement.elseBody.forEach(runStabilizerStatement));return}if(conditionMet){output.push(`Condition (${conditionLabel}) met -> applying ${statement.body.length} statement(s)`);mainControl.scope(()=>statement.body.forEach(runStabilizerStatement))}else{output.push(`Condition (${conditionLabel}) not met -> skipped`)}return}case"until":{output.push(`Until (${statement.binding} ${statement.operator} ${statement.value}) max ${statement.maxIterations}`);trace.push(`line ${statement.line}: stabilizer until ${statement.binding} ${statement.operator} ${statement.value} max ${statement.maxIterations} begin`);for(let iteration=1;iteration<=statement.maxIterations;iteration+=1){output.push(`Until iteration ${iteration}/${statement.maxIterations}`);trace.push(`line ${statement.line}: stabilizer until iteration ${iteration}`);mainControl.scope(()=>statement.body.forEach(runStabilizerStatement));const bitValue=classicalBits[statement.binding]??0;const conditionMet=statement.operator==="=="?bitValue===statement.value:bitValue!==statement.value;trace.push(`line ${statement.line}: stabilizer until check ${statement.binding}=${bitValue} ${statement.operator} ${statement.value} -> ${conditionMet?"stop":"retry"}`);if(conditionMet){output.push(`Until condition met after ${iteration} iteration(s): ${statement.binding}=${bitValue}`);return}}output.push(`Until reached max ${statement.maxIterations} iteration(s) without meeting ${statement.binding} ${statement.operator} ${statement.value}`);trace.push(`line ${statement.line}: stabilizer until max reached`);return}case"match":{const values2=statement.bindings.map(binding=>classicalBits[binding]??0);const selected=statement.cases.find(matchCase=>matchCase.pattern.length===values2.length&&matchCase.pattern.every((value,index)=>value===values2[index]));const selector=statement.bindings.map((binding,index)=>`${binding}=${values2[index]}`).join(", ");if(!selected){output.push(`Match (${selector}) -> no case selected`);trace.push(`line ${statement.line}: stabilizer match ${selector} -> skip`);return}const pattern=selected.pattern.join(", ");output.push(`Match (${selector}) -> case (${pattern}) applying ${selected.body.length} statement(s)`);trace.push(`line ${statement.line}: stabilizer match ${selector} -> (${pattern})`);mainControl.scope(()=>selected.body.forEach(runStabilizerStatement));return}default:return}};const propagatedResult=runFunctionResultStatements(parsed.program.statements,runStabilizerStatement,Boolean(parsed.program.functionResults),output,trace);if(propagatedResult)programResult=propagatedResult;functionDebug?.finish(programResult);recordStabilizerTimeline("final","Final stabilizer tableau",void 0,"Final generator snapshot after all stabilizer-supported statements have run.");const generators=formatNMStabilizerGenerators(tableau);const stabilizer={qubits:parsed.numQubits,maxSupportedQubits:eligibility.maxSupportedQubits,supportedGateCount:eligibility.supportedGateCount,generators,globalPhase:tableau.globalPhase};const syndromeHistoryOmitted=getSyndromeHistoryOmitted();const stabilizerVisualization=createNMStabilizerScaleVisualization(stabilizer,syndromeHistory,syndromeHistoryOmitted);output.push("");output.push("Final stabilizer generators:");generators.forEach(generator=>output.push(` ${generator}`));const sampleHistogram=parsed.program.sampleShots!=null?createNMStabilizerSampleHistogram(sampleSourceTableau??tableau,parsed.program.sampleShots,random):void 0;const typedCollection=parsed.program.typedCollection?createNMStabilizerTypedCollection(parsed.program.typedCollection,sampleSourceTableau??tableau,parsed.program.seed,random):void 0;if(sampleHistogram){output.push("");output.push(`Sample histogram (${sampleHistogram.shots} shots):`);sampleHistogram.entries.forEach(entry=>{output.push(` |${entry.state}>: ${entry.count} (${(entry.probability*100).toFixed(1)}%)`)})}if(typedCollection){output.push("");output.push(`Collected ${typedCollection.shots} ordered ${typedCollection.elementType} result(s) with seed ${typedCollection.seed}`);trace.push(`runtime:collect shots=${typedCollection.shots} width=${typedCollection.width} seed=${typedCollection.seed}`)}const challengeResults=buildChallengeResults(true);appendChallengeResults(challengeResults);const testResults=buildTestResults(true);appendTestResults(testResults);const finalPropertyResults=buildPropertyResults(true);appendPropertyResults(finalPropertyResults);appendSnapshotResults(snapshotResults);return{...resultFields,success:true,output,measurements,executionTime:performance.now()-startTime,diagnostics:parsed.diagnostics,trace,stateTimeline:boundStateTimelineForResult(stateTimeline),preMeasurementProbabilities:[],sampleHistogram,typedCollection,circuitDiagram,quantikzCircuit:quantikzCircuit||void 0,blochVectors:[],classicalValues:classicalRuntime.evidence.length>0?classicalRuntime.evidence:void 0,programResult,cost:expectationRuntime.cost,expectations:Object.keys(expectationRuntime.expectations).length?expectationRuntime.expectations:void 0,expectationShotEstimates:Object.keys(expectationRuntime.estimates).length?expectationRuntime.estimates:void 0,targetCapabilities:parsed.program.targetCapabilityConstraints?.evidence,challengeResults,testResults,propertyResults:finalPropertyResults,snapshotResults,resources,engine:"stabilizer",execution:executionProvenance(),...parsed.program.feedForward?{feedForwardBranchRecord:feedForwardRuntime.branchRecord()}:{},...feedForwardVerification?{feedForwardVerification}:{},...syndromeHistory.length>0?{syndromeHistory:syndromeHistory.map(event=>({...event}))}:{},...syndromeHistoryOmitted>0?{syndromeHistoryOmitted}:{},...stabilizerVisualization?{stabilizerVisualization}:{},stabilizer}}function contract3(state,operators){let real=new Float64Array([1]),imag=new Float64Array([0]);for(let qubit3=0;qubit3<state.tensors.length;qubit3++){const tensor=state.tensors[qubit3],left=tensor.chiLeft,right=tensor.chiRight,op=operators.get(qubit3)??"I";const tmpR=new Float64Array(left*right*2),tmpI=new Float64Array(left*right*2);for(let a=0;a<left;a++)for(let b=0;b<left;b++)for(let d=0;d<right;d++)for(let j=0;j<2;j++){const e=a*left+b,k=(b*right+d)*2+j,t=(a*right+d)*2+j;tmpR[t]+=real[e]*tensor.dataRe[k]-imag[e]*tensor.dataIm[k];tmpI[t]+=real[e]*tensor.dataIm[k]+imag[e]*tensor.dataRe[k]}const nextR=new Float64Array(right*right),nextI=new Float64Array(right*right);for(let c2=0;c2<right;c2++)for(let d=0;d<right;d++)for(let a=0;a<left;a++)for(let i=0;i<2;i++){const j=op==="X"||op==="Y"?1-i:i,k=(a*right+c2)*2+i,t=(a*right+d)*2+j;let r=tmpR[t],im=tmpI[t];if(op==="Y"){const sign=i===0?-1:1;[r,im]=[-sign*im,sign*r]}else if(op==="Z"&&i===1){r=-r;im=-im}const n=c2*right+d;nextR[n]+=tensor.dataRe[k]*r+tensor.dataIm[k]*im;nextI[n]+=tensor.dataRe[k]*im-tensor.dataIm[k]*r}real=nextR;imag=nextI}if(real.length!==1||!Number.isFinite(real[0])||!Number.isFinite(imag[0])||Math.abs(imag[0])>1e-8*Math.max(1,Math.abs(real[0])))throw new Error("Invalid MPS expectation contraction");return real[0]}function expectationMPSPauli(state,factors){const operators=new Map;for(const factor of factors){const qubit3=expectationQubitIndex(factor.target);if(!Number.isInteger(qubit3)||qubit3<0||qubit3>=state.numQubits||operators.has(qubit3)||!["X","Y","Z"].includes(factor.observable))throw new Error("Invalid MPS Pauli factor");operators.set(qubit3,factor.observable)}const norm=contract3(state,new Map);if(!(norm>1e-15))throw new Error("MPS expectation requires a nonzero norm");return contract3(state,operators)/norm}function recordFunctionMPSDebugState(mps,timeline,phase,line){if(timeline.length>=1e4)throw new FunctionDebugObserverError("NM-DEBUG-004: MPS debug timeline exceeds 10000 frames.");const amplitudes=mps.numQubits<=10?mpsToDenseAmplitudes(mps):void 0;const probabilities=amplitudes?.map((amplitude,index)=>({state:index.toString(2).padStart(mps.numQubits,"0"),probability:amplitude.re**2+amplitude.im**2}))??[];timeline.push({index:timeline.length,phase,label:`MPS ${phase}`,...line?{line}:{},...amplitudes?{state:{numQubits:mps.numQubits,amplitudes}}:{},probabilities,probabilityDeltas:[],blochVectorDeltas:[],blochVectors:Array.from({length:mps.numQubits},(_,qubit3)=>{const{x,y,z}=getBlochVectorMPS(mps,qubit3);return{qubit:qubit3,x,y,z,purity:Math.sqrt(x*x+y*y+z*z)}})})}function selectNMSimulationBackend(program,numQubits){if(program.target==="browser-mps"||program.target==="matrix-product-state"){return{backend:"mps"}}if(program.target==="browser-stabilizer"){const stabilizerEligibility=analyzeNMStabilizerEligibility(program,numQubits);return{backend:stabilizerEligibility.eligible?"stabilizer":numQubits>14?"mps":"statevector",stabilizerEligibility}}return{backend:"statevector"}}function createNMSimulationExecutionProvenance(program,backend,seedOverride){const seed=seedOverride??program.seed;return{runType:"simulation",provider:"nm-local-simulator",backend,seed:seed??null,deterministic:seed!=null,hardware:false}}function appendNMTargetCapabilityEvidence(program,output,trace){const evidence=program.targetCapabilityConstraints?.evidence;if(!evidence)return;output.push(`Target capabilities ${evidence.profile}: ${evidence.passed?"passed":"failed"}`);const gates2=evidence.requiredGates?evidence.requiredGates.join(","):"none";trace.push(`target-capabilities profile=${evidence.profile} passed=${evidence.passed} gates=${gates2} connectivity=${evidence.connectivity?.actual??"not-required"} error=${evidence.errorBudget?.estimated??"not-required"}`)}var c=(re,im=0)=>({re,im});var MPS_GATES_2X2={H:[[c(1/Math.SQRT2),c(1/Math.SQRT2)],[c(1/Math.SQRT2),c(-1/Math.SQRT2)]],X:[[c(0),c(1)],[c(1),c(0)]],Y:[[c(0),c(0,-1)],[c(0,1),c(0)]],Z:[[c(1),c(0)],[c(0),c(-1)]],S:[[c(1),c(0)],[c(0),c(0,1)]],T:[[c(1),c(0)],[c(0),c(Math.SQRT1_2,Math.SQRT1_2)]],Sdg:[[c(1),c(0)],[c(0),c(0,-1)]],Tdg:[[c(1),c(0)],[c(0),c(Math.SQRT1_2,-Math.SQRT1_2)]]};function getSingleQubitGateMatrix(name2,params=[]){if(MPS_GATES_2X2[name2])return MPS_GATES_2X2[name2];if(name2==="Rx"||name2==="rx"){const theta=params[0]??0;const cos=Math.cos(theta/2);const sin=Math.sin(theta/2);return[[c(cos),c(0,-sin)],[c(0,-sin),c(cos)]]}if(name2==="Ry"||name2==="ry"){const theta=params[0]??0;const cos=Math.cos(theta/2);const sin=Math.sin(theta/2);return[[c(cos),c(-sin)],[c(sin),c(cos)]]}if(name2==="Rz"||name2==="rz"){const theta=params[0]??0;return[[c(Math.cos(-theta/2),Math.sin(-theta/2)),c(0)],[c(0),c(Math.cos(theta/2),Math.sin(theta/2))]]}if(name2==="P"||name2==="p"||name2==="Phase"){const theta=params[0]??0;return[[c(1),c(0)],[c(0),c(Math.cos(theta),Math.sin(theta))]]}if(name2==="U"||name2==="u"){const theta=params[0]??0;const phi=params[1]??0;const lambda=params[2]??0;const cos=Math.cos(theta/2);const sin=Math.sin(theta/2);return[[c(cos),c(-sin*Math.cos(lambda),-sin*Math.sin(lambda))],[c(sin*Math.cos(phi),sin*Math.sin(phi)),c(cos*Math.cos(phi+lambda),cos*Math.sin(phi+lambda))]]}return void 0}function runNMMPSRuntimeSummary(context){const{parsed,resources,output,trace,stateTimeline,measurements,maxBondDimension=32}=context;const{numQubits}=parsed;const mps=initMPS(numQubits,{maxBondDimension});const propertyResults=[];const snapshotResults=[];const showResults=[];const functionDebug=createFunctionDebugBridge(context.debugSourceId,parsed.program,stateTimeline,()=>classicalRuntime.values);const classicalRuntime=createNMTypedClassicalRuntimeStore(functionDebug?.context,usesNMMainMutableControl(parsed.program.statements),parsed.program.statements.filter(statement=>statement.kind==="qreg").map(statement=>statement.name));const resolveDynamicTargets=createNMDynamicQubitTargetResolver(parsed.program.statements);const classicalBits=Object.create(null);const predicateValues=Object.create(null);let programResult;const mainControl=createMainControlRuntime(classicalRuntime.values,()=>programResult,functionDebug,classicalRuntime);let peakBond=1;const rng=context.feedForwardSeedOverride!=null?createSeededRandom(context.feedForwardSeedOverride):parsed.program.seed!=null?createSeededRandom(parsed.program.seed):Math.random;const startTime=performance.now();const expectationRuntime=createNMExpectationRuntime(output,trace,rng,parsed.program.expectationShots,(statement,value)=>{if(parsed.program.typedClassicalValues)classicalRuntime.bindExpectation(statement,value)});const updatePeakBond=()=>{for(let i=0;i<mps.tensors.length;i++){const b=Math.max(mps.tensors[i].chiLeft,mps.tensors[i].chiRight);if(b>peakBond)peakBond=b}};const applyGate=gate=>{const name2=gate.gate;const targetQubits=gate.targets.map(t=>t.resolvedIndex??t.index??0);const resolvedParams=gate.angles??(gate.theta!=null?[gate.theta]:[]);if(name2==="GPhase"){const phase=c(Math.cos(resolvedParams[0]),Math.sin(resolvedParams[0]));applySingleQubitGateMPS(mps,0,[[phase,c(0)],[c(0),phase]]);return}const u2=getSingleQubitGateMatrix(name2,resolvedParams);if(u2&&targetQubits.length===1){applySingleQubitGateMPS(mps,targetQubits[0],u2);updatePeakBond();return}if(name2==="CNOT"){const cnotMatrix=createControlledGateMatrix(MPS_GATES_2X2.X);applyTwoQubitGateMPS(mps,targetQubits[0],targetQubits[1],cnotMatrix);updatePeakBond();return}if(name2==="CZ"){const czMatrix=createControlledGateMatrix(MPS_GATES_2X2.Z);applyTwoQubitGateMPS(mps,targetQubits[0],targetQubits[1],czMatrix);updatePeakBond();return}if(name2==="CY"){const cyMatrix=createControlledGateMatrix(MPS_GATES_2X2.Y);applyTwoQubitGateMPS(mps,targetQubits[0],targetQubits[1],cyMatrix);updatePeakBond();return}if(name2==="CH"){const chMatrix=createControlledGateMatrix(MPS_GATES_2X2.H);applyTwoQubitGateMPS(mps,targetQubits[0],targetQubits[1],chMatrix);updatePeakBond();return}if(name2==="CP"||name2==="CRy"||name2==="CRz"){const pMat=getSingleQubitGateMatrix(name2.slice(1),resolvedParams);const cpMatrix=createControlledGateMatrix(pMat);applyTwoQubitGateMPS(mps,targetQubits[0],targetQubits[1],cpMatrix);updatePeakBond();return}if(name2==="RXX"||name2==="RYY"||name2==="RZZ"){const matrix={RXX:rxxMatrix,RYY:ryyMatrix,RZZ:rzzMatrix}[name2](resolvedParams[0]);applyTwoQubitGateMPS(mps,targetQubits[0],targetQubits[1],matrix);updatePeakBond();return}if(name2==="SWAP"){const swapMat=[[c(1),c(0),c(0),c(0)],[c(0),c(0),c(1),c(0)],[c(0),c(1),c(0),c(0)],[c(0),c(0),c(0),c(1)]];applyTwoQubitGateMPS(mps,targetQubits[0],targetQubits[1],swapMat);updatePeakBond();return}if(name2==="iSWAP"){const iswapMat=[[c(1),c(0),c(0),c(0)],[c(0),c(0),c(0,1),c(0)],[c(0),c(0,1),c(0),c(0)],[c(0),c(0),c(0),c(1)]];applyTwoQubitGateMPS(mps,targetQubits[0],targetQubits[1],iswapMat);updatePeakBond();return}if(name2==="CCNOT"){const[c1,c2,target2]=targetQubits;applySingleQubitGateMPS(mps,target2,MPS_GATES_2X2.H);applyTwoQubitGateMPS(mps,c2,target2,createControlledGateMatrix(MPS_GATES_2X2.X));applySingleQubitGateMPS(mps,target2,MPS_GATES_2X2.Tdg);applyTwoQubitGateMPS(mps,c1,target2,createControlledGateMatrix(MPS_GATES_2X2.X));applySingleQubitGateMPS(mps,target2,MPS_GATES_2X2.T);applyTwoQubitGateMPS(mps,c2,target2,createControlledGateMatrix(MPS_GATES_2X2.X));applySingleQubitGateMPS(mps,target2,MPS_GATES_2X2.Tdg);applyTwoQubitGateMPS(mps,c1,target2,createControlledGateMatrix(MPS_GATES_2X2.X));applySingleQubitGateMPS(mps,target2,MPS_GATES_2X2.T);applySingleQubitGateMPS(mps,target2,MPS_GATES_2X2.H);applySingleQubitGateMPS(mps,c2,MPS_GATES_2X2.T);applyTwoQubitGateMPS(mps,c1,c2,createControlledGateMatrix(MPS_GATES_2X2.X));applySingleQubitGateMPS(mps,c2,MPS_GATES_2X2.Tdg);applyTwoQubitGateMPS(mps,c1,c2,createControlledGateMatrix(MPS_GATES_2X2.X));applySingleQubitGateMPS(mps,c1,MPS_GATES_2X2.T);updatePeakBond();return}throw new Error(`Gate ${name2} is not supported by the MPS backend (line ${gate.line}).`)};const processStatements=stmts=>{for(const statement of stmts){if(programResult)return;mainControl.statement(statement,()=>{if(statement.kind==="computeApply"){runComputeApply(statement,{statements:parsed.program.statements,constants:parsed.constants,values:classicalRuntime.values,context:classicalRuntime.context},operation=>processStatements([operation]))}else if(statement.kind==="barrier"){output.push("Barrier");trace.push(`line ${statement.line}: mps barrier`);if(context.debugSourceId)recordFunctionMPSDebugState(mps,stateTimeline,"barrier",statement.line)}else if("gate"in statement){applyGate(resolveFunctionGateAngles(resolveDynamicTargets(statement,classicalRuntime.values,classicalRuntime.context),functionGateValues(parsed.constants,classicalRuntime.values),classicalRuntime.context));const targetQubits=statement.targets.map(t=>t.resolvedIndex??t.index??0);trace.push(`mps-gate name=${statement.gate} qubits=${targetQubits.join(",")}`)}else if(statement.kind==="expectation"){expectationRuntime.run(statement,factors=>expectationMPSPauli(mps,factors))}else if(statement.kind==="measurement"){const q=statement.target.resolvedIndex??statement.target.index??0;if(statement.basis==="Y")applySingleQubitGateMPS(mps,q,MPS_GATES_2X2.Sdg);if(statement.basis==="X"||statement.basis==="Y")applySingleQubitGateMPS(mps,q,MPS_GATES_2X2.H);const rho=getBlochVectorMPS(mps,q);const prob0=(1+rho.z)/2;const outcome=rng()<prob0?0:1;collapseMeasureQubitMPS(mps,q,outcome);if(statement.basis==="X"||statement.basis==="Y")applySingleQubitGateMPS(mps,q,MPS_GATES_2X2.H);if(statement.basis==="Y")applySingleQubitGateMPS(mps,q,MPS_GATES_2X2.S);if(statement.binding){classicalBits[statement.binding]=outcome;predicateValues[statement.binding]=[outcome];classicalRuntime.bindBit(statement.binding,outcome)}measurements.push({state:String(outcome),probability:outcome===0?prob0:1-prob0,collapsed:numQubits<=14?{numQubits,amplitudes:mpsToDenseAmplitudes(mps)}:{numQubits,amplitudes:[]}});output.push(`Measured qubit ${q}: ${outcome}`);trace.push(`mps-measure qubit=${q} outcome=${outcome}`)}else if(statement.kind==="reset"){const q=statement.target.resolvedIndex??statement.target.index;if(q===void 0)throw new Error(`MPS reset target is unresolved at line ${statement.line}.`);const probabilityZero=(1+getBlochVectorMPS(mps,q).z)/2;const outcome=rng()<probabilityZero?0:1;collapseMeasureQubitMPS(mps,q,outcome);if(outcome===1)applySingleQubitGateMPS(mps,q,MPS_GATES_2X2.X);output.push(`Reset qubit ${q}: measured ${outcome}, restored |0>`);trace.push(`line ${statement.line}: mps reset q${q} measured=${outcome}`)}else if(statement.kind==="measurement-binding"){const indices=statement.operand.resolvedIndices??[];const bits=[];for(const q of indices){const rho=getBlochVectorMPS(mps,q);const prob0=(1+rho.z)/2;const outcome=rng()<prob0?0:1;collapseMeasureQubitMPS(mps,q,outcome);bits.push(outcome)}if(bits.length!==statement.width)throw new Error(`MPS measurement ${statement.name} has an unresolved width at line ${statement.line}.`);predicateValues[statement.name]=bits;classicalRuntime.bindBitVec(statement.name,bits,statement.line);output.push(`Measured ${statement.name}: BitVec<${statement.width}> = 0b${bits.join("")}`);trace.push(`mps-measure-binding name=${statement.name} width=${statement.width}`)}else if(statement.kind==="const"){classicalRuntime.bindConstant(statement.name,statement.valueType==="Int"?"Int":"Float",statement.value)}else if(statement.kind==="param"){classicalRuntime.bindConstant(statement.name,"Float",statement.value)}else if(statement.kind==="bitAssign"){const value=evaluateBitExpression(statement.expression,classicalBits);classicalBits[statement.name]=value;predicateValues[statement.name]=[value===1?1:0];classicalRuntime.bindBit(statement.name,value);output.push(`Classical Bit ${statement.name} = ${value}`);trace.push(`line ${statement.line}: mps bit ${statement.name}=${value}`)}else if(statement.kind==="classicalDecl"||statement.kind==="classicalAssign"){const result2=statement.kind==="classicalAssign"?classicalRuntime.executeAssignment(statement):classicalRuntime.executeDeclaration(statement);if(!result2.success){parsed.diagnostics.push(result2.diagnostic);throw new Error(diagnosticsToError(parsed.diagnostics))}output.push(result2.output);trace.push(result2.trace)}else if(statement.kind==="classicalFor"){mainControl.loop(statement,processStatements)}else if(statement.kind==="classicalMatchResult"){mainControl.matchResult(statement,processStatements)}else if(statement.kind==="return"){if(parsed.program.functionResults){programResult=executeNMFunctionResultRuntime(statement,parsed.program.functionResults.resultType,classicalRuntime.values,parsed.diagnostics,output,trace,classicalRuntime.context)}}else if(statement.kind==="if"){const names=statement.condition?[]:statement.predicate?getNMClassicalPredicateResults(statement.predicate):[statement.binding];if(names.some(name2=>!Object.prototype.hasOwnProperty.call(predicateValues,name2)))throw new Error(`MPS condition has an unavailable measurement value at line ${statement.line}.`);const selected=statement.condition?evaluateNMTypedClassicalCondition(statement.condition,classicalRuntime.values,classicalRuntime.context):statement.predicate?evaluateNMClassicalPredicate(statement.predicate,predicateValues):statement.operator==="=="?classicalBits[statement.binding]===statement.value:classicalBits[statement.binding]!==statement.value;trace.push(`line ${statement.line}: mps if${statement.condition?` ${formatNMTypedClassicalExpression(statement.condition)}`:""} -> ${selected?"then":"else"}`);mainControl.scope(()=>processStatements(selected?statement.body:statement.elseBody??[]))}else if(statement.kind==="match"){if(statement.bindings.some(name2=>!Object.prototype.hasOwnProperty.call(classicalBits,name2)))throw new Error(`MPS match has an unavailable measurement value at line ${statement.line}.`);const values2=statement.bindings.map(name2=>classicalBits[name2]);const selected=statement.cases.find(branch=>branch.pattern.length===values2.length&&branch.pattern.every((value,index)=>value===values2[index]));trace.push(`line ${statement.line}: mps match -> ${selected?selected.pattern.join(", "):"skip"}`);if(selected)mainControl.scope(()=>processStatements(selected.body))}else if(statement.kind==="until"){throw new Error(`MPS bounded-until execution is not supported at line ${statement.line}.`)}else if(["observe","test","snapshot","property"].includes(statement.kind)){throw new Error(`MPS ${statement.kind} block execution is not supported at line ${statement.line}.`)}});if(context.debugSourceId&&["gate","measurement","measurement-binding","reset","if"].includes(statement.kind))recordFunctionMPSDebugState(mps,stateTimeline,statement.kind==="measurement"||statement.kind==="measurement-binding"?"measurement":"gate",statement.line)}};const runComputeApply=createNMComputeApplyExecutor(stateTimeline,context.debugSourceId);if(context.debugSourceId)recordFunctionMPSDebugState(mps,stateTimeline,"init");const propagatedResult=runFunctionResultStatements(parsed.program.statements,statement=>{processStatements([statement])},Boolean(parsed.program.functionResults),output,trace);if(propagatedResult)programResult=propagatedResult;functionDebug?.finish(programResult);if(context.debugSourceId)recordFunctionMPSDebugState(mps,stateTimeline,"final");const blochVectors=[];for(let q=0;q<numQubits;q++){const b=getBlochVectorMPS(mps,q);blochVectors.push({qubit:q,x:b.x,y:b.y,z:b.z,purity:Math.sqrt(b.x*b.x+b.y*b.y+b.z*b.z)})}const entropyBonds=[];const entropyValues=[];let peakEntropy=0;for(let b=0;b<numQubits-1;b++){const ent=getEntanglementEntropyMPS(mps,b);entropyBonds.push(b);entropyValues.push(ent);if(ent>peakEntropy)peakEntropy=ent}const mpsNodes=[];for(let q=0;q<numQubits;q++){const t=mps.tensors[q];mpsNodes.push({qubit:q,chiLeft:t.chiLeft,chiRight:t.chiRight,maxBond:Math.max(t.chiLeft,t.chiRight),bloch:blochVectors[q]})}const mpsBonds=[];let totalEntropy=0;for(let b=0;b<numQubits-1;b++){const ent=entropyValues[b];totalEntropy+=ent;mpsBonds.push({cut:b,leftQubit:b,rightQubit:b+1,bondDimension:mps.tensors[b].chiRight,entanglementEntropy:ent,singularValues:Array.from(mps.singularValues[b]||[])})}const mpsVisualization={numQubits,maxBondDimension,peakBondDimension:peakBond,peakEntanglementEntropy:peakEntropy,averageEntanglementEntropy:numQubits>1?totalEntropy/(numQubits-1):0,nodes:mpsNodes,bonds:mpsBonds};let sampleHistogram;const shots=parsed.program.sampleShots??parsed.program.expectationShots??parsed.program.shots;if(shots&&shots>0){const histCounts={};for(let s=0;s<shots;s++){const sample=sampleBitstringMPS(mps,rng);histCounts[sample.bitstring]=(histCounts[sample.bitstring]??0)+1}const entries=Object.entries(histCounts).map(([state,count])=>({state,count,probability:count/shots})).sort((a,b)=>b.count-a.count);sampleHistogram={shots,entries}}let finalState;if(numQubits<=14){const amplitudes=mpsToDenseAmplitudes(mps);finalState={numQubits,amplitudes}}output.push(`MPS simulation complete: ${numQubits} qubits, peak bond dimension=${peakBond}, peak entanglement=${peakEntropy.toFixed(3)} bits.`);return{success:true,executionTime:performance.now()-startTime,finalState,measurements,diagnostics:parsed.diagnostics,classicalValues:classicalRuntime.evidence.length?classicalRuntime.evidence:void 0,programResult,cost:expectationRuntime.cost,expectations:Object.keys(expectationRuntime.expectations).length?expectationRuntime.expectations:void 0,expectationShotEstimates:Object.keys(expectationRuntime.estimates).length?expectationRuntime.estimates:void 0,sampleHistogram,blochVectors,output,trace,stateTimeline:boundStateTimelineForResult(stateTimeline),circuitDiagram:[],resources,propertyResults,snapshotResults,showResults,mpsVisualization,execution:createNMSimulationExecutionProvenance(parsed.program,"mps",context.feedForwardSeedOverride)}}function roundSnapshotNumber(value){const rounded=Number.parseFloat(value.toFixed(12));return Object.is(rounded,-0)?0:rounded}function hashSnapshotText(value){let hash2=2166136261;for(let index=0;index<value.length;index+=1){hash2^=value.charCodeAt(index);hash2=Math.imul(hash2,16777619)>>>0}return hash2.toString(16).padStart(8,"0")}function formatBasisState(index,width){return index.toString(2).padStart(width,"0")}function createSnapshotAmplitudes(state){return state.amplitudes.map((amp,index)=>({state:formatBasisState(index,state.numQubits),re:roundSnapshotNumber(amp.re),im:roundSnapshotNumber(amp.im)}))}function formatStateNumber(value){const rounded=Number.parseFloat(value.toFixed(6));return String(Object.is(rounded,-0)?0:rounded)}function formatDiracCoefficient(amp){const re=Number.parseFloat(amp.re.toFixed(6));const im=Number.parseFloat(amp.im.toFixed(6));const normalizedRe=Object.is(re,-0)?0:re;const normalizedIm=Object.is(im,-0)?0:im;if(normalizedIm===0){return formatStateNumber(normalizedRe)}if(normalizedRe===0){return`${formatStateNumber(normalizedIm)}i`}const sign=normalizedIm>=0?"+":"";return`(${formatStateNumber(normalizedRe)}${sign}${formatStateNumber(normalizedIm)}i)`}function formatDiracTerm(amp,basis,first){const re=Number.parseFloat(amp.re.toFixed(6));const im=Number.parseFloat(amp.im.toFixed(6));const normalizedRe=Object.is(re,-0)?0:re;const normalizedIm=Object.is(im,-0)?0:im;if(normalizedIm===0){const sign=normalizedRe<0?first?"-":" - ":first?"":" + ";return`${sign}${formatStateNumber(Math.abs(normalizedRe))}|${basis}>`}return`${first?"":" + "}${formatDiracCoefficient({re:normalizedRe,im:normalizedIm})}|${basis}>`}function createShowStateResult(line,state){const nonZeroTerms=state.amplitudes.map((amp,index)=>({amp,basis:formatBasisState(index,state.numQubits),magnitude:Math.hypot(amp.re,amp.im)})).filter(entry=>entry.magnitude>1e-9);const visibleTerms=state.numQubits<=3?nonZeroTerms:nonZeroTerms.slice(0,8);const value=visibleTerms.length?`|psi> = ${visibleTerms.map((entry,index)=>formatDiracTerm(entry.amp,entry.basis,index===0)).join("")}`:"|psi> = 0";return{subject:"state",line,value,omittedTerms:Math.max(0,nonZeroTerms.length-visibleTerms.length)}}function createSnapshotSharedCode(result2){return encodeSharedCode(JSON.stringify({format:"nm-golden-snapshot",version:"0.1",name:result2.name,line:result2.line,passed:result2.passed,stateHash:result2.stateHash,irHash:result2.irHash,amplitudes:result2.amplitudes,probabilities:result2.probabilities.map(entry=>({state:entry.state,probability:roundSnapshotNumber(entry.probability)})),diagnosticCodes:result2.diagnosticCodes},null,2))}function createNMSimulatorQMLApi(execute){return{executeNMParameterGroupSweep:(code,request,parseOptions={},controls={})=>executeNMParameterGroupSweep(execute,code,request,parseOptions,controls),executeNMParameterSweep:(code,options={},parseOptions={})=>executeNMParameterSweep(execute,code,options,parseOptions),evaluateNMGradient:(code,target2,parameter,parseOptions={})=>evaluateNMGradient(execute,code,target2,parameter,parseOptions),evaluateNMCost:(code,paramValues,parseOptions={})=>evaluateNMCost(execute,code,paramValues,parseOptions),getNMBlochVector:(code,paramValues,parseOptions={})=>getNMBlochVector(execute,code,paramValues,parseOptions),computeNMCostLandscape:(code,options={},parseOptions={})=>computeNMCostLandscape(execute,code,options,parseOptions),executeNMTraining:(code,options={},parseOptions={})=>executeNMTraining(execute,code,options,parseOptions),trainNMClassifier:(template,dataset,featureNames2,options={},parseOptions={})=>trainNMClassifier(execute,template,dataset,featureNames2,options,parseOptions),evaluateNMClassifierDataset:(template,dataset,featureNames2,params,options={},parseOptions={})=>evaluateNMClassifierDataset(execute,template,dataset,featureNames2,params,options,parseOptions),computeBarrenPlateauProfile:(options={})=>computeBarrenPlateauProfile(execute,options),computeBarrenPlateauProfileChecked:(options={})=>computeBarrenPlateauProfileChecked(execute,options),executeNMVQE:(ansatz,hamiltonian,options={})=>executeNMVQE(execute,ansatz,hamiltonian,options)}}function createNMComposedNoiseHistogram(numQubits,gates2,program,seed,shots){const validation=validateNMComposedNoiseProgram(program);if(!validation.valid)throw new Error(`${validation.diagnostic.code}: ${validation.diagnostic.message}`);if(!Number.isInteger(numQubits)||numQubits<1||numQubits>nmComposedNoisePolicy.maximumQubits||program.measurementIndices.length!==numQubits){throw new Error(`NM-NOISE-PROFILE-010: numQubits must match the carrier measurement width in 1..${nmComposedNoisePolicy.maximumQubits}.`)}if(!Number.isInteger(shots)||shots<1||shots>nmComposedNoisePolicy.maximumShots){throw new Error(`NM-NOISE-PROFILE-010: shots must be in 1..${nmComposedNoisePolicy.maximumShots}.`)}if(!Number.isSafeInteger(seed)||seed<0||seed>4294967295){throw new Error("NM-NOISE-PROFILE-010: seed must be an unsigned 32-bit integer.")}if(gates2.some(gate=>gate.targets.some(({resolvedIndex})=>!Number.isInteger(resolvedIndex)||resolvedIndex<0||resolvedIndex>=numQubits))){throw new Error("NM-NOISE-PROFILE-010: gate plan contains an unresolved or out-of-range target.")}if(JSON.stringify(createNMComposedNoiseGatePlan(gates2))!==JSON.stringify(program.gatePlan)){throw new Error("NM-NOISE-PROFILE-010: runtime gate plan does not match the validated carrier.")}if(program.profiles.some(candidate=>candidate.channels.some(channel=>channel.scope.resolvedIndices.some(index=>index>=numQubits)))){throw new Error("NM-NOISE-PROFILE-010: channel scope exceeds the runtime width.")}const profile=validation.program.profiles.find(({name:name2})=>name2===validation.program.activeProfile);if(!profile)throw new Error("NM-NOISE-PROFILE-010: Active composed-noise profile is missing.");if(profile.channels.some(channel=>channel.kind!=="readout"&&matchingGates(channel,gates2).length===0)){throw new Error("NM-NOISE-PROFILE-010: runtime gate plan does not match every active composed-noise channel.")}const random=createSeededRandom(seed);const counts=new Map;for(let shot=0;shot<shots;shot+=1){let state=initState(numQubits);for(const gate of gates2){state=applyGateToState(state,gate);for(const channel of profile.channels){if(channel.placement!=="after-gate"||channel.gate!==gate.gate)continue;state=applyAfterGateChannel(state,gate,channel,random)}}let basisState3=sampleBasisState(state,random);for(const channel of profile.channels){if(channel.kind==="readout"){basisState3=applyScopedReadoutNoise(basisState3,channel.scope.resolvedIndices,channel.probability,random)}}counts.set(basisState3,(counts.get(basisState3)??0)+1)}const histogram={shots,entries:Array.from(counts.entries()).map(([state,count])=>({state,count,probability:count/shots})).sort((left,right)=>left.state.localeCompare(right.state))};return{histogram,evidence:{contractVersion:NM_COMPOSED_NOISE_CONTRACT_VERSION,rfc:NM_COMPOSED_NOISE_RFC,profile:profile.name,carrierIdentityHash:program.identityHash,backend:"browser-statevector",ordering:program.ordering,seed,randomSource:"mulberry32-v1",shots,channels:profile.channels.map(channel=>channelEvidence(channel,gates2,shots)),limitation:NM_COMPOSED_NOISE_LIMITATION}}}function applyAfterGateChannel(state,gate,channel,random){const operands=new Set(gate.targets.flatMap(({resolvedIndex})=>resolvedIndex==null?[]:[resolvedIndex]));if(channel.kind==="correlated-pauli"){if(!channel.scope.resolvedIndices.every(index=>operands.has(index))||random()>=channel.probability)return state;let next2=state;for(let index=0;index<channel.pauliWord.length;index+=1){const pauli=channel.pauliWord[index];if(pauli!=="I"){next2=applySingleQubitGate(next2,GATES[pauli],channel.scope.resolvedIndices[index])}}return next2}let next=state;for(const index of channel.scope.resolvedIndices){if(operands.has(index)){next=applyTrajectoryNoise(next,channel.model,channel.probability,index,random)}}return next}function applyScopedReadoutNoise(basisState3,resolvedIndices2,probability,random){const bits=basisState3.split("");for(const qubit3 of resolvedIndices2){if(random()<probability){const position=bits.length-1-qubit3;bits[position]=bits[position]==="0"?"1":"0"}}return bits.join("")}function channelEvidence(channel,gates2,shots){if(channel.kind==="readout")return{order:channel.order,kind:channel.kind,placement:channel.placement,resolvedIndices:[...channel.scope.resolvedIndices],probability:channel.probability,matchedOperationCount:channel.scope.resolvedIndices.length,attempts:shots*channel.scope.resolvedIndices.length,line:channel.line};const matching=matchingGates(channel,gates2);const attemptsPerShot=channel.kind==="correlated-pauli"?matching.length:matching.reduce((sum,gate)=>{const operands=new Set(gate.targets.flatMap(({resolvedIndex})=>resolvedIndex==null?[]:[resolvedIndex]));return sum+channel.scope.resolvedIndices.filter(index=>operands.has(index)).length},0);return{order:channel.order,kind:channel.kind,placement:channel.placement,gate:channel.gate,resolvedIndices:[...channel.scope.resolvedIndices],probability:channel.probability,matchedOperationCount:matching.length,attempts:shots*attemptsPerShot,line:channel.line}}function matchingGates(channel,gates2){return gates2.filter(gate=>{if(gate.gate!==channel.gate)return false;const operands=new Set(gate.targets.flatMap(({resolvedIndex})=>resolvedIndex==null?[]:[resolvedIndex]));return channel.kind==="correlated-pauli"?channel.scope.resolvedIndices.every(index=>operands.has(index)):channel.scope.resolvedIndices.some(index=>operands.has(index))})}function createNMSimulationLearningMetadata(program){const learningGoals=program.goals?.map(({text,line})=>({text,line}))??[];const learningOutcomes=program.outcomes?.map(({text,line})=>({text,line}))??[];const learningRubrics=program.rubrics?.map(({text,weight,line})=>({text,...weight!=null?{weight}:{},line}))??[];const learningMisconceptions=program.misconceptions?.map(({text,line})=>({text,line}))??[];const learningQuizzes=program.quizzes?.map(({question,answer,line})=>({question,...answer!=null?{answer}:{},line}))??[];const learningLabs=program.labs?.map(({id,minutes,line})=>({id,...minutes!=null?{minutes}:{},line}))??[];const learningChallenges=program.challenges?.map(({id,difficulty,line})=>({id,...difficulty!=null?{difficulty}:{},line}))??[];const learningDatasets=program.datasets?.map(({id,split,line})=>({id,...split!=null?{split}:{},line}))??[];const learningCheckpoints=program.checkpoints?.map(({text,kind,line})=>({text,...kind!=null?{kind}:{},line}))??[];const learningHints=program.hints?.map(({text,line})=>({text,line}))??[];const learningConcepts=program.concepts?.map(({name:name2,line})=>({name:name2,line}))??[];const learningLevel=program.level?{value:program.level.value,line:program.level.line}:void 0;const learningPrerequisites=program.prerequisites?.map(({name:name2,line})=>({name:name2,line}))??[];const learningTimelineAnnotations=[...learningGoals.map(goal=>({kind:"goal",label:`goal: ${goal.text}`,line:goal.line})),...learningOutcomes.map(outcome=>({kind:"outcome",label:`outcome: ${outcome.text}`,line:outcome.line})),...learningRubrics.map(rubric=>({kind:"rubric",label:`rubric: ${rubric.text}${rubric.weight!=null?` (weight ${rubric.weight})`:""}`,line:rubric.line})),...learningMisconceptions.map(item=>({kind:"misconception",label:`misconception: ${item.text}`,line:item.line})),...learningQuizzes.map(quiz=>({kind:"quiz",label:`quiz: ${quiz.question}`,line:quiz.line})),...learningLabs.map(lab=>({kind:"lab",label:`lab: ${lab.id}${lab.minutes!=null?` (${lab.minutes} min)`:""}`,line:lab.line})),...learningChallenges.map(challenge=>({kind:"challenge",label:`challenge: ${challenge.id}${challenge.difficulty?` (${challenge.difficulty})`:""}`,line:challenge.line})),...learningDatasets.map(dataset=>({kind:"dataset",label:`dataset: ${dataset.id}${dataset.split?` (${dataset.split})`:""}`,line:dataset.line})),...learningCheckpoints.map(checkpoint=>({kind:"checkpoint",label:`checkpoint: ${checkpoint.text}${checkpoint.kind?` (${checkpoint.kind})`:""}`,line:checkpoint.line})),...learningHints.map(hint=>({kind:"hint",label:`hint: ${hint.text}`,line:hint.line})),...learningConcepts.map(concept=>({kind:"concept",label:`concept: ${concept.name}`,line:concept.line})),...learningLevel?[{kind:"level",label:`level: ${learningLevel.value}`,line:learningLevel.line}]:[],...learningPrerequisites.map(prerequisite=>({kind:"prerequisite",label:`prerequisite: ${prerequisite.name}`,line:prerequisite.line}))].sort((left,right)=>left.line-right.line||left.kind.localeCompare(right.kind));return{learningGoals,learningOutcomes,learningRubrics,learningMisconceptions,learningQuizzes,learningLabs,learningChallenges,learningDatasets,learningCheckpoints,learningHints,learningConcepts,learningLevel,learningPrerequisites,learningTimelineAnnotations}}function createNMSimulationResultRuntime({code,evaluateHiddenChallengeChecks:evaluateHiddenChallengeChecks2,learningChallenges,output,parseOptions,parsed,propertyResults,skipChallengeEvaluation}){const testBlocks=parsed.program.statements.filter(statement=>statement.kind==="test");const propertyBlocks=parsed.program.statements.filter(statement=>statement.kind==="property");const buildChallengeResults=runtimeCompleted=>{const diagnosticCodes=parsed.diagnostics.filter(diagnostic5=>diagnostic5.severity==="error").map(diagnostic5=>diagnostic5.code);return learningChallenges.map(challenge=>{const hiddenChecks=runtimeCompleted&&diagnosticCodes.length===0&&!skipChallengeEvaluation?evaluateHiddenChallengeChecks2(code,challenge.id,parseOptions):[];const combinedDiagnosticCodes=[...diagnosticCodes,...hiddenChecks.flatMap(check=>check.diagnosticCodes)];return{id:challenge.id,...challenge.difficulty!=null?{difficulty:challenge.difficulty}:{},passed:runtimeCompleted&&diagnosticCodes.length===0&&hiddenChecks.every(check=>check.passed),line:challenge.line,diagnosticCodes:combinedDiagnosticCodes,...hiddenChecks.length>0?{hiddenChecks}:{}}})};const appendChallengeResults=results=>{if(results.length===0)return;output.push("","Challenge results:");results.forEach(challenge=>{const difficulty=challenge.difficulty?` (${challenge.difficulty})`:"";const hidden=challenge.hiddenChecks?.length?` - hidden ${challenge.hiddenChecks.filter(check=>check.passed).length}/${challenge.hiddenChecks.length}`:"";const diagnostics=challenge.diagnosticCodes.length?` - diagnostics: ${challenge.diagnosticCodes.join(", ")}`:"";output.push(` ${challenge.id}${difficulty}: ${challenge.passed?"passed":"failed"}${hidden}${diagnostics}`)})};const buildTestResults=runtimeCompleted=>{const blockingCodes=parsed.diagnostics.filter(diagnostic5=>diagnostic5.severity==="error").map(diagnostic5=>diagnostic5.code);return testBlocks.map(testBlock=>{const testLines=collectStatementLines(testBlock.body,new Set([testBlock.line]));const lineDiagnosticCodes=parsed.diagnostics.filter(diagnostic5=>diagnostic5.severity==="error"&&diagnostic5.line!=null&&testLines.has(diagnostic5.line)).map(diagnostic5=>diagnostic5.code);const diagnosticCodes=lineDiagnosticCodes.length>0||runtimeCompleted?lineDiagnosticCodes:blockingCodes;return{name:testBlock.name,passed:runtimeCompleted&&diagnosticCodes.length===0,line:testBlock.line,diagnosticCodes}})};const appendTestResults=results=>{if(results.length===0)return;output.push("","Test results:");results.forEach(result2=>{const diagnostics=result2.diagnosticCodes.length?` - diagnostics: ${result2.diagnosticCodes.join(", ")}`:"";output.push(` ${result2.name}: ${result2.passed?"passed":"failed"}${diagnostics}`)})};const buildPropertyResults=runtimeCompleted=>{const blockingCodes=parsed.diagnostics.filter(diagnostic5=>diagnostic5.severity==="error").map(diagnostic5=>diagnostic5.code);const recorded=new Map(propertyResults.map(result2=>[`${result2.line}:${result2.name}`,result2]));return propertyBlocks.map(propertyBlock=>{const existing=recorded.get(`${propertyBlock.line}:${propertyBlock.name}`);if(existing)return existing;const propertyLines=propertyBlock.cases.reduce((lines,propertyCase)=>collectStatementLines(propertyCase.body,lines),new Set([propertyBlock.line]));const lineDiagnosticCodes=parsed.diagnostics.filter(diagnostic5=>diagnostic5.severity==="error"&&diagnostic5.line!=null&&propertyLines.has(diagnostic5.line)).map(diagnostic5=>diagnostic5.code);const diagnosticCodes=lineDiagnosticCodes.length>0||runtimeCompleted?lineDiagnosticCodes:blockingCodes;const passed=runtimeCompleted&&diagnosticCodes.length===0;return{name:propertyBlock.name,parameter:propertyBlock.parameter,passed,line:propertyBlock.line,cases:propertyBlock.cases.map(propertyCase=>({value:propertyCase.value,passed,diagnosticCodes})),...passed||propertyBlock.cases.length===0?{}:{failedValue:propertyBlock.cases[0].value},diagnosticCodes}})};const appendPropertyResults=results=>{if(results.length===0)return;output.push("","Property results:");results.forEach(result2=>{const diagnostics=result2.diagnosticCodes.length?` - diagnostics: ${result2.diagnosticCodes.join(", ")}`:"";const failed2=result2.failedValue!=null?` - counterexample ${result2.parameter}=${result2.failedValue.toFixed(6)}`:"";output.push(` ${result2.name}: ${result2.passed?"passed":"failed"} (${result2.cases.length} case(s))${failed2}${diagnostics}`)})};const createRuntimeSnapshotResult=(snapshot2,stateToCapture,passed,diagnosticCodes)=>{const amplitudes=createSnapshotAmplitudes(stateToCapture);const probabilities=getStateProbabilities(stateToCapture).map(entry=>({state:entry.state,probability:roundSnapshotNumber(entry.probability)}));const withoutSharedCode={name:snapshot2.name,line:snapshot2.line,passed,stateHash:hashSnapshotText(JSON.stringify(amplitudes)),irHash:hashSnapshotText(JSON.stringify(snapshot2.body)),amplitudes,probabilities,diagnosticCodes};return{...withoutSharedCode,sharedCode:createSnapshotSharedCode(withoutSharedCode)}};const appendSnapshotResults=results=>{if(results.length===0)return;output.push("","Snapshot results:");results.forEach(result2=>{const diagnostics=result2.diagnosticCodes.length?` - diagnostics: ${result2.diagnosticCodes.join(", ")}`:"";output.push(` ${result2.name}: ${result2.passed?"captured":"failed"} state=${result2.stateHash} ir=${result2.irHash}${diagnostics}`)})};return{appendChallengeResults,appendPropertyResults,appendSnapshotResults,appendTestResults,buildChallengeResults,buildPropertyResults,buildTestResults,createRuntimeSnapshotResult}}function collectStatementLines(statements,lines=new Set){for(const statement of statements){lines.add(statement.line);if(statement.kind==="if"){collectStatementLines(statement.body,lines);if(statement.elseBody)collectStatementLines(statement.elseBody,lines)}else if(statement.kind==="until"){collectStatementLines(statement.body,lines)}else if(statement.kind==="match"){statement.cases.forEach(matchCase=>collectStatementLines(matchCase.body,lines))}else if(statement.kind==="observe"||statement.kind==="test"){collectStatementLines(statement.body,lines)}else if(statement.kind==="property"){statement.cases.forEach(propertyCase=>collectStatementLines(propertyCase.body,lines))}else if(statement.kind==="snapshot"){collectStatementLines(statement.body,lines)}}return lines}var ZERO_BRANCH_PROBABILITY=1e-15;function cloneQuantumState(backend,state){return backend==="stabilizer"?cloneNMStabilizerTableau(state):cloneState(state)}function flattenStatements3(statements){const flattened=[];for(const statement of statements){flattened.push(statement);if(statement.kind==="if"){flattened.push(...flattenStatements3(statement.body));if(statement.elseBody){flattened.push(...flattenStatements3(statement.elseBody))}}else if(statement.kind==="classicalFor"||statement.kind==="until"||statement.kind==="observe"||statement.kind==="test"||statement.kind==="snapshot"){flattened.push(...flattenStatements3(statement.body))}else if(statement.kind==="match"){for(const matchCase of statement.cases){flattened.push(...flattenStatements3(matchCase.body))}}else if(statement.kind==="property"){for(const propertyCase of statement.cases){flattened.push(...flattenStatements3(propertyCase.body))}}}return flattened}function createVerificationExecutionContext(assertions){const assertionKeys=new WeakMap;assertions.forEach((assertion,index)=>{assertionKeys.set(assertion,`assertion:${index}`)});return{assertionKeys,diagnostics:[]}}function assertionKey(context,assertion){const key4=context.assertionKeys.get(assertion);if(!key4){throw new Error("Feed-forward verifier encountered an unregistered branch assertion.")}return key4}function countMeasurementOutcomes(statements){return flattenStatements3(statements).reduce((count,statement)=>{if(statement.kind==="measurement"||statement.kind==="syndrome"){return count+1}if(statement.kind==="measurement-binding"){return count+statement.width}return count},0)}function unsupportedVerificationReason(program,backend,numQubits){if(backend==="statevector"&&numQubits>5){return"statevector verification is limited to five qubits"}if(hasNMMainResult(program.statements))return NM_MAIN_RESULT_UNSUPPORTED;if(hasNMMainDynamicAccess(program.statements))return"checked dynamic array indexing or runtime qubit targets are outside the Tier 1 branch interpreter";if(findNMMainImperativeStatement(program.statements))return"main loops and mutable locals are outside the Tier 1 branch interpreter";if(flattenStatements3(program.statements).some(statement=>statement.kind==="if"&&statement.condition)){return"typed Bool conditions are outside the Tier 1 branch interpreter"}const unsupported4=flattenStatements3(program.statements).find(statement=>["encode","gradient","match","observe","optimize","property","reset","show","snapshot","test","train","until"].includes(statement.kind));return unsupported4?`${unsupported4.kind} is outside the Tier 1 branch interpreter`:void 0}function projectQubit(backend,state,qubit3,basis,outcome){if(backend==="stabilizer"){const projected=cloneNMStabilizerTableau(state);const probability=projectNMStabilizerQubit(projected,qubit3,basis,outcome);return{state:projected,probability}}const measurement=measureQubitInBasis(state,qubit3,basis,()=>outcome===0?0:1);if((measurement.state==="1"?1:0)!==outcome){return{state:cloneState(state),probability:0}}return{state:measurement.collapsed,probability:measurement.probability}}function projectSyndrome(backend,state,statement,outcome){if(backend==="stabilizer"){const projected=cloneNMStabilizerTableau(state);const probability=projectNMStabilizerPauliString(projected,statement.factors,outcome);return{state:projected,probability}}const factors=statement.factors.map(factor=>({qubit:factor.target.resolvedIndex??factor.target.index??-1,pauli:factor.observable}));const measurement=measurePauliString(state,factors,()=>outcome===0?0:1);if(measurement.bit!==outcome){return{state:cloneState(state),probability:0}}return{state:measurement.collapsed,probability:measurement.probability}}function splitBranch(branch,project,bind){const next=[];for(const outcome of[0,1]){const projected=project(outcome);if(projected.probability<=ZERO_BRANCH_PROBABILITY){continue}const child={state:projected.state,probability:branch.probability*projected.probability,values:Object.fromEntries(Object.entries(branch.values).map(([name2,bits])=>[name2,[...bits]])),classicalBits:{...branch.classicalBits},outcomes:[...branch.outcomes,outcome],assertionSnapshots:{...branch.assertionSnapshots}};bind(child,outcome);next.push(child)}return next}function executeStatement(backend,branch,statement,context){if(statement.kind==="gate"){if(backend==="stabilizer"){const next=cloneNMStabilizerTableau(branch.state);const result2=applyNMStabilizerGate(next,statement);if(!result2.applied){if(!context.diagnostics.some(diagnostic5=>diagnostic5.code===nmFeedForwardDiagnosticCodes.verificationBackendMismatch&&diagnostic5.line===statement.line)){context.diagnostics.push(createDiagnostic({code:nmFeedForwardDiagnosticCodes.verificationBackendMismatch,severity:"error",message:`Stabilizer branch verification cannot apply ${statement.gate}: ${result2.reason}`,hint:"Keep stabilizer eligibility and tableau gate support aligned, or verify this program with the statevector backend.",line:result2.line??statement.line}))}return[]}return[{...branch,state:next}]}return[{...branch,state:applyGateToState(branch.state,statement)}]}if(statement.kind==="measurement"){const qubit3=statement.target.resolvedIndex??statement.target.index??-1;return splitBranch(branch,outcome=>projectQubit(backend,branch.state,qubit3,statement.basis??"Z",outcome),(child,outcome)=>{if(statement.binding){child.values[statement.binding]=[outcome];child.classicalBits[statement.binding]=outcome}})}if(statement.kind==="measurement-binding"){let branches=[{...branch,values:{...branch.values,[statement.name]:[]}}];for(const qubit3 of statement.operand.resolvedIndices??[]){branches=branches.flatMap(current=>splitBranch(current,outcome=>projectQubit(backend,current.state,qubit3,"Z",outcome),(child,outcome)=>{child.values[statement.name]=[...current.values[statement.name]??[],outcome]}))}return branches}if(statement.kind==="syndrome"){return splitBranch(branch,outcome=>projectSyndrome(backend,branch.state,statement,outcome),(child,outcome)=>{child.values[statement.binding]=[outcome];child.classicalBits[statement.binding]=outcome})}if(statement.kind==="bitAssign"){const value=evaluateBitExpression(statement.expression,branch.classicalBits);return[{...branch,values:{...branch.values,[statement.name]:[value===1?1:0]},classicalBits:{...branch.classicalBits,[statement.name]:value}}]}if(statement.kind==="if"){if(statement.condition)throw new Error("Typed Bool conditions are unsupported by the feed-forward verifier.");const taken=statement.predicate?evaluateNMClassicalPredicate(statement.predicate,branch.values):statement.operator==="=="?branch.classicalBits[statement.binding]===statement.value:branch.classicalBits[statement.binding]!==statement.value;return executeStatements(backend,[branch],taken?statement.body:statement.elseBody??[],context)}if(statement.kind==="assertBranchInvariant"){return[{...branch,assertionSnapshots:{...branch.assertionSnapshots,[assertionKey(context,statement)]:cloneQuantumState(backend,branch.state)}}]}return[branch]}function executeStatements(backend,initial,statements,context){let branches=initial;for(const statement of statements){branches=branches.flatMap(branch=>executeStatement(backend,branch,statement,context))}return branches}function getNMReducedDensityMatrix(state,qubitIndices){const selected=[...new Set(qubitIndices)];const dimension=2**selected.length;const matrix=Array.from({length:dimension},()=>Array.from({length:dimension},()=>({re:0,im:0})));const selectedSet=new Set(selected);const environment=Array.from({length:state.numQubits},(_,qubit3)=>qubit3).filter(qubit3=>!selectedSet.has(qubit3));const environmentDimension=2**environment.length;const storage=getNMDenseStatevectorStorage(state);const fullIndex=(selectedBits,environmentBits)=>{let index=0;selected.forEach((qubit3,offset)=>{if((selectedBits>>offset&1)===1){index|=1<<qubit3}});environment.forEach((qubit3,offset)=>{if((environmentBits>>offset&1)===1){index|=1<<qubit3}});return index};for(let row=0;row<dimension;row+=1){for(let column=0;column<dimension;column+=1){let re=0;let im=0;for(let environmentBits=0;environmentBits<environmentDimension;environmentBits+=1){const leftIndex=fullIndex(row,environmentBits);const rightIndex=fullIndex(column,environmentBits);const leftRe=storage.real[leftIndex];const leftIm=storage.imaginary[leftIndex];const rightRe=storage.real[rightIndex];const rightIm=storage.imaginary[rightIndex];re+=leftRe*rightRe+leftIm*rightIm;im+=leftIm*rightRe-leftRe*rightIm}matrix[row][column]={re,im}}}return matrix}function getNMDensityMatrixDistance(left,right){let maximum=0;for(let row=0;row<left.length;row+=1){for(let column=0;column<left[row].length;column+=1){const re=left[row][column].re-right[row][column].re;const im=left[row][column].im-right[row][column].im;maximum=Math.max(maximum,Math.hypot(re,im))}}return maximum}function assertionLabel(assertion){return`${assertion.target.register}${assertion.target.index!=null?`[${assertion.target.index}]`:""}`}function validateNMFeedForwardProbabilityConservation(probabilities){const probabilitySum=probabilities.reduce((sum,probability)=>sum+probability,0);if(Number.isFinite(probabilitySum)&&Math.abs(probabilitySum-1)<=NM_FEEDFORWARD_VERIFICATION_TOLERANCE){return[]}return[createDiagnostic({code:nmFeedForwardDiagnosticCodes.probabilityConservation,severity:"error",message:`Reachable branch probabilities sum to ${probabilitySum}, not 1 within tolerance ${NM_FEEDFORWARD_VERIFICATION_TOLERANCE}.`,hint:"Check measurement projection, zero-probability pruning, and branch probability multiplication."})]}function verifyNMFeedForwardBranches(program,numQubits){const conditioningMeasurements=countMeasurementOutcomes(program.statements);const assertions=flattenStatements3(program.statements).filter(statement=>statement.kind==="assertBranchInvariant");if(assertions.length===0){return{evidence:{tier:2,label:"sampled"},diagnostics:[]}}if(program.noise){return{evidence:{tier:2,label:"sampled",conditioningMeasurements,reason:"noise"},diagnostics:[]}}if(conditioningMeasurements>NM_FEEDFORWARD_MAX_EXHAUSTIVE_MEASUREMENTS){return{evidence:{tier:2,label:"sampled",conditioningMeasurements,reason:"budget"},diagnostics:[createDiagnostic({code:nmFeedForwardDiagnosticCodes.exhaustiveBudgetExceeded,severity:"warning",message:`Tier 1 branch verification requires at most ${NM_FEEDFORWARD_MAX_EXHAUSTIVE_MEASUREMENTS} enumerated measurement outcome bits; this program has ${conditioningMeasurements}.`,hint:"The program may still run with a recorded seed, but its result is Tier 2 sampled rather than branch-exhaustive verified."})]}}const selection=selectNMSimulationBackend(program,numQubits);const backend=selection.backend==="stabilizer"?"stabilizer":"statevector";const unsupported4=unsupportedVerificationReason(program,backend,numQubits);if(unsupported4){return{evidence:{tier:2,label:"sampled",conditioningMeasurements,reason:"unsupported"},diagnostics:[]}}const initialState=backend==="stabilizer"?createNMStabilizerTableau(numQubits):initState(numQubits);const context=createVerificationExecutionContext(assertions);const branches=executeStatements(backend,[{state:initialState,probability:1,values:{},classicalBits:{},outcomes:[],assertionSnapshots:{}}],program.statements,context);if(context.diagnostics.length>0){return{evidence:{tier:2,label:"sampled",conditioningMeasurements,reason:"unsupported"},diagnostics:context.diagnostics}}const diagnostics=[];const probabilitySum=branches.reduce((sum,branch)=>sum+branch.probability,0);diagnostics.push(...validateNMFeedForwardProbabilityConservation(branches.map(branch=>branch.probability)));const invariantLabels=[];for(const assertion of assertions){const target2=assertion.target.resolvedIndices??[];const key4=assertionKey(context,assertion);const reachedBranches=branches.filter(branch=>branch.assertionSnapshots[key4]!=null);const baseline=reachedBranches[0];const baselineState=baseline?.assertionSnapshots[key4];if(!baseline||!baselineState||target2.length===0){continue}const label3=assertionLabel(assertion);let maximumDifference=0;let mismatchingBranch;if(backend==="stabilizer"){const signature=getNMStabilizerReducedSignature(baselineState,target2);for(const branch of reachedBranches.slice(1)){const candidate=getNMStabilizerReducedSignature(branch.assertionSnapshots[key4],target2);if(signature.length!==candidate.length||signature.some((entry,index)=>entry!==candidate[index])){maximumDifference=1;mismatchingBranch=branch;break}}}else{const density=getNMReducedDensityMatrix(baselineState,target2);for(const branch of reachedBranches.slice(1)){const difference=getNMDensityMatrixDistance(density,getNMReducedDensityMatrix(branch.assertionSnapshots[key4],target2));if(difference>maximumDifference){maximumDifference=difference;mismatchingBranch=branch}}}if(maximumDifference>NM_FEEDFORWARD_VERIFICATION_TOLERANCE){diagnostics.push(createDiagnostic({code:nmFeedForwardDiagnosticCodes.invariantMismatch,severity:"error",message:`Branch invariant ${label3} differs between outcome paths ${baseline.outcomes.join("")||"empty"} and ${mismatchingBranch?.outcomes.join("")||"empty"} by ${maximumDifference}.`,hint:"Restore the declared target on every reachable measurement outcome path or remove the invariant assertion.",line:assertion.line}))}else{invariantLabels.push(label3)}}return{evidence:{tier:1,label:"verified",backend,conditioningMeasurements,reachablePaths:branches.length,probabilitySum,tolerance:NM_FEEDFORWARD_VERIFICATION_TOLERANCE,invariants:invariantLabels},diagnostics}}var NM_LEARNING_PACKAGE_FORMAT="nm-learning-package";var NM_LEARNING_PACKAGE_VERSION="0.1";var NM_STATE_TIMELINE_MAX_SNAPSHOT_AMPLITUDES=1024;function getJsonType(value){if(Array.isArray(value)){return"array"}if(value===null){return"null"}if(Number.isInteger(value)){return"integer"}return typeof value}function formatJsonPath(parent,segment){return parent==="$"?`$.${segment}`:`${parent}.${segment}`}function isJsonObject(value){return Boolean(value)&&typeof value==="object"&&!Array.isArray(value)}function validateJsonValueAgainstSchema(value,schema,path,issues){if("const"in schema&&value!==schema.const){issues.push({path,keyword:"const",message:`Expected ${JSON.stringify(schema.const)}.`})}if(Array.isArray(schema.enum)&&!schema.enum.includes(value)){issues.push({path,keyword:"enum",message:`Expected one of ${schema.enum.map(item=>JSON.stringify(item)).join(", ")}.`})}if(typeof schema.type==="string"){const actualType=getJsonType(value);const typeMatches=schema.type==="number"?actualType==="number"||actualType==="integer":actualType===schema.type;if(!typeMatches){issues.push({path,keyword:"type",message:`Expected ${schema.type}, received ${actualType}.`});return}}if(schema.type==="string"&&typeof value==="string"&&typeof schema.minLength==="number"){if(value.length<schema.minLength){issues.push({path,keyword:"minLength",message:`Expected at least ${schema.minLength} characters.`})}}if(schema.type==="string"&&typeof value==="string"&&typeof schema.maxLength==="number"&&value.length>schema.maxLength)issues.push({path,keyword:"maxLength",message:`Expected at most ${schema.maxLength} characters.`});if(schema.type==="string"&&typeof value==="string"&&typeof schema.pattern==="string"&&!new RegExp(schema.pattern,"u").test(value))issues.push({path,keyword:"pattern",message:`Value does not match ${schema.pattern}.`});if((schema.type==="number"||schema.type==="integer")&&typeof value==="number"){if(typeof schema.minimum==="number"&&value<schema.minimum){issues.push({path,keyword:"minimum",message:`Expected value >= ${schema.minimum}.`})}if(typeof schema.maximum==="number"&&value>schema.maximum){issues.push({path,keyword:"maximum",message:`Expected value <= ${schema.maximum}.`})}if(typeof schema.exclusiveMinimum==="number"&&value<=schema.exclusiveMinimum)issues.push({path,keyword:"exclusiveMinimum",message:`Expected value > ${schema.exclusiveMinimum}.`});if(typeof schema.exclusiveMaximum==="number"&&value>=schema.exclusiveMaximum)issues.push({path,keyword:"exclusiveMaximum",message:`Expected value < ${schema.exclusiveMaximum}.`})}if(schema.type==="object"&&isJsonObject(value)){const required=Array.isArray(schema.required)?schema.required.filter(field=>typeof field==="string"):[];for(const field of required){if(!(field in value)){issues.push({path:formatJsonPath(path,field),keyword:"required",message:`Missing required field "${field}".`})}}const properties=isJsonObject(schema.properties)?schema.properties:{};for(const[field,propertySchema]of Object.entries(properties)){if(field in value&&isJsonObject(propertySchema)){validateJsonValueAgainstSchema(value[field],propertySchema,formatJsonPath(path,field),issues)}}if(schema.additionalProperties===false){const knownFields=new Set(Object.keys(properties));for(const field of Object.keys(value)){if(!knownFields.has(field)){issues.push({path:formatJsonPath(path,field),keyword:"additionalProperties",message:`Unexpected field "${field}".`})}}}}if(schema.type==="array"&&Array.isArray(value)&&isJsonObject(schema.items)){if(typeof schema.minItems==="number"&&value.length<schema.minItems)issues.push({path,keyword:"minItems",message:`Expected at least ${schema.minItems} items.`});if(typeof schema.maxItems==="number"&&value.length>schema.maxItems)issues.push({path,keyword:"maxItems",message:`Expected at most ${schema.maxItems} items.`});if(schema.uniqueItems===true&&new Set(value.map(item=>JSON.stringify(item))).size!==value.length)issues.push({path,keyword:"uniqueItems",message:"Expected unique items."});value.forEach((item,index)=>{validateJsonValueAgainstSchema(item,schema.items,`${path}[${index}]`,issues)})}}function validateJsonAgainstSchema(value,schema){const issues=[];validateJsonValueAgainstSchema(value,schema,"$",issues);return{valid:issues.length===0,issues}}var NM_LEARNING_PACKAGE_SCHEMA_PATH="/schemas/nm-learning-package-0.1.schema.json";var NM_LEARNING_PACKAGE_SCHEMA_ID=`https://quantumsoftware.tech${NM_LEARNING_PACKAGE_SCHEMA_PATH}`;var NM_LEARNING_PACKAGE_MAX_METADATA_ITEMS=100;function createNMLearningPackageIntegrity(value){return{algorithm:"fnv1a-64",digest:hash(canonicalJson2(value))}}function canonicalJson2(value){if(Array.isArray(value))return`[${value.map(canonicalJson2).join(",")}]`;if(value&&typeof value==="object")return`{${Object.entries(value).filter(([,child])=>child!==void 0).sort(([left],[right])=>left.localeCompare(right)).map(([key4,child])=>`${JSON.stringify(key4)}:${canonicalJson2(child)}`).join(",")}}`;return JSON.stringify(value)}function hash(value){let high=3421674724;let low=2216829733;for(const byte of new TextEncoder().encode(value)){low=(low^byte)>>>0;const lowProduct=low*435;const carry=Math.floor(lowProduct/4294967296);high=high*435+carry+(low<<8>>>0)>>>0;low=lowProduct>>>0}return`${high.toString(16).padStart(8,"0")}${low.toString(16).padStart(8,"0")}`}function createNMLearningPackageJsonSchema(){const lineAnnotatedText={type:"object",additionalProperties:false,required:["text","line"],properties:{text:{type:"string"},line:{type:"integer",minimum:1}}};return{$schema:"https://json-schema.org/draft/2020-12/schema",$id:NM_LEARNING_PACKAGE_SCHEMA_ID,title:"N/M Learning Package",description:"Portable learning, diagnostics, resources, readiness, and source metadata for an N/M program.",type:"object",additionalProperties:false,required:["format","$schema","version","source","success","diagnostics","goals","outcomes","rubrics","misconceptions","quizzes","labs","datasets","checkpoints","hints","concepts","prerequisites","explanations","readiness","integrity"],properties:{$schema:{const:NM_LEARNING_PACKAGE_SCHEMA_ID},format:{const:NM_LEARNING_PACKAGE_FORMAT},version:{const:NM_LEARNING_PACKAGE_VERSION},moduleName:{type:"string"},source:{type:"object",additionalProperties:false,required:["language","code","lineCount"],properties:{language:{const:"N/M"},code:{type:"string",minLength:1},lineCount:{type:"integer",minimum:1}}},success:{type:"boolean"},diagnostics:{type:"array",maxItems:NM_LEARNING_PACKAGE_MAX_METADATA_ITEMS,items:{type:"object",additionalProperties:false,required:["code","severity","message"],properties:{code:{type:"string"},severity:{enum:["error","warning","info"]},message:{type:"string"},line:{type:"integer",minimum:1},column:{type:"integer",minimum:1},hint:{type:"string"},translationKey:{type:"string"},translationValues:{type:"object",additionalProperties:true},hintTranslationKey:{type:"string"},hintTranslationValues:{type:"object",additionalProperties:true}}}},goals:{type:"array",maxItems:NM_LEARNING_PACKAGE_MAX_METADATA_ITEMS,items:lineAnnotatedText},outcomes:{type:"array",maxItems:NM_LEARNING_PACKAGE_MAX_METADATA_ITEMS,items:lineAnnotatedText},rubrics:{type:"array",maxItems:NM_LEARNING_PACKAGE_MAX_METADATA_ITEMS,items:{type:"object",additionalProperties:false,required:["text","line"],properties:{text:{type:"string"},weight:{type:"number"},line:{type:"integer",minimum:1}}}},misconceptions:{type:"array",maxItems:NM_LEARNING_PACKAGE_MAX_METADATA_ITEMS,items:lineAnnotatedText},quizzes:{type:"array",maxItems:NM_LEARNING_PACKAGE_MAX_METADATA_ITEMS,items:{type:"object",additionalProperties:false,required:["question","line"],properties:{question:{type:"string"},answer:{type:"string"},line:{type:"integer",minimum:1}}}},labs:{type:"array",maxItems:NM_LEARNING_PACKAGE_MAX_METADATA_ITEMS,items:{type:"object",additionalProperties:false,required:["id","line"],properties:{id:{type:"string"},minutes:{type:"number",minimum:0},line:{type:"integer",minimum:1}}}},datasets:{type:"array",maxItems:NM_LEARNING_PACKAGE_MAX_METADATA_ITEMS,items:{type:"object",additionalProperties:false,required:["id","line"],properties:{id:{type:"string"},split:{enum:["train","validation","test","synthetic"]},line:{type:"integer",minimum:1}}}},checkpoints:{type:"array",maxItems:NM_LEARNING_PACKAGE_MAX_METADATA_ITEMS,items:{type:"object",additionalProperties:false,required:["text","line"],properties:{text:{type:"string"},kind:{enum:["predict","inspect","explain","debug"]},line:{type:"integer",minimum:1}}}},hints:{type:"array",maxItems:NM_LEARNING_PACKAGE_MAX_METADATA_ITEMS,items:lineAnnotatedText},concepts:{type:"array",maxItems:NM_LEARNING_PACKAGE_MAX_METADATA_ITEMS,items:{type:"object",additionalProperties:false,required:["name","line"],properties:{name:{type:"string"},line:{type:"integer",minimum:1}}}},level:{type:"object",additionalProperties:false,required:["value","line"],properties:{value:{enum:["beginner","intermediate","advanced"]},line:{type:"integer",minimum:1}}},prerequisites:{type:"array",maxItems:NM_LEARNING_PACKAGE_MAX_METADATA_ITEMS,items:{type:"object",additionalProperties:false,required:["name","line"],properties:{name:{type:"string"},line:{type:"integer",minimum:1}}}},explanations:{type:"array",maxItems:NM_LEARNING_PACKAGE_MAX_METADATA_ITEMS,items:lineAnnotatedText},resources:{type:"object",additionalProperties:false,properties:{qubits:{type:"integer",minimum:0},statements:{type:"integer",minimum:0},depth:{type:"integer",minimum:0},gates:{type:"integer",minimum:0},singleQubitGates:{type:"integer",minimum:0},twoQubitGates:{type:"integer",minimum:0},threeQubitGates:{type:"integer",minimum:0},measurements:{type:"integer",minimum:0},resets:{type:"integer",minimum:0},barriers:{type:"integer",minimum:0},assertions:{type:"integer",minimum:0},expectations:{type:"integer",minimum:0},metrics:{type:"integer",minimum:0},gradients:{type:"integer",minimum:0},encodings:{type:"integer",minimum:0},observations:{type:"integer",minimum:0},tests:{type:"integer",minimum:0},properties:{type:"integer",minimum:0},snapshots:{type:"integer",minimum:0},conditionals:{type:"integer",minimum:0},shows:{type:"integer",minimum:0},expectationTerms:{type:"integer",minimum:0},ftqcEnabled:{type:"boolean"},logicalGates:{type:"integer",minimum:0},logicalQubits:{type:"integer",minimum:0},cliffordCount:{type:"integer",minimum:0},tCount:{type:"integer",minimum:0},tDepth:{type:"integer",minimum:0},codeDistance:{type:"integer",minimum:0},surfaceCodeOverhead:{type:"integer",minimum:0},physicalQubits:{type:"integer",minimum:0},magicStates:{type:"integer",minimum:0},estimatedRuntimeMs:{type:"number",minimum:0},targetError:{type:"number",exclusiveMinimum:0,exclusiveMaximum:1}}},readiness:{type:"object",additionalProperties:false,required:["tier","score","present","total","checks","missing","nextActions","suggestions"],properties:{tier:{enum:["blocked","starter","draft","lab-ready","complete"]},score:{type:"integer",minimum:0,maximum:100},present:{type:"integer",minimum:0},total:{type:"integer",minimum:0},checks:{type:"array",items:{type:"object",additionalProperties:false,required:["key","present"],properties:{key:{enum:["runnable","goal","outcome","rubric","misconception","quiz","lab","dataset","checkpoint","hint","concept","level","prerequisite","explanation"]},present:{type:"boolean"}}}},missing:{type:"array",items:{type:"string"}},nextActions:{type:"array",items:{type:"string"}},suggestions:{type:"array",items:{type:"object",additionalProperties:false,required:["key","title","snippet"],properties:{key:{type:"string"},title:{type:"string"},snippet:{type:"string"}}}}}},integrity:{type:"object",additionalProperties:false,required:["algorithm","digest"],properties:{algorithm:{const:"fnv1a-64"},digest:{type:"string",pattern:"^[0-9a-f]{16}$"}}}}}}function createNMLearningPackage(code,result2,parseOptions={}){const parsed=parseNMCode(code,parseOptions);const learningPackage={$schema:NM_LEARNING_PACKAGE_SCHEMA_ID,format:NM_LEARNING_PACKAGE_FORMAT,version:NM_LEARNING_PACKAGE_VERSION,...parsed.program.moduleName?{moduleName:parsed.program.moduleName}:{},source:{language:"N/M",code,lineCount:code.split(/\r?\n/).length},success:result2.success,diagnostics:result2.diagnostics??parsed.diagnostics,goals:result2.learningGoals??[],outcomes:result2.learningOutcomes??[],rubrics:result2.learningRubrics??[],misconceptions:result2.learningMisconceptions??[],quizzes:result2.learningQuizzes??[],labs:result2.learningLabs??[],datasets:result2.learningDatasets??[],checkpoints:result2.learningCheckpoints??[],hints:result2.learningHints??[],concepts:result2.learningConcepts??[],...result2.learningLevel?{level:result2.learningLevel}:{},prerequisites:result2.learningPrerequisites??[],explanations:result2.explanations??[],...result2.resources?{resources:result2.resources}:{}};const withReadiness={...learningPackage,readiness:createNMLearningPackageReadiness(learningPackage)};return{...withReadiness,integrity:createNMLearningPackageIntegrity(withReadiness)}}function createNMLearningPackageReadiness(learningPackage){const checks=[{key:"runnable",present:learningPackage.success&&!learningPackage.diagnostics.some(item=>item.severity==="error")},{key:"goal",present:learningPackage.goals.length>0},{key:"outcome",present:learningPackage.outcomes.length>0},{key:"rubric",present:learningPackage.rubrics.length>0},{key:"misconception",present:learningPackage.misconceptions.length>0},{key:"quiz",present:learningPackage.quizzes.length>0},{key:"lab",present:learningPackage.labs.length>0},{key:"dataset",present:learningPackage.datasets.length>0},{key:"checkpoint",present:learningPackage.checkpoints.length>0},{key:"hint",present:learningPackage.hints.length>0},{key:"concept",present:learningPackage.concepts.length>0},{key:"level",present:learningPackage.level!=null},{key:"prerequisite",present:learningPackage.prerequisites.length>0},{key:"explanation",present:learningPackage.explanations.length>0}];const present=checks.filter(check=>check.present).length;const score=Math.round(present/checks.length*100);const missing=checks.filter(check=>!check.present).map(check=>check.key);const nextActionPriority=["runnable","goal","outcome","checkpoint","lab","dataset","quiz","rubric","misconception","hint","concept","level","prerequisite","explanation"];const nextActions=nextActionPriority.filter(key4=>missing.includes(key4)).slice(0,3);return{tier:getNMLearningPackageReadinessTier(score,missing),score,present,total:checks.length,checks,missing,nextActions,suggestions:nextActions.map(createNMLearningPackageReadinessSuggestion)}}function createNMLearningPackageReadinessSuggestion(key4){const suggestions={runnable:{key:key4,title:"Make the program runnable",snippet:"module learning_demo;\n\nfn main() {\n let q: QReg<1> = qreg[1];\n H(q[0]);\n return 0;\n}"},goal:{key:key4,title:"Add a learning goal",snippet:'@goal("Describe the lab objective.");'},outcome:{key:key4,title:"Add a measurable outcome",snippet:'@outcome("Explain what the learner should be able to predict or verify.");'},rubric:{key:key4,title:"Add a rubric item",snippet:'@rubric("Evaluate the explanation or prediction quality.", weight: 0.5);'},misconception:{key:key4,title:"Add a misconception note",snippet:'@misconception("Name the likely incorrect mental model.");'},quiz:{key:key4,title:"Add a quiz prompt",snippet:'@quiz("Ask a short self-check question.", answer: "Expected answer.");'},lab:{key:key4,title:"Bind a lab id",snippet:'@lab("lab-id", minutes: 10);'},dataset:{key:key4,title:"Tag a dataset split",snippet:'@dataset("dataset-id", split: "train");'},checkpoint:{key:key4,title:"Add a guided checkpoint",snippet:'@checkpoint("Predict the result before running.", kind: "predict");'},hint:{key:key4,title:"Add a learner hint",snippet:'@hint("Give a small nudge without revealing the full answer.");'},concept:{key:key4,title:"Tag a concept",snippet:'@concept("superposition");'},level:{key:key4,title:"Set a learning level",snippet:'@level("beginner");'},prerequisite:{key:key4,title:"Add a prerequisite",snippet:'@prereq("basic-gates");'},explanation:{key:key4,title:"Add an explanation note",snippet:'@explain("Explain what the next operation is doing.");'}};return suggestions[key4]}function getNMLearningPackageReadinessTier(score,missing){if(missing.includes("runnable")){return"blocked"}if(score===100){return"complete"}if(score>=80){return"lab-ready"}if(score>=50){return"draft"}return"starter"}function serializeNMLearningPackage(code,result2,parseOptions={}){return JSON.stringify(createNMLearningPackage(code,result2,parseOptions),null,2)}function validateNMLearningPackageJson(value){return validateJsonAgainstSchema(value,createNMLearningPackageJsonSchema())}function validateNMLearningPackageJsonText(json){try{return validateNMLearningPackageJson(JSON.parse(json))}catch{return{valid:false,issues:[{path:"$",keyword:"parse",message:"Could not parse this learning package JSON."}]}}}var NM_MODEL_PACKAGE_FORMAT="nm-model";var NM_MODEL_PACKAGE_VERSION="0.1";var NM_MODEL_PACKAGE_SCHEMA_PATH="/schemas/nm-model-package-0.1.schema.json";var NM_MODEL_PACKAGE_SCHEMA_ID=`https://quantumsoftware.tech${NM_MODEL_PACKAGE_SCHEMA_PATH}`;var NM_MODEL_PACKAGE_MAX_SOURCE_BYTES=2e5;var NM_MODEL_PACKAGE_MAX_NAME_CHARACTERS=128;var NM_MODEL_PACKAGE_MAX_PARAMETERS=8;var NM_MODEL_PACKAGE_MAX_HISTORY=101;var NM_MODEL_PACKAGE_MAX_STEPS=100;var NM_MODEL_PACKAGE_MAX_QUBITS=14;var nmModelPackageDiagnosticCodes={json:"NM-MODEL-001",format:"NM-MODEL-002",version:"NM-MODEL-003",unknown:"NM-MODEL-004",limit:"NM-MODEL-005",source:"NM-MODEL-006",training:"NM-MODEL-007",environment:"NM-MODEL-008",integrity:"NM-MODEL-009",migration:"NM-MODEL-010",compatibility:"NM-MODEL-011"};var rootKeys=new Set(["formatVersion","kind","name","createdAt","languageVersion","source","trainedParams","training","environment","integrity"]);var trainingKeys=new Set(["optimizer","steps","learningRate","objective","loss","datasetId","costHistory","finalCost","accuracy","seed"]);var environmentKeys=new Set(["engine","qubits","noise"]);var noiseKeys=new Set(["model","probability"]);var integrityKeys=new Set(["algorithm","sourceHash","packageHash"]);var optimizers=new Set(["gd","momentum","adam","spsa","qng"]);var losses=new Set(["mse","hinge","cross_entropy"]);var identifierPattern3=/^[A-Za-z_]\w{0,127}$/u;var boundedIdPattern=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/u;var slugPattern=/^[a-z0-9]+(?:-[a-z0-9]+)*$/u;var digestPattern=/^[0-9a-f]{16}$/u;function createNMModelPackageFromTrainingEvidence(source,training,name2,options={}){if(typeof source!=="string"||utf8Length(source)>NM_MODEL_PACKAGE_MAX_SOURCE_BYTES)return failure6(nmModelPackageDiagnosticCodes.limit,`Model source must not exceed ${NM_MODEL_PACKAGE_MAX_SOURCE_BYTES} UTF-8 bytes.`);if(needsNMQMLSourceContext(source))return failure6(nmModelPackageDiagnosticCodes.compatibility,"Source-only model packages cannot preserve helper training permissions or workspace dependencies; helper model packages are unsupported.");if(typeof name2!=="string"||name2.length>NM_MODEL_PACKAGE_MAX_NAME_CHARACTERS||!slugPattern.test(name2))return failure6(nmModelPackageDiagnosticCodes.format,"Model name must be a bounded lowercase slug.");const parsed=parseNMCode(source);const createdAt=options.createdAt??new Date().toISOString();if(!isIsoDate(createdAt))return failure6(nmModelPackageDiagnosticCodes.format,"Model createdAt must be a canonical ISO date-time.");if(parsed.diagnostics.some(diagnostic5=>diagnostic5.severity==="error"))return failure6(nmModelPackageDiagnosticCodes.source,"Model source has parser diagnostics.");if(!training||training.costHistory.length===0)return failure6(nmModelPackageDiagnosticCodes.training,"Training evidence has no completed cost history.");const paramNames=Object.keys(parsed.params).sort();if(paramNames.length<1||paramNames.length>NM_MODEL_PACKAGE_MAX_PARAMETERS||JSON.stringify(paramNames)!==JSON.stringify(Object.keys(training.finalParams).sort())){return failure6(nmModelPackageDiagnosticCodes.training,"Trained parameter keys do not match the bounded source params.")}const base2={formatVersion:NM_MODEL_PACKAGE_VERSION,kind:NM_MODEL_PACKAGE_FORMAT,name:name2,createdAt,languageVersion:nmVersionManifest.languageVersion,source,trainedParams:{...training.finalParams},training:{optimizer:training.optimizer,steps:training.steps,learningRate:training.learningRate,objective:training.objective,...training.loss?{loss:training.loss}:{},...training.datasetId?{datasetId:training.datasetId}:{},costHistory:[...training.costHistory],finalCost:training.costHistory.at(-1),...training.accuracy==null?{}:{accuracy:training.accuracy},...(training.seed??parsed.program.seed)==null?{}:{seed:training.seed??parsed.program.seed}},environment:{engine:"statevector",qubits:parsed.numQubits,...parsed.program.noise?{noise:{model:parsed.program.noise.model,probability:parsed.program.noise.probability}}:{}}};const pkg={...base2,integrity:createIntegrity(base2)};const validation=validateNMModelPackageJson(pkg);return validation.valid?pkg:failure6(validation.issues[0]?.code??nmModelPackageDiagnosticCodes.integrity,validation.issues[0]?.message??"Invalid model package.")}function serializeNMModelPackage(pkg){const validation=validateNMModelPackageJson(pkg);if(!validation.valid)throw new Error(`${validation.issues[0]?.code}: ${validation.issues[0]?.message}`);return`${JSON.stringify(pkg,null,2)}
|
|
1486
|
+
@dataset(${JSON.stringify(datasetId)}, split: ${JSON.stringify(split)});`}])}function createNMClassifierPointTemplates(template,rowCount,datasetId,split="train"){if(!Number.isInteger(rowCount)||rowCount<0||rowCount>80)throw new NMClassifierTemplateError("Classifier templates require at most 80 rows.");const source=prepareNMClassifierDatasetSource(template,datasetId,split),tokens=read4(source),calls=[];for(let i=0;i<tokens.length;i++){if(tokens[i].text!=="sample_row"||tokens[i+1]?.text!=="("||tokens[i-1]?.text==="."||tokens[i-1]?.text==="fn")continue;const end=tokens[i+2]?.text===")"?i+2:tokens[i+2]?.kind==="number"&&/^\d+$/u.test(tokens[i+2].text)&&tokens[i+3]?.text===")"?i+3:-1;if(end<0)throw new NMClassifierTemplateError("sample_row requires an empty or integer index.");calls.push(end===i+2?{start:tokens[i+1].range.end.offset,end:tokens[i+1].range.end.offset}:{start:tokens[i+2].range.start.offset,end:tokens[i+2].range.end.offset})}return Array.from({length:rowCount},(_,index)=>applySourcePatches(source,calls.map(call=>({...call,text:String(index)}))))}function bindNMClassifierFeatures(source,features){const tokens=read4(source),patches=[];const scopes=new Map,moduleFeatures=new Set;let depth3=0,pendingFunction,functionName;for(let i=0;i<tokens.length;i++){if(!depth3&&tokens[i].text==="fn")pendingFunction=tokens[i+1]?.text;if(tokens[i].text==="{"){depth3++;if(depth3===1){functionName=pendingFunction;pendingFunction=void 0}}if(tokens[i].text==="}"){depth3--;if(!depth3)functionName=void 0}if(tokens[i].text!=="const"||tokens[i+1]?.kind!=="identifier")continue;const name2=tokens[i+1].text;if(!Object.prototype.hasOwnProperty.call(features,name2))continue;if(!depth3){scopes.set(i,"module");moduleFeatures.add(name2)}else if(depth3===1&&functionName==="main")scopes.set(i,"main")}for(let i=0;i<tokens.length;i++){if(!scopes.has(i))continue;const name2=tokens[i+1].text;if(scopes.get(i)==="main"&&moduleFeatures.has(name2))continue;let equal2=i+2;while(equal2<tokens.length&&!["=",";","{","}","const","param","fn","@"].includes(tokens[equal2].text))equal2++;if(tokens[equal2]?.text!=="=")throw new NMClassifierTemplateError("Feature constant initializer is missing.");let end=equal2+1;while(end<tokens.length&&![";","{","}","const","param","fn","@","use","module"].includes(tokens[end].text))end++;if(end===equal2+1||!Number.isFinite(features[name2]))throw new NMClassifierTemplateError("Feature constant initializer is invalid.");const formatted=replaceNMParameterValue("const feature = 0;","feature",features[name2]).slice("const feature = ".length,-1);for(let value=equal2+1;value<end;value++){patches.push({start:tokens[value].range.start.offset,end:tokens[value].range.end.offset,text:value===equal2+1?formatted:tokens[value].text.replace(/[^\r\n]/gu," ")})}i=end-1}return applySourcePatches(source,patches)}function createNMClassifierOptimizerState(parameterNames){const zeros=()=>Object.fromEntries(parameterNames.map(name2=>[name2,0]));return{velocity:zeros(),adamM:zeros(),adamV:zeros()}}function applyNMClassifierOptimizerStep(values2,gradients,optimizer,learningRate,step,state){for(const name2 of Object.keys(values2)){const gradient=gradients[name2];if(optimizer==="momentum"){state.velocity[name2]=.9*state.velocity[name2]-learningRate*gradient;values2[name2]+=state.velocity[name2]}else if(optimizer==="adam"){state.adamM[name2]=.9*state.adamM[name2]+.1*gradient;state.adamV[name2]=.999*state.adamV[name2]+.001*gradient*gradient;const t=step+1;values2[name2]-=learningRate*(state.adamM[name2]/(1-.9**t))/(Math.sqrt(state.adamV[name2]/(1-.999**t))+1e-8)}else values2[name2]-=learningRate*gradient}}var NM_SPSA_MAX_PARAMETERS=8;var NM_SPSA_MAX_STEPS=100;var nmSpsaDiagnosticCodes={input:"NM-QML-SPSA-001",option:"NM-QML-SPSA-002",random:"NM-QML-SPSA-003",evaluation:"NM-QML-SPSA-004",invariant:"NM-QML-SPSA-005"};function failure4(code,error){return{code,error}}function positiveFinite(value){return Number.isFinite(value)&&value>0}function executeNMSPSAStep(values2,step,totalSteps,random,evaluate,descentSign,options={}){const names=Object.keys(values2);if(names.length===0||names.length>NM_SPSA_MAX_PARAMETERS||Object.values(values2).some(value=>!Number.isFinite(value))){return failure4(nmSpsaDiagnosticCodes.input,`SPSA requires 1-${NM_SPSA_MAX_PARAMETERS} finite parameter values.`)}if(!Number.isInteger(totalSteps)||totalSteps<1||totalSteps>NM_SPSA_MAX_STEPS||!Number.isInteger(step)||step<0||step>=totalSteps){return failure4(nmSpsaDiagnosticCodes.input,`SPSA step must be within a 1-${NM_SPSA_MAX_STEPS} step workload.`)}if(descentSign!==-1&&descentSign!==1){return failure4(nmSpsaDiagnosticCodes.input,"SPSA descentSign must be exactly -1 or 1.")}const a=options.a??.2;const c2=options.c??.1;const alpha=options.alpha??.602;const gamma=options.gamma??.101;const stability=options.stability??.1*totalSteps;if(!positiveFinite(a)||!positiveFinite(c2)||!positiveFinite(alpha)||alpha>1||!positiveFinite(gamma)||gamma>1||!Number.isFinite(stability)||stability<0){return failure4(nmSpsaDiagnosticCodes.option,"SPSA requires finite a/c > 0, alpha/gamma in (0, 1], and stability >= 0.")}const gain=a/(step+1+stability)**alpha;const perturbation=c2/(step+1)**gamma;if(!positiveFinite(gain)||!positiveFinite(perturbation)){return failure4(nmSpsaDiagnosticCodes.invariant,"SPSA gain schedule produced a non-finite value.")}const delta={};for(const name2 of names){let sample;try{sample=random()}catch{return failure4(nmSpsaDiagnosticCodes.random,"SPSA random source threw an exception.")}if(!Number.isFinite(sample)||sample<0||sample>=1){return failure4(nmSpsaDiagnosticCodes.random,"SPSA random source must return a finite value in [0, 1).")}delta[name2]=sample<.5?-1:1}const plus=Object.fromEntries(names.map(name2=>[name2,values2[name2]+perturbation*delta[name2]]));const minus=Object.fromEntries(names.map(name2=>[name2,values2[name2]-perturbation*delta[name2]]));let plusCost;let minusCost;try{plusCost=evaluate(plus);minusCost=evaluate(minus)}catch{return failure4(nmSpsaDiagnosticCodes.evaluation,"SPSA cost evaluation threw an exception.")}if(plusCost==null||minusCost==null||!Number.isFinite(plusCost)||!Number.isFinite(minusCost)){return failure4(nmSpsaDiagnosticCodes.evaluation,"SPSA cost evaluation must return two finite values.")}const scale=(plusCost-minusCost)/(2*perturbation);const nextValues=Object.fromEntries(names.map(name2=>[name2,values2[name2]-descentSign*gain*scale/delta[name2]]));const midpointCost=.5*(plusCost+minusCost);if(!Number.isFinite(scale)||!Number.isFinite(midpointCost)||Object.values(nextValues).some(value=>!Number.isFinite(value))){return failure4(nmSpsaDiagnosticCodes.invariant,"SPSA update produced a non-finite value.")}return{values:nextValues,midpointCost}}var NM_QNG_OPTIMIZER_CONTRACT_VERSION="0.1";var NM_QNG_MAX_PARAMETERS=8;var NM_QNG_DEFAULT_SHIFT=.01;var NM_QNG_MIN_SHIFT=1e-6;var NM_QNG_MAX_SHIFT=.5;var NM_QNG_DEFAULT_REGULARIZATION=.001;var NM_QNG_MAX_REGULARIZATION=1;var nmQngDiagnosticCodes={input:"NM-QNG-001",evaluation:"NM-QNG-002",invariant:"NM-QNG-003",singular:"NM-QNG-004"};function computeNMQNGDiagonal(execute,code,values2,shiftOrOptions={}){const options=typeof shiftOrOptions==="number"?{shift:shiftOrOptions}:shiftOrOptions;const shift=options.shift??NM_QNG_DEFAULT_SHIFT;const regularization=options.regularization??NM_QNG_DEFAULT_REGULARIZATION;const singularPolicy=options.singularPolicy??"regularize";const names=Object.keys(values2).sort();if(!Number.isFinite(shift)||shift<NM_QNG_MIN_SHIFT||shift>NM_QNG_MAX_SHIFT){return failure5(nmQngDiagnosticCodes.input,`QNG metric shift must be finite and in [${NM_QNG_MIN_SHIFT}, ${NM_QNG_MAX_SHIFT}].`)}if(!Number.isFinite(regularization)||regularization<=0||regularization>NM_QNG_MAX_REGULARIZATION){return failure5(nmQngDiagnosticCodes.input,`QNG regularization must be finite and in (0, ${NM_QNG_MAX_REGULARIZATION}].`)}if(singularPolicy!=="regularize"&&singularPolicy!=="reject"){return failure5(nmQngDiagnosticCodes.input,"QNG singularPolicy must be regularize or reject.")}if(names.length===0||names.length>NM_QNG_MAX_PARAMETERS){return failure5(nmQngDiagnosticCodes.input,`QNG requires 1 through ${NM_QNG_MAX_PARAMETERS} trainable parameters.`)}if(names.some(name2=>!/^[A-Za-z_]\w{0,127}$/.test(name2)||!Number.isFinite(values2[name2]))){return failure5(nmQngDiagnosticCodes.input,"QNG parameter names and values must be bounded and finite.")}const base2=execute(applyNMParameterValues(code,values2));if(!base2.success||!base2.finalState)return failure5(nmQngDiagnosticCodes.evaluation,"QNG base-state evaluation failed.");const diagonal={};for(const name2 of names){const shifted=execute(applyNMParameterValues(code,{...values2,[name2]:values2[name2]+shift}));if(!shifted.success||!shifted.finalState)return failure5(nmQngDiagnosticCodes.evaluation,`QNG fidelity evaluation failed for ${name2}.`);const fidelity=stateInnerProductFidelity(base2.finalState,shifted.finalState);const value=Math.max(0,(1-fidelity)/shift**2);if(!Number.isFinite(fidelity)||!Number.isFinite(value)){return failure5(nmQngDiagnosticCodes.invariant,`QNG metric produced a non-finite value for ${name2}.`)}diagonal[name2]=value}const singularParameters=names.filter(name2=>diagonal[name2]<regularization);if(singularPolicy==="reject"&&singularParameters.length>0){return failure5(nmQngDiagnosticCodes.singular,`QNG metric is singular for: ${singularParameters.join(", ")}.`)}const regularizedDiagonal=Object.fromEntries(names.map(name2=>[name2,Math.max(diagonal[name2],regularization)]));const regularizedValues=Object.values(regularizedDiagonal);const conditionNumber=Math.max(...regularizedValues)/Math.min(...regularizedValues);if(!Number.isFinite(conditionNumber)||conditionNumber<1){return failure5(nmQngDiagnosticCodes.invariant,"QNG regularized condition number is invalid.")}return{diagonal,regularizedDiagonal,singularParameters,conditionNumber,shift,regularization,singularPolicy,circuitEvaluations:names.length+1}}function failure5(code,error){return{code,error}}var supportedGates=new Set(["Rx","Ry","Rz","RXX","RYY","RZZ"]);function parameterShiftError(statements,parameter){const parameters=typeof parameter==="string"?[parameter]:parameter;const aliases=new Map(parameters.map(name2=>{const vector=name2.match(/^([A-Za-z_]\w*)_(\d+)$/);return[name2,new Set([name2,...vector?[`${vector[1]}[${vector[2]}]`]:[]])]}));const tokens=expression=>[...(expression??"").matchAll(/[A-Za-z_]\w*(?:\s*\[\s*\d+\s*\])?/g)].map(([token])=>token.replace(/\s+/g,""));const referenced=expression=>{const refs=tokens(expression);return parameters.filter(name2=>refs.some(token=>aliases.get(name2).has(token)))};const occurrences=new Map;const errors=new Map;const visit=(items,repeated=false)=>{for(const statement of items){if(statement.kind==="const"){const expression=statement.sourceExpression;for(const name2 of expression?referenced(expression):parameters){errors.set(name2,`Parameter-shift requires parameter-independent constant declarations; cannot differentiate ${statement.name} for ${name2}.`)}}if(statement.kind==="gate"){if(statement.classicalAngles){for(const name2 of parameters)errors.set(name2,"Function gate angles require the chain rule; the direct parameter-shift rule is not applicable.")}const names=new Set([referenced(statement.thetaName),...(statement.angleNames??[]).map(referenced)].flat());for(const name2 of names){occurrences.set(name2,(occurrences.get(name2)??0)+1);if(!supportedGates.has(statement.gate)){errors.set(name2,`Parameter-shift gradients support Rx, Ry, Rz, RXX, RYY, and RZZ parameters only. Unsupported gate(s) for ${name2}: ${statement.gate}.`)}else if(repeated||!aliases.get(name2).has((statement.thetaName??"").replace(/\s+/g,""))){errors.set(name2,`Parameter-shift requires one direct rotation reference for ${name2}; angle expressions and repeated execution require a different gradient rule.`)}}}if(statement.kind==="expectation"){for(const term of statement.terms){for(const name2 of referenced(term.coefficientExpression)){errors.set(name2,`Parameter-shift requires parameter-independent observable coefficients for ${name2}.`)}}}if(statement.kind==="if"){visit(statement.body,repeated);if(statement.elseBody)visit(statement.elseBody,repeated)}else if(statement.kind==="until"){visit(statement.body,true)}else if(statement.kind==="match"){statement.cases.forEach(branch=>visit(branch.body,repeated))}else if(statement.kind==="observe"||statement.kind==="test"||statement.kind==="snapshot"){visit(statement.body,repeated)}else if(statement.kind==="property"){statement.cases.forEach(item=>visit(item.body,true))}}};visit(statements);for(const name2 of parameters){if(errors.has(name2))return errors.get(name2);if((occurrences.get(name2)??0)>1)return`Parameter-shift requires one direct rotation reference for ${name2}; shared parameters require per-gate contributions or a supported adjoint gradient.`}return void 0}var NM_PARAMETER_SWEEP_VERSION="0.1.0-experimental";var nmParameterSweepLimits=Object.freeze({axes:64,values:256,evaluations:256,sourceBytes:131072,probabilityRows:256});var nmParameterSweepMessages={input:["Invalid parameter sweep request.","Parametre taramas\u0131 iste\u011Fi ge\xE7ersiz."],budget:["Parameter sweep exceeds its source, axis, value or evaluation limit.","Parametre taramas\u0131 kaynak, eksen, de\u011Fer veya deneme s\u0131n\u0131r\u0131n\u0131 a\u015F\u0131yor."],binding:["Sweep axes must select each resolved group member exactly once.","Tarama eksenleri \xE7\xF6z\xFCmlenmi\u015F her grup \xFCyesini tam bir kez se\xE7melidir."],source:["Parameter sweep source could not be compiled or preserved.","Parametre taramas\u0131 kayna\u011F\u0131 derlenemedi veya korunamad\u0131."],execution:["Parameter sweep execution failed.","Parametre taramas\u0131 \xE7al\u0131\u015Ft\u0131r\u0131lamad\u0131."],callback:["Parameter sweep progress or cancellation callback failed.","Parametre taramas\u0131 ilerleme veya iptal geri \xE7a\u011Fr\u0131s\u0131 ba\u015Far\u0131s\u0131z oldu."],nested:["Parameter sweep exhausted its shared evaluation or adjoint work budget.","Parametre taramas\u0131 ortak de\u011Ferlendirme veya adjoint i\u015Flem b\xFCt\xE7esini t\xFCketti."]};var nmParameterSweepDiagnosticCodes={input:"NM-SWP-001",budget:"NM-SWP-002",binding:"NM-SWP-003",source:"NM-SWP-004",execution:"NM-SWP-005",callback:"NM-SWP-006",nested:"NM-SWP-007"};function parameterSweepError(issue11,detail){return{code:nmParameterSweepDiagnosticCodes[issue11],message:nmParameterSweepMessages[issue11][0],translationKey:`parameterSweep.${issue11}`,...detail?{detail}:{}}}var NMParameterSweepInputError=class extends Error{constructor(issue11,message){super(message??nmParameterSweepMessages[issue11][0]);this.issue=issue11}};function sweepDataFields(input){if(!input||typeof input!=="object"||Array.isArray(input)||![Object.prototype,null].includes(Object.getPrototypeOf(input)))throw new NMParameterSweepInputError("input");const entries=Reflect.ownKeys(input).map(key4=>{const descriptor=Object.getOwnPropertyDescriptor(input,key4);if(typeof key4!=="string"||!descriptor.enumerable||!("value"in descriptor))throw new NMParameterSweepInputError("input");return[key4,descriptor.value]});return Object.fromEntries(entries)}function array2(input,max){if(!Array.isArray(input))throw new NMParameterSweepInputError("input");if(!input.length||input.length>max)throw new NMParameterSweepInputError("budget");if(Reflect.ownKeys(input).length!==input.length+1)throw new NMParameterSweepInputError("input");return Array.from({length:input.length},(_,index)=>{const descriptor=Object.getOwnPropertyDescriptor(input,String(index));if(!descriptor||!("value"in descriptor))throw new NMParameterSweepInputError("input");return descriptor.value})}function keys2(input,allowed){if(Object.keys(input).some(key4=>!allowed.includes(key4)))throw new NMParameterSweepInputError("input")}function readNMParameterGroupSweepRequest(input){const raw=sweepDataFields(input);keys2(raw,["groupName","combination","axes","failurePolicy"]);if(typeof raw.groupName!=="string"||!raw.groupName.length||raw.groupName.length>256||!["zip","cartesian"].includes(raw.combination)||raw.failurePolicy!==void 0&&!["stop","collect"].includes(raw.failurePolicy))throw new NMParameterSweepInputError("input");const axes=array2(raw.axes,nmParameterSweepLimits.axes).map(value=>{const axis=sweepDataFields(value);keys2(axis,["parameterName","values"]);if(typeof axis.parameterName!=="string"||!axis.parameterName.length||axis.parameterName.length>256)throw new NMParameterSweepInputError("input");const values2=array2(axis.values,nmParameterSweepLimits.values);if(!values2.every(value2=>typeof value2==="number"&&Number.isFinite(value2)))throw new NMParameterSweepInputError("input");return{parameterName:axis.parameterName,values:values2}});const request={groupName:raw.groupName,combination:raw.combination,axes,failurePolicy:raw.failurePolicy};countNMParameterSweepEvaluations(request);return request}function countNMParameterSweepEvaluations(request){let count=request.combination==="zip"?request.axes[0].values.length:1;for(const axis of request.axes){if(request.combination==="zip"&&axis.values.length!==count)throw new NMParameterSweepInputError("input","Zip axes must have equal lengths.");if(request.combination==="cartesian"){if(count>Math.floor(nmParameterSweepLimits.evaluations/axis.values.length))throw new NMParameterSweepInputError("budget");count*=axis.values.length}}if(count>nmParameterSweepLimits.evaluations)throw new NMParameterSweepInputError("budget");return count}var flags={computeApply:true,parameterGroups:true,moduleVisibility:true,exactImports:true,propertyAssertions:true,qmlTrainingControls:true,typedClassicalValues:true,targetCapabilityConstraints:true,functionResults:true,classicalFunctions:true,genericOracles:true,feedForward:true,typedCollection:true,comptimeConst:true,genericCircuits:true,qecExperiments:true,composedNoise:true};function snapshotNMParameterSweepOptions(source,input){const raw=sweepDataFields(input);keys2(raw,["experimental","workspaceModules","debugClassicalFunctions","expectationShots"]);if(raw.expectationShots!==void 0&&(typeof raw.expectationShots!=="number"||!Number.isInteger(raw.expectationShots)||raw.expectationShots<1))throw new NMParameterSweepInputError("input");if(raw.debugClassicalFunctions!==void 0&&typeof raw.debugClassicalFunctions!=="boolean")throw new NMParameterSweepInputError("input");const experimental=raw.experimental===void 0?void 0:sweepDataFields(raw.experimental);if(experimental&&Object.entries(experimental).some(([key4,value])=>!Object.prototype.hasOwnProperty.call(flags,key4)||value!==void 0&&typeof value!=="boolean"))throw new NMParameterSweepInputError("input");const workspaceModules=raw.workspaceModules===void 0?void 0:sweepDataFields(raw.workspaceModules);let bytes2=new TextEncoder().encode(source).length;if(workspaceModules){if(Object.keys(workspaceModules).length>64)throw new NMParameterSweepInputError("budget");for(const[name2,text]of Object.entries(workspaceModules)){if(!/^[A-Za-z_]\w{0,127}$/u.test(name2)||typeof text!=="string")throw new NMParameterSweepInputError("input");if(text.length>nmParameterSweepLimits.sourceBytes)throw new NMParameterSweepInputError("budget");bytes2+=new TextEncoder().encode(text).length}}if(bytes2>nmParameterSweepLimits.sourceBytes)throw new NMParameterSweepInputError("budget");return{...experimental?{experimental:Object.fromEntries(Object.entries(experimental).filter(([,value])=>value!==void 0))}:{},...raw.expectationShots!==void 0?{expectationShots:raw.expectationShots}:{},...workspaceModules?{workspaceModules}:{},...raw.debugClassicalFunctions!==void 0?{debugClassicalFunctions:raw.debugClassicalFunctions}:{}}}var boundary=new Set([";","}","{","param","parametre","const","let","fn","use","kullan","module","@","return","paramgroup"]);var continuation=new Set(["+","-","*","/","%","^","(",","]);function readNMParameterSweepSlots(source,members){const cst=parseNMSourceCST(source);if(cst.issues.length)throw new NMParameterSweepInputError("source");const tokens=cst.tokens.filter(token=>!token.trivia);const positions=new Map(tokens.map((token,index)=>[token.range.start.offset,index]));return members.map(member=>{const at=positions.get(member.declarationRange.start.offset);if(at===void 0||!(member.declarationKind==="const"?["const"]:["param","parametre"]).includes(tokens[at].text)||tokens[at+1]?.text!==member.name)throw new NMParameterSweepInputError("binding");let equal2=at+2;while(equal2<tokens.length&&!["=",";","{","}"].includes(tokens[equal2].text))equal2++;if(tokens[equal2]?.text!=="=")throw new NMParameterSweepInputError("source");const first=equal2+1;if(member.index!==void 0){if(tokens[first]?.text!=="[")throw new NMParameterSweepInputError("source");const entries=[];let current=[],depth4=0,closed=false;for(let i=first+1;i<tokens.length;i++){const token=tokens[i];if(depth4===0&&(token.text===","||token.text==="]")){if(!current.length)throw new NMParameterSweepInputError("source");entries.push(current);current=[];if(token.text==="]"){closed=true;break}continue}if(["(","["].includes(token.text))depth4++;if([")","]"].includes(token.text))depth4--;if(depth4<0||[";","{","}"].includes(token.text))throw new NMParameterSweepInputError("source");current.push(token)}if(!closed||!entries[member.index]?.length)throw new NMParameterSweepInputError("binding");return{parameterName:member.parameterName,tokens:entries[member.index]}}const value=[];let depth3=0;for(let i=first;i<tokens.length;i++){const token=tokens[i],previous=tokens[i-1];if(depth3===0&&(boundary.has(token.text)||i>first&&token.range.start.line>previous.range.end.line&&!continuation.has(previous.text)&&!continuation.has(token.text)))break;if(["(","["].includes(token.text))depth3++;if([")","]"].includes(token.text))depth3--;if(depth3<0)throw new NMParameterSweepInputError("source");value.push(token)}if(!value.length||depth3!==0)throw new NMParameterSweepInputError("source");return{parameterName:member.parameterName,tokens:value}})}function readNMLegacySweepMember(source,name2,kind,line){const tokens=parseNMSourceCST(source).tokens.filter(token=>!token.trivia),matches=[];let depth3=0,functionName,pending;for(let i=0;i<tokens.length;i++){const token=tokens[i],next=tokens[i+1];if(!depth3&&token.text==="fn")pending=next?.text;if(token.text==="{"){depth3++;if(depth3===1){functionName=pending;pending=void 0}}if(token.text==="}"){depth3--;if(!depth3)functionName=void 0}if(depth3!==0&&!(depth3===1&&functionName==="main"))continue;if(!(kind==="param"?["param","parametre"]:["const"]).includes(token.text)||next?.kind!=="identifier")continue;const vector=tokens[i+2]?.text===":"&&tokens[i+3]?.text==="Angle"&&tokens[i+4]?.text==="[";let index;if(vector&&name2.startsWith(`${next.text}_`)){const suffix=name2.slice(next.text.length+1);if(/^\d+$/u.test(suffix))index=Number(suffix)}if(next.text!==name2&&index===void 0)continue;if(token.range.start.line+1!==line)continue;matches.push({name:next.text,parameterName:name2,declarationKind:kind,...index!==void 0?{index}:{},declarationRange:{start:token.range.start,end:next.range.end},referenceRange:next.range})}if(matches.length!==1)throw new NMParameterSweepInputError("binding");return matches[0]}function bindNMParameterSweepPoint(source,slots,assignment){return applySourcePatches(source,slots.flatMap(slot=>{if(!Object.prototype.hasOwnProperty.call(assignment,slot.parameterName))throw new NMParameterSweepInputError("binding");const value=formatNMSourceNumber(assignment[slot.parameterName]);return slot.tokens.map((token,index)=>({start:token.range.start.offset,end:token.range.end.offset,text:index===0?value:blankSource(token.text)}))}))}var plans2=new WeakMap;function prepareNMParameterGroupSweep(source,input,options={}){try{if(typeof source!=="string")throw new NMParameterSweepInputError("input");if(source.length>nmParameterSweepLimits.sourceBytes)throw new NMParameterSweepInputError("budget");const request=readNMParameterGroupSweepRequest(input),parseOptions=snapshotNMParameterSweepOptions(source,options);const parsed=parseNMCode(source,parseOptions),error=diagnosticsToError(parsed.diagnostics);if(error)throw new NMParameterSweepInputError("source",error);const group=parsed.program.parameterGroups?.declarations.find(group2=>group2.name===request.groupName);if(!group)throw new NMParameterSweepInputError("binding");return createPlan(source,parsed,parseOptions,group.members,request,group.name)}catch(error){return failed(error)}}function failed(error){return{success:false,error:error instanceof NMParameterSweepInputError?parameterSweepError(error.issue,error.message):parameterSweepError("source",error instanceof Error?error.message:void 0)}}function prepareNMLegacyParameterSweep(source,input={},options={}){let parameterName="";try{if(typeof source!=="string")throw new NMParameterSweepInputError("input");if(source.length>nmParameterSweepLimits.sourceBytes)throw new NMParameterSweepInputError("budget");const raw=sweepDataFields(input);if(Object.keys(raw).some(key4=>!["parameterName","values"].includes(key4))||raw.parameterName!==void 0&&(typeof raw.parameterName!=="string"||!raw.parameterName.length))throw new NMParameterSweepInputError("input");const parseOptions=snapshotNMParameterSweepOptions(source,options),parsed=parseNMCode(source,parseOptions);const named=typeof raw.parameterName==="string"?raw.parameterName:void 0;const candidate=parsed.program.statements.find(statement=>named?(statement.kind==="const"||statement.kind==="param")&&statement.name===named:statement.kind==="const"&&(statement.valueType==="Angle"||statement.valueType==="Float"));if(!candidate&&!named)return void 0;parameterName=named??(candidate&&"name"in candidate?String(candidate.name):"");const error=diagnosticsToError(parsed.diagnostics);if(error)throw new NMParameterSweepInputError("source",error);if(!candidate||candidate.kind!=="const"&&candidate.kind!=="param")throw new NMParameterSweepInputError("binding");if(parsed.program.statements.filter(statement=>(statement.kind==="const"||statement.kind==="param")&&statement.name===parameterName).length!==1)throw new NMParameterSweepInputError("binding");const request=readNMParameterGroupSweepRequest({groupName:"legacy",combination:"zip",failurePolicy:"collect",axes:[{parameterName,values:raw.values===void 0?Array.from({length:9},(_,index)=>Math.PI*index/8):raw.values}]});if(candidate.kind==="const"&&candidate.valueType==="Int"&&request.axes[0].values.some(value=>!Number.isSafeInteger(value)))throw new NMParameterSweepInputError("input");const member=readNMLegacySweepMember(source,parameterName,candidate.kind,candidate.line);return{...createPlan(source,parsed,parseOptions,[member],request),parameterName,...candidate.kind==="const"?{parameterType:candidate.valueType}:{}}}catch(error){return{...failed(error),parameterName}}}function createPlan(source,parsed,parseOptions,members,request,groupName){const axisMap=new Map(request.axes.map(axis=>[axis.parameterName,axis]));if(axisMap.size!==request.axes.length||axisMap.size!==members.length)throw new NMParameterSweepInputError("binding");const axes=members.map(member=>{const axis=axisMap.get(member.parameterName);if(!axis)throw new NMParameterSweepInputError("binding");return axis});const count=countNMParameterSweepEvaluations(request);const slots=readNMParameterSweepSlots(source,members),points=[];const workspaceBytes=Object.values(parseOptions.workspaceModules??{}).reduce((bytes2,text)=>bytes2+new TextEncoder().encode(text).length,0);for(let index=0;index<count;index++){let remaining=index;const indices=Array.from({length:axes.length},()=>index);if(request.combination==="cartesian")for(let axis=axes.length-1;axis>=0;axis--){indices[axis]=remaining%axes[axis].values.length;remaining=Math.floor(remaining/axes[axis].values.length)}const assignments=Object.fromEntries(axes.map((axis,at)=>[axis.parameterName,axis.values[indices[at]]]));const candidate=bindNMParameterSweepPoint(source,slots,assignments);if(candidate.length>nmParameterSweepLimits.sourceBytes||new TextEncoder().encode(candidate).length+workspaceBytes>nmParameterSweepLimits.sourceBytes)throw new NMParameterSweepInputError("budget");points.push({source:candidate,assignments})}const context={source,parseOptions,seed:parsed.program.seed??null,...groupName?{groupName}:{},combination:request.combination,failurePolicy:request.failurePolicy??"stop",axes:[...axes]};const plan=Object.freeze({});plans2.set(plan,{context,points});return{success:true,plan,requestedEvaluations:count,context:structuredClone(context)}}function readNMParameterSweepPoint(plan,index){const state=plans2.get(plan);if(!state||!Number.isSafeInteger(index)||index<0||index>=state.points.length)return void 0;return structuredClone({...state.points[index],parseOptions:state.context.parseOptions,legacy:state.context.groupName===void 0})}function readNMParameterSweepPlan(plan){const state=plans2.get(plan);return state?{context:structuredClone(state.context),requestedEvaluations:state.points.length}:void 0}var NM_STATE_PROBABILITY_RELATIVE_FLOOR=.0032;function getStateProbabilities(state){const threshold=NM_STATE_PROBABILITY_RELATIVE_FLOOR/2**state.numQubits;return state.amplitudes.map((amplitude,index)=>({state:index.toString(2).padStart(state.numQubits,"0"),probability:Math.sqrt(amplitude.re*amplitude.re+amplitude.im*amplitude.im)**2})).filter(entry=>entry.probability>threshold)}var NM_STATE_PROBABILITY_DISPLAY_LIMIT=256;function boundStateRowsForDisplay(entries,rank,limit=NM_STATE_PROBABILITY_DISPLAY_LIMIT){if(entries.length<=limit)return{entries:[...entries],omitted:0};const ranked=entries.map(entry=>({state:entry.state,rank:rank(entry)}));ranked.sort((left,right)=>right.rank-left.rank||(left.state<right.state?-1:left.state>right.state?1:0));const kept=new Set(ranked.slice(0,limit).map(entry=>entry.state));return{entries:entries.filter(entry=>kept.has(entry.state)),omitted:entries.length-limit}}function boundStateTimelineForResult(timeline){return timeline.map(step=>{const probabilities=boundStateRowsForDisplay(step.probabilities,entry=>entry.probability);const deltas=boundStateRowsForDisplay(step.probabilityDeltas,entry=>Math.abs(entry.delta));if(probabilities.omitted===0&&deltas.omitted===0)return step;return{...step,probabilities:probabilities.entries,...probabilities.omitted>0?{omittedProbabilities:probabilities.omitted}:{},probabilityDeltas:deltas.entries,...deltas.omitted>0?{omittedProbabilityDeltas:deltas.omitted}:{}}})}var errorText=error=>error instanceof Error?error.message:void 0;var empty7=()=>({contractVersion:NM_PARAMETER_SWEEP_VERSION,success:false,status:"rejected",requestedEvaluations:0,pointEvaluations:0,circuitEvaluations:0,work:createNMSweepWorkBudget().snapshot(),points:[]});function runPoint(execute,plan,index,budget){const input=readNMParameterSweepPoint(plan,index);const point={index,assignments:input.assignments,parameters:{},status:"execution-error",executed:false,probabilityEvidence:{kind:"unavailable"}};try{const parsed=parseNMCode(input.source,input.parseOptions),error=diagnosticsToError(parsed.diagnostics);if(error){point.error=parameterSweepError("source",error);return point}point.parameters={...parsed.params};if(input.legacy)for(const statement of parsed.program.statements){if(statement.kind==="const"&&Object.prototype.hasOwnProperty.call(input.assignments,statement.name))point.parameters[statement.name]=statement.value}if(Object.entries(input.assignments).some(([name2,value])=>!Object.prototype.hasOwnProperty.call(point.parameters,name2)||point.parameters[name2]!==value)){point.error=parameterSweepError("binding");return point}point.executed=true;const result2=withNMSweepWorkBudget(budget,()=>execute(input.source,input.parseOptions));if(!result2||typeof result2.success!=="boolean")throw new Error("Executor returned an invalid result.");if(result2.execution)point.execution=structuredClone(result2.execution);if(result2.programResult)point.programResult=structuredClone(result2.programResult);if(!result2.success){point.error=parameterSweepError("execution",result2.error);return point}if(result2.cost!==void 0){if(!Number.isFinite(result2.cost))throw new Error("Nonfinite sweep cost.");point.cost=result2.cost}for(const key4 of["metrics","expectations","gradients"])if(result2[key4]){if(Object.values(result2[key4]).some(value=>!Number.isFinite(value)))throw new Error("Nonfinite sweep metric.");point[key4]={...result2[key4]}}if(result2.training)point.training=structuredClone(result2.training);if(result2.optimization)point.optimization=structuredClone(result2.optimization);const rows=result2.preMeasurementProbabilities?.length?result2.preMeasurementProbabilities:result2.finalState?getStateProbabilities(result2.finalState):void 0;if(rows){if(rows.some(row=>typeof row.state!=="string"||!Number.isFinite(row.probability)||row.probability<0||row.probability>1+1e-10))throw new Error("Invalid probability evidence.");const bounded=boundStateRowsForDisplay(rows,row=>row.probability,nmParameterSweepLimits.probabilityRows);point.probabilityEvidence={kind:"dense",rows:structuredClone(bounded.entries),omitted:bounded.omitted}}point.status=result2.programResult?.status==="error"?"program-error":"ok";return point}catch(error){return{...point,status:"execution-error",cost:void 0,metrics:void 0,expectations:void 0,gradients:void 0,probabilityEvidence:{kind:"unavailable"},error:parameterSweepError("execution",errorText(error))}}}function executeNMParameterSweepPlan(execute,plan,controls={}){const prepared2=readNMParameterSweepPlan(plan);if(!prepared2)return{...empty7(),error:parameterSweepError("input","Unknown or expired sweep plan.")};const result2={...empty7(),...prepared2,status:"completed"};const budget=createNMSweepWorkBudget();let shouldCancel,onPoint;try{shouldCancel=controls.shouldCancel;onPoint=controls.onPoint;if(shouldCancel!==void 0&&typeof shouldCancel!=="function"||onPoint!==void 0&&typeof onPoint!=="function")throw new Error("Invalid sweep callback.")}catch(error){return{...result2,status:"failed",error:parameterSweepError("callback",errorText(error))}}for(let index=0;index<prepared2.requestedEvaluations;index++){try{const cancelled=shouldCancel?.();if(shouldCancel&&typeof cancelled!=="boolean")throw new Error("Cancellation callback must return a boolean.");if(cancelled){result2.status="cancelled";break}}catch(error){result2.status="failed";result2.error=parameterSweepError("callback",errorText(error));break}const before=budget.snapshot(),point=runPoint(execute,plan,index,budget),after=budget.snapshot();point.work={programEvaluations:after.programEvaluations-before.programEvaluations,adjointEvaluations:after.adjointEvaluations-before.adjointEvaluations,secondaryEvaluations:after.secondaryEvaluations-before.secondaryEvaluations,adjointApplications:after.adjointApplications-before.adjointApplications,...after.exhausted?{exhausted:after.exhausted}:{}};result2.work=after;result2.circuitEvaluations=sweepCircuitEvaluations(after);result2.points.push(point);if(point.executed)result2.pointEvaluations++;if(after.exhausted){point.status="execution-error";point.error=parameterSweepError("nested",after.exhausted);point.cost=void 0;point.metrics=void 0;point.expectations=void 0;point.gradients=void 0;point.training=void 0;point.optimization=void 0;point.probabilityEvidence={kind:"unavailable"};result2.status="failed";result2.error=point.error}try{onPoint?.(structuredClone(point),prepared2.requestedEvaluations)}catch(error){result2.status="failed";result2.error=parameterSweepError("callback",errorText(error));break}if(after.exhausted)break;if(point.status!=="ok"&&prepared2.context.failurePolicy==="stop"&&index+1<prepared2.requestedEvaluations){result2.status="stopped";break}}result2.success=result2.status==="completed"&&result2.points.every(point=>point.status==="ok");return result2}function executeNMParameterGroupSweep(execute,source,request,options={},controls={}){const prepared2=prepareNMParameterGroupSweep(source,request,options);return prepared2.success?executeNMParameterSweepPlan(execute,prepared2.plan,controls):{...empty7(),error:prepared2.error}}function executeNMParameterSweep(execute,source,options={},parseOptions={}){const prepared2=prepareNMLegacyParameterSweep(source,options,parseOptions);if(!prepared2)return void 0;if(!prepared2.success)return{parameterName:prepared2.parameterName,points:[],status:"rejected",circuitEvaluations:0,error:`${prepared2.error.code}: ${prepared2.error.detail??prepared2.error.message}`};const result2=executeNMParameterSweepPlan(execute,prepared2.plan);return{parameterName:prepared2.parameterName,parameterType:prepared2.parameterType,status:result2.status,circuitEvaluations:result2.circuitEvaluations,pointEvaluations:result2.pointEvaluations,work:result2.work,...result2.error?{error:`${result2.error.code}: ${result2.error.detail??result2.error.message}`}:{},points:result2.points.map(point=>{const evidence=point.probabilityEvidence,probabilities=evidence.kind==="dense"?evidence.rows:[];const dominant=probabilities.reduce((best,row)=>!best||row.probability>best.probability?row:best,void 0);return{value:point.assignments[prepared2.parameterName],success:point.status==="ok",probabilities,probabilityEvidence:evidence,metrics:point.metrics,work:point.work,dominantState:dominant?.state,dominantProbability:dominant?.probability,...point.error?{error:`${point.error.code}: ${point.error.detail??point.error.message}`}:{},...point.programResult?{programResult:point.programResult}:{},...point.execution?{execution:point.execution}:{},...point.cost!==void 0?{cost:point.cost}:{},...evidence.kind==="dense"&&evidence.omitted?{omittedProbabilities:evidence.omitted}:{}}})}}function basisState2(index,numQubits){const amplitudes=new Array(2**numQubits).fill(null).map(()=>complex(0));amplitudes[index]=complex(1);return{amplitudes,numQubits}}var NM_VQE_EXACT_REFERENCE_MAX_QUBITS=10;function buildHamiltonianMatrix(hamiltonian,numQubits){const dim=2**numQubits;const matrix=Array.from({length:dim},()=>new Array(dim).fill(0));for(let i=0;i<dim;i+=1){for(const term of hamiltonian){let v=basisState2(i,numQubits);for(const factor of term.factors){v=applySingleQubitGate(v,GATES[factor.pauli],factor.qubit)}const storage=getNMDenseStatevectorStorage(v);for(let j=0;j<dim;j+=1){matrix[j][i]+=term.coeff*storage.real[j]}}}return matrix}function exactGroundEnergy(hamiltonian,numQubits){if(numQubits>NM_VQE_EXACT_REFERENCE_MAX_QUBITS){throw new RangeError(`Exact ground-energy reference requires at most ${NM_VQE_EXACT_REFERENCE_MAX_QUBITS} qubits; the dense Hamiltonian is 2^n x 2^n.`)}const dim=2**numQubits;const H=buildHamiltonianMatrix(hamiltonian,numQubits);let mu=0;for(let i=0;i<dim;i+=1){let rowSum=H[i][i];for(let j=0;j<dim;j+=1){if(j!==i)rowSum+=Math.abs(H[i][j])}mu=Math.max(mu,rowSum)}const random=createSeededRandom(3);let v=Array.from({length:dim},()=>random()-.5);const applyShifted=x=>{const out=new Array(dim).fill(0);for(let i=0;i<dim;i+=1){let sum=mu*x[i];for(let j=0;j<dim;j+=1){sum-=H[i][j]*x[j]}out[i]=sum}return out};let dominant=0;for(let iter=0;iter<300;iter+=1){const w=applyShifted(v);const norm=Math.sqrt(w.reduce((s,x)=>s+x*x,0))||1;v=w.map(x=>x/norm);dominant=norm}return mu-dominant}var NM_TRAINABILITY_CONTRACT_VERSION="0.1";var NM_TRAINABILITY_MAX_QUBITS=14;var NM_TRAINABILITY_MIN_SAMPLES=8;var NM_TRAINABILITY_MAX_SAMPLES=400;var NM_TRAINABILITY_MAX_LAYERS=4;var nmTrainabilityDiagnosticCodes={staticRisk:"NM-QML-301",input:"NM-QML-TRAINABILITY-001",evaluation:"NM-QML-TRAINABILITY-002",invariant:"NM-QML-TRAINABILITY-003"};function buildHardwareEfficientAnsatz(numQubits,layers){const decls=[];const gates2=[];let k=0;for(let layer=0;layer<layers;layer+=1){for(let i=0;i<numQubits;i+=1){decls.push(` param p${k}: Angle = 0;`);gates2.push(` Ry(q[${i}], p${k});`);k+=1}for(let i=0;i<numQubits-1;i+=1){gates2.push(` CNOT(q[${i}], q[${i+1}]);`)}}return["module barren;","","fn main() {",` let q: QReg<${numQubits}> = qreg[${numQubits}];`,...decls,...gates2," let cost = expect Z(q[0]);"," return cost;","}"].join("\n")}function computeBarrenPlateauProfileChecked(execute,options={}){if(typeof execute!=="function"||!options||typeof options!=="object"||Array.isArray(options)){return{success:false,code:nmTrainabilityDiagnosticCodes.input,kind:"input",error:"Trainability profiling requires an executor and options object.",circuitEvaluations:0}}const maxQubits=options.maxQubits??NM_TRAINABILITY_MAX_QUBITS;const samples=options.samples??80;const layers=options.layers??2;const seed=options.seed??1;if(!Number.isInteger(maxQubits)||maxQubits<1||maxQubits>NM_TRAINABILITY_MAX_QUBITS||!Number.isInteger(samples)||samples<NM_TRAINABILITY_MIN_SAMPLES||samples>NM_TRAINABILITY_MAX_SAMPLES||!Number.isInteger(layers)||layers<1||layers>NM_TRAINABILITY_MAX_LAYERS||!Number.isSafeInteger(seed)){return{success:false,code:nmTrainabilityDiagnosticCodes.input,kind:"input",error:`Trainability profiling requires 1-${NM_TRAINABILITY_MAX_QUBITS} qubits, ${NM_TRAINABILITY_MIN_SAMPLES}-${NM_TRAINABILITY_MAX_SAMPLES} samples, 1-${NM_TRAINABILITY_MAX_LAYERS} layers, and a safe-integer seed.`,circuitEvaluations:0}}const random=createSeededRandom(seed);const shift=Math.PI/2;let circuitEvaluations=0;const points=[];for(let numQubits=1;numQubits<=maxQubits;numQubits+=1){const code=buildHardwareEfficientAnsatz(numQubits,layers);const paramCount=layers*numQubits;const gradients=[];for(let sample=0;sample<samples;sample+=1){const values2={};for(let p=0;p<paramCount;p+=1){values2[`p${p}`]=random()*2*Math.PI}let plus;let minus;try{plus=evaluateNMCost(execute,code,{...values2,p0:values2.p0+shift});circuitEvaluations+=1;minus=evaluateNMCost(execute,code,{...values2,p0:values2.p0-shift});circuitEvaluations+=1}catch{return{success:false,code:nmTrainabilityDiagnosticCodes.evaluation,kind:"evaluation",error:"Trainability cost evaluation threw an exception.",circuitEvaluations}}if(plus==null||minus==null||!Number.isFinite(plus)||!Number.isFinite(minus)){return{success:false,code:nmTrainabilityDiagnosticCodes.evaluation,kind:"evaluation",error:"Trainability cost evaluation must return two finite values per sample.",circuitEvaluations}}const gradient=.5*(plus-minus);if(!Number.isFinite(gradient))return{success:false,code:nmTrainabilityDiagnosticCodes.invariant,kind:"invariant",error:"Trainability gradient produced a non-finite value.",circuitEvaluations};gradients.push(gradient)}const mean=gradients.reduce((sum,g)=>sum+g,0)/(gradients.length||1);const variance=gradients.reduce((sum,g)=>sum+(g-mean)**2,0)/(gradients.length||1);if(gradients.length!==samples||!Number.isFinite(variance)||variance<0)return{success:false,code:nmTrainabilityDiagnosticCodes.invariant,kind:"invariant",error:"Trainability variance or sample accounting drifted.",circuitEvaluations};points.push({qubits:numQubits,gradientVariance:variance,successfulSamples:gradients.length,circuitEvaluations:gradients.length*2})}if(circuitEvaluations!==maxQubits*samples*2)return{success:false,code:nmTrainabilityDiagnosticCodes.invariant,kind:"invariant",error:"Trainability circuit-evaluation accounting drifted.",circuitEvaluations};return{success:true,contractVersion:NM_TRAINABILITY_CONTRACT_VERSION,seed,maxQubits,samples,layers,circuitEvaluations,points}}function computeBarrenPlateauProfile(execute,options={}){const result2=computeBarrenPlateauProfileChecked(execute,options);return result2.success?result2.points.map(({qubits,gradientVariance})=>({qubits,gradientVariance})):[]}function vqeEnergy(execute,ansatz,hamiltonian,paramValues){let patched=ansatz;for(const[name2,value]of Object.entries(paramValues)){patched=replaceNMParameterValue(patched,name2,value)}const result2=execute(patched);if(!result2.success||!result2.finalState){return void 0}let energy=0;for(const term of hamiltonian){energy+=term.factors.length===0?term.coeff:term.coeff*expectationPauliString(result2.finalState,term.factors)}return energy}function executeNMVQE(execute,ansatz,hamiltonian,options={}){const parsed=parseNMCode(ansatz);const empty8={parameterNames:[],finalParams:{},energyHistory:[],exactGroundEnergy:0};const blockingError=diagnosticsToError(parsed.diagnostics);if(blockingError){return{success:false,error:blockingError,...empty8}}const parameterNames=Object.keys(parsed.params);if(parameterNames.length===0){return{success:false,error:"No trainable param declarations found.",...empty8}}if(parsed.numQubits>NM_VQE_EXACT_REFERENCE_MAX_QUBITS){return{success:false,error:`VQE requires an exact ground-energy reference, which supports at most ${NM_VQE_EXACT_REFERENCE_MAX_QUBITS} qubits; this ansatz uses ${parsed.numQubits}.`,...empty8}}const exact3=exactGroundEnergy(hamiltonian,parsed.numQubits);if(vqeEnergy(execute,ansatz,hamiltonian,parsed.params)==null){return{success:false,error:"Could not evaluate the ansatz energy.",...empty8,exactGroundEnergy:exact3}}const steps=Math.min(Math.max(options.steps??60,1),120);const learningRate=options.learningRate??.25;const shift=Math.PI/2;const values2={...parsed.params};const energyHistory=[];for(let step=0;step<steps;step+=1){const energy=vqeEnergy(execute,ansatz,hamiltonian,values2);if(energy==null){return{success:false,error:"Energy evaluation failed during VQE.",...empty8,exactGroundEnergy:exact3}}energyHistory.push(energy);const gradients={};for(const name2 of parameterNames){const plus=vqeEnergy(execute,ansatz,hamiltonian,{...values2,[name2]:values2[name2]+shift});const minus=vqeEnergy(execute,ansatz,hamiltonian,{...values2,[name2]:values2[name2]-shift});if(plus==null||minus==null){return{success:false,error:"Gradient evaluation failed during VQE.",...empty8,exactGroundEnergy:exact3}}gradients[name2]=.5*(plus-minus)}for(const name2 of parameterNames){values2[name2]-=learningRate*gradients[name2]}}const finalEnergy=vqeEnergy(execute,ansatz,hamiltonian,values2);if(finalEnergy!=null){energyHistory.push(finalEnergy)}return{success:true,parameterNames,finalParams:values2,energyHistory,metricHistory:{energy:[...energyHistory],residual:energyHistory.map(energy=>Math.abs(energy-exact3))},exactGroundEnergy:exact3}}var nmTrainingDiagnosticCodes={input:"NM-QML-TRAIN-001",learningRate:"NM-QML-TRAIN-002",objective:"NM-QML-TRAIN-003",cost:"NM-QML-TRAIN-004",gradient:"NM-QML-TRAIN-005",invariant:"NM-QML-TRAIN-006"};function executeNMCodeWithParams(execute,code,paramValues,parseOptions){let patched=code;for(const[name2,value]of Object.entries(paramValues)){patched=replaceNMParameterValue(patched,name2,value)}return execute(patched,parseOptions)}function stripGradientStatements(code){return code.split(/\r?\n/).filter(line=>!/^\s*let\s+[A-Za-z_]\w*\s*=\s*gradient\s+[A-Za-z_]\w*\s+wrt\s+[A-Za-z_]\w*\s*;?\s*$/.test(line)).join("\n")}function stripOptimizeAnnotations(code){return code.split(/\r?\n/).map(line=>/^\s*@optimize\b/.test(line)?" ".repeat(line.length):line).join("\n")}function evaluateNMGradient(execute,code,target2,parameter,parseOptions={}){parseOptions=snapshotNMQMLParseOptions(parseOptions);const parsed=parseNMCode(code,parseOptions);if(diagnosticsToError(parsed.diagnostics)){return{error:"Program has parser diagnostics."}}const currentValue=parsed.params[parameter];if(!Object.prototype.hasOwnProperty.call(parsed.params,parameter)||typeof currentValue!=="number"||!Number.isFinite(currentValue)){return{error:`Unknown trainable parameter: ${parameter}.`}}if(parsed.program.classicalFunctions||parsed.program.computeApply){const result2=computeNMGradientsAdjoint(stripGradientStatements(code),parsed.params,{objectiveTarget:target2,parseOptions});if(!("gradients"in result2))return{error:result2.error};const value=result2.gradients[parameter];return Object.prototype.hasOwnProperty.call(result2.gradients,parameter)&&typeof value==="number"&&Number.isFinite(value)?{value}:{error:`No finite gradient for parameter: ${parameter}.`}}const policyError=parameterShiftError(parsed.program.statements,parameter);if(policyError)return{error:policyError};const gradientCode=stripGradientStatements(code);const shift=Math.PI/2;const plus=executeNMCodeWithParams(execute,gradientCode,{[parameter]:currentValue+shift},parseOptions);const minus=executeNMCodeWithParams(execute,gradientCode,{[parameter]:currentValue-shift},parseOptions);const plusValue=plus.expectations?.[target2];const minusValue=minus.expectations?.[target2];if(!plus.success||!minus.success||plusValue==null||minusValue==null){return{error:`Unknown expectation target: ${target2}.`}}return{value:(plusValue-minusValue)/2}}function appendMetricHistory(metricHistory,metrics){if(!metrics){return}for(const[name2,value]of Object.entries(metrics)){metricHistory[name2]??(metricHistory[name2]=[]);metricHistory[name2].push(value)}}function maybeMetricHistory(metricHistory){return Object.values(metricHistory).some(values2=>values2.length>0)?metricHistory:void 0}function evaluateNMCost(execute,code,paramValues,parseOptions={}){const result2=executeNMCodeWithParams(execute,stripOptimizeAnnotations(code),paramValues,snapshotNMQMLParseOptions(parseOptions));return result2.success&&result2.programResult?.status!=="error"&&result2.cost!=null&&Number.isFinite(result2.cost)?result2.cost:void 0}function evaluateNMTrainingCost(execute,code,paramValues,objectiveTarget){const result2=executeNMCodeWithParams(execute,stripOptimizeAnnotations(code),paramValues);if(!result2.success||result2.programResult?.status==="error")return void 0;const value=objectiveTarget?result2.expectations?.[objectiveTarget]:result2.cost;return value!=null&&Number.isFinite(value)?value:void 0}function getNMBlochVector(execute,code,paramValues,parseOptions={}){const result2=executeNMCodeWithParams(execute,stripOptimizeAnnotations(code),paramValues,snapshotNMQMLParseOptions(parseOptions));const bloch=result2.blochVectors?.[0];return result2.success&&result2.programResult?.status!=="error"&&bloch?{x:bloch.x,y:bloch.y,z:bloch.z}:void 0}function computeNMCostLandscape(execute,code,options={},parseOptions={}){parseOptions=snapshotNMQMLParseOptions(parseOptions);const parsed=parseNMCode(code,parseOptions);if(diagnosticsToError(parsed.diagnostics)){return void 0}const availableParameters=Object.keys(parsed.params);const requestedParameters=[...new Set(options.parameterNames??[])].filter(name2=>availableParameters.includes(name2));const parameterNames=requestedParameters.length>0?requestedParameters.slice(0,2):availableParameters;const min=0;const max=2*Math.PI;if(parameterNames.length===1){const resolution=Math.min(Math.max(options.resolution??48,8),96);const values2=[];for(let i=0;i<resolution;i+=1){const v=min+i/(resolution-1)*(max-min);const cost3=evaluateNMCost(execute,code,{[parameterNames[0]]:v},parseOptions);if(cost3===void 0)return void 0;values2.push(cost3)}return{parameterNames,resolution,min,max,values:values2}}if(parameterNames.length===2){const resolution=Math.min(Math.max(options.resolution??28,8),48);const grid=[];for(let i=0;i<resolution;i+=1){const a=min+i/(resolution-1)*(max-min);const row=[];for(let j=0;j<resolution;j+=1){const b=min+j/(resolution-1)*(max-min);const cost3=evaluateNMCost(execute,code,{[parameterNames[0]]:a,[parameterNames[1]]:b},parseOptions);if(cost3===void 0)return void 0;row.push(cost3)}grid.push(row)}return{parameterNames,resolution,min,max,grid}}return void 0}function executeNMTraining(execute,code,options={},parseOptions={}){parseOptions=snapshotNMQMLParseOptions(parseOptions);options={...options};let circuitEvaluations=0;const countedExecute=candidate=>{circuitEvaluations+=1;return execute(candidate,parseOptions)};const trainingCode=stripNMTrainBlocks(stripOptimizeAnnotations(code));const parsed=parseNMCode(code,parseOptions);const empty8={parameterNames:[],initialParams:{},finalParams:{},costHistory:[],paramHistory:[]};const fail11=(code2,message)=>({success:false,error:`${code2}: ${message}`,circuitEvaluations,...empty8});if(options.steps!=null&&(!Number.isInteger(options.steps)||options.steps<1||options.steps>100)){return fail11(nmTrainingDiagnosticCodes.input,"Training steps must be an integer from 1 through 100.")}if(options.learningRate!=null&&(!Number.isFinite(options.learningRate)||options.learningRate<=0||options.learningRate>5)){return fail11(nmTrainingDiagnosticCodes.learningRate,"Training learningRate must be finite and in the interval (0, 5].")}if(options.objectiveTarget!=null&&!/^[A-Za-z_]\w{0,127}$/.test(options.objectiveTarget)){return fail11(nmTrainingDiagnosticCodes.objective,"Training objectiveTarget must be a bounded identifier.")}if(options.optimizer!=null&&!["gd","momentum","adam","spsa","qng"].includes(options.optimizer)){return fail11(nmTrainingDiagnosticCodes.input,"Training optimizer is not supported.")}if(options.objective!=null&&options.objective!=="minimize"&&options.objective!=="maximize"){return fail11(nmTrainingDiagnosticCodes.input,"Training objective must be minimize or maximize.")}if(options.gradientMethod!=null&&!["parameter-shift","adjoint","auto"].includes(options.gradientMethod)){return fail11(nmTrainingDiagnosticCodes.input,"Training gradientMethod is not supported.")}const blockingError=diagnosticsToError(parsed.diagnostics);if(blockingError){return{success:false,error:blockingError,...empty8}}const parameterNames=Object.keys(parsed.params);if(parameterNames.length===0){return{success:false,error:"No trainable param declarations found.",...empty8}}if(parameterNames.length>8){return{success:false,error:"The trainer supports up to 8 trainable parameters.",...empty8}}if(Object.values(parsed.params).some(value=>!Number.isFinite(value))){return fail11(nmTrainingDiagnosticCodes.invariant,"Training parameters must be finite.")}const initialParams={...parsed.params};const helperTraining=Boolean(parsed.program.classicalFunctions);const helperPolicyError=classicalFunctionTrainingError(parsed,options);if(helperPolicyError)return fail11(nmTrainingDiagnosticCodes.gradient,helperPolicyError);const optimizer=options.optimizer??"gd";const objectiveTarget=options.objectiveTarget;const objectiveExists=parsed.program.statements.some(statement=>statement.kind==="expectation"&&(!objectiveTarget||statement.binding===objectiveTarget));if(!objectiveExists||optimizer!=="spsa"&&evaluateNMTrainingCost(countedExecute,trainingCode,initialParams,objectiveTarget)==null){return fail11(nmTrainingDiagnosticCodes.cost,"The circuit has no finite expectation cost to optimize.")}const steps=options.steps??40;const learningRate=options.learningRate??.2;const descentSign=options.objective==="maximize"?-1:1;const shift=Math.PI/2;let gradientMethod="parameter-shift";const values2={...initialParams};const costHistory=[];const paramHistory=[];const metricHistory={};const qngMetricHistory={};const qngConditionHistory=[];const qngSingularSteps=[];const velocity=Object.fromEntries(parameterNames.map(n=>[n,0]));const adamM=Object.fromEntries(parameterNames.map(n=>[n,0]));const adamV=Object.fromEntries(parameterNames.map(n=>[n,0]));const beta=.9;const beta1=.9;const beta2=.999;const eps=1e-8;const spsaRandom=createSeededRandom(parsed.program.seed??20045);for(let step=0;step<steps;step+=1){if(optimizer==="spsa"){paramHistory.push({...values2});const spsa=executeNMSPSAStep(values2,step,steps,spsaRandom,candidate=>evaluateNMTrainingCost(countedExecute,trainingCode,candidate,objectiveTarget),descentSign,{...options.spsa,a:options.spsa?.a??options.learningRate});if("error"in spsa)return fail11(spsa.code,spsa.error);costHistory.push(spsa.midpointCost);options.onProgress?.({step,cost:spsa.midpointCost,params:{...values2}});Object.assign(values2,spsa.values);gradientMethod="spsa";continue}const cost3=evaluateNMTrainingCost(countedExecute,trainingCode,values2,objectiveTarget);if(cost3==null){return fail11(nmTrainingDiagnosticCodes.cost,"Cost evaluation failed or produced a non-finite value during training.")}costHistory.push(cost3);paramHistory.push({...values2});options.onProgress?.({step,cost:cost3,params:{...values2}});appendMetricHistory(metricHistory,executeNMCodeWithParams(countedExecute,trainingCode,values2).metrics);const adjoint=options.gradientMethod!=="parameter-shift"?computeNMGradientsAdjoint(trainingCode,values2,{objectiveTarget,parseOptions}):{error:"Parameter-shift requested."};const gradients="gradients"in adjoint?adjoint.gradients:{};gradientMethod="gradients"in adjoint?"adjoint":"parameter-shift";if(!("gradients"in adjoint)){if(helperTraining)return fail11(nmTrainingDiagnosticCodes.gradient,adjoint.error);const policyError=parameterShiftError(parsed.program.statements,parameterNames);if(policyError)return fail11(nmTrainingDiagnosticCodes.gradient,policyError)}for(const name2 of"gradients"in adjoint?[]:parameterNames){const plus=evaluateNMTrainingCost(countedExecute,trainingCode,{...values2,[name2]:values2[name2]+shift},objectiveTarget);const minus=evaluateNMTrainingCost(countedExecute,trainingCode,{...values2,[name2]:values2[name2]-shift},objectiveTarget);if(plus==null||minus==null){return fail11(nmTrainingDiagnosticCodes.gradient,"Gradient evaluation failed or produced a non-finite value during training.")}gradients[name2]=.5*(plus-minus)}if(parameterNames.some(name2=>!Number.isFinite(gradients[name2]))){return fail11(nmTrainingDiagnosticCodes.gradient,"Gradient evaluation produced a non-finite value during training.")}const t=step+1;const qng=optimizer==="qng"?computeNMQNGDiagonal(countedExecute,trainingCode,values2,options.qng):void 0;if(qng&&"error"in qng)return{success:false,error:`${qng.code}: ${qng.error}`,circuitEvaluations,...empty8};if(qng&&"diagonal"in qng){for(const name2 of parameterNames)(qngMetricHistory[name2]??(qngMetricHistory[name2]=[])).push(qng.diagonal[name2]);qngConditionHistory.push(qng.conditionNumber);if(qng.singularParameters.length>0)qngSingularSteps.push(step)}for(const name2 of parameterNames){const grad=descentSign*gradients[name2];if(optimizer==="qng"&&qng&&"diagonal"in qng){values2[name2]-=learningRate*grad/qng.regularizedDiagonal[name2]}else if(optimizer==="momentum"){velocity[name2]=beta*velocity[name2]-learningRate*grad;values2[name2]+=velocity[name2]}else if(optimizer==="adam"){adamM[name2]=beta1*adamM[name2]+(1-beta1)*grad;adamV[name2]=beta2*adamV[name2]+(1-beta2)*grad*grad;const mHat=adamM[name2]/(1-beta1**t);const vHat=adamV[name2]/(1-beta2**t);values2[name2]-=learningRate*(mHat/(Math.sqrt(vHat)+eps))}else{values2[name2]-=learningRate*grad}}if(Object.values(values2).some(value=>!Number.isFinite(value))){return fail11(nmTrainingDiagnosticCodes.invariant,"Optimizer update produced a non-finite parameter value.")}}const finalCost=optimizer==="spsa"?void 0:evaluateNMTrainingCost(countedExecute,trainingCode,values2,objectiveTarget);if(helperTraining&&finalCost==null)return fail11(nmTrainingDiagnosticCodes.cost,"Final helper-training evaluation failed or produced a typed error.");if(finalCost!=null){costHistory.push(finalCost);paramHistory.push({...values2});appendMetricHistory(metricHistory,executeNMCodeWithParams(countedExecute,trainingCode,values2).metrics)}return{success:true,parameterNames,initialParams,finalParams:values2,costHistory,paramHistory,metricHistory:maybeMetricHistory(metricHistory),gradientMethod,costHistoryKind:optimizer==="spsa"?"spsa-midpoint":"exact",circuitEvaluations,...optimizer==="qng"?{qng:{contractVersion:NM_QNG_OPTIMIZER_CONTRACT_VERSION,shift:options.qng?.shift??NM_QNG_DEFAULT_SHIFT,regularization:options.qng?.regularization??NM_QNG_DEFAULT_REGULARIZATION,singularPolicy:options.qng?.singularPolicy??"regularize",metricDiagonalHistory:qngMetricHistory,conditionHistory:qngConditionHistory,singularSteps:qngSingularSteps}}:{}}}function lossEvidence(context){if(!context)return{};const evidence=readNMSupervisedLossEvidence(context);return evidence.success&&evidence.lossIdentity.kind==="custom"?{lossIdentity:evidence.lossIdentity,...evidence.work?{lossWork:evidence.work}:{},...evidence.failure?{lossFailure:evidence.failure}:{}}:{}}function boundLossSource(context,source,settings){const valid2=validateNMSupervisedLossBinding(context,source,settings);if(!valid2.success)return valid2;return readNMSupervisedLossBinding(context)}function boundedRows(rows,names){return Array.isArray(names)&&names.length>0&&names.length<=8&&Array.isArray(rows)&&rows.length>0&&rows.length<=80&&Array.from(rows).every(row=>row&&typeof row==="object"&&Array.isArray(row.features)&&row.features.length===names.length)}function evaluateNMClassifierDataset(execute,template,dataset,featureNames2,params,options={},parseOptions={}){return evaluateNMClassifierDatasetWithLoss(execute,template,dataset,featureNames2,params,options,parseOptions)}function evaluateNMClassifierDatasetWithLoss(execute,template,dataset,featureNames2,params,options={},parseOptions={},lossContext){if(lossContext){const binding=boundLossSource(lossContext,template,parseOptions);if(!binding.success)return{success:false,error:`${binding.code}: ${binding.error}`,circuitEvaluations:0};template=binding.trainingSource;if(binding.lossIdentity.kind==="builtin")options={...options,loss:binding.lossIdentity.name};const parsed=parseNMCode(template,parseOptions);const error=diagnosticsToError(parsed.diagnostics)??classicalFunctionTrainingError(parsed,{},{supervised:true});if(error)return{success:false,error:`NM-QML-TRAIN-005: ${error}`,circuitEvaluations:0}}parseOptions=snapshotNMQMLParseOptions(parseOptions);options={...options};if(!boundedRows(dataset,featureNames2))return{success:false,error:"NM-QML-DATASET-002: Invalid classifier evaluation workload.",circuitEvaluations:0};if(featureNames2.some(name2=>Object.prototype.hasOwnProperty.call(params,name2)))return{success:false,error:"NM-QML-DATASET-002: Feature names collide with trainable parameters.",circuitEvaluations:0};params={...params};featureNames2=[...featureNames2];dataset=dataset.map(point=>({label:point.label,features:[...point.features]}));let circuitEvaluations=0;const countedExecute=budgetNMSupervisedExecutor(lossContext,execute,()=>{circuitEvaluations+=1});if(dataset.length<1||dataset.length>80||featureNames2.length<1||featureNames2.length>8||Object.values(params).some(value=>!Number.isFinite(value))){return{success:false,error:"NM-QML-DATASET-002: Invalid classifier evaluation workload.",circuitEvaluations}}if(dataset.some(point=>point.features.length!==featureNames2.length||point.features.some(value=>!Number.isFinite(value))||point.label!==-1&&point.label!==1)){return{success:false,error:"NM-QML-DATASET-002: Invalid classifier evaluation row.",circuitEvaluations}}let pointTemplates;try{pointTemplates=createNMClassifierPointTemplates(template,dataset.length,options.datasetId,options.datasetSplit).map((text,i)=>bindNMClassifierFeatures(text,Object.fromEntries(featureNames2.map((name2,j)=>[name2,dataset[i].features[j]]))))}catch(error){if(!(error instanceof NMClassifierTemplateError))throw error;return{success:false,error:error.message,circuitEvaluations}}let loss=0;let correct=0;for(const[index,point]of dataset.entries()){const prediction=evaluateNMCost(countedExecute,pointTemplates[index],params,parseOptions);if(prediction==null)return{success:false,error:supervisedWorkError(lossContext)??"NM-QML-DATASET-002: Classifier evaluation failed.",circuitEvaluations};if(lossContext){const pair=evaluateNMSupervisedLoss(lossContext,prediction,point.label);if(!pair.success)return{success:false,error:`${pair.code}: ${pair.error}`,circuitEvaluations};loss+=pair.value}else loss+=computeNMLoss(options.loss??"mse",prediction,point.label);if(Math.sign(prediction)===Math.sign(point.label))correct+=1}const meanLoss=loss/dataset.length;const accuracy=correct/dataset.length;return Number.isFinite(meanLoss)&&Number.isFinite(accuracy)?{success:true,loss:meanLoss,accuracy,samples:dataset.length,circuitEvaluations}:{success:false,error:"NM-QML-DATASET-002: Classifier evaluation produced a non-finite metric.",circuitEvaluations}}function trainNMClassifier(execute,template,dataset,featureNames2,options={},parseOptions={}){return trainNMClassifierWithLoss(execute,template,dataset,featureNames2,options,parseOptions)}function trainNMClassifierWithLoss(execute,template,dataset,featureNames2,options={},parseOptions={},lossContext){parseOptions=snapshotNMQMLParseOptions(parseOptions);options={...options};const empty8={parameterNames:[],initialParams:{},finalParams:{},lossHistory:[],accuracyHistory:[],paramHistory:[]};let circuitEvaluations=0;const countedExecute=budgetNMSupervisedExecutor(lossContext,execute,()=>{circuitEvaluations+=1});const fail11=error=>({success:false,error:supervisedWorkError(lossContext)??error,circuitEvaluations,...empty8,...lossEvidence(lossContext)});if(lossContext){const binding=boundLossSource(lossContext,template,parseOptions);if(!binding.success)return fail11(`${binding.code}: ${binding.error}`);template=binding.trainingSource;if(binding.lossIdentity.kind==="builtin")options={...options,loss:binding.lossIdentity.name}}if(!boundedRows(dataset,featureNames2))return fail11("NM-QML-DATASET-002: Invalid classifier input shape or bounds.");featureNames2=[...featureNames2];dataset=dataset.map(point=>({label:point.label,features:[...point.features]}));const parsed=parseNMCode(template,parseOptions);const blockingError=diagnosticsToError(parsed.diagnostics);if(blockingError){return fail11(blockingError)}const policyError=classicalFunctionTrainingError(parsed,options,lossContext?{supervised:true}:void 0);if(policyError)return fail11(`NM-QML-TRAIN-005: ${policyError}`);const parameterNames=Object.keys(parsed.params);if(featureNames2.some(name2=>Object.prototype.hasOwnProperty.call(parsed.params,name2)))return fail11("NM-QML-DATASET-002: Feature names collide with trainable parameters.");if(parameterNames.length===0){return fail11("No trainable param declarations found.")}if(parameterNames.length>8){return fail11("The classifier supports up to 8 parameters.")}if(dataset.length===0||dataset.length>80){return fail11("NM-QML-DATASET-002: Provide between 1 and 80 data points.")}if(featureNames2.length<1||featureNames2.length>8||new Set(featureNames2).size!==featureNames2.length||featureNames2.some(name2=>!/^[A-Za-z_]\w{0,127}$/.test(name2)))return fail11("NM-QML-DATASET-002: Invalid feature names.");if(dataset.some(point=>point.features.length!==featureNames2.length||point.features.some(value=>!Number.isFinite(value))||point.label!==-1&&point.label!==1))return fail11("NM-QML-DATASET-002: Invalid classifier row.");if(Object.values(parsed.params).some(value=>!Number.isFinite(value)))return fail11("NM-QML-TRAIN-006: Classifier parameters must be finite.");if(options.steps!=null&&(!Number.isInteger(options.steps)||options.steps<1||options.steps>100))return fail11("NM-QML-TRAIN-001: Classifier steps must be an integer from 1 through 100.");if(options.learningRate!=null&&(!Number.isFinite(options.learningRate)||options.learningRate<=0||options.learningRate>5))return fail11("NM-QML-TRAIN-002: Classifier learningRate must be finite and in (0, 5].");if(options.loss!=null&&!["mse","hinge","cross_entropy"].includes(options.loss))return fail11("NM-QML-LOSS-001: Unsupported classifier loss.");if(options.optimizer!=null&&!["gd","momentum","adam"].includes(options.optimizer))return fail11("NM-QML-TRAIN-001: Unsupported classifier optimizer.");const featureSubstitution=point=>Object.fromEntries(featureNames2.map((name2,i)=>[name2,point.features[i]??0]));let pointTemplates;try{pointTemplates=createNMClassifierPointTemplates(template,dataset.length,options.datasetId,"train").map((text,i)=>bindNMClassifierFeatures(text,featureSubstitution(dataset[i])))}catch(error){if(!(error instanceof NMClassifierTemplateError))throw error;return fail11(error.message)}const params={...parsed.params};const initialParams={...params};const steps=options.steps??30;const learningRate=options.learningRate??.3;const lossKind=options.loss??"mse";const optimizer=options.optimizer??"gd";const shift=Math.PI/2;const lossHistory=[];const accuracyHistory=[];const paramHistory=[];let gradientMethod="parameter-shift";const optimizerState=createNMClassifierOptimizerState(parameterNames);const customLoss=lossEvidence(lossContext).lossIdentity?.kind==="custom";let lossFailure;const epochMetrics=()=>{const pairs=[];let loss=0;let correct=0;for(const[index,point]of dataset.entries()){const pred=evaluateNMCost(countedExecute,pointTemplates[index],params,parseOptions);if(pred==null){return void 0}if(customLoss&&lossContext){const pair=evaluateNMSupervisedLoss(lossContext,pred,point.label);if(!pair.success){lossFailure=`${pair.code}: ${pair.error}`;return void 0}loss+=pair.value;pairs.push({prediction:pred,derivative:pair.dPrediction})}else loss+=computeNMLoss(lossKind,pred,point.label);if(Math.sign(pred)===Math.sign(point.label)){correct+=1}}return{loss:loss/dataset.length,accuracy:correct/dataset.length,pairs}};for(let step=0;step<steps;step+=1){paramHistory.push({...params});const metrics=epochMetrics();if(!metrics){return fail11(lossFailure??"NM-QML-TRAIN-004: Prediction failed during training.")}lossHistory.push(metrics.loss);accuracyHistory.push(metrics.accuracy);try{options.onProgress?.({step,cost:metrics.loss,accuracy:metrics.accuracy,params:{...params}})}catch(error){if(!customLoss)throw error;return fail11("NM-QML-TRAIN-004: Training progress callback failed.")}const gradients=Object.fromEntries(parameterNames.map(n=>[n,0]));for(const[index,point]of dataset.entries()){const pointTemplate=pointTemplates[index];const base2={...params};const pred=customLoss?metrics.pairs[index].prediction:evaluateNMCost(countedExecute,pointTemplate,base2,parseOptions);if(pred==null){return fail11(lossFailure??"NM-QML-TRAIN-004: Prediction failed during training.")}const lossDerivative=customLoss?metrics.pairs[index].derivative:computeNMLossGradient(lossKind,pred,point.label);const adjoint=options.gradientMethod!=="parameter-shift"?computeNMGradientsAdjointWithBudget(pointTemplate,base2,{parseOptions},lossContext):{error:"Parameter-shift requested."};gradientMethod="gradients"in adjoint?"adjoint":"parameter-shift";if(!("gradients"in adjoint)&&(parsed.program.classicalFunctions||options.gradientMethod==="adjoint"))return fail11(`NM-QML-TRAIN-005: ${adjoint.error}`);for(const name2 of parameterNames){if("gradients"in adjoint){gradients[name2]+=lossDerivative*adjoint.gradients[name2];continue}const plus=evaluateNMCost(countedExecute,pointTemplate,{...base2,[name2]:params[name2]+shift},parseOptions);const minus=evaluateNMCost(countedExecute,pointTemplate,{...base2,[name2]:params[name2]-shift},parseOptions);if(plus==null||minus==null){return fail11("NM-QML-TRAIN-005: Gradient evaluation failed during training.")}gradients[name2]+=lossDerivative*.5*(plus-minus)}}if(Object.values(gradients).some(gradient=>!Number.isFinite(gradient)))return fail11("NM-QML-TRAIN-005: Classifier gradient became non-finite.");applyNMClassifierOptimizerStep(params,Object.fromEntries(parameterNames.map(name2=>[name2,gradients[name2]/dataset.length])),optimizer,learningRate,step,optimizerState);if(Object.values(params).some(value=>!Number.isFinite(value)))return fail11("NM-QML-TRAIN-006: Classifier update became non-finite.")}const finalMetrics=epochMetrics();if(!finalMetrics)return fail11(lossFailure??"NM-QML-TRAIN-004: Final classifier metrics failed.");lossHistory.push(finalMetrics.loss);accuracyHistory.push(finalMetrics.accuracy);paramHistory.push({...params});return{success:true,parameterNames,initialParams,finalParams:params,lossHistory,accuracyHistory,gradientMethod,...lossEvidence(lossContext),paramHistory,circuitEvaluations}}function createNMControlledLossMetrics(input){let failure8;let derivatives=[];return{error:()=>failure8,derivative:index=>derivatives[index],evaluateRows(rows,templates,values2){if(input.context&&rows===input.validationRows){const result2=evaluateNMClassifierDatasetWithLoss(input.execute,input.source,rows,input.featureNames,values2,{datasetId:input.datasetId,datasetSplit:"validation"},input.parseOptions,input.context);if(!result2.success){failure8=result2.error;return void 0}return{loss:result2.loss,accuracy:result2.accuracy}}if(rows===input.trainRows)derivatives=[];let totalLoss=0,correct=0;for(const[index,row]of rows.entries()){const prediction=evaluateNMCost(input.execute,templates[index],values2,input.parseOptions);if(prediction==null)return void 0;if(input.context){const loss=evaluateNMSupervisedLoss(input.context,prediction,row.label);if(!loss.success){failure8=`${loss.code}: ${loss.error}`;return void 0}totalLoss+=loss.value;if(rows===input.trainRows)derivatives.push(loss.dPrediction)}else{totalLoss+=computeNMLoss(input.lossKind,prediction,row.label);if(rows===input.trainRows)derivatives.push(computeNMLossGradient(input.lossKind,prediction,row.label))}if(Math.sign(prediction)===Math.sign(row.label))correct++}const snapshot2={loss:totalLoss/rows.length,accuracy:correct/rows.length};return Number.isFinite(snapshot2.loss)&&Number.isFinite(snapshot2.accuracy)?snapshot2:void 0}}}var metricValue=(metric,snapshot2)=>metric==="validation_loss"?snapshot2.loss:snapshot2.accuracy;var improves=(metric,candidate,best,delta)=>metric==="validation_loss"?candidate<best-delta:candidate>best+delta;function executeNMQmlControlledTrainingWithLoss(execute,source,trainRows,validationRows,featureNames2,block,options={},parseOptions,context){return controlledTraining(execute,source,trainRows,validationRows,featureNames2,block,options,parseOptions,context)}function controlledTraining(execute,source,trainRows,validationRows,featureNames2,block,options={},parseOptions={},context){parseOptions=snapshotNMQMLParseOptions(parseOptions);options={...options};block=structuredClone(block);const parsed=parseNMCode(source,parseOptions);const parameterNames=Object.keys(parsed.params);let circuitEvaluations=0;const empty8={parameterNames:[],initialParams:{},finalParams:{},lossHistory:[],accuracyHistory:[],paramHistory:[]};const lossEvidence2=()=>{if(!context)return{};const evidence=readNMSupervisedLossEvidence(context);return evidence.success&&evidence.lossIdentity.kind==="custom"?{lossIdentity:evidence.lossIdentity,...evidence.work?{lossWork:evidence.work}:{},...evidence.failure?{lossFailure:evidence.failure}:{}}:{}};let metricError=()=>void 0;const fail11=message=>({success:false,error:supervisedWorkError(context)??metricError()??`${nmQmlTrainingControlDiagnosticCodes.runtimeFailure}: ${message}`,...empty8,circuitEvaluations,...lossEvidence2()});if(block.customLoss&&!context)return fail11(NM_CUSTOM_LOSS_TRAINING_PENDING);if(context){const binding=validateNMSupervisedLossBinding(context,source,parseOptions);if(!binding.success)return fail11(`${binding.code}: ${binding.error}`);const blockBinding=validateNMSupervisedLossTrainBlock(context,block);if(!blockBinding.success)return fail11(`${blockBinding.code}: ${blockBinding.error}`)}if(!Array.isArray(featureNames2)||featureNames2.length<1||featureNames2.length>8||[trainRows,validationRows].some(rows=>!Array.isArray(rows)||rows.length<1||rows.length>80||Array.from(rows).some(row=>!row||typeof row!=="object"||!Array.isArray(row.features)||row.features.length!==featureNames2.length))){return fail11("Controlled training input shape or bounds are invalid.")}featureNames2=[...featureNames2];trainRows=trainRows.map(row=>({label:row.label,features:[...row.features]}));validationRows=validationRows.map(row=>({label:row.label,features:[...row.features]}));if(diagnosticsToError(parsed.diagnostics))return fail11("Controlled training source has blocking diagnostics.");if(featureNames2.some(name2=>Object.prototype.hasOwnProperty.call(parsed.params,name2)))return fail11("Feature names collide with trainable parameters.");const policyError=classicalFunctionTrainingError({...parsed,program:{...parsed.program,statements:[...parsed.program.statements,block]}},options,context?{supervised:true}:void 0);if(policyError)return fail11(policyError);if(parameterNames.length<1||parameterNames.length>8||Object.values(parsed.params).some(value=>!Number.isFinite(value))||trainRows.length<1||validationRows.length<1||featureNames2.length<1||featureNames2.length>8||new Set(featureNames2).size!==featureNames2.length||featureNames2.some(name2=>!/^[A-Za-z_]\w{0,127}$/u.test(name2))||[...trainRows,...validationRows].some(row=>row.features.length!==featureNames2.length||row.features.some(value=>!Number.isFinite(value))||row.label!==-1&&row.label!==1)){return fail11("Controlled training requires bounded parameters and non-empty train/validation splits.")}const requestedSteps=options.steps??block.steps??40;const initialLearningRate=options.learningRate??block.optimizer?.options.lr??.2;if(!Number.isInteger(requestedSteps)||requestedSteps<1||requestedSteps>100||!Number.isFinite(initialLearningRate)||initialLearningRate<=0||initialLearningRate>5||options.optimizer!=null&&options.optimizer!=="gd"&&options.optimizer!=="momentum"&&options.optimizer!=="adam"){return fail11("Effective training options are outside the supervised control contract.")}if(block.validation?.every!=null&&block.validation.every>requestedSteps){return fail11("Validation cadence exceeds the effective training step count.")}if(block.scheduler?.every!=null&&block.scheduler.every>requestedSteps){return fail11("Scheduler cadence exceeds the effective training step count.")}if(block.scheduler?.minimumLearningRate!=null&&block.scheduler.minimumLearningRate>initialLearningRate){return fail11("Scheduler min_lr exceeds the effective initial learning rate.")}const countedExecute=budgetNMSupervisedExecutor(context,execute,()=>{circuitEvaluations+=1});const bindFeatures=(text,row)=>bindNMClassifierFeatures(text,Object.fromEntries(featureNames2.map((name2,i)=>[name2,row.features[i]])));let trainTemplates,validationTemplates;try{trainTemplates=createNMClassifierPointTemplates(source,trainRows.length,block.datasetId,"train").map((text,i)=>bindFeatures(text,trainRows[i]));validationTemplates=createNMClassifierPointTemplates(source,validationRows.length,block.datasetId,"validation").map((text,i)=>bindFeatures(text,validationRows[i]))}catch(error){if(!(error instanceof NMClassifierTemplateError))throw error;return fail11(error.message)}const optimizer=options.optimizer==="momentum"||options.optimizer==="adam"?options.optimizer:block.optimizer?.name==="momentum"||block.optimizer?.name==="adam"?block.optimizer.name:"gd";const params={...parsed.params};const initialParams={...params};const optimizerState=createNMClassifierOptimizerState(parameterNames);const lossHistory=[];const accuracyHistory=[];const paramHistory=[];const learningRateHistory=[];const validationHistory=[];let completedSteps=0;let stoppedEarly=false;let gradientMethod="parameter-shift";let earlyBest;let nonImprovingChecks=0;let bestCheckpoint;const metrics=createNMControlledLossMetrics({context,source,parseOptions,execute:countedExecute,featureNames:featureNames2,datasetId:block.datasetId,trainRows,validationRows,lossKind:block.loss??"mse"});const evaluateRows=metrics.evaluateRows;metricError=metrics.error;const learningRateAt=step=>{if(!block.scheduler)return initialLearningRate;const decays=Math.floor(step/block.scheduler.every);return Math.max(block.scheduler.minimumLearningRate??0,initialLearningRate*block.scheduler.factor**decays)};for(let step=0;step<requestedSteps;step+=1){const learningRate=learningRateAt(step);learningRateHistory.push(learningRate);paramHistory.push({...params});const training=evaluateRows(trainRows,trainTemplates,params);if(!training)return fail11("Training metric evaluation failed.");lossHistory.push(training.loss);accuracyHistory.push(training.accuracy);try{options.onProgress?.({step,cost:training.loss,accuracy:training.accuracy,learningRate,params:{...params}})}catch{return fail11("Training progress callback failed.")}const gradients=Object.fromEntries(parameterNames.map(name2=>[name2,0]));for(const index of trainRows.keys()){const base2={...params};const prediction=evaluateNMCost(countedExecute,trainTemplates[index],base2,parseOptions);if(prediction==null)return fail11("Training prediction failed.");const lossDerivative=metrics.derivative(index);if(lossDerivative===void 0)return fail11("Missing training loss derivative.");const adjoint=options.gradientMethod!=="parameter-shift"?computeNMGradientsAdjointWithBudget(trainTemplates[index],base2,{parseOptions},context):{error:"Parameter-shift requested."};gradientMethod="gradients"in adjoint?"adjoint":"parameter-shift";if(!("gradients"in adjoint)&&(parsed.program.classicalFunctions||options.gradientMethod==="adjoint"))return fail11(`Adjoint gradient failed: ${adjoint.error}`);for(const name2 of parameterNames){if("gradients"in adjoint){gradients[name2]+=lossDerivative*adjoint.gradients[name2];continue}const shift=Math.PI/2;const plus=evaluateNMCost(countedExecute,trainTemplates[index],{...base2,[name2]:params[name2]+shift},parseOptions);const minus=evaluateNMCost(countedExecute,trainTemplates[index],{...base2,[name2]:params[name2]-shift},parseOptions);if(plus==null||minus==null)return fail11("Training gradient evaluation failed.");gradients[name2]+=lossDerivative*.5*(plus-minus)}}if(Object.values(gradients).some(value=>!Number.isFinite(value)))return fail11("Training gradient became non-finite.");applyNMClassifierOptimizerStep(params,Object.fromEntries(parameterNames.map(name2=>[name2,gradients[name2]/trainRows.length])),optimizer,learningRate,step,optimizerState);if(Object.values(params).some(value=>!Number.isFinite(value)))return fail11("Training update became non-finite.");completedSteps=step+1;const shouldValidate=block.validation!=null&&(completedSteps%block.validation.every===0||completedSteps===requestedSteps);if(!shouldValidate)continue;const validation=evaluateRows(validationRows,validationTemplates,params);if(!validation)return fail11("Validation metric evaluation failed.");validationHistory.push({completedSteps,...validation});if(block.checkpoint){const candidate=metricValue(block.checkpoint.metric,validation);if(!bestCheckpoint||improves(block.checkpoint.metric,candidate,bestCheckpoint.value,0)){bestCheckpoint={value:candidate,step:completedSteps,params:{...params},validation}}}if(block.earlyStopping){const candidate=metricValue(block.earlyStopping.metric,validation);if(!earlyBest||improves(block.earlyStopping.metric,candidate,earlyBest.value,block.earlyStopping.minDelta)){earlyBest={value:candidate,step:completedSteps};nonImprovingChecks=0}else{nonImprovingChecks+=1}if(nonImprovingChecks>=block.earlyStopping.patience){stoppedEarly=true;break}}}const finalParams=bestCheckpoint?{...bestCheckpoint.params}:{...params};const finalTraining=evaluateRows(trainRows,trainTemplates,finalParams);if(!finalTraining)return fail11("Final training metric evaluation failed.");lossHistory.push(finalTraining.loss);accuracyHistory.push(finalTraining.accuracy);paramHistory.push({...finalParams});let finalValidation=bestCheckpoint?.validation;if(!finalValidation){const latest=validationHistory.at(-1);finalValidation=latest?{loss:latest.loss,accuracy:latest.accuracy}:evaluateRows(validationRows,validationTemplates,finalParams)}if(!finalValidation)return fail11("Final validation metric evaluation failed.");if(circuitEvaluations>nmQmlTrainingControlLimits.maximumCircuitEvaluations){return fail11("Controlled training exceeded its circuit-evaluation budget.")}return{success:true,parameterNames,initialParams,finalParams,lossHistory,accuracyHistory,paramHistory,gradientMethod,circuitEvaluations,...lossEvidence2(),validationLoss:finalValidation.loss,validationAccuracy:finalValidation.accuracy,validationSamples:validationRows.length,trainingControls:{contractVersion:NM_QML_TRAINING_CONTROLS_CONTRACT_VERSION,requestedSteps,completedSteps,stoppedEarly,...stoppedEarly?{stopReason:"patience-exhausted"}:{},...block.validation?{validation:{split:"validation",every:block.validation.every,history:validationHistory}}:{},...block.earlyStopping&&earlyBest?{earlyStopping:{...block.earlyStopping,bestValue:earlyBest.value,bestStep:earlyBest.step,nonImprovingChecks}}:{},...block.scheduler?{scheduler:{...block.scheduler,learningRateHistory}}:{},...block.checkpoint&&bestCheckpoint?{checkpoint:{...block.checkpoint,bestValue:bestCheckpoint.value,bestStep:bestCheckpoint.step,restored:bestCheckpoint.step!==completedSteps}}:{}}}}function prepareNMDatasetSource(source,datasetId){return prepareNMClassifierDatasetSource(source,datasetId,"train")}function executeNMSupervisedTraining(execute,source,block,options={},parseOptions={},lossContext){parseOptions=snapshotNMQMLParseOptions(parseOptions);options={...options};block=structuredClone(block);if(block.customLoss&&!lossContext)return{success:false,error:NM_CUSTOM_LOSS_TRAINING_PENDING,parameterNames:[],initialParams:{},finalParams:{},costHistory:[],paramHistory:[]};const selectedDataset=block.datasetId?getNMEmbeddedDataset(block.datasetId):void 0;const dataset=selectedDataset?{...selectedDataset,featureNames:[...selectedDataset.featureNames]}:void 0;const parsed=parseNMCode(source,parseOptions);const empty8={parameterNames:[],initialParams:{},finalParams:{},costHistory:[],paramHistory:[]};if(lossContext){const binding=validateNMSupervisedLossBinding(lossContext,source,parseOptions);if(!binding.success)return{success:false,error:`${binding.code}: ${binding.error}`,...empty8};const directives=validateNMSupervisedLossTrainBlock(lossContext,block);if(!directives.success)return{success:false,error:`${directives.code}: ${directives.error}`,...empty8}}const lossEvidence2=()=>{const evidence=lossContext?readNMSupervisedLossEvidence(lossContext):void 0;return evidence?.success&&evidence.lossIdentity.kind==="custom"?{lossIdentity:evidence.lossIdentity,lossWork:evidence.work,...evidence.failure?{lossFailure:evidence.failure}:{}}:{}};if(!dataset)return{success:false,error:`Unknown embedded dataset: ${block.datasetId}.`,...empty8};const policyError=classicalFunctionTrainingError({...parsed,program:{...parsed.program,statements:[...parsed.program.statements,block]}},{...options,optimizer:options.optimizer??block.optimizer?.name??"gd"},{supervised:Boolean(lossContext)});if(policyError)return{success:false,error:policyError,...empty8};const trainRows=getNMEmbeddedDatasetRows(dataset.id,"train")?.map(row=>({...row,features:[...row.features]}));const validationRows=getNMEmbeddedDatasetRows(dataset.id,"validation")?.map(row=>({...row,features:[...row.features]}));const testRows=getNMEmbeddedDatasetRows(dataset.id,"test")?.map(row=>({...row,features:[...row.features]}));if(!trainRows?.length||!validationRows?.length||!testRows?.length)return{success:false,error:"NM-QML-DATASET-003: Dataset split contract is incomplete.",...empty8};let circuitEvaluations=0;const countedExecute=candidate=>{circuitEvaluations+=1;return execute(candidate,parseOptions)};const loss=block.loss??"mse";const hasTrainingControls=Boolean(block.validation||block.earlyStopping||block.scheduler||block.checkpoint);const controlledResult=hasTrainingControls?executeNMQmlControlledTrainingWithLoss(countedExecute,source,trainRows,validationRows,dataset.featureNames,block,options,parseOptions,lossContext):void 0;const result2=controlledResult??trainNMClassifierWithLoss(countedExecute,source,trainRows,dataset.featureNames,{steps:options.steps??block.steps,learningRate:options.learningRate??block.optimizer?.options.lr,loss,datasetId:dataset.id,optimizer:options.optimizer==="momentum"||options.optimizer==="adam"?options.optimizer:block.optimizer?.name==="momentum"||block.optimizer?.name==="adam"?block.optimizer.name:"gd",gradientMethod:options.gradientMethod,onProgress:options.onProgress},parseOptions,lossContext);if(!result2.success)return{success:false,error:result2.error,circuitEvaluations,...lossEvidence2(),...empty8};const validation=controlledResult?{success:true,samples:controlledResult.validationSamples??validationRows.length,loss:controlledResult.validationLoss??Number.NaN,accuracy:controlledResult.validationAccuracy??Number.NaN}:evaluateNMClassifierDatasetWithLoss(countedExecute,source,validationRows,dataset.featureNames,result2.finalParams,{loss,datasetId:dataset.id,datasetSplit:"validation"},parseOptions,lossContext);if(!validation.success||!Number.isFinite(validation.loss)||!Number.isFinite(validation.accuracy))return{success:false,error:"error"in validation?validation.error:"NM-QML-109: Controlled validation evidence is invalid.",circuitEvaluations,...lossEvidence2(),...empty8};const test=evaluateNMClassifierDatasetWithLoss(countedExecute,source,testRows,dataset.featureNames,result2.finalParams,{loss,datasetId:dataset.id,datasetSplit:"test"},parseOptions,lossContext);if(!test.success||!Number.isFinite(test.loss)||!Number.isFinite(test.accuracy))return{success:false,error:"error"in test?test.error:"NM-QML-DATASET-003: Test split evidence is invalid.",circuitEvaluations,...lossEvidence2(),...empty8};return{success:true,parameterNames:Object.keys(parsed.params),initialParams:result2.initialParams??parsed.params,finalParams:result2.finalParams,costHistory:result2.lossHistory,paramHistory:result2.paramHistory??[],gradientMethod:result2.gradientMethod,costHistoryKind:"exact",circuitEvaluations,datasetId:dataset.id,datasetVersion:dataset.version,datasetSplit:"train",trainSamples:trainRows.length,validationSamples:validation.samples,validationLoss:validation.loss,validationAccuracy:validation.accuracy,testSamples:test.samples,testLoss:test.loss,testAccuracy:test.accuracy,...block.customLoss?lossEvidence2():{loss},accuracyHistory:result2.accuracyHistory,finalAccuracy:result2.accuracyHistory.at(-1),trainingControls:controlledResult?.trainingControls}}function prepareNMComputeApplyRuntime(nodes,frame){const targets=createNMDynamicQubitTargetResolver(frame.statements);const values2=structuredClone(functionGateValues(frame.constants,frame.values));return captureNMComputeApplyOperations(nodes,gate=>resolveFunctionGateAngles(targets(gate,values2,frame.context),values2,frame.context))}function resolveNMComputeApplyStatement(statement,frame){const prepared2=prepareNMComputeApplyRuntime([computeApplyOperationTree(statement)],frame);if(prepared2.diagnostics.length)throw new Error(`${prepared2.diagnostics[0].code}: ${prepared2.diagnostics[0].message}`);return prepared2.operations}function createNMComputeApplyExecutor(timeline,sourceId2){let invocation3=0;return(statement,frame,run)=>{const operations=resolveNMComputeApplyStatement(statement,frame),id=++invocation3;operations.forEach((operation,operationIndex)=>{const before=timeline.length;try{run(operation.statement)}finally{for(let index=before;index<timeline.length;index++){const recorded=timeline[index];if(recorded.phase!=="gate"&&recorded.phase!=="barrier")continue;const event={version:"0.1",invocation:id,operationIndex,adjoint:operation.adjoint,phases:operation.phases.map(phase=>({...phase}))};recorded.computeApply=event;const origin2=operation.statement.computeApplyOrigin;if(sourceId2&&origin2){let id2=origin2.moduleId?.startsWith("workspace.")?`${origin2.moduleId.slice(10)}.nm`:origin2.moduleId?`library/${origin2.moduleId}.nm`:sourceId2;if(origin2.moduleId)while(id2===sourceId2)id2=`workspace/${id2}`;Object.assign(recorded,{sourceLocation:{sourceId:id2,line:origin2.range.start.line+1,column:origin2.range.start.column+1}})}}}})}}function classicalFunctionWorkspaceSnapshot(source,modules){let bytes2=new TextEncoder().encode(source).length;if(bytes2>nmClassicalFunctionLimits.sourceBytes)return void 0;if(modules===void 0)return{};const snapshot2=readFunctionWorkspaceModules(modules);if(!snapshot2)return void 0;for(const text of Object.values(snapshot2)){bytes2+=new TextEncoder().encode(text).length;if(bytes2>nmClassicalFunctionLimits.sourceBytes)return void 0}return{workspaceModules:snapshot2}}function classicalFunctionDataEqual(left,right,depth3=0){if(Object.is(left,right))return true;if(depth3>128||!left||!right||typeof left!=="object"||typeof right!=="object"||Array.isArray(left)!==Array.isArray(right))return false;if(Array.isArray(left)&&Array.isArray(right)&&left.length!==right.length)return false;const a=left,b=right;const keys3=Object.keys(a).filter(key4=>a[key4]!==void 0);return keys3.length===Object.keys(b).filter(key4=>b[key4]!==void 0).length&&keys3.every(key4=>Object.prototype.hasOwnProperty.call(b,key4)&&classicalFunctionDataEqual(a[key4],b[key4],depth3+1))}function preservedClassicalFunctionSource(program){const provenance=program.classicalFunctions;if(!provenance||provenance.contractVersion!==NM_CLASSICAL_FUNCTION_LOWERING_VERSION||typeof provenance.originalSource!=="string"||provenance.originalSource.length>nmClassicalFunctionLimits.sourceBytes||provenance.parseOptions?.experimental?.classicalFunctions!==true)return void 0;try{const snapshot2=classicalFunctionWorkspaceSnapshot(provenance.originalSource,provenance.parseOptions.workspaceModules);if(!snapshot2)return void 0;const parsed=parseNMCode(provenance.originalSource,{...provenance.parseOptions,...snapshot2});if(parsed.diagnostics.some(item=>item.severity==="error"||item.code.startsWith("NM-PARSE-")))return void 0;return classicalFunctionDataEqual(program,parsed.program)?provenance.originalSource:void 0}catch{return void 0}}function preservedNMComputeApplySource(program){try{const candidate=copyNMComputeApplyCarrierData(program),metadata=candidate.computeApply;if(!metadata||metadata.experimental!==true||metadata.contractVersion!==NM_COMPUTE_APPLY_VERSION||typeof metadata.originalSource!=="string"||metadata.originalSource.length>nmComputeApplyLimits.sourceBytes||new TextEncoder().encode(metadata.originalSource).length>nmComputeApplyLimits.sourceBytes||!metadata.parseOptions||metadata.parseOptions.experimental?.computeApply!==true)return;const options=snapshotNMComputeApplyParseOptions(metadata.parseOptions);if(!options||!classicalFunctionDataEqual(options,metadata.parseOptions))return;const parsed=parseNMCode(metadata.originalSource,options);if(parsed.diagnostics.some(item=>item.severity==="error"))return;return classicalFunctionDataEqual(candidate,copyNMComputeApplyCarrierData(parsed.program))?metadata.originalSource:void 0}catch{return void 0}}function preservedNMParameterGroupSource(program){const groups=program.parameterGroups;if(!groups||groups.contractVersion!==NM_PARAMETER_GROUPS_VERSION||groups.experimental!==true||groups.parseOptions?.experimental?.parameterGroups!==true||typeof groups.originalSource!=="string"||groups.originalSource.length>nmParameterGroupLimits.sourceBytes)return void 0;try{const snapshot2=classicalFunctionWorkspaceSnapshot(groups.originalSource,groups.parseOptions.workspaceModules);if(!snapshot2)return void 0;const parsed=parseNMCode(groups.originalSource,{experimental:{...groups.parseOptions.experimental},...snapshot2});if(parsed.diagnostics.some(item=>item.severity==="error"))return void 0;return classicalFunctionDataEqual(parsed.program,program)?groups.originalSource:void 0}catch{return void 0}}function createNMComptimeStructurePrintPlan(program){if(!program.comptimeStructures)return{issues:[]};const issues=validateNMComptimeStructureProvenance(program);if(issues.length>0)return{issues};const vectorAliases=new Map;for(const node of program.comptimeStructures.nodes){if(node.kind!=="vector-param")continue;node.scalarNames.forEach((alias,index)=>{vectorAliases.set(alias,`${node.name}[${index}]`)})}return{plan:{nodes:program.comptimeStructures.nodes,vectorAliases},issues}}function printNMComptimeStructureNode(node,indent){if(node.kind==="vector-param"){return[`${indent}param ${node.name}: Angle[${node.size.sourceExpression}] = [${node.elements.map(expression=>printNMComptimeAngleExpression(expression)).join(", ")}];`]}if(node.kind==="repeat"){return[`${indent}repeat ${node.count.sourceExpression} {`,...node.body.map(gate=>`${indent} ${printNMComptimeGateTemplate(gate)}`),`${indent}}`]}return[`${indent}for ${node.variable} in ${node.start.sourceExpression}..${node.endExclusive.sourceExpression} {`,...node.body.map(gate=>`${indent} ${printNMComptimeGateTemplate(gate,node.variable)}`),`${indent}}`]}function rewriteNMComptimeVectorAliases(source,aliases){if(!aliases||aliases.size===0||source.trim()==="")return source;let rewritten=source;for(const[alias,replacement]of[...aliases.entries()].sort(([left],[right])=>right.length-left.length)){rewritten=rewritten.replace(new RegExp(`\\b${escapeRegExp(alias)}\\b`,"gu"),replacement)}return rewritten}function printNMComptimeAngleExpression(expression){if(expression.kind==="literal")return formatNumber2(expression.value);if(expression.kind==="pi")return"PI";if(expression.kind==="scalar-reference")return expression.name;if(expression.kind==="vector-element"){return`${expression.name}[${expression.index}]`}if(expression.kind==="induction")return expression.name;if(expression.kind==="unary"){const operand2=expression.operand.kind==="binary"?`(${printNMComptimeAngleExpression(expression.operand)})`:printNMComptimeAngleExpression(expression.operand);return`${expression.operator}${operand2}`}return`(${printNMComptimeAngleExpression(expression.left)} ${expression.operator} ${printNMComptimeAngleExpression(expression.right)})`}function printNMComptimeGateTemplate(template,induction){const targets=template.targets.map(target2=>{if(!target2.index)return target2.register;if(target2.index.kind==="literal"){return`${target2.register}[${target2.index.value}]`}const offset=target2.index.offset;const index=offset===0?induction:`${induction} ${offset>0?"+":"-"} ${Math.abs(offset)}`;return`${target2.register}[${index}]`});const angles=template.angles.map(printNMComptimeAngleExpression);return`${template.gate}(${[...targets,...angles].join(", ")});`}function formatNumber2(value){return Number.isInteger(value)?value.toString():Number.parseFloat(value.toFixed(12)).toString()}function escapeRegExp(value){return value.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}var NMComptimeStructurePrintError=class extends Error{constructor(reason){super(`N/M comptime structure provenance is ${reason}.`);this.reason=reason;this.name="NMComptimeStructurePrintError"}};function printNMProgram(program,options={}){if(program.computeApply){const source=preservedNMComputeApplySource(program);if(source!==void 0)return source;throw new Error("NM-CAP-007: Compute/apply source no longer matches the program or cannot be replayed.")}if(program.parameterGroups){const source=preservedNMParameterGroupSource(program);if(source!==void 0)return source;throw new Error("NM-PGR-008: Parameter-group source no longer matches the program.")}if(program.classicalFunctions){const source=preservedClassicalFunctionSource(program);if(source===void 0)throw new Error("NM-CFN-011: Classical function source is missing, invalid, or differs from the program.");return source}const indent=options.indent??" ";const structurePlan=requireNMComptimeStructurePrintPlan(program);const lines=[];lines.push(`module ${program.moduleName??"program"};`);if(program.compiler?.trace!=null){lines.push(`@compiler(trace: ${program.compiler.trace?"true":"false"});`)}if(program.optimize){lines.push(`@optimize(method: "${program.optimize.optimizer}", steps: ${program.optimize.steps}, learningRate: ${formatNumber3(program.optimize.learningRate)}, objective: "${program.optimize.objective}");`)}if(program.estimate){const parts=[`code: "${program.estimate.code}"`,`distance: ${program.estimate.distance}`,program.estimate.targetError!=null?`target_error: ${formatNumber3(program.estimate.targetError)}`:void 0,program.estimate.physicalGateTimeNs!=null?`physical_gate_time_ns: ${formatNumber3(program.estimate.physicalGateTimeNs)}`:void 0].filter(part=>part!=null);lines.push(`@estimate(${parts.join(", ")});`)}program.goals?.forEach(goal=>lines.push(`@goal("${escapeString(goal.text)}");`));program.outcomes?.forEach(outcome=>lines.push(`@outcome("${escapeString(outcome.text)}");`));program.rubrics?.forEach(rubric=>{const weight=rubric.weight!=null?`, weight: ${formatNumber3(rubric.weight)}`:"";lines.push(`@rubric("${escapeString(rubric.text)}"${weight});`)});program.misconceptions?.forEach(misconception=>lines.push(`@misconception("${escapeString(misconception.text)}");`));program.quizzes?.forEach(quiz=>{const answer=quiz.answer?`, answer: "${escapeString(quiz.answer)}"`:"";lines.push(`@quiz("${escapeString(quiz.question)}"${answer});`)});program.labs?.forEach(lab=>{const minutes=lab.minutes!=null?`, minutes: ${lab.minutes}`:"";lines.push(`@lab("${escapeString(lab.id)}"${minutes});`)});program.challenges?.forEach(challenge=>{const difficulty=challenge.difficulty?`, difficulty: "${challenge.difficulty}"`:"";lines.push(`@challenge("${escapeString(challenge.id)}"${difficulty});`)});program.datasets?.forEach(dataset=>{const split=dataset.split?`, split: "${dataset.split}"`:"";lines.push(`@dataset("${escapeString(dataset.id)}"${split});`)});program.checkpoints?.forEach(checkpoint=>{const kind=checkpoint.kind?`, kind: "${checkpoint.kind}"`:"";lines.push(`@checkpoint("${escapeString(checkpoint.text)}"${kind});`)});program.hints?.forEach(hint=>lines.push(`@hint("${escapeString(hint.text)}");`));program.concepts?.forEach(concept=>lines.push(`@concept("${escapeString(concept.name)}");`));if(program.level){lines.push(`@level("${program.level.value}");`)}program.prerequisites?.forEach(prereq=>lines.push(`@prereq("${escapeString(prereq.name)}");`));if(program.target){lines.push(`@target("${program.target}");`)}if(program.constraints){const parts=[program.constraints.maxQubits!=null?`maxQubits: ${program.constraints.maxQubits}`:void 0,program.constraints.maxDepth!=null?`maxDepth: ${program.constraints.maxDepth}`:void 0,program.constraints.maxTwoQubit!=null?`maxTwoQubit: ${program.constraints.maxTwoQubit}`:void 0,program.constraints.connectivity?`connectivity: "${program.constraints.connectivity}"`:void 0].filter(part=>part!=null);lines.push(`@constraints(${parts.join(", ")});`)}if(program.targetCapabilityConstraints?.requirement){lines.push(formatNMTargetCapabilityConstraint(program.targetCapabilityConstraints.requirement))}if(program.semantics){lines.push(`@semantics("${program.semantics.mode}");`)}if(program.noise){lines.push(`@noise("${program.noise.model}", ${formatNumber3(program.noise.probability)});`)}if(program.mitigation){lines.push(`@mitigation("${program.mitigation.model}");`)}if(program.seed!=null){lines.push(`@seed(${program.seed});`)}if(program.expectationShots!=null){lines.push(`@shots(${program.expectationShots});`)}program.comptimeConstants?.declarations.filter(declaration=>!program.statements.some(statement=>statement.kind==="const"&&statement.name===declaration.name&&statement.line===declaration.line)).forEach(declaration=>lines.push(`const ${declaration.name}: Int = ${declaration.sourceExpression};`));lines.push("");lines.push(program.functionResults?`fn main() -> Result<${formatNMFunctionResultType(program.functionResults.resultType)}, Error> {`:"fn main() {");const comptimeUse=position=>program.comptimeConstants?.uses.find(use=>use.position===position)?.sourceExpression;if(program.typedCollection){lines.push(`${indent}collect<${comptimeUse("collect-count")??program.typedCollection.shots}> {`);lines.push(...printProgramStatements(program,`${indent}${indent}`,structurePlan));lines.push(`${indent}}`)}else if(program.sampleShots!=null){lines.push(`${indent}sample ${comptimeUse("sample-count")??program.sampleShots} {`);lines.push(...printProgramStatements(program,`${indent}${indent}`,structurePlan));lines.push(`${indent}}`)}else{lines.push(...printProgramStatements(program,indent,structurePlan))}lines.push("}");return lines.join("\n")}function requireNMComptimeStructurePrintPlan(program){if(hasNMComptimeStructureUses(program)&&!program.comptimeStructures){throw new NMComptimeStructurePrintError("missing")}const result2=createNMComptimeStructurePrintPlan(program);if(result2.issues.length>0||program.comptimeStructures&&!result2.plan){throw new NMComptimeStructurePrintError("invalid")}return result2.plan}function hasNMComptimeStructureUses(program){return program.comptimeConstants?.uses.some(({position})=>["vector-param-size","repeat-count","for-start","for-end"].includes(position))===true}function printProgramStatements(program,indent,plan){if(!plan)return printStatements(program.statements,indent);const lines=[];let statementIndex=0;let nodeIndex=0;while(statementIndex<program.statements.length||nodeIndex<plan.nodes.length){let consumedStructure=false;while(nodeIndex<plan.nodes.length){const node=plan.nodes[nodeIndex];const span3=node.kind==="vector-param"?node.declarationSpan:node.expansionSpan;if(span3.statementStart!==statementIndex)break;lines.push(...printNMComptimeStructureNode(node,indent));nodeIndex+=1;if(span3.statementCount>0){statementIndex+=span3.statementCount;consumedStructure=true;break}}if(consumedStructure)continue;const statement=program.statements[statementIndex];if(!statement)break;lines.push(...printNMStatement(statement,indent,plan.vectorAliases));statementIndex+=1}return lines}function printNMStatement(statement,indent="",vectorAliases){switch(statement.kind){case"computeApply":throw new Error("NM-CAP-007: Compute/apply printing requires its validated source carrier.");case"qreg":{const declared=statement.declaredSizeSource?.sourceExpression??statement.declaredSize;const allocated=statement.sizeSource?.sourceExpression??statement.size;const type=declared!=null?`: QReg<${declared}>`:"";return[`${indent}let ${statement.name}${type} = qreg[${allocated}];`]}case"const":{const type=statement.valueType?`: ${statement.valueType}`:"";return[`${indent}const ${statement.name}${type} = ${formatNumber3(statement.value)};`]}case"param":return[`${indent}param ${statement.name}: Angle = ${formatNumber3(statement.value)};`];case"explain":return[`${indent}@explain("${escapeString(statement.text)}");`];case"gate":return[`${indent}${printGateCallWithAliases(statement,vectorAliases)}`];case"measurement":{const basis=statement.basis?`${statement.basis} `:"";const expression=`measure ${basis}(${formatQubitRef(statement.target)})`;return statement.binding?[`${indent}let ${statement.binding}: Bit = ${expression};`]:[`${indent}${expression};`]}case"measurement-binding":{const type=statement.declaredWidth!=null?`: BitVec<${statement.declaredWidth}>`:"";return[`${indent}let ${statement.name}${type} = measure_all(${statement.operand.register}[${statement.operand.start}..${statement.operand.endInclusive}]);`]}case"assertBranchInvariant":return[`${indent}assert_branch_invariant(${statement.target.register}${statement.target.index!=null?`[${statement.target.index}]`:""});`];case"bitAssign":return[`${indent}let ${statement.name}: Bit = ${printBitExpression(statement.expression)};`];case"classicalDecl":return[`${indent}let ${statement.mutable?"mut ":""}${statement.name}: ${declaredTypeLabel(statement.valueType)} = ${formatNMTypedClassicalExpression(statement.expression)};`];case"classicalAssign":return[`${indent}${statement.name}${statement.index===void 0?"":`[${typeof statement.index==="number"?statement.index:formatNMTypedClassicalExpression(statement.index)}]`} = ${formatNMTypedClassicalExpression(statement.expression)};`];case"classicalFor":return[`${indent}for ${statement.index} in ${statement.start}..${statement.end} {`,...printStatements(statement.body,`${indent} `,vectorAliases),`${indent}}`];case"classicalMatchResult":return[`${indent}match (${formatNMTypedClassicalExpression(statement.selector)}) {`,`${indent} ok(${statement.okBinding}) => {`,...printStatements(statement.okBody,`${indent} `,vectorAliases),`${indent} }`,`${indent} error => {`,...printStatements(statement.errorBody,`${indent} `,vectorAliases),`${indent} }`,`${indent}}`];case"syndrome":return[`${indent}let ${statement.binding}: Bit = syndrome ${formatPauliFactors(statement.factors)};`];case"assertProbability":return[`${indent}assert probability(|${statement.state}>) ${statement.operator} ${formatNumber3(statement.expected)}${statement.tolerance!=null?` tolerance ${formatNumber3(statement.tolerance)}`:""};`];case"assertExpectation":return[`${indent}assert expectation ${formatPauliTerms(statement.terms)} ${statement.operator} ${formatNumber3(statement.expected)}${statement.tolerance!=null?` tolerance ${formatNumber3(statement.tolerance)}`:""};`];case"assertExpectationRange":return[`${indent}assert expectation ${formatPauliTerms(statement.terms)} in [${formatNumber3(statement.minimum)}, ${formatNumber3(statement.maximum)}];`];case"assertEntangled":return[`${indent}assert entangled(${formatQubitRef(statement.targets[0])}, ${formatQubitRef(statement.targets[1])});`];case"assertFidelity":return[`${indent}assert fidelity("${escapeString(statement.target)}") ${statement.operator} ${formatNumber3(statement.expected)};`];case"assertEquivalent":return[`${indent}assert equivalent("${escapeString(statement.target)}")${statement.phasePolicy==="global"?" up_to_phase":""};`];case"assertResource":return[`${indent}assert ${statement.metric} ${statement.operator} ${formatNumber3(statement.expected)};`];case"expectation":{const head=statement.binding?`let ${statement.binding} = `:"";return[`${indent}${head}expect ${formatPauliTerms(statement.terms)};`]}case"metric":return[`${indent}metric ${statement.name} = ${formatMetricExpression(statement.expression)};`];case"gradient":return[`${indent}let ${statement.binding} = gradient ${statement.target} wrt ${statement.parameter};`];case"encode":return[`${indent}encode(sample_row(${statement.row}), ${statement.register}, method: "${statement.method}");`];case"train":{const options=statement.optimizer?Object.entries(statement.optimizer.options).map(([name2,value])=>`${name2} = ${formatNumber3(value)}`):[];const optimizer=statement.optimizer?`${statement.optimizer.name}${options.length?`(${options.join(", ")})`:""}`:void 0;return[`${indent}train {`,`${indent} objective: ${statement.objective.mode} ${statement.objective.target};`,...optimizer?[`${indent} optimizer: ${optimizer};`]:[],...statement.steps!=null?[`${indent} steps: ${statement.steps};`]:[],...statement.customLoss?[`${indent} loss: custom(${statement.customLoss.name});`]:statement.loss?[`${indent} loss: ${statement.loss};`]:[],...statement.datasetId?[`${indent} dataset: ${statement.datasetId};`]:[],...statement.validation?[`${indent} validation: split = ${statement.validation.split}, every = ${statement.validation.every};`]:[],...statement.earlyStopping?[`${indent} early_stopping: metric = ${statement.earlyStopping.metric}, patience = ${statement.earlyStopping.patience}, min_delta = ${formatNumber3(statement.earlyStopping.minDelta)};`]:[],...statement.scheduler?[`${indent} scheduler: step(every = ${statement.scheduler.every}, factor = ${formatNumber3(statement.scheduler.factor)}${statement.scheduler.minimumLearningRate!=null?`, min_lr = ${formatNumber3(statement.scheduler.minimumLearningRate)}`:""});`]:[],...statement.checkpoint?[`${indent} checkpoint: ${statement.checkpoint.strategy}(metric = ${statement.checkpoint.metric});`]:[],`${indent}}`]}case"reset":return[`${indent}reset ${formatQubitRef(statement.target)};`];case"barrier":return[`${indent}barrier;`];case"show":return[`${indent}show ${statement.subject};`];case"return":return[`${indent}return ${statement.functionResult?formatNMFunctionResultExpression(statement.functionResult,formatNMTypedClassicalExpression):statement.expression};`];case"if":{const condition=statement.condition?formatNMTypedClassicalExpression(statement.condition):statement.predicate?formatNMClassicalPredicate(statement.predicate):`${statement.binding} ${statement.operator} ${statement.value}`;const lines=[`${indent}if (${condition}) {`];lines.push(...printStatements(statement.body,`${indent} `,vectorAliases));if(statement.elseBody?.length){lines.push(`${indent}} else {`);lines.push(...printStatements(statement.elseBody,`${indent} `,vectorAliases))}lines.push(`${indent}}`);return lines}case"until":{const lines=[`${indent}until (${statement.binding} ${statement.operator} ${statement.value}) max ${statement.maxIterations} {`];lines.push(...printStatements(statement.body,`${indent} `,vectorAliases));lines.push(`${indent}}`);return lines}case"match":{const lines=[`${indent}match (${statement.bindings.join(", ")}) {`];for(const matchCase of statement.cases){lines.push(`${indent} (${matchCase.pattern.join(", ")}) => {`);lines.push(...printStatements(matchCase.body,`${indent} `,vectorAliases));lines.push(`${indent} }`)}lines.push(`${indent}}`);return lines}case"observe":{const lines=[`${indent}observe ${statement.name} {`];lines.push(...printStatements(statement.body,`${indent} `,vectorAliases));lines.push(`${indent}}`);return lines}case"test":{const lines=[`${indent}test "${escapeString(statement.name)}" {`];lines.push(...printStatements(statement.body,`${indent} `,vectorAliases));lines.push(`${indent}}`);return lines}case"snapshot":{const lines=[`${indent}snapshot "${escapeString(statement.name)}" {`];lines.push(...printStatements(statement.body,`${indent} `,vectorAliases));lines.push(`${indent}}`);return lines}case"property":return[`${indent}// property block is preserved in IR but not printable in this formatter slice.`]}}function printGateCall(gate){return printGateCallWithAliases(gate)}function printGateCallWithAliases(gate,vectorAliases){const targets=gate.targets.map(formatQubitRef);if(gate.gate==="GPhase"){return`GPhase(${formatAngle(gate,vectorAliases)});`}if(gate.angles&&gate.angles.length>0){const angles=gate.angles.map((angle,index)=>{const name2=gate.angleNames?.[index];return name2&&name2.trim()?rewriteNMComptimeVectorAliases(name2,vectorAliases):formatNumber3(angle)});return`${gate.gate}(${[...targets,...angles].join(", ")});`}if(gate.theta!=null){return`${gate.gate}(${[...targets,formatAngle(gate,vectorAliases)].join(", ")});`}return`${gate.gate}(${targets.join(", ")});`}function formatQubitRef(ref2){if(ref2.classicalIndex)return`${ref2.register}[${formatNMTypedClassicalExpression(ref2.classicalIndex)}]`;return ref2.index==null?ref2.register:`${ref2.register}[${ref2.index}]`}function printStatements(statements,indent,vectorAliases){return statements.flatMap(statement=>printNMStatement(statement,indent,vectorAliases))}function printBitExpression(expression){switch(expression.kind){case"literal":return expression.value.toString();case"ref":return expression.name;case"not":return`not ${printBitExpression(expression.expression)}`;case"binary":return`${printBitExpression(expression.left)} ${expression.operator} ${printBitExpression(expression.right)}`}}function formatMetricExpression(expression){switch(expression.kind){case"probability":return`probability(|${expression.state}>)`;case"expectation":return`expect ${formatPauliTerms(expression.terms)}`}}function formatPauliTerms(terms){if(terms.length===0){return"I"}return terms.map((term,index)=>{const sign=term.coeff<0?"-":index===0?"":"+";const source=formatPauliTermMagnitude(term);return sign?`${sign} ${source}`:source}).join(" ")}function formatPauliTermMagnitude(term){const coeff=Math.abs(term.coeff);const factors=formatPauliFactors(term.factors);if(factors==="I"){return coeff===1?"I":`${formatNumber3(coeff)} * I`}return coeff===1?factors:`${formatNumber3(coeff)} * ${factors}`}function formatPauliFactors(factors){if(factors.length===0){return"I"}return factors.map(factor=>`${factor.observable}(${formatQubitRef(factor.target)})`).join(" ")}function formatAngle(gate,vectorAliases){return gate.thetaName&&gate.thetaName.trim()?rewriteNMComptimeVectorAliases(gate.thetaName,vectorAliases):formatNumber3(gate.theta??0)}function formatNumber3(value){return formatNMSourceNumber(value)}function escapeString(value){return value.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function measurementColumn(statement,rows,indexByLabel){const{register,start,endInclusive}=statement.operand;if(!isBoundedNMMeasurementSlice(start,endInclusive)||statement.width!==endInclusive-start+1)return void 0;const cells=rows.map(()=>({label:"",kind:"empty"}));for(let offset=0;offset<statement.width;offset+=1){const target2=indexByLabel.get(`${register}[${start+offset}]`);if(target2!=null)cells[target2]={label:"M",kind:"measure"}}return cells.some(cell=>cell.kind==="measure")?cells:void 0}function dynamicTargetColumn(gate,rows){if(!gate.targets.some(target2=>target2.classicalIndex))return void 0;return rows.map(row=>row.label==="q[?]"?{label:`${gate.gate}(${gate.targets.map(formatQubitRef).join(", ")})`,kind:"gate"}:{label:"",kind:"empty"})}function mainResultColumn(statement,rows){if(statement.kind!=="classicalMatchResult")return void 0;return rows.map(row=>row.label==="Result<?>"?{label:`match (${formatNMTypedClassicalExpression(statement.selector)}): ok(${statement.okBinding}) | error`,kind:"gate"}:{label:"",kind:"empty"})}function createCircuitDiagram(statements){const qubitLabels=[];for(const statement of statements){if(statement.kind!=="qreg"){continue}for(let i=0;i<statement.size;i+=1){qubitLabels.push({label:`${statement.name}[${i}]`,index:qubitLabels.length})}}const rows=qubitLabels.map(qubit3=>({label:qubit3.label,cells:[]}));const indexByLabel=new Map(qubitLabels.map(qubit3=>[qubit3.label,qubit3.index]));if(hasNMMainDynamicTarget(statements))rows.push({label:"q[?]",cells:[]});if(hasNMMainResult(statements))rows.push({label:"Result<?>",cells:[]});const addColumn=cells=>{rows.forEach((row,index)=>{row.cells.push(cells[index]??{label:"",kind:"empty"})})};const drawWire=(cells,a,b)=>{for(let index=Math.min(a,b);index<=Math.max(a,b);index+=1){cells[index]={label:"|",kind:"wire"}}};const renderGate=statement=>{const pending=dynamicTargetColumn(statement,rows);if(pending){addColumn(pending);return}const cells=rows.map(()=>({label:"",kind:"empty"}));if(statement.gate==="GPhase"){if(cells.length>0){cells[0]={label:"GPhase",kind:"gate"};addColumn(cells)}return}if(statement.gate==="CNOT"||statement.gate==="CZ"||statement.gate==="CY"||statement.gate==="CH"){const control=indexByLabel.get(qubitRefKey3(statement.targets[0]));const target3=indexByLabel.get(qubitRefKey3(statement.targets[1]));if(control==null||target3==null){return}const targetLabel=statement.gate==="CNOT"?"X":statement.gate==="CZ"?"Z":statement.gate==="CY"?"Y":"H";drawWire(cells,control,target3);cells[control]={label:"C",kind:"control"};cells[target3]={label:targetLabel,kind:"target"};addColumn(cells);return}if(statement.gate==="SWAP"||statement.gate==="iSWAP"){const a=indexByLabel.get(qubitRefKey3(statement.targets[0]));const b=indexByLabel.get(qubitRefKey3(statement.targets[1]));if(a==null||b==null){return}drawWire(cells,a,b);cells[a]={label:statement.gate==="SWAP"?"x":"iS",kind:"target"};cells[b]={label:statement.gate==="SWAP"?"x":"iS",kind:"target"};addColumn(cells);return}if(statement.gate==="CCNOT"||statement.gate==="CSWAP"){const c1=indexByLabel.get(qubitRefKey3(statement.targets[0]));const c2=indexByLabel.get(qubitRefKey3(statement.targets[1]));const target3=indexByLabel.get(qubitRefKey3(statement.targets[2]));if(c1==null||c2==null||target3==null){return}drawWire(cells,Math.min(c1,c2,target3),Math.max(c1,c2,target3));cells[c1]={label:"C",kind:"control"};cells[c2]={label:statement.gate==="CSWAP"?"x":"C",kind:statement.gate==="CSWAP"?"target":"control"};cells[target3]={label:statement.gate==="CSWAP"?"x":"X",kind:"target"};addColumn(cells);return}if(statement.gate==="CRy"||statement.gate==="CRz"||statement.gate==="CP"){const control=indexByLabel.get(qubitRefKey3(statement.targets[0]));const target3=indexByLabel.get(qubitRefKey3(statement.targets[1]));if(control==null||target3==null){return}drawWire(cells,control,target3);cells[control]={label:"C",kind:"control"};cells[target3]={label:statement.gate==="CP"?"P":statement.gate.slice(1),kind:"target"};addColumn(cells);return}if(statement.gate==="RXX"||statement.gate==="RYY"||statement.gate==="RZZ"){const a=indexByLabel.get(qubitRefKey3(statement.targets[0]));const b=indexByLabel.get(qubitRefKey3(statement.targets[1]));if(a==null||b==null){return}drawWire(cells,a,b);cells[a]={label:statement.gate,kind:"gate"};cells[b]={label:statement.gate,kind:"gate"};addColumn(cells);return}const target2=indexByLabel.get(qubitRefKey3(statement.targets[0]));if(target2==null){return}cells[target2]={label:statement.gate,kind:"gate"};addColumn(cells)};const renderStatements=list=>{for(const statement of list){const resultMatch=mainResultColumn(statement,rows);if(resultMatch){addColumn(resultMatch);continue}if(statement.kind==="gate"){renderGate(statement);continue}if(statement.kind==="measurement"||statement.kind==="reset"){const target2=indexByLabel.get(qubitRefKey3(statement.target));if(target2==null){continue}const cells=rows.map(()=>({label:"",kind:"empty"}));const label3=statement.kind==="measurement"?`M${statement.basis??""}`:"R";cells[target2]={label:label3,kind:"measure"};addColumn(cells);continue}if(statement.kind==="measurement-binding"){const cells=measurementColumn(statement,rows,indexByLabel);if(cells)addColumn(cells);continue}if(statement.kind==="syndrome"){const targets=statement.factors.map(factor=>indexByLabel.get(qubitRefKey3(factor.target))).filter(target2=>target2!=null);if(targets.length===0){continue}const cells=rows.map(()=>({label:"",kind:"empty"}));drawWire(cells,Math.min(...targets),Math.max(...targets));for(const target2 of targets){cells[target2]={label:"S",kind:"measure"}}addColumn(cells);continue}if(statement.kind==="computeApply"){renderStatements(computeApplyProjection(statement));continue}if(statement.kind==="if"){renderStatements(statement.body);if(statement.elseBody){renderStatements(statement.elseBody)}continue}if(statement.kind==="classicalFor"||statement.kind==="until"){if(statement.kind==="classicalFor")addColumn(rows.map(()=>({label:`for ${statement.index}: ${statement.start}..${statement.end}`,kind:"gate"})));renderStatements(statement.body);if(statement.kind==="classicalFor")addColumn(rows.map(()=>({label:"end for",kind:"gate"})));continue}if(statement.kind==="match"){statement.cases.forEach(matchCase=>renderStatements(matchCase.body))}}};renderStatements(statements);return rows}function escapeQuantikzLabel(value){return value.replace(/\\/g,"\\textbackslash{}").replace(/_/g,"\\_").replace(/&/g,"\\&").replace(/%/g,"\\%").replace(/\$/g,"\\$").replace(/#/g,"\\#").replace(/\{/g,"\\{").replace(/\}/g,"\\}")}function quantikzCell(cells,rowIndex){const cell=cells[rowIndex]??{label:"",kind:"empty"};if(cell.kind==="empty"||cell.kind==="wire"){return"\\qw"}if(cell.kind==="gate"){return`\\gate{${escapeQuantikzLabel(cell.label)}}`}if(cell.kind==="measure"){return cell.label==="R"?"\\gate{R}":"\\meter{}"}if(cell.kind==="control"){const targetIndex=cells.findIndex((candidate,index)=>index!==rowIndex&&candidate.kind==="target");const offset=targetIndex>=0?targetIndex-rowIndex:1;return`\\ctrl{${offset}}`}if(cell.kind==="target"){const hasControl=cells.some(candidate=>candidate.kind==="control");if(hasControl&&cell.label==="X"){return"\\targ{}"}return`\\gate{${escapeQuantikzLabel(cell.label)}}`}return"\\qw"}function circuitDiagramToQuantikz(diagram){if(diagram.length===0){return""}const columnCount=Math.max(...diagram.map(row=>row.cells.length),0);if(columnCount===0){return""}const rows=diagram.map((row,rowIndex)=>{const cellsForRow=Array.from({length:columnCount},(_,columnIndex)=>{const columnCells=diagram.map(diagramRow=>diagramRow.cells[columnIndex]??{label:"",kind:"empty"});return quantikzCell(columnCells,rowIndex)});return`\\lstick{${escapeQuantikzLabel(row.label)}} & ${cellsForRow.join(" & ")} & \\qw`});return["\\begin{quantikz}",...rows.map((row,index)=>`${row}${index===rows.length-1?"":" \\\\"}`),"\\end{quantikz}"].join("\n")}var NM_STABILIZER_SCALE_VISUALIZATION_CONTRACT_VERSION="0.1";var nmStabilizerScaleVisualizationLimits={minimumQubits:13,maximumQubits:100,maximumSyndromeEvents:4096};var pauliPattern=/^[IXYZ]+$/u;function parseGenerator(generator,qubits,index){const sign=generator[0];const paulis=generator.slice(1);if(sign!=="+"&&sign!=="-"||paulis.length!==qubits||!pauliPattern.test(paulis)){throw new Error(`Invalid stabilizer generator g[${index}] for ${qubits}-qubit visualization.`)}const cells=[...paulis];return{generator:index,phase:sign==="+"?1:-1,weight:cells.filter(cell=>cell!=="I").length,cells}}function createGraphAdjacency(rows,qubits){const rowByPivot=new Map;for(const row of rows){if(row.cells.includes("Y")){return{status:"not-canonical",reason:"y-support"}}const pivots=row.cells.flatMap((cell,qubit3)=>cell==="X"?[qubit3]:[]);if(pivots.length!==1||rowByPivot.has(pivots[0])){return{status:"not-canonical",reason:"non-unique-x-pivot"}}rowByPivot.set(pivots[0],row)}if(rowByPivot.size!==qubits){return{status:"not-canonical",reason:"incomplete-x-basis"}}const nodes=Array.from({length:qubits},(_,qubit3)=>{const row=rowByPivot.get(qubit3);const neighbors=row.cells.flatMap((cell,candidate)=>cell==="Z"?[candidate]:[]);if(neighbors.includes(qubit3)){return void 0}return{qubit:qubit3,neighbors,byproductZ:row.phase===-1}});if(nodes.some(node=>node==null)){return{status:"not-canonical",reason:"self-loop"}}const exactNodes=nodes.filter(node=>node!=null);for(const node of exactNodes){if(node.neighbors.some(neighbor=>!exactNodes[neighbor]?.neighbors.includes(node.qubit))){return{status:"not-canonical",reason:"asymmetric-adjacency"}}}const edges=exactNodes.flatMap(node=>node.neighbors.filter(neighbor=>node.qubit<neighbor).map(neighbor=>({source:node.qubit,target:neighbor})));return{status:"canonical",nodes:exactNodes,edges}}function cloneSyndromeHistory(history,previouslyOmitted){if(!Number.isSafeInteger(previouslyOmitted)||previouslyOmitted<0){throw new Error("The omitted syndrome-event count must be a non-negative safe integer.")}const captured=history.slice(0,nmStabilizerScaleVisualizationLimits.maximumSyndromeEvents);const events=captured.map((event,index)=>{if(event.index!==index||!Number.isSafeInteger(event.line)||event.line<1||!Number.isFinite(event.probability)||event.probability<0||event.probability>1){throw new Error(`Invalid syndrome visualization event at index ${index}.`)}return{...event}});return{events,omitted:previouslyOmitted+history.length-captured.length}}function shouldUseNMStabilizerScaleVisualization(qubits){return Number.isSafeInteger(qubits)&&qubits>=nmStabilizerScaleVisualizationLimits.minimumQubits&&qubits<=nmStabilizerScaleVisualizationLimits.maximumQubits}function createNMStabilizerScaleVisualization(summary,syndromeHistory=[],syndromeHistoryOmitted=0){if(!shouldUseNMStabilizerScaleVisualization(summary.qubits)){return void 0}if(summary.generators.length!==summary.qubits||summary.qubits>summary.maxSupportedQubits){throw new Error("Stabilizer visualization requires one generator per supported qubit.")}const rows=summary.generators.map((generator,index)=>parseGenerator(generator,summary.qubits,index));const history=cloneSyndromeHistory(syndromeHistory,syndromeHistoryOmitted);return{contractVersion:NM_STABILIZER_SCALE_VISUALIZATION_CONTRACT_VERSION,qubits:summary.qubits,denseCircuitDiagramOmitted:true,tableau:{columns:Array.from({length:summary.qubits},(_,qubit3)=>qubit3),rows},graph:createGraphAdjacency(rows,summary.qubits),syndromeHistory:history.events,syndromeHistoryOmitted:history.omitted}}function createNMExpectationRuntime(output,trace,random,shots,bind){const expectations=Object.create(null),estimates=Object.create(null);let cost3;return{expectations,estimates,get cost(){return cost3},run(statement,evaluate){const terms=statement.terms.map(term=>{const expectation=term.factors.length?evaluate(term.factors):1;if(!Number.isFinite(expectation)||Math.abs(expectation)>1+1e-8||!Number.isFinite(term.coeff))throw new Error("Invalid Pauli expectation value");return{coeff:term.coeff,expectation:Math.max(-1,Math.min(1,expectation)),label:term.factors.map(factor=>`${factor.observable}(q${expectationQubitIndex(factor.target)})`).join("")||"I"}});const evaluated={value:terms.reduce((sum,term)=>sum+term.coeff*term.expectation,0),terms,labels:terms.map(term=>`${term.coeff>=0?"+":"-"}${Math.abs(term.coeff)}\xB7${term.label}`)};const estimate=shots===void 0?void 0:estimateExpectationFromShots(evaluated,shots,random),value=estimate?.value??evaluated.value;if(!Number.isFinite(value))throw new Error("Expectation result must be finite");bind(statement,value);cost3=value;const key4=statement.binding??"<H>";expectations[key4]=value;if(estimate)estimates[key4]=estimate;output.push(`Expectation ${evaluated.labels.join(" ")} = ${value.toFixed(4)}${estimate?` (${estimate.shots} shots, analytic ${estimate.analytic.toFixed(4)}, SE ${estimate.standardError.toFixed(4)})`:""}`);trace.push(`line ${statement.line}: expect ${evaluated.labels.join(" ")}${estimate?` shots=${estimate.shots}`:""} -> ${value.toFixed(4)}`)}}}function createEphemeralNMFeedForwardSeed(){if(typeof globalThis.crypto?.getRandomValues==="function"){const values2=new Uint32Array(1);globalThis.crypto.getRandomValues(values2);return values2[0]}return Math.floor(Math.random()*4294967296)}function createNMFeedForwardRuntime(declaredSeed,enabled,verification={tier:2,label:"sampled"}){const effectiveSeed=enabled?declaredSeed??createEphemeralNMFeedForwardSeed():declaredSeed;let source=effectiveSeed!=null?createSeededRandom(effectiveSeed):Math.random;let randomDraws=0;const outcomes=[];const branchesTaken=[];return{effectiveSeed,random:(()=>{if(enabled)randomDraws+=1;return source()}),replaceSource(next){source=next},currentSource(){return source},recordOutcome(bit){if(enabled)outcomes.push(bit===1?1:0)},recordBranch(taken){if(enabled)branchesTaken.push(taken)},branchRecord(){if(!enabled||effectiveSeed==null)return void 0;return{contractVersion:NM_FEED_FORWARD_CONTRACT_VERSION,seed:effectiveSeed.toString(),outcomes:[...outcomes],branchesTaken:[...branchesTaken],randomDraws,verification}}}}function runNMStabilizerRuntimeSummary(context){const{eligibility,parsed,resources,output,trace,stateTimeline,measurements,assertTimelineCapacity,feedForwardSeedOverride,feedForwardVerification,learningTimelineAnnotations,recordSyndromeHistory,syndromeHistory,getSyndromeHistoryOmitted,circuitDiagram,quantikzCircuit,buildChallengeResults,appendChallengeResults,buildTestResults,appendTestResults,buildPropertyResults,appendPropertyResults,appendSnapshotResults,snapshotResults,resultFields,executionProvenance,startTime}=context;const tableau=createNMStabilizerTableau(parsed.numQubits);const feedForwardRuntime=createNMFeedForwardRuntime(feedForwardSeedOverride??parsed.program.seed,parsed.program.feedForward!=null,feedForwardVerification);const random=feedForwardRuntime.random;const classicalBits={};const classicalPredicateValues={};const functionDebug=createFunctionDebugBridge(context.debugSourceId,parsed.program,stateTimeline,()=>classicalRuntime.values);const classicalRuntime=createNMTypedClassicalRuntimeStore(functionDebug?.context,usesNMMainMutableControl(parsed.program.statements),parsed.program.statements.filter(statement=>statement.kind==="qreg").map(statement=>statement.name));const resolveDynamicTargets=createNMDynamicQubitTargetResolver(parsed.program.statements);let programResult;const mainControl=createMainControlRuntime(classicalRuntime.values,()=>programResult,functionDebug,classicalRuntime);const expectationRuntime=createNMExpectationRuntime(output,trace,random,parsed.program.expectationShots,(statement,value)=>{if(parsed.program.typedClassicalValues)classicalRuntime.bindExpectation(statement,value)});let sampleSourceTableau;const formatQubitRef2=ref2=>ref2.resolvedIndex!=null?`q[${ref2.resolvedIndex}]`:ref2.index!=null?`${ref2.register}[${ref2.index}]`:ref2.register;const formatGateLabel=statement=>{const targets=statement.targets.map(formatQubitRef2).join(", ");return targets?`${statement.gate} ${targets}`:statement.gate};const runComputeApply=createNMComputeApplyExecutor(stateTimeline,context.debugSourceId);const recordStabilizerTimeline=(phase,label3,line,explanation,branchDecision,localization)=>{const generators2=formatNMStabilizerGenerators(tableau);const previousGenerators=stateTimeline.at(-1)?.stabilizerGenerators??[];const stabilizerGeneratorDeltas=generators2.map((current,index)=>{const previous=previousGenerators[index];return previous!=null&&previous!==current?{index,previous,current}:void 0}).filter(delta=>delta!=null);assertTimelineCapacity();stateTimeline.push({index:stateTimeline.length,phase,label:label3,...explanation?{explanation}:{},...localization,...line!=null?{line}:{},probabilities:[],probabilityDeltas:[],blochVectors:[],blochVectorDeltas:[],engine:"stabilizer",stabilizerGenerators:generators2,stabilizerGeneratorDeltas,...branchDecision?{branchDecision}:{}})};output.push(`Initialized ${parsed.numQubits}-qubit quantum register`);output.push("Simulation engine: stabilizer tableau");output.push(`Resources: depth ${resources.depth}, gates ${resources.gates} (${resources.twoQubitGates} two-qubit), measurements ${resources.measurements}`);output.push(`Target backend: ${parsed.program.target??"browser-stabilizer"}`);output.push(eligibility.diagnosticMessage);if(parsed.program.seed!=null){output.push(`Seed: ${parsed.program.seed} (deterministic sampling)`);trace.push(`runtime:seed ${parsed.program.seed}`)}else if(feedForwardRuntime.effectiveSeed!=null){output.push(`Feed-forward seed: ${feedForwardRuntime.effectiveSeed} (recorded for replay)`);trace.push(`runtime:feed-forward-seed ${feedForwardRuntime.effectiveSeed}`)}if(parsed.program.sampleShots!=null){output.push(`Sample mode: ${parsed.program.sampleShots} shots requested`);trace.push(`runtime:sample shots=${parsed.program.sampleShots}`)}trace.push(`runtime:init qubits=${parsed.numQubits}`);trace.push("runtime:engine stabilizer");trace.push(`runtime:target ${parsed.program.target??"browser-stabilizer"}`);trace.push(`runtime:resources depth=${resources.depth} gates=${resources.gates} twoQubit=${resources.twoQubitGates} measurements=${resources.measurements}`);recordStabilizerTimeline("init",`Initialized ${parsed.numQubits}-qubit stabilizer tableau`,void 0,"The stabilizer register starts with one Z generator per |0> qubit.");learningTimelineAnnotations.forEach(annotation=>{trace.push(`line ${annotation.line}: learning annotation ${annotation.kind}`);recordStabilizerTimeline("annotation",annotation.label,annotation.line,`${annotation.kind} annotation marks learner guidance without changing the stabilizer tableau.`)});const runStabilizerStatement=statement=>mainControl.statement(statement,()=>runStabilizerStatementBody(statement));const runStabilizerStatementBody=statement=>{switch(statement.kind){case"const":if(parsed.program.typedClassicalValues){classicalRuntime.bindConstant(statement.name,statement.valueType==="Int"?"Int":"Float",statement.value)}return;case"param":if(parsed.program.typedClassicalValues)classicalRuntime.bindConstant(statement.name,"Float",statement.value);return;case"computeApply":{runComputeApply(statement,{statements:parsed.program.statements,constants:parsed.constants,values:classicalRuntime.values,context:classicalRuntime.context},runStabilizerStatement);return}case"gate":{const resolved=resolveFunctionGateAngles(resolveDynamicTargets(statement,classicalRuntime.values,classicalRuntime.context),functionGateValues(parsed.constants,classicalRuntime.values),classicalRuntime.context);const result2=applyNMStabilizerGate(tableau,resolved);if(!result2.applied)throw new Error(result2.reason);output.push(`Applied ${formatGateLabel(resolved)} on stabilizer tableau`);trace.push(`line ${resolved.line}: stabilizer gate ${formatGateLabel(resolved)}`);recordStabilizerTimeline("gate",formatGateLabel(resolved),statement.line,`${statement.gate} updates the stabilizer generator set without allocating a state vector.`);return}case"measurement":{const qubitIdx=statement.target.resolvedIndex??statement.target.index;if(qubitIdx==null)return;sampleSourceTableau??(sampleSourceTableau=cloneNMStabilizerTableau(tableau));const basis=statement.basis??"Z";const result2=measureNMStabilizerQubit(tableau,qubitIdx,basis,random);if(parsed.program.feedForward==null&&result2.deterministic)random();measurements.push({state:result2.state,probability:result2.probability,basis});if(statement.binding){const value=Number.parseInt(result2.state,10);classicalBits[statement.binding]=value;classicalPredicateValues[statement.binding]=[value===1?1:0];classicalRuntime.bindBit(statement.binding,value)}feedForwardRuntime.recordOutcome(Number.parseInt(result2.state,10));const basisLabel2=basis==="Z"?"":` in ${basis} basis`;const deterministicLabel=result2.deterministic?", deterministic":"";output.push(`Measured qubit ${qubitIdx}${basisLabel2}: |${result2.state}> (p=${(result2.probability*100).toFixed(1)}%${deterministicLabel})`);trace.push(`line ${statement.line}: stabilizer measure ${basis}(q${qubitIdx}) -> ${result2.state}`);recordStabilizerTimeline("measurement",`measure ${basis}(${formatQubitRef2(statement.target)})`,statement.line,"Measurement updates the stabilizer generator set instead of collapsing amplitudes.");return}case"expectation":{expectationRuntime.run(statement,factors=>{const result2=measureNMStabilizerPauliString(cloneNMStabilizerTableau(tableau),factors,()=>0);return result2.deterministic?result2.eigenvalue:0});return}case"measurement-binding":{const bits=[];sampleSourceTableau??(sampleSourceTableau=cloneNMStabilizerTableau(tableau));for(let offset=0;offset<statement.width;offset+=1){const qubitIdx=statement.operand.resolvedIndices?.[offset]??nmMeasurementSliceIndex(statement.operand,offset);const result2=measureNMStabilizerQubit(tableau,qubitIdx,"Z",random);const bit=Number.parseInt(result2.state,10)===1?1:0;bits.push(bit);feedForwardRuntime.recordOutcome(bit);measurements.push({state:result2.state,probability:result2.probability,basis:"Z"})}classicalPredicateValues[statement.name]=bits;classicalRuntime.bindBitVec(statement.name,bits,statement.line);output.push(`Measured ${statement.name}: BitVec<${statement.width}> = 0b${bits.join("")}`);trace.push(`line ${statement.line}: stabilizer measure_all ${formatNMMeasurementSlice(statement.operand)} -> ${bits.join("")}`);recordStabilizerTimeline("measurement",`measure_all ${statement.name}`,statement.line,"Vector measurement projects each qubit in source-slice order and records one BitVec result.");return}case"syndrome":{const factors=statement.factors.map(factor=>({qubit:factor.target.resolvedIndex??factor.target.index??0,pauli:factor.observable}));sampleSourceTableau??(sampleSourceTableau=cloneNMStabilizerTableau(tableau));const result2=measureNMStabilizerPauliString(tableau,statement.factors,random);if(parsed.program.feedForward==null&&result2.deterministic)random();classicalBits[statement.binding]=result2.bit;classicalPredicateValues[statement.binding]=[result2.bit];classicalRuntime.bindBit(statement.binding,result2.bit);feedForwardRuntime.recordOutcome(result2.bit);const eigen=result2.eigenvalue===1?"+1":"-1";recordSyndromeHistory({line:statement.line,binding:statement.binding,pauli:pauliStringLabel(factors),bit:result2.bit,eigenvalue:result2.eigenvalue,probability:result2.probability,deterministic:result2.deterministic});output.push(`Syndrome ${statement.binding} = ${result2.bit} for ${pauliStringLabel(factors)} (${eigen}, p=${(result2.probability*100).toFixed(1)}%)`);trace.push(`line ${statement.line}: stabilizer syndrome ${statement.binding} ${pauliStringLabel(factors)} -> ${result2.bit}`);recordStabilizerTimeline("syndrome",`syndrome ${statement.binding}`,statement.line,"Syndrome measurement projects a Pauli string into a classical stabilizer check bit.");return}case"assertProbability":{const actual=getNMStabilizerBasisStateProbability(tableau,statement.state);const passed=compareProbability(actual,statement.operator,statement.expected);const assertionText=`P(|${statement.state}>) ${statement.operator} ${statement.expected}`;if(!passed){parsed.diagnostics.push(createDiagnostic({code:"NM-ASSERT-001",severity:"error",message:`Assertion failed: ${assertionText}. Actual probability is ${actual.toFixed(4)}.`,hint:"Move the assertion before measurement or update the expected probability.",translationKey:"assertionFailed",translationValues:{assertion:assertionText,actual:actual.toFixed(4)},line:statement.line}));throw new Error(diagnosticsToError(parsed.diagnostics))}output.push(`Assertion passed: ${assertionText} (actual ${actual.toFixed(4)})`);trace.push(`line ${statement.line}: stabilizer assert probability |${statement.state}> actual=${actual.toFixed(4)}`);return}case"bitAssign":{const value=evaluateBitExpression(statement.expression,classicalBits);classicalBits[statement.name]=value;classicalPredicateValues[statement.name]=[value===1?1:0];classicalRuntime.bindBit(statement.name,value);output.push(`Classical Bit ${statement.name} = ${value} (${formatBitExpression(statement.expression)})`);trace.push(`line ${statement.line}: stabilizer bit ${statement.name}=${value}`);return}case"classicalAssign":case"classicalDecl":{const result2=statement.kind==="classicalAssign"?classicalRuntime.executeAssignment(statement):classicalRuntime.executeDeclaration(statement);if(!result2.success){parsed.diagnostics.push(result2.diagnostic);throw new Error(diagnosticsToError(parsed.diagnostics))}output.push(result2.output);trace.push(result2.trace);return}case"classicalFor":mainControl.loop(statement,body=>body.forEach(runStabilizerStatement));return;case"classicalMatchResult":mainControl.matchResult(statement,body=>body.forEach(runStabilizerStatement));return;case"return":if(!parsed.program.functionResults)return;programResult=executeNMFunctionResultRuntime(statement,parsed.program.functionResults.resultType,classicalRuntime.values,parsed.diagnostics,output,trace,classicalRuntime.context);return;case"reset":{const qubitIdx=statement.target.resolvedIndex??statement.target.index;if(qubitIdx==null)return;const result2=resetNMStabilizerQubit(tableau,qubitIdx,random);if(parsed.program.feedForward==null&&result2.deterministic)random();output.push(result2.state==="1"?`Reset qubit ${qubitIdx}: measured |1> and applied X correction`:`Reset qubit ${qubitIdx}: already |0>`);trace.push(`line ${statement.line}: stabilizer reset q${qubitIdx} measured=${result2.state}`);recordStabilizerTimeline("reset",`reset ${formatQubitRef2(statement.target)}`,statement.line,"Reset measures in Z and conditionally flips the stabilizer generator back to |0>.");return}case"barrier":output.push("Barrier");trace.push(`line ${statement.line}: stabilizer barrier`);recordStabilizerTimeline("barrier","barrier",statement.line,"Barrier marks a circuit stage boundary without changing the stabilizer tableau.");return;case"if":{const bitValue=statement.condition||statement.predicate?void 0:classicalBits[statement.binding]??0;const conditionMet=statement.condition?evaluateNMTypedClassicalCondition(statement.condition,classicalRuntime.values,classicalRuntime.context):statement.predicate?evaluateNMClassicalPredicate(statement.predicate,classicalPredicateValues):statement.operator==="=="?bitValue===statement.value:bitValue!==statement.value;const conditionLabel=statement.condition?formatNMTypedClassicalExpression(statement.condition):statement.predicate?formatNMClassicalPredicate(statement.predicate):`${statement.binding} ${statement.operator} ${statement.value}`;const traceConditionLabel=statement.condition||statement.predicate?conditionLabel:`${statement.binding}(${bitValue}) ${statement.operator} ${statement.value}`;trace.push(`line ${statement.line}: stabilizer if ${traceConditionLabel} -> ${conditionMet?"run":"skip"}`);feedForwardRuntime.recordBranch(conditionMet);if(parsed.program.feedForward){const branchDecision={predicate:conditionLabel,taken:conditionMet,selected:conditionMet?"then":statement.elseBody?.length?"else":"skip",outcomes:statement.condition?[]:statement.predicate?getNMClassicalPredicateResults(statement.predicate).map(binding=>({binding,bits:classicalPredicateValues[binding]?.join("")??""})):[{binding:statement.binding,bits:String(bitValue??0)}]};recordStabilizerTimeline("branch",`if ${conditionLabel} -> ${branchDecision.selected}`,statement.line,statement.condition?`The Bool condition result selected the ${branchDecision.selected} path.`:`The recorded measurement outcome selected the ${branchDecision.selected} path.`,branchDecision,{explanationKey:statement.condition?"ui.timelineExplanationBoolBranch":"ui.timelineExplanationFeedForwardBranch",explanationValues:{selected:branchDecision.selected}})}if(!conditionMet&&statement.elseBody?.length){output.push(`Condition (${conditionLabel}) not met -> applying else ${statement.elseBody.length} statement(s)`);mainControl.scope(()=>statement.elseBody.forEach(runStabilizerStatement));return}if(conditionMet){output.push(`Condition (${conditionLabel}) met -> applying ${statement.body.length} statement(s)`);mainControl.scope(()=>statement.body.forEach(runStabilizerStatement))}else{output.push(`Condition (${conditionLabel}) not met -> skipped`)}return}case"until":{output.push(`Until (${statement.binding} ${statement.operator} ${statement.value}) max ${statement.maxIterations}`);trace.push(`line ${statement.line}: stabilizer until ${statement.binding} ${statement.operator} ${statement.value} max ${statement.maxIterations} begin`);for(let iteration=1;iteration<=statement.maxIterations;iteration+=1){output.push(`Until iteration ${iteration}/${statement.maxIterations}`);trace.push(`line ${statement.line}: stabilizer until iteration ${iteration}`);mainControl.scope(()=>statement.body.forEach(runStabilizerStatement));const bitValue=classicalBits[statement.binding]??0;const conditionMet=statement.operator==="=="?bitValue===statement.value:bitValue!==statement.value;trace.push(`line ${statement.line}: stabilizer until check ${statement.binding}=${bitValue} ${statement.operator} ${statement.value} -> ${conditionMet?"stop":"retry"}`);if(conditionMet){output.push(`Until condition met after ${iteration} iteration(s): ${statement.binding}=${bitValue}`);return}}output.push(`Until reached max ${statement.maxIterations} iteration(s) without meeting ${statement.binding} ${statement.operator} ${statement.value}`);trace.push(`line ${statement.line}: stabilizer until max reached`);return}case"match":{const values2=statement.bindings.map(binding=>classicalBits[binding]??0);const selected=statement.cases.find(matchCase=>matchCase.pattern.length===values2.length&&matchCase.pattern.every((value,index)=>value===values2[index]));const selector=statement.bindings.map((binding,index)=>`${binding}=${values2[index]}`).join(", ");if(!selected){output.push(`Match (${selector}) -> no case selected`);trace.push(`line ${statement.line}: stabilizer match ${selector} -> skip`);return}const pattern=selected.pattern.join(", ");output.push(`Match (${selector}) -> case (${pattern}) applying ${selected.body.length} statement(s)`);trace.push(`line ${statement.line}: stabilizer match ${selector} -> (${pattern})`);mainControl.scope(()=>selected.body.forEach(runStabilizerStatement));return}default:return}};const propagatedResult=runFunctionResultStatements(parsed.program.statements,runStabilizerStatement,Boolean(parsed.program.functionResults),output,trace);if(propagatedResult)programResult=propagatedResult;functionDebug?.finish(programResult);recordStabilizerTimeline("final","Final stabilizer tableau",void 0,"Final generator snapshot after all stabilizer-supported statements have run.");const generators=formatNMStabilizerGenerators(tableau);const stabilizer={qubits:parsed.numQubits,maxSupportedQubits:eligibility.maxSupportedQubits,supportedGateCount:eligibility.supportedGateCount,generators,globalPhase:tableau.globalPhase};const syndromeHistoryOmitted=getSyndromeHistoryOmitted();const stabilizerVisualization=createNMStabilizerScaleVisualization(stabilizer,syndromeHistory,syndromeHistoryOmitted);output.push("");output.push("Final stabilizer generators:");generators.forEach(generator=>output.push(` ${generator}`));const sampleHistogram=parsed.program.sampleShots!=null?createNMStabilizerSampleHistogram(sampleSourceTableau??tableau,parsed.program.sampleShots,random):void 0;const typedCollection=parsed.program.typedCollection?createNMStabilizerTypedCollection(parsed.program.typedCollection,sampleSourceTableau??tableau,parsed.program.seed,random):void 0;if(sampleHistogram){output.push("");output.push(`Sample histogram (${sampleHistogram.shots} shots):`);sampleHistogram.entries.forEach(entry=>{output.push(` |${entry.state}>: ${entry.count} (${(entry.probability*100).toFixed(1)}%)`)})}if(typedCollection){output.push("");output.push(`Collected ${typedCollection.shots} ordered ${typedCollection.elementType} result(s) with seed ${typedCollection.seed}`);trace.push(`runtime:collect shots=${typedCollection.shots} width=${typedCollection.width} seed=${typedCollection.seed}`)}const challengeResults=buildChallengeResults(true);appendChallengeResults(challengeResults);const testResults=buildTestResults(true);appendTestResults(testResults);const finalPropertyResults=buildPropertyResults(true);appendPropertyResults(finalPropertyResults);appendSnapshotResults(snapshotResults);return{...resultFields,success:true,output,measurements,executionTime:performance.now()-startTime,diagnostics:parsed.diagnostics,trace,stateTimeline:boundStateTimelineForResult(stateTimeline),preMeasurementProbabilities:[],sampleHistogram,typedCollection,circuitDiagram,quantikzCircuit:quantikzCircuit||void 0,blochVectors:[],classicalValues:classicalRuntime.evidence.length>0?classicalRuntime.evidence:void 0,programResult,cost:expectationRuntime.cost,expectations:Object.keys(expectationRuntime.expectations).length?expectationRuntime.expectations:void 0,expectationShotEstimates:Object.keys(expectationRuntime.estimates).length?expectationRuntime.estimates:void 0,targetCapabilities:parsed.program.targetCapabilityConstraints?.evidence,challengeResults,testResults,propertyResults:finalPropertyResults,snapshotResults,resources,engine:"stabilizer",execution:executionProvenance(),...parsed.program.feedForward?{feedForwardBranchRecord:feedForwardRuntime.branchRecord()}:{},...feedForwardVerification?{feedForwardVerification}:{},...syndromeHistory.length>0?{syndromeHistory:syndromeHistory.map(event=>({...event}))}:{},...syndromeHistoryOmitted>0?{syndromeHistoryOmitted}:{},...stabilizerVisualization?{stabilizerVisualization}:{},stabilizer}}function contract3(state,operators){let real=new Float64Array([1]),imag=new Float64Array([0]);for(let qubit3=0;qubit3<state.tensors.length;qubit3++){const tensor=state.tensors[qubit3],left=tensor.chiLeft,right=tensor.chiRight,op=operators.get(qubit3)??"I";const tmpR=new Float64Array(left*right*2),tmpI=new Float64Array(left*right*2);for(let a=0;a<left;a++)for(let b=0;b<left;b++)for(let d=0;d<right;d++)for(let j=0;j<2;j++){const e=a*left+b,k=(b*right+d)*2+j,t=(a*right+d)*2+j;tmpR[t]+=real[e]*tensor.dataRe[k]-imag[e]*tensor.dataIm[k];tmpI[t]+=real[e]*tensor.dataIm[k]+imag[e]*tensor.dataRe[k]}const nextR=new Float64Array(right*right),nextI=new Float64Array(right*right);for(let c2=0;c2<right;c2++)for(let d=0;d<right;d++)for(let a=0;a<left;a++)for(let i=0;i<2;i++){const j=op==="X"||op==="Y"?1-i:i,k=(a*right+c2)*2+i,t=(a*right+d)*2+j;let r=tmpR[t],im=tmpI[t];if(op==="Y"){const sign=i===0?-1:1;[r,im]=[-sign*im,sign*r]}else if(op==="Z"&&i===1){r=-r;im=-im}const n=c2*right+d;nextR[n]+=tensor.dataRe[k]*r+tensor.dataIm[k]*im;nextI[n]+=tensor.dataRe[k]*im-tensor.dataIm[k]*r}real=nextR;imag=nextI}if(real.length!==1||!Number.isFinite(real[0])||!Number.isFinite(imag[0])||Math.abs(imag[0])>1e-8*Math.max(1,Math.abs(real[0])))throw new Error("Invalid MPS expectation contraction");return real[0]}function expectationMPSPauli(state,factors){const operators=new Map;for(const factor of factors){const qubit3=expectationQubitIndex(factor.target);if(!Number.isInteger(qubit3)||qubit3<0||qubit3>=state.numQubits||operators.has(qubit3)||!["X","Y","Z"].includes(factor.observable))throw new Error("Invalid MPS Pauli factor");operators.set(qubit3,factor.observable)}const norm=contract3(state,new Map);if(!(norm>1e-15))throw new Error("MPS expectation requires a nonzero norm");return contract3(state,operators)/norm}function recordFunctionMPSDebugState(mps,timeline,phase,line){if(timeline.length>=1e4)throw new FunctionDebugObserverError("NM-DEBUG-004: MPS debug timeline exceeds 10000 frames.");const amplitudes=mps.numQubits<=10?mpsToDenseAmplitudes(mps):void 0;const probabilities=amplitudes?.map((amplitude,index)=>({state:index.toString(2).padStart(mps.numQubits,"0"),probability:amplitude.re**2+amplitude.im**2}))??[];timeline.push({index:timeline.length,phase,label:`MPS ${phase}`,...line?{line}:{},...amplitudes?{state:{numQubits:mps.numQubits,amplitudes}}:{},probabilities,probabilityDeltas:[],blochVectorDeltas:[],blochVectors:Array.from({length:mps.numQubits},(_,qubit3)=>{const{x,y,z}=getBlochVectorMPS(mps,qubit3);return{qubit:qubit3,x,y,z,purity:Math.sqrt(x*x+y*y+z*z)}})})}function selectNMSimulationBackend(program,numQubits){if(program.target==="browser-mps"||program.target==="matrix-product-state"){return{backend:"mps"}}if(program.target==="browser-stabilizer"){const stabilizerEligibility=analyzeNMStabilizerEligibility(program,numQubits);return{backend:stabilizerEligibility.eligible?"stabilizer":numQubits>14?"mps":"statevector",stabilizerEligibility}}return{backend:"statevector"}}function createNMSimulationExecutionProvenance(program,backend,seedOverride){const seed=seedOverride??program.seed;return{runType:"simulation",provider:"nm-local-simulator",backend,seed:seed??null,deterministic:seed!=null,hardware:false}}function appendNMTargetCapabilityEvidence(program,output,trace){const evidence=program.targetCapabilityConstraints?.evidence;if(!evidence)return;output.push(`Target capabilities ${evidence.profile}: ${evidence.passed?"passed":"failed"}`);const gates2=evidence.requiredGates?evidence.requiredGates.join(","):"none";trace.push(`target-capabilities profile=${evidence.profile} passed=${evidence.passed} gates=${gates2} connectivity=${evidence.connectivity?.actual??"not-required"} error=${evidence.errorBudget?.estimated??"not-required"}`)}var c=(re,im=0)=>({re,im});var MPS_GATES_2X2={H:[[c(1/Math.SQRT2),c(1/Math.SQRT2)],[c(1/Math.SQRT2),c(-1/Math.SQRT2)]],X:[[c(0),c(1)],[c(1),c(0)]],Y:[[c(0),c(0,-1)],[c(0,1),c(0)]],Z:[[c(1),c(0)],[c(0),c(-1)]],S:[[c(1),c(0)],[c(0),c(0,1)]],T:[[c(1),c(0)],[c(0),c(Math.SQRT1_2,Math.SQRT1_2)]],Sdg:[[c(1),c(0)],[c(0),c(0,-1)]],Tdg:[[c(1),c(0)],[c(0),c(Math.SQRT1_2,-Math.SQRT1_2)]]};function getSingleQubitGateMatrix(name2,params=[]){if(MPS_GATES_2X2[name2])return MPS_GATES_2X2[name2];if(name2==="Rx"||name2==="rx"){const theta=params[0]??0;const cos=Math.cos(theta/2);const sin=Math.sin(theta/2);return[[c(cos),c(0,-sin)],[c(0,-sin),c(cos)]]}if(name2==="Ry"||name2==="ry"){const theta=params[0]??0;const cos=Math.cos(theta/2);const sin=Math.sin(theta/2);return[[c(cos),c(-sin)],[c(sin),c(cos)]]}if(name2==="Rz"||name2==="rz"){const theta=params[0]??0;return[[c(Math.cos(-theta/2),Math.sin(-theta/2)),c(0)],[c(0),c(Math.cos(theta/2),Math.sin(theta/2))]]}if(name2==="P"||name2==="p"||name2==="Phase"){const theta=params[0]??0;return[[c(1),c(0)],[c(0),c(Math.cos(theta),Math.sin(theta))]]}if(name2==="U"||name2==="u"){const theta=params[0]??0;const phi=params[1]??0;const lambda=params[2]??0;const cos=Math.cos(theta/2);const sin=Math.sin(theta/2);return[[c(cos),c(-sin*Math.cos(lambda),-sin*Math.sin(lambda))],[c(sin*Math.cos(phi),sin*Math.sin(phi)),c(cos*Math.cos(phi+lambda),cos*Math.sin(phi+lambda))]]}return void 0}function runNMMPSRuntimeSummary(context){const{parsed,resources,output,trace,stateTimeline,measurements,maxBondDimension=32}=context;const{numQubits}=parsed;const mps=initMPS(numQubits,{maxBondDimension});const propertyResults=[];const snapshotResults=[];const showResults=[];const functionDebug=createFunctionDebugBridge(context.debugSourceId,parsed.program,stateTimeline,()=>classicalRuntime.values);const classicalRuntime=createNMTypedClassicalRuntimeStore(functionDebug?.context,usesNMMainMutableControl(parsed.program.statements),parsed.program.statements.filter(statement=>statement.kind==="qreg").map(statement=>statement.name));const resolveDynamicTargets=createNMDynamicQubitTargetResolver(parsed.program.statements);const classicalBits=Object.create(null);const predicateValues=Object.create(null);let programResult;const mainControl=createMainControlRuntime(classicalRuntime.values,()=>programResult,functionDebug,classicalRuntime);let peakBond=1;const rng=context.feedForwardSeedOverride!=null?createSeededRandom(context.feedForwardSeedOverride):parsed.program.seed!=null?createSeededRandom(parsed.program.seed):Math.random;const startTime=performance.now();const expectationRuntime=createNMExpectationRuntime(output,trace,rng,parsed.program.expectationShots,(statement,value)=>{if(parsed.program.typedClassicalValues)classicalRuntime.bindExpectation(statement,value)});const updatePeakBond=()=>{for(let i=0;i<mps.tensors.length;i++){const b=Math.max(mps.tensors[i].chiLeft,mps.tensors[i].chiRight);if(b>peakBond)peakBond=b}};const applyGate=gate=>{const name2=gate.gate;const targetQubits=gate.targets.map(t=>t.resolvedIndex??t.index??0);const resolvedParams=gate.angles??(gate.theta!=null?[gate.theta]:[]);if(name2==="GPhase"){const phase=c(Math.cos(resolvedParams[0]),Math.sin(resolvedParams[0]));applySingleQubitGateMPS(mps,0,[[phase,c(0)],[c(0),phase]]);return}const u2=getSingleQubitGateMatrix(name2,resolvedParams);if(u2&&targetQubits.length===1){applySingleQubitGateMPS(mps,targetQubits[0],u2);updatePeakBond();return}if(name2==="CNOT"){const cnotMatrix=createControlledGateMatrix(MPS_GATES_2X2.X);applyTwoQubitGateMPS(mps,targetQubits[0],targetQubits[1],cnotMatrix);updatePeakBond();return}if(name2==="CZ"){const czMatrix=createControlledGateMatrix(MPS_GATES_2X2.Z);applyTwoQubitGateMPS(mps,targetQubits[0],targetQubits[1],czMatrix);updatePeakBond();return}if(name2==="CY"){const cyMatrix=createControlledGateMatrix(MPS_GATES_2X2.Y);applyTwoQubitGateMPS(mps,targetQubits[0],targetQubits[1],cyMatrix);updatePeakBond();return}if(name2==="CH"){const chMatrix=createControlledGateMatrix(MPS_GATES_2X2.H);applyTwoQubitGateMPS(mps,targetQubits[0],targetQubits[1],chMatrix);updatePeakBond();return}if(name2==="CP"||name2==="CRy"||name2==="CRz"){const pMat=getSingleQubitGateMatrix(name2.slice(1),resolvedParams);const cpMatrix=createControlledGateMatrix(pMat);applyTwoQubitGateMPS(mps,targetQubits[0],targetQubits[1],cpMatrix);updatePeakBond();return}if(name2==="RXX"||name2==="RYY"||name2==="RZZ"){const matrix={RXX:rxxMatrix,RYY:ryyMatrix,RZZ:rzzMatrix}[name2](resolvedParams[0]);applyTwoQubitGateMPS(mps,targetQubits[0],targetQubits[1],matrix);updatePeakBond();return}if(name2==="SWAP"){const swapMat=[[c(1),c(0),c(0),c(0)],[c(0),c(0),c(1),c(0)],[c(0),c(1),c(0),c(0)],[c(0),c(0),c(0),c(1)]];applyTwoQubitGateMPS(mps,targetQubits[0],targetQubits[1],swapMat);updatePeakBond();return}if(name2==="iSWAP"){const iswapMat=[[c(1),c(0),c(0),c(0)],[c(0),c(0),c(0,1),c(0)],[c(0),c(0,1),c(0),c(0)],[c(0),c(0),c(0),c(1)]];applyTwoQubitGateMPS(mps,targetQubits[0],targetQubits[1],iswapMat);updatePeakBond();return}if(name2==="CCNOT"){const[c1,c2,target2]=targetQubits;applySingleQubitGateMPS(mps,target2,MPS_GATES_2X2.H);applyTwoQubitGateMPS(mps,c2,target2,createControlledGateMatrix(MPS_GATES_2X2.X));applySingleQubitGateMPS(mps,target2,MPS_GATES_2X2.Tdg);applyTwoQubitGateMPS(mps,c1,target2,createControlledGateMatrix(MPS_GATES_2X2.X));applySingleQubitGateMPS(mps,target2,MPS_GATES_2X2.T);applyTwoQubitGateMPS(mps,c2,target2,createControlledGateMatrix(MPS_GATES_2X2.X));applySingleQubitGateMPS(mps,target2,MPS_GATES_2X2.Tdg);applyTwoQubitGateMPS(mps,c1,target2,createControlledGateMatrix(MPS_GATES_2X2.X));applySingleQubitGateMPS(mps,target2,MPS_GATES_2X2.T);applySingleQubitGateMPS(mps,target2,MPS_GATES_2X2.H);applySingleQubitGateMPS(mps,c2,MPS_GATES_2X2.T);applyTwoQubitGateMPS(mps,c1,c2,createControlledGateMatrix(MPS_GATES_2X2.X));applySingleQubitGateMPS(mps,c2,MPS_GATES_2X2.Tdg);applyTwoQubitGateMPS(mps,c1,c2,createControlledGateMatrix(MPS_GATES_2X2.X));applySingleQubitGateMPS(mps,c1,MPS_GATES_2X2.T);updatePeakBond();return}throw new Error(`Gate ${name2} is not supported by the MPS backend (line ${gate.line}).`)};const processStatements=stmts=>{for(const statement of stmts){if(programResult)return;mainControl.statement(statement,()=>{if(statement.kind==="computeApply"){runComputeApply(statement,{statements:parsed.program.statements,constants:parsed.constants,values:classicalRuntime.values,context:classicalRuntime.context},operation=>processStatements([operation]))}else if(statement.kind==="barrier"){output.push("Barrier");trace.push(`line ${statement.line}: mps barrier`);if(context.debugSourceId)recordFunctionMPSDebugState(mps,stateTimeline,"barrier",statement.line)}else if("gate"in statement){applyGate(resolveFunctionGateAngles(resolveDynamicTargets(statement,classicalRuntime.values,classicalRuntime.context),functionGateValues(parsed.constants,classicalRuntime.values),classicalRuntime.context));const targetQubits=statement.targets.map(t=>t.resolvedIndex??t.index??0);trace.push(`mps-gate name=${statement.gate} qubits=${targetQubits.join(",")}`)}else if(statement.kind==="expectation"){expectationRuntime.run(statement,factors=>expectationMPSPauli(mps,factors))}else if(statement.kind==="measurement"){const q=statement.target.resolvedIndex??statement.target.index??0;if(statement.basis==="Y")applySingleQubitGateMPS(mps,q,MPS_GATES_2X2.Sdg);if(statement.basis==="X"||statement.basis==="Y")applySingleQubitGateMPS(mps,q,MPS_GATES_2X2.H);const rho=getBlochVectorMPS(mps,q);const prob0=(1+rho.z)/2;const outcome=rng()<prob0?0:1;collapseMeasureQubitMPS(mps,q,outcome);if(statement.basis==="X"||statement.basis==="Y")applySingleQubitGateMPS(mps,q,MPS_GATES_2X2.H);if(statement.basis==="Y")applySingleQubitGateMPS(mps,q,MPS_GATES_2X2.S);if(statement.binding){classicalBits[statement.binding]=outcome;predicateValues[statement.binding]=[outcome];classicalRuntime.bindBit(statement.binding,outcome)}measurements.push({state:String(outcome),probability:outcome===0?prob0:1-prob0,collapsed:numQubits<=14?{numQubits,amplitudes:mpsToDenseAmplitudes(mps)}:{numQubits,amplitudes:[]}});output.push(`Measured qubit ${q}: ${outcome}`);trace.push(`mps-measure qubit=${q} outcome=${outcome}`)}else if(statement.kind==="reset"){const q=statement.target.resolvedIndex??statement.target.index;if(q===void 0)throw new Error(`MPS reset target is unresolved at line ${statement.line}.`);const probabilityZero=(1+getBlochVectorMPS(mps,q).z)/2;const outcome=rng()<probabilityZero?0:1;collapseMeasureQubitMPS(mps,q,outcome);if(outcome===1)applySingleQubitGateMPS(mps,q,MPS_GATES_2X2.X);output.push(`Reset qubit ${q}: measured ${outcome}, restored |0>`);trace.push(`line ${statement.line}: mps reset q${q} measured=${outcome}`)}else if(statement.kind==="measurement-binding"){const indices=statement.operand.resolvedIndices??[];const bits=[];for(const q of indices){const rho=getBlochVectorMPS(mps,q);const prob0=(1+rho.z)/2;const outcome=rng()<prob0?0:1;collapseMeasureQubitMPS(mps,q,outcome);bits.push(outcome)}if(bits.length!==statement.width)throw new Error(`MPS measurement ${statement.name} has an unresolved width at line ${statement.line}.`);predicateValues[statement.name]=bits;classicalRuntime.bindBitVec(statement.name,bits,statement.line);output.push(`Measured ${statement.name}: BitVec<${statement.width}> = 0b${bits.join("")}`);trace.push(`mps-measure-binding name=${statement.name} width=${statement.width}`)}else if(statement.kind==="const"){classicalRuntime.bindConstant(statement.name,statement.valueType==="Int"?"Int":"Float",statement.value)}else if(statement.kind==="param"){classicalRuntime.bindConstant(statement.name,"Float",statement.value)}else if(statement.kind==="bitAssign"){const value=evaluateBitExpression(statement.expression,classicalBits);classicalBits[statement.name]=value;predicateValues[statement.name]=[value===1?1:0];classicalRuntime.bindBit(statement.name,value);output.push(`Classical Bit ${statement.name} = ${value}`);trace.push(`line ${statement.line}: mps bit ${statement.name}=${value}`)}else if(statement.kind==="classicalDecl"||statement.kind==="classicalAssign"){const result2=statement.kind==="classicalAssign"?classicalRuntime.executeAssignment(statement):classicalRuntime.executeDeclaration(statement);if(!result2.success){parsed.diagnostics.push(result2.diagnostic);throw new Error(diagnosticsToError(parsed.diagnostics))}output.push(result2.output);trace.push(result2.trace)}else if(statement.kind==="classicalFor"){mainControl.loop(statement,processStatements)}else if(statement.kind==="classicalMatchResult"){mainControl.matchResult(statement,processStatements)}else if(statement.kind==="return"){if(parsed.program.functionResults){programResult=executeNMFunctionResultRuntime(statement,parsed.program.functionResults.resultType,classicalRuntime.values,parsed.diagnostics,output,trace,classicalRuntime.context)}}else if(statement.kind==="if"){const names=statement.condition?[]:statement.predicate?getNMClassicalPredicateResults(statement.predicate):[statement.binding];if(names.some(name2=>!Object.prototype.hasOwnProperty.call(predicateValues,name2)))throw new Error(`MPS condition has an unavailable measurement value at line ${statement.line}.`);const selected=statement.condition?evaluateNMTypedClassicalCondition(statement.condition,classicalRuntime.values,classicalRuntime.context):statement.predicate?evaluateNMClassicalPredicate(statement.predicate,predicateValues):statement.operator==="=="?classicalBits[statement.binding]===statement.value:classicalBits[statement.binding]!==statement.value;trace.push(`line ${statement.line}: mps if${statement.condition?` ${formatNMTypedClassicalExpression(statement.condition)}`:""} -> ${selected?"then":"else"}`);mainControl.scope(()=>processStatements(selected?statement.body:statement.elseBody??[]))}else if(statement.kind==="match"){if(statement.bindings.some(name2=>!Object.prototype.hasOwnProperty.call(classicalBits,name2)))throw new Error(`MPS match has an unavailable measurement value at line ${statement.line}.`);const values2=statement.bindings.map(name2=>classicalBits[name2]);const selected=statement.cases.find(branch=>branch.pattern.length===values2.length&&branch.pattern.every((value,index)=>value===values2[index]));trace.push(`line ${statement.line}: mps match -> ${selected?selected.pattern.join(", "):"skip"}`);if(selected)mainControl.scope(()=>processStatements(selected.body))}else if(statement.kind==="until"){throw new Error(`MPS bounded-until execution is not supported at line ${statement.line}.`)}else if(["observe","test","snapshot","property"].includes(statement.kind)){throw new Error(`MPS ${statement.kind} block execution is not supported at line ${statement.line}.`)}});if(context.debugSourceId&&["gate","measurement","measurement-binding","reset","if"].includes(statement.kind))recordFunctionMPSDebugState(mps,stateTimeline,statement.kind==="measurement"||statement.kind==="measurement-binding"?"measurement":"gate",statement.line)}};const runComputeApply=createNMComputeApplyExecutor(stateTimeline,context.debugSourceId);if(context.debugSourceId)recordFunctionMPSDebugState(mps,stateTimeline,"init");const propagatedResult=runFunctionResultStatements(parsed.program.statements,statement=>{processStatements([statement])},Boolean(parsed.program.functionResults),output,trace);if(propagatedResult)programResult=propagatedResult;functionDebug?.finish(programResult);if(context.debugSourceId)recordFunctionMPSDebugState(mps,stateTimeline,"final");const blochVectors=[];for(let q=0;q<numQubits;q++){const b=getBlochVectorMPS(mps,q);blochVectors.push({qubit:q,x:b.x,y:b.y,z:b.z,purity:Math.sqrt(b.x*b.x+b.y*b.y+b.z*b.z)})}const entropyBonds=[];const entropyValues=[];let peakEntropy=0;for(let b=0;b<numQubits-1;b++){const ent=getEntanglementEntropyMPS(mps,b);entropyBonds.push(b);entropyValues.push(ent);if(ent>peakEntropy)peakEntropy=ent}const mpsNodes=[];for(let q=0;q<numQubits;q++){const t=mps.tensors[q];mpsNodes.push({qubit:q,chiLeft:t.chiLeft,chiRight:t.chiRight,maxBond:Math.max(t.chiLeft,t.chiRight),bloch:blochVectors[q]})}const mpsBonds=[];let totalEntropy=0;for(let b=0;b<numQubits-1;b++){const ent=entropyValues[b];totalEntropy+=ent;mpsBonds.push({cut:b,leftQubit:b,rightQubit:b+1,bondDimension:mps.tensors[b].chiRight,entanglementEntropy:ent,singularValues:Array.from(mps.singularValues[b]||[])})}const mpsVisualization={numQubits,maxBondDimension,peakBondDimension:peakBond,peakEntanglementEntropy:peakEntropy,averageEntanglementEntropy:numQubits>1?totalEntropy/(numQubits-1):0,nodes:mpsNodes,bonds:mpsBonds};let sampleHistogram;const shots=parsed.program.sampleShots??parsed.program.expectationShots??parsed.program.shots;if(shots&&shots>0){const histCounts={};for(let s=0;s<shots;s++){const sample=sampleBitstringMPS(mps,rng);histCounts[sample.bitstring]=(histCounts[sample.bitstring]??0)+1}const entries=Object.entries(histCounts).map(([state,count])=>({state,count,probability:count/shots})).sort((a,b)=>b.count-a.count);sampleHistogram={shots,entries}}let finalState;if(numQubits<=14){const amplitudes=mpsToDenseAmplitudes(mps);finalState={numQubits,amplitudes}}output.push(`MPS simulation complete: ${numQubits} qubits, peak bond dimension=${peakBond}, peak entanglement=${peakEntropy.toFixed(3)} bits.`);return{success:true,executionTime:performance.now()-startTime,finalState,measurements,diagnostics:parsed.diagnostics,classicalValues:classicalRuntime.evidence.length?classicalRuntime.evidence:void 0,programResult,cost:expectationRuntime.cost,expectations:Object.keys(expectationRuntime.expectations).length?expectationRuntime.expectations:void 0,expectationShotEstimates:Object.keys(expectationRuntime.estimates).length?expectationRuntime.estimates:void 0,sampleHistogram,blochVectors,output,trace,stateTimeline:boundStateTimelineForResult(stateTimeline),circuitDiagram:[],resources,propertyResults,snapshotResults,showResults,mpsVisualization,execution:createNMSimulationExecutionProvenance(parsed.program,"mps",context.feedForwardSeedOverride)}}function roundSnapshotNumber(value){const rounded=Number.parseFloat(value.toFixed(12));return Object.is(rounded,-0)?0:rounded}function hashSnapshotText(value){let hash2=2166136261;for(let index=0;index<value.length;index+=1){hash2^=value.charCodeAt(index);hash2=Math.imul(hash2,16777619)>>>0}return hash2.toString(16).padStart(8,"0")}function formatBasisState(index,width){return index.toString(2).padStart(width,"0")}function createSnapshotAmplitudes(state){return state.amplitudes.map((amp,index)=>({state:formatBasisState(index,state.numQubits),re:roundSnapshotNumber(amp.re),im:roundSnapshotNumber(amp.im)}))}function formatStateNumber(value){const rounded=Number.parseFloat(value.toFixed(6));return String(Object.is(rounded,-0)?0:rounded)}function formatDiracCoefficient(amp){const re=Number.parseFloat(amp.re.toFixed(6));const im=Number.parseFloat(amp.im.toFixed(6));const normalizedRe=Object.is(re,-0)?0:re;const normalizedIm=Object.is(im,-0)?0:im;if(normalizedIm===0){return formatStateNumber(normalizedRe)}if(normalizedRe===0){return`${formatStateNumber(normalizedIm)}i`}const sign=normalizedIm>=0?"+":"";return`(${formatStateNumber(normalizedRe)}${sign}${formatStateNumber(normalizedIm)}i)`}function formatDiracTerm(amp,basis,first){const re=Number.parseFloat(amp.re.toFixed(6));const im=Number.parseFloat(amp.im.toFixed(6));const normalizedRe=Object.is(re,-0)?0:re;const normalizedIm=Object.is(im,-0)?0:im;if(normalizedIm===0){const sign=normalizedRe<0?first?"-":" - ":first?"":" + ";return`${sign}${formatStateNumber(Math.abs(normalizedRe))}|${basis}>`}return`${first?"":" + "}${formatDiracCoefficient({re:normalizedRe,im:normalizedIm})}|${basis}>`}function createShowStateResult(line,state){const nonZeroTerms=state.amplitudes.map((amp,index)=>({amp,basis:formatBasisState(index,state.numQubits),magnitude:Math.hypot(amp.re,amp.im)})).filter(entry=>entry.magnitude>1e-9);const visibleTerms=state.numQubits<=3?nonZeroTerms:nonZeroTerms.slice(0,8);const value=visibleTerms.length?`|psi> = ${visibleTerms.map((entry,index)=>formatDiracTerm(entry.amp,entry.basis,index===0)).join("")}`:"|psi> = 0";return{subject:"state",line,value,omittedTerms:Math.max(0,nonZeroTerms.length-visibleTerms.length)}}function createSnapshotSharedCode(result2){return encodeSharedCode(JSON.stringify({format:"nm-golden-snapshot",version:"0.1",name:result2.name,line:result2.line,passed:result2.passed,stateHash:result2.stateHash,irHash:result2.irHash,amplitudes:result2.amplitudes,probabilities:result2.probabilities.map(entry=>({state:entry.state,probability:roundSnapshotNumber(entry.probability)})),diagnosticCodes:result2.diagnosticCodes},null,2))}function createNMSimulatorQMLApi(execute){return{executeNMParameterGroupSweep:(code,request,parseOptions={},controls={})=>executeNMParameterGroupSweep(execute,code,request,parseOptions,controls),executeNMParameterSweep:(code,options={},parseOptions={})=>executeNMParameterSweep(execute,code,options,parseOptions),evaluateNMGradient:(code,target2,parameter,parseOptions={})=>evaluateNMGradient(execute,code,target2,parameter,parseOptions),evaluateNMCost:(code,paramValues,parseOptions={})=>evaluateNMCost(execute,code,paramValues,parseOptions),getNMBlochVector:(code,paramValues,parseOptions={})=>getNMBlochVector(execute,code,paramValues,parseOptions),computeNMCostLandscape:(code,options={},parseOptions={})=>computeNMCostLandscape(execute,code,options,parseOptions),executeNMTraining:(code,options={},parseOptions={})=>executeNMTraining(execute,code,options,parseOptions),trainNMClassifier:(template,dataset,featureNames2,options={},parseOptions={})=>trainNMClassifier(execute,template,dataset,featureNames2,options,parseOptions),evaluateNMClassifierDataset:(template,dataset,featureNames2,params,options={},parseOptions={})=>evaluateNMClassifierDataset(execute,template,dataset,featureNames2,params,options,parseOptions),computeBarrenPlateauProfile:(options={})=>computeBarrenPlateauProfile(execute,options),computeBarrenPlateauProfileChecked:(options={})=>computeBarrenPlateauProfileChecked(execute,options),executeNMVQE:(ansatz,hamiltonian,options={})=>executeNMVQE(execute,ansatz,hamiltonian,options)}}function createNMComposedNoiseHistogram(numQubits,gates2,program,seed,shots){const validation=validateNMComposedNoiseProgram(program);if(!validation.valid)throw new Error(`${validation.diagnostic.code}: ${validation.diagnostic.message}`);if(!Number.isInteger(numQubits)||numQubits<1||numQubits>nmComposedNoisePolicy.maximumQubits||program.measurementIndices.length!==numQubits){throw new Error(`NM-NOISE-PROFILE-010: numQubits must match the carrier measurement width in 1..${nmComposedNoisePolicy.maximumQubits}.`)}if(!Number.isInteger(shots)||shots<1||shots>nmComposedNoisePolicy.maximumShots){throw new Error(`NM-NOISE-PROFILE-010: shots must be in 1..${nmComposedNoisePolicy.maximumShots}.`)}if(!Number.isSafeInteger(seed)||seed<0||seed>4294967295){throw new Error("NM-NOISE-PROFILE-010: seed must be an unsigned 32-bit integer.")}if(gates2.some(gate=>gate.targets.some(({resolvedIndex})=>!Number.isInteger(resolvedIndex)||resolvedIndex<0||resolvedIndex>=numQubits))){throw new Error("NM-NOISE-PROFILE-010: gate plan contains an unresolved or out-of-range target.")}if(JSON.stringify(createNMComposedNoiseGatePlan(gates2))!==JSON.stringify(program.gatePlan)){throw new Error("NM-NOISE-PROFILE-010: runtime gate plan does not match the validated carrier.")}if(program.profiles.some(candidate=>candidate.channels.some(channel=>channel.scope.resolvedIndices.some(index=>index>=numQubits)))){throw new Error("NM-NOISE-PROFILE-010: channel scope exceeds the runtime width.")}const profile=validation.program.profiles.find(({name:name2})=>name2===validation.program.activeProfile);if(!profile)throw new Error("NM-NOISE-PROFILE-010: Active composed-noise profile is missing.");if(profile.channels.some(channel=>channel.kind!=="readout"&&matchingGates(channel,gates2).length===0)){throw new Error("NM-NOISE-PROFILE-010: runtime gate plan does not match every active composed-noise channel.")}const random=createSeededRandom(seed);const counts=new Map;for(let shot=0;shot<shots;shot+=1){let state=initState(numQubits);for(const gate of gates2){state=applyGateToState(state,gate);for(const channel of profile.channels){if(channel.placement!=="after-gate"||channel.gate!==gate.gate)continue;state=applyAfterGateChannel(state,gate,channel,random)}}let basisState3=sampleBasisState(state,random);for(const channel of profile.channels){if(channel.kind==="readout"){basisState3=applyScopedReadoutNoise(basisState3,channel.scope.resolvedIndices,channel.probability,random)}}counts.set(basisState3,(counts.get(basisState3)??0)+1)}const histogram={shots,entries:Array.from(counts.entries()).map(([state,count])=>({state,count,probability:count/shots})).sort((left,right)=>left.state.localeCompare(right.state))};return{histogram,evidence:{contractVersion:NM_COMPOSED_NOISE_CONTRACT_VERSION,rfc:NM_COMPOSED_NOISE_RFC,profile:profile.name,carrierIdentityHash:program.identityHash,backend:"browser-statevector",ordering:program.ordering,seed,randomSource:"mulberry32-v1",shots,channels:profile.channels.map(channel=>channelEvidence(channel,gates2,shots)),limitation:NM_COMPOSED_NOISE_LIMITATION}}}function applyAfterGateChannel(state,gate,channel,random){const operands=new Set(gate.targets.flatMap(({resolvedIndex})=>resolvedIndex==null?[]:[resolvedIndex]));if(channel.kind==="correlated-pauli"){if(!channel.scope.resolvedIndices.every(index=>operands.has(index))||random()>=channel.probability)return state;let next2=state;for(let index=0;index<channel.pauliWord.length;index+=1){const pauli=channel.pauliWord[index];if(pauli!=="I"){next2=applySingleQubitGate(next2,GATES[pauli],channel.scope.resolvedIndices[index])}}return next2}let next=state;for(const index of channel.scope.resolvedIndices){if(operands.has(index)){next=applyTrajectoryNoise(next,channel.model,channel.probability,index,random)}}return next}function applyScopedReadoutNoise(basisState3,resolvedIndices2,probability,random){const bits=basisState3.split("");for(const qubit3 of resolvedIndices2){if(random()<probability){const position=bits.length-1-qubit3;bits[position]=bits[position]==="0"?"1":"0"}}return bits.join("")}function channelEvidence(channel,gates2,shots){if(channel.kind==="readout")return{order:channel.order,kind:channel.kind,placement:channel.placement,resolvedIndices:[...channel.scope.resolvedIndices],probability:channel.probability,matchedOperationCount:channel.scope.resolvedIndices.length,attempts:shots*channel.scope.resolvedIndices.length,line:channel.line};const matching=matchingGates(channel,gates2);const attemptsPerShot=channel.kind==="correlated-pauli"?matching.length:matching.reduce((sum,gate)=>{const operands=new Set(gate.targets.flatMap(({resolvedIndex})=>resolvedIndex==null?[]:[resolvedIndex]));return sum+channel.scope.resolvedIndices.filter(index=>operands.has(index)).length},0);return{order:channel.order,kind:channel.kind,placement:channel.placement,gate:channel.gate,resolvedIndices:[...channel.scope.resolvedIndices],probability:channel.probability,matchedOperationCount:matching.length,attempts:shots*attemptsPerShot,line:channel.line}}function matchingGates(channel,gates2){return gates2.filter(gate=>{if(gate.gate!==channel.gate)return false;const operands=new Set(gate.targets.flatMap(({resolvedIndex})=>resolvedIndex==null?[]:[resolvedIndex]));return channel.kind==="correlated-pauli"?channel.scope.resolvedIndices.every(index=>operands.has(index)):channel.scope.resolvedIndices.some(index=>operands.has(index))})}function createNMSimulationLearningMetadata(program){const learningGoals=program.goals?.map(({text,line})=>({text,line}))??[];const learningOutcomes=program.outcomes?.map(({text,line})=>({text,line}))??[];const learningRubrics=program.rubrics?.map(({text,weight,line})=>({text,...weight!=null?{weight}:{},line}))??[];const learningMisconceptions=program.misconceptions?.map(({text,line})=>({text,line}))??[];const learningQuizzes=program.quizzes?.map(({question,answer,line})=>({question,...answer!=null?{answer}:{},line}))??[];const learningLabs=program.labs?.map(({id,minutes,line})=>({id,...minutes!=null?{minutes}:{},line}))??[];const learningChallenges=program.challenges?.map(({id,difficulty,line})=>({id,...difficulty!=null?{difficulty}:{},line}))??[];const learningDatasets=program.datasets?.map(({id,split,line})=>({id,...split!=null?{split}:{},line}))??[];const learningCheckpoints=program.checkpoints?.map(({text,kind,line})=>({text,...kind!=null?{kind}:{},line}))??[];const learningHints=program.hints?.map(({text,line})=>({text,line}))??[];const learningConcepts=program.concepts?.map(({name:name2,line})=>({name:name2,line}))??[];const learningLevel=program.level?{value:program.level.value,line:program.level.line}:void 0;const learningPrerequisites=program.prerequisites?.map(({name:name2,line})=>({name:name2,line}))??[];const learningTimelineAnnotations=[...learningGoals.map(goal=>({kind:"goal",label:`goal: ${goal.text}`,line:goal.line})),...learningOutcomes.map(outcome=>({kind:"outcome",label:`outcome: ${outcome.text}`,line:outcome.line})),...learningRubrics.map(rubric=>({kind:"rubric",label:`rubric: ${rubric.text}${rubric.weight!=null?` (weight ${rubric.weight})`:""}`,line:rubric.line})),...learningMisconceptions.map(item=>({kind:"misconception",label:`misconception: ${item.text}`,line:item.line})),...learningQuizzes.map(quiz=>({kind:"quiz",label:`quiz: ${quiz.question}`,line:quiz.line})),...learningLabs.map(lab=>({kind:"lab",label:`lab: ${lab.id}${lab.minutes!=null?` (${lab.minutes} min)`:""}`,line:lab.line})),...learningChallenges.map(challenge=>({kind:"challenge",label:`challenge: ${challenge.id}${challenge.difficulty?` (${challenge.difficulty})`:""}`,line:challenge.line})),...learningDatasets.map(dataset=>({kind:"dataset",label:`dataset: ${dataset.id}${dataset.split?` (${dataset.split})`:""}`,line:dataset.line})),...learningCheckpoints.map(checkpoint=>({kind:"checkpoint",label:`checkpoint: ${checkpoint.text}${checkpoint.kind?` (${checkpoint.kind})`:""}`,line:checkpoint.line})),...learningHints.map(hint=>({kind:"hint",label:`hint: ${hint.text}`,line:hint.line})),...learningConcepts.map(concept=>({kind:"concept",label:`concept: ${concept.name}`,line:concept.line})),...learningLevel?[{kind:"level",label:`level: ${learningLevel.value}`,line:learningLevel.line}]:[],...learningPrerequisites.map(prerequisite=>({kind:"prerequisite",label:`prerequisite: ${prerequisite.name}`,line:prerequisite.line}))].sort((left,right)=>left.line-right.line||left.kind.localeCompare(right.kind));return{learningGoals,learningOutcomes,learningRubrics,learningMisconceptions,learningQuizzes,learningLabs,learningChallenges,learningDatasets,learningCheckpoints,learningHints,learningConcepts,learningLevel,learningPrerequisites,learningTimelineAnnotations}}function createNMSimulationResultRuntime({code,evaluateHiddenChallengeChecks:evaluateHiddenChallengeChecks2,learningChallenges,output,parseOptions,parsed,propertyResults,skipChallengeEvaluation}){const testBlocks=parsed.program.statements.filter(statement=>statement.kind==="test");const propertyBlocks=parsed.program.statements.filter(statement=>statement.kind==="property");const buildChallengeResults=runtimeCompleted=>{const diagnosticCodes=parsed.diagnostics.filter(diagnostic5=>diagnostic5.severity==="error").map(diagnostic5=>diagnostic5.code);return learningChallenges.map(challenge=>{const hiddenChecks=runtimeCompleted&&diagnosticCodes.length===0&&!skipChallengeEvaluation?evaluateHiddenChallengeChecks2(code,challenge.id,parseOptions):[];const combinedDiagnosticCodes=[...diagnosticCodes,...hiddenChecks.flatMap(check=>check.diagnosticCodes)];return{id:challenge.id,...challenge.difficulty!=null?{difficulty:challenge.difficulty}:{},passed:runtimeCompleted&&diagnosticCodes.length===0&&hiddenChecks.every(check=>check.passed),line:challenge.line,diagnosticCodes:combinedDiagnosticCodes,...hiddenChecks.length>0?{hiddenChecks}:{}}})};const appendChallengeResults=results=>{if(results.length===0)return;output.push("","Challenge results:");results.forEach(challenge=>{const difficulty=challenge.difficulty?` (${challenge.difficulty})`:"";const hidden=challenge.hiddenChecks?.length?` - hidden ${challenge.hiddenChecks.filter(check=>check.passed).length}/${challenge.hiddenChecks.length}`:"";const diagnostics=challenge.diagnosticCodes.length?` - diagnostics: ${challenge.diagnosticCodes.join(", ")}`:"";output.push(` ${challenge.id}${difficulty}: ${challenge.passed?"passed":"failed"}${hidden}${diagnostics}`)})};const buildTestResults=runtimeCompleted=>{const blockingCodes=parsed.diagnostics.filter(diagnostic5=>diagnostic5.severity==="error").map(diagnostic5=>diagnostic5.code);return testBlocks.map(testBlock=>{const testLines=collectStatementLines(testBlock.body,new Set([testBlock.line]));const lineDiagnosticCodes=parsed.diagnostics.filter(diagnostic5=>diagnostic5.severity==="error"&&diagnostic5.line!=null&&testLines.has(diagnostic5.line)).map(diagnostic5=>diagnostic5.code);const diagnosticCodes=lineDiagnosticCodes.length>0||runtimeCompleted?lineDiagnosticCodes:blockingCodes;return{name:testBlock.name,passed:runtimeCompleted&&diagnosticCodes.length===0,line:testBlock.line,diagnosticCodes}})};const appendTestResults=results=>{if(results.length===0)return;output.push("","Test results:");results.forEach(result2=>{const diagnostics=result2.diagnosticCodes.length?` - diagnostics: ${result2.diagnosticCodes.join(", ")}`:"";output.push(` ${result2.name}: ${result2.passed?"passed":"failed"}${diagnostics}`)})};const buildPropertyResults=runtimeCompleted=>{const blockingCodes=parsed.diagnostics.filter(diagnostic5=>diagnostic5.severity==="error").map(diagnostic5=>diagnostic5.code);const recorded=new Map(propertyResults.map(result2=>[`${result2.line}:${result2.name}`,result2]));return propertyBlocks.map(propertyBlock=>{const existing=recorded.get(`${propertyBlock.line}:${propertyBlock.name}`);if(existing)return existing;const propertyLines=propertyBlock.cases.reduce((lines,propertyCase)=>collectStatementLines(propertyCase.body,lines),new Set([propertyBlock.line]));const lineDiagnosticCodes=parsed.diagnostics.filter(diagnostic5=>diagnostic5.severity==="error"&&diagnostic5.line!=null&&propertyLines.has(diagnostic5.line)).map(diagnostic5=>diagnostic5.code);const diagnosticCodes=lineDiagnosticCodes.length>0||runtimeCompleted?lineDiagnosticCodes:blockingCodes;const passed=runtimeCompleted&&diagnosticCodes.length===0;return{name:propertyBlock.name,parameter:propertyBlock.parameter,passed,line:propertyBlock.line,cases:propertyBlock.cases.map(propertyCase=>({value:propertyCase.value,passed,diagnosticCodes})),...passed||propertyBlock.cases.length===0?{}:{failedValue:propertyBlock.cases[0].value},diagnosticCodes}})};const appendPropertyResults=results=>{if(results.length===0)return;output.push("","Property results:");results.forEach(result2=>{const diagnostics=result2.diagnosticCodes.length?` - diagnostics: ${result2.diagnosticCodes.join(", ")}`:"";const failed2=result2.failedValue!=null?` - counterexample ${result2.parameter}=${result2.failedValue.toFixed(6)}`:"";output.push(` ${result2.name}: ${result2.passed?"passed":"failed"} (${result2.cases.length} case(s))${failed2}${diagnostics}`)})};const createRuntimeSnapshotResult=(snapshot2,stateToCapture,passed,diagnosticCodes)=>{const amplitudes=createSnapshotAmplitudes(stateToCapture);const probabilities=getStateProbabilities(stateToCapture).map(entry=>({state:entry.state,probability:roundSnapshotNumber(entry.probability)}));const withoutSharedCode={name:snapshot2.name,line:snapshot2.line,passed,stateHash:hashSnapshotText(JSON.stringify(amplitudes)),irHash:hashSnapshotText(JSON.stringify(snapshot2.body)),amplitudes,probabilities,diagnosticCodes};return{...withoutSharedCode,sharedCode:createSnapshotSharedCode(withoutSharedCode)}};const appendSnapshotResults=results=>{if(results.length===0)return;output.push("","Snapshot results:");results.forEach(result2=>{const diagnostics=result2.diagnosticCodes.length?` - diagnostics: ${result2.diagnosticCodes.join(", ")}`:"";output.push(` ${result2.name}: ${result2.passed?"captured":"failed"} state=${result2.stateHash} ir=${result2.irHash}${diagnostics}`)})};return{appendChallengeResults,appendPropertyResults,appendSnapshotResults,appendTestResults,buildChallengeResults,buildPropertyResults,buildTestResults,createRuntimeSnapshotResult}}function collectStatementLines(statements,lines=new Set){for(const statement of statements){lines.add(statement.line);if(statement.kind==="if"){collectStatementLines(statement.body,lines);if(statement.elseBody)collectStatementLines(statement.elseBody,lines)}else if(statement.kind==="until"){collectStatementLines(statement.body,lines)}else if(statement.kind==="match"){statement.cases.forEach(matchCase=>collectStatementLines(matchCase.body,lines))}else if(statement.kind==="observe"||statement.kind==="test"){collectStatementLines(statement.body,lines)}else if(statement.kind==="property"){statement.cases.forEach(propertyCase=>collectStatementLines(propertyCase.body,lines))}else if(statement.kind==="snapshot"){collectStatementLines(statement.body,lines)}}return lines}var ZERO_BRANCH_PROBABILITY=1e-15;function cloneQuantumState(backend,state){return backend==="stabilizer"?cloneNMStabilizerTableau(state):cloneState(state)}function flattenStatements3(statements){const flattened=[];for(const statement of statements){flattened.push(statement);if(statement.kind==="if"){flattened.push(...flattenStatements3(statement.body));if(statement.elseBody){flattened.push(...flattenStatements3(statement.elseBody))}}else if(statement.kind==="classicalFor"||statement.kind==="until"||statement.kind==="observe"||statement.kind==="test"||statement.kind==="snapshot"){flattened.push(...flattenStatements3(statement.body))}else if(statement.kind==="match"){for(const matchCase of statement.cases){flattened.push(...flattenStatements3(matchCase.body))}}else if(statement.kind==="property"){for(const propertyCase of statement.cases){flattened.push(...flattenStatements3(propertyCase.body))}}}return flattened}function createVerificationExecutionContext(assertions){const assertionKeys=new WeakMap;assertions.forEach((assertion,index)=>{assertionKeys.set(assertion,`assertion:${index}`)});return{assertionKeys,diagnostics:[]}}function assertionKey(context,assertion){const key4=context.assertionKeys.get(assertion);if(!key4){throw new Error("Feed-forward verifier encountered an unregistered branch assertion.")}return key4}function countMeasurementOutcomes(statements){return flattenStatements3(statements).reduce((count,statement)=>{if(statement.kind==="measurement"||statement.kind==="syndrome"){return count+1}if(statement.kind==="measurement-binding"){return count+statement.width}return count},0)}function unsupportedVerificationReason(program,backend,numQubits){if(backend==="statevector"&&numQubits>5){return"statevector verification is limited to five qubits"}if(hasNMMainResult(program.statements))return NM_MAIN_RESULT_UNSUPPORTED;if(hasNMMainDynamicAccess(program.statements))return"checked dynamic array indexing or runtime qubit targets are outside the Tier 1 branch interpreter";if(findNMMainImperativeStatement(program.statements))return"main loops and mutable locals are outside the Tier 1 branch interpreter";if(flattenStatements3(program.statements).some(statement=>statement.kind==="if"&&statement.condition)){return"typed Bool conditions are outside the Tier 1 branch interpreter"}const unsupported4=flattenStatements3(program.statements).find(statement=>["encode","gradient","match","observe","optimize","property","reset","show","snapshot","test","train","until"].includes(statement.kind));return unsupported4?`${unsupported4.kind} is outside the Tier 1 branch interpreter`:void 0}function projectQubit(backend,state,qubit3,basis,outcome){if(backend==="stabilizer"){const projected=cloneNMStabilizerTableau(state);const probability=projectNMStabilizerQubit(projected,qubit3,basis,outcome);return{state:projected,probability}}const measurement=measureQubitInBasis(state,qubit3,basis,()=>outcome===0?0:1);if((measurement.state==="1"?1:0)!==outcome){return{state:cloneState(state),probability:0}}return{state:measurement.collapsed,probability:measurement.probability}}function projectSyndrome(backend,state,statement,outcome){if(backend==="stabilizer"){const projected=cloneNMStabilizerTableau(state);const probability=projectNMStabilizerPauliString(projected,statement.factors,outcome);return{state:projected,probability}}const factors=statement.factors.map(factor=>({qubit:factor.target.resolvedIndex??factor.target.index??-1,pauli:factor.observable}));const measurement=measurePauliString(state,factors,()=>outcome===0?0:1);if(measurement.bit!==outcome){return{state:cloneState(state),probability:0}}return{state:measurement.collapsed,probability:measurement.probability}}function splitBranch(branch,project,bind){const next=[];for(const outcome of[0,1]){const projected=project(outcome);if(projected.probability<=ZERO_BRANCH_PROBABILITY){continue}const child={state:projected.state,probability:branch.probability*projected.probability,values:Object.fromEntries(Object.entries(branch.values).map(([name2,bits])=>[name2,[...bits]])),classicalBits:{...branch.classicalBits},outcomes:[...branch.outcomes,outcome],assertionSnapshots:{...branch.assertionSnapshots}};bind(child,outcome);next.push(child)}return next}function executeStatement(backend,branch,statement,context){if(statement.kind==="gate"){if(backend==="stabilizer"){const next=cloneNMStabilizerTableau(branch.state);const result2=applyNMStabilizerGate(next,statement);if(!result2.applied){if(!context.diagnostics.some(diagnostic5=>diagnostic5.code===nmFeedForwardDiagnosticCodes.verificationBackendMismatch&&diagnostic5.line===statement.line)){context.diagnostics.push(createDiagnostic({code:nmFeedForwardDiagnosticCodes.verificationBackendMismatch,severity:"error",message:`Stabilizer branch verification cannot apply ${statement.gate}: ${result2.reason}`,hint:"Keep stabilizer eligibility and tableau gate support aligned, or verify this program with the statevector backend.",line:result2.line??statement.line}))}return[]}return[{...branch,state:next}]}return[{...branch,state:applyGateToState(branch.state,statement)}]}if(statement.kind==="measurement"){const qubit3=statement.target.resolvedIndex??statement.target.index??-1;return splitBranch(branch,outcome=>projectQubit(backend,branch.state,qubit3,statement.basis??"Z",outcome),(child,outcome)=>{if(statement.binding){child.values[statement.binding]=[outcome];child.classicalBits[statement.binding]=outcome}})}if(statement.kind==="measurement-binding"){let branches=[{...branch,values:{...branch.values,[statement.name]:[]}}];for(const qubit3 of statement.operand.resolvedIndices??[]){branches=branches.flatMap(current=>splitBranch(current,outcome=>projectQubit(backend,current.state,qubit3,"Z",outcome),(child,outcome)=>{child.values[statement.name]=[...current.values[statement.name]??[],outcome]}))}return branches}if(statement.kind==="syndrome"){return splitBranch(branch,outcome=>projectSyndrome(backend,branch.state,statement,outcome),(child,outcome)=>{child.values[statement.binding]=[outcome];child.classicalBits[statement.binding]=outcome})}if(statement.kind==="bitAssign"){const value=evaluateBitExpression(statement.expression,branch.classicalBits);return[{...branch,values:{...branch.values,[statement.name]:[value===1?1:0]},classicalBits:{...branch.classicalBits,[statement.name]:value}}]}if(statement.kind==="if"){if(statement.condition)throw new Error("Typed Bool conditions are unsupported by the feed-forward verifier.");const taken=statement.predicate?evaluateNMClassicalPredicate(statement.predicate,branch.values):statement.operator==="=="?branch.classicalBits[statement.binding]===statement.value:branch.classicalBits[statement.binding]!==statement.value;return executeStatements(backend,[branch],taken?statement.body:statement.elseBody??[],context)}if(statement.kind==="assertBranchInvariant"){return[{...branch,assertionSnapshots:{...branch.assertionSnapshots,[assertionKey(context,statement)]:cloneQuantumState(backend,branch.state)}}]}return[branch]}function executeStatements(backend,initial,statements,context){let branches=initial;for(const statement of statements){branches=branches.flatMap(branch=>executeStatement(backend,branch,statement,context))}return branches}function getNMReducedDensityMatrix(state,qubitIndices){const selected=[...new Set(qubitIndices)];const dimension=2**selected.length;const matrix=Array.from({length:dimension},()=>Array.from({length:dimension},()=>({re:0,im:0})));const selectedSet=new Set(selected);const environment=Array.from({length:state.numQubits},(_,qubit3)=>qubit3).filter(qubit3=>!selectedSet.has(qubit3));const environmentDimension=2**environment.length;const storage=getNMDenseStatevectorStorage(state);const fullIndex=(selectedBits,environmentBits)=>{let index=0;selected.forEach((qubit3,offset)=>{if((selectedBits>>offset&1)===1){index|=1<<qubit3}});environment.forEach((qubit3,offset)=>{if((environmentBits>>offset&1)===1){index|=1<<qubit3}});return index};for(let row=0;row<dimension;row+=1){for(let column=0;column<dimension;column+=1){let re=0;let im=0;for(let environmentBits=0;environmentBits<environmentDimension;environmentBits+=1){const leftIndex=fullIndex(row,environmentBits);const rightIndex=fullIndex(column,environmentBits);const leftRe=storage.real[leftIndex];const leftIm=storage.imaginary[leftIndex];const rightRe=storage.real[rightIndex];const rightIm=storage.imaginary[rightIndex];re+=leftRe*rightRe+leftIm*rightIm;im+=leftIm*rightRe-leftRe*rightIm}matrix[row][column]={re,im}}}return matrix}function getNMDensityMatrixDistance(left,right){let maximum=0;for(let row=0;row<left.length;row+=1){for(let column=0;column<left[row].length;column+=1){const re=left[row][column].re-right[row][column].re;const im=left[row][column].im-right[row][column].im;maximum=Math.max(maximum,Math.hypot(re,im))}}return maximum}function assertionLabel(assertion){return`${assertion.target.register}${assertion.target.index!=null?`[${assertion.target.index}]`:""}`}function validateNMFeedForwardProbabilityConservation(probabilities){const probabilitySum=probabilities.reduce((sum,probability)=>sum+probability,0);if(Number.isFinite(probabilitySum)&&Math.abs(probabilitySum-1)<=NM_FEEDFORWARD_VERIFICATION_TOLERANCE){return[]}return[createDiagnostic({code:nmFeedForwardDiagnosticCodes.probabilityConservation,severity:"error",message:`Reachable branch probabilities sum to ${probabilitySum}, not 1 within tolerance ${NM_FEEDFORWARD_VERIFICATION_TOLERANCE}.`,hint:"Check measurement projection, zero-probability pruning, and branch probability multiplication."})]}function verifyNMFeedForwardBranches(program,numQubits){const conditioningMeasurements=countMeasurementOutcomes(program.statements);const assertions=flattenStatements3(program.statements).filter(statement=>statement.kind==="assertBranchInvariant");if(assertions.length===0){return{evidence:{tier:2,label:"sampled"},diagnostics:[]}}if(program.noise){return{evidence:{tier:2,label:"sampled",conditioningMeasurements,reason:"noise"},diagnostics:[]}}if(conditioningMeasurements>NM_FEEDFORWARD_MAX_EXHAUSTIVE_MEASUREMENTS){return{evidence:{tier:2,label:"sampled",conditioningMeasurements,reason:"budget"},diagnostics:[createDiagnostic({code:nmFeedForwardDiagnosticCodes.exhaustiveBudgetExceeded,severity:"warning",message:`Tier 1 branch verification requires at most ${NM_FEEDFORWARD_MAX_EXHAUSTIVE_MEASUREMENTS} enumerated measurement outcome bits; this program has ${conditioningMeasurements}.`,hint:"The program may still run with a recorded seed, but its result is Tier 2 sampled rather than branch-exhaustive verified."})]}}const selection=selectNMSimulationBackend(program,numQubits);const backend=selection.backend==="stabilizer"?"stabilizer":"statevector";const unsupported4=unsupportedVerificationReason(program,backend,numQubits);if(unsupported4){return{evidence:{tier:2,label:"sampled",conditioningMeasurements,reason:"unsupported"},diagnostics:[]}}const initialState=backend==="stabilizer"?createNMStabilizerTableau(numQubits):initState(numQubits);const context=createVerificationExecutionContext(assertions);const branches=executeStatements(backend,[{state:initialState,probability:1,values:{},classicalBits:{},outcomes:[],assertionSnapshots:{}}],program.statements,context);if(context.diagnostics.length>0){return{evidence:{tier:2,label:"sampled",conditioningMeasurements,reason:"unsupported"},diagnostics:context.diagnostics}}const diagnostics=[];const probabilitySum=branches.reduce((sum,branch)=>sum+branch.probability,0);diagnostics.push(...validateNMFeedForwardProbabilityConservation(branches.map(branch=>branch.probability)));const invariantLabels=[];for(const assertion of assertions){const target2=assertion.target.resolvedIndices??[];const key4=assertionKey(context,assertion);const reachedBranches=branches.filter(branch=>branch.assertionSnapshots[key4]!=null);const baseline=reachedBranches[0];const baselineState=baseline?.assertionSnapshots[key4];if(!baseline||!baselineState||target2.length===0){continue}const label3=assertionLabel(assertion);let maximumDifference=0;let mismatchingBranch;if(backend==="stabilizer"){const signature=getNMStabilizerReducedSignature(baselineState,target2);for(const branch of reachedBranches.slice(1)){const candidate=getNMStabilizerReducedSignature(branch.assertionSnapshots[key4],target2);if(signature.length!==candidate.length||signature.some((entry,index)=>entry!==candidate[index])){maximumDifference=1;mismatchingBranch=branch;break}}}else{const density=getNMReducedDensityMatrix(baselineState,target2);for(const branch of reachedBranches.slice(1)){const difference=getNMDensityMatrixDistance(density,getNMReducedDensityMatrix(branch.assertionSnapshots[key4],target2));if(difference>maximumDifference){maximumDifference=difference;mismatchingBranch=branch}}}if(maximumDifference>NM_FEEDFORWARD_VERIFICATION_TOLERANCE){diagnostics.push(createDiagnostic({code:nmFeedForwardDiagnosticCodes.invariantMismatch,severity:"error",message:`Branch invariant ${label3} differs between outcome paths ${baseline.outcomes.join("")||"empty"} and ${mismatchingBranch?.outcomes.join("")||"empty"} by ${maximumDifference}.`,hint:"Restore the declared target on every reachable measurement outcome path or remove the invariant assertion.",line:assertion.line}))}else{invariantLabels.push(label3)}}return{evidence:{tier:1,label:"verified",backend,conditioningMeasurements,reachablePaths:branches.length,probabilitySum,tolerance:NM_FEEDFORWARD_VERIFICATION_TOLERANCE,invariants:invariantLabels},diagnostics}}var NM_LEARNING_PACKAGE_FORMAT="nm-learning-package";var NM_LEARNING_PACKAGE_VERSION="0.1";var NM_STATE_TIMELINE_MAX_SNAPSHOT_AMPLITUDES=1024;function getJsonType(value){if(Array.isArray(value)){return"array"}if(value===null){return"null"}if(Number.isInteger(value)){return"integer"}return typeof value}function formatJsonPath(parent,segment){return parent==="$"?`$.${segment}`:`${parent}.${segment}`}function isJsonObject(value){return Boolean(value)&&typeof value==="object"&&!Array.isArray(value)}function validateJsonValueAgainstSchema(value,schema,path,issues){if("const"in schema&&value!==schema.const){issues.push({path,keyword:"const",message:`Expected ${JSON.stringify(schema.const)}.`})}if(Array.isArray(schema.enum)&&!schema.enum.includes(value)){issues.push({path,keyword:"enum",message:`Expected one of ${schema.enum.map(item=>JSON.stringify(item)).join(", ")}.`})}if(typeof schema.type==="string"){const actualType=getJsonType(value);const typeMatches=schema.type==="number"?actualType==="number"||actualType==="integer":actualType===schema.type;if(!typeMatches){issues.push({path,keyword:"type",message:`Expected ${schema.type}, received ${actualType}.`});return}}if(schema.type==="string"&&typeof value==="string"&&typeof schema.minLength==="number"){if(value.length<schema.minLength){issues.push({path,keyword:"minLength",message:`Expected at least ${schema.minLength} characters.`})}}if(schema.type==="string"&&typeof value==="string"&&typeof schema.maxLength==="number"&&value.length>schema.maxLength)issues.push({path,keyword:"maxLength",message:`Expected at most ${schema.maxLength} characters.`});if(schema.type==="string"&&typeof value==="string"&&typeof schema.pattern==="string"&&!new RegExp(schema.pattern,"u").test(value))issues.push({path,keyword:"pattern",message:`Value does not match ${schema.pattern}.`});if((schema.type==="number"||schema.type==="integer")&&typeof value==="number"){if(typeof schema.minimum==="number"&&value<schema.minimum){issues.push({path,keyword:"minimum",message:`Expected value >= ${schema.minimum}.`})}if(typeof schema.maximum==="number"&&value>schema.maximum){issues.push({path,keyword:"maximum",message:`Expected value <= ${schema.maximum}.`})}if(typeof schema.exclusiveMinimum==="number"&&value<=schema.exclusiveMinimum)issues.push({path,keyword:"exclusiveMinimum",message:`Expected value > ${schema.exclusiveMinimum}.`});if(typeof schema.exclusiveMaximum==="number"&&value>=schema.exclusiveMaximum)issues.push({path,keyword:"exclusiveMaximum",message:`Expected value < ${schema.exclusiveMaximum}.`})}if(schema.type==="object"&&isJsonObject(value)){const required=Array.isArray(schema.required)?schema.required.filter(field=>typeof field==="string"):[];for(const field of required){if(!(field in value)){issues.push({path:formatJsonPath(path,field),keyword:"required",message:`Missing required field "${field}".`})}}const properties=isJsonObject(schema.properties)?schema.properties:{};for(const[field,propertySchema]of Object.entries(properties)){if(field in value&&isJsonObject(propertySchema)){validateJsonValueAgainstSchema(value[field],propertySchema,formatJsonPath(path,field),issues)}}if(schema.additionalProperties===false){const knownFields=new Set(Object.keys(properties));for(const field of Object.keys(value)){if(!knownFields.has(field)){issues.push({path:formatJsonPath(path,field),keyword:"additionalProperties",message:`Unexpected field "${field}".`})}}}}if(schema.type==="array"&&Array.isArray(value)&&isJsonObject(schema.items)){if(typeof schema.minItems==="number"&&value.length<schema.minItems)issues.push({path,keyword:"minItems",message:`Expected at least ${schema.minItems} items.`});if(typeof schema.maxItems==="number"&&value.length>schema.maxItems)issues.push({path,keyword:"maxItems",message:`Expected at most ${schema.maxItems} items.`});if(schema.uniqueItems===true&&new Set(value.map(item=>JSON.stringify(item))).size!==value.length)issues.push({path,keyword:"uniqueItems",message:"Expected unique items."});value.forEach((item,index)=>{validateJsonValueAgainstSchema(item,schema.items,`${path}[${index}]`,issues)})}}function validateJsonAgainstSchema(value,schema){const issues=[];validateJsonValueAgainstSchema(value,schema,"$",issues);return{valid:issues.length===0,issues}}var NM_LEARNING_PACKAGE_SCHEMA_PATH="/schemas/nm-learning-package-0.1.schema.json";var NM_LEARNING_PACKAGE_SCHEMA_ID=`https://quantumsoftware.tech${NM_LEARNING_PACKAGE_SCHEMA_PATH}`;var NM_LEARNING_PACKAGE_MAX_METADATA_ITEMS=100;function createNMLearningPackageIntegrity(value){return{algorithm:"fnv1a-64",digest:hash(canonicalJson2(value))}}function canonicalJson2(value){if(Array.isArray(value))return`[${value.map(canonicalJson2).join(",")}]`;if(value&&typeof value==="object")return`{${Object.entries(value).filter(([,child])=>child!==void 0).sort(([left],[right])=>left.localeCompare(right)).map(([key4,child])=>`${JSON.stringify(key4)}:${canonicalJson2(child)}`).join(",")}}`;return JSON.stringify(value)}function hash(value){let high=3421674724;let low=2216829733;for(const byte of new TextEncoder().encode(value)){low=(low^byte)>>>0;const lowProduct=low*435;const carry=Math.floor(lowProduct/4294967296);high=high*435+carry+(low<<8>>>0)>>>0;low=lowProduct>>>0}return`${high.toString(16).padStart(8,"0")}${low.toString(16).padStart(8,"0")}`}function createNMLearningPackageJsonSchema(){const lineAnnotatedText={type:"object",additionalProperties:false,required:["text","line"],properties:{text:{type:"string"},line:{type:"integer",minimum:1}}};return{$schema:"https://json-schema.org/draft/2020-12/schema",$id:NM_LEARNING_PACKAGE_SCHEMA_ID,title:"N/M Learning Package",description:"Portable learning, diagnostics, resources, readiness, and source metadata for an N/M program.",type:"object",additionalProperties:false,required:["format","$schema","version","source","success","diagnostics","goals","outcomes","rubrics","misconceptions","quizzes","labs","datasets","checkpoints","hints","concepts","prerequisites","explanations","readiness","integrity"],properties:{$schema:{const:NM_LEARNING_PACKAGE_SCHEMA_ID},format:{const:NM_LEARNING_PACKAGE_FORMAT},version:{const:NM_LEARNING_PACKAGE_VERSION},moduleName:{type:"string"},source:{type:"object",additionalProperties:false,required:["language","code","lineCount"],properties:{language:{const:"N/M"},code:{type:"string",minLength:1},lineCount:{type:"integer",minimum:1}}},success:{type:"boolean"},diagnostics:{type:"array",maxItems:NM_LEARNING_PACKAGE_MAX_METADATA_ITEMS,items:{type:"object",additionalProperties:false,required:["code","severity","message"],properties:{code:{type:"string"},severity:{enum:["error","warning","info"]},message:{type:"string"},line:{type:"integer",minimum:1},column:{type:"integer",minimum:1},hint:{type:"string"},translationKey:{type:"string"},translationValues:{type:"object",additionalProperties:true},hintTranslationKey:{type:"string"},hintTranslationValues:{type:"object",additionalProperties:true}}}},goals:{type:"array",maxItems:NM_LEARNING_PACKAGE_MAX_METADATA_ITEMS,items:lineAnnotatedText},outcomes:{type:"array",maxItems:NM_LEARNING_PACKAGE_MAX_METADATA_ITEMS,items:lineAnnotatedText},rubrics:{type:"array",maxItems:NM_LEARNING_PACKAGE_MAX_METADATA_ITEMS,items:{type:"object",additionalProperties:false,required:["text","line"],properties:{text:{type:"string"},weight:{type:"number"},line:{type:"integer",minimum:1}}}},misconceptions:{type:"array",maxItems:NM_LEARNING_PACKAGE_MAX_METADATA_ITEMS,items:lineAnnotatedText},quizzes:{type:"array",maxItems:NM_LEARNING_PACKAGE_MAX_METADATA_ITEMS,items:{type:"object",additionalProperties:false,required:["question","line"],properties:{question:{type:"string"},answer:{type:"string"},line:{type:"integer",minimum:1}}}},labs:{type:"array",maxItems:NM_LEARNING_PACKAGE_MAX_METADATA_ITEMS,items:{type:"object",additionalProperties:false,required:["id","line"],properties:{id:{type:"string"},minutes:{type:"number",minimum:0},line:{type:"integer",minimum:1}}}},datasets:{type:"array",maxItems:NM_LEARNING_PACKAGE_MAX_METADATA_ITEMS,items:{type:"object",additionalProperties:false,required:["id","line"],properties:{id:{type:"string"},split:{enum:["train","validation","test","synthetic"]},line:{type:"integer",minimum:1}}}},checkpoints:{type:"array",maxItems:NM_LEARNING_PACKAGE_MAX_METADATA_ITEMS,items:{type:"object",additionalProperties:false,required:["text","line"],properties:{text:{type:"string"},kind:{enum:["predict","inspect","explain","debug"]},line:{type:"integer",minimum:1}}}},hints:{type:"array",maxItems:NM_LEARNING_PACKAGE_MAX_METADATA_ITEMS,items:lineAnnotatedText},concepts:{type:"array",maxItems:NM_LEARNING_PACKAGE_MAX_METADATA_ITEMS,items:{type:"object",additionalProperties:false,required:["name","line"],properties:{name:{type:"string"},line:{type:"integer",minimum:1}}}},level:{type:"object",additionalProperties:false,required:["value","line"],properties:{value:{enum:["beginner","intermediate","advanced"]},line:{type:"integer",minimum:1}}},prerequisites:{type:"array",maxItems:NM_LEARNING_PACKAGE_MAX_METADATA_ITEMS,items:{type:"object",additionalProperties:false,required:["name","line"],properties:{name:{type:"string"},line:{type:"integer",minimum:1}}}},explanations:{type:"array",maxItems:NM_LEARNING_PACKAGE_MAX_METADATA_ITEMS,items:lineAnnotatedText},resources:{type:"object",additionalProperties:false,properties:{qubits:{type:"integer",minimum:0},statements:{type:"integer",minimum:0},depth:{type:"integer",minimum:0},gates:{type:"integer",minimum:0},singleQubitGates:{type:"integer",minimum:0},twoQubitGates:{type:"integer",minimum:0},threeQubitGates:{type:"integer",minimum:0},measurements:{type:"integer",minimum:0},resets:{type:"integer",minimum:0},barriers:{type:"integer",minimum:0},assertions:{type:"integer",minimum:0},expectations:{type:"integer",minimum:0},metrics:{type:"integer",minimum:0},gradients:{type:"integer",minimum:0},encodings:{type:"integer",minimum:0},observations:{type:"integer",minimum:0},tests:{type:"integer",minimum:0},properties:{type:"integer",minimum:0},snapshots:{type:"integer",minimum:0},conditionals:{type:"integer",minimum:0},shows:{type:"integer",minimum:0},expectationTerms:{type:"integer",minimum:0},ftqcEnabled:{type:"boolean"},logicalGates:{type:"integer",minimum:0},logicalQubits:{type:"integer",minimum:0},cliffordCount:{type:"integer",minimum:0},tCount:{type:"integer",minimum:0},tDepth:{type:"integer",minimum:0},codeDistance:{type:"integer",minimum:0},surfaceCodeOverhead:{type:"integer",minimum:0},physicalQubits:{type:"integer",minimum:0},magicStates:{type:"integer",minimum:0},estimatedRuntimeMs:{type:"number",minimum:0},targetError:{type:"number",exclusiveMinimum:0,exclusiveMaximum:1}}},readiness:{type:"object",additionalProperties:false,required:["tier","score","present","total","checks","missing","nextActions","suggestions"],properties:{tier:{enum:["blocked","starter","draft","lab-ready","complete"]},score:{type:"integer",minimum:0,maximum:100},present:{type:"integer",minimum:0},total:{type:"integer",minimum:0},checks:{type:"array",items:{type:"object",additionalProperties:false,required:["key","present"],properties:{key:{enum:["runnable","goal","outcome","rubric","misconception","quiz","lab","dataset","checkpoint","hint","concept","level","prerequisite","explanation"]},present:{type:"boolean"}}}},missing:{type:"array",items:{type:"string"}},nextActions:{type:"array",items:{type:"string"}},suggestions:{type:"array",items:{type:"object",additionalProperties:false,required:["key","title","snippet"],properties:{key:{type:"string"},title:{type:"string"},snippet:{type:"string"}}}}}},integrity:{type:"object",additionalProperties:false,required:["algorithm","digest"],properties:{algorithm:{const:"fnv1a-64"},digest:{type:"string",pattern:"^[0-9a-f]{16}$"}}}}}}function createNMLearningPackage(code,result2,parseOptions={}){const parsed=parseNMCode(code,parseOptions);const learningPackage={$schema:NM_LEARNING_PACKAGE_SCHEMA_ID,format:NM_LEARNING_PACKAGE_FORMAT,version:NM_LEARNING_PACKAGE_VERSION,...parsed.program.moduleName?{moduleName:parsed.program.moduleName}:{},source:{language:"N/M",code,lineCount:code.split(/\r?\n/).length},success:result2.success,diagnostics:result2.diagnostics??parsed.diagnostics,goals:result2.learningGoals??[],outcomes:result2.learningOutcomes??[],rubrics:result2.learningRubrics??[],misconceptions:result2.learningMisconceptions??[],quizzes:result2.learningQuizzes??[],labs:result2.learningLabs??[],datasets:result2.learningDatasets??[],checkpoints:result2.learningCheckpoints??[],hints:result2.learningHints??[],concepts:result2.learningConcepts??[],...result2.learningLevel?{level:result2.learningLevel}:{},prerequisites:result2.learningPrerequisites??[],explanations:result2.explanations??[],...result2.resources?{resources:result2.resources}:{}};const withReadiness={...learningPackage,readiness:createNMLearningPackageReadiness(learningPackage)};return{...withReadiness,integrity:createNMLearningPackageIntegrity(withReadiness)}}function createNMLearningPackageReadiness(learningPackage){const checks=[{key:"runnable",present:learningPackage.success&&!learningPackage.diagnostics.some(item=>item.severity==="error")},{key:"goal",present:learningPackage.goals.length>0},{key:"outcome",present:learningPackage.outcomes.length>0},{key:"rubric",present:learningPackage.rubrics.length>0},{key:"misconception",present:learningPackage.misconceptions.length>0},{key:"quiz",present:learningPackage.quizzes.length>0},{key:"lab",present:learningPackage.labs.length>0},{key:"dataset",present:learningPackage.datasets.length>0},{key:"checkpoint",present:learningPackage.checkpoints.length>0},{key:"hint",present:learningPackage.hints.length>0},{key:"concept",present:learningPackage.concepts.length>0},{key:"level",present:learningPackage.level!=null},{key:"prerequisite",present:learningPackage.prerequisites.length>0},{key:"explanation",present:learningPackage.explanations.length>0}];const present=checks.filter(check=>check.present).length;const score=Math.round(present/checks.length*100);const missing=checks.filter(check=>!check.present).map(check=>check.key);const nextActionPriority=["runnable","goal","outcome","checkpoint","lab","dataset","quiz","rubric","misconception","hint","concept","level","prerequisite","explanation"];const nextActions=nextActionPriority.filter(key4=>missing.includes(key4)).slice(0,3);return{tier:getNMLearningPackageReadinessTier(score,missing),score,present,total:checks.length,checks,missing,nextActions,suggestions:nextActions.map(createNMLearningPackageReadinessSuggestion)}}function createNMLearningPackageReadinessSuggestion(key4){const suggestions={runnable:{key:key4,title:"Make the program runnable",snippet:"module learning_demo;\n\nfn main() {\n let q: QReg<1> = qreg[1];\n H(q[0]);\n return 0;\n}"},goal:{key:key4,title:"Add a learning goal",snippet:'@goal("Describe the lab objective.");'},outcome:{key:key4,title:"Add a measurable outcome",snippet:'@outcome("Explain what the learner should be able to predict or verify.");'},rubric:{key:key4,title:"Add a rubric item",snippet:'@rubric("Evaluate the explanation or prediction quality.", weight: 0.5);'},misconception:{key:key4,title:"Add a misconception note",snippet:'@misconception("Name the likely incorrect mental model.");'},quiz:{key:key4,title:"Add a quiz prompt",snippet:'@quiz("Ask a short self-check question.", answer: "Expected answer.");'},lab:{key:key4,title:"Bind a lab id",snippet:'@lab("lab-id", minutes: 10);'},dataset:{key:key4,title:"Tag a dataset split",snippet:'@dataset("dataset-id", split: "train");'},checkpoint:{key:key4,title:"Add a guided checkpoint",snippet:'@checkpoint("Predict the result before running.", kind: "predict");'},hint:{key:key4,title:"Add a learner hint",snippet:'@hint("Give a small nudge without revealing the full answer.");'},concept:{key:key4,title:"Tag a concept",snippet:'@concept("superposition");'},level:{key:key4,title:"Set a learning level",snippet:'@level("beginner");'},prerequisite:{key:key4,title:"Add a prerequisite",snippet:'@prereq("basic-gates");'},explanation:{key:key4,title:"Add an explanation note",snippet:'@explain("Explain what the next operation is doing.");'}};return suggestions[key4]}function getNMLearningPackageReadinessTier(score,missing){if(missing.includes("runnable")){return"blocked"}if(score===100){return"complete"}if(score>=80){return"lab-ready"}if(score>=50){return"draft"}return"starter"}function serializeNMLearningPackage(code,result2,parseOptions={}){return JSON.stringify(createNMLearningPackage(code,result2,parseOptions),null,2)}function validateNMLearningPackageJson(value){return validateJsonAgainstSchema(value,createNMLearningPackageJsonSchema())}function validateNMLearningPackageJsonText(json){try{return validateNMLearningPackageJson(JSON.parse(json))}catch{return{valid:false,issues:[{path:"$",keyword:"parse",message:"Could not parse this learning package JSON."}]}}}var NM_MODEL_PACKAGE_FORMAT="nm-model";var NM_MODEL_PACKAGE_VERSION="0.1";var NM_MODEL_PACKAGE_SCHEMA_PATH="/schemas/nm-model-package-0.1.schema.json";var NM_MODEL_PACKAGE_SCHEMA_ID=`https://quantumsoftware.tech${NM_MODEL_PACKAGE_SCHEMA_PATH}`;var NM_MODEL_PACKAGE_MAX_SOURCE_BYTES=2e5;var NM_MODEL_PACKAGE_MAX_NAME_CHARACTERS=128;var NM_MODEL_PACKAGE_MAX_PARAMETERS=8;var NM_MODEL_PACKAGE_MAX_HISTORY=101;var NM_MODEL_PACKAGE_MAX_STEPS=100;var NM_MODEL_PACKAGE_MAX_QUBITS=14;var nmModelPackageDiagnosticCodes={json:"NM-MODEL-001",format:"NM-MODEL-002",version:"NM-MODEL-003",unknown:"NM-MODEL-004",limit:"NM-MODEL-005",source:"NM-MODEL-006",training:"NM-MODEL-007",environment:"NM-MODEL-008",integrity:"NM-MODEL-009",migration:"NM-MODEL-010",compatibility:"NM-MODEL-011"};var rootKeys=new Set(["formatVersion","kind","name","createdAt","languageVersion","source","trainedParams","training","environment","integrity"]);var trainingKeys=new Set(["optimizer","steps","learningRate","objective","loss","datasetId","costHistory","finalCost","accuracy","seed"]);var environmentKeys=new Set(["engine","qubits","noise"]);var noiseKeys=new Set(["model","probability"]);var integrityKeys=new Set(["algorithm","sourceHash","packageHash"]);var optimizers=new Set(["gd","momentum","adam","spsa","qng"]);var losses=new Set(["mse","hinge","cross_entropy"]);var identifierPattern3=/^[A-Za-z_]\w{0,127}$/u;var boundedIdPattern=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/u;var slugPattern=/^[a-z0-9]+(?:-[a-z0-9]+)*$/u;var digestPattern=/^[0-9a-f]{16}$/u;function createNMModelPackageFromTrainingEvidence(source,training,name2,options={}){if(typeof source!=="string"||utf8Length(source)>NM_MODEL_PACKAGE_MAX_SOURCE_BYTES)return failure6(nmModelPackageDiagnosticCodes.limit,`Model source must not exceed ${NM_MODEL_PACKAGE_MAX_SOURCE_BYTES} UTF-8 bytes.`);if(needsNMQMLSourceContext(source))return failure6(nmModelPackageDiagnosticCodes.compatibility,"Source-only model packages cannot preserve helper training permissions or workspace dependencies; helper model packages are unsupported.");if(typeof name2!=="string"||name2.length>NM_MODEL_PACKAGE_MAX_NAME_CHARACTERS||!slugPattern.test(name2))return failure6(nmModelPackageDiagnosticCodes.format,"Model name must be a bounded lowercase slug.");const parsed=parseNMCode(source);const createdAt=options.createdAt??new Date().toISOString();if(!isIsoDate(createdAt))return failure6(nmModelPackageDiagnosticCodes.format,"Model createdAt must be a canonical ISO date-time.");if(parsed.diagnostics.some(diagnostic5=>diagnostic5.severity==="error"))return failure6(nmModelPackageDiagnosticCodes.source,"Model source has parser diagnostics.");if(!training||training.costHistory.length===0)return failure6(nmModelPackageDiagnosticCodes.training,"Training evidence has no completed cost history.");const paramNames=Object.keys(parsed.params).sort();if(paramNames.length<1||paramNames.length>NM_MODEL_PACKAGE_MAX_PARAMETERS||JSON.stringify(paramNames)!==JSON.stringify(Object.keys(training.finalParams).sort())){return failure6(nmModelPackageDiagnosticCodes.training,"Trained parameter keys do not match the bounded source params.")}const base2={formatVersion:NM_MODEL_PACKAGE_VERSION,kind:NM_MODEL_PACKAGE_FORMAT,name:name2,createdAt,languageVersion:nmVersionManifest.languageVersion,source,trainedParams:{...training.finalParams},training:{optimizer:training.optimizer,steps:training.steps,learningRate:training.learningRate,objective:training.objective,...training.loss?{loss:training.loss}:{},...training.datasetId?{datasetId:training.datasetId}:{},costHistory:[...training.costHistory],finalCost:training.costHistory.at(-1),...training.accuracy==null?{}:{accuracy:training.accuracy},...(training.seed??parsed.program.seed)==null?{}:{seed:training.seed??parsed.program.seed}},environment:{engine:"statevector",qubits:parsed.numQubits,...parsed.program.noise?{noise:{model:parsed.program.noise.model,probability:parsed.program.noise.probability}}:{}}};const pkg={...base2,integrity:createIntegrity(base2)};const validation=validateNMModelPackageJson(pkg);return validation.valid?pkg:failure6(validation.issues[0]?.code??nmModelPackageDiagnosticCodes.integrity,validation.issues[0]?.message??"Invalid model package.")}function serializeNMModelPackage(pkg){const validation=validateNMModelPackageJson(pkg);if(!validation.valid)throw new Error(`${validation.issues[0]?.code}: ${validation.issues[0]?.message}`);return`${JSON.stringify(pkg,null,2)}
|
|
1487
1487
|
`}function validateNMModelPackageJson(value){const issues=[];if(!isRecord6(value))return{valid:false,issues:[issue6(nmModelPackageDiagnosticCodes.format,"$","type","Expected a model package object.")]};rejectUnknown(value,rootKeys,"$",issues);if(value.kind!==NM_MODEL_PACKAGE_FORMAT)issues.push(issue6(nmModelPackageDiagnosticCodes.format,"$.kind","const",`Expected kind ${NM_MODEL_PACKAGE_FORMAT}.`));if(value.formatVersion!==NM_MODEL_PACKAGE_VERSION)issues.push(issue6(nmModelPackageDiagnosticCodes.version,"$.formatVersion","const",`Expected formatVersion ${NM_MODEL_PACKAGE_VERSION}.`));if(typeof value.name!=="string"||value.name.length>NM_MODEL_PACKAGE_MAX_NAME_CHARACTERS||!slugPattern.test(value.name))issues.push(issue6(nmModelPackageDiagnosticCodes.format,"$.name","pattern","Expected a bounded lowercase slug."));if(typeof value.createdAt!=="string"||!isIsoDate(value.createdAt))issues.push(issue6(nmModelPackageDiagnosticCodes.format,"$.createdAt","format","Expected a canonical ISO date-time."));if(typeof value.languageVersion!=="string"||!/^\d+\.\d+(?:\.\d+)?(?:[-+][0-9A-Za-z.-]+)?$/u.test(value.languageVersion))issues.push(issue6(nmModelPackageDiagnosticCodes.format,"$.languageVersion","pattern","Expected a semantic language version."));let parsed;if(typeof value.source!=="string")issues.push(issue6(nmModelPackageDiagnosticCodes.source,"$.source","type","Expected N/M source text."));else if(utf8Length(value.source)>NM_MODEL_PACKAGE_MAX_SOURCE_BYTES)issues.push(issue6(nmModelPackageDiagnosticCodes.limit,"$.source","maxBytes",`Model source exceeds ${NM_MODEL_PACKAGE_MAX_SOURCE_BYTES} UTF-8 bytes.`));else if(needsNMQMLSourceContext(value.source))issues.push(issue6(nmModelPackageDiagnosticCodes.compatibility,"$.source","sourceContext","Source-only model packages do not support helper training or workspace dependencies."));else{parsed=parseNMCode(value.source);if(parsed.diagnostics.some(diagnostic5=>diagnostic5.severity==="error"))issues.push(issue6(nmModelPackageDiagnosticCodes.source,"$.source","parse","Source does not parse cleanly."))}if(!isRecord6(value.trainedParams))issues.push(issue6(nmModelPackageDiagnosticCodes.training,"$.trainedParams","type","Expected trained parameter values."));else{const entries=Object.entries(value.trainedParams);if(entries.length<1||entries.length>NM_MODEL_PACKAGE_MAX_PARAMETERS)issues.push(issue6(nmModelPackageDiagnosticCodes.limit,"$.trainedParams","propertyCount",`Expected 1-${NM_MODEL_PACKAGE_MAX_PARAMETERS} parameters.`));if(entries.some(([name2,entry])=>!identifierPattern3.test(name2)||!isFiniteNumber2(entry)))issues.push(issue6(nmModelPackageDiagnosticCodes.training,"$.trainedParams","finiteParameters","Expected bounded identifiers with finite numeric values."));if(parsed&&JSON.stringify(Object.keys(parsed.params).sort())!==JSON.stringify(entries.map(([name2])=>name2).sort()))issues.push(issue6(nmModelPackageDiagnosticCodes.training,"$.trainedParams","parameterIdentity","Parameter keys must exactly match source params."))}validateTraining(value.training,issues);validateEnvironment(value.environment,parsed,issues);validateIntegrity(value,issues);if(typeof value.languageVersion==="string"){const expected=nmVersionManifest.languageVersion.split(".").slice(0,2).join(".");const actual=value.languageVersion.split(".").slice(0,2).join(".");if(!isNMReadableModelLanguageVersion(value.languageVersion))issues.push(issue6(nmModelPackageDiagnosticCodes.version,"$.languageVersion","compatibility",`Language version ${actual} differs from ${expected}.`,"warning"))}return{valid:!issues.some(entry=>entry.severity==="error"),issues}}function validateTraining(value,issues){if(!isRecord6(value)){issues.push(issue6(nmModelPackageDiagnosticCodes.training,"$.training","type","Expected training evidence."));return}rejectUnknown(value,trainingKeys,"$.training",issues);if(!optimizers.has(value.optimizer))issues.push(issue6(nmModelPackageDiagnosticCodes.training,"$.training.optimizer","enum","Unknown optimizer."));if(!Number.isInteger(value.steps)||value.steps<1||value.steps>NM_MODEL_PACKAGE_MAX_STEPS)issues.push(issue6(nmModelPackageDiagnosticCodes.training,"$.training.steps","range",`Expected 1-${NM_MODEL_PACKAGE_MAX_STEPS} steps.`));if(!isFiniteNumber2(value.learningRate)||value.learningRate<=0||value.learningRate>5)issues.push(issue6(nmModelPackageDiagnosticCodes.training,"$.training.learningRate","range","Expected learningRate in (0, 5]."));if(value.objective!=="minimize"&&value.objective!=="maximize")issues.push(issue6(nmModelPackageDiagnosticCodes.training,"$.training.objective","enum","Unknown objective."));if(value.loss!=null&&!losses.has(value.loss))issues.push(issue6(nmModelPackageDiagnosticCodes.training,"$.training.loss","enum","Unknown loss."));if(value.datasetId!=null&&(typeof value.datasetId!=="string"||!boundedIdPattern.test(value.datasetId)))issues.push(issue6(nmModelPackageDiagnosticCodes.training,"$.training.datasetId","pattern","Expected a bounded dataset id."));if(!Array.isArray(value.costHistory)||value.costHistory.length<1||value.costHistory.length>NM_MODEL_PACKAGE_MAX_HISTORY||value.costHistory.some(cost3=>!isFiniteNumber2(cost3)))issues.push(issue6(nmModelPackageDiagnosticCodes.training,"$.training.costHistory","finiteHistory",`Expected 1-${NM_MODEL_PACKAGE_MAX_HISTORY} finite costs.`));if(!isFiniteNumber2(value.finalCost)||!Array.isArray(value.costHistory)||!Object.is(value.finalCost,value.costHistory.at(-1)))issues.push(issue6(nmModelPackageDiagnosticCodes.training,"$.training.finalCost","const","Final cost must exactly equal the last history value."));if(value.accuracy!=null&&(!isFiniteNumber2(value.accuracy)||value.accuracy<0||value.accuracy>1))issues.push(issue6(nmModelPackageDiagnosticCodes.training,"$.training.accuracy","range","Expected accuracy in [0, 1]."));if(value.seed!=null&&(!Number.isSafeInteger(value.seed)||value.seed<0||value.seed>4294967295))issues.push(issue6(nmModelPackageDiagnosticCodes.training,"$.training.seed","range","Expected an unsigned 32-bit seed."))}function validateEnvironment(value,parsed,issues){if(!isRecord6(value)){issues.push(issue6(nmModelPackageDiagnosticCodes.environment,"$.environment","type","Expected environment metadata."));return}rejectUnknown(value,environmentKeys,"$.environment",issues);if(value.engine!=="statevector")issues.push(issue6(nmModelPackageDiagnosticCodes.environment,"$.environment.engine","const","Expected statevector engine."));if(!Number.isInteger(value.qubits)||value.qubits<1||value.qubits>NM_MODEL_PACKAGE_MAX_QUBITS)issues.push(issue6(nmModelPackageDiagnosticCodes.environment,"$.environment.qubits","range",`Expected 1-${NM_MODEL_PACKAGE_MAX_QUBITS} qubits.`));else if(parsed&&value.qubits!==parsed.numQubits)issues.push(issue6(nmModelPackageDiagnosticCodes.environment,"$.environment.qubits","sourceIdentity","Environment qubits must match parsed source qubits."));if(value.noise!=null){if(!isRecord6(value.noise))issues.push(issue6(nmModelPackageDiagnosticCodes.environment,"$.environment.noise","type","Expected noise metadata."));else{rejectUnknown(value.noise,noiseKeys,"$.environment.noise",issues);if(typeof value.noise.model!=="string"||!boundedIdPattern.test(value.noise.model))issues.push(issue6(nmModelPackageDiagnosticCodes.environment,"$.environment.noise.model","pattern","Expected a bounded noise model."));if(!isFiniteNumber2(value.noise.probability)||value.noise.probability<0||value.noise.probability>1)issues.push(issue6(nmModelPackageDiagnosticCodes.environment,"$.environment.noise.probability","range","Expected noise probability in [0, 1]."))}}if(parsed){const sourceNoise=parsed.program.noise;const environmentNoise=isRecord6(value.noise)?value.noise:void 0;if(!sourceNoise&&environmentNoise)issues.push(issue6(nmModelPackageDiagnosticCodes.environment,"$.environment.noise","sourceIdentity","Environment noise must be absent when source has no noise annotation."));else if(sourceNoise&&(!environmentNoise||environmentNoise.model!==sourceNoise.model||environmentNoise.probability!==sourceNoise.probability))issues.push(issue6(nmModelPackageDiagnosticCodes.environment,"$.environment.noise","sourceIdentity","Environment noise must exactly match the parsed source annotation."))}}function validateIntegrity(value,issues){const integrity=value.integrity;if(!isRecord6(integrity)){issues.push(issue6(nmModelPackageDiagnosticCodes.integrity,"$.integrity","required","Expected model integrity evidence."));return}rejectUnknown(integrity,integrityKeys,"$.integrity",issues);if(integrity.algorithm!=="fnv1a-64")issues.push(issue6(nmModelPackageDiagnosticCodes.integrity,"$.integrity.algorithm","const","Expected fnv1a-64 integrity algorithm."));if(typeof integrity.sourceHash!=="string"||!digestPattern.test(integrity.sourceHash)||typeof value.source!=="string"||integrity.sourceHash!==hashNMWorkspaceText(value.source))issues.push(issue6(nmModelPackageDiagnosticCodes.integrity,"$.integrity.sourceHash","digest","Source integrity digest does not match."));if(typeof integrity.packageHash!=="string"||!digestPattern.test(integrity.packageHash)||integrity.packageHash!==hashNMWorkspaceText(canonicalJson3(withoutIntegrity(value))))issues.push(issue6(nmModelPackageDiagnosticCodes.integrity,"$.integrity.packageHash","digest","Package integrity digest does not match."))}function createIntegrity(value){return{algorithm:"fnv1a-64",sourceHash:hashNMWorkspaceText(String(value.source??"")),packageHash:hashNMWorkspaceText(canonicalJson3(withoutIntegrity(value)))}}function withoutIntegrity(value){const rest={...value};delete rest.integrity;return rest}function canonicalJson3(value){if(Array.isArray(value))return`[${value.map(canonicalJson3).join(",")}]`;if(isRecord6(value))return`{${Object.keys(value).sort().map(key4=>`${JSON.stringify(key4)}:${canonicalJson3(value[key4])}`).join(",")}}`;return JSON.stringify(value)}function rejectUnknown(value,allowed,path,issues){for(const key4 of Object.keys(value))if(!allowed.has(key4))issues.push(issue6(nmModelPackageDiagnosticCodes.unknown,`${path}.${key4}`,"additionalProperties","Unknown property."))}function issue6(code,path,keyword,message,severity="error"){return{code,path,keyword,message,severity}}function failure6(code,error){return{error,code}}function isRecord6(value){return!!value&&typeof value==="object"&&!Array.isArray(value)}function isFiniteNumber2(value){return typeof value==="number"&&Number.isFinite(value)}function isIsoDate(value){return Number.isFinite(Date.parse(value))&&new Date(value).toISOString()===value}function utf8Length(value){return new TextEncoder().encode(value).length}var NM_TEST_EXPLORER_REPORT_FORMAT="nm-test-explorer-report";var NM_TEST_EXPLORER_REPORT_VERSION="0.1";var NM_TEST_EXPLORER_REPORT_SCHEMA_PATH="/schemas/nm-test-explorer-report-0.1.schema.json";var NM_TEST_EXPLORER_REPORT_SCHEMA_ID=`https://quantumsoftware.tech${NM_TEST_EXPLORER_REPORT_SCHEMA_PATH}`;var NM_TEST_EXPLORER_REPORT_MAX_BYTES=1e6;var NM_TEST_EXPLORER_REPORT_MAX_CHECKS=1e3;var NM_TEST_EXPLORER_REPORT_MAX_DIAGNOSTICS=5e3;function createNMTestExplorerReport(result2,context={}){const source=normalizeSource2(context.source??"");const uri=normalizeUri(context.uri??"memory://nm-test-explorer/main.nm");const identity=(kind,name2,line)=>({id:createNMTestExplorerItemId(uri,kind,name2,line),kind,name:name2,uri,range:createSourceRange(source,line)});const checks=[...(result2.testResults??[]).map(entry=>({...identity("test",entry.name,entry.line),...entry,kind:"test"})),...(result2.propertyResults??[]).map(entry=>({...identity("property",entry.name,entry.line),...entry,kind:"property",cases:entry.cases.map(propertyCase=>({...propertyCase,assertions:propertyCase.assertions??[]}))})),...(result2.snapshotResults??[]).map(entry=>({...identity("snapshot",entry.name,entry.line),kind:"snapshot",name:entry.name,line:entry.line,passed:entry.passed,stateHash:entry.stateHash,irHash:entry.irHash,diagnosticCodes:entry.diagnosticCodes,probabilities:entry.probabilities}))];const passed=checks.filter(entry=>entry.passed).length;const properties=checks.filter(entry=>entry.kind==="property");const sourceHash=hashNMWorkspaceText(source);const core={$schema:NM_TEST_EXPLORER_REPORT_SCHEMA_ID,format:NM_TEST_EXPLORER_REPORT_FORMAT,version:NM_TEST_EXPLORER_REPORT_VERSION,passed:result2.success&&checks.length>0&&passed===checks.length,sourceTextStored:false,source:{uri,hash:sourceHash},summary:{total:checks.length,passed,failed:checks.length-passed,tests:result2.testResults?.length??0,properties:properties.length,snapshots:result2.snapshotResults?.length??0,propertyCases:properties.reduce((total,entry)=>total+entry.cases.length,0),assertionEvidence:properties.reduce((total,entry)=>total+entry.cases.reduce((caseTotal,propertyCase)=>caseTotal+propertyCase.assertions.length,0),0)},checks,diagnostics:result2.diagnostics??[],resources:result2.resources??null,execution:result2.execution??null};const reportId=createNMTestExplorerReportId(core);const base2={...core,reportId};return{...base2,integrity:{algorithm:"fnv1a-64",digest:hashNMWorkspaceText(canonicalJson4(base2))}}}function readNMTestExplorerReport(value,options={}){let text;try{text=JSON.stringify(value)}catch{return{issues:[reportIssue("NM-TEST-REPORT-001","$","Test report must be JSON-serializable.")]}}if(new TextEncoder().encode(text).byteLength>NM_TEST_EXPLORER_REPORT_MAX_BYTES)return{issues:[reportIssue("NM-TEST-REPORT-004","$",`Test report exceeds ${NM_TEST_EXPLORER_REPORT_MAX_BYTES} bytes.`)]};if(!isRecord7(value)||!hasExactKeys2(value,["$schema","format","version","reportId","passed","sourceTextStored","source","summary","checks","diagnostics","resources","execution","integrity"]))return{issues:[reportIssue("NM-TEST-REPORT-001","$","Expected the closed N/M Test Explorer report object.")]};const issues=[];if(value.$schema!==NM_TEST_EXPLORER_REPORT_SCHEMA_ID||value.format!==NM_TEST_EXPLORER_REPORT_FORMAT||value.version!==NM_TEST_EXPLORER_REPORT_VERSION||value.sourceTextStored!==false||typeof value.passed!=="boolean")issues.push(reportIssue("NM-TEST-REPORT-001","$","Test report identity or privacy fields are invalid."));if(!isRecord7(value.source)||!hasExactKeys2(value.source,["hash","uri"])||typeof value.source.uri!=="string"||normalizeUri(value.source.uri)!==value.source.uri||typeof value.source.hash!=="string"||!/^[0-9a-f]{16}$/u.test(value.source.hash))issues.push(reportIssue("NM-TEST-REPORT-001","$.source","Test report source identity is invalid."));if(options.source!==void 0&&isRecord7(value.source)&&value.source.hash!==hashNMWorkspaceText(normalizeSource2(options.source)))issues.push(reportIssue("NM-TEST-REPORT-002","$.source.hash","Test report source hash does not match the supplied source."));if(!isRecord7(value.summary)||!hasExactKeys2(value.summary,["assertionEvidence","failed","passed","properties","propertyCases","snapshots","tests","total"])||Object.values(value.summary).some(entry=>!isCount(entry,NM_TEST_EXPLORER_REPORT_MAX_CHECKS*10)))issues.push(reportIssue("NM-TEST-REPORT-001","$.summary","Test report summary is invalid."));if(!Array.isArray(value.checks)||value.checks.length>NM_TEST_EXPLORER_REPORT_MAX_CHECKS)issues.push(reportIssue("NM-TEST-REPORT-004","$.checks",`Expected at most ${NM_TEST_EXPLORER_REPORT_MAX_CHECKS} checks.`));else value.checks.forEach((check,index)=>validateCheck(check,index,issues));if(!Array.isArray(value.diagnostics)||value.diagnostics.length>NM_TEST_EXPLORER_REPORT_MAX_DIAGNOSTICS)issues.push(reportIssue("NM-TEST-REPORT-004","$.diagnostics",`Expected at most ${NM_TEST_EXPLORER_REPORT_MAX_DIAGNOSTICS} diagnostics.`));else value.diagnostics.forEach((diagnostic5,index)=>validateDiagnostic(diagnostic5,index,issues));validateResources(value.resources,issues);validateExecution(value.execution,issues);if(isRecord7(value.source)&&Array.isArray(value.checks)){for(const[index,check]of value.checks.entries())if(isRecord7(check)&&typeof check.kind==="string"&&typeof check.name==="string"&&typeof check.line==="number"){const expected=createNMTestExplorerItemId(String(value.source.uri),check.kind,check.name,check.line);if(check.id!==expected)issues.push(reportIssue("NM-TEST-REPORT-003",`$.checks[${index}].id`,"Stable test identity does not match URI, kind, name, and line."));if(check.uri!==value.source.uri)issues.push(reportIssue("NM-TEST-REPORT-002",`$.checks[${index}].uri`,"Check URI does not match the report source URI."));if(isRecord7(check.range)&&(check.range.startLine!==check.line||check.range.endLine!==check.line))issues.push(reportIssue("NM-TEST-REPORT-002",`$.checks[${index}].range`,"Check range does not match its reported source line."))}}if(isRecord7(value.summary)&&Array.isArray(value.checks)&&Array.isArray(value.diagnostics))validateSummary(value,issues);if(typeof value.reportId!=="string"||value.reportId!==createNMTestExplorerReportId(value))issues.push(reportIssue("NM-TEST-REPORT-003","$.reportId","Test report identity does not match its evidence."));if(!isRecord7(value.integrity)||!hasExactKeys2(value.integrity,["algorithm","digest"])||value.integrity.algorithm!=="fnv1a-64"||typeof value.integrity.digest!=="string")issues.push(reportIssue("NM-TEST-REPORT-003","$.integrity","Test report integrity metadata is invalid."));else{const base2={...value};Reflect.deleteProperty(base2,"integrity");if(value.integrity.digest!==hashNMWorkspaceText(canonicalJson4(base2)))issues.push(reportIssue("NM-TEST-REPORT-003","$.integrity.digest","Test report integrity check failed."))}return issues.length>0?{issues}:{report:structuredClone(value),issues:[]}}function serializeNMTestExplorerReport(report){const read5=readNMTestExplorerReport(report);if(!read5.report)throw new Error(read5.issues[0]?.message??"Invalid N/M test report.");return`${JSON.stringify(read5.report,null,2)}
|
|
1488
1488
|
`}function createNMTestExplorerItemId(uri,kind,name2,line){return`nmtest-${hashNMWorkspaceText(`${uri}\0${kind}\0${name2}\0${line}`)}`}function createNMTestExplorerReportId(value){const record3=isRecord7(value)?{...value}:{};Reflect.deleteProperty(record3,"integrity");Reflect.deleteProperty(record3,"reportId");return`nmtestreport-${hashNMWorkspaceText(canonicalJson4(record3))}`}function createSourceRange(source,line){const safeLine=Math.max(1,line);const text=source.split("\n")[safeLine-1]??"";return{startLine:safeLine,startColumn:1,endLine:safeLine,endColumn:text.length+1}}function normalizeSource2(source){return source.replace(/\r\n?/gu,"\n")}function normalizeUri(uri){const value=uri.trim();return value.length>0&&value.length<=2048?value:"memory://nm-test-explorer/main.nm"}function validateCheck(value,index,issues){const path=`$.checks[${index}]`;if(!isRecord7(value)||value.kind!=="test"&&value.kind!=="property"&&value.kind!=="snapshot"){issues.push(reportIssue("NM-TEST-REPORT-001",path,"Test check must be a supported closed-world check object."));return}const commonKeys=["diagnosticCodes","id","kind","line","name","passed","range","uri"];const exactKeys2=value.kind==="test"?commonKeys:value.kind==="property"?[...commonKeys,"cases","parameter",...value.failedValue===void 0?[]:["failedValue"]]:[...commonKeys,"irHash","probabilities","stateHash"];if(!hasExactKeys2(value,exactKeys2)||typeof value.id!=="string"||!/^nmtest-[0-9a-f]{16}$/u.test(value.id)||typeof value.name!=="string"||value.name.length<1||value.name.length>256||typeof value.uri!=="string"||value.uri.length<1||value.uri.length>2048||!isCount(value.line,Number.MAX_SAFE_INTEGER)||value.line<1||typeof value.passed!=="boolean"||!validateDiagnosticCodes(value.diagnosticCodes)||!validateRange(value.range)){issues.push(reportIssue("NM-TEST-REPORT-001",path,"Test check identity or evidence is invalid."));return}if(value.kind==="property"){if(typeof value.parameter!=="string"||value.parameter.length<1||value.parameter.length>128||value.failedValue!==void 0&&!isFiniteNumber3(value.failedValue)||!Array.isArray(value.cases)||value.cases.length>NM_TEST_EXPLORER_REPORT_MAX_CHECKS){issues.push(reportIssue("NM-TEST-REPORT-001",path,"Property check metadata is invalid."));return}value.cases.forEach((propertyCase,caseIndex)=>validatePropertyCase(propertyCase,`${path}.cases[${caseIndex}]`,issues))}if(value.kind==="snapshot"){if(typeof value.stateHash!=="string"||!/^[0-9a-f]{8,64}$/u.test(value.stateHash)||typeof value.irHash!=="string"||!/^[0-9a-f]{8,64}$/u.test(value.irHash)||!Array.isArray(value.probabilities)||value.probabilities.length>32||value.probabilities.some(entry=>!isRecord7(entry)||!hasExactKeys2(entry,["probability","state"])||typeof entry.state!=="string"||!/^[01]{1,5}$/u.test(entry.state)||!isFiniteNumber3(entry.probability)||entry.probability<0||entry.probability>1)){issues.push(reportIssue("NM-TEST-REPORT-001",path,"Snapshot identity or probability support is invalid."))}}}function validatePropertyCase(value,path,issues){if(!isRecord7(value)||!hasExactKeys2(value,["assertions","diagnosticCodes","passed",...value.seed===void 0?[]:["seed"],"value"])||!isFiniteNumber3(value.value)||typeof value.passed!=="boolean"||!validateDiagnosticCodes(value.diagnosticCodes)||value.seed!==void 0&&!Number.isSafeInteger(value.seed)||!Array.isArray(value.assertions)||value.assertions.length>NM_TEST_EXPLORER_REPORT_MAX_CHECKS*10){issues.push(reportIssue("NM-TEST-REPORT-001",path,"Property case evidence is invalid."));return}value.assertions.forEach((assertion,assertionIndex)=>validateAssertion(assertion,`${path}.assertions[${assertionIndex}]`,issues))}function validateAssertion(value,path,issues){const required=["actual","kind","label","line","passed"];const optional=["analytic","expected","maximum","minimum","phasePolicy","shots","standardError","tolerance"];if(!isRecord7(value)||Object.keys(value).some(key4=>!required.includes(key4)&&!optional.includes(key4))||required.some(key4=>!(key4 in value))||!["probability-tolerance","expectation-tolerance","expectation-range","equivalent-up-to-phase"].includes(String(value.kind))||typeof value.label!=="string"||value.label.length<1||value.label.length>512||!isFiniteNumber3(value.actual)||typeof value.passed!=="boolean"||!isCount(value.line,Number.MAX_SAFE_INTEGER)||value.line<1||["analytic","expected","maximum","minimum","standardError","tolerance"].some(key4=>value[key4]!==void 0&&!isFiniteNumber3(value[key4]))||value.shots!==void 0&&!isCount(value.shots,Number.MAX_SAFE_INTEGER)||value.phasePolicy!==void 0&&value.phasePolicy!=="global"){issues.push(reportIssue("NM-TEST-REPORT-001",path,"Property assertion evidence is invalid."))}}function validateDiagnostic(value,index,issues){const allowed=["code","column","hint","hintTranslationKey","hintTranslationValues","line","message","severity","translationKey","translationValues"];if(!isRecord7(value)||Object.keys(value).some(key4=>!allowed.includes(key4))||typeof value.code!=="string"||value.code.length<1||value.code.length>128||!["error","warning","info"].includes(String(value.severity))||typeof value.message!=="string"||value.message.length>4096||["hint","hintTranslationKey","translationKey"].some(key4=>value[key4]!==void 0&&typeof value[key4]!=="string")||["line","column"].some(key4=>value[key4]!==void 0&&(!isCount(value[key4],Number.MAX_SAFE_INTEGER)||value[key4]<1))||!validateTranslationValues(value.translationValues)||!validateTranslationValues(value.hintTranslationValues)){issues.push(reportIssue("NM-TEST-REPORT-001",`$.diagnostics[${index}]`,"Diagnostic evidence is invalid."))}}function validateResources(value,issues){if(value===null)return;const countKeys=["qubits","statements","gates","singleQubitGates","twoQubitGates","threeQubitGates","measurements","resets","barriers","assertions","expectations","metrics","gradients","encodings","observations","tests","properties","snapshots","shows","expectationTerms","conditionals","depth","logicalGates","logicalQubits","cliffordCount","tCount","tDepth","codeDistance","surfaceCodeOverhead","physicalQubits","magicStates"];const keys3=[...countKeys,"estimatedRuntimeMs","ftqcEnabled",...isRecord7(value)&&value.targetError!==void 0?["targetError"]:[]];if(!isRecord7(value)||!hasExactKeys2(value,keys3)||countKeys.some(key4=>!isCount(value[key4],Number.MAX_SAFE_INTEGER))||!isFiniteNumber3(value.estimatedRuntimeMs)||value.estimatedRuntimeMs<0||typeof value.ftqcEnabled!=="boolean"||value.targetError!==void 0&&(!isFiniteNumber3(value.targetError)||value.targetError<0||value.targetError>1)){issues.push(reportIssue("NM-TEST-REPORT-001","$.resources","Resource evidence is invalid."))}}function validateExecution(value,issues){if(value===null)return;if(!isRecord7(value)||!hasExactKeys2(value,["backend","deterministic","hardware","provider","runType","seed"])||value.runType!=="simulation"||value.provider!=="nm-local-simulator"||value.backend!=="statevector"&&value.backend!=="stabilizer"||value.seed!==null&&!Number.isSafeInteger(value.seed)||typeof value.deterministic!=="boolean"||value.hardware!==false){issues.push(reportIssue("NM-TEST-REPORT-001","$.execution","Execution provenance is invalid."))}}function validateSummary(value,issues){const rawChecks=value.checks;const checks=rawChecks.filter(isRecord7);const properties=checks.filter(check=>check.kind==="property");const expected={total:rawChecks.length,passed:checks.filter(check=>check.passed===true).length,failed:checks.filter(check=>check.passed!==true).length,tests:checks.filter(check=>check.kind==="test").length,properties:properties.length,snapshots:checks.filter(check=>check.kind==="snapshot").length,propertyCases:properties.reduce((total,check)=>total+(Array.isArray(check.cases)?check.cases.length:0),0),assertionEvidence:properties.reduce((total,check)=>total+(Array.isArray(check.cases)?check.cases.reduce((caseTotal,propertyCase)=>caseTotal+(isRecord7(propertyCase)&&Array.isArray(propertyCase.assertions)?propertyCase.assertions.length:0),0):0),0)};if(Object.entries(expected).some(([key4,expectedValue])=>value.summary[key4]!==expectedValue))issues.push(reportIssue("NM-TEST-REPORT-002","$.summary","Test report summary does not match its checks."));const hasError=value.diagnostics.some(diagnostic5=>isRecord7(diagnostic5)&&diagnostic5.severity==="error");const expectedPassed=expected.total>0&&expected.failed===0&&!hasError;if(value.passed!==expectedPassed)issues.push(reportIssue("NM-TEST-REPORT-002","$.passed","Test report pass state does not match its checks and diagnostics."))}function validateRange(value){return isRecord7(value)&&hasExactKeys2(value,["endColumn","endLine","startColumn","startLine"])&&[value.startLine,value.startColumn,value.endLine,value.endColumn].every(entry=>isCount(entry,Number.MAX_SAFE_INTEGER)&&entry>=1)&&value.endLine>=value.startLine}function validateDiagnosticCodes(value){return Array.isArray(value)&&value.length<=NM_TEST_EXPLORER_REPORT_MAX_DIAGNOSTICS&&value.every(code=>typeof code==="string"&&code.length>=1&&code.length<=128)}function validateTranslationValues(value){return value===void 0||isRecord7(value)&&Object.keys(value).length<=32&&Object.values(value).every(entry=>typeof entry==="string"||isFiniteNumber3(entry))}function isFiniteNumber3(value){return typeof value==="number"&&Number.isFinite(value)}function isCount(value,maximum){return Number.isSafeInteger(value)&&value>=0&&value<=maximum}function isRecord7(value){return typeof value==="object"&&value!==null&&!Array.isArray(value)}function hasExactKeys2(value,keys3){return Object.keys(value).sort().join("\0")===[...keys3].sort().join("\0")}function canonicalJson4(value){if(Array.isArray(value))return`[${value.map(canonicalJson4).join(",")}]`;if(isRecord7(value))return`{${Object.entries(value).filter(([,child])=>child!==void 0).sort(([left],[right])=>left.localeCompare(right)).map(([key4,child])=>`${JSON.stringify(key4)}:${canonicalJson4(child)}`).join(",")}}`;return JSON.stringify(value)}function reportIssue(code,path,message){return{code,path,message}}var NM_QML_BENCHMARK_CSV_SCHEMA_VERSION="0.2";var csvColumns=["schema_version","contract_version","source_hash","reproducibility_hash","workload_kind","dataset_id","dataset_version","train_samples","validation_samples","test_samples","seed","steps","learning_rate","objective","optimizer","repeat","success","improved","duration_ms","circuit_evaluations","initial_cost","final_cost","validation_loss","validation_accuracy","test_loss","test_accuracy"];function serializeNMBenchmarkJson(result2){assertBenchmarkResult(result2);return`${JSON.stringify(result2,null,2)}
|
|
1489
1489
|
`}function serializeNMBenchmarkCsv(result2){assertBenchmarkResult(result2);const supervised=result2.workload.kind==="supervised-classifier"?result2.workload:void 0;const rows=result2.series.flatMap(series=>series.runs.map(run=>[NM_QML_BENCHMARK_CSV_SCHEMA_VERSION,result2.contractVersion,result2.sourceHash,result2.reproducibility.artifactHash,result2.workload.kind,supervised?.datasetId??"",supervised?.datasetVersion??"",supervised?.samples.train??"",supervised?.samples.validation??"",supervised?.samples.test??"",result2.fairness.seed,result2.fairness.steps,result2.fairness.learningRate,result2.fairness.objective,series.optimizer,run.repeat,run.success,run.improved,run.durationMs,run.circuitEvaluations,finiteOrEmpty(run.initialCost),finiteOrEmpty(run.finalCost),finiteOrEmpty(run.validationLoss),finiteOrEmpty(run.validationAccuracy),finiteOrEmpty(run.testLoss),finiteOrEmpty(run.testAccuracy)]));if(rows.length!==result2.workloads||rows.length>NM_BENCHMARK_MAX_WORKLOADS)throw new Error("NM-QML-BENCH-004: Benchmark CSV workload count is invalid.");return[csvColumns.map(csvCell).join(","),...rows.map(row=>row.map(csvCell).join(","))].join("\n")+"\n"}function assertBenchmarkResult(result2){if(!result2||result2.success!==true||result2.contractVersion!==NM_QML_BENCHMARK_CONTRACT_VERSION||!Array.isArray(result2.series)||!Number.isInteger(result2.workloads)||result2.workloads<1||result2.workloads>NM_BENCHMARK_MAX_WORKLOADS||!/^[0-9a-f]{16}$/u.test(result2.sourceHash)||!/^[0-9a-f]{16}$/u.test(result2.reproducibility?.artifactHash??""))throw new Error("NM-QML-BENCH-004: Benchmark artifact is invalid.");const runs=result2.series.flatMap(series=>series.runs);if(runs.length!==result2.workloads||runs.some(run=>!validRun(run)))throw new Error("NM-QML-BENCH-004: Benchmark artifact contains invalid run evidence.")}function validRun(run){return Number.isInteger(run.repeat)&&run.repeat>=0&&Number.isFinite(run.durationMs)&&run.durationMs>=0&&Number.isInteger(run.circuitEvaluations)&&run.circuitEvaluations>=0&&Object.values(run.finalParams).every(Number.isFinite)&&run.paramHistory.length===run.costHistory.length&&run.paramHistory.every(entry=>Object.values(entry).every(Number.isFinite))}function finiteOrEmpty(value){return value==null||!Number.isFinite(value)?"":value}function csvCell(value){const text=String(value);return/[",\r\n]/u.test(text)?`"${text.replace(/"/gu,'""')}"`:text}var NM_TRAINING_CHECKPOINT_FORMAT="nm-training-checkpoint";var NM_TRAINING_CHECKPOINT_VERSION="0.1";var NM_TRAINING_CHECKPOINT_CONTRACT_VERSION="0.1-runtime-experimental";var NM_TRAINING_CHECKPOINT_SCHEMA_PATH="/schemas/nm-training-checkpoint-0.1.schema.json";var NM_TRAINING_CHECKPOINT_SCHEMA_ID=`https://quantumsoftware.tech${NM_TRAINING_CHECKPOINT_SCHEMA_PATH}`;var NM_TRAINING_CHECKPOINT_MAX_JSON_BYTES=2e6;var NM_TRAINING_CHECKPOINT_MAX_SOURCE_BYTES=2e5;var NM_TRAINING_CHECKPOINT_MAX_STEPS=100;var nmTrainingCheckpointDiagnosticCodes={input:"NM-QML-CHECKPOINT-001",version:"NM-QML-CHECKPOINT-002",integrity:"NM-QML-CHECKPOINT-003",compatibility:"NM-QML-CHECKPOINT-004",resume:"NM-QML-CHECKPOINT-005"};function createNMTrainingCheckpoint(source,result2,options={}){if(typeof source==="string"&&utf8Length2(source)<=NM_TRAINING_CHECKPOINT_MAX_SOURCE_BYTES&&needsNMQMLSourceContext(source)){return failure7(nmTrainingCheckpointDiagnosticCodes.compatibility,"Source-only checkpoint 0.1 cannot preserve helper training permissions or workspace dependencies; helper checkpoints are unsupported.")}const optimizer=options.optimizer??"gd";if(optimizer!=="gd")return failure7(nmTrainingCheckpointDiagnosticCodes.compatibility,"Durable checkpoint 0.1 supports exact GD continuation only; optimizer state is never discarded silently.");const parsed=parseNMCode(source);if(typeof source!=="string"||utf8Length2(source)>NM_TRAINING_CHECKPOINT_MAX_SOURCE_BYTES||parsed.diagnostics.some(diagnostic5=>diagnostic5.severity==="error")||!result2.success)return failure7(nmTrainingCheckpointDiagnosticCodes.input,"Checkpoint creation requires valid source and successful training evidence.");const completedSteps=options.completedSteps??Math.max(0,result2.costHistory.length-1);const learningRate=options.learningRate??.2;const objective=options.objective??"minimize";const seed=options.seed??parsed.program.seed??20045;if(!Number.isInteger(completedSteps)||completedSteps<1||completedSteps>NM_TRAINING_CHECKPOINT_MAX_STEPS||result2.costHistory.length!==completedSteps+1||result2.paramHistory.length!==result2.costHistory.length||!Number.isFinite(learningRate)||learningRate<=0||learningRate>5||!Number.isSafeInteger(seed))return failure7(nmTrainingCheckpointDiagnosticCodes.input,"Checkpoint steps, histories, learning rate, or seed violate the bounded contract.");const parameterNames=Object.keys(parsed.params).sort();if(JSON.stringify(parameterNames)!==JSON.stringify(Object.keys(result2.initialParams).sort())||JSON.stringify(parameterNames)!==JSON.stringify(Object.keys(result2.finalParams).sort())||!finiteRecord(result2.initialParams)||!finiteRecord(result2.finalParams)||result2.costHistory.some(value=>!Number.isFinite(value))||result2.paramHistory.some(entry=>!finiteRecord(entry)||JSON.stringify(Object.keys(entry).sort())!==JSON.stringify(parameterNames)))return failure7(nmTrainingCheckpointDiagnosticCodes.input,"Checkpoint parameter identity or numeric history is invalid.");const trainBlock=parsed.program.statements.find(statement=>statement.kind==="train");const dataset=result2.datasetId?getNMEmbeddedDataset(result2.datasetId):void 0;if(result2.datasetId&&!dataset)return failure7(nmTrainingCheckpointDiagnosticCodes.input,"Checkpoint dataset is unknown.");const workload=dataset?{kind:"supervised-classifier",datasetId:dataset.id,datasetVersion:dataset.version,splitPolicy:dataset.splitPolicy,samples:{train:dataset.splits.train.length,validation:dataset.splits.validation.length,test:dataset.splits.test.length},loss:result2.loss??trainBlock?.loss??"mse"}:{kind:"expectation-objective"};if(dataset&&(result2.datasetVersion!==dataset.version||result2.trainSamples!==dataset.splits.train.length||result2.validationSamples!==dataset.splits.validation.length||result2.testSamples!==dataset.splits.test.length))return failure7(nmTrainingCheckpointDiagnosticCodes.input,"Checkpoint supervised evidence does not match the frozen split contract.");const sourceHash=hashNMWorkspaceText(source);const training={optimizer:"gd",completedSteps,learningRate,objective,seed,initialParams:{...result2.initialParams},currentParams:{...result2.finalParams},costHistory:[...result2.costHistory],paramHistory:result2.paramHistory.map(entry=>({...entry})),circuitEvaluations:result2.circuitEvaluations??0,...result2.accuracyHistory?{accuracyHistory:[...result2.accuracyHistory]}:{},...result2.validationLoss==null?{}:{validationLoss:result2.validationLoss},...result2.validationAccuracy==null?{}:{validationAccuracy:result2.validationAccuracy},...result2.testLoss==null?{}:{testLoss:result2.testLoss},...result2.testAccuracy==null?{}:{testAccuracy:result2.testAccuracy}};const stateHash=hashNMWorkspaceText(canonicalJson5({sourceHash,workload,training}));const base2={kind:NM_TRAINING_CHECKPOINT_FORMAT,formatVersion:NM_TRAINING_CHECKPOINT_VERSION,contractVersion:NM_TRAINING_CHECKPOINT_CONTRACT_VERSION,languageVersion:nmVersionManifest.languageVersion,source,workload,training,reproducibility:{mode:"exact-gd-parameter-continuation",timingExcluded:true,resumeBoundaryEvaluationsAreSegmentAdditive:true,sourceHash,stateHash}};const checkpoint={...base2,integrity:{algorithm:"fnv1a-64",artifactHash:hashNMWorkspaceText(canonicalJson5(base2))}};const issues=validateNMTrainingCheckpoint(checkpoint);return issues.length===0?checkpoint:failure7(issues[0].code,issues[0].message)}function resumeNMTrainingCheckpoint(train,value,additionalSteps){const issues=validateNMTrainingCheckpoint(value);if(issues.length>0)return{success:false,code:issues[0].code,error:issues[0].message};const checkpoint=value;if(!Number.isInteger(additionalSteps)||additionalSteps<1||checkpoint.training.completedSteps+additionalSteps>NM_TRAINING_CHECKPOINT_MAX_STEPS)return{success:false,code:nmTrainingCheckpointDiagnosticCodes.resume,error:`Resume must add at least one step without exceeding ${NM_TRAINING_CHECKPOINT_MAX_STEPS} total steps.`};let segment;try{segment=train(applyNMParameterValues(checkpoint.source,checkpoint.training.currentParams),{optimizer:"gd",steps:additionalSteps,learningRate:checkpoint.training.learningRate,objective:checkpoint.training.objective})}catch{return{success:false,code:nmTrainingCheckpointDiagnosticCodes.resume,error:"Checkpoint trainer threw during resume."}}if(!segment.success||segment.costHistory.length!==additionalSteps+1||segment.paramHistory.length!==segment.costHistory.length||!sameFiniteRecord(segment.initialParams,checkpoint.training.currentParams)||!sameNumber(segment.costHistory[0],checkpoint.training.costHistory.at(-1)))return{success:false,code:nmTrainingCheckpointDiagnosticCodes.resume,error:segment.error??"Resume segment does not continue the checkpoint's exact GD state."};const combined={...segment,initialParams:{...checkpoint.training.initialParams},costHistory:[...checkpoint.training.costHistory,...segment.costHistory.slice(1)],paramHistory:[...checkpoint.training.paramHistory.map(entry=>({...entry})),...segment.paramHistory.slice(1).map(entry=>({...entry}))],circuitEvaluations:checkpoint.training.circuitEvaluations+(segment.circuitEvaluations??0),...checkpoint.workload.kind==="supervised-classifier"?{datasetId:checkpoint.workload.datasetId,datasetVersion:checkpoint.workload.datasetVersion,datasetSplit:"train",trainSamples:checkpoint.workload.samples.train,validationSamples:checkpoint.workload.samples.validation,testSamples:checkpoint.workload.samples.test,loss:checkpoint.workload.loss}:{}};const next=createNMTrainingCheckpoint(checkpoint.source,combined,{optimizer:"gd",completedSteps:checkpoint.training.completedSteps+additionalSteps,learningRate:checkpoint.training.learningRate,objective:checkpoint.training.objective,seed:checkpoint.training.seed});return"error"in next?{success:false,code:next.code,error:next.error}:{success:true,checkpoint:next,result:combined}}function serializeNMTrainingCheckpoint(checkpoint){const issues=validateNMTrainingCheckpoint(checkpoint);if(issues.length>0)throw new Error(`${issues[0].code}: ${issues[0].message}`);return`${JSON.stringify(checkpoint,null,2)}
|
|
@@ -1523,7 +1523,5 @@ fn main() {
|
|
|
1523
1523
|
return (a, b);
|
|
1524
1524
|
}
|
|
1525
1525
|
}
|
|
1526
|
-
`;function runNMCLI(args,options){if(args.length===0||args[0]==="--help"||args[0]==="help"){return{exitCode:0,stdout:[usageText()],stderr:[]}}if(args[0]==="--version"||args[0]==="version"){const asJson=args.includes("--json");return{exitCode:0,stdout:[asJson?JSON.stringify(nmVersionManifest,null,2):`N/M ${nmVersionManifest.languageVersion} (${nmVersionManifest.stability})`],stderr:[]}}const parsed=parseNMCLIArgs(args);if(!parsed.success){return errorResult(parsed.error)}if(parsed.value.command==="init"){return initNMSource(parsed.value.filePath,parsed.value.force??false,options)}if(parsed.value.command==="package"&&(parsed.value.packageAction==="list"||parsed.value.packageAction==="inspect"||parsed.value.packageAction==="install"||parsed.value.packageAction==="sign"||parsed.value.packageAction==="verify")){return packageRegistryNM(parsed.value,options)}let source;try{source=options.readFile(parsed.value.filePath)}catch(error){return errorResult(error instanceof Error?error.message:"Unable to read input file.")}let parseOptions={};let workspaceDocuments=[];const needsWorkspaceIndex=parsed.value.command!=="fmt"&&!(parsed.value.command==="checkpoint"&&parsed.value.checkpointAction!=="create")&&!(parsed.value.command==="package"&&parsed.value.packageAction==="validate")&&!(parsed.value.command==="workspace"&&parsed.value.workspaceAction==="validate");if(needsWorkspaceIndex){try{workspaceDocuments=options.readWorkspaceDocuments?.(parsed.value.filePath)??[];const index=createNMWorkspaceIndex(workspaceDocuments.map(document=>({uri:document.path,source:document.source})));const invalidIndex=index.diagnostics.find(item=>["NM-WORKSPACE-001","NM-WORKSPACE-004","NM-WORKSPACE-005"].includes(item.code));if(invalidIndex)return errorResult(`${invalidIndex.code}: ${invalidIndex.message}`);const documentModules=Object.fromEntries(workspaceDocuments.flatMap(document=>{const moduleName=getNMWorkspaceModuleName(document.source);return moduleName?[[moduleName,document.source]]:[]}));parseOptions={workspaceModules:workspaceDocuments.length>0?documentModules:options.readWorkspaceModules?.(parsed.value.filePath)??{}}}catch(error){return errorResult(error instanceof Error?error.message:"Unable to index N/M workspace modules.")}}if(parsed.value.experimentalPropertyAssertions){parseOptions={...parseOptions,experimental:{...parseOptions.experimental,propertyAssertions:true}}}if(parsed.value.experimentalParameterGroups)parseOptions={...parseOptions,experimental:{...parseOptions.experimental,parameterGroups:true}};if(parsed.value.experimentalComputeApply)parseOptions={...parseOptions,experimental:{...parseOptions.experimental,computeApply:true}};if(parsed.value.experimentalModuleVisibility){parseOptions={...parseOptions,experimental:{...parseOptions.experimental,moduleVisibility:true}}}if(parsed.value.experimentalExactImports){parseOptions={...parseOptions,experimental:{...parseOptions.experimental,exactImports:true}}}if(parsed.value.experimentalQmlTrainingControls){parseOptions={...parseOptions,experimental:{...parseOptions.experimental,qmlTrainingControls:true}}}if(parsed.value.experimentalTypedClassicalValues){parseOptions={...parseOptions,experimental:{...parseOptions.experimental,typedClassicalValues:true}}}if(parsed.value.experimentalTargetCapabilityConstraints){parseOptions={...parseOptions,experimental:{...parseOptions.experimental,targetCapabilityConstraints:true}}}if(parsed.value.experimentalClassicalFunctions){parseOptions={...parseOptions,experimental:{...parseOptions.experimental,classicalFunctions:true}}}if(parsed.value.experimentalFunctionResults){parseOptions={...parseOptions,experimental:{...parseOptions.experimental,functionResults:true}}}if(parsed.value.experimentalGenericOracles){parseOptions={...parseOptions,experimental:{...parseOptions.experimental,genericOracles:true}}}if(parsed.value.experimentalGenericCircuits){parseOptions={...parseOptions,experimental:{...parseOptions.experimental,genericCircuits:true}}}if(parsed.value.experimentalQECExperiments){parseOptions={...parseOptions,experimental:{...parseOptions.experimental,qecExperiments:true}}}if(parsed.value.experimentalComposedNoise){parseOptions={...parseOptions,experimental:{...parseOptions.experimental,composedNoise:true}}}if(parsed.value.experimentalFeedForward){parseOptions={...parseOptions,experimental:{...parseOptions.experimental,feedForward:true}}}if(parsed.value.experimentalTypedCollection){parseOptions={...parseOptions,experimental:{...parseOptions.experimental,typedCollection:true}}}if(parsed.value.experimentalComptimeConst){parseOptions={...parseOptions,experimental:{...parseOptions.experimental,comptimeConst:true}}}if(!parsed.value.legacyFeatures)parseOptions=createNMDefaultParseOptions(parseOptions);let resourceBudget;if(parsed.value.command==="estimate"&&parsed.value.budgetPath){let budgetText;try{budgetText=options.readFile(parsed.value.budgetPath)}catch(error){return errorResult(error instanceof Error?error.message:"Unable to read resource budget.")}const parsedBudget=readNMResourceBudgetJson(budgetText);if(!parsedBudget.budget){return errorResult(parsedBudget.issues.map(({code,message})=>`${code}: ${message}`).join(" "))}resourceBudget=parsedBudget.budget}switch(parsed.value.command){case"check":return checkNMSource(source,parseOptions,parsed.value.asJson??false);case"run":if(parsed.value.sweepPath)return runNMParameterSweepCLI(applyShotOverride(source,parsed.value.shots),parsed.value.sweepPath,parseOptions,parsed.value.asJson??false,options);return runNMSource(applyShotOverride(source,parsed.value.shots),parseOptions,parsed.value.asJson??false);case"debug":return debugNMSource(source,parsed.value.filePath,parsed.value.breakpointLines??[],parsed.value.asJson??false,parseOptions);case"estimate":return estimateNMSource(source,parseOptions,resourceBudget);case"export":return exportNMSource(source,parsed.value.exportTarget??"qasm3",parseOptions,parsed.value.qasmStrict??false,parsed.value.asJson??false);case"benchmark":return benchmarkNMSource(source,parsed.value);case"checkpoint":return checkpointNMSource(source,parsed.value);case"fmt":return formatNMSource(source,parsed.value.filePath,parsed.value.checkFormat??false,parsed.value.formatMode??"preserve",options);case"lint":return lintNMSource(source,parsed.value.strict??false,parseOptions);case"test":return testNMSource(source,parsed.value.filePath,parseOptions,parsed.value.asJson??false);case"explain":return explainNMSource(source,parsed.value.asJson??false,parseOptions);case"transpile":return transpileNMSourceForCLI(source,parsed.value.target,parsed.value.calibrationPath,parsed.value.asJson??false,parseOptions,options);case"package":return packageNMSource(source,parsed.value.packageAction==="build"?"build":"validate",parseOptions);case"workspace":return workspaceNMSource(source,parsed.value.filePath,parsed.value.workspaceAction??"validate",parseOptions,workspaceDocuments,parsed.value.asJson??false);case"lock":return dependencyLockNMSource(source,parseOptions,parsed.value.lockPath,parsed.value.asJson??false,options)}}function parseNMCLIArgs(args){const[command,filePath,...flags3]=args;if(!isNMCLICommand(command)){return{success:false,error:usageText()}}if(command!=="init"&&!filePath){return{success:false,error:`Missing input file for nm ${command}.`}}if(command==="package"){const action=filePath;if(action==="list"){if(flags3.length>1||flags3.length===1&&flags3[0]!=="--json"){return{success:false,error:`Unknown option: ${flags3[0]}`}}return{success:true,value:{command,filePath:"",packageAction:action,asJson:flags3[0]==="--json"}}}if(action==="inspect"){const packageSpecifier=flags3[0];const inspectFlags=flags3.slice(1);if(!packageSpecifier||packageSpecifier.startsWith("--")){return{success:false,error:"Missing package specifier for nm package inspect."}}if(inspectFlags.length>1||inspectFlags.length===1&&inspectFlags[0]!=="--json"){return{success:false,error:`Unknown option: ${inspectFlags[0]}`}}return{success:true,value:{command,filePath:"",packageAction:action,packageSpecifier,asJson:inspectFlags[0]==="--json"}}}if(action==="install"){const packageSpecifier=flags3[0];if(!packageSpecifier||packageSpecifier.startsWith("--")){return{success:false,error:"Missing package specifier for nm package install."}}const value={command,filePath:"",packageAction:action,packageSpecifier};for(let index=1;index<flags3.length;index+=1){if(flags3[index]==="--output"){const outputPath=flags3[index+1];if(!outputPath||outputPath.startsWith("--"))return{success:false,error:"--output expects a relative .nm path."};value.outputPath=outputPath;index+=1}else if(flags3[index]==="--force"){value.force=true}else if(flags3[index]==="--json"){value.asJson=true}else{return{success:false,error:`Unknown option: ${flags3[index]}`}}}return{success:true,value}}if(action==="sign"||action==="verify"){const packageFilePath2=flags3[0];if(!packageFilePath2||packageFilePath2.startsWith("--")){return{success:false,error:`Missing package bundle for nm package ${action}.`}}const value={command,filePath:packageFilePath2,packageAction:action};for(let index=1;index<flags3.length;index+=1){if(flags3[index]==="--output"&&action==="sign"){const outputPath=flags3[index+1];if(!outputPath||outputPath.startsWith("--"))return{success:false,error:"--output expects a JSON path."};value.outputPath=outputPath;index+=1}else if(flags3[index]==="--force"&&action==="sign"){value.force=true}else if(flags3[index]==="--json"){value.asJson=true}else{return{success:false,error:`Unknown option: ${flags3[index]}`}}}return{success:true,value}}const packageFilePath=flags3[0];if(action!=="validate"&&action!=="build"){return{success:false,error:"nm package expects build, validate, list, inspect, install, sign, or verify."}}if(!packageFilePath){return{success:false,error:`Missing input file for nm package ${action}.`}}if(flags3.length>1){return{success:false,error:`Unknown option: ${flags3[1]}`}}return{success:true,value:{command,filePath:packageFilePath,packageAction:action}}}if(command==="workspace"){const action=filePath;const workspaceFilePath=flags3[0];if(action!=="snapshot"&&action!=="share"&&action!=="validate"){return{success:false,error:"nm workspace expects snapshot, share, or validate."}}if(!workspaceFilePath){return{success:false,error:`Missing input file for nm workspace ${action}.`}}const workspaceFlags=flags3.slice(1);if(workspaceFlags.length>1||workspaceFlags[0]&&(workspaceFlags[0]!=="--json"||action!=="validate")){return{success:false,error:`Unknown option: ${workspaceFlags[0]}`}}return{success:true,value:{command,filePath:workspaceFilePath,workspaceAction:action,asJson:workspaceFlags[0]==="--json"}}}if(command==="checkpoint"){const action=filePath;const checkpointFilePath=flags3[0];if(action!=="create"&&action!=="resume"&&action!=="model")return{success:false,error:"nm checkpoint expects create, resume, or model."};if(!checkpointFilePath||checkpointFilePath.startsWith("--"))return{success:false,error:`Missing input file for nm checkpoint ${action}.`};const value={command,filePath:checkpointFilePath,checkpointAction:action};const checkpointFlags=flags3.slice(1);for(let index=0;index<checkpointFlags.length;index+=1){const flag=checkpointFlags[index];const flagValue=checkpointFlags[index+1];if(flag==="--steps"&&action==="create"){const steps=Number(flagValue);if(!Number.isInteger(steps)||steps<1||steps>100)return{success:false,error:"--steps expects an integer from 1 through 100."};value.benchmarkSteps=steps;index+=1}else if(flag==="--learning-rate"&&action==="create"){const learningRate=Number(flagValue);if(!Number.isFinite(learningRate)||learningRate<=0||learningRate>5)return{success:false,error:"--learning-rate expects a finite number in (0, 5]."};value.benchmarkLearningRate=learningRate;index+=1}else if(flag==="--additional-steps"&&action==="resume"){const steps=Number(flagValue);if(!Number.isInteger(steps)||steps<1||steps>100)return{success:false,error:"--additional-steps expects an integer from 1 through 100."};value.checkpointAdditionalSteps=steps;index+=1}else if(flag==="--name"&&action==="model"){if(!flagValue||!/^[a-z0-9]+(?:-[a-z0-9]+)*$/u.test(flagValue))return{success:false,error:"--name expects a lowercase model slug."};value.checkpointModelName=flagValue;index+=1}else{return{success:false,error:`Unknown option: ${flag}`}}}if(action==="resume"&&value.checkpointAdditionalSteps==null)return{success:false,error:"nm checkpoint resume requires --additional-steps."};if(action==="model"&&!value.checkpointModelName)return{success:false,error:"nm checkpoint model requires --name."};return{success:true,value}}const initHasPath=command==="init"&&Boolean(filePath&&!filePath.startsWith("--"));const parsed={command,filePath:command==="init"?initHasPath?filePath:"main.nm":filePath};const commandFlags=command==="init"&&!initHasPath?args.slice(1):flags3;for(let index=0;index<commandFlags.length;index+=1){const flag=commandFlags[index];const value=commandFlags[index+1];if(flag==="--legacy-features"){parsed.legacyFeatures=true;continue}if(flag==="--experimental-compute-apply"){if(!["check","run","debug","estimate","export","lint","test","explain","transpile"].includes(command))return{success:false,error:"--experimental-compute-apply is only valid for N/M parse, execution, test, and export commands."};parsed.experimentalComputeApply=true;continue}if(flag==="--sweep"){if(command!=="run"||parsed.sweepPath||!value||value.startsWith("--"))return{success:false,error:"--sweep expects one request JSON path and is only valid for nm run."};parsed.sweepPath=value;index++;continue}if(flag==="--experimental-parameter-groups"){if(!["check","run","debug","estimate","export","lint","test","explain","transpile"].includes(command))return{success:false,error:"--experimental-parameter-groups is only valid for N/M parse, execution, test, and export commands."};parsed.experimentalParameterGroups=true;continue}if(flag==="--optimizers"){if(command!=="benchmark")return{success:false,error:"--optimizers is only valid for nm benchmark."};const optimizers2=value?.split(",").filter(Boolean);if(!optimizers2?.length||optimizers2.some(optimizer=>!["gd","momentum","adam","spsa","qng"].includes(optimizer)))return{success:false,error:"--optimizers expects a comma-separated subset of gd,momentum,adam,spsa,qng."};parsed.benchmarkOptimizers=optimizers2;index+=1;continue}if(flag==="--steps"){if(command!=="benchmark")return{success:false,error:"--steps is only valid for nm benchmark or nm checkpoint create."};const steps=Number(value);if(!Number.isInteger(steps)||steps<1||steps>100)return{success:false,error:"--steps expects an integer from 1 through 100."};parsed.benchmarkSteps=steps;index+=1;continue}if(flag==="--repeats"){if(command!=="benchmark")return{success:false,error:"--repeats is only valid for nm benchmark."};const repeats=Number(value);if(!Number.isInteger(repeats)||repeats<1||repeats>5)return{success:false,error:"--repeats expects an integer from 1 through 5."};parsed.benchmarkRepeats=repeats;index+=1;continue}if(flag==="--seed"){if(command!=="benchmark")return{success:false,error:"--seed is only valid for nm benchmark."};const seed=Number(value);if(!Number.isSafeInteger(seed))return{success:false,error:"--seed expects a safe integer."};parsed.benchmarkSeed=seed;index+=1;continue}if(flag==="--learning-rate"){if(command!=="benchmark")return{success:false,error:"--learning-rate is only valid for nm benchmark or nm checkpoint create."};const learningRate=Number(value);if(!Number.isFinite(learningRate)||learningRate<=0||learningRate>5)return{success:false,error:"--learning-rate expects a finite number in (0, 5]."};parsed.benchmarkLearningRate=learningRate;index+=1;continue}if(flag==="--csv"){if(command!=="benchmark")return{success:false,error:"--csv is only valid for nm benchmark."};parsed.benchmarkCsv=true;continue}if(flag==="--shots"){if(command!=="run")return{success:false,error:"--shots is only valid for nm run."};const shots=Number(value);if(!Number.isInteger(shots)||shots<=0){return{success:false,error:"--shots expects a positive integer."}}parsed.shots=shots;index+=1;continue}if(flag==="--experimental-property-assertions"){if(!["check","run","debug","estimate","export","lint","test","explain","transpile"].includes(command)){return{success:false,error:"--experimental-property-assertions is only valid for N/M parse, execution, test, and export commands."}}parsed.experimentalPropertyAssertions=true;continue}if(flag==="--experimental-module-visibility"){if(!["check","run","debug","estimate","export","lint","test","explain","transpile"].includes(command)){return{success:false,error:"--experimental-module-visibility is only valid for N/M parse, execution, test, and export commands."}}parsed.experimentalModuleVisibility=true;continue}if(flag==="--experimental-exact-imports"){if(!["check","run","debug","estimate","export","lint","test","explain","transpile"].includes(command)){return{success:false,error:"--experimental-exact-imports is only valid for N/M parse, execution, test, and export commands."}}parsed.experimentalExactImports=true;continue}if(flag==="--experimental-qml-training-controls"){if(!["check","run","debug","estimate","export","lint","test","explain","transpile"].includes(command)){return{success:false,error:"--experimental-qml-training-controls is only valid for N/M parse, execution, test, and export commands."}}parsed.experimentalQmlTrainingControls=true;continue}if(flag==="--experimental-typed-classical-values"){if(!["check","run","debug","estimate","export","lint","test","explain","transpile"].includes(command)){return{success:false,error:"--experimental-typed-classical-values is only valid for N/M parse, execution, test, and export commands."}}parsed.experimentalTypedClassicalValues=true;continue}if(flag==="--experimental-target-capability-constraints"){if(!["check","run","debug","estimate","export","lint","test","explain","transpile"].includes(command)){return{success:false,error:"--experimental-target-capability-constraints is only valid for N/M parse, execution, test, and export commands."}}parsed.experimentalTargetCapabilityConstraints=true;continue}if(flag==="--experimental-classical-functions"){if(!["check","run","debug","estimate","export","lint","test","explain","transpile"].includes(command)){return{success:false,error:"--experimental-classical-functions is only valid for N/M parse, execution, test, and export commands."}}parsed.experimentalClassicalFunctions=true;continue}if(flag==="--experimental-function-results"){if(!["check","run","debug","estimate","export","lint","test","explain","transpile"].includes(command)){return{success:false,error:"--experimental-function-results is only valid for N/M parse, execution, test, and export commands."}}parsed.experimentalFunctionResults=true;continue}if(flag==="--experimental-generic-oracles"){if(!["check","run","debug","estimate","export","lint","test","explain","transpile"].includes(command)){return{success:false,error:"--experimental-generic-oracles is only valid for N/M parse, execution, test, and export commands."}}parsed.experimentalGenericOracles=true;continue}if(flag==="--experimental-generic-circuits"){if(!["check","run","debug","estimate","export","lint","test","explain","transpile"].includes(command)){return{success:false,error:"--experimental-generic-circuits is only valid for N/M parse, execution, test, and export commands."}}parsed.experimentalGenericCircuits=true;continue}if(flag==="--experimental-qec-experiments"){if(!["check","run","debug","estimate","export","lint","test","explain","transpile"].includes(command)){return{success:false,error:"--experimental-qec-experiments is only valid for N/M parse, execution, test, and export commands."}}parsed.experimentalQECExperiments=true;continue}if(flag==="--experimental-composed-noise"){if(!["check","run","debug","estimate","export","lint","test","explain","transpile"].includes(command)){return{success:false,error:"--experimental-composed-noise is only valid for N/M parse, execution, test, and export commands."}}parsed.experimentalComposedNoise=true;continue}if(flag==="--experimental-feed-forward"){if(!["check","run","debug","estimate","export","lint","test","explain","transpile"].includes(command)){return{success:false,error:"--experimental-feed-forward is only valid for N/M parse, execution, test, and export commands."}}parsed.experimentalFeedForward=true;continue}if(flag==="--experimental-typed-collection"){if(!["check","run","debug","estimate","export","lint","test","explain","transpile"].includes(command)){return{success:false,error:"--experimental-typed-collection is only valid for N/M parse, execution, test, and export commands."}}parsed.experimentalTypedCollection=true;continue}if(flag==="--experimental-comptime-const"){if(!["check","run","debug","estimate","export","lint","test","explain","transpile"].includes(command)){return{success:false,error:"--experimental-comptime-const is only valid for N/M parse, execution, test, and export commands."}}parsed.experimentalComptimeConst=true;continue}if(flag==="--breakpoint"){if(command!=="debug")return{success:false,error:"--breakpoint is only valid for nm debug."};const line=Number(value);if(!Number.isSafeInteger(line)||line<1)return{success:false,error:"--breakpoint expects a positive one-based line."};(parsed.breakpointLines??(parsed.breakpointLines=[])).push(line);index+=1;continue}if(flag==="--to"){if(command!=="export")return{success:false,error:"--to is only valid for nm export."};if(!isNMCLIExportTarget(value)){return{success:false,error:"--to expects qasm2, qasm3, quantikz, json, ir, or pennylane."}}parsed.exportTarget=value;index+=1;continue}if(flag==="--ftqc"){if(command!=="estimate")return{success:false,error:"--ftqc is only valid for nm estimate."};continue}if(flag==="--budget"){if(command!=="estimate")return{success:false,error:"--budget is only valid for nm estimate."};if(!value||value.startsWith("--"))return{success:false,error:"--budget expects an nm-resource-budget JSON path."};parsed.budgetPath=value;index+=1;continue}if(flag==="--check"){if(command!=="fmt")return{success:false,error:"--check is only valid for nm fmt."};parsed.checkFormat=true;continue}if(flag==="--lock"){if(command!=="lock")return{success:false,error:"--lock is only valid for nm lock."};if(!value||value.startsWith("--"))return{success:false,error:"--lock expects an nm-lock.json path."};parsed.lockPath=value;index+=1;continue}if(flag==="--mode"){if(command!=="fmt")return{success:false,error:"--mode is only valid for nm fmt."};if(!isNMSourceFormatterMode(value)){return{success:false,error:"--mode expects preserve, canonical-en, or localized-tr."}}parsed.formatMode=value;index+=1;continue}if(flag==="--strict"){if(command==="lint")parsed.strict=true;else if(command==="export")parsed.qasmStrict=true;else return{success:false,error:"--strict is only valid for nm lint or nm export --to qasm3."};continue}if(flag==="--json"){if(command!=="check"&&command!=="run"&&command!=="debug"&&command!=="explain"&&command!=="transpile"&&command!=="export"&&command!=="test"&&command!=="lock"){return{success:false,error:"--json is only valid for nm check, nm run, nm debug, nm test, nm explain, nm transpile, nm export --to qasm3|pennylane, nm lock, or --version."}}parsed.asJson=true;continue}if(flag==="--target"){if(command!=="transpile")return{success:false,error:"--target is only valid for nm transpile."};if(!value||value.startsWith("--"))return{success:false,error:"--target expects a target profile id."};parsed.target=value;index+=1;continue}if(flag==="--calibration"){if(command!=="transpile")return{success:false,error:"--calibration is only valid for nm transpile."};if(!value||value.startsWith("--"))return{success:false,error:"--calibration expects a target calibration JSON path."};parsed.calibrationPath=value;index+=1;continue}if(flag==="--force"){if(command!=="init")return{success:false,error:"--force is only valid for nm init."};parsed.force=true;continue}return{success:false,error:`Unknown option: ${flag}`}}if(parsed.qasmStrict&&(parsed.exportTarget??"qasm3")!=="qasm3"){return{success:false,error:"--strict requires nm export --to qasm3."}}if(parsed.command==="export"&&parsed.asJson&&!["qasm2","qasm3","pennylane"].includes(parsed.exportTarget??"qasm3")){return{success:false,error:"--json requires nm export --to qasm2, --to qasm3 or --to pennylane."}}return{success:true,value:parsed}}function benchmarkNMSource(source,args){const result2=executeNMBenchmark2(source,{...args.benchmarkOptimizers?{optimizers:args.benchmarkOptimizers}:{},...args.benchmarkSteps==null?{}:{steps:args.benchmarkSteps},...args.benchmarkRepeats==null?{}:{repeats:args.benchmarkRepeats},...args.benchmarkSeed==null?{}:{seed:args.benchmarkSeed},...args.benchmarkLearningRate==null?{}:{learningRate:args.benchmarkLearningRate}});if(!result2.success)return errorResult(`${result2.code}: ${result2.error}`);try{return{exitCode:0,stdout:[args.benchmarkCsv?serializeNMBenchmarkCsv(result2).trimEnd():serializeNMBenchmarkJson(result2).trimEnd()],stderr:[]}}catch(error){return errorResult(error instanceof Error?error.message:"Unable to serialize benchmark evidence.")}}function checkpointNMSource(input,args){if(args.checkpointAction==="create"){const parsed=parseNMCode(input);const blocking=parsed.diagnostics.find(diagnostic5=>diagnostic5.severity==="error");if(blocking)return errorResult(`${blocking.code}: ${blocking.message}`);const block=parsed.program.statements.find(statement=>statement.kind==="train");const steps=args.benchmarkSteps??block?.steps??40;const learningRate=args.benchmarkLearningRate??block?.optimizer?.options.lr??.2;const objective=block?.objective.mode??"minimize";const result2=executeNMProgramTraining(input,{optimizer:"gd",steps,learningRate,objective});if(!result2.success)return errorResult(result2.error??"Checkpoint training failed.");const checkpoint=createNMTrainingCheckpoint(input,result2,{optimizer:"gd",completedSteps:steps,learningRate,objective,...parsed.program.seed==null?{}:{seed:parsed.program.seed}});if("error"in checkpoint)return errorResult(`${checkpoint.code}: ${checkpoint.error}`);return{exitCode:0,stdout:[serializeNMTrainingCheckpoint(checkpoint).trimEnd()],stderr:[]}}const imported=importNMTrainingCheckpointJson(input);if(!("checkpoint"in imported))return errorResult(`${imported.issues[0]?.code}: ${imported.issues[0]?.message}`);if(args.checkpointAction==="resume"){const resumed=resumeNMTrainingCheckpoint((source,options)=>executeNMProgramTraining(source,options),imported.checkpoint,args.checkpointAdditionalSteps??0);if(!resumed.success)return errorResult(`${resumed.code}: ${resumed.error}`);return{exitCode:0,stdout:[serializeNMTrainingCheckpoint(resumed.checkpoint).trimEnd()],stderr:[]}}if(args.checkpointAction==="model"){const model=createNMModelPackageFromTrainingCheckpoint(imported.checkpoint,args.checkpointModelName??"");if("error"in model)return errorResult(`${model.code}: ${model.error}`);return{exitCode:0,stdout:[serializeNMModelPackage(model).trimEnd()],stderr:[]}}return errorResult("nm checkpoint expects create, resume, or model.")}function formatNMSource(source,filePath,checkOnly,mode,options){const formatted=formatNMSourcePreserving(source,{mode});if(!checkOnly){if(!options.writeFile)return{exitCode:0,stdout:[formatted],stderr:[]};try{options.writeFile(filePath,formatted,{overwrite:true});return{exitCode:0,stdout:[`Formatted ${filePath}`],stderr:[]}}catch(error){return errorResult(error instanceof Error?error.message:`Unable to format ${filePath}.`)}}return formatted===source?{exitCode:0,stdout:[`N/M fmt: clean (${filePath})`],stderr:[]}:{exitCode:1,stdout:[],stderr:[`N/M fmt: changes required (${filePath})`]}}function lintNMSource(source,strict,parseOptions){const parsed=parseNMCode(source,parseOptions);const errors=parsed.diagnostics.filter(diagnostic5=>diagnostic5.severity==="error");const warnings=parsed.diagnostics.filter(diagnostic5=>diagnostic5.severity==="warning");const failed2=errors.length>0||strict&&warnings.length>0;return{exitCode:failed2?1:0,stdout:[`N/M lint: ${failed2?"failed":"ok"}${strict?" (strict)":""}`,`errors: ${errors.length}`,`warnings: ${warnings.length}`,...parsed.diagnostics.map(diagnostic5=>`${diagnostic5.severity} ${diagnostic5.code}: ${diagnostic5.message}`)],stderr:[]}}function testNMSource(source,filePath,parseOptions,asJson){const result2=executeNMCode(source,parseOptions);const report=createNMTestExplorerReport(result2,{source,uri:createNMCLITestSourceUri(filePath)});const failed2=!report.passed;return{exitCode:failed2?1:0,stdout:asJson?[serializeNMTestExplorerReport(report).trimEnd()]:[`N/M test: ${failed2?"failed":"passed"}`,`report: ${report.reportId}`,`source: ${report.source.hash}`,`checks: ${report.summary.total}`,...report.checks.map(check=>`${check.passed?"PASS":"FAIL"} ${check.kind} ${check.name} (line ${check.line}, id ${check.id})`)],stderr:failed2&&result2.error?[result2.error]:[]}}function createNMCLITestSourceUri(filePath){const normalized=filePath.replace(/\\/gu,"/").replace(/^\/+|\/+$/gu,"");const encoded=normalized.split("/").filter(Boolean).map(part=>encodeURIComponent(part)).join("/");return`nm-cli:///${encoded||"main.nm"}`}function explainNMSource(source,asJson,parseOptions){const insights=analyzeNMCode(source,parseOptions);return{exitCode:insights.some(insight=>insight.severity==="error")?1:0,stdout:asJson?[JSON.stringify(insights,null,2)]:[`N/M explain: ${insights.length} insight(s)`,...insights.map(insight=>`[${insight.severity}] ${insight.title}: ${insight.message}`)],stderr:[]}}function transpileNMSourceForCLI(source,target2,calibrationPath,asJson,parseOptions,options){let resolvedTarget=target2;let calibration;if(calibrationPath){let calibrationText;try{calibrationText=options.readFile(calibrationPath)}catch(error){return errorResult(error instanceof Error?error.message:"Unable to read target calibration file.")}const validation=validateNMTargetCalibrationJsonText(calibrationText);if(!validation.valid){return{exitCode:1,stdout:asJson?[JSON.stringify({success:false,issues:validation.issues},null,2)]:[],stderr:asJson?[]:validation.issues.map(entry=>`${entry.code} ${entry.path}: ${entry.message}`)}}if(target2&&validation.document.target!==target2){const message=`NM-CAL-003 $.target: Calibration target "${validation.document.target}" does not match requested target "${target2}".`;return{exitCode:1,stdout:asJson?[JSON.stringify({success:false,issues:[{code:"NM-CAL-003",path:"$.target",message}]},null,2)]:[],stderr:asJson?[]:[message]}}resolvedTarget=target2??validation.document.target;calibration=validation.document.calibration}const result2=transpileNMSource(source,{target:resolvedTarget,calibration,parseOptions});if(asJson){return{exitCode:result2.success?0:1,stdout:[JSON.stringify(result2,null,2)],stderr:[]}}return{exitCode:result2.success?0:1,stdout:result2.success?[result2.source]:[],stderr:result2.success?[]:[...result2.unsupportedGates.map(gate=>`Unsupported target gate ${gate.gate} at line ${gate.line}.`),...result2.verification.status==="failed"?[result2.verification.reason]:[]]}}function initNMSource(filePath,force,options){if(!options.writeFile)return errorResult("nm init requires a writable CLI environment.");if(!force&&options.fileExists?.(filePath)){return errorResult(`Refusing to overwrite existing file: ${filePath}. Use --force to replace it.`)}try{options.writeFile(filePath,nmStarterSource,{overwrite:force});return{exitCode:0,stdout:[`Created ${filePath}`,"Next: nm check "+filePath],stderr:[]}}catch(error){return errorResult(error instanceof Error?error.message:`Unable to create ${filePath}.`)}}function packageNMSource(source,action,parseOptions){if(action==="validate"){const validation=validateNMLearningPackageJsonText(source);return{exitCode:validation.valid?0:1,stdout:[`N/M package validate: ${validation.valid?"ok":"failed"}`,`issues: ${validation.issues.length}`,...validation.issues.map(issue11=>`${issue11.path} ${issue11.keyword}: ${issue11.message}`)],stderr:[]}}const result2=executeNMCode(source,parseOptions);if(!result2.success){return{exitCode:1,stdout:[],stderr:[result2.error??"N/M package build failed.",...(result2.diagnostics??[]).map(item=>`${item.code}: ${item.message}`)]}}return{exitCode:0,stdout:[serializeNMLearningPackage(source,result2)],stderr:[]}}function packageRegistryNM(parsed,options){if(parsed.packageAction==="list"){const packages=listNMPackages();return{exitCode:0,stdout:parsed.asJson?[JSON.stringify(packages.map(createNMPackageSummary),null,2)]:[`N/M package registry: ${packages.length} package(s)`,...packages.map(entry2=>`${entry2.manifest.specifier} ${entry2.manifest.trust}/${entry2.manifest.attestation.status} ${entry2.description.en}`)],stderr:[]}}if(parsed.packageAction==="sign"||parsed.packageAction==="verify"){let text;try{text=options.readFile(parsed.filePath)}catch(error){return errorResult(error instanceof Error?error.message:"Unable to read package bundle.")}const parsedBundle=parseNMPackageRegistryEntryJsonText(text);if(!parsedBundle.valid){return{exitCode:1,stdout:[],stderr:parsedBundle.issues.map(issue11=>`${issue11.code} ${issue11.path}: ${issue11.message}`)}}if(parsed.packageAction==="verify"){if(!options.packageVerifier)return errorResult("nm package verify requires configured trusted public keys.");const signatureValid=verifyNMPackageRegistryEntrySignature(parsedBundle.entry,options.packageVerifier);const issues2=validateNMPackagePublication(parsedBundle.entry,options.packageVerifier);const report={specifier:parsedBundle.entry.manifest.specifier,signatureValid,publishable:issues2.length===0,issues:issues2};return{exitCode:issues2.length===0?0:1,stdout:parsed.asJson?[JSON.stringify(report,null,2)]:[`N/M package verify: ${issues2.length===0?"ok":"failed"}`,`specifier: ${report.specifier}`,`signature: ${signatureValid?"valid":"invalid"}`,...issues2.map(issue11=>`${issue11.code} ${issue11.path}: ${issue11.message}`)],stderr:[]}}if(!options.packageSigner)return errorResult("nm package sign requires an Ed25519 signing key.");if(!options.writeFile)return errorResult("nm package sign requires a writable CLI environment.");const outputPath2=parsed.outputPath??parsed.filePath.replace(/\.json$/i,"")+".signed.json";if(!outputPath2.toLowerCase().endsWith(".json"))return errorResult("Signed package output must use a .json path.");if(!parsed.force&&options.fileExists?.(outputPath2)){return errorResult(`Refusing to overwrite existing file: ${outputPath2}. Use --force to replace it.`)}try{const signed=signNMPackageRegistryEntry(parsedBundle.entry,options.packageSigner,(options.now?.()??new Date).toISOString());options.writeFile(outputPath2,`${JSON.stringify(signed,null,2)}
|
|
1527
|
-
`,{overwrite:parsed.force??false});return{exitCode:0,stdout:parsed.asJson?[JSON.stringify({specifier:signed.manifest.specifier,outputPath:outputPath2,attestation:signed.manifest.attestation},null,2)]:[`Signed ${signed.manifest.specifier} -> ${outputPath2}`,`key: ${options.packageSigner.keyId}; algorithm: ${options.packageSigner.algorithm}`],stderr:[]}}catch(error){return errorResult(error instanceof Error?error.message:"Unable to sign package bundle.")}}const entry=resolveNMPackage(parsed.packageSpecifier??"");if(!entry)return errorResult(`N/M package not found: ${parsed.packageSpecifier??""}.`);const issues=validateNMPackageRegistryEntry(entry);if(issues.length>0){return{exitCode:1,stdout:[],stderr:issues.map(issue11=>`${issue11.code} ${issue11.path}: ${issue11.message}`)}}if(parsed.packageAction==="inspect"){return{exitCode:0,stdout:parsed.asJson?[JSON.stringify(entry,null,2)]:[`${entry.manifest.specifier} (${entry.kind})`,entry.description.en,`exports: ${entry.manifest.exports.join(", ")}`,`engine: ${entry.manifest.engines.nm}`,`license: ${entry.manifest.license}`,`trust: ${entry.manifest.trust}; attestation: ${entry.manifest.attestation.status}`,`integrity: ${entry.manifest.integrity.algorithm}-${entry.manifest.integrity.digest}`],stderr:[]}}if(!options.writeFile)return errorResult("nm package install requires a writable CLI environment.");const outputPath=parsed.outputPath??getNMPackageInstallFileName(entry);if(!isSafeNMPackageInstallPath(outputPath)){return errorResult("Package install output must be a traversal-safe relative .nm path.")}if(!parsed.force&&options.fileExists?.(outputPath)){return errorResult(`Refusing to overwrite existing file: ${outputPath}. Use --force to replace it.`)}try{options.writeFile(outputPath,entry.source,{overwrite:parsed.force??false})}catch(error){return errorResult(error instanceof Error?error.message:`Unable to install package to ${outputPath}.`)}const receipt=createNMPackageInstallReceipt(entry,outputPath);return{exitCode:0,stdout:parsed.asJson?[JSON.stringify(receipt,null,2)]:[`Installed ${entry.manifest.specifier} -> ${outputPath}`,`integrity: ${entry.manifest.integrity.algorithm}-${entry.manifest.integrity.digest}`,`trust: ${entry.manifest.trust}; attestation: ${entry.manifest.attestation.status}; license: ${entry.manifest.license}`,`Import with: use workspace.${entry.manifest.moduleName};`],stderr:[]}}function workspaceNMSource(source,filePath,action,parseOptions,workspaceDocuments,asJson){if(action==="validate"){const validation=importNMWorkspaceSnapshotJson(source);if(asJson){return{exitCode:validation.valid?0:1,stdout:[JSON.stringify({ok:validation.valid,format:"nm-workspace-snapshot",version:validation.valid?validation.snapshot.version:null,issueCount:validation.issues.length,issues:validation.issues,reproducibility:validation.valid?{sourceHash:validation.snapshot.reproducibility.sourceHash,runFingerprint:validation.snapshot.reproducibility.runFingerprint,documentCount:validation.snapshot.reproducibility.documentCount}:null},null,2)],stderr:[]}}return{exitCode:validation.valid?0:1,stdout:[`N/M workspace validate: ${validation.valid?"ok":"failed"}`,`issues: ${validation.issues.length}`,...validation.issues.map(issue11=>`${issue11.code} ${issue11.path} ${issue11.keyword}: ${issue11.message}`)],stderr:[]}}const parsed=parseNMCode(source,parseOptions);const errors=parsed.diagnostics.filter(diagnostic5=>diagnostic5.severity==="error");if(!parsed.program.moduleName||errors.length>0){return{exitCode:1,stdout:[],stderr:errors.map(diagnostic5=>`${diagnostic5.code}: ${diagnostic5.message}`)}}const documents=workspaceDocuments.length>0?workspaceDocuments:[{path:filePath.replace(/\\/g,"/").split("/").at(-1)??"main.nm",source}];try{const snapshot2=createNMWorkspaceSnapshot({name:parsed.program.moduleName.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"nm-workspace",entryModule:parsed.program.moduleName,documents,engine:parsed.program.target==="browser-stabilizer"?"stabilizer":"statevector",seed:parsed.program.seed??null});return{exitCode:0,stdout:[action==="share"?createNMWorkspaceSnapshotHref(snapshot2):serializeNMWorkspaceSnapshot(snapshot2)],stderr:[]}}catch(error){return errorResult(error instanceof Error?error.message:"Unable to create workspace snapshot.")}}function dependencyLockNMSource(source,parseOptions,lockPath,asJson,options){if(!lockPath){const created=createNMDependencyLockFromSource(source,parseOptions);if(!created.lock)return{exitCode:1,stdout:[],stderr:created.issues.map(entry=>`${entry.code} ${entry.path}: ${entry.message}`)};return{exitCode:0,stdout:[serializeNMDependencyLock(created.lock).trimEnd()],stderr:[]}}let lockText;try{lockText=options.readFile(lockPath)}catch(error){return errorResult(error instanceof Error?error.message:`Unable to read ${lockPath}.`)}const read5=readNMDependencyLockJson(lockText);const validation=read5.lock?validateNMSourceDependencyLock(source,read5.lock,parseOptions):read5;if(asJson)return{exitCode:validation.lock?0:1,stdout:[JSON.stringify({ok:Boolean(validation.lock),format:"nm-dependency-lock",version:validation.lock?.version??null,packageCount:validation.lock?.packages.length??0,issueCount:validation.issues.length,issues:validation.issues},null,2)],stderr:[]};return{exitCode:validation.lock?0:1,stdout:[`N/M lock check: ${validation.lock?"ok":"failed"}`,`issues: ${validation.issues.length}`,...validation.issues.map(entry=>`${entry.code} ${entry.path}: ${entry.message}`)],stderr:[]}}function checkNMSource(source,parseOptions,asJson=false){const parsed=parseNMCode(source,parseOptions);const errors=parsed.diagnostics.filter(diagnostic5=>diagnostic5.severity==="error");const warnings=parsed.diagnostics.filter(diagnostic5=>diagnostic5.severity==="warning");if(asJson){return{exitCode:errors.length>0?1:0,stdout:[JSON.stringify({ok:errors.length===0,qubits:parsed.numQubits,diagnostics:parsed.diagnostics,experimental:{genericOracles:parseOptions.experimental?.genericOracles===true,genericCircuits:parseOptions.experimental?.genericCircuits===true,qecExperiments:parseOptions.experimental?.qecExperiments===true,composedNoise:parseOptions.experimental?.composedNoise===true,feedForward:parseOptions.experimental?.feedForward===true,typedCollection:parseOptions.experimental?.typedCollection===true,comptimeConst:parseOptions.experimental?.comptimeConst===true},...parsed.program.genericOracles?{genericOracles:parsed.program.genericOracles}:{},...parsed.program.genericCircuits?{genericCircuits:parsed.program.genericCircuits}:{},...parsed.program.qecExperiments?{qecExperiments:parsed.program.qecExperiments}:{},...parsed.program.composedNoise?{composedNoise:parsed.program.composedNoise}:{},...parsed.program.feedForward?{feedForward:parsed.program.feedForward}:{},...parsed.program.typedCollection?{typedCollection:parsed.program.typedCollection}:{},...parsed.program.comptimeConstants?{comptimeConstants:parsed.program.comptimeConstants}:{}},null,2)],stderr:[]}}const stdout=[`N/M check: ${errors.length===0?"ok":"failed"}`,`qubits: ${parsed.numQubits}`,`diagnostics: ${parsed.diagnostics.length}`,...parsed.diagnostics.map(diagnostic5=>`${diagnostic5.severity} ${diagnostic5.code}: ${diagnostic5.message}`)];if(warnings.length>0&&errors.length===0){stdout.push(`warnings: ${warnings.length}`)}return{exitCode:errors.length>0?1:0,stdout,stderr:[]}}function runNMSource(source,parseOptions,asJson=false){const result2=executeNMCode(source,parseOptions);if(asJson){const genericProgram=parseOptions.experimental?.genericOracles||parseOptions.experimental?.genericCircuits||parseOptions.experimental?.qecExperiments||parseOptions.experimental?.composedNoise?parseNMCode(source,parseOptions).program:void 0;const genericOracles=parseOptions.experimental?.genericOracles?genericProgram?.genericOracles:void 0;const genericCircuits=parseOptions.experimental?.genericCircuits?genericProgram?.genericCircuits:void 0;const qecExperiments=parseOptions.experimental?.qecExperiments?genericProgram?.qecExperiments:void 0;const composedNoise=parseOptions.experimental?.composedNoise?genericProgram?.composedNoise:void 0;return{exitCode:result2.success?0:1,stdout:[JSON.stringify({...result2,experimental:{genericOracles:parseOptions.experimental?.genericOracles===true,genericCircuits:parseOptions.experimental?.genericCircuits===true,qecExperiments:parseOptions.experimental?.qecExperiments===true,composedNoise:parseOptions.experimental?.composedNoise===true,feedForward:parseOptions.experimental?.feedForward===true,typedCollection:parseOptions.experimental?.typedCollection===true,comptimeConst:parseOptions.experimental?.comptimeConst===true},...genericOracles?{genericOracles}:{},...genericCircuits?{genericCircuits}:{},...qecExperiments?{qecExperiments}:{},...composedNoise?{composedNoise}:{}},null,2)],stderr:[]}}const stdout=[`N/M run: ${result2.success?"ok":"failed"}`,`engine: ${result2.engine??"statevector"}`,`executionMs: ${result2.executionTime}`,...result2.output];if(result2.feedForwardVerification){const verification=result2.feedForwardVerification;stdout.push(verification.tier===1?`feedForward: tier-1 verified paths=${verification.reachablePaths} seed=${result2.feedForwardBranchRecord?.seed??"missing"}`:`feedForward: tier-2 sampled reason=${verification.reason??"undeclared"} seed=${result2.feedForwardBranchRecord?.seed??"missing"}`)}if(result2.sampleHistogram?.entries.length){stdout.push("histogram:");stdout.push(...result2.sampleHistogram.entries.map(entry=>`${entry.state}: ${entry.count}`))}if(result2.typedCollection){stdout.push(`collect: ${result2.typedCollection.resultType} seed=${result2.typedCollection.seed}`)}const diagnostics=result2.diagnostics?.map(diagnostic5=>`${diagnostic5.severity} ${diagnostic5.code}: ${diagnostic5.message}`)??[];return{exitCode:result2.success?0:1,stdout:[...stdout,...diagnostics],stderr:[]}}function debugNMSource(source,sourceId2,breakpointLines,asJson,parseOptions){const session=startNMDebugSession2(source,{sourceId:sourceId2,breakpointLines,executeOptions:parseOptions});if(asJson)return{exitCode:session.status==="failed"?1:0,stdout:[JSON.stringify(session,null,2)],stderr:[]};const verified=session.breakpointResolutions.filter(entry=>entry.verified).length;return{exitCode:session.status==="failed"?1:0,stdout:[`N/M debug: ${session.status}`,`source: ${session.sourceId}`,`frames: ${session.timeline.frameCount}; bytes: ${session.timeline.jsonBytes}`,`breakpoints: ${verified}/${session.breakpointResolutions.length} verified`,...session.frames.map(frame=>`#${frame.index} ${frame.sourceLocation?`${frame.sourceLocation.sourceId}:${frame.sourceLocation.line}:${frame.sourceLocation.column}`:"runtime"} ${frame.phase} ${frame.label}`)],stderr:session.status==="failed"?[session.error??"N/M debug failed."]:[]}}function estimateNMSource(source,parseOptions,budget){const parsed=parseNMCode(source,parseOptions);const errors=parsed.diagnostics.filter(diagnostic5=>diagnostic5.severity==="error");if(errors.length>0){return{exitCode:1,stdout:[],stderr:errors.map(diagnostic5=>`${diagnostic5.code}: ${diagnostic5.message}`)}}const resources=estimateNMResources(parsed.program,parsed.numQubits);if(budget){const oracleInstantiations=parsed.program.genericOracles?.instantiations??[];const circuitInstantiations=parsed.program.genericCircuits?.instantiations??[];const evaluation=evaluateNMResourceBudget(budget,{sourceHash:hashNMWorkspaceText(source.replace(/\r\n?/gu,"\n").trimEnd()),qubits:resources.qubits,gates:resources.gates,depth:resources.depth,shots:parsed.program.sampleShots??0,genericInstantiations:oracleInstantiations.length+circuitInstantiations.length,expandedGates:[...oracleInstantiations,...circuitInstantiations].reduce((total,instantiation)=>total+instantiation.expandedGateCount,0)});if("issues"in evaluation){return errorResult(evaluation.issues.map(({code,message})=>`${code}: ${message}`).join(" "))}return{exitCode:evaluation.allowed?0:1,stdout:[JSON.stringify({...evaluation,budget,resources},null,2)],stderr:[]}}return{exitCode:0,stdout:[JSON.stringify(resources,null,2)],stderr:[]}}function exportNMSource(source,target2,parseOptions,strictQasm=false,asJson=false){if(target2==="ir"){const exported=exportToNMIR(source,parseOptions);return exported.success&&exported.json?{exitCode:0,stdout:[exported.json.trimEnd()],stderr:[]}:errorResult(exported.error??"N/M IR export failed.")}if(target2==="pennylane"){const exported=exportToFrameworks(source,parseOptions);const selected=exported.exports?.find(item=>item.target==="pennylane");if(exported.success&&selected?.requiresSidecar&&!asJson){const feature=selected.sidecar?.format==="nm-compute-apply-framework"?"Compute/apply":"Classical-function";return errorResult(`${feature} PennyLane export requires --json to retain its source sidecar and execution semantics.`)}return exported.success&&selected?{exitCode:0,stdout:[asJson?JSON.stringify({...selected,warnings:exported.warnings??[]},null,2):selected.code],stderr:[]}:{exitCode:1,stdout:[],stderr:[exported.error??"PennyLane export failed."]}}const parsed=parseNMCode(source,parseOptions);const hasTrainBlock=parsed.program.statements.some(statement=>statement.kind==="train");const needsTrainedParams=(target2==="qasm2"||target2==="qasm3")&&(hasTrainBlock||Boolean(parsed.program.optimize));const trainedParams=needsTrainedParams?selectNMTrainingExportParams(executeNMCode(source,parseOptions)):void 0;if(needsTrainedParams&&!trainedParams)return errorResult(NM_TRAINING_EXPORT_REQUIRED);if(target2==="qasm2"){const exported=exportToQASM(source,parseOptions,trainedParams);if(asJson)return{exitCode:exported.success?0:1,stdout:[JSON.stringify(exported,null,2)],stderr:[]};if(exported.requiresSidecar)return errorResult("Compute/apply QASM2 export requires --json to retain its source sidecar and execution semantics.");return exported.qasm?{exitCode:0,stdout:[exported.qasm],stderr:[]}:{exitCode:1,stdout:[],stderr:[exported.error??"OpenQASM 2 export failed."]}}if(target2==="qasm3"){const exported=exportToQASM3(source,{...parseOptions,conformance:strictQasm?"strict":"preview",...trainedParams?{trainedParams}:{}});if(asJson){return{exitCode:exported.success?0:1,stdout:[JSON.stringify(exported,null,2)],stderr:[]}}if(exported.sidecar?.version==="0.4")return errorResult("Classical-function QASM3 export requires --json to retain its v0.4 sidecar and execution semantics.");if(exported.sidecar?.version==="0.5")return errorResult("Compute/apply QASM3 export requires --json to retain its v0.5 source sidecar and execution semantics.");return exported.qasm?{exitCode:0,stdout:[exported.qasm],stderr:[]}:{exitCode:1,stdout:[],stderr:[exported.error??"OpenQASM 3 export failed."]}}if(target2==="quantikz"){if(parsed.program.composedNoise){return errorResult("NM-NOISE-PROFILE-010: Quantikz cannot preserve composed-noise scope and ordering.")}const result2=executeNMCode(source,parseOptions);return result2.quantikzCircuit?{exitCode:0,stdout:[result2.quantikzCircuit],stderr:[]}:{exitCode:1,stdout:[],stderr:["Quantikz export is unavailable for this program."]}}return{exitCode:0,stdout:[JSON.stringify(parsed.program,null,2)],stderr:[]}}function applyShotOverride(source,shots){if(!shots){return source}if(/^\s*@shots\(/m.test(source)){return source.replace(/^\s*@shots\(\d+\);?/m,`@shots(${shots});`)}const moduleMatch=source.match(/^module\s+[A-Za-z_]\w*\s*;/m);if(!moduleMatch||moduleMatch.index===void 0){return`@shots(${shots});
|
|
1528
|
-
${source}`}const insertAt=moduleMatch.index+moduleMatch[0].length;return`${source.slice(0,insertAt)}
|
|
1529
|
-
@shots(${shots});${source.slice(insertAt)}`}function errorResult(message){return{exitCode:1,stdout:[],stderr:[message]}}function isNMCLICommand(value){return nmCliCommands.includes(value??"")}function isNMCLIExportTarget(value){return value==="qasm2"||value==="qasm3"||value==="quantikz"||value==="json"||value==="ir"||value==="pennylane"}function usageText(){return["Usage: nm <command> [file.nm] [options]","Commands:",...nmCliCommandContracts.map(contract4=>` ${contract4.usage}`)," --version [--json]","Language defaults: classical functions, typed values/Result, module visibility, parameter groups and compute/apply are enabled."," --legacy-features Start with all optional features disabled; explicit --experimental-* flags still apply.","Workspace: use workspace.<module>; imports sibling .nm modules indexed from the entry directory."].join("\n")}export{NM_CLI_CONTRACT_VERSION,NM_LANGUAGE_PREVIEW_READINESS_FORMAT,NM_LANGUAGE_PREVIEW_READINESS_VERSION,NM_WORKSPACE_MAX_DOCUMENTS,NM_WORKSPACE_MAX_SOURCE_BYTES,evaluateNMLanguagePreviewReadiness,getNMWorkspaceModuleName,nmCliCommandContracts,nmCliCommands,nmCliExitCodeContract,nmLanguagePreviewReadiness,nmLanguageReleaseChangelog,nmVersionManifest,nmWorkspaceDiagnosticCodes,runNMCLI,validateNMWorkspaceManifestJsonText};
|
|
1526
|
+
`;function runNMCLI(args,options){if(args.length===0||args[0]==="--help"||args[0]==="help"){return{exitCode:0,stdout:[usageText()],stderr:[]}}if(args[0]==="--version"||args[0]==="version"){const asJson=args.includes("--json");return{exitCode:0,stdout:[asJson?JSON.stringify(nmVersionManifest,null,2):`N/M ${nmVersionManifest.languageVersion} (${nmVersionManifest.stability})`],stderr:[]}}const parsed=parseNMCLIArgs(args);if(!parsed.success){return errorResult(parsed.error)}if(parsed.value.command==="init"){return initNMSource(parsed.value.filePath,parsed.value.force??false,options)}if(parsed.value.command==="package"&&(parsed.value.packageAction==="list"||parsed.value.packageAction==="inspect"||parsed.value.packageAction==="install"||parsed.value.packageAction==="sign"||parsed.value.packageAction==="verify")){return packageRegistryNM(parsed.value,options)}let source;try{source=options.readFile(parsed.value.filePath)}catch(error){return errorResult(error instanceof Error?error.message:"Unable to read input file.")}let parseOptions={};let workspaceDocuments=[];const needsWorkspaceIndex=parsed.value.command!=="fmt"&&!(parsed.value.command==="checkpoint"&&parsed.value.checkpointAction!=="create")&&!(parsed.value.command==="package"&&parsed.value.packageAction==="validate")&&!(parsed.value.command==="workspace"&&parsed.value.workspaceAction==="validate");if(needsWorkspaceIndex){try{workspaceDocuments=options.readWorkspaceDocuments?.(parsed.value.filePath)??[];const index=createNMWorkspaceIndex(workspaceDocuments.map(document=>({uri:document.path,source:document.source})));const invalidIndex=index.diagnostics.find(item=>["NM-WORKSPACE-001","NM-WORKSPACE-004","NM-WORKSPACE-005"].includes(item.code));if(invalidIndex)return errorResult(`${invalidIndex.code}: ${invalidIndex.message}`);const documentModules=Object.fromEntries(workspaceDocuments.flatMap(document=>{const moduleName=getNMWorkspaceModuleName(document.source);return moduleName?[[moduleName,document.source]]:[]}));parseOptions={workspaceModules:workspaceDocuments.length>0?documentModules:options.readWorkspaceModules?.(parsed.value.filePath)??{}}}catch(error){return errorResult(error instanceof Error?error.message:"Unable to index N/M workspace modules.")}}if(parsed.value.experimentalPropertyAssertions){parseOptions={...parseOptions,experimental:{...parseOptions.experimental,propertyAssertions:true}}}if(parsed.value.experimentalParameterGroups)parseOptions={...parseOptions,experimental:{...parseOptions.experimental,parameterGroups:true}};if(parsed.value.experimentalComputeApply)parseOptions={...parseOptions,experimental:{...parseOptions.experimental,computeApply:true}};if(parsed.value.experimentalModuleVisibility){parseOptions={...parseOptions,experimental:{...parseOptions.experimental,moduleVisibility:true}}}if(parsed.value.experimentalExactImports){parseOptions={...parseOptions,experimental:{...parseOptions.experimental,exactImports:true}}}if(parsed.value.experimentalQmlTrainingControls){parseOptions={...parseOptions,experimental:{...parseOptions.experimental,qmlTrainingControls:true}}}if(parsed.value.experimentalTypedClassicalValues){parseOptions={...parseOptions,experimental:{...parseOptions.experimental,typedClassicalValues:true}}}if(parsed.value.experimentalTargetCapabilityConstraints){parseOptions={...parseOptions,experimental:{...parseOptions.experimental,targetCapabilityConstraints:true}}}if(parsed.value.experimentalClassicalFunctions){parseOptions={...parseOptions,experimental:{...parseOptions.experimental,classicalFunctions:true}}}if(parsed.value.experimentalFunctionResults){parseOptions={...parseOptions,experimental:{...parseOptions.experimental,functionResults:true}}}if(parsed.value.experimentalGenericOracles){parseOptions={...parseOptions,experimental:{...parseOptions.experimental,genericOracles:true}}}if(parsed.value.experimentalGenericCircuits){parseOptions={...parseOptions,experimental:{...parseOptions.experimental,genericCircuits:true}}}if(parsed.value.experimentalQECExperiments){parseOptions={...parseOptions,experimental:{...parseOptions.experimental,qecExperiments:true}}}if(parsed.value.experimentalComposedNoise){parseOptions={...parseOptions,experimental:{...parseOptions.experimental,composedNoise:true}}}if(parsed.value.experimentalFeedForward){parseOptions={...parseOptions,experimental:{...parseOptions.experimental,feedForward:true}}}if(parsed.value.experimentalTypedCollection){parseOptions={...parseOptions,experimental:{...parseOptions.experimental,typedCollection:true}}}if(parsed.value.experimentalComptimeConst){parseOptions={...parseOptions,experimental:{...parseOptions.experimental,comptimeConst:true}}}if(!parsed.value.legacyFeatures)parseOptions=createNMDefaultParseOptions(parseOptions);if(parsed.value.shots!==void 0)parseOptions={...parseOptions,expectationShots:parsed.value.shots};let resourceBudget;if(parsed.value.command==="estimate"&&parsed.value.budgetPath){let budgetText;try{budgetText=options.readFile(parsed.value.budgetPath)}catch(error){return errorResult(error instanceof Error?error.message:"Unable to read resource budget.")}const parsedBudget=readNMResourceBudgetJson(budgetText);if(!parsedBudget.budget){return errorResult(parsedBudget.issues.map(({code,message})=>`${code}: ${message}`).join(" "))}resourceBudget=parsedBudget.budget}switch(parsed.value.command){case"check":return checkNMSource(source,parseOptions,parsed.value.asJson??false);case"run":if(parsed.value.sweepPath)return runNMParameterSweepCLI(source,parsed.value.sweepPath,parseOptions,parsed.value.asJson??false,options);return runNMSource(source,parseOptions,parsed.value.asJson??false);case"debug":return debugNMSource(source,parsed.value.filePath,parsed.value.breakpointLines??[],parsed.value.asJson??false,parseOptions);case"estimate":return estimateNMSource(source,parseOptions,resourceBudget);case"export":return exportNMSource(source,parsed.value.exportTarget??"qasm3",parseOptions,parsed.value.qasmStrict??false,parsed.value.asJson??false);case"benchmark":return benchmarkNMSource(source,parsed.value);case"checkpoint":return checkpointNMSource(source,parsed.value);case"fmt":return formatNMSource(source,parsed.value.filePath,parsed.value.checkFormat??false,parsed.value.formatMode??"preserve",options);case"lint":return lintNMSource(source,parsed.value.strict??false,parseOptions);case"test":return testNMSource(source,parsed.value.filePath,parseOptions,parsed.value.asJson??false);case"explain":return explainNMSource(source,parsed.value.asJson??false,parseOptions);case"transpile":return transpileNMSourceForCLI(source,parsed.value.target,parsed.value.calibrationPath,parsed.value.asJson??false,parseOptions,options);case"package":return packageNMSource(source,parsed.value.packageAction==="build"?"build":"validate",parseOptions);case"workspace":return workspaceNMSource(source,parsed.value.filePath,parsed.value.workspaceAction??"validate",parseOptions,workspaceDocuments,parsed.value.asJson??false);case"lock":return dependencyLockNMSource(source,parseOptions,parsed.value.lockPath,parsed.value.asJson??false,options)}}function parseNMCLIArgs(args){const[command,filePath,...flags3]=args;if(!isNMCLICommand(command)){return{success:false,error:usageText()}}if(command!=="init"&&!filePath){return{success:false,error:`Missing input file for nm ${command}.`}}if(command==="package"){const action=filePath;if(action==="list"){if(flags3.length>1||flags3.length===1&&flags3[0]!=="--json"){return{success:false,error:`Unknown option: ${flags3[0]}`}}return{success:true,value:{command,filePath:"",packageAction:action,asJson:flags3[0]==="--json"}}}if(action==="inspect"){const packageSpecifier=flags3[0];const inspectFlags=flags3.slice(1);if(!packageSpecifier||packageSpecifier.startsWith("--")){return{success:false,error:"Missing package specifier for nm package inspect."}}if(inspectFlags.length>1||inspectFlags.length===1&&inspectFlags[0]!=="--json"){return{success:false,error:`Unknown option: ${inspectFlags[0]}`}}return{success:true,value:{command,filePath:"",packageAction:action,packageSpecifier,asJson:inspectFlags[0]==="--json"}}}if(action==="install"){const packageSpecifier=flags3[0];if(!packageSpecifier||packageSpecifier.startsWith("--")){return{success:false,error:"Missing package specifier for nm package install."}}const value={command,filePath:"",packageAction:action,packageSpecifier};for(let index=1;index<flags3.length;index+=1){if(flags3[index]==="--output"){const outputPath=flags3[index+1];if(!outputPath||outputPath.startsWith("--"))return{success:false,error:"--output expects a relative .nm path."};value.outputPath=outputPath;index+=1}else if(flags3[index]==="--force"){value.force=true}else if(flags3[index]==="--json"){value.asJson=true}else{return{success:false,error:`Unknown option: ${flags3[index]}`}}}return{success:true,value}}if(action==="sign"||action==="verify"){const packageFilePath2=flags3[0];if(!packageFilePath2||packageFilePath2.startsWith("--")){return{success:false,error:`Missing package bundle for nm package ${action}.`}}const value={command,filePath:packageFilePath2,packageAction:action};for(let index=1;index<flags3.length;index+=1){if(flags3[index]==="--output"&&action==="sign"){const outputPath=flags3[index+1];if(!outputPath||outputPath.startsWith("--"))return{success:false,error:"--output expects a JSON path."};value.outputPath=outputPath;index+=1}else if(flags3[index]==="--force"&&action==="sign"){value.force=true}else if(flags3[index]==="--json"){value.asJson=true}else{return{success:false,error:`Unknown option: ${flags3[index]}`}}}return{success:true,value}}const packageFilePath=flags3[0];if(action!=="validate"&&action!=="build"){return{success:false,error:"nm package expects build, validate, list, inspect, install, sign, or verify."}}if(!packageFilePath){return{success:false,error:`Missing input file for nm package ${action}.`}}if(flags3.length>1){return{success:false,error:`Unknown option: ${flags3[1]}`}}return{success:true,value:{command,filePath:packageFilePath,packageAction:action}}}if(command==="workspace"){const action=filePath;const workspaceFilePath=flags3[0];if(action!=="snapshot"&&action!=="share"&&action!=="validate"){return{success:false,error:"nm workspace expects snapshot, share, or validate."}}if(!workspaceFilePath){return{success:false,error:`Missing input file for nm workspace ${action}.`}}const workspaceFlags=flags3.slice(1);if(workspaceFlags.length>1||workspaceFlags[0]&&(workspaceFlags[0]!=="--json"||action!=="validate")){return{success:false,error:`Unknown option: ${workspaceFlags[0]}`}}return{success:true,value:{command,filePath:workspaceFilePath,workspaceAction:action,asJson:workspaceFlags[0]==="--json"}}}if(command==="checkpoint"){const action=filePath;const checkpointFilePath=flags3[0];if(action!=="create"&&action!=="resume"&&action!=="model")return{success:false,error:"nm checkpoint expects create, resume, or model."};if(!checkpointFilePath||checkpointFilePath.startsWith("--"))return{success:false,error:`Missing input file for nm checkpoint ${action}.`};const value={command,filePath:checkpointFilePath,checkpointAction:action};const checkpointFlags=flags3.slice(1);for(let index=0;index<checkpointFlags.length;index+=1){const flag=checkpointFlags[index];const flagValue=checkpointFlags[index+1];if(flag==="--steps"&&action==="create"){const steps=Number(flagValue);if(!Number.isInteger(steps)||steps<1||steps>100)return{success:false,error:"--steps expects an integer from 1 through 100."};value.benchmarkSteps=steps;index+=1}else if(flag==="--learning-rate"&&action==="create"){const learningRate=Number(flagValue);if(!Number.isFinite(learningRate)||learningRate<=0||learningRate>5)return{success:false,error:"--learning-rate expects a finite number in (0, 5]."};value.benchmarkLearningRate=learningRate;index+=1}else if(flag==="--additional-steps"&&action==="resume"){const steps=Number(flagValue);if(!Number.isInteger(steps)||steps<1||steps>100)return{success:false,error:"--additional-steps expects an integer from 1 through 100."};value.checkpointAdditionalSteps=steps;index+=1}else if(flag==="--name"&&action==="model"){if(!flagValue||!/^[a-z0-9]+(?:-[a-z0-9]+)*$/u.test(flagValue))return{success:false,error:"--name expects a lowercase model slug."};value.checkpointModelName=flagValue;index+=1}else{return{success:false,error:`Unknown option: ${flag}`}}}if(action==="resume"&&value.checkpointAdditionalSteps==null)return{success:false,error:"nm checkpoint resume requires --additional-steps."};if(action==="model"&&!value.checkpointModelName)return{success:false,error:"nm checkpoint model requires --name."};return{success:true,value}}const initHasPath=command==="init"&&Boolean(filePath&&!filePath.startsWith("--"));const parsed={command,filePath:command==="init"?initHasPath?filePath:"main.nm":filePath};const commandFlags=command==="init"&&!initHasPath?args.slice(1):flags3;for(let index=0;index<commandFlags.length;index+=1){const flag=commandFlags[index];const value=commandFlags[index+1];if(flag==="--legacy-features"){parsed.legacyFeatures=true;continue}if(flag==="--experimental-compute-apply"){if(!["check","run","debug","estimate","export","lint","test","explain","transpile"].includes(command))return{success:false,error:"--experimental-compute-apply is only valid for N/M parse, execution, test, and export commands."};parsed.experimentalComputeApply=true;continue}if(flag==="--sweep"){if(command!=="run"||parsed.sweepPath||!value||value.startsWith("--"))return{success:false,error:"--sweep expects one request JSON path and is only valid for nm run."};parsed.sweepPath=value;index++;continue}if(flag==="--experimental-parameter-groups"){if(!["check","run","debug","estimate","export","lint","test","explain","transpile"].includes(command))return{success:false,error:"--experimental-parameter-groups is only valid for N/M parse, execution, test, and export commands."};parsed.experimentalParameterGroups=true;continue}if(flag==="--optimizers"){if(command!=="benchmark")return{success:false,error:"--optimizers is only valid for nm benchmark."};const optimizers2=value?.split(",").filter(Boolean);if(!optimizers2?.length||optimizers2.some(optimizer=>!["gd","momentum","adam","spsa","qng"].includes(optimizer)))return{success:false,error:"--optimizers expects a comma-separated subset of gd,momentum,adam,spsa,qng."};parsed.benchmarkOptimizers=optimizers2;index+=1;continue}if(flag==="--steps"){if(command!=="benchmark")return{success:false,error:"--steps is only valid for nm benchmark or nm checkpoint create."};const steps=Number(value);if(!Number.isInteger(steps)||steps<1||steps>100)return{success:false,error:"--steps expects an integer from 1 through 100."};parsed.benchmarkSteps=steps;index+=1;continue}if(flag==="--repeats"){if(command!=="benchmark")return{success:false,error:"--repeats is only valid for nm benchmark."};const repeats=Number(value);if(!Number.isInteger(repeats)||repeats<1||repeats>5)return{success:false,error:"--repeats expects an integer from 1 through 5."};parsed.benchmarkRepeats=repeats;index+=1;continue}if(flag==="--seed"){if(command!=="benchmark")return{success:false,error:"--seed is only valid for nm benchmark."};const seed=Number(value);if(!Number.isSafeInteger(seed))return{success:false,error:"--seed expects a safe integer."};parsed.benchmarkSeed=seed;index+=1;continue}if(flag==="--learning-rate"){if(command!=="benchmark")return{success:false,error:"--learning-rate is only valid for nm benchmark or nm checkpoint create."};const learningRate=Number(value);if(!Number.isFinite(learningRate)||learningRate<=0||learningRate>5)return{success:false,error:"--learning-rate expects a finite number in (0, 5]."};parsed.benchmarkLearningRate=learningRate;index+=1;continue}if(flag==="--csv"){if(command!=="benchmark")return{success:false,error:"--csv is only valid for nm benchmark."};parsed.benchmarkCsv=true;continue}if(flag==="--shots"){if(command!=="run")return{success:false,error:"--shots is only valid for nm run."};const shots=Number(value);if(!Number.isInteger(shots)||shots<=0){return{success:false,error:"--shots expects a positive integer."}}parsed.shots=shots;index+=1;continue}if(flag==="--experimental-property-assertions"){if(!["check","run","debug","estimate","export","lint","test","explain","transpile"].includes(command)){return{success:false,error:"--experimental-property-assertions is only valid for N/M parse, execution, test, and export commands."}}parsed.experimentalPropertyAssertions=true;continue}if(flag==="--experimental-module-visibility"){if(!["check","run","debug","estimate","export","lint","test","explain","transpile"].includes(command)){return{success:false,error:"--experimental-module-visibility is only valid for N/M parse, execution, test, and export commands."}}parsed.experimentalModuleVisibility=true;continue}if(flag==="--experimental-exact-imports"){if(!["check","run","debug","estimate","export","lint","test","explain","transpile"].includes(command)){return{success:false,error:"--experimental-exact-imports is only valid for N/M parse, execution, test, and export commands."}}parsed.experimentalExactImports=true;continue}if(flag==="--experimental-qml-training-controls"){if(!["check","run","debug","estimate","export","lint","test","explain","transpile"].includes(command)){return{success:false,error:"--experimental-qml-training-controls is only valid for N/M parse, execution, test, and export commands."}}parsed.experimentalQmlTrainingControls=true;continue}if(flag==="--experimental-typed-classical-values"){if(!["check","run","debug","estimate","export","lint","test","explain","transpile"].includes(command)){return{success:false,error:"--experimental-typed-classical-values is only valid for N/M parse, execution, test, and export commands."}}parsed.experimentalTypedClassicalValues=true;continue}if(flag==="--experimental-target-capability-constraints"){if(!["check","run","debug","estimate","export","lint","test","explain","transpile"].includes(command)){return{success:false,error:"--experimental-target-capability-constraints is only valid for N/M parse, execution, test, and export commands."}}parsed.experimentalTargetCapabilityConstraints=true;continue}if(flag==="--experimental-classical-functions"){if(!["check","run","debug","estimate","export","lint","test","explain","transpile"].includes(command)){return{success:false,error:"--experimental-classical-functions is only valid for N/M parse, execution, test, and export commands."}}parsed.experimentalClassicalFunctions=true;continue}if(flag==="--experimental-function-results"){if(!["check","run","debug","estimate","export","lint","test","explain","transpile"].includes(command)){return{success:false,error:"--experimental-function-results is only valid for N/M parse, execution, test, and export commands."}}parsed.experimentalFunctionResults=true;continue}if(flag==="--experimental-generic-oracles"){if(!["check","run","debug","estimate","export","lint","test","explain","transpile"].includes(command)){return{success:false,error:"--experimental-generic-oracles is only valid for N/M parse, execution, test, and export commands."}}parsed.experimentalGenericOracles=true;continue}if(flag==="--experimental-generic-circuits"){if(!["check","run","debug","estimate","export","lint","test","explain","transpile"].includes(command)){return{success:false,error:"--experimental-generic-circuits is only valid for N/M parse, execution, test, and export commands."}}parsed.experimentalGenericCircuits=true;continue}if(flag==="--experimental-qec-experiments"){if(!["check","run","debug","estimate","export","lint","test","explain","transpile"].includes(command)){return{success:false,error:"--experimental-qec-experiments is only valid for N/M parse, execution, test, and export commands."}}parsed.experimentalQECExperiments=true;continue}if(flag==="--experimental-composed-noise"){if(!["check","run","debug","estimate","export","lint","test","explain","transpile"].includes(command)){return{success:false,error:"--experimental-composed-noise is only valid for N/M parse, execution, test, and export commands."}}parsed.experimentalComposedNoise=true;continue}if(flag==="--experimental-feed-forward"){if(!["check","run","debug","estimate","export","lint","test","explain","transpile"].includes(command)){return{success:false,error:"--experimental-feed-forward is only valid for N/M parse, execution, test, and export commands."}}parsed.experimentalFeedForward=true;continue}if(flag==="--experimental-typed-collection"){if(!["check","run","debug","estimate","export","lint","test","explain","transpile"].includes(command)){return{success:false,error:"--experimental-typed-collection is only valid for N/M parse, execution, test, and export commands."}}parsed.experimentalTypedCollection=true;continue}if(flag==="--experimental-comptime-const"){if(!["check","run","debug","estimate","export","lint","test","explain","transpile"].includes(command)){return{success:false,error:"--experimental-comptime-const is only valid for N/M parse, execution, test, and export commands."}}parsed.experimentalComptimeConst=true;continue}if(flag==="--breakpoint"){if(command!=="debug")return{success:false,error:"--breakpoint is only valid for nm debug."};const line=Number(value);if(!Number.isSafeInteger(line)||line<1)return{success:false,error:"--breakpoint expects a positive one-based line."};(parsed.breakpointLines??(parsed.breakpointLines=[])).push(line);index+=1;continue}if(flag==="--to"){if(command!=="export")return{success:false,error:"--to is only valid for nm export."};if(!isNMCLIExportTarget(value)){return{success:false,error:"--to expects qasm2, qasm3, quantikz, json, ir, or pennylane."}}parsed.exportTarget=value;index+=1;continue}if(flag==="--ftqc"){if(command!=="estimate")return{success:false,error:"--ftqc is only valid for nm estimate."};continue}if(flag==="--budget"){if(command!=="estimate")return{success:false,error:"--budget is only valid for nm estimate."};if(!value||value.startsWith("--"))return{success:false,error:"--budget expects an nm-resource-budget JSON path."};parsed.budgetPath=value;index+=1;continue}if(flag==="--check"){if(command!=="fmt")return{success:false,error:"--check is only valid for nm fmt."};parsed.checkFormat=true;continue}if(flag==="--lock"){if(command!=="lock")return{success:false,error:"--lock is only valid for nm lock."};if(!value||value.startsWith("--"))return{success:false,error:"--lock expects an nm-lock.json path."};parsed.lockPath=value;index+=1;continue}if(flag==="--mode"){if(command!=="fmt")return{success:false,error:"--mode is only valid for nm fmt."};if(!isNMSourceFormatterMode(value)){return{success:false,error:"--mode expects preserve, canonical-en, or localized-tr."}}parsed.formatMode=value;index+=1;continue}if(flag==="--strict"){if(command==="lint")parsed.strict=true;else if(command==="export")parsed.qasmStrict=true;else return{success:false,error:"--strict is only valid for nm lint or nm export --to qasm3."};continue}if(flag==="--json"){if(command!=="check"&&command!=="run"&&command!=="debug"&&command!=="explain"&&command!=="transpile"&&command!=="export"&&command!=="test"&&command!=="lock"){return{success:false,error:"--json is only valid for nm check, nm run, nm debug, nm test, nm explain, nm transpile, nm export --to qasm3|pennylane, nm lock, or --version."}}parsed.asJson=true;continue}if(flag==="--target"){if(command!=="transpile")return{success:false,error:"--target is only valid for nm transpile."};if(!value||value.startsWith("--"))return{success:false,error:"--target expects a target profile id."};parsed.target=value;index+=1;continue}if(flag==="--calibration"){if(command!=="transpile")return{success:false,error:"--calibration is only valid for nm transpile."};if(!value||value.startsWith("--"))return{success:false,error:"--calibration expects a target calibration JSON path."};parsed.calibrationPath=value;index+=1;continue}if(flag==="--force"){if(command!=="init")return{success:false,error:"--force is only valid for nm init."};parsed.force=true;continue}return{success:false,error:`Unknown option: ${flag}`}}if(parsed.qasmStrict&&(parsed.exportTarget??"qasm3")!=="qasm3"){return{success:false,error:"--strict requires nm export --to qasm3."}}if(parsed.command==="export"&&parsed.asJson&&!["qasm2","qasm3","pennylane"].includes(parsed.exportTarget??"qasm3")){return{success:false,error:"--json requires nm export --to qasm2, --to qasm3 or --to pennylane."}}return{success:true,value:parsed}}function benchmarkNMSource(source,args){const result2=executeNMBenchmark2(source,{...args.benchmarkOptimizers?{optimizers:args.benchmarkOptimizers}:{},...args.benchmarkSteps==null?{}:{steps:args.benchmarkSteps},...args.benchmarkRepeats==null?{}:{repeats:args.benchmarkRepeats},...args.benchmarkSeed==null?{}:{seed:args.benchmarkSeed},...args.benchmarkLearningRate==null?{}:{learningRate:args.benchmarkLearningRate}});if(!result2.success)return errorResult(`${result2.code}: ${result2.error}`);try{return{exitCode:0,stdout:[args.benchmarkCsv?serializeNMBenchmarkCsv(result2).trimEnd():serializeNMBenchmarkJson(result2).trimEnd()],stderr:[]}}catch(error){return errorResult(error instanceof Error?error.message:"Unable to serialize benchmark evidence.")}}function checkpointNMSource(input,args){if(args.checkpointAction==="create"){const parsed=parseNMCode(input);const blocking=parsed.diagnostics.find(diagnostic5=>diagnostic5.severity==="error");if(blocking)return errorResult(`${blocking.code}: ${blocking.message}`);const block=parsed.program.statements.find(statement=>statement.kind==="train");const steps=args.benchmarkSteps??block?.steps??40;const learningRate=args.benchmarkLearningRate??block?.optimizer?.options.lr??.2;const objective=block?.objective.mode??"minimize";const result2=executeNMProgramTraining(input,{optimizer:"gd",steps,learningRate,objective});if(!result2.success)return errorResult(result2.error??"Checkpoint training failed.");const checkpoint=createNMTrainingCheckpoint(input,result2,{optimizer:"gd",completedSteps:steps,learningRate,objective,...parsed.program.seed==null?{}:{seed:parsed.program.seed}});if("error"in checkpoint)return errorResult(`${checkpoint.code}: ${checkpoint.error}`);return{exitCode:0,stdout:[serializeNMTrainingCheckpoint(checkpoint).trimEnd()],stderr:[]}}const imported=importNMTrainingCheckpointJson(input);if(!("checkpoint"in imported))return errorResult(`${imported.issues[0]?.code}: ${imported.issues[0]?.message}`);if(args.checkpointAction==="resume"){const resumed=resumeNMTrainingCheckpoint((source,options)=>executeNMProgramTraining(source,options),imported.checkpoint,args.checkpointAdditionalSteps??0);if(!resumed.success)return errorResult(`${resumed.code}: ${resumed.error}`);return{exitCode:0,stdout:[serializeNMTrainingCheckpoint(resumed.checkpoint).trimEnd()],stderr:[]}}if(args.checkpointAction==="model"){const model=createNMModelPackageFromTrainingCheckpoint(imported.checkpoint,args.checkpointModelName??"");if("error"in model)return errorResult(`${model.code}: ${model.error}`);return{exitCode:0,stdout:[serializeNMModelPackage(model).trimEnd()],stderr:[]}}return errorResult("nm checkpoint expects create, resume, or model.")}function formatNMSource(source,filePath,checkOnly,mode,options){const formatted=formatNMSourcePreserving(source,{mode});if(!checkOnly){if(!options.writeFile)return{exitCode:0,stdout:[formatted],stderr:[]};try{options.writeFile(filePath,formatted,{overwrite:true});return{exitCode:0,stdout:[`Formatted ${filePath}`],stderr:[]}}catch(error){return errorResult(error instanceof Error?error.message:`Unable to format ${filePath}.`)}}return formatted===source?{exitCode:0,stdout:[`N/M fmt: clean (${filePath})`],stderr:[]}:{exitCode:1,stdout:[],stderr:[`N/M fmt: changes required (${filePath})`]}}function lintNMSource(source,strict,parseOptions){const parsed=parseNMCode(source,parseOptions);const errors=parsed.diagnostics.filter(diagnostic5=>diagnostic5.severity==="error");const warnings=parsed.diagnostics.filter(diagnostic5=>diagnostic5.severity==="warning");const failed2=errors.length>0||strict&&warnings.length>0;return{exitCode:failed2?1:0,stdout:[`N/M lint: ${failed2?"failed":"ok"}${strict?" (strict)":""}`,`errors: ${errors.length}`,`warnings: ${warnings.length}`,...parsed.diagnostics.map(diagnostic5=>`${diagnostic5.severity} ${diagnostic5.code}: ${diagnostic5.message}`)],stderr:[]}}function testNMSource(source,filePath,parseOptions,asJson){const result2=executeNMCode(source,parseOptions);const report=createNMTestExplorerReport(result2,{source,uri:createNMCLITestSourceUri(filePath)});const failed2=!report.passed;return{exitCode:failed2?1:0,stdout:asJson?[serializeNMTestExplorerReport(report).trimEnd()]:[`N/M test: ${failed2?"failed":"passed"}`,`report: ${report.reportId}`,`source: ${report.source.hash}`,`checks: ${report.summary.total}`,...report.checks.map(check=>`${check.passed?"PASS":"FAIL"} ${check.kind} ${check.name} (line ${check.line}, id ${check.id})`)],stderr:failed2&&result2.error?[result2.error]:[]}}function createNMCLITestSourceUri(filePath){const normalized=filePath.replace(/\\/gu,"/").replace(/^\/+|\/+$/gu,"");const encoded=normalized.split("/").filter(Boolean).map(part=>encodeURIComponent(part)).join("/");return`nm-cli:///${encoded||"main.nm"}`}function explainNMSource(source,asJson,parseOptions){const insights=analyzeNMCode(source,parseOptions);return{exitCode:insights.some(insight=>insight.severity==="error")?1:0,stdout:asJson?[JSON.stringify(insights,null,2)]:[`N/M explain: ${insights.length} insight(s)`,...insights.map(insight=>`[${insight.severity}] ${insight.title}: ${insight.message}`)],stderr:[]}}function transpileNMSourceForCLI(source,target2,calibrationPath,asJson,parseOptions,options){let resolvedTarget=target2;let calibration;if(calibrationPath){let calibrationText;try{calibrationText=options.readFile(calibrationPath)}catch(error){return errorResult(error instanceof Error?error.message:"Unable to read target calibration file.")}const validation=validateNMTargetCalibrationJsonText(calibrationText);if(!validation.valid){return{exitCode:1,stdout:asJson?[JSON.stringify({success:false,issues:validation.issues},null,2)]:[],stderr:asJson?[]:validation.issues.map(entry=>`${entry.code} ${entry.path}: ${entry.message}`)}}if(target2&&validation.document.target!==target2){const message=`NM-CAL-003 $.target: Calibration target "${validation.document.target}" does not match requested target "${target2}".`;return{exitCode:1,stdout:asJson?[JSON.stringify({success:false,issues:[{code:"NM-CAL-003",path:"$.target",message}]},null,2)]:[],stderr:asJson?[]:[message]}}resolvedTarget=target2??validation.document.target;calibration=validation.document.calibration}const result2=transpileNMSource(source,{target:resolvedTarget,calibration,parseOptions});if(asJson){return{exitCode:result2.success?0:1,stdout:[JSON.stringify(result2,null,2)],stderr:[]}}return{exitCode:result2.success?0:1,stdout:result2.success?[result2.source]:[],stderr:result2.success?[]:[...result2.unsupportedGates.map(gate=>`Unsupported target gate ${gate.gate} at line ${gate.line}.`),...result2.verification.status==="failed"?[result2.verification.reason]:[]]}}function initNMSource(filePath,force,options){if(!options.writeFile)return errorResult("nm init requires a writable CLI environment.");if(!force&&options.fileExists?.(filePath)){return errorResult(`Refusing to overwrite existing file: ${filePath}. Use --force to replace it.`)}try{options.writeFile(filePath,nmStarterSource,{overwrite:force});return{exitCode:0,stdout:[`Created ${filePath}`,"Next: nm check "+filePath],stderr:[]}}catch(error){return errorResult(error instanceof Error?error.message:`Unable to create ${filePath}.`)}}function packageNMSource(source,action,parseOptions){if(action==="validate"){const validation=validateNMLearningPackageJsonText(source);return{exitCode:validation.valid?0:1,stdout:[`N/M package validate: ${validation.valid?"ok":"failed"}`,`issues: ${validation.issues.length}`,...validation.issues.map(issue11=>`${issue11.path} ${issue11.keyword}: ${issue11.message}`)],stderr:[]}}const result2=executeNMCode(source,parseOptions);if(!result2.success){return{exitCode:1,stdout:[],stderr:[result2.error??"N/M package build failed.",...(result2.diagnostics??[]).map(item=>`${item.code}: ${item.message}`)]}}return{exitCode:0,stdout:[serializeNMLearningPackage(source,result2)],stderr:[]}}function packageRegistryNM(parsed,options){if(parsed.packageAction==="list"){const packages=listNMPackages();return{exitCode:0,stdout:parsed.asJson?[JSON.stringify(packages.map(createNMPackageSummary),null,2)]:[`N/M package registry: ${packages.length} package(s)`,...packages.map(entry2=>`${entry2.manifest.specifier} ${entry2.manifest.trust}/${entry2.manifest.attestation.status} ${entry2.description.en}`)],stderr:[]}}if(parsed.packageAction==="sign"||parsed.packageAction==="verify"){let text;try{text=options.readFile(parsed.filePath)}catch(error){return errorResult(error instanceof Error?error.message:"Unable to read package bundle.")}const parsedBundle=parseNMPackageRegistryEntryJsonText(text);if(!parsedBundle.valid){return{exitCode:1,stdout:[],stderr:parsedBundle.issues.map(issue11=>`${issue11.code} ${issue11.path}: ${issue11.message}`)}}if(parsed.packageAction==="verify"){if(!options.packageVerifier)return errorResult("nm package verify requires configured trusted public keys.");const signatureValid=verifyNMPackageRegistryEntrySignature(parsedBundle.entry,options.packageVerifier);const issues2=validateNMPackagePublication(parsedBundle.entry,options.packageVerifier);const report={specifier:parsedBundle.entry.manifest.specifier,signatureValid,publishable:issues2.length===0,issues:issues2};return{exitCode:issues2.length===0?0:1,stdout:parsed.asJson?[JSON.stringify(report,null,2)]:[`N/M package verify: ${issues2.length===0?"ok":"failed"}`,`specifier: ${report.specifier}`,`signature: ${signatureValid?"valid":"invalid"}`,...issues2.map(issue11=>`${issue11.code} ${issue11.path}: ${issue11.message}`)],stderr:[]}}if(!options.packageSigner)return errorResult("nm package sign requires an Ed25519 signing key.");if(!options.writeFile)return errorResult("nm package sign requires a writable CLI environment.");const outputPath2=parsed.outputPath??parsed.filePath.replace(/\.json$/i,"")+".signed.json";if(!outputPath2.toLowerCase().endsWith(".json"))return errorResult("Signed package output must use a .json path.");if(!parsed.force&&options.fileExists?.(outputPath2)){return errorResult(`Refusing to overwrite existing file: ${outputPath2}. Use --force to replace it.`)}try{const signed=signNMPackageRegistryEntry(parsedBundle.entry,options.packageSigner,(options.now?.()??new Date).toISOString());options.writeFile(outputPath2,`${JSON.stringify(signed,null,2)}
|
|
1527
|
+
`,{overwrite:parsed.force??false});return{exitCode:0,stdout:parsed.asJson?[JSON.stringify({specifier:signed.manifest.specifier,outputPath:outputPath2,attestation:signed.manifest.attestation},null,2)]:[`Signed ${signed.manifest.specifier} -> ${outputPath2}`,`key: ${options.packageSigner.keyId}; algorithm: ${options.packageSigner.algorithm}`],stderr:[]}}catch(error){return errorResult(error instanceof Error?error.message:"Unable to sign package bundle.")}}const entry=resolveNMPackage(parsed.packageSpecifier??"");if(!entry)return errorResult(`N/M package not found: ${parsed.packageSpecifier??""}.`);const issues=validateNMPackageRegistryEntry(entry);if(issues.length>0){return{exitCode:1,stdout:[],stderr:issues.map(issue11=>`${issue11.code} ${issue11.path}: ${issue11.message}`)}}if(parsed.packageAction==="inspect"){return{exitCode:0,stdout:parsed.asJson?[JSON.stringify(entry,null,2)]:[`${entry.manifest.specifier} (${entry.kind})`,entry.description.en,`exports: ${entry.manifest.exports.join(", ")}`,`engine: ${entry.manifest.engines.nm}`,`license: ${entry.manifest.license}`,`trust: ${entry.manifest.trust}; attestation: ${entry.manifest.attestation.status}`,`integrity: ${entry.manifest.integrity.algorithm}-${entry.manifest.integrity.digest}`],stderr:[]}}if(!options.writeFile)return errorResult("nm package install requires a writable CLI environment.");const outputPath=parsed.outputPath??getNMPackageInstallFileName(entry);if(!isSafeNMPackageInstallPath(outputPath)){return errorResult("Package install output must be a traversal-safe relative .nm path.")}if(!parsed.force&&options.fileExists?.(outputPath)){return errorResult(`Refusing to overwrite existing file: ${outputPath}. Use --force to replace it.`)}try{options.writeFile(outputPath,entry.source,{overwrite:parsed.force??false})}catch(error){return errorResult(error instanceof Error?error.message:`Unable to install package to ${outputPath}.`)}const receipt=createNMPackageInstallReceipt(entry,outputPath);return{exitCode:0,stdout:parsed.asJson?[JSON.stringify(receipt,null,2)]:[`Installed ${entry.manifest.specifier} -> ${outputPath}`,`integrity: ${entry.manifest.integrity.algorithm}-${entry.manifest.integrity.digest}`,`trust: ${entry.manifest.trust}; attestation: ${entry.manifest.attestation.status}; license: ${entry.manifest.license}`,`Import with: use workspace.${entry.manifest.moduleName};`],stderr:[]}}function workspaceNMSource(source,filePath,action,parseOptions,workspaceDocuments,asJson){if(action==="validate"){const validation=importNMWorkspaceSnapshotJson(source);if(asJson){return{exitCode:validation.valid?0:1,stdout:[JSON.stringify({ok:validation.valid,format:"nm-workspace-snapshot",version:validation.valid?validation.snapshot.version:null,issueCount:validation.issues.length,issues:validation.issues,reproducibility:validation.valid?{sourceHash:validation.snapshot.reproducibility.sourceHash,runFingerprint:validation.snapshot.reproducibility.runFingerprint,documentCount:validation.snapshot.reproducibility.documentCount}:null},null,2)],stderr:[]}}return{exitCode:validation.valid?0:1,stdout:[`N/M workspace validate: ${validation.valid?"ok":"failed"}`,`issues: ${validation.issues.length}`,...validation.issues.map(issue11=>`${issue11.code} ${issue11.path} ${issue11.keyword}: ${issue11.message}`)],stderr:[]}}const parsed=parseNMCode(source,parseOptions);const errors=parsed.diagnostics.filter(diagnostic5=>diagnostic5.severity==="error");if(!parsed.program.moduleName||errors.length>0){return{exitCode:1,stdout:[],stderr:errors.map(diagnostic5=>`${diagnostic5.code}: ${diagnostic5.message}`)}}const documents=workspaceDocuments.length>0?workspaceDocuments:[{path:filePath.replace(/\\/g,"/").split("/").at(-1)??"main.nm",source}];try{const snapshot2=createNMWorkspaceSnapshot({name:parsed.program.moduleName.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"nm-workspace",entryModule:parsed.program.moduleName,documents,engine:parsed.program.target==="browser-stabilizer"?"stabilizer":"statevector",seed:parsed.program.seed??null});return{exitCode:0,stdout:[action==="share"?createNMWorkspaceSnapshotHref(snapshot2):serializeNMWorkspaceSnapshot(snapshot2)],stderr:[]}}catch(error){return errorResult(error instanceof Error?error.message:"Unable to create workspace snapshot.")}}function dependencyLockNMSource(source,parseOptions,lockPath,asJson,options){if(!lockPath){const created=createNMDependencyLockFromSource(source,parseOptions);if(!created.lock)return{exitCode:1,stdout:[],stderr:created.issues.map(entry=>`${entry.code} ${entry.path}: ${entry.message}`)};return{exitCode:0,stdout:[serializeNMDependencyLock(created.lock).trimEnd()],stderr:[]}}let lockText;try{lockText=options.readFile(lockPath)}catch(error){return errorResult(error instanceof Error?error.message:`Unable to read ${lockPath}.`)}const read5=readNMDependencyLockJson(lockText);const validation=read5.lock?validateNMSourceDependencyLock(source,read5.lock,parseOptions):read5;if(asJson)return{exitCode:validation.lock?0:1,stdout:[JSON.stringify({ok:Boolean(validation.lock),format:"nm-dependency-lock",version:validation.lock?.version??null,packageCount:validation.lock?.packages.length??0,issueCount:validation.issues.length,issues:validation.issues},null,2)],stderr:[]};return{exitCode:validation.lock?0:1,stdout:[`N/M lock check: ${validation.lock?"ok":"failed"}`,`issues: ${validation.issues.length}`,...validation.issues.map(entry=>`${entry.code} ${entry.path}: ${entry.message}`)],stderr:[]}}function checkNMSource(source,parseOptions,asJson=false){const parsed=parseNMCode(source,parseOptions);const errors=parsed.diagnostics.filter(diagnostic5=>diagnostic5.severity==="error");const warnings=parsed.diagnostics.filter(diagnostic5=>diagnostic5.severity==="warning");if(asJson){return{exitCode:errors.length>0?1:0,stdout:[JSON.stringify({ok:errors.length===0,qubits:parsed.numQubits,diagnostics:parsed.diagnostics,experimental:{genericOracles:parseOptions.experimental?.genericOracles===true,genericCircuits:parseOptions.experimental?.genericCircuits===true,qecExperiments:parseOptions.experimental?.qecExperiments===true,composedNoise:parseOptions.experimental?.composedNoise===true,feedForward:parseOptions.experimental?.feedForward===true,typedCollection:parseOptions.experimental?.typedCollection===true,comptimeConst:parseOptions.experimental?.comptimeConst===true},...parsed.program.genericOracles?{genericOracles:parsed.program.genericOracles}:{},...parsed.program.genericCircuits?{genericCircuits:parsed.program.genericCircuits}:{},...parsed.program.qecExperiments?{qecExperiments:parsed.program.qecExperiments}:{},...parsed.program.composedNoise?{composedNoise:parsed.program.composedNoise}:{},...parsed.program.feedForward?{feedForward:parsed.program.feedForward}:{},...parsed.program.typedCollection?{typedCollection:parsed.program.typedCollection}:{},...parsed.program.comptimeConstants?{comptimeConstants:parsed.program.comptimeConstants}:{}},null,2)],stderr:[]}}const stdout=[`N/M check: ${errors.length===0?"ok":"failed"}`,`qubits: ${parsed.numQubits}`,`diagnostics: ${parsed.diagnostics.length}`,...parsed.diagnostics.map(diagnostic5=>`${diagnostic5.severity} ${diagnostic5.code}: ${diagnostic5.message}`)];if(warnings.length>0&&errors.length===0){stdout.push(`warnings: ${warnings.length}`)}return{exitCode:errors.length>0?1:0,stdout,stderr:[]}}function runNMSource(source,parseOptions,asJson=false){const result2=executeNMCode(source,parseOptions);if(asJson){const genericProgram=parseOptions.experimental?.genericOracles||parseOptions.experimental?.genericCircuits||parseOptions.experimental?.qecExperiments||parseOptions.experimental?.composedNoise?parseNMCode(source,parseOptions).program:void 0;const genericOracles=parseOptions.experimental?.genericOracles?genericProgram?.genericOracles:void 0;const genericCircuits=parseOptions.experimental?.genericCircuits?genericProgram?.genericCircuits:void 0;const qecExperiments=parseOptions.experimental?.qecExperiments?genericProgram?.qecExperiments:void 0;const composedNoise=parseOptions.experimental?.composedNoise?genericProgram?.composedNoise:void 0;return{exitCode:result2.success?0:1,stdout:[JSON.stringify({...result2,experimental:{genericOracles:parseOptions.experimental?.genericOracles===true,genericCircuits:parseOptions.experimental?.genericCircuits===true,qecExperiments:parseOptions.experimental?.qecExperiments===true,composedNoise:parseOptions.experimental?.composedNoise===true,feedForward:parseOptions.experimental?.feedForward===true,typedCollection:parseOptions.experimental?.typedCollection===true,comptimeConst:parseOptions.experimental?.comptimeConst===true},...genericOracles?{genericOracles}:{},...genericCircuits?{genericCircuits}:{},...qecExperiments?{qecExperiments}:{},...composedNoise?{composedNoise}:{}},null,2)],stderr:[]}}const stdout=[`N/M run: ${result2.success?"ok":"failed"}`,`engine: ${result2.engine??"statevector"}`,`executionMs: ${result2.executionTime}`,...result2.output];if(result2.feedForwardVerification){const verification=result2.feedForwardVerification;stdout.push(verification.tier===1?`feedForward: tier-1 verified paths=${verification.reachablePaths} seed=${result2.feedForwardBranchRecord?.seed??"missing"}`:`feedForward: tier-2 sampled reason=${verification.reason??"undeclared"} seed=${result2.feedForwardBranchRecord?.seed??"missing"}`)}if(result2.sampleHistogram?.entries.length){stdout.push("histogram:");stdout.push(...result2.sampleHistogram.entries.map(entry=>`${entry.state}: ${entry.count}`))}if(result2.typedCollection){stdout.push(`collect: ${result2.typedCollection.resultType} seed=${result2.typedCollection.seed}`)}const diagnostics=result2.diagnostics?.map(diagnostic5=>`${diagnostic5.severity} ${diagnostic5.code}: ${diagnostic5.message}`)??[];return{exitCode:result2.success?0:1,stdout:[...stdout,...diagnostics],stderr:[]}}function debugNMSource(source,sourceId2,breakpointLines,asJson,parseOptions){const session=startNMDebugSession2(source,{sourceId:sourceId2,breakpointLines,executeOptions:parseOptions});if(asJson)return{exitCode:session.status==="failed"?1:0,stdout:[JSON.stringify(session,null,2)],stderr:[]};const verified=session.breakpointResolutions.filter(entry=>entry.verified).length;return{exitCode:session.status==="failed"?1:0,stdout:[`N/M debug: ${session.status}`,`source: ${session.sourceId}`,`frames: ${session.timeline.frameCount}; bytes: ${session.timeline.jsonBytes}`,`breakpoints: ${verified}/${session.breakpointResolutions.length} verified`,...session.frames.map(frame=>`#${frame.index} ${frame.sourceLocation?`${frame.sourceLocation.sourceId}:${frame.sourceLocation.line}:${frame.sourceLocation.column}`:"runtime"} ${frame.phase} ${frame.label}`)],stderr:session.status==="failed"?[session.error??"N/M debug failed."]:[]}}function estimateNMSource(source,parseOptions,budget){const parsed=parseNMCode(source,parseOptions);const errors=parsed.diagnostics.filter(diagnostic5=>diagnostic5.severity==="error");if(errors.length>0){return{exitCode:1,stdout:[],stderr:errors.map(diagnostic5=>`${diagnostic5.code}: ${diagnostic5.message}`)}}const resources=estimateNMResources(parsed.program,parsed.numQubits);if(budget){const oracleInstantiations=parsed.program.genericOracles?.instantiations??[];const circuitInstantiations=parsed.program.genericCircuits?.instantiations??[];const evaluation=evaluateNMResourceBudget(budget,{sourceHash:hashNMWorkspaceText(source.replace(/\r\n?/gu,"\n").trimEnd()),qubits:resources.qubits,gates:resources.gates,depth:resources.depth,shots:parsed.program.sampleShots??0,genericInstantiations:oracleInstantiations.length+circuitInstantiations.length,expandedGates:[...oracleInstantiations,...circuitInstantiations].reduce((total,instantiation)=>total+instantiation.expandedGateCount,0)});if("issues"in evaluation){return errorResult(evaluation.issues.map(({code,message})=>`${code}: ${message}`).join(" "))}return{exitCode:evaluation.allowed?0:1,stdout:[JSON.stringify({...evaluation,budget,resources},null,2)],stderr:[]}}return{exitCode:0,stdout:[JSON.stringify(resources,null,2)],stderr:[]}}function exportNMSource(source,target2,parseOptions,strictQasm=false,asJson=false){if(target2==="ir"){const exported=exportToNMIR(source,parseOptions);return exported.success&&exported.json?{exitCode:0,stdout:[exported.json.trimEnd()],stderr:[]}:errorResult(exported.error??"N/M IR export failed.")}if(target2==="pennylane"){const exported=exportToFrameworks(source,parseOptions);const selected=exported.exports?.find(item=>item.target==="pennylane");if(exported.success&&selected?.requiresSidecar&&!asJson){const feature=selected.sidecar?.format==="nm-compute-apply-framework"?"Compute/apply":"Classical-function";return errorResult(`${feature} PennyLane export requires --json to retain its source sidecar and execution semantics.`)}return exported.success&&selected?{exitCode:0,stdout:[asJson?JSON.stringify({...selected,warnings:exported.warnings??[]},null,2):selected.code],stderr:[]}:{exitCode:1,stdout:[],stderr:[exported.error??"PennyLane export failed."]}}const parsed=parseNMCode(source,parseOptions);const hasTrainBlock=parsed.program.statements.some(statement=>statement.kind==="train");const needsTrainedParams=(target2==="qasm2"||target2==="qasm3")&&(hasTrainBlock||Boolean(parsed.program.optimize));const trainedParams=needsTrainedParams?selectNMTrainingExportParams(executeNMCode(source,parseOptions)):void 0;if(needsTrainedParams&&!trainedParams)return errorResult(NM_TRAINING_EXPORT_REQUIRED);if(target2==="qasm2"){const exported=exportToQASM(source,parseOptions,trainedParams);if(asJson)return{exitCode:exported.success?0:1,stdout:[JSON.stringify(exported,null,2)],stderr:[]};if(exported.requiresSidecar)return errorResult("Compute/apply QASM2 export requires --json to retain its source sidecar and execution semantics.");return exported.qasm?{exitCode:0,stdout:[exported.qasm],stderr:[]}:{exitCode:1,stdout:[],stderr:[exported.error??"OpenQASM 2 export failed."]}}if(target2==="qasm3"){const exported=exportToQASM3(source,{...parseOptions,conformance:strictQasm?"strict":"preview",...trainedParams?{trainedParams}:{}});if(asJson){return{exitCode:exported.success?0:1,stdout:[JSON.stringify(exported,null,2)],stderr:[]}}if(exported.sidecar?.version==="0.4")return errorResult("Classical-function QASM3 export requires --json to retain its v0.4 sidecar and execution semantics.");if(exported.sidecar?.version==="0.5")return errorResult("Compute/apply QASM3 export requires --json to retain its v0.5 source sidecar and execution semantics.");return exported.qasm?{exitCode:0,stdout:[exported.qasm],stderr:[]}:{exitCode:1,stdout:[],stderr:[exported.error??"OpenQASM 3 export failed."]}}if(target2==="quantikz"){if(parsed.program.composedNoise){return errorResult("NM-NOISE-PROFILE-010: Quantikz cannot preserve composed-noise scope and ordering.")}const result2=executeNMCode(source,parseOptions);return result2.quantikzCircuit?{exitCode:0,stdout:[result2.quantikzCircuit],stderr:[]}:{exitCode:1,stdout:[],stderr:["Quantikz export is unavailable for this program."]}}return{exitCode:0,stdout:[JSON.stringify(parsed.program,null,2)],stderr:[]}}function errorResult(message){return{exitCode:1,stdout:[],stderr:[message]}}function isNMCLICommand(value){return nmCliCommands.includes(value??"")}function isNMCLIExportTarget(value){return value==="qasm2"||value==="qasm3"||value==="quantikz"||value==="json"||value==="ir"||value==="pennylane"}function usageText(){return["Usage: nm <command> [file.nm] [options]","Commands:",...nmCliCommandContracts.map(contract4=>` ${contract4.usage}`)," --version [--json]","Language defaults: classical functions, typed values/Result, module visibility, parameter groups and compute/apply are enabled."," --legacy-features Start with all optional features disabled; explicit --experimental-* flags still apply.","Workspace: use workspace.<module>; imports sibling .nm modules indexed from the entry directory."].join("\n")}export{NM_CLI_CONTRACT_VERSION,NM_LANGUAGE_PREVIEW_READINESS_FORMAT,NM_LANGUAGE_PREVIEW_READINESS_VERSION,NM_WORKSPACE_MAX_DOCUMENTS,NM_WORKSPACE_MAX_SOURCE_BYTES,evaluateNMLanguagePreviewReadiness,getNMWorkspaceModuleName,nmCliCommandContracts,nmCliCommands,nmCliExitCodeContract,nmLanguagePreviewReadiness,nmLanguageReleaseChangelog,nmVersionManifest,nmWorkspaceDiagnosticCodes,runNMCLI,validateNMWorkspaceManifestJsonText};
|