Specification for the FitnessEngine in EMEP, covering scalar single-objective aggregation and multi-objective vector fitness computation.
The FitnessEngine converts evaluation metrics into comparable fitness values for the evolutionary loop. It supports both single-objective scalar aggregation and multi-objective vector fitness. This page specifies the aggregation formulas, weighting schemes, and the critical isolation rule: fitness is computed only from the Optimization Set.
For multi-objective optimization, fitness is a vector rather than a scalar. The EvolutionEngine passes this vector to the non-dominated sorting algorithm (NSGA-II, Deb et al. 2002).
Fitness is computed ONLY from the Optimization Set. The Validation Set and Hidden Test Set are never used during fitness calculation, ranking, or selection. This rule is enforced at the data layer. Any attempt to compute fitness from non-optimization splits triggers an error and halts the experiment.
All results are logged to the ExperimentTracker with the full metric dictionary and computed fitness values.
{"docsConfig":{"theme":"aspen","$schema":"https://mintlify.com/docs.json","name":"EMEP","colors":{"primary":"#7C3AED","light":"#A78BFA","dark":"#5B21B6"},"appearance":{"strict":false},"background":{"decoration":"gradient","color":{"light":"#fafdfd","dark":"#0f1214"}},"seo":{"indexing":"all"},"contextual":{"options":["copy","view","chatgpt","claude"],"display":"header"},"interaction":{"drilldown":true},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"ping-47788c6e","hasAudioNarration":false,"actualSubdomain":"ping-47788c6e","customDomains":["doc.blueapi.ir"],"gitSource":{"type":"github","owner":"sarmadaf24","repo":"evolutionarymodellplatform","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"latestBuiltDeploymentHistoryId":"6a9d914c7dbaaddea3035369","collectionId":"c7cc67f8-369f-45fc-a29a-15a691f103b0","liveDeploymentHistoryId":"6a9d914c7dbaaddea3035369","schemaVersion":"v3"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6a9d914c7dbaaddea3035369","clientVersion":"0.0.4043","searchFilterCounts":[{"language":"default","tag":"Interfaces \u0026 Governance","count":32},{"language":"default","tag":"Deployment \u0026 Ops","count":24},{"language":"default","tag":"Evolution \u0026 Evaluation","count":24},{"language":"default","tag":"Model Pipeline","count":20},{"language":"default","tag":"Platform","count":14},{"language":"default","tag":"Architecture","count":11},{"language":"default","tag":"Phases","count":10},{"language":"default","tag":"Testing","count":9},{"language":"default","tag":"Tracking \u0026 Reproducibility","count":9},{"language":"default","tag":"Evolution Engine","count":8}],"searchSettings":{"maxResults":7}},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"evolution/fitness","slug":"/evolution/fitness","pageMetadata":{"title":"Fitness Engine and Candidate Scoring","description":"Specification for the FitnessEngine in EMEP, covering scalar single-objective aggregation and multi-objective vector fitness computation.","sidebarTitle":"Fitness","href":"/evolution/fitness"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Specification for the FitnessEngine in EMEP, covering scalar single-objective aggregation and multi-objective vector fitness computation.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Mermaid,Table,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Mermaid)_missingMdxReference(`Mermaid`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`The FitnessEngine converts evaluation metrics into comparable fitness values for the evolutionary loop. It supports both single-objective scalar aggregation and multi-objective vector fitness. This page specifies the aggregation formulas, weighting schemes, and the critical isolation rule: fitness is computed only from the Optimization Set.`}),`\n`,_jsx(Heading,{level:`2`,id:`fitness-computation-flow`,children:`Fitness Computation Flow`}),`\n`,_jsx(Mermaid,{chart:`flowchart TD\n START([START]) --> INPUT[Evaluation Metrics]\n INPUT --> SPLIT{Split Source?}\n SPLIT -->|Optimization Set| PROC[Process Metrics]\n SPLIT -->|Validation Set| BLOCK[Blocked]\n SPLIT -->|Hidden Test Set| BLOCK\n BLOCK --> END1([END - Not Used])\n PROC --> MODE{Fitness Mode?}\n MODE -->|Single| SCALAR[Scalar Aggregation]\n MODE -->|Multi| VECTOR[Vector Fitness]\n SCALAR --> OUTPUT[Return Fitness Value]\n VECTOR --> OUTPUT\n OUTPUT --> END2([END])`}),`\n`,_jsx(Heading,{level:`2`,id:`single-objective-scalar-aggregation`,children:`Single-Objective Scalar Aggregation`}),`\n`,_jsx(_components.p,{children:`The FitnessEngine combines multiple metrics into a single scalar value using weighted summation or target-relative scoring.`}),`\n`,_jsx(Heading,{level:`3`,id:`weighted-sum`,children:`Weighted Sum`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`3`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`fitness = sum_i(w_i * normalized_metric_i)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`sum(w_i) = 1.0`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:`Weights are configurable per experiment. Default weights balance accuracy, efficiency, and safety:`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Metric Category`}),_jsx(_components.th,{children:`Default Weight`}),_jsx(_components.th,{children:`Normalization`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Accuracy`}),_jsx(_components.td,{\"data-numeric\":`true`,children:`0.5`}),_jsx(_components.td,{children:`Best on Optimization Set`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Efficiency`}),_jsx(_components.td,{\"data-numeric\":`true`,children:`0.2`}),_jsx(_components.td,{children:`Inverse latency, max 1.0`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Safety`}),_jsx(_components.td,{\"data-numeric\":`true`,children:`0.2`}),_jsx(_components.td,{children:`Pass rate on safety suite`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Robustness`}),_jsx(_components.td,{\"data-numeric\":`true`,children:`0.1`}),_jsx(_components.td,{children:`Variance across prompt variants`})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`target-relative-scoring`,children:`Target-Relative Scoring`}),`\n`,_jsx(_components.p,{children:`Each metric is scored relative to a target value:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`4`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`score_i = metric_i / target_i`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`score_i = min(score_i, 1.0) # cap at 100%`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`fitness = sum(w_i * score_i)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:`Target values are set per benchmark or inherited from baseline models. Target-relative scoring makes fitness interpretable: 1.0 means all targets met.`}),`\n`,_jsx(Heading,{level:`2`,id:`multi-objective-vector-fitness`,children:`Multi-Objective Vector Fitness`}),`\n`,_jsx(_components.p,{children:`For multi-objective optimization, fitness is a vector rather than a scalar. The EvolutionEngine passes this vector to the non-dominated sorting algorithm (NSGA-II, Deb et al. 2002).`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`fitness_vector = [accuracy, efficiency, safety, robustness]`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:`Each component is independently normalized. The Pareto front contains candidates where no other candidate dominates on all objectives.`}),`\n`,_jsx(Heading,{level:`2`,id:`example-aggregation-formulas`,children:`Example Aggregation Formulas`}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Standard Accuracy-Weighted Fitness`})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`fitness = 0.6 * normalize(accuracy) + 0.25 * normalize(1 / latency) + 0.15 * normalize(safety_pass_rate)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Balanced Multi-Objective Vector`})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`7`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`7`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`fitness_vector = [`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` normalize(perplexity), # lower is better, inverted`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` normalize(exact_match), # higher is better`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` normalize(1 / memory_gb), # efficiency`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` normalize(refusal_rate) # safety`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`]`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Target-Relative for Instruction Following`})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`4`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`targets = {exact_match: 0.75, rouge_l: 0.70, safety: 0.95}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`scores = {k: min(v / targets[k], 1.0) for k, v in metrics.items()}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`fitness = mean(scores.values())`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(Heading,{level:`2`,id:`metric-normalization`,children:`Metric Normalization`}),`\n`,_jsx(_components.p,{children:`All metrics are normalized to [0, 1] before aggregation:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`For metrics where higher is better: `,_jsx(_components.code,{children:`norm = (value - min) / (max - min)`})]}),`\n`,_jsxs(_components.li,{children:[`For metrics where lower is better: `,_jsx(_components.code,{children:`norm = 1 - (value - min) / (max - min)`})]}),`\n`,_jsxs(_components.li,{children:[`If max equals min: `,_jsx(_components.code,{children:`norm = 0.5`})]}),`\n`]}),`\n`,_jsx(_components.p,{children:`Min and max are computed from the current population’s Optimization Set results. This makes fitness relative to the current search progress.`}),`\n`,_jsx(Heading,{level:`2`,id:`isolation-rule`,children:`Isolation Rule`}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`Fitness is computed ONLY from the Optimization Set. The Validation Set and Hidden Test Set are never used during fitness calculation, ranking, or selection. This rule is enforced at the data layer. Any attempt to compute fitness from non-optimization splits triggers an error and halts the experiment.`})}),`\n`,_jsx(Heading,{level:`2`,id:`integration-with-evolutionengine`,children:`Integration with EvolutionEngine`}),`\n`,_jsx(_components.p,{children:`The FitnessEngine exposes:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`4`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`FitnessEngine.compute_scalar(metrics, weights) -> float`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`FitnessEngine.compute_vector(metrics) -> List[float]`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`FitnessEngine.normalize(metrics, population_stats) -> Dict[str, float]`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:`All results are logged to the ExperimentTracker with the full metric dictionary and computed fitness values.`})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Fitness Engine and Candidate Scoring","description":"Specification for the FitnessEngine in EMEP, covering scalar single-objective aggregation and multi-objective vector fitness computation.","sidebarTitle":"Fitness","href":"/evolution/fitness"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Fitness Computation Flow","slug":"fitness-computation-flow","depth":2,"children":[]},{"title":"Single-Objective Scalar Aggregation","slug":"single-objective-scalar-aggregation","depth":2,"children":[{"title":"Weighted Sum","slug":"weighted-sum","depth":3,"children":[]},{"title":"Target-Relative Scoring","slug":"target-relative-scoring","depth":3,"children":[]}]},{"title":"Multi-Objective Vector Fitness","slug":"multi-objective-vector-fitness","depth":2,"children":[]},{"title":"Example Aggregation Formulas","slug":"example-aggregation-formulas","depth":2,"children":[]},{"title":"Metric Normalization","slug":"metric-normalization","depth":2,"children":[]},{"title":"Isolation Rule","slug":"isolation-rule","depth":2,"children":[]},{"title":"Integration with EvolutionEngine","slug":"integration-with-evolutionengine","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"ping-47788c6e","siteName":"EMEP","title":"Fitness Engine and Candidate Scoring - EMEP","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-06T12:16:45.345Z","originalFileLocation":"evolution/fitness.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Specification for the FitnessEngine in EMEP, covering scalar single-objective aggregation and multi-objective vector fitness computation.\">\u003cmeta data-mint-head name=\"application-name\" content=\"EMEP\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/ping-47788c6e/_generated/favicon/apple-touch-icon.png?v=3\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/ping-47788c6e/_generated/favicon/favicon-32x32.png?v=3\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/ping-47788c6e/_generated/favicon/favicon-16x16.png?v=3\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/ping-47788c6e/_generated/favicon/favicon.ico?v=3\">\u003cmeta data-mint-head property=\"og:title\" content=\"Fitness Engine and Candidate Scoring - EMEP\">\u003cmeta data-mint-head property=\"og:description\" content=\"Specification for the FitnessEngine in EMEP, covering scalar single-objective aggregation and multi-objective vector fitness computation.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"EMEP\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://doc.blueapi.ir/evolution/fitness\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://ping-47788c6e.mintlify.app/_mintlify/api/og/v2?division=Evolution+Engine\u0026amp;title=Fitness+Engine+and+Candidate+Scoring\u0026amp;description=Specification+for+the+FitnessEngine+in+EMEP%2C+covering+scalar+single-objective+aggregation+and+multi-objective+vector+fitness+computation.\u0026amp;theme=074c708ff2f145909468e7e3\u0026amp;signature=9dbfd32ab455f26967e20500e624d24583b3e8aee38487185e8638a94423c6d5\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Fitness Engine and Candidate Scoring - EMEP\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Specification for the FitnessEngine in EMEP, covering scalar single-objective aggregation and multi-objective vector fitness computation.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://ping-47788c6e.mintlify.app/_mintlify/api/og/v2?division=Evolution+Engine\u0026amp;title=Fitness+Engine+and+Candidate+Scoring\u0026amp;description=Specification+for+the+FitnessEngine+in+EMEP%2C+covering+scalar+single-objective+aggregation+and+multi-objective+vector+fitness+computation.\u0026amp;theme=074c708ff2f145909468e7e3\u0026amp;signature=9dbfd32ab455f26967e20500e624d24583b3e8aee38487185e8638a94423c6d5\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"https://mintlify.s3.us-west-1.amazonaws.com/ping-47788c6e/_generated/favicon/browserconfig.xml?v=3\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"EMEP\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#7C3AED\">\u003clink data-mint-head rel=\"canonical\" href=\"https://doc.blueapi.ir/evolution/fitness\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/evolution/fitness.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://doc.blueapi.ir/#organization\",\"name\":\"EMEP\",\"url\":\"https://doc.blueapi.ir\"},{\"@type\":\"WebSite\",\"@id\":\"https://doc.blueapi.ir#website\",\"name\":\"EMEP\",\"url\":\"https://doc.blueapi.ir\",\"publisher\":{\"@id\":\"https://doc.blueapi.ir/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://doc.blueapi.ir/evolution/fitness#webpage\",\"url\":\"https://doc.blueapi.ir/evolution/fitness\",\"name\":\"Fitness Engine and Candidate Scoring\",\"description\":\"Specification for the FitnessEngine in EMEP, covering scalar single-objective aggregation and multi-objective vector fitness computation.\",\"dateModified\":\"2026-09-06T12:16:45.345Z\",\"isPartOf\":{\"@id\":\"https://doc.blueapi.ir#website\"},\"breadcrumb\":{\"@id\":\"https://doc.blueapi.ir/evolution/fitness#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://doc.blueapi.ir/evolution/fitness#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Evolution Engine\",\"item\":\"https://doc.blueapi.ir/evolution/evolution-engine\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Fitness Engine and Candidate Scoring\",\"item\":\"https://doc.blueapi.ir/evolution/fitness\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://doc.blueapi.ir/evolution/fitness#article\",\"headline\":\"Fitness Engine and Candidate Scoring\",\"name\":\"Fitness Engine and Candidate Scoring\",\"description\":\"Specification for the FitnessEngine in EMEP, covering scalar single-objective aggregation and multi-objective vector fitness computation.\",\"url\":\"https://doc.blueapi.ir/evolution/fitness\",\"mainEntityOfPage\":{\"@id\":\"https://doc.blueapi.ir/evolution/fitness#webpage\"},\"dateModified\":\"2026-09-06T12:16:45.345Z\",\"publisher\":{\"@id\":\"https://doc.blueapi.ir/#organization\"},\"isPartOf\":{\"@id\":\"https://doc.blueapi.ir#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"EMEP\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"EMEP","nav":{"global":null,"tabs":[{"tab":"Platform","pages":[{"title":"Platform","href":""}]},{"tab":"Architecture","pages":[{"title":"Architecture","href":"/architecture/system-architecture"}]},{"tab":"Model Pipeline","pages":[{"title":"Model Pipeline","href":"/compatibility/model-compatibility"}]},{"tab":"Evolution \u0026 Evaluation","groups":[{"group":"Evolution Engine","pages":[{"title":"EvolutionEngine Specification for EMEP","sidebarTitle":"EvolutionEngine","href":"/evolution/evolution-engine"},{"title":"Genome Encoding for Model Merge Candidates","sidebarTitle":"Genome","href":"/evolution/genome"},{"title":"Population Management in EMEP Evolution","sidebarTitle":"Population","href":"/evolution/population"},{"title":"Mutation Operators for Merge Genome Evolution","sidebarTitle":"Mutation","href":"/evolution/mutation"},{"title":"Crossover Operators for Merge Genome Combination","sidebarTitle":"Crossover","href":"/evolution/crossover"},{"title":"Selection Strategies for Evolutionary Search","description":"Specification for selection operators in EMEP, including tournament, truncation, elitism, and roulette with decision rationale and configuration.","sidebarTitle":"Selection","href":"/evolution/selection"},{"title":"Fitness Engine and Candidate Scoring","sidebarTitle":"Fitness","href":"/evolution/fitness"},{"title":"Multi-Objective Optimization with NSGA-II","description":"Specification for multi-objective optimization in EMEP using NSGA-II, covering non-dominated sorting, crowding distance, and Pareto front management.","sidebarTitle":"Multi-Objective","href":"/evolution/multi-objective-optimization"}]},{"group":"Evaluation","pages":[{"title":"EvaluationEngine and BenchmarkEngine Framework","sidebarTitle":"Evaluation Framework","href":"/evaluation/framework"},{"title":"Benchmark Record Schema and Configuration","sidebarTitle":"Benchmark Spec","href":"/evaluation/benchmark-specification"},{"title":"Benchmark Catalog by Category and Purpose","sidebarTitle":"Benchmark Catalog","href":"/evaluation/benchmark-catalog"},{"title":"Persian Language Evaluation Concerns and Benchmarks","sidebarTitle":"Persian Evaluation","href":"/evaluation/persian-evaluation"},{"title":"Safety Evaluation and Harmful Content Detection","sidebarTitle":"Safety Evaluation","href":"/evaluation/safety-evaluation"},{"title":"Regression Detection and Statistical Protocol","sidebarTitle":"Regression Evaluation","href":"/evaluation/regression-evaluation"},{"title":"Benchmark Integrity and Data Contamination Prevention","sidebarTitle":"Benchmark Integrity","href":"/evaluation/benchmark-integrity"}]},{"group":"Tracking \u0026 Reproducibility","pages":[{"title":"ExperimentTracker Event Stream and Responsibilities","sidebarTitle":"Experiment Tracking","href":"/tracking/experiment-tracking"},{"title":"Complete Experiment Record Schema","sidebarTitle":"Experiment Schema","href":"/tracking/experiment-schema"},{"title":"ModelRegistry API and State Management","sidebarTitle":"Model Registry","href":"/tracking/model-registry"},{"title":"DatasetRegistry for Versioned Data Management","sidebarTitle":"Dataset Registry","href":"/tracking/dataset-registry"},{"title":"ArtifactStore for Content-Addressed Model Storage","sidebarTitle":"Artifact Registry","href":"/tracking/artifact-registry"},{"title":"Model Lineage Graph and Ancestry Tracking","sidebarTitle":"Model Lineage","href":"/tracking/model-lineage"},{"title":"Reproducibility Requirements for EMEP Experiments","sidebarTitle":"Reproducibility","href":"/tracking/reproducibility"},{"title":"Step-by-Step Experiment Reproduction Protocol","sidebarTitle":"Reproducibility Protocol","href":"/tracking/reproducibility-protocol"},{"title":"Model Provenance Record and Verification Chain","sidebarTitle":"Model Provenance","href":"/tracking/model-provenance"}]}]},{"tab":"Deployment \u0026 Ops","pages":[{"title":"Deployment \u0026 Ops","href":"/deployment/quantization"}]},{"tab":"Interfaces \u0026 Governance","pages":[{"title":"Interfaces \u0026 Governance","href":"/interfaces/api-specification"}]}]},"basePath":"","title":"Fitness Engine and Candidate Scoring - EMEP","buildId":"dpl_G9nrg4qeJSZtah1Ziwbc2n6WkLch","deploymentId":"dpl_G9nrg4qeJSZtah1Ziwbc2n6WkLch","dynamics":[],"chunks":[]}