No coinciden los tipos: no se puede convertir de doble a clase en Anylogic

No coinciden los tipos: no se puede convertir de doble a clase en Anylogic

Soy bastante nuevo en Java en Anylogic y, por lo tanto, creo que probablemente sea una solución rápida.

He definido un tipo de clase llamada OperationResults:

    public class OperationResults {
    private final double multiplicationResult;
    private final double additionResult;
    private final double subtractionResult;

    public OperationResults(double mulRes, double addRes, double subRes) {
        this.multiplicationResult = mulRes;
        this.additionResult = addRes;
        this.subtractionResult = subRes;
    }
}

La función en mi simulación se llama 'callAPI' y simplemente envía dos valores dobles ('a' y 'b') a mi código API de Python. Ambos conjuntos de códigos son los siguientes. Mi función 'callAPI':

    try {
        URL url = new URL("http://127.0.0.1:5000/operations");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Type", "application/json");
        conn.setDoOutput(true);

        String jsonInputString = "{\"a\": " + a + ", \"b\": " + b + "}";
        try (OutputStream os = conn.getOutputStream()) {
            byte[] input = jsonInputString.getBytes(StandardCharsets.UTF_8);
            os.write(input, 0, input.length);
        }

        try (InputStream is = conn.getInputStream(); Scanner scanner = new Scanner(is)) {
            String jsonResponse = scanner.useDelimiter("\\A").next();
            JSONObject response = new JSONObject(jsonResponse);
            double multiplicationResult = response.getDouble("multiplicationResult");
            double additionResult = response.getDouble("additionResult");
            double subtractionResult = response.getDouble("subtractionResult");
            return new OperationResults(multiplicationResult, additionResult, subtractionResult);
        }
    } catch (Exception e) {
        e.printStackTrace();
        return new OperationResults(-1, -1, -1); // Error handling
    }

Mi código API de Python:


app = Flask(__name__)

@app.route('/operations', methods=['POST'])
def operations():
    data = request.get_json(force=True)
    a = data['a']
    b = data['b']
    result_multiply = a * b
    result_addition = a + b
    result_subtraction = a - b
    return jsonify({
        'multiplicationResult': result_multiply,
        'additionResult': result_addition,
        'subtractionResult': result_subtraction
    })

if __name__ == '__main__':
    app.run(debug=True)

Mi botón en mi simulación que ejecuta la función es el siguiente:

for (Learner agent : learners) {
    double a = agent.edu1Resources;
    double b = agent.edu3Cost;

    // API call
    OperationResults results = callAPI(a, b);

    // Update agent attributes or handle results
    agent.multiplicationResult = results.multiplicationResult;
    agent.additionResult = results.additionResult;
    agent.subtractionResult = results.subtractionResult;

    // Print results for each agent
    traceln("Agent ID " + agent.getIndex() + ": edu1Resources * edu3Cost = " + results.multiplicationResult + 
            ", edu1Resources + edu3Cost = " + results.additionResult + 
            ", edu1Resources - edu3Cost = " + results.subtractionResult);
}

Los dos errores que recibo indican que"El tipo no coincide: no se puede convertir de la clase 'OperationResults' a doble"en elfuncionescódigo y"El tipo no coincide: no se puede convertir de doble a la clase 'OperationResults'"en elbotonescódigo.

Realmente espero que haya una explicación sencilla para mis errores ya que todo lo demás parece estar bien. Agradecería mucho la ayuda.

Aquí está mi seguimiento de pila:


    Type mismatch: cannot convert from double to Main.OperationResults
    at _2024_03_28.Main.executeShapeControlAction(Main.java:651)
    at _2024_03_28.Main$6.action(Main.java:695)
    at com.anylogic.engine.presentation.ShapeControl.executeAction(Unknown Source)
    at com.anylogic.engine.presentation.ShapeButton.executeUserAction(Unknown Source)
    at com.anylogic.engine.gui.ExperimentHost.executeUserAction(Unknown Source)
    at com.anylogic.engine.internal.webserver.f.onAction(Unknown Source)
    at com.anylogic.executor.basic.rest.BasicAnimationSessionController.lambda$null$3(BasicAnimationSessionController.java:71)
    at com.anylogic.engine.internal.webserver.e.acceptToAnimationSvgSession(Unknown Source)
    at com.anylogic.executor.basic.rest.BasicAnimationSessionController.lambda$startController$4(BasicAnimationSessionController.java:71)
    at spark.ResponseTransformerRouteImpl$1.handle(ResponseTransformerRouteImpl.java:47)
    at spark.http.matching.Routes.execute(Routes.java:61)
    at spark.http.matching.MatcherFilter.doFilter(MatcherFilter.java:134)
    at com.anylogic.engine.internal.webserver.config.ALServerFactory$1.lambda$0(Unknown Source)
    at org.eclipse.jetty.servlets.QoSFilter.doFilter(QoSFilter.java:202)
    at com.anylogic.engine.internal.webserver.config.ALServerFactory$1.doHandle(Unknown Source)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1598)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
    at org.eclipse.jetty.server.Server.handle(Server.java:516)
    at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:487)
    at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:732)
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:479)
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277)
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)
    at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131)
    at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:409)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034)
    at java.base/java.lang.Thread.run(Thread.java:834)

Respuesta1

Encontré la solución. En mi función callAPIescrita en AnyLogic, cambié el tipo de salida esperado de 'doble' a 'Otro' y luego indiqué OperationResults. Esto se hizo en la opción 'Valor de retorno'. En lugar de esperar dar una salida de función de double, la salida de la función está en el tipo de clase OperationResultsque creé en mi código de clase en la página principal.

información relacionada