From 7cc73a800c61d6d699a99f897b340a4c6b89c352 Mon Sep 17 00:00:00 2001 From: Lars Reimann Date: Wed, 10 Apr 2024 11:47:17 +0200 Subject: [PATCH 1/6] feat: support relative paths --- packages/safe-ds-lang/src/language/runner/messages.ts | 1 + packages/safe-ds-lang/src/language/runner/safe-ds-runner.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/safe-ds-lang/src/language/runner/messages.ts b/packages/safe-ds-lang/src/language/runner/messages.ts index 3ce8cb47e..fa4d28b6d 100644 --- a/packages/safe-ds-lang/src/language/runner/messages.ts +++ b/packages/safe-ds-lang/src/language/runner/messages.ts @@ -33,6 +33,7 @@ export interface ProgramMessage { export interface ProgramPackageMap { code: ProgramCodeMap; main: ProgramMainInformation; + cwd?: string; } /** diff --git a/packages/safe-ds-lang/src/language/runner/safe-ds-runner.ts b/packages/safe-ds-lang/src/language/runner/safe-ds-runner.ts index 545016adc..9131609d7 100644 --- a/packages/safe-ds-lang/src/language/runner/safe-ds-runner.ts +++ b/packages/safe-ds-lang/src/language/runner/safe-ds-runner.ts @@ -397,6 +397,7 @@ export class SafeDsRunner { module: mainModuleName, pipeline: pipelineName, }, + cwd: path.parse(pipelineDocument.uri.fsPath).dir, }), ); } From e0b767619c454707364789f4c26bb8268c1e9a8f Mon Sep 17 00:00:00 2001 From: Lars Reimann Date: Wed, 10 Apr 2024 12:29:57 +0200 Subject: [PATCH 2/6] feat: update required runner version --- docs/README.md | 2 +- packages/safe-ds-lang/src/language/runner/safe-ds-runner.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/README.md b/docs/README.md index ca5fda583..8b277efe6 100644 --- a/docs/README.md +++ b/docs/README.md @@ -15,7 +15,7 @@ Safely develop Data Science programs with a statically checked domain specific l 2. To _execute_ Safe-DS programs, the [Safe-DS Runner](https://github.com/Safe-DS/Runner) has to be installed and configured additionally: 1. Install [Python](https://www.python.org/) (3.11 or 3.12). - 2. Run `pip install "safe-ds-runner>=0.9.0,<0.10.0"` in a command line to download the latest matching Runner version + 2. Run `pip install "safe-ds-runner>=0.10.0,<0.11.0"` in a command line to download the latest matching Runner version from [PyPI](https://pypi.org/project/safe-ds-runner/). 3. If the Visual Studio Code extension cannot start the runner, adjust the setting `safe-ds.runner.command`. Enter the absolute path to the Runner executable, as seen in the image below. diff --git a/packages/safe-ds-lang/src/language/runner/safe-ds-runner.ts b/packages/safe-ds-lang/src/language/runner/safe-ds-runner.ts index 9131609d7..2ad2fb4b5 100644 --- a/packages/safe-ds-lang/src/language/runner/safe-ds-runner.ts +++ b/packages/safe-ds-lang/src/language/runner/safe-ds-runner.ts @@ -24,8 +24,8 @@ import { SafeDsMessagingProvider } from '../lsp/safe-ds-messaging-provider.js'; export const RPC_RUNNER_STARTED = 'runner/started'; -const LOWEST_SUPPORTED_VERSION = '0.9.0'; -const LOWEST_UNSUPPORTED_VERSION = '0.10.0'; +const LOWEST_SUPPORTED_VERSION = '0.10.0'; +const LOWEST_UNSUPPORTED_VERSION = '0.11.0'; const npmVersionRange = `>=${LOWEST_SUPPORTED_VERSION} <${LOWEST_UNSUPPORTED_VERSION}`; const pipVersionRange = `>=${LOWEST_SUPPORTED_VERSION},<${LOWEST_UNSUPPORTED_VERSION}`; From 4c0a44b435d2a8bb9c1c9ae378cf85168f2512e6 Mon Sep 17 00:00:00 2001 From: Lars Reimann Date: Wed, 10 Apr 2024 14:49:06 +0200 Subject: [PATCH 3/6] refactor: push down creation of `sortedArgs` --- .../generation/safe-ds-python-generator.ts | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/packages/safe-ds-lang/src/language/generation/safe-ds-python-generator.ts b/packages/safe-ds-lang/src/language/generation/safe-ds-python-generator.ts index f291eafae..55c437a66 100644 --- a/packages/safe-ds-lang/src/language/generation/safe-ds-python-generator.ts +++ b/packages/safe-ds-lang/src/language/generation/safe-ds-python-generator.ts @@ -767,7 +767,6 @@ export class SafeDsPythonGenerator { return traceToNode(expression)(frame.getUniqueLambdaBlockName(expression)); } else if (isSdsCall(expression)) { const callable = this.nodeMapper.callToCallable(expression); - const sortedArgs = this.sortArguments(getArguments(expression)); const receiver = this.generateExpression(expression.receiver, frame); let call: CompositeGeneratorNode | undefined = undefined; @@ -789,12 +788,12 @@ export class SafeDsPythonGenerator { if (isSdsMemberAccess(expression.receiver)) { thisParam = this.generateExpression(expression.receiver.receiver, frame); } - call = this.generateMemoizedCall(expression, sortedArgs, frame, thisParam); + call = this.generateMemoizedCall(expression, frame, thisParam); } } if (!call) { - call = this.generatePlainCall(expression, sortedArgs, frame); + call = this.generatePlainCall(expression, frame); } if (expression.isNullSafe) { @@ -915,11 +914,9 @@ export class SafeDsPythonGenerator { throw new Error(`Unknown expression type: ${expression.$type}`); } - private generatePlainCall( - expression: SdsCall, - sortedArgs: SdsArgument[], - frame: GenerationInfoFrame, - ): CompositeGeneratorNode { + private generatePlainCall(expression: SdsCall, frame: GenerationInfoFrame): CompositeGeneratorNode { + const sortedArgs = this.sortArguments(getArguments(expression)); + return expandTracedToNode(expression)`${this.generateExpression(expression.receiver, frame)}(${joinTracedToNode( expression.argumentList, 'arguments', @@ -1019,7 +1016,6 @@ export class SafeDsPythonGenerator { private generateMemoizedCall( expression: SdsCall, - sortedArgs: SdsArgument[], frame: GenerationInfoFrame, thisParam: CompositeGeneratorNode | undefined = undefined, ): CompositeGeneratorNode { @@ -1031,7 +1027,7 @@ export class SafeDsPythonGenerator { ); // For a static function, the thisParam would be the class containing the function. We do not need to generate it in this case const generateThisParam = thisParam && isSdsFunction(callable) && !isStatic(callable); - const containsOptionalArgs = sortedArgs.some((arg) => + const containsOptionalArgs = getArguments(expression).some((arg) => Parameter.isOptional(this.nodeMapper.argumentToParameter(arg)), ); const fullyQualifiedTargetName = this.generateFullyQualifiedFunctionName(expression); @@ -1041,7 +1037,7 @@ export class SafeDsPythonGenerator { )`${RUNNER_PACKAGE}.memoized_dynamic_call("${this.getPythonNameOrDefault(callable)}", ${ containsOptionalArgs ? 'lambda *_ : ' : '' }${ - containsOptionalArgs ? this.generatePlainCall(expression, sortedArgs, frame) : 'None' + containsOptionalArgs ? this.generatePlainCall(expression, frame) : 'None' }, [${generateThisParam ? thisParam : ''}${ generateThisParam && memoizedArgs.length > 0 ? ', ' : '' }${joinTracedToNode(expression.argumentList, 'arguments')( @@ -1061,7 +1057,7 @@ export class SafeDsPythonGenerator { containsOptionalArgs ? 'lambda *_ : ' : '' }${ containsOptionalArgs - ? this.generatePlainCall(expression, sortedArgs, frame) + ? this.generatePlainCall(expression, frame) : isSdsMemberAccess(expression.receiver) ? this.getClassQualifiedNameForMember(callable) : this.generateExpression(expression.receiver, frame) From 834582161765e6a1f0f2ccb908f56bbf35d1839f Mon Sep 17 00:00:00 2001 From: Lars Reimann Date: Wed, 10 Apr 2024 15:59:57 +0200 Subject: [PATCH 4/6] refactor: extract generation of memoized argument list --- .../generation/safe-ds-python-generator.ts | 54 ++++++++++--------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/packages/safe-ds-lang/src/language/generation/safe-ds-python-generator.ts b/packages/safe-ds-lang/src/language/generation/safe-ds-python-generator.ts index 55c437a66..ee7097dd5 100644 --- a/packages/safe-ds-lang/src/language/generation/safe-ds-python-generator.ts +++ b/packages/safe-ds-lang/src/language/generation/safe-ds-python-generator.ts @@ -3,6 +3,7 @@ import { CompositeGeneratorNode, expandToNode, expandTracedToNode, + Generated, joinToNode, joinTracedToNode, NL, @@ -953,29 +954,23 @@ export class SafeDsPythonGenerator { frame.addImport({ importPath: RUNNER_PACKAGE }); const hiddenParameters = this.getMemoizedCallHiddenParameters(expression, frame); const callable = this.nodeMapper.callToCallable(expression); - const memoizedArgs = getParameters(callable).map( - (parameter) => this.nodeMapper.callToParameterValue(expression, parameter)!, - ); if (isSdsFunction(callable) && !isStatic(callable) && isSdsMemberAccess(expression.receiver)) { return expandTracedToNode( expression, )`${RUNNER_PACKAGE}.memoized_dynamic_call("${this.getPythonNameOrDefault( callable, - )}", lambda *_ : ${generatedPythonCall}, [${thisParam}, ${joinTracedToNode( - expression.argumentList, - 'arguments', - )(memoizedArgs, (arg) => this.generateExpression(arg, frame), { - separator: ', ', - })}], [${joinToNode(hiddenParameters, (param) => param, { separator: ', ' })}])`; + )}", lambda *_ : ${generatedPythonCall}, [${thisParam}, ${this.generateMemoizedArgumentList( + expression, + frame, + )}], [${joinToNode(hiddenParameters, (param) => param, { separator: ', ' })}])`; } return expandTracedToNode( expression, )`${RUNNER_PACKAGE}.memoized_static_call("${this.generateFullyQualifiedFunctionName( expression, - )}", lambda *_ : ${generatedPythonCall}, [${joinTracedToNode(expression.argumentList, 'arguments')( - memoizedArgs, - (arg) => this.generateExpression(arg, frame), - { separator: ', ' }, + )}", lambda *_ : ${generatedPythonCall}, [${this.generateMemoizedArgumentList( + expression, + frame, )}], [${joinToNode(hiddenParameters, (param) => param, { separator: ', ' })}])`; } @@ -1022,9 +1017,7 @@ export class SafeDsPythonGenerator { frame.addImport({ importPath: RUNNER_PACKAGE }); const hiddenParameters = this.getMemoizedCallHiddenParameters(expression, frame); const callable = this.nodeMapper.callToCallable(expression); - const memoizedArgs = getParameters(callable).map( - (parameter) => this.nodeMapper.callToParameterValue(expression, parameter)!, - ); + const parameters = getParameters(callable); // For a static function, the thisParam would be the class containing the function. We do not need to generate it in this case const generateThisParam = thisParam && isSdsFunction(callable) && !isStatic(callable); const containsOptionalArgs = getArguments(expression).some((arg) => @@ -1039,13 +1032,10 @@ export class SafeDsPythonGenerator { }${ containsOptionalArgs ? this.generatePlainCall(expression, frame) : 'None' }, [${generateThisParam ? thisParam : ''}${ - generateThisParam && memoizedArgs.length > 0 ? ', ' : '' - }${joinTracedToNode(expression.argumentList, 'arguments')( - memoizedArgs, - (arg) => this.generateExpression(arg, frame), - { - separator: ', ', - }, + generateThisParam && parameters.length > 0 ? ', ' : '' + }${this.generateMemoizedArgumentList( + expression, + frame, )}], [${joinToNode(hiddenParameters, (param) => param, { separator: ', ' })}])`; } if (!containsOptionalArgs && isSdsMemberAccess(expression.receiver)) { @@ -1062,14 +1052,26 @@ export class SafeDsPythonGenerator { ? this.getClassQualifiedNameForMember(callable) : this.generateExpression(expression.receiver, frame) }, [${generateThisParam ? thisParam : ''}${ - generateThisParam && memoizedArgs.length > 0 ? ', ' : '' - }${joinTracedToNode(expression.argumentList, 'arguments')( + generateThisParam && parameters.length > 0 ? ', ' : '' + }${this.generateMemoizedArgumentList( + expression, + frame, + )}], [${joinToNode(hiddenParameters, (param) => param, { separator: ', ' })}])`; + } + + private generateMemoizedArgumentList(node: SdsCall, frame: GenerationInfoFrame): Generated { + const callable = this.nodeMapper.callToCallable(node); + const memoizedArgs = getParameters(callable).map( + (parameter) => this.nodeMapper.callToParameterValue(node, parameter)!, + ); + + return joinTracedToNode(node.argumentList, 'arguments')( memoizedArgs, (arg) => this.generateExpression(arg, frame), { separator: ', ', }, - )}], [${joinToNode(hiddenParameters, (param) => param, { separator: ', ' })}])`; + ); } private getMemoizedCallHiddenParameters(expression: SdsCall, frame: GenerationInfoFrame): CompositeGeneratorNode[] { From 43546438ebfc69443fdef298b91df1c9035b0a4a Mon Sep 17 00:00:00 2001 From: Lars Reimann Date: Wed, 10 Apr 2024 16:26:25 +0200 Subject: [PATCH 5/6] refactor: extract generation of memoized argument --- .../generation/safe-ds-python-generator.ts | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/packages/safe-ds-lang/src/language/generation/safe-ds-python-generator.ts b/packages/safe-ds-lang/src/language/generation/safe-ds-python-generator.ts index ee7097dd5..702f74322 100644 --- a/packages/safe-ds-lang/src/language/generation/safe-ds-python-generator.ts +++ b/packages/safe-ds-lang/src/language/generation/safe-ds-python-generator.ts @@ -1061,19 +1061,35 @@ export class SafeDsPythonGenerator { private generateMemoizedArgumentList(node: SdsCall, frame: GenerationInfoFrame): Generated { const callable = this.nodeMapper.callToCallable(node); - const memoizedArgs = getParameters(callable).map( - (parameter) => this.nodeMapper.callToParameterValue(node, parameter)!, - ); + const parameters = getParameters(callable); + const parametersToArgument = this.nodeMapper.parametersToArguments(parameters, getArguments(node)); return joinTracedToNode(node.argumentList, 'arguments')( - memoizedArgs, - (arg) => this.generateExpression(arg, frame), + parameters, + (parameter) => { + const argument = parametersToArgument.get(parameter); + return this.generateMemoizedArgument(argument, parameter, frame); + }, { separator: ', ', }, ); } + private generateMemoizedArgument( + argument: SdsArgument | undefined, + parameter: SdsParameter, + frame: GenerationInfoFrame, + ): Generated { + const value = argument?.value ?? parameter?.defaultValue; + if (!value) { + /* c8 ignore next 2 */ + throw new Error(`No value passed for required parameter "${parameter.name}".`); + } + + return this.generateExpression(value, frame); + } + private getMemoizedCallHiddenParameters(expression: SdsCall, frame: GenerationInfoFrame): CompositeGeneratorNode[] { const impurityReasons = this.purityComputer.getImpurityReasonsForCallable( this.nodeMapper.callToCallable(expression), From b85cda167e05fdb801a49309e52bed2e0455163d Mon Sep 17 00:00:00 2001 From: Lars Reimann Date: Wed, 10 Apr 2024 16:42:37 +0200 Subject: [PATCH 6/6] feat: generate calls of `safeds_runner.absolute_path` --- .../generation/safe-ds-python-generator.ts | 14 +++++++++++++- .../memberAccessWithRunnerIntegration/gen_input.py | 6 +++--- .../gen_input.py.map | 2 +- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/packages/safe-ds-lang/src/language/generation/safe-ds-python-generator.ts b/packages/safe-ds-lang/src/language/generation/safe-ds-python-generator.ts index 702f74322..0930ed4a4 100644 --- a/packages/safe-ds-lang/src/language/generation/safe-ds-python-generator.ts +++ b/packages/safe-ds-lang/src/language/generation/safe-ds-python-generator.ts @@ -1087,7 +1087,19 @@ export class SafeDsPythonGenerator { throw new Error(`No value passed for required parameter "${parameter.name}".`); } - return this.generateExpression(value, frame); + const result = this.generateExpression(value, frame); + if (!this.isMemoizedPath(parameter)) { + return result; + } + + frame.addImport({ importPath: RUNNER_PACKAGE }); + return expandToNode`${RUNNER_PACKAGE}.absolute_path(${result})`; + } + + private isMemoizedPath(parameter: SdsParameter): boolean { + const callable = AstUtils.getContainerOfType(parameter, isSdsCallable); + const impurityReasons = this.purityComputer.getImpurityReasonsForCallable(callable); + return impurityReasons.some((reason) => reason instanceof FileRead && reason.path === parameter); } private getMemoizedCallHiddenParameters(expression: SdsCall, frame: GenerationInfoFrame): CompositeGeneratorNode[] { diff --git a/packages/safe-ds-lang/tests/resources/generation/python/runner integration/expressions/member access/generated/tests/generator/memberAccessWithRunnerIntegration/gen_input.py b/packages/safe-ds-lang/tests/resources/generation/python/runner integration/expressions/member access/generated/tests/generator/memberAccessWithRunnerIntegration/gen_input.py index 6f3708953..4e9423ebc 100644 --- a/packages/safe-ds-lang/tests/resources/generation/python/runner integration/expressions/member access/generated/tests/generator/memberAccessWithRunnerIntegration/gen_input.py +++ b/packages/safe-ds-lang/tests/resources/generation/python/runner integration/expressions/member access/generated/tests/generator/memberAccessWithRunnerIntegration/gen_input.py @@ -38,10 +38,10 @@ def test(): f(safeds_runner.memoized_dynamic_call("m", lambda *_ : safeds_runner.memoized_static_call("tests.generator.memberAccessWithRunnerIntegration.C.o", C.o, [42], []).m(param=213), [safeds_runner.memoized_static_call("tests.generator.memberAccessWithRunnerIntegration.C.o", C.o, [42], []), 213], [])) f(safeds_runner.memoized_dynamic_call("j", None, [safeds_runner.memoized_static_call("tests.generator.memberAccessWithRunnerIntegration.C.o", C.o, [42], []), 213], [])) f(safeds_runner.memoized_dynamic_call("j", None, [safeds_runner.memoized_static_call("tests.generator.memberAccessWithRunnerIntegration.C.p", C.p, [], []), 213], [])) - f(safeds_runner.memoized_static_call("tests.generator.memberAccessWithRunnerIntegration.C.from_csv_file", C.from_csv_file, ['abc.csv'], [safeds_runner.file_mtime('abc.csv')])) - a = safeds_runner.memoized_static_call("safeds.data.tabular.containers.Table.from_csv_file", Table.from_csv_file, ['abc.csv'], [safeds_runner.file_mtime('abc.csv')]) + f(safeds_runner.memoized_static_call("tests.generator.memberAccessWithRunnerIntegration.C.from_csv_file", C.from_csv_file, [safeds_runner.absolute_path('abc.csv')], [safeds_runner.file_mtime('abc.csv')])) + a = safeds_runner.memoized_static_call("safeds.data.tabular.containers.Table.from_csv_file", Table.from_csv_file, [safeds_runner.absolute_path('abc.csv')], [safeds_runner.file_mtime('abc.csv')]) safeds_runner.save_placeholder('a', a) - a2 = safeds_runner.memoized_dynamic_call("remove_columns", None, [safeds_runner.memoized_static_call("safeds.data.tabular.containers.Table.from_csv_file", Table.from_csv_file, ['abc.csv'], [safeds_runner.file_mtime('abc.csv')]), ['u']], []) + a2 = safeds_runner.memoized_dynamic_call("remove_columns", None, [safeds_runner.memoized_static_call("safeds.data.tabular.containers.Table.from_csv_file", Table.from_csv_file, [safeds_runner.absolute_path('abc.csv')], [safeds_runner.file_mtime('abc.csv')]), ['u']], []) safeds_runner.save_placeholder('a2', a2) v = safeds_runner.memoized_dynamic_call("get_column", None, [a, 'b'], []) safeds_runner.save_placeholder('v', v) diff --git a/packages/safe-ds-lang/tests/resources/generation/python/runner integration/expressions/member access/generated/tests/generator/memberAccessWithRunnerIntegration/gen_input.py.map b/packages/safe-ds-lang/tests/resources/generation/python/runner integration/expressions/member access/generated/tests/generator/memberAccessWithRunnerIntegration/gen_input.py.map index a8a573074..1508d85f9 100644 --- a/packages/safe-ds-lang/tests/resources/generation/python/runner integration/expressions/member access/generated/tests/generator/memberAccessWithRunnerIntegration/gen_input.py.map +++ b/packages/safe-ds-lang/tests/resources/generation/python/runner integration/expressions/member access/generated/tests/generator/memberAccessWithRunnerIntegration/gen_input.py.map @@ -1 +1 @@ -{"version":3,"sources":["input.sdstest"],"names":["test","f","g","h","result1","result2","c","a","b","factory","c1","m","param","n","v","d","p","r","q","factorynested","nestedinstance","nestedresult","onehotencoder","encoder"],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;AAwDA,IAASA,IAAI;IACTC,CAAC,CAAC,0FAAAC,CAAC;IACHD,CAAC,CAAC,0FAAAE,CAAC,UAAGC,CAAO;IACbH,CAAC,CAAC,0FAAAE,CAAC,UAAGE,CAAO;IACbJ,CAAC,CAAC,0FAAAK,CAAC,UAAGC,CAAC;IACPN,CAAC,CAAC,0FAAAK,CAAC,UAAGE,CAAC;IACPP,CAAC,CAAU,6BAAC,CAAV,gGAAAQ,OAAO,YAAIF,CAAC;IACdN,CAAC,CAAU,6BAAC,CAAV,gGAAAQ,OAAO,YAAID,CAAC;IACdP,CAAC,CAAC,qDAAM,CAAC,GAAP,0FAAAK,CAAC,aAAD,0FAAAA,CAAC,WAAK,CAAC;IACT,KAAS,0FAAAA,CAAC;IAAV;IACAL,CAAC,CAAC,qDAAK,CAAC,GAANS,EAAE,IAAFA,EAAE,EAAG,CAAC;IACRT,CAAC,CAAC,gDAAA,0FAAAK,CAAC,WAAK,GAAG;IACXL,CAAC,CAAC,iDAAA,0FAAAK,CAAC,WAAK,KAAK;IACbL,CAAC,CAAC,wGAAI,CAAC,OAAD,CAAC;IACPA,CAAC,CAAC,qDAAA,0FAAAK,CAAC,UAAGK,CAAC,CA3CDC,KAAK,CA2CH,GAAG,IAAT,0FAAAN,CAAC,WAAK,GAAG;IACXL,CAAC,CAAC,qDAAAS,EAAE,CAACC,CAAC,CA5CAC,KAAK,CA4CJ,GAAG,IAARF,EAAE,EAAG,GAAG;IACVT,CAAC,CAAC,wGAAAK,CAAC,CAACO,CAAC,CA1CQD,KAAK,CA0CZ,GAAG,IAAH,GAAG;IACTX,CAAC,CAAC,qDAAG,kGAxCqB,EAAE,OAwCpBU,CAAC,CA9CHC,KAAK,CA8CD,GAAG,IAAR,kGAxCqB,EAAE,QAwClB,GAAG;IACbX,CAAC,CAAC,gDAAG,kGAzCqB,EAAE,QAyClB,GAAG;IACbA,CAAC,CAAC,gDAAG,0GAAK,GAAG;IACbA,CAAC,CAAC,0HAAgB,SAAS,IAAT,yBAAA,SAAS;IAC3B,IAAQ,+GAAkB,SAAS,IAAT,yBAAA,SAAS;IAAnC;IACA,KAAS,6DAAiB,+GAAC,SAAS,IAAT,yBAAA,SAAS,KAAgB,CAAC,GAAG;IAAxD;IACA,IAAQ,yDAAAM,CAAC,EAAW,GAAG;IAAvB;IACA,IAAQ,6DAAAO,CAAC;IAAT;IACA,IAAQ,6DAAW,yDAAXP,CAAC,EAAW,GAAG;IAAvB;IACA,IAAQ,8DAA8B,6DAAnB,yDAAXA,CAAC,EAAW,GAAG;IAAvB;IACA,IAAQ,8DAA+C,8DAAjB,6DAAnB,yDAAXA,CAAC,EAAW,GAAG,oBAAkD,GAAG;IAA5E;IACAN,CAAC,CAACc,CAAC;IACHd,CAAC,CAACe,CAAC;IACHf,CAAC,CAACgB,CAAC;IACHhB,CAAC,CAACiB,CAAC;IACHjB,CAAC,CAAC;IACF,iBAAqB,sGAAAkB,aAAa;IAAlC;IACA,eAAmB,gDAAAC,cAAc;IAAjC;IACAnB,CAAC,CAACoB,YAAY;IACd,UAAc,kDAAA,uFAAAC,aAAa,WAAOf,CAAC,EAAE,CAAC,GAAG;IAAzC;IACA,mBAAuB,wDAAAgB,OAAO,EAAWhB,CAAC;IAA1C","file":"gen_input.py"} \ No newline at end of file +{"version":3,"sources":["input.sdstest"],"names":["test","f","g","h","result1","result2","c","a","b","factory","c1","m","param","n","v","d","p","r","q","factorynested","nestedinstance","nestedresult","onehotencoder","encoder"],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;AAwDA,IAASA,IAAI;IACTC,CAAC,CAAC,0FAAAC,CAAC;IACHD,CAAC,CAAC,0FAAAE,CAAC,UAAGC,CAAO;IACbH,CAAC,CAAC,0FAAAE,CAAC,UAAGE,CAAO;IACbJ,CAAC,CAAC,0FAAAK,CAAC,UAAGC,CAAC;IACPN,CAAC,CAAC,0FAAAK,CAAC,UAAGE,CAAC;IACPP,CAAC,CAAU,6BAAC,CAAV,gGAAAQ,OAAO,YAAIF,CAAC;IACdN,CAAC,CAAU,6BAAC,CAAV,gGAAAQ,OAAO,YAAID,CAAC;IACdP,CAAC,CAAC,qDAAM,CAAC,GAAP,0FAAAK,CAAC,aAAD,0FAAAA,CAAC,WAAK,CAAC;IACT,KAAS,0FAAAA,CAAC;IAAV;IACAL,CAAC,CAAC,qDAAK,CAAC,GAANS,EAAE,IAAFA,EAAE,EAAG,CAAC;IACRT,CAAC,CAAC,gDAAA,0FAAAK,CAAC,WAAK,GAAG;IACXL,CAAC,CAAC,iDAAA,0FAAAK,CAAC,WAAK,KAAK;IACbL,CAAC,CAAC,wGAAI,CAAC,OAAD,CAAC;IACPA,CAAC,CAAC,qDAAA,0FAAAK,CAAC,UAAGK,CAAC,CA3CDC,KAAK,CA2CH,GAAG,IAAT,0FAAAN,CAAC,WAAK,GAAG;IACXL,CAAC,CAAC,qDAAAS,EAAE,CAACC,CAAC,CA5CAC,KAAK,CA4CJ,GAAG,IAARF,EAAE,EAAG,GAAG;IACVT,CAAC,CAAC,wGAAAK,CAAC,CAACO,CAAC,CA1CQD,KAAK,CA0CZ,GAAG,IAAH,GAAG;IACTX,CAAC,CAAC,qDAAG,kGAxCqB,EAAE,OAwCpBU,CAAC,CA9CHC,KAAK,CA8CD,GAAG,IAAR,kGAxCqB,EAAE,QAwClB,GAAG;IACbX,CAAC,CAAC,gDAAG,kGAzCqB,EAAE,QAyClB,GAAG;IACbA,CAAC,CAAC,gDAAG,0GAAK,GAAG;IACbA,CAAC,CAAC,0HAAgB,4BAAA,SAAS,KAAT,yBAAA,SAAS;IAC3B,IAAQ,+GAAkB,4BAAA,SAAS,KAAT,yBAAA,SAAS;IAAnC;IACA,KAAS,6DAAiB,+GAAC,4BAAA,SAAS,KAAT,yBAAA,SAAS,KAAgB,CAAC,GAAG;IAAxD;IACA,IAAQ,yDAAAM,CAAC,EAAW,GAAG;IAAvB;IACA,IAAQ,6DAAAO,CAAC;IAAT;IACA,IAAQ,6DAAW,yDAAXP,CAAC,EAAW,GAAG;IAAvB;IACA,IAAQ,8DAA8B,6DAAnB,yDAAXA,CAAC,EAAW,GAAG;IAAvB;IACA,IAAQ,8DAA+C,8DAAjB,6DAAnB,yDAAXA,CAAC,EAAW,GAAG,oBAAkD,GAAG;IAA5E;IACAN,CAAC,CAACc,CAAC;IACHd,CAAC,CAACe,CAAC;IACHf,CAAC,CAACgB,CAAC;IACHhB,CAAC,CAACiB,CAAC;IACHjB,CAAC,CAAC;IACF,iBAAqB,sGAAAkB,aAAa;IAAlC;IACA,eAAmB,gDAAAC,cAAc;IAAjC;IACAnB,CAAC,CAACoB,YAAY;IACd,UAAc,kDAAA,uFAAAC,aAAa,WAAOf,CAAC,EAAE,CAAC,GAAG;IAAzC;IACA,mBAAuB,wDAAAgB,OAAO,EAAWhB,CAAC;IAA1C","file":"gen_input.py"} \ No newline at end of file